home
  • AgTech · Platform
  • 2022 – 2023
  • Full-stack

Steamhouse

Steamhouse is a multi-tenant platform for commercial growing operations — the system of record that replaces the spreadsheets, paper logs, and tribal knowledge most grows still run on. Teams author reusable week-by-week feed schedules (nutrient doses and target water chemistry per growth stage), attach them to a crop, then log a rich daily journal — actual pH/EC/PPM readings, feedings, climate, deviations, and photos — so the whole team works a successful grow off one source of truth. A chemistry engine even reverse-engineers a fertilizer's compound makeup from its label. It runs as a live, one-click demo seeded with a full operation's worth of data, so you can explore the whole app with zero setup.

Steamhouse — My Crops board: active crops with growth-stage tags and a Journal button on each
01 / 03 · Crop board

Every active crop on one board — strain, growth stage, and start date — each opening a day-by-day journal of the readings, feedings, and climate logged against its prescribed plan.

Problem

Serious indoor and hydroponic cultivation is a data-heavy discipline. Growers dose precise nutrient mixes that change every week as a plant moves through its stages, hit exact water-chemistry targets (pH, EC, PPM), log climate and feeding data daily, and coordinate a team across recurring tasks.

In practice this lives in fragmented spreadsheets, paper logs, and tribal knowledge — which makes it error-prone, hard to repeat a grow that actually worked, and impossible to audit. There was no single place to design a feed program, run a crop against it, and see the whole team's work in one timeline.

What I built

A full-stack, multi-tenant web app that centralizes the entire crop lifecycle. Teams (with role-based permissions) build reusable feed-schedule templates — week-by-week recipes specifying nutrient products, doses, water volume, and target pH/EC/PPM per growth stage — or pull in commercial schedules published by nutrient companies.

Each crop follows a schedule from a start date, and growers keep a rich daily journal: actual readings, whether plants were fed, deviations from the plan, climate data, and photo/document posts. A FullCalendar-based task system with recurrence rules keeps the team coordinated, and an activity feed tracks who did what.

The standout feature is a chemistry engine that reverse-engineers a fertilizer's makeup from its label — given the guaranteed nutrient percentages and derived compounds, it solves a linear system (Ax = b) for the underlying compound fractions, turning a bag label into actionable per-compound chemistry growers can dose against.

Architecture

It's a Next.js full-stack monolith — a React/MUI single-page app over serverless API routes backed by MongoDB on Vercel. Authorization is enforced at the route level: every API handler is wrapped by an authorizePrivate / authorizeAdmin higher-order function that validates the NextAuth session, lazily provisions the user, and checks team membership plus role-based permissions on every write.

Multi-tenancy runs through Teams: nearly every record is an OwnedObject scoped to a teamId (indexed on teamId), and the teamId on each request is verified against the caller's actual team to prevent cross-tenant access. Mongoose schemas and TypeScript interfaces are defined together per collection, guarded around mongoose.models[...] to survive serverless re-instantiation.

The chemistry solver uses mathjs's lusolve over a per-compound element-composition matrix, and even handles under-determined labels by intelligently injecting ammonium nitrate. Crop photos and documents upload to AWS S3 via presigned URLs, and a Vercel cron refreshes the demo dataset daily so reviewers always land on a populated operation.

Stack

TypeScriptNext.jsReactMUIMongoDBMongooseNextAuthAWS S3mathjsFullCalendar

Outcomes

  • Designed a secure multi-tenant data model with route-level RBAC enforced on every mutation, so each growing operation's data is cleanly isolated yet shareable within its team.
  • Built a genuinely novel domain feature — a linear-algebra fertilizer-composition solver — that goes well beyond CRUD and encodes real agronomy and chemistry.
  • Shipped 10+ cohesive feature areas (crops, schedules, products, calendar, teams, journal, admin) and a zero-setup portfolio demo: Dockerized MongoDB, a guarded daily-refreshed seed, one-click demo sign-in, and an onboarding modal.