Static site, no build step, no backend. Upload this whole folder to any static
host. It must be served over HTTPS — getUserMedia will not run in an
insecure context, and the service worker won't register either.
index.html the whole app
manifest.json home-screen install metadata
sw.js offline cache
fonts/*.woff2 self-hosted Martian Mono + Archivo (SIL OFL 1.1)
icons/*.png app + home-screen icons
All paths are relative (./), so it works from a subdirectory — a GitHub Pages
project site at /popwatch/ needs no changes.
GitHub Pages — push the folder contents to a repo, then Settings → Pages →
deploy from main / root. Tick "Enforce HTTPS" once the certificate appears.
Cloudflare Pages / Netlify — drag the folder into the dashboard. Both give faster cache invalidation and easier custom domains.
python3 -m http.server 8000 and visiting your laptop's LAN IP from the phone
will not work — localhost is a secure context, 192.168.x.x is not, so the
mic silently fails to initialise. Use a tunnel:
cloudflared tunnel --url http://localhost:8000
# or
ngrok http 8000
Both hand back a public HTTPS URL in seconds.
The service worker serves fonts and icons cache-first, and the page
network-first. So content changes to index.html go live on next load, but if
you change anything in fonts/ or icons/, bump CACHE in sw.js (e.g.
popwatch-v2) or phones will keep serving the old files.
- iOS: Share → Add to Home Screen. Launches without browser chrome, which gives back roughly 100px of vertical space. Mic access works in standalone mode on iOS 16.4+.
- Android: Chrome offers "Install app" once the service worker is registered.
The two font families are SIL Open Font License 1.1 — see fonts/OFL-*.txt.
Redistribution as bundled here is permitted; keep those files alongside the fonts.