Skip to content
Evode Manirahari

Selected workDrCrop

DrCrop

Turning drone flights into acres not sprayed.

Convert one drone flight into a decision a grower can act on, and then verify with a second flight whether the decision was right.

Stage
Deployed prototype
Role
Builder
Hackathon
Fourth place — GStack × GBrain, June 2026
Hardware
Survey drones designed and built with teammates
Status
Deployed prototype, synthetic data
Timeline
2026
Domain
Northern California vineyards
Surfaces
HTTP API · web demo console · file exports
Where it stands
Deployed prototype running on synthetic orthomosaics. The survey drones fly and capture imagery, but no vineyard flight has been processed and no grower has used it.

Vineyard treatment is commonly decided a block at a time, even though vine condition varies row to row. Drone imagery can show that variation and is cheap to collect; what does not exist is the layer that turns that imagery into a decision an applicator can follow and a grower can check afterwards.

DrCrop is that layer. One flight produces a map of where to spray, where to scout, and where to skip — with acreage attached — plus the export formats the people downstream actually use, and a verification pass that diffs a later flight against the first.

The survey platform

Three quadcopters on a workbench: a carbon-fibre FPV frame, a small ducted trainer, and a larger airframe carrying a fan-cooled NVIDIA Jetson Orin and a forward-facing camera.
The aircraft the pipeline is written for, designed and built from components with teammates: a carbon-fibre airframe carrying an NVIDIA Jetson Orin as its onboard computer and a forward-facing camera, alongside the smaller quads used to test the flight stack. These have flown and captured imagery — never over a vineyard. Every result below comes from synthetic orthomosaics.
  1. 01NVIDIA Jetson Orin

    The onboard computer, sized to run perception on the aircraft rather than stream every frame to the ground. The fan is not decorative — sustained inference is what heats it.

  2. 02Forward-facing camera

    The imaging payload. It is an RGB sensor, which is what the excess-green index in this pipeline expects; an NDVI-style crop-health index would need a near-infrared camera instead.

  3. 03Flight controller and power distribution

    Reads the gyro, accelerometer and barometer and runs the loops that keep the aircraft stable. The distribution board feeds the motors from the battery.

  4. 04Brushless motor and speed controller

    Four of them. The controller sets each motor's speed independently, and the difference between them is how the aircraft rolls, pitches and yaws.

  5. 05Propeller

    Two turn clockwise and two counter-clockwise, so their torques cancel and the airframe does not spin about its own axis in a hover.

  6. 06Carbon-fibre frame

    Stiff and light. Frame stiffness is a payload decision as much as a weight one: vibration reaching the camera and the flight controller is what makes survey imagery unusable.

  7. 07XT60 battery connector

    Where the lithium-polymer pack connects. No battery is attached in this photograph.

  8. 08Ducted trainer quad

    Small and shrouded enough to fly indoors, used to exercise the flight stack without putting the payload aircraft at risk.

  9. 09Second test airframe

    Bench aircraft for flight-controller and video-link work, wired up here for configuration rather than flight.

Six stages, one flight

  1. Stage 01

    Intake

    RGB orthomosaic, field boundary, row geometry

  2. Stage 02

    Vegetation index

    Excess green per pixel, thresholded to a mask

  3. Stage 03

    Row-aware mask

    Canopy strips separated from inter-row strips

  4. Stage 04

    Zoning

    Spray, scout, or skip per cell, with acreage

  5. Stage 05

    Export

    PDF for the grower, KML and GeoJSON for the field

  6. Stage 06

    Verify

    Diff two flights: acres spared, zones improved

Every stage is deterministic and independently testable. The model writes the briefing over a plan it did not choose.

Every stage is deterministic and independently testable. The model sits outside this path, writing the grower-facing briefing over a plan it did not choose.

The stage that makes it trustworthy

The vegetation index itself is straightforward — excess green, computed per pixel and thresholded into a green mask. Anyone can produce that. The problem is that in a vineyard, green is mostly vines, and vines are supposed to be there.

So the pipeline classifies row geometry first and separates under-vine canopy strips from inter-row strips, scoring weed pressure between the vines rather than under the canopy. Without that step a skip zone is just a place where the canopy happened to be dense, and no grower should act on it.

Management zones

Management zone mapA schematic vineyard block of twelve by seven cells. Most cells are skip zones. Two clusters are marked spray, each ringed by scout cells. Vine rows run vertically through the block.
  • Spray
  • Scout
  • Skip

Each cell buckets into spray, scout, or skip with acreage and estimated material saved. Schematic — the live pipeline renders these over the actual orthomosaic.

Exports, because the decision leaves the software

Three different people need the same answer in three different formats.

01

PDF

For the grower — the overlay map and a per-zone summary in one page they can read without an account.

02

KML

For the drone pilot and the applicator, so the zones open in the mapping tools they already fly with.

03

GeoJSON

For the licensed advisor's own systems, as a plain feature collection with no vendor lock.

Implementation notes

The raster and export work is written from scratch on Node's built-in compression: a pure-JavaScript PNG encoder for the orthomosaic and overlay, a hand-rolled PDF builder, and KML and GeoJSON writers. The drone module added zero npm dependencies.

That was a deliberate constraint rather than a stunt. Geospatial toolchains are heavy, platform-specific, and slow to install, and the whole pipeline needed to run on a small deployed instance and stay reproducible. The stages are separated so each one — index, mask, zoning, overlay, encoder, exporters, verification diff — is independently testable, and eight test suites cover them along with the risk engine and adapters.

Closing the loop

The verification endpoint takes two flight identifiers and diffs them, reporting the acreage the prescription would have left untreated and the zones that improved. This is the part that separates a decision-support product from a map: a map tells you what the field looked like, and a diff tells you whether the recommendation was any good.

The briefing layer sits on top, writing a plain-language explanation grounded in the deterministic plan and linked history — with a local fallback when no model key is present, so the pipeline never depends on an external service to produce its output.

Evode’s contribution

What I built

Solo build, apart from the drone hardware. Concretely:

  • 01

    Co-designed and built the survey quadcopters from components with teammates — airframe, motors and speed controllers, power distribution, flight-controller stack, and the companion computer and camera that carry the imaging payload.

  • 02

    Built the six-stage pipeline: orthomosaic intake, excess-green vegetation index, row-aware masking, management zoning with acreage and cost estimates, export, and before/after verification.

  • 03

    Implemented the row-aware mask that separates canopy strips from inter-row strips — the step that makes a skip recommendation defensible.

  • 04

    Wrote a pure-JavaScript PNG encoder, a PDF builder, and KML and GeoJSON writers on Node's zlib, keeping the module dependency-free.

  • 05

    Built the synthetic orthomosaic generator with a ground-truth grid so the pipeline could be validated end to end before any real flight existed.

  • 06

    Implemented the verification diff that compares two flights and reports acres spared and zones improved.

  • 07

    Built the HTTP API, the demo console, the grower-facing site, and a validated lead-capture endpoint with redacted logging and fire-and-forget notification that cannot fail the request.

Honest limits

What remains unproven

  • No vineyard flight has been processed. The drones fly and capture imagery, but never over a vineyard. Every result here comes from a deterministic synthetic vineyard orthomosaic with a known ground-truth grid, which validates pipeline shape and nothing about real-world accuracy.
  • No grower has used it and no acreage has been sprayed or skipped on its recommendation. The savings figures the zoning stage produces are arithmetic on synthetic inputs.
  • Operating this for real requires things software cannot supply: a licensed advisor signing every prescription, drone certification, and insurance. Those are prerequisites, not details.

Lessons

What I took from it

Build the synthetic case first

A deterministic synthetic orthomosaic with a known answer meant the pipeline could be validated, tested, and demonstrated without waiting on weather, hardware, or a grower's permission.

Domain structure beats model capacity

The accuracy that matters here came from encoding row geometry, not from a bigger model. Knowing that vines are supposed to be green is the entire insight.

Ship the format people already use

A prescription nobody can open is not a prescription. The export writers were as important as the analysis.

Reference

Stack

  • Node.js
  • JavaScript
  • Raster processing
  • GeoJSON
  • KML
  • PDF generation
  • Claude
  • Fly.io

Responsibilities

  • Survey drone build with teammates — airframe, power, flight-controller stack, imaging payload
  • Orthomosaic intake and vegetation index computation
  • Row-aware masking that separates canopy from inter-row
  • Management zoning with acreage and cost estimates
  • PDF, KML, and GeoJSON export writers
  • Before/after verification diffing
  • Grower-facing site and lead capture endpoint