Skip to content

Add the Local AI panel: the validated local model for your GPU, one button on the bar - #10643

Open
0xSero wants to merge 1 commit into
omacom:quattrofrom
0xSero:local-ai-v4
Open

Add the Local AI panel: the validated local model for your GPU, one button on the bar#10643
0xSero wants to merge 1 commit into
omacom:quattrofrom
0xSero:local-ai-v4

Conversation

@0xSero

@0xSero 0xSero commented Sep 7, 2026

Copy link
Copy Markdown

Summary

Local models as one button on the bar, in the V1 scope agreed when #8836 was closed: one validated model per GPU tier, Start/Stop, an agent picker, a keyed Tailscale share, and nothing else. This is the plugin that has been shipping third-party as sero.local-ai (marketplace submission omacom/omarchy-plugin-marketplace#4097, where it passed validation and the security baseline and went through five rounds of security review), brought in as omarchy.local-ai.

  • Card: the model validated for the detected GPU, which GPUs were detected and which is in use (a picker when there is more than one), Start with the download size shown first, Stop, Open agent, Share on Tailscale. Every refusal is a sentence on the card.
  • Controller (bash, no daemon, 5 verbs): hardware match, a fail-closed recipe gate (digest-pinned image, pinned model revision, no host IPC, no added capabilities, no weakened seccomp, mounts confined to two plugin-owned roots), weights with progress, the engine and an attested gateway as two labeled containers on a private network, and acceptance before "ready": served model id, unkeyed request refused, chat, a decode-speed floor, Messages, Responses, a tool call. Failure rolls back to the previous model.
  • Agents are launch-only: pi, omp, opencode, ori, claude, codex, grok, agy, hermes, copilot, crush open on the model with the endpoint and key in their own environment. No user config file is read or written (a test asserts it).
  • Share publishes the gateway on the tailnet address, keyed; no tailscale serve, no root, no sudo, no pkexec. The key lives in one 0600 file and enters no process argument.
  • Recipes are vendored from the local-ai-registry export: 34 hardware ids, each validated on that card.

How we know it works

  • On real hardware, through the plugin's own Start path: 29 of the 31 NVIDIA recipes attempted passed on rented cards (RTX 3060 through RTX 6000 Ada and A6000; the other two had no offers that day), driving the shipped plugin CLI inside the recipe's own image with a docker shim. Per-card JSON with logs and generated command lines: test/rented-results/ in the plugin repo. Total rental cost $0.76.
  • On a live Omarchy host (two RTX 3090 + two Arc Pro B70), this exact branch run as the first-party shell from the checkout: the panel added with omarchy bar put omarchy.local-ai, then Stop, Start (accepted at 24 tok/s), Open agent, and Share on/off all driven through the omarchy.local-ai IPC. omarchy local ai … routes through the new bin/omarchy-local-ai.
  • Tests: 86 shimmed tests (docker, curl, nvidia-smi, tailscale, agents) run by test/shell.d/local-ai-test.sh; upstream's bin-style, panel-command-path, qml-text-format, plugin-registry-contract, bar-widget-contract, plugins, and manifest-entrypoints tests pass on this branch.

Files

shell/plugins/panels/local-ai/ (Panel.qml, manifest, README, bin, lib, recipes.json, test/all), bin/omarchy-local-ai (router), one line in bin/omarchy for the local group, a section in manual/17-ai.md, a row in shell/plugins/README.md, and test/shell.d/local-ai-test.sh.

🤖 Generated with Claude Code

https://claude.ai/code/session_013f3DyC3B8UpdJKu3Z5F8pX

…utton on the bar

One bar icon and one card: the model validated for the detected GPU, Start/Stop, an agent
picker, a Tailscale share toggle, and a GPU picker when more than one card is present. Renders
purely from a snapshot file the controller writes; nothing in QML knows a model name or a flag.

The controller (bash, no daemon) matches hardware, gates the vendored recipe (digest-pinned image,
pinned model revision, no host IPC, no extra capabilities, no weakened security profile, mounts
confined to two plugin-owned roots), downloads weights with progress, runs the engine and an
attested gateway as two labeled containers on a private network, and calls the model ready only
after acceptance: served model id, unkeyed request refused, chat, decode-speed floor, Messages,
Responses, and a tool call. Failure rolls back to the previous model with the reason on the card.

Agents are launch-only: pi, omp, opencode, ori, claude, codex, grok, agy, hermes, copilot, crush
open on the model with the endpoint and key in their own environment; no user config is written.
Sharing publishes the gateway on the tailnet address, keyed, with no root, sudo, or pkexec.

Validated on 29 NVIDIA cards (rented, the plugin's own Start path) and daily on a mixed
RTX 3090 + Arc Pro B70 host; 86 shimmed tests run through test/shell.d/local-ai-test.sh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013f3DyC3B8UpdJKu3Z5F8pX
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