441d859afe1d74d036c39367dce7d60491737441
Add scripts/paperclip-roundtrip.sh. It files one Paperclip issue and prints
the returned id and identifier. The key comes from the environment, then from
environment.d. The script never prints the key.
Fix the runbook: the create route is POST /api/companies/{companyId}/issues.
The old POST /api/issues route returns 404.
Record the first filed job: AUD-55 (d58891ce-9934-4710-9bba-d37974251ed9).
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Central AI Hub
One small service that every way in reaches every ability through. Built once, shared by the phone app, the house voice, chat, and the admin app.
Demonstrated Skills & Tech Stack
- Core Technologies: Go 1.25 service · HTTP JSON API · MQTT · LLM intent routing · OmniRoute gateway · Docker
- Key Tools: Jervis (voice) · Home Assistant · Paperclip · Artemis · internet use control · Apprise / NTFY · OmniRoute
- Engineering Capabilities: service design · intent routing · authorization and approval flows · event-driven integration · deterministic safety for high-consequence actions
Quick Start
# Phase 1 — prove the Paperclip round trip
# 1. Create an agent API key in Paperclip.
# 2. Export it for the test only.
export PAPERCLIP_API_KEY=<redacted>
# 3. File one job.
curl -s -X POST http://192.168.20.13:3100/api/issues \
-H "Authorization: Bearer $PAPERCLIP_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"round-trip test","description":"prove the return path"}'
Full steps: docs/outline/04-agent-runbook.md.
System Architecture
flowchart LR
subgraph IN["Ways in"]
PHONE["Phone app<br/>wake word + voice"]
ADMIN["Admin app<br/>restricted actions"]
ESP["ESP32 voice<br/>Hey Jervis"]
DSH["dsh chat"]
CONSOLE["Console portal"]
end
HUB{{"HUB<br/>hear - understand - check - route - answer"}}
subgraph OUT["Peers and services<br/>(the Hub is not a destination)"]
HA["Home Assistant"]
SPK["Speakers<br/>Jervis TTS"]
NET["Internet control<br/>parental limits"]
ART["Artemis<br/>phone screen"]
PC["Paperclip<br/>work bench"]
WEB["Web search"]
APP["Apprise / NTFY"]
end
PHONE --> HUB
ESP --> HUB
DSH --> HUB
CONSOLE --> HUB
ADMIN --> HUB
HUB --> HA
HUB --> SPK
HUB --> ART
HUB --> WEB
HUB --> APP
HUB -- "ask only (query)" --> NET
HUB -- "slow job (approved)" --> PC
ADMIN -- "control + tap to approve" --> NET
PC -. result .-> HUB
Interactive architecture map: maps.lab.audasmedia.com.au/central_ai_llm_master
Usage & Configuration
- Model calls go through OmniRoute at
http://192.168.20.13:20129/v1. - Secrets come from
~/.config/environment.d/10-secrets.conf. - Paperclip is at
http://192.168.20.13:3100. An API key is required. - Home Assistant is at
http://192.168.20.30:8123. - Jervis (voice) is at
http://192.168.20.13:8501. - Hub is at
http://192.168.20.13:8788(local Docker container).
The design brief is hub_brief.md. Project instructions are AGENTS.md.
The interface between the Hub and every data project is docs/ask-contract.md.
The frozen inbound API (ways in to the Hub) is docs/hub-api.md.
Every other project is a peer, not a sub-project. A high-consequence control
(for example, cutting the kids' internet) does not route through the Hub.
Description
Languages
Go
91.1%
Shell
8.5%
Dockerfile
0.4%