DEV Community

Praire-Roots
Praire-Roots

Posted on

Free offline microgreens farm ledger for Windows: I replaced a spreadsheet with a local-first Tauri + Rust app

A spreadsheet let me overwrite a harvest cell. The total still looked fine. That tray was already promised.

I needed a free offline farm ledger for Windows: standing orders, trays by the ounce, and books that do not live in a $30/month cloud farm app. No account. No subscription. File stays on the PC.

That is Groundtruth 0.1.3. Apache-2.0. I run my own microgreens farm on it.

Repo: https://github.com/alexjvv52-ops/groundtruth-app

The job: standing order tracker + honest books

Small growers sow trays, harvest by weight, and sell to kitchens or a market. The failure mode is not seed. It is promising the same tray twice, then finding out when the sheet and the WhatsApp thread disagree.

Groundtruth is a local-first desktop app for that loop.

  • Today: move to light, harvest, sow the shortfall
  • Standing orders next to what is actually on the rack (promised vs sown)
  • Money in / money out — unpaid stays unpaid
  • Farm currency in Settings; bills and Payment Links use that currency
  • Export the database, event log, receipts, and CSVs and leave

Not a phone CRM. Not farmOS. Not QuickBooks.

Stack

  • React + Vite UI
  • Tauri commands into a Rust farm core
  • SQLite on disk
  • Append-only event log beside the database
  • %APPDATA%\com.prairieroots.groundtruth

Constraints that are code, not slogans

Unpaid stays unpaid. No silent mark-paid with no trail. Corrections and voids are new events.

Tray cost is computed when you look. Not a cached cell. Missing rows → it refuses to invent a number.

Health is not stored. A scan replays the event log against the database. Status is not a mood from yesterday.

Marketing cannot carry dollars. Samples and follow-ups stay money-free so a pipeline cannot pretend it is revenue.

One operator, one machine. No logins. Export everything. Stripe keys never ride along.

Restore checks a stamp. Bad bundles are rejected. Farms do not merge.

Those rules live in src-tauri (db.rs, events.rs, import.rs, export.rs) and docs/GT-D-SERIES.md.

Offline farm books, no subscription

Cloud farm software does real work: calendars, pack lists, a phone. It also keeps the ledger on a server you do not own and bills you whether the week sold.

This build is the opposite bet: Windows x64, unsigned installer, early 0.1.x, dead-laptop recovery documented and not magic. If you want the notebook gone tonight, do not.

Why this is on DEV

Local-first is easy to print on a landing page. It is harder when a cook is waiting on a tray count.

If you build desktop tools that have to survive a bad cell in a sheet, steal the event log + computed-health pattern. The microgreens skin is just the job I had.

Issues and PRs on the repo.

Top comments (1)

Collapse
 
doykim0903 profile image
Doyoon Kim •

I see you moved from a mutable spreadsheet to a Tauri‑Rust UI to enforce data integrity for each tray. In my work on local LLM pipelines, I’ve found that immutable logs and explicit versioning prevent accidental overwrites just like your ledger. Have you considered embedding a simple event‑sourcing layer to track changes and enable rollbacks?