Skip to case study

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