Skip to content

Repository files navigation

Amicus — the Order of the Amicus e-ink diploma

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.

the diploma

What you need

  • 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

Quick start (you got one already flashed)

  1. Power it on. The diploma shows with a blank name line. (After setup, your name is stored on the device and survives power cycles.)
  2. Download Amicus.zip, unzip it anywhere you won't delete it.
  3. Right-click Set up Amicus → Open. Wait ~30 seconds. It says Done.
  4. Quit Claude Desktop (Cmd-Q) and reopen it.
  5. 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.

Build your 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, print

Then run the Quick Start steps.

The screens

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.

Architecture

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).

Security

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.

License

Split-licensed because of one dependency:

  • amicus_fw/ (the firmware): GPL-3.0. The display driver Seeed_GxEPD2 is 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 by docker-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.

Credits

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."

About

A framed diploma that's also a Claude-powered eink display.

Resources

Stars

6 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages