FarmIQ platform.
A production-grade farm management platform for Philippine smallholder farmers — a React Native app and a .NET 9 API, architected and built solo, end to end.
01The problem
Smallholder dairy, swine and goat farmers in the Philippines mostly run on memory and paper — missed milking rounds, untracked feed costs, no sense of which animals are profitable. The users are often low on digital literacy and working offline in the field, so the app has to optimise for the fewest taps, no jargon, and working without a signal.
FarmIQ turns the messy daily reality of a small farm into clean, usable data — then adds a B2B marketplace and a farm-labour job board on top, bringing several sides of the rural economy into one app.
02One codebase, five products
The defining challenge: FarmIQ serves five distinct roles (Farmer, Supplier, Worker, Agency, Viewer) from a single codebase on both sides. The app is role-aware end to end — authentication resolves a role, then the router renders an entirely different app shell per role, each with its own navigation, screens and guards.
The backend mirrors this with JWT role claims, and on top of role gates every operation enforces ownershipat the request level — so a farmer can only ever touch their own farm's data. The protection is structural, not cosmetic.











03Architecture
The backend is Clean Architecture with strict, dependency-inverted layers — the domain at the centre knows nothing about the outside world, and every request flows through a MediatR pipeline applying logging, validation and audit capture uniformly before reaching its handler.
The reporting engine is open for extension, closed for modification: new dashboard cards are discovered through assembly scanning, so adding a metric means adding a class, not editing wiring. The mobile app is feature-sliced and role-aware, with type safety running from the wire inward — schemas validate both API payloads and forms, and the types are inferred from those same schemas.
Complexity, held quietly — so the field only ever feels the simplicity.
04Engineering problems I solved
- State machines without stored state— payment status, an animal's health, whether a cow was milked this round are computed from source data at read time, eliminating a whole class of state-drift bugs.
- Scheduling without a scheduler— a round-based milking checklist with one-tap reset and automatic daily rollover, instead of rigid fixed-time schedules farmers wouldn't follow.
- Bulk actions with partial success — mass milking/feeding across hundreds of animals commits the ones that succeed and returns a per-target result; one ineligible animal never aborts the batch.
- Complexity reduction as a feature — repeatedly refactored modules down when they grew too complex for the actual users, choosing adoption over feature count.
05What it demonstrates
Full-stack ownership, solo — from the PostgreSQL schema and the .NET API to the on-device React Native experience, by myself. Senior-level backend architecture (Clean Architecture, CQRS, pipeline cross-cutting concerns, a plugin reporting engine, a 149-test suite), and real product judgment where the hardest calls were about what not to build.