Skip to content
All workLive deploymentNominal
Enterprise TelemetryCase 012025 —

Farm OS

solder to type

Farm OS helps poultry farmers monitor the conditions inside their chicken sheds and respond when they become dangerous. I designed and built the sensors, alerts and mobile dashboard for our family's farm in Telangana.

  • 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
The problem
Our farm raises about 22,000 chickens at a time. Managers relied on walking through the sheds to check conditions. Between visits, rising heat or ammonia — a gas released from poultry waste — could go unnoticed and harm the birds.
What I did
I placed fourteen sensors near the birds and connected them to a mobile dashboard. Managers can check conditions remotely and receive alerts. A local alarm can also sound when the internet connection drops.
What changed
Managers gained continuous readings and alerts between manual checks. Farm records showed mortality falling from 6.5% to 2.1% after deployment, alongside other management changes; this was not a controlled comparison.
22,000
Birds under management
14
Sensor nodes reporting
19 ppm
Ammonia alert threshold
Full read · 4 min
Failure mode 01

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.

Elapsed
T+00:00
Shed temp
28.5°C
Nominal
Exhaust bank running. Shed holding 28.5°C.
Shed D13 · plan view
4/4 3/4
INLETEXHAUST BANK 3
LETHAL > 41°CSAFE 28–29°C
T+00── unmonitored: total flock lossT+45
Farm OS · critical · shed D13
Temp 34.8°C climbing 0.4°C/min. Exhaust bank 3 unresponsive.
Acknowledged T+08:12 · backup engaged
OutcomeMeasured over 3 cycles

What changed once the shed could speak.

−0%
Flock mortality

From 6.5% to 2.1% across 22,000-bird sheds.

0×
Critical alerts acted on

Three summer incidents recorded in the alert log and addressed before conditions worsened.

−0%
Hardware cost

Against imported legacy European monitoring systems.

01Context

What could go wrong between manual checks.

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.

The legacy bottleneckBreach

Available monitoring systems were imported and too expensive for this farm. Without a live mobile view, managers relied on manual walk-throughs and could discover a dangerous change late.

Time between manual checks→hours
02Field research

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.

    An early warning at 19 ppm, giving managers time to investigate before conditions become more severe. Each sensor keeps its alert setting locally so it can still sound an alarm without an internet connection.

  • 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.

Where the numbers at the top come from

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 the alert log can establish is that three critical conditions triggered warnings and were acted on before they became more severe.

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.

03Contract

What the shed reports, and what the schema promises.

Measured

House 3 — Node Fleet

mqtt://farm-os.local/house-3/#

LiveData is updating in real time
  • ammonia.ppm18.4ppmDegraded
  • temp.ambient24.1°CNominal
  • humidity.relative61%Nominal
  • node.07.battery11%Breach
  • node.11.uplink—Idle
14 nodes reporting · 22,000 birds · updated 4s ago

Specified

Reading contract

packages/farm-os-core/src/reading.ts

TypeScript
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.

04Hardware

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.

Sensor node · exploded view

Five layers, printed and populated in-house. Hover one to read why it is the way it is — scroll to seal the enclosure.

05Operate it

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.

Exhaust
4/4
t+00:00
Modelled, not measured
House 3
120 × 14 m · 22,000 birds
INLETExhaust 1 — running. Click to toggle.Exhaust 2 — running. Click to toggle.Exhaust 3 — running. Click to toggle.Exhaust 4 — running. Click to toggle.EXHAUSTN01A · bay 2 · 0.5 ppm — click to knock outN01B · bay 2 · 0.5 ppm — click to knock outN02A · bay 5 · 1.7 ppm — click to knock outN02B · bay 5 · 1.7 ppm — click to knock outN03A · bay 9 · 4.0 ppm — click to knock outN03B · bay 9 · 4.0 ppm — click to knock outN04A · bay 12 · 6.4 ppm — click to knock outN04B · bay 12 · 6.4 ppm — click to knock outN05A · bay 16 · 9.8 ppm — click to knock outN05B · bay 16 · 9.8 ppm — click to knock outN06A · bay 19 · 11.8 ppm — click to knock outN06B · bay 19 · 11.8 ppm — click to knock outN07A · bay 23 · 13.0 ppm — click to knock outN07B · bay 23 · 13.0 ppm — click to knock out
Hover a bay to compare · click a node or a fan to knock it out
NH₃
0 – 45+ ppm
19 · alert25 · damage
ReportingOver alertOver damageOffline
06:00live
House 3
14/14 nodes reporting
Ammonia · peakNominal
13.0ppm
bay 22 · 40ms end to end
House map
Ambient
28.5°
Fleet
14/14

Recreated in the app's sampled chrome

House is clear

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 can miss what the birds are experiencing. The early warning at 19 ppm gives a manager time to investigate before conditions become more severe — but an alert can only reflect the areas covered by working sensors.

06System

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.

0102030405
Select a stage to read the design note
07Interface

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.

Dashboard — Farm OS
DashboardSettings › AlertsSettings › DashboardReportsAnalyticsInventory
01 · Safe bandsDashboard

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.

08Reflection

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 system that can alert locally when the internet connection is unavailable. 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.

Next — Full-Stack & AI

The same farm also needed a better way to record each sale.

My parents received handwritten slips from poultry traders and later copied the numbers into a ledger. Poultry Ledger turns a photograph of each slip into an editable sales record.

Poultry Ledger