docs/architecture/*.html.
myclaw è un maggiordomo digitale per casa: un assistente AI che vive su un computer di famiglia, parla attraverso i canali che già usi (terminale, Telegram, in futuro WhatsApp o voce), esegue azioni reali (leggere file, lanciare comandi, consultare il web) ma chiede il permesso prima di fare qualcosa di serio.
L'analogia del maggiordomo è utile. Un buon maggiordomo:
/etc né ~/.ssh);
Tecnicamente è un processo Python ≥ 3.11 che gira a /opt/myclaw/,
composto da quattro strati (gateway, policy, sandbox, workspace/tool).
Ogni servizio AI (LLM, STT, TTS, embedding, speaker-ID) viene consumato
tramite un'interfaccia
astratta — myclaw è provider-agnostic per costruzione. Nel
caso specifico dell'ambiente dell'autore l'interfaccia è realizzata da
suprastructure, un package sibling preesistente; in un altro
ambiente potrebbe essere realizzata da qualunque adapter equivalente.
| Obiettivo | Cosa significa concretamente |
|---|---|
| Local-first | Gira sul PC di casa. Nessun dato obbligatoriamente in cloud. Il cloud è solo opzionale (es. LLM provider remoti, tunnel). |
| Sicuro di default | Bind su 127.0.0.1, autonomy Supervised, sandbox obbligatoria, path forbidden, approvazione per azioni rischiose. |
| Multi-canale | Stessa "mente", interfacce diverse: CLI, Telegram, poi Signal, voce, web dashboard. |
| Open-ended | Nuovi tool e canali senza riscrivere il core: basta conformarsi a un Protocol. |
| Senza lock-in | Il layer AI è dietro un'interfaccia astratta: cambiare Claude con Ollama = una riga di configurazione, senza toccare il codice. Nell'ambiente dell'autore il pattern è implementato da suprastructure. |
Entrambi sono progetti eccellenti e sono stati la fonte di ispirazione primaria. Entrambi però hanno tare che li rendono non-pronti per l'uso domestico qui sul mio PC:
| Progetto | Punti forti | Limiti per il mio caso |
|---|---|---|
| openclaw TypeScript, Node 24+ |
Gateway-first design, 20+ canali, sandbox pluggable (Docker/SSH/OpenShell), skills registry, routing multi-agente | Stack Node estraneo ai miei progetti, default più permissivi, sandbox orientate al cloud |
| zeroclaw Rust 2024 |
Footprint minimo, livelli di autonomia, sandbox a strati (Landlock+Bubblewrap), DM pairing, auth criptato, 129+ test di sicurezza | Rust reintroduce uno stack separato; riscrive da zero il layer LLM/STT/TTS che io ho già risolto con un'interfaccia astratta e una sua implementazione (nel mio caso suprastructure) |
La decisione: prendere i pattern migliori di entrambi (gateway-first di openclaw, autonomy+pairing+sandbox-a-strati di zeroclaw) e reimplementarli in Python, dove:
suprastructure) invece di riscriverla;myclaw è un cipolla: l'esterno parla con il mondo, l'interno esegue. Ogni strato fidandosi solo dello strato più interno, e concedendo meno privilegi man mano che si va verso il centro.
Un singolo processo FastAPI che espone HTTP/WebSocket/SSE su 127.0.0.1:42618.
Riceve messaggi dai canali, gestisce le sessioni, smista webhook, pianifica cron job.
È l'unico punto di contatto con il mondo. Non esegue mai direttamente comandi sensibili.
Il filtro di legalità. Dato un evento ("utente X chiede di fare Y"), risponde: permesso, negato o permesso solo dopo approvazione. Applica il livello di autonomia (vedi cap. 6), i rate-limit, i cost-cap (quanto spendere in LLM al giorno), le forbidden paths e lo stato del pairing (cap. 7).
Quando la policy dice "sì", l'azione non viene comunque eseguita a mano libera.
Per i tool che toccano filesystem o shell si entra in bubblewrap
(o systemd-run con hardening) con un profilo scelto dal livello di
autonomia. Niente subprocess.run diretto, mai. Docker è un'opzione
futura per il modo più strict.
Dentro la sandbox, il tool fa il suo lavoro: leggere un file dal workspace
(/opt/myclaw/workspace/), chiamare un LLM via registry.get(LLMProvider)
di suprastructure, scrivere una riga nell'audit log. Il workspace è la "casa"
dell'agente: ci vivono i suoi file markdown di personalità e memoria (cap. 8).
Seguiamo un esempio concreto. Sei in giardino, scrivi da Telegram: "dimmi cosa c'è nel log di stasera".
myclaw non parla mai direttamente con Claude, OpenAI, Ollama o qualunque
altro fornitore di modelli linguistici. Parla con un'interfaccia
astratta (tipicamente un typing.Protocol) che il
registro risolve a runtime in un'implementazione concreta. Lo stesso vale
per STT, TTS, embedding, speaker ID. È il pattern che rende myclaw
provider-agnostic: chi scrive myclaw non deve sapere quale modello
girerà davvero, e chi amministra l'ambiente può cambiarlo con una riga di
configurazione.
Nel diagramma che segue, myclaw è un consumer tra i possibili altri: un assistente domotico per voce e controllo casa, ulteriori bot specializzati su domini ristretti. Tutti condividono la stessa astrazione. Nessuno riscrive il layer AI: lo usa.
suprastructure) resta intercambiabile.Il vantaggio concreto: un nuovo modello (es. Claude 4.7 quando sarà disponibile) si configura una volta sola nell'implementazione dell'interfaccia e tutti i consumer lo ereditano simultaneamente — myclaw compreso. Nessun codice da rifare, nessun deploy da coordinare.
Concetto ripreso e adattato da zeroclaw. Ogni sessione gira a un livello di autonomia dichiarato. Il livello determina quanto myclaw può fare prima di dover chiedere conferma.
| Livello | Default per | Cosa può fare senza chiedere | Cosa richiede approvazione |
|---|---|---|---|
| ReadOnly | Primi collegamenti, ospiti | Leggere file nel workspace, chiamare LLM, fare web search | Ogni scrittura, ogni comando shell, ogni invio messaggio esterno |
| Supervised default |
Uso quotidiano | Quanto sopra + scrittura nel workspace, comandi della shell allowlist | Scrittura fuori dal workspace, comandi non-allowlist, cost > soglia, invio verso terzi |
| Full | Sessioni amministrative esplicite | Quasi tutto dentro il dominio di casa | Azioni toccando forbidden paths (/etc, ~/.ssh, ...): sempre negate, non approvabili |
Full non passa. Lista minima: /etc, /root,
~/.ssh, ~/.aws, ~/.config/claude,
/var/backups, cartelle di altri progetti in /opt/
diverse da myclaw.
Il livello può essere alzato temporaneamente con un comando esplicito
(myclaw session --level full --for 10m), loggato e a scadenza automatica.
Un canale come Telegram è inerentemente multi-utente: chiunque conosca l'handle del bot può scrivergli. Il pairing è il meccanismo che distingue un familiare da un estraneo.
La "personalità" di myclaw non è in un file Python. È nel
workspace/, in cinque file markdown che Roberto può editare quando
vuole senza restart. L'idea viene da openclaw/zeroclaw ed è azzeccata: la
configurazione comportamentale è testo leggibile, non una struttura dati
sepolta.
| File | Contenuto |
|---|---|
IDENTITY.md | Chi è l'agente: nome, tono, lingua preferita, stile di risposta. Es: "sei un maggiordomo formale ma asciutto, rispondi in italiano". |
USER.md | Chi è l'utente principale: Roberto, abitudini, fuso orario, preferenze, vincoli. |
MEMORY.md | Fatti long-term accumulati: "la password del router è in Bitwarden", "il cane si chiama X", "ogni domenica chiama la zia". |
AGENTS.md | Regole di orchestrazione: quando delegare a un sub-agente, come i canali mappano a livelli di autonomia. |
SOUL.md | Principi operativi di alto livello: "non mentire mai sulle azioni fatte", "se in dubbio, chiedi", "local-first". |
Questi file sono iniettati nel prompt di sistema a ogni chiamata LLM (con opportuno caching per non consumare token). Editarli è il modo primario di "riprogrammare" myclaw.
L'audit log vive in workspace/.audit/ come JSONL append-only: una riga
per ogni tool call, con timestamp, sender, azione, esito, costo stimato.
suprastructure). Se manca un servizio, lo si aggiunge là,
non qui.La roadmap è volutamente piccola. Passo uno alla volta, con il documento di microprogettazione che precede il codice.
| Fase | Obiettivo | Gate |
|---|---|---|
| 0 (ora) | Questo documento + survival kit | Roberto approva l'architettura d'insieme |
| 1 | Scheletro repo + gateway "hello world" + CLI channel + shell tool sandboxato | gateway.html, channel.html, tool.html, sandbox.html scritti e approvati |
| 2 | Policy engine + workspace markdown + audit log | policy.html, workspace.html, observability.html |
| 3 | Telegram channel + DM pairing | pairing.html + piano di contenimento danni |
| 4 | Memory persistente + provider failover via suprastructure | memory.html; suprastructure ≥ v0.4 se serve |
| 5+ | Canale voce (riusa STT/TTS di supra), tunnel opzionale, web dashboard minimale | valutato caso per caso |
v1. Modifiche
non-marginali incrementano il numero; il file precedente resta accessibile per
tracciare l'evoluzione del pensiero architetturale.
myclaw — Architettura: Introduzione v1.0 — 2026-04-21
Ispirato a openclaw e
zeroclaw, costruito sopra
suprastructure.