diff --git a/.agent/skills/postgres-memory/references/security.md b/.agent/skills/postgres-memory/references/security.md
index 55452ee..75a00eb 100644
--- a/.agent/skills/postgres-memory/references/security.md
+++ b/.agent/skills/postgres-memory/references/security.md
@@ -7,7 +7,7 @@ After a fresh `initdb`, PostgreSQL ships with:
- One superuser: `postgres` (no password)
- Auth method: `trust` for localhost only
- `listen_addresses = 'localhost'` — only accepts connections from inside the jail
-- No remote access — other jails (cms, controlplane) cannot connect
+- No remote access — the host orchestrator and cms jail cannot connect
This is fine for initial setup but must be hardened before any remote jail connects.
@@ -22,18 +22,29 @@ Set a password anyway as defense in depth:
```sh
. /home/clawdie/clawdie-ai/.env
-sudo jexec db su - postgres -c "psql -c \"ALTER USER postgres WITH PASSWORD '$POSTGRES_ADMIN_PASSWORD';\""
+sudo jexec ${AGENT_NAME}-db su - postgres -c "psql -c \"ALTER USER postgres WITH PASSWORD '$POSTGRES_ADMIN_PASSWORD';\""
```
-### Role: clawdie_brain (Clawdie memory)
+### Role: `SKILLS_DB_USER` (Agent System Skills)
-For the Clawdie agent memory database:
+For the skills database:
```sh
. /home/clawdie/clawdie-ai/.env
-sudo jexec db su - postgres -c "createuser clawdie_brain"
-sudo jexec db su - postgres -c "psql -c \"ALTER USER clawdie_brain WITH PASSWORD '$CLAWDIE_DB_PASSWORD';\""
-sudo jexec db su - postgres -c "createdb -O clawdie_brain ai_brain"
+sudo jexec ${AGENT_NAME}-db su - postgres -c "createuser ${SKILLS_DB_USER}"
+sudo jexec ${AGENT_NAME}-db su - postgres -c "psql -c \"ALTER USER ${SKILLS_DB_USER} WITH PASSWORD '$SKILLS_DB_PASSWORD';\""
+sudo jexec ${AGENT_NAME}-db su - postgres -c "createdb -O ${SKILLS_DB_USER} ${SKILLS_DB_NAME}"
+```
+
+### Role: `MEMORY_DB_USER` (User-Agent Memory)
+
+For the user/agent memory database:
+
+```sh
+. /home/clawdie/clawdie-ai/.env
+sudo jexec ${AGENT_NAME}-db su - postgres -c "createuser ${MEMORY_DB_USER}"
+sudo jexec ${AGENT_NAME}-db su - postgres -c "psql -c \"ALTER USER ${MEMORY_DB_USER} WITH PASSWORD '$MEMORY_DB_PASSWORD';\""
+sudo jexec ${AGENT_NAME}-db su - postgres -c "createdb -O ${MEMORY_DB_USER} ${MEMORY_DB_NAME}"
```
### Role: strapi_cms (CMS)
@@ -62,7 +73,7 @@ host all all ::1/128 trust
### Target
Keep localhost trust for admin. Add password-authenticated remote access
-for specific jails only:
+for the host on `warden0` and for the future cms jail only:
```
# local admin — trust (postgres superuser only uses this)
@@ -70,11 +81,12 @@ local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
-# controlplane jail — Clawdie memory
-host ai_brain clawdie_brain 10.0.0.100/32 scram-sha-256
+# host-side orchestrator on warden0 gateway
+host ${SKILLS_DB_NAME} ${SKILLS_DB_USER} 10.0.0.1/32 scram-sha-256
+host ${MEMORY_DB_NAME} ${MEMORY_DB_USER} 10.0.0.1/32 scram-sha-256
# cms jail — Strapi CMS
-host strapi_cms strapi_cms 10.0.0.3/32 scram-sha-256
+host strapi_cms strapi_cms 10.0.0.5/32 scram-sha-256
# deny everything else from the subnet
host all all 10.0.0.0/24 reject
@@ -88,7 +100,7 @@ no other jail on the subnet can connect.
```sh
# edit pg_hba.conf inside db jail (use the commands above)
# then reload — no restart needed
-sudo jexec db service postgresql reload
+sudo jexec ${AGENT_NAME}-db service postgresql reload
```
## Listen addresses (postgresql.conf)
@@ -104,7 +116,7 @@ Change from:
To:
```
-listen_addresses = 'localhost, 10.0.0.2'
+listen_addresses = 'localhost, 10.0.0.3'
```
This makes PostgreSQL listen on both localhost (for admin) and the VNET
@@ -113,7 +125,7 @@ interface (for remote jails). Do NOT use `'*'` — only bind to known IPs.
Reload after changing:
```sh
-sudo jexec db service postgresql reload
+sudo jexec ${AGENT_NAME}-db service postgresql reload
```
## Verification
@@ -121,21 +133,21 @@ sudo jexec db service postgresql reload
### From inside db jail (should work — trust)
```sh
-sudo jexec db su - postgres -c "psql -c 'SELECT 1;'"
+sudo jexec ${AGENT_NAME}-db su - postgres -c "psql -c 'SELECT 1;'"
```
-### From controlplane jail (should work — password)
+### From host (should work — password)
```sh
-sudo jexec controlplane psql -h 10.0.0.2 -U clawdie_brain -d ai_brain -c "SELECT 1;"
+psql "$MEMORY_DB_URL" -c "SELECT 1;"
```
-Will prompt for password. Use the `clawdie_brain` password.
+Will use the password embedded in `MEMORY_DB_URL`.
### From cms jail (should work — password)
```sh
-sudo jexec cms psql -h 10.0.0.2 -U strapi_cms -d strapi_cms -c "SELECT 1;"
+sudo jexec ${AGENT_NAME}-cms psql -h 10.0.0.3 -U strapi_cms -d strapi_cms -c "SELECT 1;"
```
Will prompt for password. Use the `strapi_cms` password.
@@ -143,7 +155,7 @@ Will prompt for password. Use the `strapi_cms` password.
### From a random jail or host (should be rejected)
```sh
-psql -h 10.0.0.2 -U postgres -d postgres -c "SELECT 1;"
+psql -h 10.0.0.3 -U postgres -d postgres -c "SELECT 1;"
```
Should fail with: `FATAL: pg_hba.conf rejects connection`
@@ -154,17 +166,24 @@ All database passwords live in `/home/clawdie/clawdie-ai/.env`:
```
POSTGRES_ADMIN_PASSWORD= This wizard locks in the operator account, SSH bootstrap, deployment profile, local code hosting, service jails, and provider settings before writing .env. Architecture choices stay early so jail roles and reserved IPs remain stable. Choose the operator account that will exist inside controlplane for SSH access, repo checkout, screenshots, and operator tooling. Username:clawdie Default is clawdie. Replace it if you want to use your own operator account name. Host → controlplane SSH is bootstrapped separately from the later controlplane → host automation key. Choose the operator account used for host-side setup, repo checkout, screenshots, and service administration. Username:clawdie Default is clawdie. Replace it if you want to use your own operator account name. Host-side setup can reuse an existing public key or generate a dedicated one for operator access and later service automation. This step only appears when External only is selected for code hosting. Remote URL:https://codeberg.org/Clawdie/Clawdie-AI.git Use this when bootstrap should come from Codeberg, a LAN mirror, or another self-hosted remote. Lower IP numbers are reserved for more foundational services. Lower IP numbers are reserved for more foundational services. Set the assistant name, choose the provider, and add the matching API key before Telegram and protected-path credentials. Finish the operator-facing services: Review the final configuration, write .env, then hand over to the setup steps that create jails, install packages, and configure services.
- Three database passwords generated with Python
+ Historical screenshot from the earlier prototype. Current
+
- PostgreSQL roles created inside the
+ Historical screenshot from the earlier prototype. Current
+
- The Attach with Use Set up vhosts for your domain. Let's Encrypt certificates auto-renew via The current setup flow expects the dedicated Gateway missing: Jails created without default gateway. Fix with PostgreSQL SYSVIPC: Database jail needs Sharp/image errors: Astro builds fail on FreeBSD due to native deps. Install Wrong setup syntax: Use Worker jail missing: The default Gateway missing: If networking is incomplete inside the worker jail, verify the Astro image pipeline: For the first FreeBSD deployment, avoid pf blocking: Ensure jail subnet ( Passwords lost: All secrets live in Jail not starting: Check Jail not starting: Check that Built-in local knowledge first, dynamic user memory later Agent System Skills first, User-Agent Memory kept separate
- Clawdie is moving toward a split-brain memory model. The goal is to make
- first install useful before any production LLM provider is configured, while
- keeping user memory flexible and separate.
+ Clawdie uses a split-brain runtime model so first install is useful
+ before any production provider is configured, while user memory stays
+ flexible and separate from built-in operating knowledge.
- Brain A is the built-in local knowledge that ships with Clawdie:
- install guides, operator docs, and product skills. It is prepared before
- user install and imported into the
- Brain B is the dynamic side: user preferences, operator notes, and future
- agent-specific memories such as
- Most AI products ask for provider keys too early. Clawdie is moving
- in the opposite direction: import built-in local knowledge first, then
- add live provider configuration when the operator is ready.
+ Most AI products ask for provider keys too early. Clawdie goes in
+ the opposite direction: import built-in operating knowledge first,
+ then add live provider configuration when the operator is ready.
- The bootstrap step that imports Brain A lives in
+ The bootstrap step that imports Agent System Skills lives in
- Clawdie is built on NanoClaw
- — the open source personal AI assistant framework by
- Peter Steinberger,
- adapted for FreeBSD. The upstream toggle lets you see what new commits are
- available in the NanoClaw project and decide what to apply to your installation.
+ NanoClaw
+ is an upstream project by Gavriel in the broader OpenClaw line inspired by
+ Peter Steinberger's
+ OpenClaw.
+ Clawdie is the FreeBSD-first fork in that lineage. The upstream toggle lets
+ you see what new commits are available in NanoClaw and decide what to
+ apply to your installation.
+ OpenClaw set the broader direction. NanoClaw carried that line into a
+ lean upstream personal assistant. Clawdie takes the same line into
+ FreeBSD and the wider OSA
+ stack.
+
Recommended when the operator differs from the installer user.
Only .pub files are listed. Private keys are never copied.
Fallback when autodetect finds nothing useful.
Controlplane + database only.
Controlplane + database + local git + CMS.
Standard + full GUI desktop.
Recommended when the operator differs from the installer user.
Only .pub files are listed. Private keys are never copied.
Fallback when autodetect finds nothing useful.
Worker + database only.
Worker + database + local git + CMS.
Standard + full GUI desktop.
Bootstrap and clone from a remote Git URL.
Bare repositories in a dedicated git jail.
Plain local git plus a lightweight web UI.
Astro + Strapi in the dedicated cms jail.
Optional local inference and embeddings in a separate jail.
Only available for the Full profile.
Operator runtime and glasspane.
PostgreSQL + pgvector.
Local repositories.
Astro + Strapi.
Optional local inference.
Reserved browser automation / GUI desktop.
Compatibility slot only, no active jail role.
PostgreSQL + pgvector.
Local repositories.
Astro + Strapi.
Optional local inference.
Reserved browser automation / GUI desktop.
Default name is Clawdie.
z.ai, OpenRouter, OpenAI, Anthropic, or Claude subscription.
Stored in .env, never in source code.
Bot token from @BotFather goes into .env.
Generate or set the password for /screenshots/ and similar endpoints.
Operator user, SSH bootstrap, profile, code hosting, service toggles, network, and provider.
Environment, network, jail, mounts, register, service, verify.
Step 1 — Credential Generation
- secrets,
- appended to .env. Passwords are visible once in the screenshot,
- then read from environment variables in all subsequent steps.
- Step 1 — Credential Generation
+ main generates or preserves the split-brain database
+ secrets in .env and rewrites the derived
+ SKILLS_DB_URL and MEMORY_DB_URL values
+ from the chosen AGENT_NAME, subnet, and passwords.
+
Step 2 — Database Setup
- db jail via jexec:
- postgres admin, clawdie_app, and strapi_user.
- Passwords sourced from .env — no hardcoding.
- Verified with \du and \l showing 3 roles and 2 databases.
- Step 2 — Database Setup
+ main provisions a dedicated split-brain
+ {agent}-db jail, creates separate skills and memory
+ roles/databases, sets passwords from .env, binds
+ PostgreSQL to the jail IP, and verifies host-side connectivity to
+ both required databases before the step succeeds.
+
@@ -526,25 +522,27 @@ npm run wizard
Each can be invoked independently:
-
+# Full sequence after wizard
-npm run setup --step environment # Detect platform, check prereqs
-npm run setup --step network # Write IP configuration to .env
-npm run setup --step jail # Create Bastille jails on ZFS
-npm run setup --step groups # Sync Telegram groups to DB
-npm run setup --step register # Register agent-controlled channels
-npm run setup --step mounts # Configure nullfs mounts for jail
-npm run setup --step telegram-auth # Authenticate with Telegram bot
-npm run setup --step service # Create rc.d service file
-npm run setup --step verify # Final health check# Full sequence after wizard
+npm run setup -- --step environment # Detect platform and prerequisites
+npm run setup -- --step pi-config # Validate pi/provider configuration
+npm run setup -- --step jails --create # Provision the default worker jail
+npm run setup -- --step db # Provision the mandatory DB jail and databases
+npm run setup -- --step git # Provision the default local git jail and bare repository mirror
+npm run setup -- --step cms # Provision the cms jail, nginx, Astro, and internal Strapi seed baseline
+npm run setup -- --step hosts # Write the managed home.arpa hosts block for host and jails
+npm run setup -- --step mounts # Validate and configure allowed mounts
+npm run setup -- --step telegram-auth # Verify Telegram bot token
+npm run setup -- --step service # Create rc.d service file
+npm run setup -- --step verify # Final health checkjail step runs Bastille with thin jails (-T)
- and ZFS backing (-B). Jails are created at
- /usr/local/bastille/jails/controlplane/, each with a static IP
- on the warden0 bridge, a hostname like
- controlplane.agent.local, and FreeBSD 15.0-RELEASE as the base.
+ The current jails step provisions the default
+ {AGENT_NAME}-worker profile from src/jail-config.ts.
+ The bridge name is warden0; jail naming and hostnames derive
+ directly from AGENT_NAME and the internal home.arpa
+ zone.
Verify Jails
- bastille list should show controlplane and db running. Jails live at /usr/local/bastille/jails/. Access with bastille console controlplane.bastille list should show your derived worker jail, typically {agent}-worker. Jails live at /usr/local/bastille/jails/. Access with bastille console <agent>-worker.Glasspane Console
- tmux attach -t clawdie to see the 3-pane console: gateway, shell, and btop.npm run doctor after service start to check the host, pipeline, most recent jail run timestamps, and split-brain DB/artifact readiness.Configure nginx
- acme.sh.Verify PostgreSQL
+ {agent}-db jail. Confirm that SKILLS_DB_URL and MEMORY_DB_URL point at your configured database IP before you start the service for real use.bastille cmd controlplane route add default 10.0.0.1allow.sysvipc=1 in /usr/local/bastille/jails/db/jail.conf. Restart jail after change.vips inside CMS jail: bastille pkg cms install graphics/vipsnpm run setup -- --step ..., not npm run setup --step ....jails step is a status check. Add --create when you actually want Bastille to provision {agent}-worker.warden0 bridge and rerun npm run setup -- --step jails --create.sharp entirely. Keep images in public/ and use the minimal Astro template. Only if you later adopt the heavier Starlight/prototype path should you consider adding graphics/vips to the cms jail.10.0.0.0/24) is in nat rules. Check with pfctl -s nat..env (gitignored). If lost, regenerate with python3 -c "import secrets; print(secrets.token_urlsafe(32))" and update PostgreSQL roles./usr/local/bastille/jails/controlplane/ exists. If not, re-run npm run setup --step jail./usr/local/bastille/jails/<agent>-worker/ exists. If not, re-run npm run setup -- --step jails --create.Split Brain
- Brain A
+ Agent System Skills
db jail during bootstrap.
+ Agent System Skills are the built-in local knowledge that ships with
+ Clawdie: install guides, operator docs, product skills, and curated
+ support content. They are prepared before user install and imported
+ into the db jail during bootstrap.
Brain B
+ User-Agent Memory
mevy or bob.
+ User-Agent Memory is the dynamic side: user preferences, operator
+ notes, and future agent-specific memories such as
+ mevy or bob.
Why it matters
bootstrap system
- -> import Brain A into db jail
+ -> import Agent System Skills into db jail
-> local built-in knowledge is ready
-> add production LLM keys latersetup/skills-memory.ts.
- Built on NanoClaw — the open source personal AI assistant - framework originally conceived by - Peter Steinberger - — adapted for FreeBSD with native jail isolation, ZFS snapshots, - and a pi-driven setup flow. We follow NanoClaw upstream closely - and contribute FreeBSD-specific work back. + Built on giants' shoulders: Peter Steinberger's + OpenClaw set the broader direction, NanoClaw + by Gavriel carried that line into a lean personal-assistant upstream, + and Clawdie takes it onto FreeBSD with native jail isolation, ZFS + snapshots, and a pi-driven setup flow. The same stack ties into the + wider OSA + mission.
The FreeBSD deployment path is actively being built and proven in diff --git a/html/clawdie/license.html b/html/clawdie/license.html index b308bc2..05341f4 100644 --- a/html/clawdie/license.html +++ b/html/clawdie/license.html @@ -47,12 +47,14 @@
- Our upstream, + Our MIT-licensed upstream base comes from NanoClaw - by Peter Steinberger, - is MIT licensed. BSD-3-Clause is fully compatible with MIT — you can use - MIT code in a BSD-3 project without restriction. - We chose BSD-3 because it adds one thing MIT does not: + by Gavriel. NanoClaw itself sits in the broader + OpenClaw + line inspired by Peter Steinberger. + BSD-3-Clause is fully compatible with MIT — you can use MIT code in a + BSD-3 project without restriction. We chose BSD-3 because it adds one thing + MIT does not:
BSD 3-Clause License
Copyright (c) 2026, Sam (Samo Blatnik) and Clawdie contributors
-Built on NanoClaw — Copyright (c) 2024 Peter Steinberger (MIT License)
+Built on NanoClaw — Copyright (c) 2024 Gavriel (MIT License)
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/html/docs-clawdie-si/DEPLOY.md b/html/docs-clawdie-si/DEPLOY.md
index 944c9f9..a16fa33 100644
--- a/html/docs-clawdie-si/DEPLOY.md
+++ b/html/docs-clawdie-si/DEPLOY.md
@@ -1,7 +1,7 @@
# docs.clawdie.si Deployment
-**Status:** FreeBSD-first site assets ready
-**Date:** 13.mar.2026
+**Status:** Transitional static bridge deploy
+**Date:** 14.mar.2026
## Purpose
@@ -11,8 +11,8 @@ The site explains:
- Clawdie on FreeBSD
- the split-brain model
-- Brain A built-in local knowledge
-- Brain B user and future-agent memory
+- Agent System Skills built-in local knowledge
+- User/Agent Memory for user and future-agent memory
- the relationship to NanoClaw upstream
## Layout
@@ -29,7 +29,20 @@ html/docs-clawdie-si/
└── docs.clawdie.si.conf
```
-## FreeBSD deployment shape
+## Design direction
+
+This checked-in HTML deploy path is a bridge pattern, not the long-term target
+architecture.
+
+The target deployment model is:
+
+- Astro + Strapi live in the `cms` jail
+- nginx also lives in the `cms` jail
+- Clawdie does not require host nginx ownership
+- public exposure can happen through host PF, an existing reverse proxy, or a
+ direct public jail IP
+
+## Current bridge deployment shape
Suggested host paths:
@@ -41,7 +54,7 @@ Host prerequisite:
- `rsync` installed (`pkg install rsync`)
-## Preferred deploy path
+## Preferred bridge deploy path
Run:
@@ -57,7 +70,7 @@ The script:
4. runs `nginx -t`
5. reloads nginx
-## Manual deploy steps
+## Manual bridge deploy steps
1. Copy only public site files to `/usr/local/www/docs.clawdie.si`
2. Install `nginx/docs.clawdie.si.conf` into `/usr/local/etc/nginx/vhosts/`
@@ -68,6 +81,7 @@ The script:
## Notes
- This is a static site, not a reverse proxy app.
-- It is intended to be the public FreeBSD-facing documentation surface.
+- It is intended to keep the docs live while the Astro + `cms` jail refactor is
+ completed.
- It complements the main `html/clawdie/` site rather than replacing it.
- The homepage badge shows latest repository activity from Codeberg, not the live deploy timestamp.
diff --git a/html/docs-clawdie-si/guides/nanoclaw-upstream.html b/html/docs-clawdie-si/guides/nanoclaw-upstream.html
index ad0b498..e61dd9a 100644
--- a/html/docs-clawdie-si/guides/nanoclaw-upstream.html
+++ b/html/docs-clawdie-si/guides/nanoclaw-upstream.html
@@ -75,11 +75,13 @@
- Clawdie is built on NanoClaw
- — the open source personal AI assistant framework by
- Peter Steinberger,
- adapted for FreeBSD. The upstream toggle lets you see what new commits are
- available in the NanoClaw project and decide what to apply to your installation.
+ NanoClaw
+ is an upstream project by Gavriel in the broader OpenClaw line inspired by
+ Peter Steinberger's
+ OpenClaw.
+ Clawdie is the FreeBSD-first fork in that lineage. The upstream toggle lets
+ you see what new commits are available in NanoClaw and decide what to
+ apply to your installation.
@@ -101,6 +103,16 @@
+
+ Built on giants' shoulders
+
+ OpenClaw set the broader direction. NanoClaw carried that line into a
+ lean upstream personal assistant. Clawdie takes the same line into
+ FreeBSD and the wider OSA
+ stack.
+
+
+
diff --git a/html/docs-clawdie-si/guides/stripe-agents.html b/html/docs-clawdie-si/guides/stripe-agents.html
index 8d7c473..b9c8840 100644
--- a/html/docs-clawdie-si/guides/stripe-agents.html
+++ b/html/docs-clawdie-si/guides/stripe-agents.html
@@ -88,6 +88,37 @@
+
+ Runtime flow
+
+onboarding
+ -> configure Stripe now? (or skip)
+ -> write STRIPE_SECRET_KEY into .env
+
+host jail-runner
+ -> reads STRIPE_SECRET_KEY from .env
+ -> passes it to jailed runtime in stdin JSON secrets payload
+
+jailed agent runner
+ -> merges secret into SDK env only
+ -> registers Stripe MCP tools
+
+agent chat
+ -> can use customer, invoice, balance, subscription, and payment-link tools
+
+
+ Secret exposure boundary
+
+ The Stripe key is entered during onboarding or added later to
+ .env. The host reads it, passes it to the jailed runtime
+ in the stdin JSON payload, and the jailed agent runner exposes it only
+ to the Stripe SDK/tool runtime. It is not mounted as a file into the jail.
+
+
+
+
+
+
Setup
diff --git a/html/docs-clawdie-si/license.html b/html/docs-clawdie-si/license.html
index 15e4a9d..08f2e0a 100644
--- a/html/docs-clawdie-si/license.html
+++ b/html/docs-clawdie-si/license.html
@@ -86,12 +86,14 @@
Why BSD-3 over MIT
- Our upstream,
+ Our MIT-licensed upstream base comes from
NanoClaw
- by Peter Steinberger,
- is MIT licensed. BSD-3-Clause is fully compatible with MIT — you can use
- MIT code in a BSD-3 project without restriction.
- We chose BSD-3 because it adds one thing MIT does not:
+ by Gavriel. NanoClaw itself sits in the broader
+ OpenClaw
+ line inspired by Peter Steinberger.
+ BSD-3-Clause is fully compatible with MIT — you can use MIT code in a
+ BSD-3 project without restriction. We chose BSD-3 because it adds one thing
+ MIT does not:
@@ -235,8 +237,8 @@
BSD-2-Clause · BSD-3-Clause
BSD 3-Clause License
Copyright (c) 2026, Sam (Samo Blatnik) and Clawdie contributors
-Built on NanoClaw — Copyright (c) 2024 Peter Steinberger (MIT License)
+Built on NanoClaw — Copyright (c) 2024 Gavriel (MIT License)
All rights reserved.
Redistribution and use in source and binary forms, with or without