Here is a look at what landed across the Ferni codebase recently. We have been focused on smoother web navigation, cleaner accessibility, and sharper settings updates.
Mobile and Navigation Updates
We merged a fix for back button navigation in the web app. Previously, none of the 37 panels in the app held browser history entries. Pressing back on a phone or in a browser left the app completely instead of closing an open menu or sheet. Now, opening a dismissable panel holds one history entry, so pressing back closes the open overlay. Take a look at #2202.
We also landed changes for notched phone screens. Double safe area padding made the app shell taller than the display, which pushed buttons off screen and blocked scrolling. The app shell now fits the screen and scrolls properly inside its container. See #2139.
Interface Speed and Accessibility
Slow menu panels now give instant feedback. Panels like Sanctuary used to wait for network data before rendering any markup. A new shared loading shell shows a busy dialog right away while data loads. We also converted several panels into real modal dialogs so keyboard navigation and Escape key handlers work reliably. Check out #2109.
We fixed reduced motion behavior and color contrast across themes. Enabling reduced motion previously hid the Connect button because opacity rules conflicted. We also updated call buttons so Disconnect uses a soft warm outline rather than looking identical to Connect. See #1979.
Additional contrast fixes landed for history stars, notification active tabs, and difficulty labels across zen and midnight themes. We swapped flag emojis in language lists for plain text labels as well. Take a look at #2034.
At 200% zoom, the status text on the Connect button wrapped awkwardly and got clipped. We updated the status label layout so connecting text stays properly inside the button. See #1523.
Reliable Integrations and Settings
Google Calendar settings showed a Connect button even after a successful setup. The panel expected a wrapped response envelope that the server did not send. We merged a fix so the UI reads the flat status object directly. Check out #1983.
We landed a fix for contact settings where typing a phone number saved a blank string. Input values now stay in state across re-renders, normalize to E.164 format, and prompt for verification codes properly. Take a look at #1676.
Web Feeds and Discovery
We merged updates to make posts and pages easy to discover. This adds RSS and Atom feeds, an XML sitemap for the developer portal, Twitter cards, and an IndexNow key endpoint. See #2010.