╔══════════════════════════════════════════════════════════════════╗
║ ║
║ ▓▓▓ H A R N E S S C O N S O L E ▓▓▓ v2 · HERMES EDITION ║
║ an agent with a body ║
║ ║
║ ▸ CAPTURE ▸ COMMAND ▸ GLANCE ▸ APPROVE ▸ TEACH ║
║ ║
╚══════════════════════════════════════════════════════════════════╝
A LAN-only desk appliance running one long-lived Hermes agent on a Raspberry Pi. Capture a thought on the Cardputer in under five seconds; the agent works with terminal/file/web tools on the Pi; outcomes are composed by the agent itself onto an always-on e-ink broadsheet. Dangerous operations block on a physical Approve press.
Full design: docs/spec.md · Hardware claim audit: docs/hardware-verification.md · Latest multi-agent review: docs/review-2026-07-03.md.
┌─ SET UP THE APPLIANCE ────────────────────────────────────────────┐
│ │
│ A guided, retro-terminal wizard walks the whole bring-up — │
│ parts → Pi → preflight → deploy → Cardputer → first light — │
│ and writes your .env and concierge.json as you go. │
│ │
│ ▸ No build: open setup/standalone.html in a browser │
│ ▸ As an app: cd setup && npm install && npm run dev │
│ │
└───────────────────────────────────────────────────────────────────┘
See setup/README.md for the wizard. It's the recommended path — the appliance now refuses to start without its two secrets, and the wizard mints them for you.
pyweb/
├─ docs/spec.md ................ consolidated specification (v2.0) — source of truth
├─ docker-compose.yml .......... Node A stack: hermes + console-connector
├─ hermes/Dockerfile ........... base image + the display plugin's native deps
├─ config/cli-config.yaml ...... Hermes config overlay (model, platform_toolsets, relay)
├─ plugins/display/ ............ in-process Hermes plugin owning the Inky (display_* toolset)
├─ connector/ .................. console platform connector — relay /relay WS + Cardputer HTTP
├─ skills/ ..................... authored skills: broadsheet-editor, concierge-routines
├─ firmware/cardputer/ ......... PlatformIO firmware for the Cardputer-Adv (Node B)
├─ seed_memory/ ................ first-run profile facts (seeded via conversation)
├─ scripts/backup.sh ........... nightly state backup — the hermes-data volume IS the assistant
└─ setup/ ...................... the Phosphor Console setup wizard (this README's quick-start)
NODE A ── Raspberry Pi 4/5 (8 GB recommended) · RPi OS Lite 64-bit Bookworm+
DISPLAY ─ Pimoroni Inky Impression 4" · 7-colour ACeP or 2025 Spectra 6 (agent-owned)
NODE B ── M5Stack Cardputer-Adv (ESP32-S3) · capture / command / monitor / approve
Host prep (Bookworm): enable SPI + I2C and add dtoverlay=spi0-0cs to
/boot/firmware/config.txt (the kernel's CS0 claim conflicts with the Inky
library — see docs/hardware-verification.md). Then, from the repo root:
cp .env.example .env # fill ANTHROPIC_API_KEY + mint the two secrets (or use setup/)
docker compose up -d --buildPorts.
:8787carries the gateway relay and stays on the internal container network; only:8788— the bearer-guarded Cardputer surface — is published to the LAN. The connector refuses to start unlessCONSOLE_BEARER_TOKENandRELAY_SHARED_SECRETare set (override withCONSOLE_DEV=1for a loopback-only dev run).
H0 base runtime → H1 display plugin → H2 connector + Cardputer → H3 approvals
→ H4 skills + memory → H5 cron routines → H6 hardening / burn-in
Gates for each phase are in docs/spec.md §8.
This repo previously held a 2020 Firebase Hosting placeholder ("pyweb"); it was scrapped in the v2 pivot. History is preserved in git.