03free & installable

routine control / macOS

Schedule a routine without touching the mouse.

Claude Desktop routines are a form you fill in by hand. routinectl fills it in from a shell instead, through the macOS Accessibility API, in the background: no window raised, no app activated, no cursor moved, no clipboard used. Every field is read back out of the interface before the command reports success, and when a future build renames a control the tool repairs itself rather than breaking.

routinectl / list

read from the app

03 routines 00 windows raised JSON on stdout
●
Nightly repo health sweepcustom · 0 1,2 * * *
Opus 5 active saved
○
Morning inbox passdaily
Sonnet 5 active saved
○
Weekly archiveweekly
Default manual saved
$ routinectl create --spec ./nightly.jsonevery field read back equalexit 0
01

Check

routinectl doctor reports whether Accessibility is granted and the interface is readable, before anything is written.

02

Enumerate

routinectl options lists the permission, model, schedule and folder values the app actually offers, so nothing is guessed.

03

Create

routinectl create --spec ./routine.json sets every field and verifies each one before moving to the next.

04

Read back

routinectl list and show return the saved values from the Routines page, whole, not the sidebar's subset.

testedClaude Desktop 1.26832.0
runtimemacOS / local
licenseMIT · free

No binary ships; the installer builds from source, so Apple silicon and Intel both work. It stands on three facts about one application's interface. The documentation names them, and routinectl doctor tells you which of them has moved before any command fails.


command surface

Seven commands. That is the whole tool.

One Swift binary on your machine. No daemon, no package manager, no account, and no network access at any point.

  • 01 routinectl doctorpermission and readability check every session
  • 02 routinectl optionsthe values the app offers before create
  • 03 routinectl createflags, or --spec file daily
  • 04 routinectl listevery routine, schedule and status daily
  • 05 routinectl show <name>one routine's saved fields ad hoc
  • 06 routinectl delete <name> --yesirreversible; refuses without --yes rare
  • 07 routinectl repairwhat self-repair changed; --run, --reset after an app update
exit codes / branch on these

Seven outcomes

verified

Branch on the number, never on the message. 0 ok, 1 usage, 2 a required control is absent, 3 the app is not running or has no open window, 4 Accessibility is not granted to the host, 5 the action fired and the interface did not change, 6 the menu does not offer that value and available lists what it does.

output
JSON
network
none
focus
never stolen
deps
swiftc

Every command needs Claude Desktop running with a window open, not merely running. The app keeps its process alive after the last window closes, so a process check says yes and every command still exits 3. An unattended caller has to check for that and degrade, rather than treat it as a fault.

$routinectl doctorproceed only on ok: true

--dry-run prints the resolved plan and exits 0 without touching the interface, which is how you echo a routine back to someone for approval before it is created.

$routinectl show "Nightly sweep" --dumpraw subtree, when a value reads wrong

before you install

What it needs, and what it will not do.

Stated here rather than discovered later. If any of the four requirements does not hold on your machine, this tool is not for you and nothing below will change that.

  • 01 macOSone application, through the Accessibility API required
  • 02 Claude Desktop, window opennot merely running; the process outlives its windows required
  • 03 Xcode command line toolsfor swiftc; the installer prints the one command required
  • 04 Accessibility permissiongranted to your terminal, not to the binary grant once
  • 05 the Claude CLIonly for self-repair; everything else works without it optional
  • 06 iTerm2any terminal works once it has Accessibility not required
stated / not discovered later

What it does not do

by design

It does not schedule. It fills in the routine form and reads the saved values back. Claude Desktop runs the routines.

It does not create folders. --folder picks from the recently-used list the app already offers, and there is no path field to type into. Open a session in a folder once through the app and it becomes available.

It touches nothing else. No cursor movement, no window raise, no app activation, no clipboard, and none of your files. The one place it writes is ~/.routinectl, which holds its selector overlay and its failure records; ROUTINECTL_HOME moves that.

It will not survive every redesign. Self-repair rewrites the label of a control that was renamed, which is the common case. It cannot invent a control that stopped existing, or work out a new required step in the form. Those need the source, and the failure record it writes is the evidence for that work.

platform
macOS
arch
arm64 + Intel
daemon
none
account
none
$./install.sh --uninstallremoves the binary and the skill

install

Unpack it, run the installer, read what it did.

The installer builds the binary from the Swift source next to it, puts routinectl in your local bin directory, and drops a skill into your Claude skills directory so a session knows how to drive it. It is short. Read it first, and read the source it builds; that is why both are served as plain text here.

Uninstall with the same script and the uninstall flag. It removes the binary and the skill, and nothing else.

$ curl -fsSLO https://auto.relay70.dev/routinectl/routinectl.tar.gz && tar -xzf routinectl.tar.gz && cd routinectl && ./install.sh Download the archive Read the source Read the installer Report a problem