AgTech Operations / 2024–Present
Dumalan Mushroom Farm
Built a full-stack operations dashboard that tracks mushroom cultivation from sterilization through sales, with role-based access for farm owners, technicians, and sales staff.
The spark
My wife runs a small gourmet mushroom farm. I watched her track everything in spreadsheets: batch codes, contamination rates, harvest weights, inventory levels. Some pain points included losing track of which bags were in which stage, missing reorder points on supplies, and spending hours reconciling sales with inventory. I realized there had to be a better way.
The problem
Small-to-mid-sized specialty mushroom farmers, typically 1-5 person operations, track everything in spreadsheets, whiteboards, and paper logs with no enterprise software options.
- Who it affects
- Small-to-mid-sized specialty mushroom farmers using BoomRoom tents and All American sterilizers, typically 1-5 person operations without enterprise software budgets.
- Previous workflow
- Spreadsheets, whiteboards, and paper logs. Farm owners manually track which bags are in sterilization vs. fruiting, multi-flush harvest yields per bag, consumable inventory, and farmers market sales by channel.
- What it costs
- Hours per week on manual tracking; missed reorders causing production gaps; no visibility into yield-per-strain profitability; contamination patterns hard to spot without data.
The solution
Built a full-stack operations dashboard that tracks mushroom cultivation from sterilization through sales, with role-based access for farm owners, technicians, and sales staff.
Outcome
~5 hours/week saved on manual tracking; contamination visibility revealed most losses occurred post-inoculation, leading to process changes. In active development toward commercial launch.
What I learned
Building for a niche domain forced me to deeply understand the end user's workflow before writing code; the best architecture decisions came from understanding why bags need to be tracked individually, not just that they do.
Technical decisions
- React 18 + TypeScript + Vite
- Fast refresh during dev; TypeScript catches errors before runtime; Vite is significantly faster than CRA
- TanStack Query v5
- Eliminates prop drilling; built-in caching with staleTime: Infinity for stable farm data
- Shadcn/ui + Tailwind CSS
- Accessible Radix primitives; rapid styling without CSS bloat; consistent design system
- Express + TypeScript (ESM)
- Lightweight, well-understood; ESM for modern imports; easy to deploy anywhere
- Drizzle ORM
- Type-safe queries generated from schema; migrations with Drizzle Kit; works with serverless Postgres
- PostgreSQL via Neon Serverless
- Relational model fits entity relationships; Neon's serverless driver enables edge/Vercel deployment
- Passport.js + OpenID Connect
- Session-based auth with Postgres-backed sessions for production reliability
- Zod
- Shared schemas between frontend/backend; runtime validation matches TypeScript types
The hard part
Modeling the multi-stage cultivation lifecycle with proper data relationships. Each batch has many bags, each bag moves through stages independently, and each bag can have multiple harvests (flushes). Contamination can happen at any stage and needs to link back to the specific bag. Solved with: Normalized relational schema with proper foreign keys (species → strains → batches → bags → harvests), separate stageEvents table to track stage transitions with timestamps, and bagId as the primary tracking unit, because bags progress at different rates. Used Drizzle's type inference to ensure schema consistency across frontend forms and backend routes.
Next steps
- Environmental sensor integration – Ingest temperature/humidity data from BoomRoom controllers
- Predictive analytics – ML model to predict yield-per-batch based on strain + substrate + conditions
- Mobile-native app – Dedicated iOS/Android app with barcode scanning for shop floor use
- Stripe integration – Subscription billing for SaaS launch to other mushroom farms