Skip to content

Plugins, workers reporting to one Loki, and qmd in place of OpenViking - #10

Merged
jtmckay merged 3 commits into
mainfrom
plugins
Nov 11, 2026
Merged

jtmckay merged 3 commits into
mainfrom
plugins

Conversation

@jtmckay

@jtmckay jtmckay commented Nov 11, 2026

Copy link
Copy Markdown
Owner

Three commits that change how automations ship and how hosts report.

Every machine is a plugin that follows the repo (02a013e)

  • automation/plugins/<name>.md holds one decree machine: its chart, scripts, lib, endpoints, crons and migrations. A flow is a plugin with no machine, in automation/plugins/flows/.
  • The plugin system itself (plugin, plugin_share, plugin_offer, plugin_request, notify) is tracked and installed everywhere; no plugin can replace it.
  • Each decree project (automation, automation-backup, host) records what is on in its own .decree/plugins.yml, written once from its plugins.exist.yml. Every ./existential.sh installs exactly that, plus what it needs:, at the checkout's version. A git pull now reaches a running stack.
  • Four flows were renamed where they clashed with a machine's name: comfy → comfyui, newsletter → weekly-newsletter, capture → capture-stream, gmail → gmail-inbox.
  • flow on asks before turning on each service a flow needs.

Workers report every host to one Loki (f7bffd3)

  • A worker is a host whose own decree project (host/.decree) has the worker flow on. Every 5 minutes it reports free disk space, the installed decree machines and their runs to Loki, for Grafana's new Hosts dashboard.
  • With EXIST_CONTROLLER set, a worker asks that controller where Loki is (http://<controller>:4480, over the tailnet). With it blank, the host is the controller.
  • auto-update (git pull, ./existential.sh, docker compose up -d every 15 minutes) is now an optional flow. Nothing runs on the host by default.
  • First run offers Core, Controller, Worker or Nothing.
  • Docs: "Build On It" is now Plugins (docs/plugins/). Every relative docs link names its .md file: on the live site, ./writing-a-routine resolved to /docs/build-on-it/writing-a-routine, a 404. validate conventions now rejects a link without it, and static/_redirects keeps the old URLs working.

Retire OpenViking for qmd; "machine" means a decree machine (d917713)

  • OpenViking moves to the graveyard. qmd now serves pi too, so search is one index for Claude Code, opencode and pi. note-connect needs search, and workspace-agent needs qmd. Gone with it: the knowledgebase flow, the indexer, the backups, the API key, and the whole embedding model role (EXIST_MODEL_EMBED*, EXIST_MODEL_URL_EMBED, bge-m3).
  • A computer is now a host everywhere; "machine" only means a decree machine (a rule in CLAUDE.md).
  • The docs no longer call their reading order C4.
  • Fixed the Services page diagram, which didn't render: a . inside a dotted arrow's label.

For existing installs

  • plugins.yml is written on the first run, and keeps what an install already had on.
  • The research/sales department files copied into workspace/.decree/lib/departments/ still name openviking. Change them to qmd by hand.
  • After ./existential.sh, docker compose up -d --remove-orphans removes the OpenViking container. volumes/openviking_data is left for you to delete.
  • Loki's already-rendered compose file needs 127.0.0.1:43100:3100 for workers to reach it, or ./existential.sh reset.
  • An install whose host/.decree/plugins.yml already exists keeps update on.

Checks

  • Passing: validate conventions, the site build (no broken links or anchors, every Mermaid diagram parses), every unit suite that runs outside the adhoc container, the Mac bash 3.2 check, and the decree gate except its ai.sh comparison, which needs the real decree binary.
  • Not run (no container runtime here): test-templates, test-compose, test-validators, shellcheck, typecheck and e2e. CI covers these.
  • Never tested for real: two hosts over Tailscale with the Hosts dashboard.

🤖 Generated with Claude Code

https://claude.ai/code/session_014q2vcj2MGfnCThazsgxgws

jtmckay and others added 3 commits November 10, 2026 20:11
automation/plugins/<name>.md is one machine with its scripts, lib, endpoints,
crons and migrations; a flow is a plugin with no machine, in
automation/plugins/flows/. The plugin system (plugin, plugin_share,
plugin_offer, plugin_request, notify) is the tracked kernel and no plugin can
replace it. Each decree project (automation, automation-backup, host) records
what is on in .decree/plugins.yml, written once from its plugins.exist.yml,
and every ./existential.sh installs exactly that plus what it needs at the
checkout's version, so a git pull reaches a running stack. The host `update`
plugin pulls fast-forward only and re-runs on a schedule.

Flows renamed where they clashed with a machine: comfy -> comfyui,
newsletter -> weekly-newsletter, capture -> capture-stream,
gmail -> gmail-inbox. `flow on` asks before turning on each service.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014q2vcj2MGfnCThazsgxgws
… slashes

Docs: "The Pieces" is now Services, and "Build On It" is Plugins
(docs/plugins/: the plugin reference, Writing a Plugin, and Over HTTP).
Every relative docs link names its .md file: behind the host's trailing
slash, ./writing-a-routine resolved to /docs/build-on-it/writing-a-routine,
a 404. validate conventions now fails a link without it, and
static/_redirects keeps the old addresses working.

A worker is a machine whose host runs decree with the `worker` flow on. Its
`reporting` plugin sends free disk space, installed decree machines and
finished runs to Loki every 5 minutes, for Grafana's new Machines dashboard.
With EXIST_CONTROLLER set it asks that controller where Loki is
(http://<controller>:4480, served over the tailnet); blank, it is the
controller. Loki's push port is served on the tailnet on 3100.

Flows can belong to the host project (`project: host`). `auto-update`
(git pull, ./existential.sh, docker compose up -d) is now an optional flow;
nothing runs on the host by default. The first run offers Core, Controller,
Worker or Nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014q2vcj2MGfnCThazsgxgws
…bels

OpenViking goes to the graveyard. qmd already searched the workspace for
Claude Code and opencode; now pi uses it too: pi_configure registers qmd,
firecrawl and playwright, and the shipped departments name qmd.
note-connect needs the search flow instead of knowledgebase, and
workspace-agent needs qmd. The knowledgebase flow, the
openviking_index_dir machine, its backups, Caddy hostname and API key are
gone, and so is the embedding model role it alone used
(EXIST_MODEL_EMBED, _EMBED_DIM, EXIST_MODEL_URL_EMBED, bge-m3 in the tier
table, ollama's embed pull).

"Machine" now only means a decree machine; a computer is a host, in docs,
code and messages. The Machines dashboard is Hosts (hosts.json), and
CLAUDE.md says so.

The docs' reading order (What It Is, Services, Flows, Plugins) no longer
claims to be C4. The intro's diagram no longer says one machine, and the
Services page points to controller and workers.

Fixes: the Services page diagram failed to render (a "." inside a dotted
arrow's label); test-ai-box-guide matched the old extension-less links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014q2vcj2MGfnCThazsgxgws
@jtmckay
jtmckay merged commit 402defa into main Nov 11, 2026
1 check passed
@jtmckay
jtmckay deleted the plugins branch November 11, 2026 23:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant