Voice-first:
Say the name, ‘next field’, say the description, and then the words ‘Add Objective’
Objective Swift is a focused, voice-first objective tracker. Capture objectives quickly by keyboard or voice, move them through a simple active → complete → deleted lifecycle, and trust they’re stored safely — with the interface staying out of your way.
Run =just test= to regenerate these.
Objectives are created with a title and an optional description, then live on a card grid until completed or deleted. Completing a card flashes it green and greys it out; the state persists across reloads. Each page shows ten objectives, newest first.
Every text field has a microphone button powered by the browser’s built-in SpeechRecognition API — no API key, no server round-trip, no Whisper. Transcription is instant and free. The mic button is hidden automatically on browsers that don’t support it (Firefox, or non-HTTPS origins).
Voice commands work mid-sentence:
- “next field” — submits the title field and jumps focus to description, starting a new recording there
- “add objective” — submits the form from whichever field you’re dictating into
The home page opens with a brief introduction and an animated pulsing microphone graphic. The objectives page uses a column card layout and supports light and dark modes via a toggle in the header.
The dev server listens on port 3000 and Storybook on port 6006.
- Application: http://localhost:3000/
- Storybook: http://localhost:6006/
With Nix and devenv installed, one command starts everything — database, migrations, dev server, and Storybook:
devenv upStart PostgreSQL separately, then:
just db-migrate
just devExport DATABASE_URL first if your Postgres connection differs from the default:
export DATABASE_URL="postgres://app:please@127.0.0.1:5432/app_dev"just # type-check + full test suite (unit + e2e)
just dev # start dev server on port 3000
just check # TypeScript type checking only
just test # vitest unit tests + Playwright e2e tests
just fmt # format source files
just storybook # Storybook on port 6006
just db-migration # generate Drizzle migration files
just db-migrate # apply pending migrations
just psql # interactive psql session- React 19, React Router 7, TypeScript, Tailwind CSS 4
- Express 5, Drizzle ORM, PostgreSQL 17
- Playwright (e2e), Storybook (component dev)
- pnpm, devenv / Nix

