An open build, made with a kid

Two buttons.
No screen.

A small aluminium box for a child, and an iPhone app for the parent who lives somewhere else. Press Record, talk, press again, and the parent hears it. When an answer arrives, Play glows.

Drawn to scale from the box as built. Record is dim blue: ready. Play breathes green: a message is waiting.
01 · What it is

Presence, not a phone call.

A call needs both people free at once, and a child on a video call often just goes quiet. A box that holds a voice until someone is ready to hear it fits how a child stays close to someone who isn't there.

For the child: the lights are the whole display

In the order a child meets them · then two that say “not now”
ReadyRecord · steady dim blue
RecordingRecord · red · mic on
Got itRecord · one green pulse
Message waitsPlay · breathing green
PlayingPlay · steady green
Not readyRecord · slow blue blink
Travel lockPlay · white blink

For the parent: an iPhone app

  • One conversation, both directions, the whole archive. Each message you send shows when it reached the box and when it was played.
  • The box screen shows signal, last check-in, quiet hours and volume, and explains any fault in words. The child never has to.
  • A push when the child sends something, and when the box hasn't checked in for hours.
No red light, no micThe mic is powered from the pin that lights Record. That's wiring, not software.
Nothing is ever lostAudio is on disk while the child talks, and is only deleted after the server confirms a checked copy.
Private by designEnd-to-end encrypted. No transcription, no analytics.
Built for a school bagIts own LTE, so no Wi-Fi to set up. Short bumps are ignored; a travel lock stops the rest.
02 · From the bench

The real thing, so far.

Built at a kitchen table over a few evenings in autumn 2026. Tap a photo to enlarge it.

03 · Drawn to scale

Every hole, every wire.

Drawn from the build photos and hardware/cad/layout.json. The box is a 1590DD-size die-cast clone, 188 × 119 × 37.5 mm. Clones differ by a millimetre or two, so measure yours before drilling.

PLAY Ø16RECORD Ø16SPEAKER · 19 holesMIC Ø2188119≈36≈55≈43≈40FRONT FACE (the lid) · as built, ±3 mm from photos

Two 16 mm button holes (step drill to 15, file to 16), a 2 mm mic hole and a 19-hole grille over the speaker.

Pin map as a table
PinSignalGoes toWire
25 VAmp VINred
4 / 65 V / GNDPower in from the USB-C tail · HAT joined from belowred / black, 0.5 mm²
7GPIO 4Modem power key (HAT P4), from belowpin
8 / 10 / 14UARTDebug probe (bench only)probe cable
9GNDMic GND and L/Rblack
11GPIO 17Record red LED → mic VDD from its taborange
12GPIO 18 · BCLKAmp BCLK → mic SCKyellow
13 / 15GPIO 27 / 22Record green / bluegreen / blue
16 / 18 / 22GPIO 23 / 24 / 25Play red / green / blueorange / green / blue
20 / 30GNDPlay / Record: switch + C−black
29 / 31GPIO 5 / 6Record / Play switch (pull-up, pressed = low)white
35GPIO 19 · LRCLKAmp LRC → mic WSpurple
36GPIO 16Amp SD (the sound driver owns it)grey
38GPIO 20 · DINMic databrown
39GNDAmp GNDblack
40GPIO 21 · DOUTAmp DINgreen
04 · How it works

Box, server, phone.

Three pieces that follow one written contract, docs/PROTOCOL.md. Only the box and the phone hold the key.

The box Pi Zero 2 W · own LTE The server Supabase, Zurich · stores only ciphertext The parent's iPhone SwiftUI · key in the Keychain upload check-in push reply Sealed with AES-256-GCM on the box or the phone. The server can store and forward a message, but never play it.
Recording16 kHz audio goes to disk as the child talks. On stop: Opus at 16 kbps, encrypted, checked and saved. Only then the green pulse.
SendingResumable uploads in 32 KB pieces. Without a signal it waits, and the child never hears about a network.
ReceivingPlugged in, the box checks in every minute. Oldest message first, one per press of Play.
05 · Where it stands

Mostly working, not finished.

As of the last bench session, 2 October 2026. The details are in docs/BUILD-LOG.md.

SimulatorThe whole box service runs on a Mac, with virtual buttons and lights
ServerLive on Supabase; every protocol endpoint tested end to end
Power and Pi5 V on the header pins, no undervoltage; pulled plugs lose nothing
Buttons and lightsBoth switches and all six light channels checked
LTEA 3-minute note uploaded in 8.5 s on a CHF 6/month SIM
iPhone appConversation, recorder and Box screen
EnclosureLid drilled; buttons, grille and mic hole done
Tests70 automated tests on the box software
Speaker ampThe first one was damaged by a wiring slip; a new one is going in
MicrophoneWired, not yet tested
Push notificationsWaiting for an Apple push key
BatteryDesigned, deferred: the first box is mains only
WorksIn progressNot yet
06 · Parts

Off the shelf, in three rounds.

No 3D printing, no custom board. Buy one round, get it working, then buy the next. About CHF 395 for all three, tools included, from Swiss shops; any electronics shop has equivalents.

Round 1 · Bench

It talks on the table

  • Pi Zero 2 W kit
  • Two 16 mm RGB buttons
  • I2S mic, I2S amp, speaker
  • Debug probe, soldering iron
Round 2 · Link

It reaches the server alone

  • SIM7670G LTE HAT
  • SMA pigtail and antenna
  • Data SIM, ~CHF 6/month
Round 3 · Box

It survives a school bag

  • Die-cast aluminium box
  • Step drill and hand tools
  • USB-C panel socket
  • Endurance microSD, wire, foam
Later · Battery

About 2 days unplugged

  • UPS module, three 18650 cells
  • Designed, not built
Every part, with shop and price
QtyPartWhyShopCHF
Phase 1 · The bench
1Raspberry Pi Zero 2 W starter kitboard, 16 GB microSD, OTG cable, header to solderThe computerpi-shop.ch42.90
216 mm stainless button, RGB ring, 5 Vcommon cathode, resistors built in, fine at 3.3 VThe whole UIbastelgarage.ch39.80
1DFRobot I2S MEMS micMSM261S4030H0; alt: INMP441Microphonebastelgarage.ch8.90
1–2MAX98357A I2S amplifierget a spareDrives the speakergalaxus.ch9.95
1Seeed 5 W 4 Ω speaker, enclosedIts own back volumebastelgarage.ch7.90
1Raspberry Pi Debug ProbeSerial consolegalaxus.ch12.70
1USB soldering iron, solder, flux · 5 V 2.5 A supplyBenchany~12
Phase 2 · The link
1Waveshare SIM7670G LTE Cat-1 HATa USB network interface; antenna includedIts own internetbastelgarage.ch55.90
1SMA bulkhead → U.FL pigtailAntenna through metalreichelt.com7.32
1LTE antenna, SMAAluminium blocks radioreichelt.com~9
1Data SIMDigital Republic Flat 1: unlimited at 1 Mbit/sPlenty for voicedigitalrepublic.ch6/mo
Phase 3 · The box
11590DD-size die-cast aluminium enclosure188 × 119 × 37.5 mm; a clone, so measure itSurvives a school bagany~13
1Step drill 5–23 mm, 2 / 2.7 mm drills, centre punch, deburrer, fileEvery holehardware store~32
1Exsys EX-49222 USB-C panel socket, 30 cm tailPower inexsys.ch16.90
1Short micro-USB → USB-C leadPi to modemgalaxus.ch~12
1SanDisk High Endurance 32 GBThe card is the machinebrack.ch22.95
1Standoffs, VHB tape, EVA foam, tie mounts, silicone wire, heat-shrink, threadlocker, Kapton, feetA harness that lastshardware store~72
Optional · battery (designed, not built)
1Waveshare UPS Module 3S + 3× protected 18650 + 12.6 V charger + barrel jack~2 days unpluggedbastelgarage.ch~84
Phases 1–3, tools included~395

Also needed: a Mac with Xcode and a multimeter. Running costs: the SIM, a Supabase project (we run Pro, about USD 25/month) and an Apple Developer account (USD 99/year). Outside Switzerland, only the SIM changes: pick one on a network the SIM7670G supports.

07 · Build it

Step by step, with your kid.

Each stage ends with something that works. Tick steps as you go; the exact commands live in the repo files named in each stage.

0 of 0 steps donesaved in this browser
0

Try it with no hardware

An evening. Proves the idea and your setup.

⌄
1

The Pi on the bench

docs/DEV-PROCESS.md · box/setup/README.md

⌄
2

Buttons, mic and amp

Pin map below · hardware/schematics/WIRING.md

⌄
3

The box software

box/README.md · box/DESIGN.md · box/deploy.sh

⌄
4

Your own server

server/README.md · docs/SERVER-CONCEPT.md

⌄
5

LTE: its own internet

box/setup/README.md §6 · ADR 0026

⌄
6

The parent's iPhone app

ios/README.md · ios/DESIGN.md

⌄
7

Into the aluminium box

See the drawings · hardware/LAYOUT.md

⌄
8

Seal it for the field

Working unattended, for a month

⌄
08 · Lessons

What went wrong, so you can skip it.

Power

USB-C couplers work one way up

A socket-to-socket coupler passes only one CC wire, so the plug worked one way round. Use a socket with a cable tail.

Audio

A wire on GAIN killed an amp

Its ground landed on the neighbouring pin; afterwards it scratched even on silence. Check grounds before power.

Linux

overlayroot puts /data in RAM

The stock read-only overlay covers every mount. Without recurse=0, the “safe” partition lives in memory.

Modem

It isn't who it says it is

The SIM7670G shows up as Qualcomm 05c6:9330, and at DIALMODE=1 forwards nothing. Use 0.

Protocol

Re-flashing reused a number

A fresh card restarted message numbering and the upload stuck. The server now tells the box where to continue.

Boot

Hold the power key low

GPIO 4 floats high at boot, and a long press turns the modem off. gpio=4=op,dl holds it low.

09 · The source

All of it, open.

DadBox/
├── docs/          brief · architecture · protocol · build log
│   └── decisions/ why each choice was made
├── hardware/      parts · sourcing · layout
│   ├── schematics/ wiring
│   └── cad/       layout and 1:1 drill templates
├── box/           Python service and simulator
├── server/        Supabase: SQL and one Edge Function
├── ios/           SwiftUI app
├── tools/         fake box, token minting, serial
└── site/          this page

Read in this order

  1. docs/BRIEF.md — what and why
  2. docs/PROTOCOL.md — the contract
  3. hardware/schematics/WIRING.md
  4. box/setup/README.md — the Pi, exactly
  5. docs/BUILD-LOG.md — what actually happened
github.com/mararnx/DadBox

Built with Claude Code as a co-builder: it drives the box over SSH and asks a person only for what it can't do itself, like listening, looking at an LED or reading a meter.