shiso — Recipe & Grocery Planner
A local-first recipe manager, meal planner and grocery app. One Flutter codebase across five platforms, working offline with no account.
- ROLE
- Solo — design and engineering
- PERIOD
- 2026 – Present
- PLATFORMS
- Windows, macOS, Linux, iOS, Android
Source is private until release. This is what the app does, not how it's built. Happy to give a demo.
THE PROBLEM
Most recipe apps keep your library on their servers, make you sign in to see it, and stop working the moment you lose signal. Getting the data back out is somewhere between awkward and impossible. Meal planning usually lives in a second app and the grocery list in a third, so the week you planned and the list you shop from stop matching by Wednesday.
WHAT I BUILT
- Everything works offline with no account: library, planner, grocery list. Syncing between your own devices is optional, and no feature depends on it.
- Clip a recipe by pasting a URL, sharing from your phone's browser, or using the desktop extension. All three land on an editable preview, so a bad parse is one edit away from right.
- Imports from Paprika, Mealie, Tandoor, Nextcloud Cookbook, MasterCook and MealMaster. Import adds to your library and never overwrites it, and keeps whatever the source format bothered to store.
- Plan a week by meal type, then turn the plan into a grocery list in one tap. Anything the Pantry says you already have gets dropped. The list sorts by your store's aisle order and runs a price total.
- Search is hybrid and runs on device: FTS5 keyword ranking and vector nearest-neighbour over bge-small embeddings, fused with reciprocal rank fusion in a single SQL statement. Embeddings are computed in a background isolate as recipes are saved, so searching by meaning needs no server and no API key.
- Those same embeddings do two more jobs: similar recipes on every detail page, and duplicate detection at import. When the keyword map misses, aisle assignment falls back to nearest-neighbour over a bundled food database. That puts gochujang, za'atar and tahini in a real aisle instead of Unassigned.
- Cook mode is one step at a time, with quantities that follow whatever you scaled the recipe to. Timers use the OS alarm system, so they still go off with the app in the background.
- Getting your data out is a feature: export to Markdown, PDF, JSON-LD or Paprika. Share a recipe or a whole tag as an unlisted link, with a revoke button that works. Backups run on their own into a folder you can open.
- Ships the way each platform expects: a Flatpak manifest for Linux and MSIX packaging for Windows, on one semver across all five targets.
- Crash reporting is opt-in and points at a server you host. The privacy claim holds at the telemetry layer too, not just in the copy.
OUTCOME
- One app for clip, plan, shop and cook, instead of three that disagree.
- One codebase ships to Windows, macOS, Linux, iOS and Android.
- Semantic search that still works in aeroplane mode. The model runs on device, so searching the library by meaning costs nothing and sends nothing.
- The library stays yours. It works offline, exports four ways, and backs up somewhere you can open without the app.
- Reached 1.0.0 with packaging for every target, household-scoped row-level security behind the optional sync, and a Postgres test suite that proves the tenant boundary rather than asserting it.
SCREENSHOTS





