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.
What you’ll have at the end
localhost:5678 with:
- The 15 bundled plugins resolved at boot.
- A custom Weather plugin loading on demand.
- A
GET /weather/now?city=Xpublic HTTP route. - A streaming chat endpoint over SSE.
Step 0 — prerequisites
- Node.js 22+
- pnpm —
npm install -g pnpm - The IXO Mobile App or a 12/24-word mnemonic (for offline auth)
- An OpenRouter API key — get one at openrouter.ai
Step 1 — install the CLI
Step 2 — scaffold a project
- Auth — pick SignX (QR code) or offline (mnemonic). Offline is faster for local dev.
- Network — pick
devnetfor development. - Oracle profile — name, description, price, model. Defaults are fine.
- Entity creation — the CLI writes a transaction to register your oracle’s entity DID on chain. Confirm when prompted (SignX needs the mobile app; offline signs locally).
- Matrix bot — provisioned automatically.
Cloning instead of scaffolding — to study a finished plugin-based oracle, clone the boilerplate and run the example:Then follow Step 3 onward against
apps/qiforge-example/.Step 3 — fill in .env
Open apps/qiforge-example/.env (or apps/app/.env if you used --init). The CLI populated identity vars; you need to add the LLM key and any plugin vars:
[boot] excluded: <plugin> (<env-var>) line.
See Environment variables reference for the complete list.
Step 4 — install + boot
Step 5 — hit a public plugin endpoint
The Weather plugin exposesGET /weather/now. It’s marked auth-excluded via getAuthExcludedRoutes(), so no UCAN header needed:
Step 6 — send a chat message
For interactive chat, use the CLI’s streaming TUI:list_capabilities— seesweatherison-demand, not loaded yet.load_capability({ name: 'weather' })— gets the manifest back withwhenToUseand the tool list.loadedPluginsstate field now contains'weather'.get_current_weather({ city: 'Berlin' })— the actual tool fires.- Final response — natural-language summary of the result.
model call started / model call complete (Xms) for each LLM step.
What you just verified
| You saw | What it proves |
|---|---|
| Boot log listing plugins | Loader + topo sort + manifest validation worked. |
excluded plugins: line with reasons | Env-driven opt-in (autoDetect) is wired correctly. |
GET /weather/now returning JSON | Plugin Nest modules mount + auth exclusions apply. |
Agent calling load_capability then get_current_weather | Dynamic discovery and loadedPlugins state work end-to-end. |
| Middleware logs around each model call | getMiddlewares hooks are firing. |
Where to go next
Build track
Task-by-task recipes —
createOracleApp, plugin recipes, test, deploy.Write a plugin
Recreate the Weather plugin from scratch.
createOracleApp options
Every option you can pass — config, plugins, features, hooks.
Bundled plugins
The 15 plugins shipped with the runtime.
For AI agents
Dense one-pager with every signature inlined.
Understand the model
Optional. The mental model, runtime layers, plugins vs skills.
Troubleshooting
| Symptom | Likely fix |
|---|---|
[boot-error] Plugin '<name>' env validation failed for '<X>' | Either set the env var or disable the plugin with features: { name: false }. |
Boot hangs after Nest application started | Matrix init is still pending. Check MATRIX_BASE_URL and MATRIX_ORACLE_ADMIN_* env vars. |
| All authenticated requests return 401 | UCAN signing mnemonic not loaded — see Identity and auth. |
| The agent doesn’t call my plugin’s tool | Check it’s loaded in app.plugins.status(). If it’s on-demand, prompt the agent more clearly so it calls load_capability. |