Scoped library payloads: load the track list when a view needs it #287
Open
yonlu
wants to merge 10 commits from
perf/279-284-scoped-library-payloads into main
pull from: perf/279-284-scoped-library-payloads
merge into: yonlu:main
yonlu:main
yonlu:batch/274-276-slskd
yonlu:batch/258-272
yonlu:fix/263-slskd-transfer-lifecycle
yonlu:fix/271-slskd-search-recall
yonlu:fix/270-slskd-candidate-shape
yonlu:build/265-go-1.26
yonlu:feat/264-explore-cards
yonlu:fix/258-artifact-blob-cursor
yonlu:docs/256-claude-md-split
yonlu:batch/248-249
yonlu:fix/248-artist-metadata-sweep
yonlu:fix/247-cover-art-orphans
yonlu:fix/249-unbounded-growth
yonlu:fix/246-incremental-scan-phantoms
yonlu:fix/183-phantom-across-retire
yonlu:fix/243-model-fallback
yonlu:feat/31-play-all-shuffle-all
yonlu:fix/240-loop-operational-fixes
yonlu:docs/220-skill-check-scope
yonlu:fix/231-setter-rollback
yonlu:fix/197-duplicate-column-label
yonlu:fix/175-wizard-follows-the-library
yonlu:fix/146-stub-etxtbsy
yonlu:docs/225-fixtures-wav-tags
yonlu:feat/238-merge-leg-refresh-watch
yonlu:feat/236-autonomous-backlog-loop
yonlu:test/217-fixture-names-in-queue-selection
yonlu:fix/216-riff-parse-allocation
yonlu:fix/170-queue-header-action-names
yonlu:fix/210-nav-sheet-scroll-affordance
yonlu:docs/50-readme-landing-page
yonlu:feat/65-art-prefetch-ahead
yonlu:feat/71-more-as-a-bottom-sheet
yonlu:feat/54-native-touch-feel
yonlu:feat/67-entity-links-into-menus
yonlu:test/196-visual-tier-gates
yonlu:fix/138-ui-test-storage-leak
yonlu:fix/104-wav-tags-read
yonlu:fix/207-sheet-scroll-affordance
yonlu:fix/204-ui-visual-update-filter
yonlu:pi-agent-backlog-automation
yonlu:63-touch-model-phase-2
yonlu:63-android-touch-model
yonlu:186-touch-targets-settings
yonlu:186-touch-targets-page-header
yonlu:187-seek-bar-hit-area
yonlu:189-190-explore-correctness
yonlu:135-android-underrun-instrumentation
yonlu:51-android-small-screens
yonlu:fix/171-phone-queue-scrim
yonlu:fix/137-touch-only-affordances
yonlu:fix/154-nested-css-check
yonlu:feat/58-mini-player-progress-line
yonlu:fix/66-album-page-scrolls-as-one
yonlu:60-context-menu-action-sheet
yonlu:64-android-system-volume
yonlu:59-slim-the-mini-player
yonlu:55-queue-as-a-screen
yonlu:feat/57-drop-the-android-top-bar
yonlu:feat/62-jobs-as-a-notification
yonlu:fix/53-seek-bar-never-moves
yonlu:fix/159-android-task-app-id
yonlu:fix/52-android-activity-recreation-restarts-the-process
yonlu:fix/150-expand-button-under-the-art
yonlu:feat/42-inline-volume-and-centred-transport
yonlu:fix/156-queue-selection-fixture-order
yonlu:fix/151-fuse-the-scroll-guard-and-the-write
yonlu:fix/43-queue-panel-selection
yonlu:fix/143-top-bar-fits-its-window
yonlu:feat/27-jobs-into-settings
yonlu:feat/25-configurable-sidebar-tabs
yonlu:feat/6-global-back-forward
yonlu:fix/72-active-view-broadcast
yonlu:fix/69-page-header-action-overflow
yonlu:fix/quick-wins-batch
yonlu:fix/118-in-library-clear
yonlu:fix/61-mini-player-plain-text
yonlu:fix/68-hover-affordances-pointer
yonlu:fix/119-dev-headless-port
yonlu:fix/130-issue-claim-user
yonlu:fix/131-codegen-check-scope
yonlu:feat/28-autotag-match-on-album
yonlu:feat/17-demote-version-selector
yonlu:feat/38-ownership-visibility
yonlu:ci/115-manual-release
yonlu:feat/34-icon-language
yonlu:feat/7-full-tracklist-toggle
yonlu:fix/16-tagwriter-totals
yonlu:fix/unclaim-ca-certs
yonlu:fix/unclaim-shell
yonlu:ci/unclaim-on-close
yonlu:docs/closing-keyword
yonlu:docs/retire-stale-planning-docs
yonlu:docs/issue-driven-workflow
yonlu:integration/small-fixes
yonlu:fix/small-issue-batch
yonlu:fix/queue-toggle-state
yonlu:fix/drag-count-badge
yonlu:fix/album-card-year
yonlu:fix/album-tracklist-heading
yonlu:fix/seek-bar-clock-width
yonlu:fix/explore-art-scanner-requests
yonlu:chore/workflow-guardrails
No Reviewers
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#287
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
One PR so the batch lands as one release rather than seven. The design, the before/after numbers and the things worth keeping are in
.planning/NOTES.md("What the library payloads actually cost, measured 2026-10-05").Why: the app held ~830 MB on a real library, and almost all of it was one decision — every track in the library was fetched at launch, as one JSON object per track, whether or not anything was showing it. The reasons were real: track details looked a path up in that array, so it had to be loaded, and views took seconds when they fetched on mount, so loading it early was the fix. Both are answered directly now.
What is in it
Two
fixes, so semantic-release will cut a patch. Nothing here changes a user-visible default.Measured (50 000-track bulk seed, desktop dev build,
e2e/perf/measure.mjs, which grew amemorysection for this):The one number that got worse is the honest trade: Tracks now fetches when it is opened instead of having been paid for at launch. A raw binding call for the same table is 1 118–1 382 ms, so essentially none of that second is the decode or the render — it is the Go-side query, the column encode, and Wails encoding every result twice for a debug log that is off (#286). Hovering or tab-focusing the nav item prefetches, which is the ~100 ms before the click. #285 tracks windowed loading if a library ever outgrows the table.
Verified locally on this exact tree:
make lint— 0 issues across all three build configurations (Go 1.26.0, the version CI pins)make test— all three passes with-race; two consecutive clean runsmake ui-test— 1180 passed, 112 files (see the caveat below)make e2e(chromium, seeded headless app) — 259 passedmake bindings-check,make skill-check,make commit-check— cleanTwo things a reviewer should know:
make ui-testis flaky on this workstation, not on this branch. At load average ~14 the browser provider's module fetches fail in a different handful of files each run ("Failed to import test file", "Cannot connect to the iframe") while every test that runs passes;--maxWorkers=1 --retry=2reduces it and each file passes alone. The first full green run (1180/1180) was before the machine got busy. WebKit is CI-only, as always.make testrun out of three failed and the log is gone — the two runs after it were clean, so I cannot name the package. Recorded rather than hidden.Closes #279, #280, #281, #282, #283, #284.
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.