"A URL accepts only a saved command ID, never shell code or an arbitrary app path." — Tinker README
Why a URL Scheme at All
Dad runs editing sessions with a Stream Deck on the desk. The obvious integration would be a Stream Deck plugin, which means another codebase, another SDK version to chase, and another process that needs to talk to Tinker. The boring integration needs none of that. Stream Deck has a built-in System › Website action that opens any URL, and macOS opens a URL whose scheme an installed app declares by handing it to that app. So Tinker declares the tinker scheme in its Info.plist, and a key on the deck becomes tinker://command/edit.toggle. Separate "prepare" and "finish" keys use edit.apply and edit.restore.
The Parser Is a Gate
A URL scheme is an input channel any web page, document or other app on the Mac can trigger. That makes the handler a security boundary, and Tinker's is deliberately narrow. The scheme must be tinker, the host must be command, there must be exactly one path component after the slash, and there must be no query string and no fragment. Anything else is refused with "Use tinker://command/ followed by a saved command ID." Then the ID is looked up among saved commands; an unknown ID is an error, not an invitation. There is no way to pass a bundle ID, a file path, arguments or code through the URL. The worst a hostile page can do is run a command Dad already saved — which is why the release command and toggles are safe to expose and why a capability that could do harm would never be bindable this way without its own protections.
Every Command Shows Its Own URL
Settings prints each saved command's URL beside its shortcut recorder, selectable for copying, and each preset shows its toggle URL under the app list. Setting up a deck key is: copy the line, paste it into a Website action. The URL is derived from the command ID, so it never drifts from what Tinker will accept.
Same Engine, Labelled Door
When the URL arrives, the app delegate's application(_:open:) passes it to the model, which validates it and calls performCommand — the path shortcuts take too — which ends in the same run() and engine as a menu click, with the trigger recorded as Link. The Activity history therefore shows that the request came from a link — useful when a deck key is mislabelled and Dad wonders why broadcast mode just turned on.