Run Continuity Forge as a native Linux service: Python venv + systemd + optional
local Postgres/MinIO/Temporal. Docker Compose remains available for a production-shaped
all-in-one stack (deploy/README.md) but is not required.
| Artifact | Path |
|---|---|
| Env template | deploy/linux/continuity-forge.env.example |
| API unit | deploy/linux/continuity-forge-api.service |
| Worker unit | deploy/linux/continuity-forge-worker.service |
| Install helper | deploy/linux/install.sh |
sudo apt update
sudo apt install -y \
python3.12 python3.12-venv python3-pip \
git build-essential curlOptional durability (pick what you need):
# Postgres (canon / runs)
sudo apt install -y postgresql postgresql-contrib
# MinIO — not always in apt; use upstream binary or keep artifacts on disk via CF_STORE_ROOT
# Temporal — install upstream package or run only the in-process harness (no worker unit)/opt/continuity-forge # git clone + .venv
/var/lib/continuity-forge # CF_STORE_ROOT (projects, runs, auth.json, artifacts)
/etc/continuity-forge/ # continuity-forge.env
sudo git clone https://github.com/scrimshawlife-ctrl/continuity-forge.git /opt/continuity-forge
cd /opt/continuity-forgesudo bash deploy/linux/install.shThis creates user continuity-forge, data dirs, env file, venv, installs .[dev],
and installs systemd units (does not start the service until you enable it).
Manual equivalent:
sudo useradd --system --home-dir /var/lib/continuity-forge --shell /usr/sbin/nologin continuity-forge || true
sudo mkdir -p /var/lib/continuity-forge /etc/continuity-forge
sudo chown continuity-forge:continuity-forge /var/lib/continuity-forge
sudo cp deploy/linux/continuity-forge.env.example /etc/continuity-forge/continuity-forge.env
sudo chown root:continuity-forge /etc/continuity-forge/continuity-forge.env
sudo chmod 0640 /etc/continuity-forge/continuity-forge.env
sudo -u continuity-forge python3.12 -m venv /opt/continuity-forge/.venv
sudo -u continuity-forge /opt/continuity-forge/.venv/bin/pip install -U pip
sudo -u continuity-forge bash -c 'cd /opt/continuity-forge && .venv/bin/pip install -e ".[dev]"'
# optional Postgres/S3/Temporal clients:
# sudo -u continuity-forge bash -c 'cd /opt/continuity-forge && .venv/bin/pip install -e ".[production]"'
sudo cp deploy/linux/continuity-forge-api.service /etc/systemd/system/
sudo cp deploy/linux/continuity-forge-worker.service /etc/systemd/system/
sudo systemctl daemon-reloadsudo nano /etc/continuity-forge/continuity-forge.envCF_ENV=production
CF_HOST=127.0.0.1
CF_PORT=8080
CF_AUTH_REQUIRED=1
CF_BOOTSTRAP_DEV_TENANT=0
CF_STORE_ROOT=/var/lib/continuity-forge
CF_PROVIDER=mockRuntime selection (continuity_forge_runtime.get_runtime()):
CF_DATABASE_URL→ Postgres stores- else
CF_STORE_ROOT→ filesystem stores + local artifact dir - else in-memory (not for multi-process servers)
sudo -u postgres createuser continuity
sudo -u postgres createdb -O continuity continuity_forge
sudo -u postgres psql -c "ALTER USER continuity PASSWORD 'CHANGE_ME';"
# in env:
# CF_DATABASE_URL=postgresql://continuity:CHANGE_ME@127.0.0.1:5432/continuity_forge
# Keep or drop CF_STORE_ROOT; DB wins for project/run stores. Artifacts still need CF_STORE_ROOT or S3.Bootstrap-dev is blocked when CF_ENV/ENVIRONMENT is production/prod.
Provision keys via your own process using continuity_forge_auth against
${CF_STORE_ROOT}/auth.json, or temporarily:
# ONE-TIME local admin only — never leave on a public host
# CF_ENV=development
# CF_BOOTSTRAP_DEV_TENANT=1
# restart, curl bootstrap, then set CF_ENV=production and CF_BOOTSTRAP_DEV_TENANT=0sudo systemctl enable --now continuity-forge-api
sudo systemctl status continuity-forge-api --no-pager
journalctl -u continuity-forge-api -fHealth and UI:
curl -s http://127.0.0.1:8080/health
# open browser: http://127.0.0.1:8080/Reverse-proxy (optional): put nginx/Caddy in front, TLS terminate, proxy to
127.0.0.1:8080. Keep CF_HOST=127.0.0.1 so the app is not world-bound.
Requires Temporal frontend listening (e.g. 127.0.0.1:7233) and:
sudo -u continuity-forge bash -c 'cd /opt/continuity-forge && .venv/bin/pip install -e ".[production]"'
# set CF_TEMPORAL_HOST in env file
sudo systemctl enable --now continuity-forge-workerIn-process pipeline still works without Temporal via API/CLI.
# as continuity-forge or with env loaded
set -a; source /etc/continuity-forge/continuity-forge.env; set +a
curl -sf "http://${CF_HOST:-127.0.0.1}:${CF_PORT:-8080}/health"
# controlled proof via CLI
sudo -u continuity-forge /opt/continuity-forge/.venv/bin/continuity-forge proof \
/opt/continuity-forge/tests/golden/fixtures/continuity.fountain \
--out /tmp/cf-proof-outAPI proof (with auth key if required):
curl -sf -X POST "http://127.0.0.1:8080/v1/proof" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Smoke","document_key":"linux-smoke","text":"INT. ROOM - DAY\n\nMara.\n","seed":"linux"}'Full compose smoke script still assumes Docker ports; for bare metal use the curls above.
cd /opt/continuity-forge
sudo -u continuity-forge git pull --ff-only
sudo -u continuity-forge .venv/bin/pip install -e '.[dev]' # or .[production]
sudo -u continuity-forge .venv/bin/python scripts/validate_m0.py
sudo systemctl restart continuity-forge-api
# sudo systemctl restart continuity-forge-worker| Item | Guidance |
|---|---|
| Bind address | Prefer CF_HOST=127.0.0.1 + reverse proxy TLS |
| Bootstrap | CF_BOOTSTRAP_DEV_TENANT=0 and CF_ENV=production |
| Env file | 0640 root:continuity-forge |
| Data dir | Owned by service user; not world-readable |
| Secrets | Never commit real continuity-forge.env |
| Providers | Keep CF_PROVIDER=mock until keys and budgets are real |
| Symptom | Fix |
|---|---|
unit not found |
daemon-reload after copying unit files |
| Permission denied on store | chown -R continuity-forge:continuity-forge /var/lib/continuity-forge |
| Import / module not found | Activate venv path in ExecStart; reinstall -e . |
| Auth 401 | Issue API key; send Authorization: Bearer … |
| Bootstrap 403 | Expected when CF_ENV=production |
| Postgres connection refused | Start postgresql, fix CF_DATABASE_URL |
| UI 404 static | Confirm apps/web present in clone (not a bare wheel install without static) |
Note: Editable install from a full git tree is required for the Hallmark UI
static mount (apps/web). A wheel-only install may expose API without the UI
unless you also deploy apps/web and set a future CF_WEB_ROOT (not required
when running from the recommended /opt/continuity-forge clone).
- SETUP.md — general install (dev laptop, Docker, MCP)
- deploy/README.md — Docker Compose stack
- AGENTS.md — mutation / canon authority