Soft Focus is a small guided-practice app for short, quiet attention resets. It offers simple visual and written cues, then gives you a place to pause, finish, and reflect.
Soft Focus is not a medical tool, a diagnosis tool, or a substitute for care from a qualified professional. It does not make health claims. It is meant to support brief personal practice in a calm, low-pressure way.
- Phrase Anchor: choose a short phrase and return to it as a steady point of attention.
- Moving Ball: follow a slow visual sweep with optional gaze guidance.
- Breathing Reset: use a paced breathing cue with gentle preset rhythms.
- Bilateral Rhythm: follow a simple left-right rhythm.
- Orienting: look around slowly and notice what is present in the space around you.
- Completion / Reflection: close a round, optionally write a short note, and decide what to do next.
Soft Focus includes a few preferences for making practice feel less intense:
- Low intensity softens the presentation where available.
- Reduced motion uses calmer movement or guidance where available.
- Gaze guidance can be adjusted for practices that use visual following.
Recent results and reflections are saved locally on your device in this browser. They are not sent to a server by this app.
You can clear saved recent results from the Recent results area.
Soft Focus uses Bun.
bun install: install dependencies.bun run dev: start the local development server.bun run build: typecheck and create a production build.bun run preview: preview the production build locally.bun run typecheck: run TypeScript checks.bun run smoke:test: run focused smoke checks.bun run validate: run typecheck, smoke checks, and a production build.bun run e2e:install: install the local Chromium browser used by Playwright.bun run e2e:test: run Playwright end-to-end tests.
Releases are published by the Release GitHub Actions workflow.
- Merges to
mainand direct pushes tomainpublish a release after the CI workflow succeeds. CI runsbun run validate, installs Playwright Chromium, and runsbun run e2e:testbefore the release workflow is allowed to create a release. - Manual release requests should use the Release workflow's
workflow_dispatchtrigger. The manual trigger accepts an optionalversioninput and optionalnotesoverride. - Release tags use
vMAJOR.MINOR.PATCH. If no version is provided, the workflow createsv0.1.0for the first release and then increments the latestv*patch version for later releases. - Release notes are generated by GitHub unless the manual
notesinput is provided. - The release workflow uses the repository
GITHUB_TOKENwithcontents: writeso it can create the tag and GitHub release.
To request a release manually, ask for a release and include the version only when you want to override the automatic next patch version, for example v0.2.0. Before requesting a manual release, make sure the intended commit is on main; the workflow will run the same local validation and browser E2E checks before publishing.
For the first release, push these release workflow changes to main and let the successful CI run trigger Release, or run Release manually with no version input. The expected first tag is v0.1.0.