still-free.openapps.xyz

Source

This app’s code and revision history are public. Download a copy or explore the files below.

Public
The app’s code and revision history are public.
Owned app · rev 0fa0e84d537b
Run it yourself
Take the whole tree and run it on your own machine. The download needs no account. Cloning needs a sign-in.
Download .zip
bounded clone a8c677472ab5691741798a3d
A copy you download is not bounded. The guarantees this app runs under - declared egress, proven invariants, writes that fail closed - live in the runtime serving this page, not in the files. What you get is auditable source you can read and run, with no runtime guarantees attached.
← All files
AGENTS.md
# Still

Still is a free meditation, breathing and sleep app, and a free alternative to Calm and Headspace. It is an OpenApp in the OpenApps free apps store (https://free-apps.openapps.xyz/), owned by the OpenApps team.

## What it promises

- Free, with no subscription, no trial, no ads and no locked content. Never add a cap, an upsell or tracking.
- No sign-up. A guest account is made in the browser on first use.
- Everything plays on the person's device: sounds and bells are generated with Web Audio, voices are the browser's own (speechSynthesis). There are no audio files and no paid services. Keep it that way: it is why Still is free and works offline.
- Mood check-ins and saved mixes stay on the device. Only day totals (seconds and sessions per day) go to the guest account.
- Honest about limits: device voices sound less natural than recorded narrators, and phones may pause sound or speech with the screen off (iPhone Safari especially). Say so plainly where it matters.
- Every breathing pattern, session, mix and story has a stable link, documented in `public/llms.txt` for AI assistants. There is no API on purpose. Keep the links and that file true.

## How it is built

- `index.html` is the static landing page that search engines and AI crawlers read. Keep its copy, comparison, FAQ and JSON-LD in sync with what the app does. The quick start mounts into `#start`; the app's header tabs mount into `#app-nav`.
- `src/main.tsx` keeps `/` as the landing and lazy-loads the app (`src/App.tsx`) for `/today`, `/breathe`, `/meditate`, `/sounds`, `/sleep` and `/progress`. Sleep routes and the falling asleep session use the night look (`body.night`).
- `src/lib/audio.ts` is the one audio engine: the AudioContext, output routing (Chrome and Firefox play through an `<audio>` element fed by a MediaStream, which gives lock screen controls and keeps sound going with the screen off on Android; Safari plays directly as a "playback" audio session), Media Session controls, the screen wake lock, bells and breathing tones.
- `src/lib/noise.ts` makes the ten soundscapes from generated noise buffers and filters, with a loudness trim per sound. `src/lib/mixer.ts` mixes them, saves the mix, and runs the sleep timer: a fade on the audio clock over the last third, up to five minutes.
- Timing that must survive a dark screen is scheduled on the audio clock: meditation timer bells and breathing tones (two minutes ahead).
- `src/lib/speech.ts` picks English voices (calmest first) and speaks a sentence at a time, which keeps Chrome from cutting off long passages.
- Content: `src/content/patterns.ts` (breathing), `src/content/sessions.ts` (12 guided scripts: each step is spoken text plus seconds of silence; the player stretches the silences to the chosen length), `src/content/stories/` (six sleep stories, about 2,000 words each).
- `src/lib/progress.ts` keeps the practice log and day totals on the device and syncs day totals with `practice/<userId>/days/<YYYY-MM-DD>` (`policy.json`: only the owner can read or write). `src/lib/bounded.ts` loads the SDK only when needed.
- `src/sw.js` is the service worker template; the build (`vite.config.ts`) fills in every file of the app to precache, so the whole app works offline. `public/manifest.webmanifest` and `public/icons/` make it installable.

## Working on it

`npm install && npm run build` typechecks and builds `dist/`. `npm run dev` serves it on port 4332. Ship changes through previews and releases as your runtime instructions describe; the app is an OpenApp, so nobody deploys it directly.

Check a change by running a breathing session and watching the phases keep time, a short timer with interval bells, a guided session in Listen and Read modes, a sound mix with a short sleep timer (type a number under Other), a story read aloud, and then reloading Progress. Then reload with the network off to confirm it still opens and plays.

## Writing

Plain words, short sentences, no jargon, no em dashes. Scripts and stories are written to be read by a speech voice: no numerals, abbreviations, parentheses or quotation marks inside the text. Gentle and inclusive, no medical claims.

Change history

Link to OpenApps pages and add a contribution strip
0fa0e84d53 · 19 hours ago
Bind the agent address in the policy
6f3baa1c72 · 1 day ago
Add favicon.ico so browsers that ask for it stop getting a 404
1a004fe0e3 · 1 day ago
Bounded source sync
afe642fe50 · 2 days ago
Bounded source sync
2c581f55ea · 2 days ago
Bounded source sync
375934c28b · 2 days ago
Bounded source sync
74ff37d51a · 2 days ago