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_v view).
  • CLAUDE.md — contract telling Claude when to query and when to log.
  • .claude/settings.json — exports DESKTOP_OPS_WORKSPACE automatically.
  • templates/ — markdown bodies Claude fills in for the ops.body field.
  • 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.