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.
During practice, the Phaser canvas controls also have keyboard fallbacks: press Space or Enter to pause or resume, and press Escape to stop the practice and move to completion.
Recent result metadata is saved locally on your device in this browser. Soft Focus keeps the practice type, outcome, timing, and preference settings needed to make the app feel continuous, but typed phrases and reflection notes stay session-only by default and are not written into browser storage.
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 validate:full: run full validation plus Playwright against the production preview server.bun run e2e:install: install the local Chromium browser used by Playwright.bun run e2e:test: run Playwright end-to-end tests against the Vite dev server.bun run e2e:test:preview: build and run Playwright end-to-end tests againstvite preview.
Soft Focus deploys as a static Vite app to the existing Vercel project named soft-focus.
- Vercel settings are captured in
vercel.json: Vite framework,bun install --frozen-lockfile,bun run build, anddistoutput. vercel.jsonkeeps/and/index.htmluncached so stale HTML does not point at removed lazy chunks, while built/assets/*files use long-lived immutable caching.- Git-based Vercel deployments are disabled in
vercel.json; production deploys are handled by the dedicated Vercel Deploy GitHub Actions workflow on pushes tomainor manual workflow dispatch, matchingspace-explorer. - The workflow requires these repository secrets:
VERCEL_TOKEN,VERCEL_ORG_ID, andVERCEL_PROJECT_ID. - Get
VERCEL_ORG_IDandVERCEL_PROJECT_IDby linking the local repo to the existing Vercel project withvercel link, then reading.vercel/project.json. Keep.vercel/local; it is ignored by git. - The workflow runs
bun run validate, installs Playwright Chromium, runs production-preview E2E, then uses a pinned Vercel CLI forvercel pull,vercel build --prod, andvercel deploy --prebuilt --prod.
Releases are published intentionally by the manual Release GitHub Actions workflow.
- Merges to
mainand direct pushes tomainrun CI and production deployment, but they do not create releases automatically. - Release requests should use the Release workflow's
workflow_dispatchtrigger frommain. 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 runs
bun run validate, installs Playwright Chromium, runsbun run e2e:test:preview, and uses the repositoryGITHUB_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.