Voicebar
A voice-first keyboard for Android that works alongside Gboard. Tap Voice, talk, and a tidy message lands in the box.
Simple shared checklists for groceries, packing, and more. Real-time collaboration, offline-first, encrypted sync.
ProductivityTypeScript · HTMLGitHub @jbrollOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A Simple Checklist app.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Shared Checklists - built with rowboat and BetterAuth.
nvm use reads .nvmrc) and npm 12 (npm install -g npm@12, once per Node
install)Each npm major writes different lockfile metadata (optional platform binaries, dev and
devOptional flags), so an install under another npm rewrites the lockfiles. The engines field
in the root, backend/ and migration/jazz-export/ package.json, each of which has its own
lockfile, pins the majors only (node ^24.0.0, npm ^12.0.0), since a minor version changes no
lockfile and the CI host runs an older Node 24 than the laptops. Each directory's .npmrc sets
engine-strict, so npm install under another major stops with EBADENGINE before it touches a
lockfile. scripts/toolchain.ts checks the running Node and npm against engines;
scripts/pre-land runs it, so the shared land command refuses a mismatched toolchain, and
scripts/toolchain.test.ts fails if the three engines fields differ or .nvmrc names another
Node major. To move to a new major, change all four in one commit and regenerate the lockfiles in
the next.
npm 12 runs a dependency's install scripts only when allowScripts in that package.json approves
them: esbuild and lefthook at the root, better-sqlite3 and esbuild in backend/. sharp
(used only by the icon and asset scripts) stays blocked. Approve a new one with
npm install-scripts approve <pkg> after reading what its script does.
npm install
cd backend && npm install && cd ..
cp .env.example .env
cp backend/.env.example backend/.env
# Edit both .env files with your OAuth credentials
npm run dev # Runs both frontend and backend
Visit http://localhost:5173
Available dev commands:
npm run dev - Run both frontend (port 5173) and backend (port 3001)npm run dev:frontend - Run only frontendnpm run dev:backend - Run only backendGoogle OAuth: https://console.cloud.google.com/ Apple OAuth: https://developer.apple.com/
Add redirect URIs:
http://localhost:5173/api/auth/callback/{provider}https://yourdomain.com/api/auth/callback/{provider}GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
APPLE_CLIENT_ID=your_apple_client_id
APPLE_CLIENT_SECRET=your_apple_client_secret
VITE_API_URL=http://localhost:3001
STRIPE_SECRET_KEY=your_stripe_secret_key
STRIPE_WEBHOOK_SECRET=your_stripe_webhook_secret
Templates are reusable checklists organized in folders.
Sessions are created when you "use" a template - they track what's in your cart and what you've purchased without modifying the template. A session is labeled by its date until you give it a name with Rename in its row menu.
Keyboard shortcuts in a session:
↓ / ↑: move between itemsSpace / Enter: check or uncheck the focused itemN: open the add/edit formEsc: leave the sessionrowboat provides:
BetterAuth provides:
Stripe provides:
npm run dev # Start dev server (frontend + backend)
npm run build # Build for production
npm run lint # Run linter
npm run type-check # Check TypeScript
npm run test:run # Run unit tests
npm run test:e2e # Run E2E tests
npm run check # Run type-check + lint + tests
See ARCHITECTURE.md for system overview and code locations.
Getting Started:
QUICKSTART.md - Get started in 5 minutesREADME.md - This fileArchitecture & Development:
ARCHITECTURE.md - System architecture and code organizationCLAUDE.md - Development guide and rowboat patternsdocs/DESIGN_SYSTEM.md - UI/UX design patternsdocs/INDENTED_LIST_FORMAT.md - Hierarchical text import/export formatDeployment:
DEPLOY.md - Deployment instructionsProduct:
docs/BACKLOG.md - Single project backlog (outstanding features + engineering)docs/ROADMAP.md - Product positioning and market analysisdocs/MARKET_COMPARISON.md - Competitive analysisdocs/GooglePlayStore.md - App store submission checklistThe app supports multiple brands via runtime domain detection:
Brand configuration is in src/lib/brand.ts. Set VITE_BRAND env var to override.
See DEPLOY.md for detailed deployment instructions.
Quick start:
./deploy-full.sh init # Initial deployment (frontend + backend)
./deploy-full.sh update # Subsequent updates
The app deploys in two parts:
PolyForm Noncommercial 1.0.0 - Free for non-commercial use.