CHANGELOG

Captivo Portal changelog — 2026 · Page 6 of 12

What changed in the guest WiFi portal, release by release, newest first.

1.92.0

New

  • A third header style for the portal: Photo band. A wide photo sits across the top of the card, with your logo overhanging its lower edge like a round badge. For hotels, cafes and restaurants, where the place itself is the draw.
  • The photo band has its own upload, separate from the background image. You can use both: a wide shot of the room behind, a tighter crop in the band.
  • It works without a photo too - the band is then shown as a gradient between your brand colours.
  • Setting: Settings -> Portal -> Style & Fine Tuning -> Header Style. Choosing the photo band opens the upload field right below it.

Improvements

  • Upload errors ("No file selected", size limit, unsupported file type) now follow the panel language. Businesses using the panel in English were getting these warnings in Turkish.

Fixes

  • Removing a background image or a logo left the file on the server. The record was cleared and the image disappeared from the panel, but the file itself stayed reachable to anyone who knew its address. It is now actually deleted.

1.91.0

Improvements

  • The "Default Tab" field in portal settings now lists every login section - SMS, email, sponsor, user login, voucher and hotel/room number. Previously only the first three could be chosen.
  • The section you pick is now the one the portal opens on. A hotel using PMS can select "Hotel / Room No" and the guest sees the room-number form immediately; previously the SMS screen came first and the guest had to click twice to reach it.
  • The field is now called "Section Shown on Open", which describes what it actually does.

1.90.0

New

  • The local user import template now has a Password column. Left empty it generates a password as before; filled in, your password is used.
  • The shape of the portal login password box can now be chosen (Settings → Portal → Login Methods): a 6-digit code, or a 6-64 character password. For organisations applying a corporate password policy.

Improvements

  • Usernames containing Turkish characters are no longer rejected on import; they are transliterated automatically: "Şeyma Öztürk" → "seyma.ozturk".
  • CSV files saved by Excel with semicolons are now read correctly. Previously no column was recognised in such files and every record was created with generated values.
  • The import now reports columns it could not recognise. Previously it silently generated values, leaving no way to tell why the supplied data was not used.
  • The import template's example rows are filled in, so it is now clear that the username column can be set by hand.

Fixes

  • On-premise portal login with Active Directory / LDAP did not work: the portal password box cut off at six characters, so a domain password could never be entered in full. With directory login enabled the box now accepts the full password.
  • Switching the password box back to the 6-digit shape silently locked out staff whose password was longer. If any such account exists the setting is no longer saved, and you are told which accounts to update first.

1.89.0

New

  • A Log Storage card has been added to the Log Server settings: current usage, daily growth rate and the projected size once the retention period is full, all in one place. If the projection does not fit on disk you get a warning telling you roughly how many days remain before it fills up.

1.88.0

Improvements

  • The cookie consent banner now appears in English on the English site, with links to the English legal pages. Previously both its text and its links were always Turkish.
  • The Legal section of platform settings has been simplified: text and address fields that had no effect anywhere were removed, replaced by links to the legal pages actually in force, in Turkish and English.

1.87.3

Fixes

  • The "Localization" heading on the settings page was misspelled in the Turkish interface.

1.87.2

Fixes

  • Security: the on-premise installation image unintentionally carried some uploaded images from the cloud side (business logos, portal backgrounds and feedback screenshots submitted from the panel). Those files have been removed from the image entirely; new installs and upgrades now contain only the files you upload yourself.

1.87.1

Fixes

  • On-premise upgrades could stop on a harmless database warning and leave the system unreachable. This was fixed in 1.83.4, but the fix only reached new installations: existing ones never refreshed the compose file on their server, so the old behaviour persisted. The fix now lives in the application image itself — upgrades complete correctly even with an outdated compose file.
  • The on-premise upgrade guide now states that the compose file must be refreshed too, and the migrator troubleshooting section distinguishes the real causes instead of assuming a single one.

1.87.0

Improvements

  • The marketing home page (captivo.io) now arrives fully rendered from the server. Previously it stayed blank until the browser finished running JavaScript, which showed a brief gap on slow connections and made search engines see an empty page.

1.86.2

Fixes

  • The Data Processing Agreement link on the privacy settings page opened the Turkish page even when the panel language was English. The link now goes to the page matching the panel language.

1.86.1

Fixes

  • The Conversion Funnel on the Analytics page showed a misleading rate when a NAS device was selected: the first three stages (portal opened, sign-in started, code verified) showed figures for the whole business while the last stage showed only the selected device, and the conversion rate divided one by the other. Selecting a branch could show 14%, where in reality that branch's connections were divided by the whole business's portal opens. The funnel's early stages are not tied to a device (a guest opening the portal has not connected to anything yet), so the card now always covers all devices and says so when a NAS is selected.

1.86.0

Improvements

  • Error message language is now largely fixed. In businesses whose panel is English, the 334 most common messages such as "Your session is not valid" and "You do not have permission for this action" were coming out in Turkish; they now follow the panel language.
  • In notifications the sentence was translated but the source name inside it ("admin panel", "sponsor e-mail link") stayed in Turkish. That now follows the panel language too.
  • Older notifications and export-history entries now follow the panel language as well. Those records were created before language support existed and stayed in the language they were written in.
  • Voucher, local-user and sponsor exports are now also written in the panel language in the Reports page history.

Fixes

  • The "Recent changes on this page" section was removed from the settings pages.

1.85.0

Improvements

  • The "Session Duration" setting in platform administration is now actually applied. The value was saved, but the panel always used a fixed 12 hours, so an administrator who set 1 hour still got 12. The duration counts from your last activity: the session stays open while you keep working, and signs you out after the configured idle time. If the setting cannot be read the system falls back to 12 hours, so a session is never longer than expected.

1.84.0

Improvements

  • The "Maximum Failed Sign-ins" and "Lockout Duration" settings in platform administration are now actually applied. These values were saved, but sign-in was always protected by a fixed limit (10 attempts / 5 minutes), so the policy you configured never took effect. The protection was already there; what was missing was the link to the setting. It now takes effect as soon as you save.
  • A self-hosted (on-prem) installation has no such settings page; the stored defaults apply there (5 attempts / 15 minutes). The previous fixed limit was 10 attempts / 5 minutes, so sign-in protection is now slightly stricter. If you lock yourself out, restarting the web service clears the counter instead of waiting: docker compose restart web

Fixes

  • Fixed four headings in the admin panel that were missing Turkish characters.

1.83.4

Improvements

  • On a self-hosted (on-prem) installation, the upgrade step stopped whenever the database needed a new uniqueness rule. That operation deletes no data; it is now applied automatically and no longer blocks the upgrade. Changes that genuinely could lose data (dropping a column or table) still stop and wait for your decision.

Fixes

  • When the upgrade step failed, the error message claimed "the most common cause is a full disk" regardless of the actual reason. This sent people down the wrong path while the disk had plenty of room. The message no longer asserts a single cause: it shows the real error and lists what to check, in order.

1.83.3

Fixes

  • If your firewall used MSCHAPv2 as the RADIUS authentication method, guest sign-ins were rejected even with the correct code. The server did not recognise that method; PAP, CHAP and MSCHAPv2 all work now. (This setting is selectable on pfSense, FortiGate and similar devices.) If you worked around it by switching to PAP, you can move back to MSCHAPv2.

1.83.2

Improvements

  • Leaving the allowed addresses (CORS) list empty and writing * now mean exactly the same thing: both allow all addresses.
  • When you add an address without a protocol, the right one is now added: http:// for local addresses, https:// for domain names. Previously https:// was added unconditionally.
  • Entries that use https:// with a local address are marked in amber with a warning icon, and hovering explains why.

Fixes

  • With an empty allowed-address list the page said "Portal API requests will get CORS errors" — in reality an empty list allows every address. The warning became a note that states what actually happens.
  • Because the protocol was forced to https:// when adding an address, entering a local device address (for example 192.168.10.1) produced an entry that could never match: hotspot login pages are served over http, so every portal API call was silently rejected with no warning anywhere in the panel.

1.83.1

Fixes

  • Error messages on the guest portal did not follow the tenant's language. In a business whose panel is English, the phone and e-mail sign-in steps returned Turkish errors (e.g. "Geçersiz telefon numarası") while the guest was reading an English page. All 15 messages across the SMS, e-mail and hotel (PMS) endpoints now follow the tenant's language.
  • In the portal API, listing "*" as an allowed address was stricter than listing nothing at all: clients that send no address information were rejected despite the "*". Guest sign-ins through a browser were unaffected; integration and health-check clients were.

1.83.0

Improvements

  • The guest page subtitle now matches the method that is actually on. With vouchers as the only method it says "enter your code"; with user login it says "enter your username and password". Previously it said "enter your phone number" even when SMS was off — with no phone field on the page.
  • Turning off every sign-in method in portal settings is now blocked. With all of them off the guest page opened as an empty card and nobody could connect. (Installations that run purely on a company directory (AD/LDAP) are exempt.)
  • The sponsor "required" setting no longer hides SMS and e-mail while the sponsor method itself is off. If an old record held that contradictory pair, guests saw no way to sign in at all.

Fixes

  • The FortiGate template could never read the device MAC address, but the code attempted it with a pfSense-specific field, so it looked like it worked. FortiGate's login page does not provide the MAC; this is now stated explicitly in the code. In practice: MAC allow-listing and device memory do not work with FortiGate, and continue to work with the other brands.
  • Tests now guarantee that special characters (quotes, angle brackets) in the welcome message or tab names do not break the guest page; the generated page is verified for all six brands.

1.82.1

New

  • Branding settings now has a live menu preview: your chosen menu theme, colours and logo appear in a small menu sample before you save.
  • Previews were added for the dark-background logo and the favicon. Previously only the main logo had one, so a wrong address in the other two only showed up after saving.
  • Readability warning: if your primary colour does not give enough contrast against the white button text (or custom menu colours are too close to each other), the page says so before you save.

Improvements

  • Fonts are now served from Captivo itself instead of Google's servers. Your panel users' addresses no longer reach Google, the chosen font actually applies on installations with no internet access, and text no longer jumps while the page loads.
  • The panel font did not include the Turkish letters ş, ğ, İ, ı; those four fell back to a different font and text looked mismatched. Fixed.
  • A wrong colour code is now flagged as you type rather than after saving, and saving with an invalid code is blocked.
  • The audit log for branding now records which field changed and to what; previously every save produced the same generic line.
  • Branding and logo upload errors appeared in Turkish in the English panel; they now follow the panel language.
  • Replacing a logo now deletes the old file from the server. Previously every upload accumulated on disk forever.

Fixes

  • The site and panel briefly returned 502 errors: while moving fonts onto Captivo's own server, every page started preloading all ten font families unnecessarily, which exceeded the response-header limit accepted by the layer in front of the server. Only the font actually in use is downloaded now — pages also load faster.
  • Removing your custom dashboard CSS or favicon had no effect until a full page reload; the old value stayed on screen. The same applied when you turned off custom menu colours.
  • With the menu theme set to "Light", switching the panel to dark mode made the menu dark but still showed the main logo instead of the dark-background one (the logo could become unreadable).
  • After saving branding settings, leaving the page still warned about unsaved changes.
  • Once the logo preview disappeared because of a bad address, it did not come back even after the address was corrected.
  • The favicon address example suggested a .ico file, but the uploader does not accept .ico; the example was corrected.
  • The dark logo description said "for dark mode" while the code looked at the menu theme; the description now matches the actual behaviour.
  • Branding settings had an unused "Login Background" field that was never displayed anywhere. Removed.

1.81.2

Improvements

  • Form fields across the whole panel are now linked to their labels (308 fields). Someone using a screen reader now hears which field they are on; previously it only said "edit box". Clicking a label also moves the cursor straight into its field, toggles got a larger click target, and browser autofill can recognise the fields. Nothing looks different.
  • The toggles in privacy, portal and profile settings had no accessible name — a screen reader only said "switch, off" without saying which setting. Each toggle is now announced with its own title and description.

1.81.1

Fixes

  • Fixed a serious flaw in 5651 log signature verification. The public key that verifies a daily signature was kept in a single place rather than alongside the day it signed, and the log server overwrote that field on every start. If the key file was ever lost (the log server reinstalled with an empty data volume, or a restore from disk), a new key was generated and every past day was checked against it — so logs that had never been touched showed as "tampered" in the panel and in the downloaded archive. Each day now carries the key it was signed with, so past verification is unaffected when the key changes. Existing days are marked with the current key automatically during the upgrade.

1.81.0

Improvements

  • The NAS device names you set are no longer confined to the RADIUS settings page: the dashboard, Sessions, Analytics (Top access points) and Reports pages now show the device name instead of its IP. CSV exports and the NAS filter lists use the name too. Devices without a name still show only their IP; named devices keep the IP alongside, since you need it when troubleshooting (NAS config, logs).

Fixes

  • Some notifications appeared in Turkish even when the panel language was English (and vice versa). Notification text is no longer frozen into one language when it is created; it is translated for whoever reads it. Two languages side by side in the same notification list no longer happens.
  • The export history on the Reports page stayed frozen in the language the report was generated in — Turkish rows could appear in an English panel. History lines are now written in the panel's language.
  • In the audit log, RADIUS shared secret / portal API key operations and NAS device name changes appeared only in Turkish; they now have English equivalents too.

1.80.1

Fixes

  • Downloading the signed 5651 log archive loaded the entire archive into server memory. With a long date range (up to 366 days can be selected) and months of accumulated logs, this could exhaust memory and make the download fail. The archive is now produced piece by piece as it downloads, so memory use no longer depends on archive size. The generated files are byte-for-byte identical, so signature verification is unaffected.

1.80.0

New

  • You can now give your NAS devices a name. In the new "NAS device names" section under Settings > RADIUS you can label 192.168.10.1 as "Head Office" or 10.10.10.1 as "Ankara Branch", and that name appears in the NAS health list on the Dashboard. The name does not replace the IP — both are shown, because you still need the IP when troubleshooting.

Improvements

  • The list includes both the addresses seen in sessions and those in the RADIUS settings, and says which is which. These two usually differ: sessions show the address the device reports about itself, while settings show the source address the request arrives from.
  • Saving an empty name removes it.

Captivo Portal changelog