Documentation Index
Fetch the complete documentation index at: https://docs.ixo.world/llms.txt
Use this file to discover all available pages before exploring further.
Reference Dockerfile
QiForge has no runtime dependency on itself — anywhere Node 22+ runs, an oracle runs. This Dockerfile is the shortest path frompnpm dev to a container you can ship.
apps/qiforge-example) builds with pnpm build and runs with node dist/main.js — see apps/qiforge-example/src/main.ts.
Prerequisites
- Node.js 22+
- A reachable Matrix homeserver
- A persistent volume for the Matrix store and SQLite checkpointer
- Core env vars (per
baseEnvSchema) - Optional: Redis (only if
creditsortasksplugins are loaded)
Build and ship
Build the production bundle
tsc -p tsconfig.build.json and outputs dist/. Your package.json’s start script should be node dist/main.js.Pin every required env var
Production Per-plugin vars come on top — see environment variables reference for the full list. Boot validates every var declared by every loaded plugin’s
.env (or your platform’s secret manager) needs every core var plus the vars for each plugin you’ve kept.configSchema; missing required vars fail loudly.Run the entity setup once per deployment
Identity and Matrix keys are provisioned via the CLI — see identity and auth for the full flow.
Persistent volumes
Mount /data as a persistent volume
Two things must survive restarts. Lose either and you lose state.
In Docker Compose:On Railway / Fly.io: attach a persistent volume mounted at
| Path | What it stores | What breaks if you lose it |
|---|---|---|
MATRIX_STORE_PATH (default /data/matrix-storage) | Matrix sync state, room keys, decrypted cache | Full re-sync on next boot; potential decrypt issues |
SQLITE_DATABASE_PATH (e.g. /data/sqlite) | Per-user LangGraph checkpointer | Thread continuity across restarts |
/data.Add Redis only when needed
Redis is required only if you load the Pass the Redis client to
credits plugin (or the tasks plugin once it ships). Without those, skip it entirely.CreditsPlugin explicitly — see enable bundled plugins.Health probes
Use /health as the liveness probe
The framework exposes Kubernetes:
GET /health, always public, never goes through AuthHeaderMiddleware. Returns 200 once Nest is up.Docker:There is no separate readiness probe
Matrix init runs in the background. The process accepts requests immediately after Nest boots. If you need to delay traffic until Matrix is up, subscribe via
app.onPluginStatusChange and signal your platform when matrix transitions to loaded — see observability.CORS
CORS_ORIGIN controls who can call your oracle from a browser.
| Value | Behaviour |
|---|---|
* | Open. Credentials disabled (browsers require a specific origin to send credentials). |
https://your-portal.example | Specific origin; credentials: true enabled. |
Logging
The runtime uses NestJS’s defaultLogger. Pipe stdout/stderr to your aggregator. Override the bootstrap logger with createOracleApp({ logger }) if you need a custom format — see createOracleApp reference.
For structured tracing instead of free-form logs, set the LangSmith env vars — see observability.
Graceful shutdown
The runtime registers aSIGTERM / SIGINT handler that closes the Nest app and disconnects Matrix.
Where to read next
Environment variables
Every var per plugin, exhaustively.
Observability
LangSmith, plugin lifecycle, logger.
Identity and auth
Entity setup and per-request UCAN auth.
Troubleshooting
Boot errors, Matrix issues, common runtime errors.