Listo
A bilingual lists-and-notes app that works offline first. Say a list out loud and it is ready to use; switch the AI off and everything else still works.
- Local-first: no account, no network, and no server needed for any manual feature.
- English and Spanish throughout, with key parity enforced at compile time.
- The AI drafts; the person reviews. Nothing is saved until they tap Save.
- The same code runs on iOS, Android, and in the browser on a real SQLite database.
The idea
Say it. Save it. Use it. (Dilo. Guárdalo. Úsalo.) Most list apps either stay simple or bolt AI onto everything and stop working without a connection. Listo takes the opposite position: lists and notes always work, on the device, with no account. AI makes input much faster, but it is never something the app depends on.
What I built
A cross-platform app with Expo and React Native, plus a small AI service:
- Lists that do real work. Quantities, prices and budgets, drag reordering, group by store aisle from a built-in English and Spanish dictionary, suggestions from your own history, templates, recurring lists that reset on a schedule, and reminders.
- Notes, Spaces, search, and an archive. Coloured folders, full-text search with accent folding, and nothing deleted by accident.
- Voice lists and an AI planner. Speak a list, or describe a recipe, trip, or project, paste a recipe link, or snap a photo of a recipe card. Listo drafts the list with quantities and price estimates, and you review and edit it before anything is written.
- Shared lists with live collaboration, presence, and who checked what, synced through Supabase when you choose to use it.
- An installable web app that keeps working offline once loaded.
How it works
The device is the source of truth. Everything lives in a local SQLite database: a file in the app's sandbox on a phone, and the browser's private file system (OPFS) on the web. The web build is not a cut-down preview. Migrations run in order inside an exclusive transaction, and a database written by a newer build is refused rather than corrupted.
The model never touches your data directly. The OpenAI key lives only on the server. A recording is transcribed and turned into structured JSON there, validated against a schema, validated again in the app, de-duplicated, and shown as a draft. Only Save writes to the database.
Limits are enforced where they cannot be bypassed. Every AI feature costs money per use, so the allowance is counted on the server against a signed install credential and checked against the RevenueCat entitlement, with per-network registration limits and a global daily ceiling on free trials. The app draws an honest meter; the server has the final word.
Sync was tested before it was trusted. A simulation of two devices editing the same lists found two ways they could end up disagreeing: an older delete beating a newer edit, and two edits in the same millisecond. Both were fixed on the server and in the client before shared lists went on.
Where it stands
Listo is in testing on iOS and Android.