Farm OS
A low-cost, AI-integrated poultry telemetry platform for the Indian market — unifying custom ESP32 edge nodes and printed enclosures with a premium Flutter command centre.
- TypeScript (core stack)
- Next.js (core stack)
- Flutter (working knowledge)
- ESP32 (working knowledge)
- MQTT (working knowledge)
- PostgreSQL (working knowledge)
- Role
- Founder · Firmware · Product Design
- Context
- EC Farms · 22,000 birds
- Location
- Shadnagar, Telangana
- Breed
- Cobb 430Y Broilers
A ventilation failure kills the flock in 45 minutes.
Hyderabad summer, 22,000 birds at 100% capacity. The exhaust bank stalls at night. Scroll to run the clock.
What changed once the shed could speak.
From 6.5% to 2.1% across 22,000-bird sheds.
During Hyderabad's peak summer, caught before intervention windows closed.
Against imported legacy European monitoring systems.
Two silent killers, and nobody in the shed at 2am.
On the outskirts of Hyderabad, Environmentally Controlled poultry farms run at high density — up to 22,000 birds per shed. The preferred breed, the Cobb 430Y, is prized for meat yield and feed conversion, and is acutely sensitive to environmental stress.
The two killers are ammonia and temperature spikes. Ammonia pools at bird height and, left unchecked, drives respiratory disease, immune failure and stunted growth. Heat is faster and less forgiving.
Existing monitoring was prohibitively expensive — imported, proprietary hardware with no real-time mobile access. Managers fell back on manual walk-throughs, reacting to crises instead of preventing them.
Most of this was decided standing in the shed.
I had an unusual amount of access here — this is the family business, so the research was not a two-week discovery phase with a farm that tolerated me. It was full cycles, in the house, over years. Almost every decision on this page came from something that happened in front of me rather than from a requirement someone wrote down.
- 01
Full cycles on the farm
Not a site visit. A broiler cycle is about six weeks and I was there for several of them, including the 2am walk-throughs this system was built to make unnecessary.
- 02
Walking the house with the manager
Following the person who already knew where the trouble starts — which corners go bad first, which fan failing matters and which does not.
- 03
Instrumented pilot
Once fourteen nodes were reporting, the shed became its own research instrument. Most of what I believed about airflow before that turned out to be roughly right and locally wrong.
- 04
Costing the incumbent
Pricing and teardown of the imported European systems the farm had already refused to buy. The barrier was never capability.
Six things the shed said, and what each one became.
The right column is not a restatement of the finding. It is the thing that shipped because of it — and in four of the six cases it is a decision that looks arbitrary until you know what produced it.
- 01Full cycles
The hours that kill a flock are the hours nobody is watching. Heat peaks in the small hours of a Telangana summer and there is no one in the shed between the last walk-through and dawn.
Alerting that escalates to a phone rather than a screen in an office, and a local siren the node can fire on its own authority.
- 02Walking the house
Managers judged ammonia by smell. A human nose registers it reliably well above the concentration at which it is already doing respiratory damage — so the first reliable human signal arrives after the harm.
A 19 ppm alert threshold set so the house never reaches 25, where damage starts. The threshold ships attached to the reading it judges.
- 03Instrumented pilot
Ammonia is not a room-level quantity. It pools low, and it pools unevenly — the fourteen nodes disagreed with each other by more than they disagreed with my model of the house.
Sensor heads at bird height rather than ceiling height. A probe in the wrong place does not report a smaller problem, it reports a different room.
- 04Full cycles
The uplink drops. Rural signal, and a poultry house is a long metal box — the network is least reliable exactly when the weather is worst.
Thresholds travel with the reading rather than living in the client, so a node that loses uplink still knows when to shout. It looks redundant on the wire and it is the whole design.
- 05Walking the house
The dashboard gets read standing in a dark shed, at arm's length, one-handed, by someone who has already decided something is wrong and wants confirmation in under two seconds.
Dark by default, one number per surface at the size it can be read at, and no interaction that needs a second hand.
- 06Costing the incumbent
The farm had priced imported monitoring and declined it. The objection was never that it did not work — it was capital cost per house, on a business that runs on thin per-bird margins.
A bill of materials the farm could self-fund per house, which is the constraint that put ESP32 and printed PETG in the design rather than an off-the-shelf industrial sensor.
The mortality figures are the farm's own cycle records — birds placed against birds sold, which is a number this business has every commercial reason to count accurately and was already counting long before I built anything. The comparison is the three cycles after deployment against the cycles before it, in the same houses.
It is not a controlled result and I would not present it as one. One farm, no control shed, and the deployment was not the only thing that changed in that window — the same period covers a litter-management change and my own much closer attention to a business I have a stake in. What I can defend is the mechanism: three specific mass-casualty events were caught and named by the system inside the intervention window, and those are in the alert log with timestamps.
The −75% hardware figure is the cleanest of the three, because it is arithmetic rather than an outcome: our bill of materials against the quoted per-house price of the imported system the farm had already declined to buy.
What the shed reports, and what the schema promises.
Measured
House 3 — Node Fleet
mqtt://farm-os.local/house-3/#
- ammonia.ppm18.4ppmDegraded
- temp.ambient24.1°CNominal
- humidity.relative61%Nominal
- node.07.battery11%Breach
- node.11.uplink—Idle
Specified
Reading contract
packages/farm-os-core/src/reading.ts
export interface Reading { nodeId: string; channel: "ammonia.ppm" | "temp.ambient" | "humidity.relative"; value: number; recordedAt: string; // Thresholds ship with the reading, not the client. // A node that loses uplink still knows when to shout. threshold: { warn: number; critical: number; };}Thresholds travel with the reading rather than living in the client. It looks redundant on the wire and it is the reason a node that loses uplink still knows when to trip its local siren — the shed does not stop being dangerous because the network went down.
What actually goes in the shed.
Every node is printed, populated and sealed in-house. Most of the decisions that kept these alive for a full cycle were physical ones, not software ones.
Five layers, printed and populated in-house. Hover one to read why it is the way it is — scroll to seal the enclosure.
A dashboard is a hypothesis about a room.
On the left is House 3. On the right is what Farm OS can tell you about it — reconstructed from fourteen nodes and nothing else. The two agree while coverage is good. Stop a couple of exhaust fans, then knock out the nodes nearest wherever it starts to pool, and watch the shed keep getting worse while the app goes quiet.
Recreated in the app's sampled chrome
Peak 13.2 ppm at bay 22, and the dashboard agrees to within 0.7 ppm. Stop a couple of fans and watch where it starts to pool.
Sensor heads sit at bird height rather than ceiling height, and that is the decision this whole set-piece exists to make arguable. Ammonia pools low and it pools unevenly; a probe in the wrong place does not report a smaller problem, it reports a different room. The alert threshold of 19 ppm fires early precisely so the house never reaches 25, where respiratory damage starts — but a threshold only protects the birds standing near an instrument.
How a reading becomes a decision.
I built this end to end — designing the enclosures, writing the firmware, and shipping the full-stack web and mobile applications. Five stages sit between a sensor head and a manager's lock screen.
Six surfaces, designed for a dark shed at arm's length.
The live dashboard is the part people notice. The decisions that made it usable are mostly everywhere else — in how alerts escalate, what the operator is allowed to override, and where a report actually ends up.

Every metric carries the range it should sit in.
“28.5°C” means nothing to a shed hand at 2am. “Safe 28–29°C” directly beneath it turns a reading into a decision. Encoding the agronomy into the interface is what let this replace a supervisor's memory — and it's why ammonia gets equal weight with temperature rather than being buried a level down.
What owning the whole stack actually taught me.
This required stepping out of the IDE and into an EC farm — understanding the specific panic of a 40°C afternoon, and translating that urgency into a latency-free architecture. The design decisions that mattered were not screen decisions. They were where to physically mount a sensor head, and what a system should do when its own network is gone.
Owning everything from the solder on the board to the type on the dashboard is what made the experience cohesive. It is also what convinced me that hardware and interface are not two disciplines that meet at an API — they are one product, and the seams are where users get hurt.
Farm OS proved the shed could talk. The harder problem was the people inside it.
Operators still logged mortality and feed on paper, in a dusty shed with no signal. So I built an offline-first native app they actually enjoy using.
Poultry Ledger



