Files
yellowjacket/packaging/homebrew
yonluandClaude Opus 5 4471db3aef feat(wails): move the Go side to v3
Phases 2 and 3 of plan 009, plus the parts of phase 1 that could not
land before them. Nothing in the tree imports wails/v2 any more; all
three lint and test configurations are green and `go build .` produces
a running binary.

The point of the migration is one file. backend/events/emit.go probed
ctx.Value("events") — a v2-*private* context key — to decide whether
emitting was safe, because runtime.EventsEmit called log.Fatalf on a
context without the runtime and took the process down with it. v3's
emit takes no context, so that is now application.Get() == nil. D1
held: events.Emit keeps its ctx as the WithSink test seam, and all 45
call sites and 7 test files are untouched.

The bootstrap splits into application.New + Window.NewWithOptions +
Run. Ten bound services implement ServiceStartup instead of being
handed a context by hand from OnStartup, which also stops ten
SetContext methods being exported as bindings. jobs.Registry and
explore.SearchIndex keep theirs — neither is bound, so converting them
would be churn for no binding removed.

Four things differed from the plan and are written up in it: GPU policy
moved to the per-window LinuxWindow options rather than surviving on
LinuxOptions; there is no OnStartup/OnDomReady option, so app-level
wiring hangs off ApplicationStarted; application.NewService is generic,
so FEBindings []any could not survive (the binding generator is a
static analyser and would have seen nothing); and the quit veto had to
be restructured, because v3's dialog answers on a callback rather than
returning the button, so ShouldQuit vetoes, asks, and quits again from
the callback.

Window state saving moves to a WindowClosing hook — the size has to be
read while the window still exists, and v3's OnShutdown has neither
context nor window. backend/logging is deleted rather than ported:
v3 takes a *slog.Logger directly, so the v2 logger.Logger adapter had
no caller left.

Phase 1's tail rides along, now that it can: the Makefile's wails
invocations, all 50 webkit2_41 sites, lefthook, both packaging recipes
and ci.yml's apt lists. v3 builds against GTK4 + WebKitGTK 6.0, which
Arch and ubuntu:24.04 both ship, so the tag is a deletion rather than
a translation.

Phase 4 is next and the branch is not usable until it lands: the app
builds, but frontend/wailsjs/ is v2's tree and nothing regenerates it,
so the frontend cannot reach the backend yet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UDCbcCZQepnpSQYJ6SxxZm
2026-08-14 14:01:02 -04:00
..

YellowJacket Homebrew formula

The formula builds YellowJacket from source on macOS and Linuxbrew, mirroring the Arch PKGBUILD: the Wails toolchain resolves from go.mod's tool directives and drives the frontend build itself, so the only build inputs are Go, Node, and pnpm.

packaging/homebrew/
└── Formula/
    └── yellowjacket.rb   ← canonical source; CI syncs it to the tap repo

Installing

brew install shadow-puppet/yellowjacket/yellowjacket

shadow-puppet/yellowjacket is Homebrew shorthand for the tap repo github.com/Shadow-Puppet/homebrew-yellowjacket. Brew auto-taps it, so there's no separate brew tap step. To build the tip of main instead of the latest release, add --HEAD.

How publishing works

This directory holds the canonical formula. The tap users install from lives in a separate repo — homebrew-yellowjacket — because Homebrew only discovers formulae from a repo whose name starts with homebrew-, with the formula at a top-level Formula/. Keeping it separate is also why nothing has to live in this repo's root.

On every version tag (v*), .gitea/workflows/homebrew-formula.yml:

  1. downloads the GitHub release tarball for that tag,
  2. computes its sha256,
  3. rewrites the version and sha256 lines in the formula, and
  4. commits the result to homebrew-yellowjacket's Formula/yellowjacket.rb.

So a normal release needs no manual formula edits — tag, and the tap updates itself. (This is the Homebrew equivalent of the Arch package's publish workflow.)

About the sha256

Homebrew re-downloads the source tarball on each install and refuses to build unless its checksum matches sha256 — integrity/tamper detection. The committed value here is a REPLACE_WITH_... placeholder on purpose; the real checksum is computed and injected by CI at release time, so it never has to be maintained by hand. (The Arch PKGBUILD sidesteps this with SKIP because it clones over git rather than downloading a tarball.)

One-time setup

  1. Create the tap repo: Shadow-Puppet/homebrew-yellowjacket on GitHub, with a main branch. It can start empty — the first tagged release seeds Formula/yellowjacket.rb.
  2. Add a CI secret: HOMEBREW_TAP_TOKEN — a GitHub token with write access to that repo (a fine-grained PAT scoped to homebrew-yellowjacket, Contents: read/write, is enough).

That's it. The source repo must be public (or the tap private with an authenticated brew install) for brew to fetch the release tarball.

Notes

  • License: declared as license :cannot_represent (custom license). Replace with the correct SPDX identifier once the license is finalized.
  • macOS vs Linux: wails build produces a YellowJacket.app bundle on macOS (installed under the Cellar with an exec shim in bin) and a bare yellowjacket binary on Linux (installed to bin).
  • Linuxbrew: building on Linux additionally needs the system WebKitGTK/GTK stack (webkit2gtk-4.1, gtk3, alsa-lib) — OS packages, not Homebrew deps. macOS needs only the Xcode Command Line Tools.
  • Cask alternative: if you later ship prebuilt macOS .dmg/.zip artifacts, a Homebrew cask pointing at those installs faster than this source build. This formula is the source-build path.