Hello! I’m messing around with some PWA features and getting really stuck when it comes to display modes. Basically every browser and device I test on behaves wildly differently, and I’m having a hard time distinguishing which of those behaviors are errors on my part and which are just browser funkiness.
(Link to my PWA if you want to check the manifest or see how it displays for you)
In my manifest, I try to set the display mode to fullscreen. This setting seems to only be properly and consistently applied when I test on my Lenovo Tab 11 running Chrome. Firefox on the same tablet does not respect it and starts in standalone mode, unless I also have the Chrome Version of the PWA installed. Once that is the case, Firefox is beautiful and consistent. I have no idea why the different versions installed by the different browsers would interact with each other like this.
When I install the PWA on my phone (Pixel 9 Pro running GrapheneOS), via Chrome or Vanadium, the site thinks it’s running in fullscreen, but I still have a black bar at the top (it doesn’t apply the theme color set in the manifest!). This wouldn’t be a problem per se, but the browser also sets a safe-area-inset parameter, which, when I respect it, leads to a very fat distance from the top (the safe inset is green):
spoiler
When I install it on my phone via Firefox, the app sometimes thinks it’s display-mode:browser but displays perfectly fine as fullscreen, and sometimes it thinks it’s fullscreen but displays more like a standalone. It seems completely random and can change any time I close the app or navigate away from it:
spoiler
When I install the PWA on my secondary phone (Moto G100) via Chrome, it has similar issues as on my main phone (it thinks it’s fullscreen but is actually standalone) but it does not apply that ridiculous safe-area-inset. That backfires sometimes as navigating back via gesture will catapult the page to take up the full height, so the header shifts into the top bar. Would have been nice to have that safe-area here…
When I install it via Firefox on the Moto G100, it looks good about half of the time! Actual fullscreen with proper safe-area that doesn’t break on navigation. Sometimes it randomly starts in standalone mode, but with the proper theme color applied to the top bar. Everything breaks if I have the Chrome version installed at the same time though.
Then, the firefox version will never show up as proper fullscreen, but always have almost the same display issues as the Chrome version on that same phone.
I haven’t even tested the PWA on iOS yet (I’ll have access to an iPhone in about 2 weeks though so I’ll test it then) but I’m guessing it will have its own display challenges as well. I’m also still battling the display issues from swapping my SVGs to generate with colors from the OKLCH system (it seems to really mess with any open source browser I’ve tried). So maybe, I should just ignore the browser display issues for now and focus on my color display issues instead?
Also, does anyone know if I can just let the user decide on their own preferred display mode? It would probably be the best solution to just let the user set the display mode that actually works in their specific browser. But as far as I understand how manifest files work, I can’t really change much once the app is already installed, and I haven’t found any online documentation that would suggest that I could programatically change the display property in the manifest based on user input :( But maybe there’s some workaround you know about?
I would be very happy about some pointers and feedback on how I might get this display thing halfway consistent!
I don’t have any answers unfortunately but here is what it looks like on an iPhone on iOS 26:
in the browser:
Spoiler
as a PWA:
Spoiler
it seems that the safe area inset is correct here.
Ooh that looks good! Thank you so much, that definitely lessens my worry about iOS not cooperating at all haha