Otto

The Mac

The workspace probe, the project registry, music control, and the dev-life watchers that read them.

Live.The workspace probe, music control, the project registry, the resume card and the burn-rate watch all run today.

The workspace probe

One line answering what you are actually doing: the frontmost application, the repo you are in and whether it has uncommitted changes, and what is playing.

It feeds the Machine section of the brief, and it is what lets Otto tell the difference between you being at the keyboard and away without installing anything that watches you.

The project registry

A nightly scan of your projects directory writing one record per repo:

  • the normalised git remote
  • package manager and lockfile paths
  • CI workflow files
  • deploy URLs and domains, read from config files only, never guessed
  • last tag and last commit

Every dev-facing watcher reads this instead of re-deriving it. You feel it as Otto knowing that a project name means a repo, a launchd job and a live URL, rather than a word you said.

Music

A CLI drives the Music app on the Mac: status, play, pause, next, previous, volume, seek, shuffle, repeat, search, playlists, queue, favourite, rate.

Library only. It cannot reach the streaming catalogue, so a song you have not saved cannot be played, and Otto says so rather than pretending.

Playback is audible in your house. Otto does not start, skip or stop anything you did not ask for, and never as a side effect of another task. Before a spoken reply plays, the volume ducks and is restored afterwards, so Otto does not talk over your music.

Installing the shell hook

The long-command ping is a zsh hook rather than something the channel can turn on by itself. Source it from your shell config:

source /path/to/otto-core/scripts/otto-shell-hook.zsh

It reports a foreground command that ran longer than ninety seconds and finished while the terminal was not frontmost. Interactive things that are supposed to run for hours are ignored by default: editors, pagers, ssh, tmux, REPLs, and git commit. OTTO_HOOK_MIN_SECS and OTTO_HOOK_IGNORE tune it.

Not built yet

These do not exist. The substrate each one reads is live, so every item below is a self-contained piece of work rather than a rewrite. The button copies a prompt that builds it in your own checkout.

#149Uncommitted work agingsmall

Persist the dirty-repo readings and fire exactly once when a repo crosses 48h uncommitted with no edits today — branch, diffstat, last commit, with [commit it / stash / mute 2 weeks]; it detects the transition and speaks instead of restating dirtiness on every event.

#154Disk, backup and device watchmedium

A daily probe of free space, Time Machine's last successful backup, APFS snapshots, battery while unplugged and the usual hogs, silent until a threshold that costs them work — backup 7 days stale, under 10 GB free, under 15% battery with a dirty unpushed repo — with a [reclaim 34 GB] button that deletes the caches it named; the always-on Mac is the substrate and nothing watches it.

#155Clipboard history recallmedium

A sidecar polling NSPasteboard's changeCount once a second into the BM25 store, skipping anything flagged ConcealedType so password-manager copies never land, with a `clipboard_recall` tool answering "what was that tracking number I copied this morning" from the couch.

#158Claude session supervisormedium

Watch ~/.claude/projects/*/*.jsonl for their other sessions: a brief line for what each is working on, and one ping when a long run finishes or stalls over 10 minutes on a permission prompt — the failure mode where a session sat blocked all afternoon while they assumed it was working.

#159Uptime sentinel with incident dedupemedium

A sidecar probes each registry deploy URL every 5 minutes; three consecutive failures produce one urgent message with status code, latency and the deployed sha, then silence until recovery sends exactly one "back up, 14m" line — one alert per incident, never a flapping stream.

#160CI failure triage, one tap to fixmedium

On a red run for a branch they pushed in the last few hours, extract the actual failing assertion (not 400 lines of log) into three lines with [log / fix it / mute workflow 24h], where "fix it" launches a headless run in a worktree that opens a PR; silent for scheduled runs and branches they haven't touched.

#161Review queue with staleness SLAmedium

Track PRs where they're a requested reviewer and ping once when one crosses their SLA, with diff size and file count so they knows if it's a two-minute review, re-nudging only on new commits and never on a timer.

#162CVE watch on their real lockfilesmedium

Nightly osv-scanner over the registry's lockfiles alerting only on high/critical advisories hitting direct production dependencies, once per advisory ever, with the bump command inline and a [bump it] that upgrades in a worktree and opens a PR; dev-only and transitive lows are recorded silently.

#163Update digest with safe upgradesmedium

Weekly brew/softwareupdate/mas/npm outdated where the agent actually reads release notes for the two or three that matter and counts the rest, with one [upgrade the safe ones] button excluding pinned formulae and major bumps, then reports what moved.

#167GitHub event bridge daemonlarge

A sidecar polling `gh api /notifications` and per-repo runs, deduping against a seen-ids store and injecting only state-changing events into the webhook — CI red, review requested, mention, PR merged — with per-repo and per-workflow mute lists in access.json so a noisy repo is silenced with one tap instead of killing the feed.

#168Workspace launcherlarge

`workspace save <name>` snapshots the window set, browser tabs and terminal cwds, and "open otto-core" restores all of it plus a summary of what moved on the remote while they were away; context-switching back into a project stops being ten minutes of reopening things.

On this page