logan 68468e5378 feat(dev): an Android failure looks exactly like a success
The APK installs and launches. It also dies six milliseconds later, and
finding that out cost a cycle for three reasons that have nothing to do
with the bug itself:

**Go's stdout does not reach logcat.** An Android app's fd 1 and 2 go
to /dev/null, so every slog line -- including the one naming the error
the app is about to exit on -- is discarded. `setprop
log.redirect-stdio true` does not help: that redirects the Java
runtime's System.out, and our code is a c-shared native library.

**os.Exit leaves no evidence.** No panic, no AndroidRuntime stack,
nothing in /data/tombstones, nothing in `logcat -b crash` or dropbox.
All three places anyone would look are empty, and the one signal that
is present -- "Zygote: exited due to signal 9" -- reads as "the system
killed it" and sends you after the low-memory killer.

**ActivityManager restarts it faster than you can observe.** pidof
always answers and `am start` always reports Status: ok, so a
crash-looping app looks alive. "Did it start" is the wrong question;
`make android-smoke` asks whether it is the *same pid* N seconds later,
and prints the filtered logcat plus how to read it when it is not.

The tell, once known: "I/WailsBridge: Wails bridge initialized"
followed immediately by a new pid doing the same thing.

scripts/android-emulator.sh follows dev-headless.sh's shape --
background start, saved-PID stop, filtered log tail, never pkill -f.
Two scaffold tasks are deliberately not wrapped: `android:logs` greps
logcat for (Wails|yellowjacket), which catches the WailsBridge tag but
misses the app's own process tag (app.yellowjacket is lowercase) and
misses ActivityManager's "has died" line, which is the one that says it
crashed; and `ensure-emulator` boots whatever `-list-avds | tail -1`
returns, with no pidfile and no boot wait, so it cannot be sequenced.

One environment note that is not obvious on Arch: Gradle needs a
platform and /opt/android-sdk has none, so ANDROID_SDK defaults to
~/Android/Sdk while ANDROID_NDK points at /opt/android-ndk. Two SDKs,
one for each half of the build.
2026-08-16 15:31:18 -04:00
2026-08-16 14:09:12 -04:00
2026-08-16 14:09:12 -04:00
2026-03-20 19:03:30 +00:00
2026-08-14 14:01:02 -04:00

YellowJacket

Music how it was meant to bee.

YellowJacket is a fast, cross-platform desktop music player for your local collection. It plays your files, keeps your library tidy, and helps you discover and organize your music — all in a clean, responsive interface. No accounts, no streaming, no telemetry: just your music on your machine.

Runs on Linux, macOS, and Windows.

Features

Play your music

  • Plays MP3, FLAC, OGG Vorbis, and WAV
  • Play, pause, seek, and volume control with a mute toggle
  • Gapless, glitch-free seeking backed by a read-ahead buffer
  • A queue you can add to, reorder, and shuffle, with play-next support
  • Shuffle and repeat (off / all / one)
  • Picks up right where you left off — remembers your track, position, and volume between sessions
  • Media-key and MPRIS support on Linux, so your desktop's playback controls just work

Keep your library organized

  • Point it at your music folders and it scans them automatically
  • Reads tags and embedded cover art, and de-duplicates artwork so it isn't stored twice
  • Incremental sync — only new or changed files get reprocessed, and deleted files are cleaned up
  • Browse by album, artist, or genre, or search across everything
  • Mark favorites and see what you've been listening to with play history
  • Edit track tags directly when something's off

Playlists

  • Create playlists, drag tracks in, and reorder them
  • Smart playlists that build themselves from rules (by genre, rating, play count, and more)
  • Pin a default playlist and spot duplicate tracks at a glance

Discover and clean up (powered by MusicBrainz)

  • Explore — browse artists, releases, and genres from the MusicBrainz catalog, not just what's already in your library
  • Auto-tag — match your files against MusicBrainz to fill in correct artist, album, and track metadata, with a review step before anything is written
  • Lyrics search — find a track by a line you remember

Install

Download the latest build for your platform from the releases page.

Platform Download
Linux yellowjacket-linux-amd64
macOS yellowjacket-darwin-universal.app.zip (Apple Silicon + Intel)
Windows yellowjacket-windows-amd64.exe

Prefer to build it yourself? See Building from source.

Getting started

  1. Launch YellowJacket.
  2. Open Settings and add the folder(s) where your music lives.
  3. Let the initial scan finish — you'll see progress as it works.
  4. Browse by album, artist, or genre, queue something up, and press play.

Your library and settings are stored locally:

Linux / macOS Windows
Config ~/.config/yellowjacket/ %LOCALAPPDATA%\yellowjacket\config
Library data ~/.local/share/yellowjacket/ %LOCALAPPDATA%\yellowjacket\data

Building from source

YellowJacket is built with Go and a Lit/TypeScript frontend, bridged by the Wails framework.

Prerequisites

Tool Version
Go 1.25+
Node.js 22+
pnpm 10+
Wails CLI v3 — vendored, no install needed (go tool wails3)

The Wails v3 CLI resolves from the tool block in go.mod, so there is nothing to install globally; make setup fetches it with the rest of the tooling.

On Linux, install the system libraries Wails needs. v3 builds against GTK4 + WebKitGTK 6.0 by default:

sudo apt-get install libasound2-dev libgtk-4-dev libwebkitgtk-6.0-dev   # Debian/Ubuntu
sudo pacman -S alsa-lib gtk4 webkitgtk-6.0                              # Arch

A machine without webkitgtk-6.0 can still build with -tags gtk3 against the older WebKit2GTK 4.1 stack, but that is an escape hatch, not what CI or a release builds.

macOS and Windows need no extra system packages. Run go tool wails3 doctor to check your environment.

Build

make setup        # install tooling and git hooks
make dev          # run with hot-reload
make build-prod   # produce a release binary

More detail for contributors lives in docs/dev/overview.md and CLAUDE.md.

S
Description
No description provided
Readme
16 MiB
v0.7.0
Latest
2026-08-26 16:03:22 +00:00
Languages
TypeScript 50.8%
Go 43.5%
Java 1.8%
JavaScript 1.5%
Shell 1.4%
Other 0.8%