Context
Two artifacts need distributing - the owl binary with its daemon, and the
desktop app - both from the author’s own tap at
github.com/vojtechmares/homebrew-tap. Homebrew’s model separates formulae
(CLI software, brew services) from casks (signed .app bundles), and naming
them is not a free choice.
Decision
- Formula
coding-owl- theowlbinary plus the daemon service, started withbrew services start coding-owl. - Cask
coding-owl-desktop- the Wails app. - The cask declares
depends_on formula: "vojtechmares/tap/coding-owl".
MVP releases publish binaries as GitHub Release assets. A dedicated download
CDN at releases.codingowl.dev and a plugin registry at
plugins.codingowl.dev are out of scope for now.
Consequences
brew services start coding-owlreads correctly, because the formula ships a daemon rather than only a CLI.- The cask dependency guarantees exactly one daemon per machine instead of the app bundling a second copy that drifts out of sync with the CLI.
- The cask follows the maintainer’s existing Reviewdeck cask: ad-hoc signed,
not notarised, quarantine cleared by a postflight step, rendered from scratch
by the release workflow on every release. The formula follows the tap’s
existing GoReleaser-generated
staticaformula. Both are pushed to the tap by CI with acontents:writetoken. Versions are ZeroVer (v0.x.y) with no prereleases until SemVer is adopted. - Two artifacts must be released in lockstep, and users will inevitably end up with one of them older than the other. ADR-0004’s Buf breaking-change detection covers an older app against a newer daemon and not the reverse, so the daemon is the half to get there first: the release renders the formula before the cask, and the cask depends on the formula.
- The formula name does not match the binary name (
owl). This is ordinary in Homebrew -ripgrepinstallsrg. - Pointing formulae at GitHub Release assets rather than a custom domain keeps
brew bump-formula-prand third-party update bots working. Moving to a custom CDN later means hand-maintaining URLs and checksums, and should be a deliberate trade.
Alternatives considered
One name for both. Rejected on hard mechanics: a formula and a cask sharing
a name inside one tap makes brew install vojtechmares/tap/coding-owl
ambiguous and forces --formula/--cask on users forever. This is exactly why
the Docker cask is named docker-desktop.
coding-owl-cli plus coding-owl-desktop. More explicit, but it misnames
the thing: the formula ships a daemon, and brew services start coding-owl-cli reads as nonsense.