A framed diploma that's secretly a Claude terminal. Built as a thank-you gift for a team of lawyers; open-sourced so anyone can make one.
It hangs on your wall like the JD next to it. Hold the green button on top and it cycles through six screens: a desk calendar with a daily weird law, a 0.1-hour billable timer, legal headlines, a local bird rendered as an Audubon plate, and a real-vs-AI case caption game. It pairs to your Mac over Bluetooth and only fully wakes up when Claude Desktop is open.
- A Seeed reTerminal E1001 (~$74, 7.5" e-ink, ESP32-S3, BLE, battery, metal case)
- A Mac with Claude Desktop
- Optional: a 3D printer for the frame (
frame/diploma_frame.3mf, two-color, prints face-down on a Bambu X1C with no supports) and four 6×2mm magnets
- Power it on. The diploma shows with a blank name line. (After setup, your name is stored on the device and survives power cycles.)
- Download
Amicus.zip, unzip it anywhere you won't delete it. - Right-click
Set up Amicus→ Open. Wait ~30 seconds. It says Done. - Quit Claude Desktop (Cmd-Q) and reopen it.
- In any chat: "Set up my e-ink panel."
Claude knows your name, puts it on the diploma, reads your calendar (it'll walk you through connecting one if you haven't), pushes today to the panel, and offers to do it again every morning. Headlines, today's bird, and the Oyez game load on their own.
git clone https://github.com/markpikemarkpike/amicus
cd amicus
# Mac side: render the baked offline screens, then build the recipient zip
python3 -m venv .venv && .venv/bin/pip install mcp bleak feedparser Pillow
.venv/bin/python gen_screens_h.py
(cd dist && ./build_dist.sh)
# Firmware: compile in Docker (no local toolchain needed), then flash
./docker-build.sh amicus_fw
esptool --chip esp32s3 --port /dev/cu.usbserial-* --baud 460800 \
write-flash 0x0 build/amicus_fw.ino.merged.bin
# Frame: open frame/diploma_frame.3mf in Bambu Studio, assign colors, printThen run the Quick Start steps.
| What it shows | Where the data comes from | |
|---|---|---|
| Diploma | Your certificate. Takes over every May 12. | Baked + your name via eink_set_name |
| Today | Date, a real cited weird law, your full-day calendar | 365 laws on-device; agenda via Claude reading your calendar connector |
| The Billable | 0.1-hour stopwatch (six-minute increments) | On-device; optional Claude Code token feed |
| The Docket | Five legal-news headlines | Public RSS (SCOTUSblog, Federal Register, ABA Journal, US Courts, FTC, DOJ, and others), refreshed 4×/day |
| Bird Law | A bird seen near you, Audubon-style | iNaturalist API, IP-geolocated, CC0/CC-BY photos only |
| Oyez AI? | Real case caption or did AI make it up? One a day. | ~90 captions, half real (cited), half generated and search-checked |
Buttons (top edge): left and center do screen-specific things, hold the green button to go to the next screen. Every screen shows what its buttons do at the bottom.
Claude Desktop ──spawns──> amicus_mcp.py ──BLE──> reTerminal E1001
(your Mac) (this repo, MIT) (firmware, GPL-3.0)
The MCP server (amicus_mcp.py) is the only thing that talks Bluetooth. It
runs while Claude Desktop is open, holds one persistent BLE connection,
renders every screen as an 800×480 1-bit bitmap with Pillow
(amicus_render.py), and pushes them into one of seven PSRAM slots on the
device. The firmware blits whichever slot it has and falls back to a baked
offline bitmap when it doesn't. No JSON parsing on-device, no wifi, no
credentials, no API keys.
When Desktop closes, the MCP server stops, BLE drops, and the panel goes back to standalone mode (date + law from the onboard RTC, stopwatch, and the offline screens). The diploma is the one exception: the last pushed diploma bitmap is saved to the device's flash, so your name survives power cycles. The agenda is never persisted.
Firmware logs appear on the device's USB serial port at 115200 (the build
sets CDCOnBoot to Disabled so Serial uses the UART bridge, which is
the only port the E1001 exposes; build with docker-build.sh or match
that flag in the Arduino IDE, or you'll see no logs at all).
This is a desk toy, not a security boundary. The Bluetooth link is
unauthenticated; anyone in radio range could write a bitmap to it. Nothing
sensitive ever leaves the device. The MCP server stores no credentials,
calls no APIs, and only renders what Claude (running with your account's
connectors) hands it. Calendar event titles are third-party-authored
content; the eink_agenda tool description tells Claude to treat them as
data, not instructions.
Split-licensed because of one dependency:
amicus_fw/(the firmware): GPL-3.0. The display driverSeeed_GxEPD2is GPL-3.0 and the firmware statically links it, so the combined work is GPL-3.0. Source is here; you can reflash the device with modified firmware (GPL-3.0 §6 satisfied bydocker-build.sh+ the esptool command above).- Everything else: MIT. The Python, the build scripts, the frame model, the datasets.
See LICENSE, amicus_fw/LICENSE,
and NOTICE.
"Claude" is a trademark of Anthropic, PBC. This is a personal project, not an Anthropic product, and it is not affiliated with or endorsed by Anthropic. No trademark rights are granted.
Bird photos courtesy of iNaturalist contributors, shown with their license
and attribution. Headlines from the RSS feeds listed in amicus_mcp.py.
The 365 weird laws and the Oyez case captions were Claude-generated and
spot-checked against primary sources; corrections welcome.
Built with Claude Code. I mostly said "wider" and "no, the buttons are on top."
