yonlu
08ff00f029
docs(09): create phase plan — 5 plans in 3 waves for scan cancellation & keyboard shortcuts
2026-03-06 13:20:35 -05:00
yonlu
71c200bc5b
docs(09): research phase domain
2026-03-06 11:39:48 -05:00
yonlu
170f6b1b84
docs(state): record phase 9 context session
2026-03-06 11:32:40 -05:00
yonlu
7c30e87895
docs(09): capture phase context
2026-03-06 11:32:22 -05:00
yonlu
e0b88f1a72
docs: create milestone v1.1 roadmap (6 phases)
2026-03-06 11:08:30 -05:00
yonlu
fc7ef4213f
docs: define milestone v1.1 requirements
2026-03-06 11:04:49 -05:00
yonlu
224411bbed
docs: complete v1.1 project research
2026-03-06 10:49:03 -05:00
yonlu
ac3bd4beb4
docs: start milestone v1.1 Features & Extensibility
2026-03-06 10:31:05 -05:00
yonlu
32a8d07644
fixed makefile to workaround obfuscation bug, changed gpu policy to fix wayland issue
2026-03-06 09:53:46 -05:00
github-actions[bot]
c6c5ece956
chore(release): 1.2.2 [skip ci]
...
## [1.2.2](https://github.com/onion-4-dinner/yellowjacket/compare/v1.2.1...v1.2.2 ) (2026-03-06)
### Bug Fixes
* recover from go-mp3 seek panic on startup ([#86 ](https://github.com/onion-4-dinner/yellowjacket/issues/86 )) ([2f9d9f8 ](https://github.com/onion-4-dinner/yellowjacket/commit/2f9d9f8508b90b6188fe894c282c5b8e330e8046 ))
2026-03-06 06:08:50 +00:00
logan
2f9d9f8508
fix: recover from go-mp3 seek panic on startup ( #86 )
...
The go-mp3 library (v0.3.4) has a bug where Seek panics with a slice
bounds error for certain byte positions. This crashes the app when
restoring a saved playback position on startup.
Add bounds clamping and a recover wrapper around the seek call in
seekLocked to convert the panic into a graceful error. When the seek
fails, playback starts from the beginning instead of crashing.
2026-03-06 00:08:11 -06:00
github-actions[bot]
82aef0825b
chore(release): 1.2.1 [skip ci]
...
## [1.2.1](https://github.com/onion-4-dinner/yellowjacket/compare/v1.2.0...v1.2.1 ) (2026-03-06)
### Bug Fixes
* **deps:** pin go-webview2 to v1.0.21 for Wails v2 compat ([25f0fe8 ](https://github.com/onion-4-dinner/yellowjacket/commit/25f0fe81560eeff36a0b2beb52ce1bdf13d5e122 ))
2026-03-06 01:35:02 +00:00
yonlu
4e4d1e078e
Merge pull request #85 from onion-4-dinner/fix/pin-go-webview2
...
fix(deps): pin go-webview2 to v1.0.21 for Wails v2 compat
2026-03-05 20:34:30 -05:00
yonlu
25f0fe8156
fix(deps): pin go-webview2 to v1.0.21 for Wails v2 compat
2026-03-05 20:25:20 -05:00
github-actions[bot]
f01d9c2090
chore(release): 1.2.0 [skip ci]
...
## [1.2.0](https://github.com/onion-4-dinner/yellowjacket/compare/v1.1.3...v1.2.0 ) (2026-03-06)
### Features
* **02-02:** add ScanWarning type and reclassify scan errors as warnings ([e6866de ](https://github.com/onion-4-dinner/yellowjacket/commit/e6866ded9dc0ea30ff942cd31b6c5ea3269e9584 ))
* **03-01:** create NewTestDB helper for in-memory SQLite test databases ([bae9d70 ](https://github.com/onion-4-dinner/yellowjacket/commit/bae9d70d23157ef4e79e60dd713d9a02ab63790b ))
* **03-01:** extract shared applyPRAGMAs and add production PRAGMAs to NewDB ([d348815 ](https://github.com/onion-4-dinner/yellowjacket/commit/d34881530adda7fb75be84737798da46d17bfa8c ))
* **06-01:** create track_metadata VIEW schema and migration 4 ([9c7e5a9 ](https://github.com/onion-4-dinner/yellowjacket/commit/9c7e5a96344a81bf132de487b4763f1dc3ff6df9 ))
* **06-02:** create Go→TypeScript event constant codegen tool ([3e9edd0 ](https://github.com/onion-4-dinner/yellowjacket/commit/3e9edd05e87395499ac24e456640d1f6d9b97f04 ))
* **06-03:** migrate lookupChunk to sqlc-generated LookupTrackMetaByPaths query ([2221a68 ](https://github.com/onion-4-dinner/yellowjacket/commit/2221a68459850a837c996c6e6d2bc95d41b20fb3 ))
* **08-01:** define design token CSS custom properties for icon sizes and type scale ([1444a66 ](https://github.com/onion-4-dinner/yellowjacket/commit/1444a66bb201ce5fdf16552a32bcd281089c64ed ))
* **08-04:** apply design tokens to cover-grid, track-list, queue-panel, and detail components ([1303422 ](https://github.com/onion-4-dinner/yellowjacket/commit/1303422e69c27d528363900b3ca5287a48cc9f8e ))
* **08-04:** convert sidebar em-based spacing to px and apply icon/type tokens ([aed90d7 ](https://github.com/onion-4-dinner/yellowjacket/commit/aed90d7b1710d0c5cece2e4956c0a6ce77b9a999 ))
* add scan progress bar with phase indicator ([a28b4d1 ](https://github.com/onion-4-dinner/yellowjacket/commit/a28b4d1e0673658824750d4c702359321dc9a78e ))
* **quick-001:** add multi-file picker and batch import support ([c34e4ad ](https://github.com/onion-4-dinner/yellowjacket/commit/c34e4ad029c119bff8f70a07ccc6bca58b11ea3c ))
* **quick-001:** regenerate bindings and update frontend for multi-import ([2a542bf ](https://github.com/onion-4-dinner/yellowjacket/commit/2a542bf3bcdc7772edb1aceb41f488774494f656 ))
* **quick-002:** add CountPlaylistsByName SQL query and regenerate sqlc ([04b2088 ](https://github.com/onion-4-dinner/yellowjacket/commit/04b2088b28b84a4d4df25b23d97112c5a955dff1 ))
* **quick-002:** add uniquePlaylistName helper and wire into ImportPlaylist ([8ba8bbe ](https://github.com/onion-4-dinner/yellowjacket/commit/8ba8bbe7bed2ecff97613ebaa42a49a662050353 ))
* **quick-006:** remove list icon from playlists, add favorites icon to default ([3c19766 ](https://github.com/onion-4-dinner/yellowjacket/commit/3c19766fd0885d4171cf9929db6d69a3d5c1a3ff ))
* **quick-11:** add configurable log level via YJ_LOG_LEVEL env var ([55b4902 ](https://github.com/onion-4-dinner/yellowjacket/commit/55b4902fac7b7f2c04ad5efac398ecedc5fedc2f ))
* **quick-11:** add make dev-debug target for verbose logging ([c45bca4 ](https://github.com/onion-4-dinner/yellowjacket/commit/c45bca411ba1d4f32deea6027acf91237173dd15 ))
* **quick-12:** add favorite icon to album dropdown track rows ([12a0bbc ](https://github.com/onion-4-dinner/yellowjacket/commit/12a0bbc89c19128485d597a61bd16bd0786450ad ))
* **quick-15:** add BufferedStreamer with goroutine read-ahead ([85b23ac ](https://github.com/onion-4-dinner/yellowjacket/commit/85b23acb24a048d2f7b85808e477bb991ae124e6 ))
* **quick-15:** insert BufferedStreamer into player pipeline and increase speaker buffer ([8a0b16a ](https://github.com/onion-4-dinner/yellowjacket/commit/8a0b16a4ec08a95bfd3834c8216e21dce854432d ))
* **quick-3:** add playlist-level multi-select state and selection handling ([e13151f ](https://github.com/onion-4-dinner/yellowjacket/commit/e13151ffa5dc86e41ce242421679d65a740c3af0 ))
* **quick-3:** wire playlist context menu for batch delete of selected playlists ([c92ced2 ](https://github.com/onion-4-dinner/yellowjacket/commit/c92ced2c74e72bfc123c880c047462dc969cde34 ))
* **quick-4:** add 'Set as Default Playlist' context menu option ([9971b63 ](https://github.com/onion-4-dinner/yellowjacket/commit/9971b635b81fe3f8621c80a6664eccb3e1fc4bb8 ))
* **quick-5:** add CreatedAt/UpdatedAt to playlist Summary struct ([bdaff47 ](https://github.com/onion-4-dinner/yellowjacket/commit/bdaff478e802ee5c0745327c52dd9b190fcfef7d ))
* **quick-5:** add sort dropdown UI and client-side sorting to playlist view ([5c07485 ](https://github.com/onion-4-dinner/yellowjacket/commit/5c074855351f1363cc7918837a78bbd3c0b7ebf5 ))
* **quick-7:** add PinDefault config field with backend getter/setter ([6e123bd ](https://github.com/onion-4-dinner/yellowjacket/commit/6e123bd47f55e6d565f20bf7f19950e65f80787f ))
* **quick-7:** wire frontend pin-default-playlist feature end-to-end ([e6378e1 ](https://github.com/onion-4-dinner/yellowjacket/commit/e6378e1f0d3b0f2a7604b8ef6097dba9050cdd16 ))
* **quick-8:** add FindDuplicateTracksInPlaylist backend method ([83de934 ](https://github.com/onion-4-dinner/yellowjacket/commit/83de934c39ca7d850a8b5925c90e6d0b3fe0a487 ))
* **quick-8:** create duplicate-tracks-dialog component ([9f3ba2b ](https://github.com/onion-4-dinner/yellowjacket/commit/9f3ba2b9d474fa30dcb4934b01d4650e0d0d3cba ))
* **quick-8:** wire duplicate detection into playlist-picker and playlist-view ([917a79a ](https://github.com/onion-4-dinner/yellowjacket/commit/917a79a8d6e30dddd2170323bb26692386794872 ))
### Bug Fixes
* **01-01:** add mutex protection to Queue, Library, and Playlist SetContext methods ([daaa6b7 ](https://github.com/onion-4-dinner/yellowjacket/commit/daaa6b7f9779385979fe9dddae4e7bb388b3e5fb ))
* **01-01:** collapse Player.SetContext double-lock into single acquisition ([3abaeba ](https://github.com/onion-4-dinner/yellowjacket/commit/3abaeba3afb0f4d0edb81e26ca55b31bf59990ac ))
* **02-01:** eliminate package-level startupErr and fix config file permissions ([2a86408 ](https://github.com/onion-4-dinner/yellowjacket/commit/2a864082017e489ffa086c136f1002277a77a7c4 ))
* **02-01:** log MPRIS callback errors instead of discarding them ([0860b2f ](https://github.com/onion-4-dinner/yellowjacket/commit/0860b2fd4b2250da1eeb80c21f14fdf341697501 ))
* **08-02:** revert repeat() inside lit-virtualizer, restore .renderItem + .keyFunction ([72ef719 ](https://github.com/onion-4-dinner/yellowjacket/commit/72ef719ba70eeca0fa4bae47df092706f6fbaeed ))
* drop+recreate contentless FTS5 index instead of DELETE ([8e9a616 ](https://github.com/onion-4-dinner/yellowjacket/commit/8e9a61603779eacbee7013b9bc760b315baf782a ))
* **frontend:** reposition search indicator into toolbar and fix album cover art lookup ([a29137b ](https://github.com/onion-4-dinner/yellowjacket/commit/a29137b2ba4c6b33ce9a5f868cbd6013e0e3b116 ))
* include full track metadata in GetAudioFilesByReleaseGroup query ([97f256d ](https://github.com/onion-4-dinner/yellowjacket/commit/97f256d67f463d752f7adc5b400c4bf34eae1df1 ))
* **quick-10:** add migration 5 and fix entity cache for composite album key ([d43ba7b ](https://github.com/onion-4-dinner/yellowjacket/commit/d43ba7bd0c7ace2a9ed71990a19498f8e9f90751 ))
* **quick-10:** update release_groups schema and queries for composite uniqueness ([999ab96 ](https://github.com/onion-4-dinner/yellowjacket/commit/999ab967beb9107a3f30ba287acbffad22f0b0de ))
* **quick-13:** resolve lint issues in main source files ([e1a95e6 ](https://github.com/onion-4-dinner/yellowjacket/commit/e1a95e65a9f0f436b2e2d92befa9c881b6e8e430 ))
* **quick-14:** add roll-back-on-failure to queue index advancement ([2820de2 ](https://github.com/onion-4-dinner/yellowjacket/commit/2820de2510560fcd6d1015c18542d5ac30468247 ))
* **quick-9:** set fixed height on queue track items for stable virtualizer scroll ([ebde5e5 ](https://github.com/onion-4-dinner/yellowjacket/commit/ebde5e5a8bc4da8f40bef8f171c7ed86c213a336 ))
### Performance
* **07-01:** add incremental persistence helpers for queue mutations ([cdd17db ](https://github.com/onion-4-dinner/yellowjacket/commit/cdd17db27509908514c21517631306655a2b3bd7 ))
* **07-01:** eliminate redundant lookups in SetQueue Phase 2 ([ced58fe ](https://github.com/onion-4-dinner/yellowjacket/commit/ced58fe6a93d6f220137562b8ff09ffc33c69266 ))
* **07-02:** defer eagerFetch to after DOM ready for instant app shell ([cd98ad6 ](https://github.com/onion-4-dinner/yellowjacket/commit/cd98ad6dc8c2e4e6e0f01a48099b0c0511bf5a98 ))
* **08-01:** add queueMicrotask coalescing to library store and debounce search input ([3bf66ed ](https://github.com/onion-4-dinner/yellowjacket/commit/3bf66ed125ed55bfbde95b0bc973710c2f2243b8 ))
* **08-02:** migrate cover-grid, artists-view, and genres-view virtualizers to repeat() directive ([1c3514d ](https://github.com/onion-4-dinner/yellowjacket/commit/1c3514da1d0491b9758d7a6f9f72d59ef78fc8ed ))
* **08-02:** migrate track-list and queue-panel virtualizers to repeat() directive ([d2d7d8c ](https://github.com/onion-4-dinner/yellowjacket/commit/d2d7d8c6ce22923772cae4858b02804d15f74bb7 ))
* **08-03:** optimize column rendering and apply classMap to queue-panel renderTrackItem ([62f41c2 ](https://github.com/onion-4-dinner/yellowjacket/commit/62f41c24910632b270f9f5765e20e48db4b95ec9 ))
* **08-03:** replace class string construction with classMap directive in renderTrackRow ([ad21027 ](https://github.com/onion-4-dinner/yellowjacket/commit/ad210278fc20729dc76390e6bba9bff050549046 ))
### Refactoring
* **06-01:** consolidate search queries to use track_metadata VIEW ([9159b40 ](https://github.com/onion-4-dinner/yellowjacket/commit/9159b409dcd2afaa7dcc97bf5b0694edf85f06a4 ))
* **quick-14:** make playOrLoadCurrentTrack and playCurrentTrack return bool ([6eeddda ](https://github.com/onion-4-dinner/yellowjacket/commit/6eeddda97669258cc5b7ba175a3c98d598a2871f ))
2026-03-06 00:28:28 +00:00
yonlu
f68c3a3a84
Merge pull request #84 from onion-4-dinner/wip
...
feat: lots of stuff
2026-03-05 19:27:57 -05:00
yonlu
b725b801c1
fix CI: skip metadata tests when test_data is absent, use fmt.Fprintf in genevents
2026-03-05 19:11:56 -05:00
yonlu
517c1685d8
ran go mod tidy
2026-03-05 18:49:09 -05:00
yonlu
b8277326ee
Merge branch 'main' into wip
2026-03-05 18:19:35 -05:00
yonlu
6c7cd65a3e
chore: remove stale plan files from .opencode/plans
2026-03-05 16:09:55 -05:00
yonlu
2e6ec94be7
docs(quick-13): add orphaned plan file for completed lint fix task
2026-03-05 16:09:39 -05:00
yonlu
727381c9e5
chore: remove stale planning and config files
2026-03-05 16:08:02 -05:00
yonlu
a29137b2ba
fix(frontend): reposition search indicator into toolbar and fix album cover art lookup
...
Move search indicator from absolute-positioned overlay into sort toolbar
(or dedicated search-bar-row for artists/genres views). Shows indicator
on empty-state screens. Fix cover art not displaying for expanded album
tracks by checking expandedAlbumId before the albumName guard. Add
ScanWarning model bindings.
2026-03-05 16:07:54 -05:00
yonlu
6977ba8bc1
docs(quick-15): Fix audio glitches and skips in decoding/playback pipeline
2026-03-05 15:30:03 -05:00
yonlu
6cb22359c8
docs(quick-15): complete audio glitch fix plan
...
- Add 15-SUMMARY.md with implementation details
- Update STATE.md with quick task 15 completion
2026-03-05 15:29:39 -05:00
yonlu
8a0b16a4ec
feat(quick-15): insert BufferedStreamer into player pipeline and increase speaker buffer
...
- BufferedStreamer wraps resampled streamer with 2s read-ahead buffer
- Speaker buffer increased from 100ms to 200ms for secondary protection
- Close old BufferedStreamer on track change and unload to prevent goroutine leaks
- Streamer chain: decode -> resample -> BufferedStreamer -> ctrl -> volume -> speaker
2026-03-05 15:28:28 -05:00
yonlu
85b23acb24
feat(quick-15): add BufferedStreamer with goroutine read-ahead
...
- Ring-buffer streamer decouples source I/O from speaker callback
- Read-ahead goroutine pre-fills buffer in 512-sample chunks
- Returns silence when buffer temporarily empty (prevents glitches)
- Close() signals goroutine shutdown via channel
- 5 unit tests: basic stream, small reads, drain, silence, close
2026-03-05 15:27:24 -05:00
yonlu
8f16463fdd
docs(quick-14): fix queue/player desync after hot reload
2026-03-05 15:05:17 -05:00
yonlu
97c135766b
docs(quick-14): complete queue/player desync fix plan
2026-03-05 15:04:39 -05:00
yonlu
2820de2510
fix(quick-14): add roll-back-on-failure to queue index advancement
...
- Next() rolls back currentIndex and skips emitIndexChanged on load failure
- Previous() applies same pattern to all three branches (RepeatOne, restart, navigate)
- OnPlaybackFinished() rolls back currentIndex on playCurrentTrack failure
- PlayIndex() and playFromStart() also guard against load failures
- RepeatOne paths guard emitIndexChanged with the bool return value
2026-03-05 15:03:29 -05:00
yonlu
6eeddda976
refactor(quick-14): make playOrLoadCurrentTrack and playCurrentTrack return bool
...
- playCurrentTrack returns false on load failure or play error
- playOrLoadCurrentTrack propagates bool from load/play helpers
- loadCurrentTrack already returned bool — no change needed
2026-03-05 15:02:11 -05:00
yonlu
e743294406
docs(quick-13): complete fix linting issues plan
...
- Add 13-SUMMARY.md with execution details
- Update STATE.md with quick task 13 entry
2026-03-05 14:09:48 -05:00
yonlu
e1a95e65a9
fix(quick-13): resolve lint issues in main source files
...
- Fix errcheck for db.Close() in testhelper.go
- Fix errcheck, nlreturn, wsl, gofumpt issues in genevents/main.go
- Fix gofumpt and wsl issues in library.go
2026-03-05 14:07:50 -05:00
yonlu
97f256d67f
fix: include full track metadata in GetAudioFilesByReleaseGroup query
...
The GetAudioFilesByReleaseGroup SQL query only selected 6 columns,
missing audio properties (sample_rate, bit_depth, channels, bitrate,
file_size) and metadata (album, genre, year, composer, file_type).
This caused track details opened from the album view to show dashes
instead of actual values. Expanded the query to match
GetAllTracksWithFullMetadata and updated GetAlbumTracks to use the
shared mapTrackRow helper.
2026-03-05 13:34:03 -05:00
yonlu
3e9c143a6e
docs(quick-12): Add favorite icon to album grid track list dropdown
2026-03-05 11:44:52 -05:00
yonlu
06d2c4702e
docs(quick-12): complete add favorite icon to album dropdown plan
2026-03-05 11:44:28 -05:00
yonlu
12a0bbc89c
feat(quick-12): add favorite icon to album dropdown track rows
...
- Add FavoritesController and classMap imports
- Add .fav-icon CSS with compact sizing (18px/11px) for dropdown context
- Insert heart/star icon between track number and title
- Click toggles favorite with stopPropagation to avoid track selection
2026-03-05 11:43:31 -05:00
yonlu
a28b4d1e06
feat: add scan progress bar with phase indicator
...
Add live progress reporting during library scans:
- Pre-walk count: fast WalkDir to count audio files upfront for
percentage calculation (~1-2s overhead)
- Progress ticker: emits ScanProgress events every 300ms with
phase, file counts (added/skipped/updated), and total
- Phase labels: counting → scanning → thumbnails → orphans
- Frontend: progress bar with percentage, file counts breakdown,
and phase indicator in both config-page and library-manager
Replaces the static 'Scanning...' text with a live progress bar
showing e.g. '62% — Scanning... 1,247 / 2,013 files (891 new,
356 skipped)'
2026-03-05 11:21:53 -05:00
yonlu
a2975531f4
docs(quick-11): Investigate and fix neovim crash during library scan
2026-03-05 11:10:34 -05:00
yonlu
fd367de80e
docs(quick-11): complete fix neovim crash during library scan plan
...
- Add 11-SUMMARY.md with execution results
- Update STATE.md with quick task 11 entry and session info
2026-03-05 11:10:15 -05:00
yonlu
c45bca411b
feat(quick-11): add make dev-debug target for verbose logging
...
- New dev-debug target sets YJ_LOG_LEVEL=debug for full debug output
- Existing dev target unchanged (now quieter by default due to Info level)
2026-03-05 11:08:49 -05:00
yonlu
55b4902fac
feat(quick-11): add configurable log level via YJ_LOG_LEVEL env var
...
- Change dev mode default from Debug to Info to prevent stdout flooding
- Add resolveLogLevel() function with YJ_LOG_LEVEL env var support
- Accept debug/info/warn/error values (case-insensitive)
- Prevents neovim display corruption during library scans
2026-03-05 11:08:30 -05:00
yonlu
fe7cba86b4
docs: update STATE.md for FTS5 contentless fix
2026-03-05 10:42:12 -05:00
yonlu
8e9a616037
fix: drop+recreate contentless FTS5 index instead of DELETE
...
The search_index is a contentless FTS5 table (content=''), which
SQLite does not support DELETE on. ClearSearchIndex now drops and
recreates the virtual table. Single-row DeleteSearchIndex becomes
a no-op since contentless FTS5 also cannot delete individual rows;
stale entries are harmless (search JOINs filter them out) and the
index is fully rebuilt during FullRescan.
2026-03-05 10:41:55 -05:00
yonlu
2439c2a728
docs(quick-10): diagnose duplicate album merging bug - albums with same name but different artists shown as single entry
2026-03-05 10:27:25 -05:00
yonlu
1b33923980
docs(quick-10): complete fix duplicate album merging bug plan
...
- Add 10-SUMMARY.md with full execution details
- Update STATE.md with quick task 10 entry and session info
2026-03-05 10:26:57 -05:00
yonlu
d43ba7bd0c
fix(quick-10): add migration 5 and fix entity cache for composite album key
...
- Migration 5 rebuilds release_groups with UNIQUE(name, album_artist_credit_id)
- Drops and recreates track_metadata VIEW during table rebuild
- Temporarily disables FK checks for safe table rebuild
- Entity cache now keys by album name + artist credit ID
- Update tests to use composite cache keys
2026-03-05 10:25:53 -05:00
yonlu
999ab967be
fix(quick-10): update release_groups schema and queries for composite uniqueness
...
- Change UNIQUE(name) to UNIQUE(name, album_artist_credit_id) in schema
- Update UpsertReleaseGroup ON CONFLICT to match composite key
- Rename GetReleaseGroupByName to GetReleaseGroupByNameAndArtist with two params
- Regenerate sqlc code
2026-03-05 10:23:25 -05:00
yonlu
dff625a568
docs(quick-9): complete fix queue panel scroll bar plan
...
- Add 9-SUMMARY.md with execution results
- Update STATE.md with quick task 9 entry
2026-03-05 09:41:18 -05:00
yonlu
ebde5e5a8b
fix(quick-9): set fixed height on queue track items for stable virtualizer scroll
...
- Add height: 49px and overflow: hidden to .track-item CSS
- Add overflow: hidden to .track-details CSS
- Fixed height ensures lit-virtualizer _scrollSize is stable from first render
- Prevents scrollbar lag on large queues (20k+ tracks) caused by dynamic item size averaging
2026-03-05 09:40:10 -05:00