Goldfish: a recorder where every voice owns its words
Goldfish is a recorder for conversations with several people in them. Each person in earshot sets how much of their own words gets kept, and the record forgets on a schedule. It answers with light, never sound, and it has no radio.
It began as a speculative product in the NPC Memo, from one sentence: "All of us should have agency over the resolution at which our words are remembered." The rules are an open draft standard, the Resolution Protocol, and Goldfish is one profile of it. The workbench has the whole kit on one page: the spec, the 3D model, the meeting simulation, print files, parts with buy links, and the checks.
Status, mid-October 2026. A works-like and looks-like prototype, designed but not yet built. It uses breakout boards and through-hole parts, with no custom PCB and no surface-mount soldering. Every number below is from the models until bring-up measures it.
Specs
- Enclosure: a lofted pebble, 182 × 85 × 37 mm and about 266 g, in printed PETG shells with a TPU light band and foot. The chassis and lid separate at one latched 12-way connector.
- Compute: Radxa ZERO 3E (RK3566, 4 GB). It has no Wi-Fi or Bluetooth, and its Ethernet jack is removed.
- Audio: two SPH0645 I²S MEMS microphones behind a hardware slide switch.
- Interface: a ring of 50 addressable LEDs round the seam, one eye LED that doubles as a button, and an ERM vibration motor.
- Security and time: an ATECC608 secure element for forward-secure key chains, and a PCF8523 RTC with its own coin cell.
- Hand-off: an ST25DV64KC passive NFC tag. A phone tapped on the tail gets the meeting note as a link.
-
Power:
- a 4000 mAh LiPo with an NTC and a 3 A polyfuse;
- a bq24074 power-path charger;
- a 5 V boost and an ideal diode;
- USB-C input.
Simulated runtime is 2.7–4.8 h per charge, about 3 h for a busy meeting, and it runs indefinitely on a USB-C charger.
-
Thermal: passive. The SoC sinks into a 14 × 14 mm heatsink, then thermal pads, then an aluminium spreader on the roof. On a charger the firmware caps the board at about 2.4 W.
- BOM: about $245 in parts.
The stack
- MCAD: parametric parts in build123d (Python on the OpenCascade B-rep kernel). Board geometry comes from the vendors' STEP files where they exist, and from a sibling board's file where they don't. Exports are STEP, bed-oriented STL for printing, and glTF for the viewer.
-
Mechanical design checks:
- 123 keep-out volumes with no collisions;
- every printed part a watertight body;
- wall thickness sampled at 15,000 points (minimum 2.01 mm against a 1.6 mm floor);
- 45 geometric checks on openings, the light path, sealing of the mic ports, and drop.
-
Design for assembly: a 19-check buildability pass that walks the build the way a builder would. It counts fasteners, checks driver access to every screw, nut slots, cable lengths, shells closing straight and parts fitting the print bed.
- Electrical: pad-level wiring with wire gauges and a pin map, plus 66 routed wires in the model. A time-stepped simulation covers the battery (open-circuit-voltage curve and internal resistance), the power tree, the rails, logic levels, I²C and the drivers.
- Firmware: Python on Radxa's Debian. There are 258 unit and scenario tests. Protocol conformance vectors pass in both Python and JavaScript, and a differential fuzz runs 400 random sessions through both. The meeting from the site is replayed through the real daemon on a simulated board, and the checks decode its outputs: the SPI bytes to the ring, the motor pin, the tag's memory.
- Parity: the light-ring frames match between the firmware and the site, and the LED count matches between the firmware, the site and the CAD.
What worked
- Checks as a regression suite. Nothing counted as done until a check passed on every build. Fluent isn't the same as buildable: a model will produce a design that looks and reads right and fails at the soldering iron.
- Questions phrased as checks. "Do the switch wires fit alongside the cell?" They didn't: the switch pins hit the shell wall. The check for that one also turned up several other faults.
- Raising model fidelity in steps. The model went from boxes, to vendor board files, to individual pads, and each step found real faults: missing ground returns, two wires sharing one through-hole, a board strap pressing on solder joints.
- Decision records. Each change is an ADR that quotes the request behind it, so every part change can be traced.
- Trade-offs stay with a person. The model lays out the options and their costs, such as growing the case or changing the switch, or buying the pricier connector or splicing the wires. Taste, budget and risk stay my calls.
What broke
- Positions computed from memory. A header position worked out by formula was 0.9 mm off. Positions now come from the makers' files, datasheets get opened and checked, and anything unverified is marked as an estimate.
- The envelope kept moving. The case grew from 14 to 18 cm round a 4000 mAh cell, then a few millimetres wider so the switches' solder joints would clear.
- The lid connector. Splitting the shells at one latched plug made it the most expensive part. It costs about €92 for the pair, ex VAT, with a 15-week standard lead time.
- Stale outputs. A generated file built from old inputs shows up only as wrong numbers downstream. A check now confirms every generated CAD file was rebuilt after its inputs last changed.
Unknowns
- Model vs measurement. Real current draw, standby drain with the power switch off (its off-state current isn't published), and shell and cell temperatures over a four-hour plugged-in recording.
- Compute budget. Speech recognition and summariser speed on the RK3566 are unmeasured.
- Firmware still to write. The audio pipeline, the light ring's SPI encoder, the eye-button GPIO handler, and the bring-up script.
- Requirement gap. A 72-hour conference on the battery alone needs a v02 architecture.
- Supply. The Radxa ZERO 3E is out of stock, and the NFC tag board has no EU stock.
What's next
Order parts and print test coupons, then the first build and bring-up. That means checking the joints on trimmed switch pins, the pad details known only from photos, and whether it survives a shake. Then replace the estimates with measurements.