desktop-ops-workspace-template
April 17, 2026 · View on GitHub
Template repo that pairs with linux-desktop-plugin.
The plugin runs Linux desktop operations. This workspace remembers them — a per-machine, local-first SQLite log of everything the agent installed, fixed, reorganised, or diagnosed, so future sessions can query prior history before acting.
What you get
ops.db— SQLite log (created on first run, gitignored).schema.sql— the schema (machines,ops,installs,ops_vview).CLAUDE.md— contract telling Claude when to query and when to log..claude/settings.json— exportsDESKTOP_OPS_WORKSPACEautomatically.templates/— markdown bodies Claude fills in for theops.bodyfield.scripts/— bootstrap (init-db.sh,register-machine.sh) and logging helper (log.sh).
Quickstart
# 1. Create your workspace from this template
gh repo create my-desktop-ops \
--template danielrosehill/desktop-ops-workspace-template \
--private --clone
cd my-desktop-ops
# 2. Bootstrap
./scripts/init-db.sh
./scripts/register-machine.sh
# 3. Install the plugin (once, globally — standard Claude Code install)
# See: https://github.com/danielrosehill/linux-desktop-plugin
# 4. Open Claude Code in this directory
# .claude/settings.json sets DESKTOP_OPS_WORKSPACE automatically.
# 5. Use the plugin normally — Claude logs into ops.db as ops happen.
Example queries
-- Last 10 incidents on this machine
SELECT ts, title, outcome FROM ops_v
WHERE op_type='incident' ORDER BY ts DESC LIMIT 10;
-- Every time obsidian was installed/upgraded/removed
SELECT o.ts, i.action, i.source, i.version
FROM installs i JOIN ops o ON o.id = i.op_id
WHERE i.package='obsidian' ORDER BY o.ts DESC;
-- Anything tagged bluetooth in the past 90 days
SELECT ts, op_type, title FROM ops_v
WHERE tags LIKE '%bluetooth%' AND ts > datetime('now','-90 days')
ORDER BY ts DESC;
Claude writes SQL fluently against this schema — ask in plain English and it'll translate.
Privacy
ops.db is gitignored. Your operational history never leaves the machine
unless you explicitly sync it yourself.
Standalone plugin
The plugin works without the workspace — it falls back to stateless behaviour
when DESKTOP_OPS_WORKSPACE is unset. Pair them when you want memory.