01 / BUILD THE CONTROLLER

A place to
bring it together.

The Korvo holds the experiment’s world state and timing, and hosts the fleet controls, planner and learning lab. Its consolidated view helps you follow what the individual nodes express.

Build the controller ↓

Why the controller matters to the experiment ↗
This guide covers the ESP32-S31 Korvo implementation. The LilyGo handheld is a separate, optional management device.

01 / HARDWARE

Start with
the right host.

Use the ESP32-S31 Korvo board with its 800×480 display and touch interface. Prepare its microSD storage, a USB data connection for flashing and the board-specified power source.

The touchscreen host is distinct from the Waveshare ESP32-S3 fitted to each panel. Their firmware targets and SDK requirements are different.

CHECKConfirm the exact board revision and its power requirements before connecting it. The panel-wall calculator excludes the Korvo and its display; budget and power that host separately.

Controller hardware and setup ↗

02 / ENCLOSURE

Start from
the original case.

The small Korvo enclosure comes from Espressif’s open source ESP32-S31-Korvo-1 project. Its top shell, bottom shell, light guide and stand are available as STEP and STL files. The project owner has printed and used this case.

The viewer uses the original STEP geometry at its source scale. Parts are separated for inspection; it does not invent a verified assembly transform between independently exported files. The shell outline is 110.9 × 97.8 mm; the top part is 17.8 mm deep and the bottom part 6.9 mm deep. Those depths are individual part bounds, not an assembled thickness.

  1. Download the pinned original files and match the Korvo board revision to the upstream reference.
  2. Print the top and bottom shells and optional stand. Use the light-guide part if fitting the RGB indicator.
  3. Use the upstream reference image to identify the screen surround, board mounts and port openings. Check fit on the unpowered assembly, preserving microphone, USB and card access.
  4. Close the case without loading the glass or trapping the display cable. Check touch, buttons and connectors before commissioning.

A SEPARATE DESIGNThe larger 7-inch Flockinator terminal and sensor deck are different engineering studies. They are not the original Korvo case and should not be substituted for this host.

Original four-part enclosure files ↗ Model sources, transformations & limits ↗

03 / BUILD & FLASH

Its own firmware.
Its own toolchain.

Use the pinned ESP-IDF 6.1 and esp-dev-kits revisions in the controller README. Activate that ESP-IDF environment, set KORVO_SDK_PATH to the pinned board SDK and work from firmware/korvo-monitor.

idf.py --preview build
idf.py --preview -p YOUR_KORVO_PORT flash
idf.py --preview -p YOUR_KORVO_PORT monitor

Replace the port with the positively identified Korvo connection. On a network-mounted workspace, use the README’s local build-copy procedure.

CHECKKeep a recovery path for your device. The documented historical full-flash erase is not a general instruction to erase an existing controller.

Pinned SDK setup and build commands ↗

04 / PROVISION

Introduce
the flock.

Bring up the controller on your local network and open the address shown on its screen. The host serves fleet controls at /, the planner at /planner and the learning lab at /lab.

Provision the reference fleet roster through the MAC-verified USB tool. Each entry binds a panel to its own identity and management key. Pass credentials through the documented private input flow, never in command-line arguments or public files.

CHECKThe current provisioning and UI are built around sixteen nodes. Adapt and test those paths before using a different fleet size. Do not duplicate a node identity to fill a slot.

Network, operator PIN and roster provisioning ↗

05 / ACCEPTANCE

A screen you can
see and trust.

At the bench

Ticks are a reading aid, not stored acceptance records. Fresh telemetry alone does not establish that every peripheral works.

Controller acceptance criteria ↗Next: build one panel ↗