diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c669f69..e88425a 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,7 +9,11 @@ on:
release_tag:
description: Version tag matching source/host/Cargo.toml
type: string
- default: v0.3.0
+ default: v0.4.0
+ pull_request:
+ paths:
+ - source/host/Cargo.toml
+ - .github/workflows/release.yml
push:
tags: ['v*']
permissions:
diff --git a/Cargo.lock b/Cargo.lock
index 969937d..51813c3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -552,7 +552,7 @@ dependencies = [
[[package]]
name = "pioneer-companion-host"
-version = "0.3.0"
+version = "0.4.0"
dependencies = [
"axum",
"futures-util",
diff --git a/README.md b/README.md
index 5f44bb4..25bf3ca 100644
--- a/README.md
+++ b/README.md
@@ -4,16 +4,15 @@ Give your old CDJs a makeover! OneLibraryCompanion (OLC) reads Rekordbox One Lib
OLC runs on Mac or Raspberry Pi, alongside your players. You keep playback, cueing and mixing on the CDJs. You can use an iPad as the display or any other tablet by connecting to your Mac or RPi via the local network.
-## What's new in 0.3.0
+## What's new in 0.4.0
-- **Automatic CDJ discovery:** find players on the local network and reconnect when the connection changes.
-- **Browser audio preview:** listen to library tracks on your browser device, with artwork, waveforms and seeking.
-- **Automatic set capture:** record performances automatically, split or join sessions, and keep reusable tracklists.
-- **Headless Pi controls:** restart OLC, shut down the host and safely unmount USBs from MENU.
-- **Connection reliability:** more stable local USB loading and automatic retries for failed analysis reads.
-- Other various performance and reliability improvements.
+- **Flexible display sizing:** automatic window fitting and five resolution presets.
+- **Extra-wide CDJ STATUS:** side-by-side decks with switchable beat phase or reference waveform comparisons.
+- **Clearer track information:** My Tag chips near the top, full metadata and a scrollable panel that fits the screen.
+- **Sharper scaled waveforms:** rendering follows the display scale and window resizing.
+- **Browse recovery:** temporary library-source connection errors clear after a successful retry.
-[Detailed 0.3.0 release notes](docs/release-notes.md).
+[Detailed 0.4.0 release notes](docs/release-notes.md).
## Key features
@@ -62,10 +61,10 @@ OLC captures your tracklist automatically while you play. Edit and share saved s
### Headless Raspberry Pi
1. Set up a Pi 4 or 5 with **64-bit Raspberry Pi OS Lite Bookworm or later**, network access and SSH. Set its hostname to **OLC** to use the address below.
-2. Download the **0.3.0 ARM64 host package** from Releases. In its download folder, run these commands over SSH as the ordinary account that will run OLC:
+2. Download the **0.4.0 ARM64 host package** from Releases. In its download folder, run these commands over SSH as the ordinary account that will run OLC:
```sh
- sudo apt install ./onelibrarycompanion-host_0.3.0_arm64.deb
+ sudo apt install ./onelibrarycompanion-host_0.4.0_arm64.deb
sudo loginctl enable-linger "$(id -un)"
systemctl --user enable --now olc-host.service
hostname -I
diff --git a/SOURCE-MANIFEST.sha256 b/SOURCE-MANIFEST.sha256
index ada3008..bf46ed6 100644
--- a/SOURCE-MANIFEST.sha256
+++ b/SOURCE-MANIFEST.sha256
@@ -1,20 +1,20 @@
-b1c7a9ccd4ebfd8c6f988e56139986346d54677624b59bd50d589781b4a0d635 .github/workflows/check.yml
-156381a1baa4750e03a489bb85f34328f3fcec0321682ca00ff9734ce8569766 .github/workflows/release.yml
+630f48170d5f432e2c6a3c06496fba7055e0c4f917737eb467ec8af6346e8f5c .github/workflows/check.yml
+4b6ba89fa2049f542b8cdc293f3dd7ae88635371aa86d71b402692a3d5c6a296 .github/workflows/release.yml
2a21bd43e4c34b3e47029b03b347074133a777fe9266f569fd560d90225d0acf .gitignore
d81fcdcd476394c6c088c3518c68127e087cdef021283ed6ba35fb3188c21cbb AGENTS.md
-f1121fd81f7e1d0876b894da7ef3f3ed2db0c35569ecf0109eba198638e438c5 Cargo.lock
+edc1956a0cc18490d08414976cb543beaa2535c86b5119db4f33117e1cf93db8 Cargo.lock
f6c0c1760e083137e37a4637ff8aa77fcbf9f157fde5bbcd02ae7bfbe11bbcaa Cargo.toml
3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986 LICENSE
-cbe72f5fae4d8a7fc8ff0f53257d7bb6c1943579d7582747532a241e6aa58681 README.md
+2fbc70c04d606676edaaf6e3be6b3bb3c641e70f0690df785788c58e9f5b111b README.md
cdd83203fb0ad6c780ba6d35c657a277f44178dfa576bd387a9433840b323c27 THIRD_PARTY_NOTICES.md
3e9a2262238b7d59134fa7b0d23ac0fa274ccb8b6a9a3a7563e700b86eebaa5c docs/architecture.md
-f51d229d839a14aa397245ee0ac538e4900c6228904639c3748585a65db4ad7d docs/compatibility.md
-7b61a9b534ccd58b2451e7d4d32f0763e8d3483489ffbbe672eb3315cf24c4ea docs/configuration.md
-9c6fdccf2c9f8b6b538f094e80813181a00499ccd072766b84256d89e6f94aac docs/development.md
-5460927f8bd1d7e5863cfc8ba29dd42c786621804b8ba45df1b48c2a1f3fe7f3 docs/distribution.md
+b1c6ec6f8939be4ef2251ef7dd37274f7e748be3c8bb066555763c94f709c244 docs/compatibility.md
+3df0000ad0bd856d3b24ba8a62495df92586a76fb83fff5c55ba52d626d90a8b docs/configuration.md
+c0e9cb68db0198bb6a5e9477b7eb45de419da320e642e6035cad22226467c60c docs/development.md
+b720f3c7888510c46fc36bbd2c8ec3222ec7a3654f9a099125f3e2cc81910ff0 docs/distribution.md
dde10694356d76d144d2a2873ea9649777310e6a6726220c74bcffd03b71052c docs/hardware-testing.md
-28ff6f24d4bf83bcd180079ca4569595580beff20cb9081bc92ea5d6631b41c9 docs/local-usb.md
-de88113cb00031493c843c2707f89b04d2cf5791842d6dae83e22db8482816b8 docs/release-notes.md
+0cb573347c716dc1872d546d014eb9ed875ceeb4e433c72092bb62ed3663b5b8 docs/local-usb.md
+b1aa87f7bdffbf15af229e4a3290d4283634e33467b9d910d56b2ef8c2533824 docs/release-notes.md
87cd03b1649797d4235d8e80462773f004d7fac7529dd12996d4959404a53762 docs/screenshots/browse.png
7608611ac47f9f97fe88cc46679e5d1217572ba8e189f617d0ec89bdbc296be3 docs/screenshots/cdj-status.png
e58c4dcb473aefdf13944743b99dc0acb12197a2ff81d82a56ed5048d68fc3e7 docs/screenshots/menu-audio.png
@@ -22,10 +22,11 @@ f67eb74695e30700626c312f253bff7112d541de9b78bd87e3df9e6cffd6598b docs/screensho
152ab9a5bdc7bfeb9f645f4c957b62831d64aa163faed6505d781265c1780661 docs/screenshots/menu-display.png
8c1810dfb189b6de84754a2bbe30c0eda559170a647d7a55c91d12fe8370e2ae docs/screenshots/menu-library-filters.png
470f2e0e394163996d4f62b67e6d2b83513afed02ba8a5790d223af86055d91f docs/screenshots/set-history.png
-9643ddf5c55313c8e7d3a2f495cd45154dba3e13b2f01ae4d7f9d5f874975fc8 docs/screenshots.md
-8629a193f92c4a3b4df6eb606a99a056ff6dd9499e259cd05aef87d1a006692e docs/set-history.md
-b942ee8b974fb7585925579bd81244e2d4fe96d41117c58ee7554bf739b87175 packaging/olc-host.postinst
-a24c74e9907c0009ea1a6055d9ee7e4036c19c2f8731301c22b09afb0dd8b3a0 packaging/olc-host.service
+6aaf260383f14b57ba5cc2da02355b48d46104e220acabe5eada76dc50f558a2 docs/screenshots.md
+471e4304726e567c73fb7e1f9ceba20e48bfa8da322f0cec77b19a33e64ea7bd docs/set-history.md
+3a6103c4dd0d87da2d3e8a55a657af4de0b5ee05fa821bbd18884254f2f1948f packaging/olc-host.postinst
+8c100a046b11772a3f300e389cc28781352110718f049f9789468e6992de8561 packaging/olc-host.service
+5c3e38a3ab4633096e64445648ba7145a232f2f0803f7aa02c23a613ea536a03 packaging/olc-usb.py
71ab75335b1986cfb1287056486539a2003ec2814cacfba1c78ea0b16c09073a packaging/olc.svg
de9f3ccf0d7f57753690521460e04e3074106f3eb8a8957622e7b7490352f610 packaging/onelibrarycompanion.desktop
c498cde217c314b673b916fae7a17b87fb5233ec593f4d13c90b40235d34aac1 scripts/bootstrap-mac.sh
@@ -36,19 +37,20 @@ c498cde217c314b673b916fae7a17b87fb5233ec593f4d13c90b40235d34aac1 scripts/bootst
94f1a7df40b20ed6af5bdbe2f6edc8c7015a99003f41e77d2d997c8b604311eb scripts/check-distribution.py
e1f529e9f89668b674080943ade66397dada81f146bdf2a41b91f2f0361e7039 scripts/check-docs.py
88192f3b4ad653a4bed7ad022619052a17f7de451453b9d457aa9cb849971098 scripts/collect-third-party-notices.py
-bd2c4bc07b11bfcc25b5d37fa32b2bb9be98b54c00dbc6a0f2822b9247d828ff scripts/package-linux.py
+25e72fc600225e570b1c49e0984e8b374c338f2a24b1ad632847e3a36f1c2d60 scripts/package-linux.py
a914b6b35a76b3b5e3534528cc4c8285f3631a7ca3f18454ed913e8c88ab889e scripts/package-mac-networking.sh
77bb171cf57bdeaa537dac42f9284c77474bbfe200c881d0da680760a02ca3ab scripts/position_signals.py
-06b190414e05e288f85734838f26136fb81477af4a1ec41db93c1a15b9d04ad6 scripts/prepare-distribution.py
+abd077771abd6b7f58187a2c1b318dd08a86ca4ac1abc6402882a29fb3422852 scripts/prepare-distribution.py
a886e4fbd9ca4ad9b8e1b5a1e64b178a05a95a551d90113e1f5e9940f2aa188d scripts/setup.sh
-8bcbb40a29c6a70ff61f5b3dca1df652afdde2d6f1d889c4086c3cb9bccfd341 scripts/smoke-host.py
+8e71de425eff05a1279e74ec7c1735399b27ff8a9983878e1923acdcc5f998dc scripts/smoke-host.py
3c6734eb87e1bd38364dac80eb9cb0610b6e3a16a2df1fe33437e93b2922b975 scripts/test-mac-networking.py
60f4824e5da38acb9852a7cd3522063c866a9c80516084f2d9cf2fe7c2d36edd scripts/test_position_signals.py
+9eb805af6bdace749f78985bf5349be1ddd80413e213175e720a22635d046e1c scripts/tests/test_usb_unmount.py
80fae4f8f8aed359c28a2d7dbb13a447e2318b45eeeeb702b585390b881158de scripts/trace-bar-position.py
bc0e03dec5e77bf1e18f615f07d1d4289319c07ea3f94ac0b283ba43db5e56ad source/core/Cargo.toml
d7a76e58c570ade89dcec43bcd208d6e67056a6e2abf3eda7bac22d2f2b0a5e9 source/core/src/lib.rs
ecb0eade1ae5d53f36e495886821fd379f33229795db6948c161b856c540852f source/desktop/linux/olc.py
-3a96293e5c610bc50fc07ce0e9779fc55fa8ede95e27b64ed3c401cf1ed20abd source/desktop/macos/Info.plist
+367b56012635efab3e8dec611637ea5dc99dbde40289c69a9823799875b25da2 source/desktop/macos/Info.plist
69aa1800cf715330bde60014348fc497198e69372548fc0e62441c5876d45d68 source/desktop/macos/MakeIcon.swift
c722acf013afc1a352e832710d1d53f37803be5c1d863c95f68d08e6af83f001 source/desktop/macos/OLC.swift
dc53d14771301574175144eb1f9eecac9d8e1df5cfb4d9225fbcc6286abf2420 source/desktop/macos/networking/helper.c
@@ -58,7 +60,7 @@ a2466e957ee6339d2234fd5c1cad50f7df4e9836c645db4e3d5d23b6bb022f0d source/desktop
bd956ea99d01308f1b1bb7151d1630016a6b154b176360f448dab565b76cee5b source/desktop/macos/networking/tests/auth-client.c
1a35f415ea665036ec63d7b366343eb4a28c2848bb90f4c52729f1999927fc9e source/desktop/macos/networking/tests/auth-server.c
8a08e32db795f80e918dccbd6fa5eb484b14fa714526176cb610fae4dd65a1d7 source/desktop/macos/networking/uninstall.command
-3db0f9f93b115a7730814e612ccc357124216880cee6bc1ab33d389f4b71f28a source/host/Cargo.toml
+e978c5469be63db2b7e0842bb9d5c877fbec1e4f17d457ad050a44cd50746048 source/host/Cargo.toml
981be11d374fa01b30149f7bafccc872f171336e918860c06eaa4168de6f1425 source/host/examples/cdj_usb_probe.rs
ee8482a233f436bca0faf55f2d43bdd2d2c6e7ff324f32c1f375e2d75bb8bdd4 source/host/examples/import_set_history.rs
2841e6e8e81473887721d24ad68ddaafb56323c11e859b5602fb5c204b3354e0 source/host/examples/inspect_cdj_cues.rs
@@ -68,29 +70,34 @@ c6998a6ddf849c2ac2686e37f9c4f9458f13edd2ca30e5286efd0f148981e77c source/host/ex
43d33c042e184cd3f5db0caeabdbebd3b1e937d93280db66ce0dd40f2137c52c source/host/src/artwork.rs
3a65e4898057eec0424ac01e0ca9b7719f6f668a70ec3d154ed396ae5c03e2be source/host/src/audio_conversion.rs
c83e0d6f9c7cbe77d08ca9f992b2eb21c54e943c0c145d0bd7786e968174816b source/host/src/audio_header.rs
+532b00c03d6428377e4d55a0cb8acb06a692c5d0cfa991b9102a10d78bd64c01 source/host/src/auto_discovery.rs
0a2a0e7098474ed10e8418a7235a1b01db9d2ad7530dd3e156cc6f639e87572b source/host/src/bar_position.rs
-b9c2e7f465e3e999dde7a99f559ed63e21945a5b3eab94876273575f7d6da5ef source/host/src/beat_position.rs
+7027d8fc3a53c5d7360e282e29f4e7e5ea96d66d652f36e4ca7d81f6b8b6b239 source/host/src/beat_position.rs
0f53950b6505be7c3b13a71f2165c39506f096b65ffcae8fa55d2a0ad7284ced source/host/src/bridge_probe.rs
+3f671144a2e3ef70abcc50e428d3e3a10c02881119f3a4c860114c0b844758fa source/host/src/bug_report.rs
91443a514ff3d6541abd13553bad93c0a8854be91661ef0175be0eedfccc9020 source/host/src/cdj_usb_load.rs
7f59b4a147048d7d59d327013d5f999f67dbcd84a836519c10688aad52b64984 source/host/src/cue_diagnostics.rs
251ae52075eadb19acc27cd77b5eacade6c92b2c560bedcdf16f53b3bd923360 source/host/src/cue_window.rs
fcb18001c70c944115495aa02293b9eaa08307111ff83630bcfe911e54382918 source/host/src/cues.rs
5f31f8e786cba2ffa86b46da6b75839af8b870e713ea7758e9bc471be5b2cbf0 source/host/src/direct_ip.html
f682d839ce4abc798abe460442d31b2f5c676379b4eeb86a21737ef50638a6e7 source/host/src/direct_ip.rs
-be770adfc9faa70559e91c1d1bd331bfa2de6d72c283733aaf942d4677937346 source/host/src/direct_live.rs
+cf82d8d5c8b71854934e275d9134403bddc2dad425fb3e13104e1b9f39836244 source/host/src/direct_live.rs
90c2f90ba9494c3f7ac0c66c721c45eabcde64666d4328575f1858c7bb964a32 source/host/src/direct_status.rs
-cac6953593b67e105f518929231c53ae4b760ae75da1f3edd118e5f32c00d149 source/host/src/distribution.rs
+7045d716ddc2e630977e3805b08e44dce7acef93e9a0a8b3f1c0c1b7bbe18ed4 source/host/src/discovered_local.rs
+1f8ab4322f07c0e1f7be9b257a2d297fc5f2c6148eee5b54e7c988f6552e0eeb source/host/src/distribution.rs
9bc03318c68b6f815b89e60ce510929fad1073bb15ec039bb052880afedead53 source/host/src/embedded.rs
d7ac47fac069c995088cc1d87de2dbdef7ad21c19615b15e178d9ce887d2c029 source/host/src/handoff_capture.rs
-cedd311ba824833c2a7ac5434c3e795b517ea3a437c26b8d811952c1231dd5ca source/host/src/jog_trace.rs
-46695d71da464553cde117a2de5f28f0af99b446c0cc202e50cac38a5f8a320e source/host/src/lib.rs
-540850799efd33a8f703e564e341b878eba27e9cc0e2d3014808d0f249b11fd4 source/host/src/library.rs
+657431018379a40964c9774037f898763a57c286a9af3c8b6ece2af4bd6c18f2 source/host/src/host_controls.rs
+f6204c59a516931c57f22650f021deaf6bc985814f2339ece8a077c7e59e9b35 source/host/src/jog_trace.rs
+f98321d2f152276eac095ee1afe066d8ce4a0ea3df6391967e9b63db64473344 source/host/src/lib.rs
+b0f7f66e8119016e6c2685e8683501eb37427bb7075b06473fc49d2221bceea1 source/host/src/library.rs
+4d0417ad974cb2402e2a589b44c96e552cf0fa4238b07746e683144cb19336a1 source/host/src/library_audio.rs
42c285076e864776263ca133dde827df097ee70652856fbaa082c9ab322e84bc source/host/src/library_mood.rs
-3b10b66f623f61119e1c6a2844539db9d4d1eef42844255ce7fc223d517cf462 source/host/src/library_preview.rs
-98fe4ea4643a09d004566acde9ceb298955953c6cea642e4bb3b1cf6db9226d8 source/host/src/live.rs
-cbea897270aa2c1e272dffb9397ebc9f3075568028a4f7a98e6516ee29aff2f0 source/host/src/loading.rs
+8c0bc3600c45e552617635e684ec61b16e14ce0a35f7e300e413fe64245cf728 source/host/src/library_preview.rs
+8becb607d0a175657de1948524f48e30f8ede4e8778b99f8b4234c76700253cd source/host/src/live.rs
+3004294925bb88a9a1be3aa096920442992e6874411e2e77be5fd18b435c5274 source/host/src/loading.rs
7dc7208f4ef3a26a499fa250069065f5bee898dd1d641acb0ad604eb85c30b2c source/host/src/local_media.rs
-9078088466661ffa477887ec22ca118d8c4b4b286efc7893b9d66381ded8ce55 source/host/src/local_serving.rs
+bc0ef4a85246cb9fbbb86989844ff6938ea7c07f079c635bca011856a5338d62 source/host/src/local_serving.rs
11d0fb8b317fed32e564686c9b3ea0da0267132df98bd2530523287eb75d70ac source/host/src/local_usb_probe.html
1825c0f74b19ac2e50598390202adce26ff94a63e8fe147c5a62ea59a4049f74 source/host/src/local_usb_probe.rs
26ddc9343b45ffa3b6e15f3a47bd06ac086de56ba1412378aaf0ae3ede7afc7e source/host/src/loop_region.rs
@@ -100,11 +107,13 @@ b27ec82b44e6965d0a0fc34dee8450767642d954e21cd7c60fa70433d7f67fde source/host/sr
d7e9b3939610e93d690fa9657f36c5cf152ce23d9683db4be4eff7a5106ba34d source/host/src/offline.rs
05de00f4b885a27e108ade3541993c54e4ddcee4629ee83d03ab777def598d3d source/host/src/onelibrary.rs
50b51416b6345ec099c3e54898f4d628a6923ed7adea6dbafc219a909d444ec7 source/host/src/phrases.rs
-02507894028fc07d397df3fc18d33d8979388daabcb2edeb3b4d6ce16cff6f49 source/host/src/set_history.rs
-706bd0ccec6973e1d6cc2bf3b688d0b074fe09c9ada2d81dd603d002a6868ed6 source/host/src/set_history_import.rs
+48dcceae6c9d82915ccf32ca3fc457e979a473d2c965c41ae6f07989fee63abe source/host/src/relative_phase.rs
+d31483957590b86b64a528353de7d0668c3645df0486dc71e82e2db055ce0128 source/host/src/set_history.rs
+25eede100a4458eb15691c0b3fb3a136b9e6d8a65d4fafe57ca99dd09b097518 source/host/src/set_history_import.rs
882aa626c2c7a64b147d2a0acdf53331ab17c7dbef6abf6fd133570cf837f688 source/host/src/subnet_search.rs
6714426a92f861e3e3bb2d030d40500d488a891da0e82e658ef3fea51b087819 source/host/src/sync_tap.rs
4b3e3bb945df8c28f1606e34e57634d8b4b267d5f93b87bab0e0323122eedcbe source/host/src/transcoding.rs
+4d9f808e2db5819848d87ab316d86b230d3c309ba010339da2a1a7e770303d19 source/host/src/waveform_transport.rs
a8cedb1648467177c1562ce96b4dcb45ede6297a2c4abc6b55eaabbc0e562254 source/host/tests/cdj_usb_load.rs
e24560f13fc9ab2af5440550ec8ef0c323aa78d81a7439af3a2c47fa59e7ed57 source/host/tests/fixtures/transcoding/reference.flac
e50b13e40bafaf8b0b57bdc873e51e15f65d544201653038dd4d7f418b6914c3 source/host/tests/fixtures/transcoding/reference.m4a
@@ -112,39 +121,42 @@ baa2705b98262623dea90b3360335448ff177972b5e3c5aa766b4d4c118c08ef source/host/te
83a4b1848f46a19c54fef611f8a8e281149b98184c369783e88261bc8ffcda33 source/host/tests/mytags.rs
d2dacd1889311ef2bd911c693f45e8f909d2746abab98afb57080036c9aeb105 source/host/tests/playlist_rows.rs
db0e313f30825bf351858e6b84ad537930628dd6d5de5d4d937571405fb02ad1 source/host/tests/synced_transport.rs
-8095416b810f09cd276864627cae8433b4d680d225f9e4369b9ea86e942ab05c source/ui/index.html
+7e91712671d1ba69d7c88affd8f2dc60e2278874ea0a060d4ae8f3248faf9843 source/ui/index.html
b4d61e9132af681bcb8069f86899f57471658f27f3ca8b9f8ca8547d64233189 source/ui/package-lock.json
52a44ed71eccc5cdd3422ad953674cf83b8a893a36c9edeac2b77fac1222ff9d source/ui/package.json
095bf97d18f4590983f16cae958a285c3d1433db6c272008e569d1372d386925 source/ui/replay-beat-position.ts
330d2579fae7fe07a2f65738081b22b03d7cc1474cf2d44b932742763736a631 source/ui/replay-jog-browser.ts
02328cd63211fb7234c7459778778b7389bc5783c9828593e1326573a04c5278 source/ui/replay-jog.ts
-4ad5d56fafc022c74ae18b49f8ec73c09e0fffe10d51ad53760cd1142c295f47 source/ui/src/Configuration.tsx
+d3a3885b0a0074a3997a3ab871b4d955e10ddc7ee39b82d22206433c4ccc6a50 source/ui/src/BugReport.tsx
+503bed97b4ff42e18be9ff658ecf920e8d079a75acff8bfcf65260e3af9eece8 source/ui/src/Configuration.tsx
730233cc334b4406e846cfc67180e8c990fd5e09dfbe829465b3b4176db2400d source/ui/src/CueCountdown.tsx
2b626c6268e31fd8d51c623577f6caf5ccd750eff13da3a623c89b6c759e89ce source/ui/src/CueDiagnostics.tsx
5c4d6e923dff785644220242af2deeb6a14ab2c013f3737f56bd0abd86c6c094 source/ui/src/CueWindow.tsx
+5942bc4b3964f1b16dddf6189c6e5562b703cb733dcabc60a54be1963762019c source/ui/src/DeckComparison.tsx
7e84ef50cf32ab41f6ba511e8f92d8153d46ed6d2627a05a9c035229d7ad5a4b source/ui/src/Experiments.tsx
-923bf82cd5f949589308358baca4e8193c40063d24843ae77162ec2e215cd6a9 source/ui/src/HostSettings.tsx
+aa20637e6d6e5dc71e104cc0cbf018fd3a7258caa7fa59a6af1b19b55236c92e source/ui/src/HostSettings.tsx
4308ad178f28e8ec8816018ded48d5e1c3903118249a6f70dd47ac450c7a2cd1 source/ui/src/JogDiagnostics.tsx
-09e192e011ee5b792385b899e7fff31cc57bb2cfd27b232f58e871dafc6e879f source/ui/src/Library.tsx
+93ac2d21d9f32ad0d2028bb93162bf6242222721fe9eb41825a47bbbc33f4751 source/ui/src/Library.tsx
bbfe8f38ef8926d3c9397454d36bc31eb786fd625f4621f74649f155981150b4 source/ui/src/LibraryArtwork.tsx
e772a43d5276f0502bf14b23310d53ea23421aebd70427ac808a0429cd1c61cc source/ui/src/LibraryFilterBar.tsx
8a1244520729d787a59aac8192431cb798a27ab394fa114eac96d4befef8bf6c source/ui/src/LibraryFilterConfiguration.tsx
4febb4166e8a18975c871ba2ac4982ff9187bfa68cb7c5c956c55c4adeee7708 source/ui/src/LibraryFilters.tsx
+c2dfd7deff01db81fe919e3e8994ced469c0e930c96d8a77d651081f752a134d source/ui/src/LibraryPlayer.tsx
4d654dae549e2d51d8d6b4b90de34bbd2fabf1fdda80e210fb59239ab97140ed source/ui/src/LoadControls.tsx
c8d8e086b96667cef511f8cc6f787ff2703a9216fa834fa021c5d98ef4d21ab2 source/ui/src/LoadDiagnostics.tsx
-19bfd0d5ea6c6bf428b6fac87a247a4135cba24d504c464476a11d7ca6321cc4 source/ui/src/LocalUsb.tsx
+c58c4a00b1e71df5c253a138ff6fb1bc45971d14802e719ca34c0e225e5b6fb9 source/ui/src/LocalUsb.tsx
222c7c05a1abf15f80c60e867688bdf75dc23985ba2ba996db5ad472df051e3b source/ui/src/ManualLibrary.tsx
692924730b88b9d554bf580ae1c36c50de461c11d2b5c8052b78a89b52b067af source/ui/src/OfflinePreview.tsx
dd5cbe6d37f05e963c0f3159a7a80382241787e746d15384deba4f0bdc76ca25 source/ui/src/PlayerTime.tsx
-e476594a0363383faa1dbb636a7aed498e43b4bbef1134a9c0f6f06b9ca41c43 source/ui/src/SetHistory.tsx
-50667782d4d1c25af5acc3eeb4995f226c79c918849720f8df3713afd12b33a4 source/ui/src/Signal.tsx
-12281008e3470764de2c2d4f6969930ece8a174637482f777b1b7d18c72e9b43 source/ui/src/StatusDisplay.tsx
+69bd0a0b371b701ab86ece0421a5174188b823fe0d5c47046e24c7401cc5b900 source/ui/src/SetHistory.tsx
+1efff22fe939b2d0e34e2631dcd99fe0ae5c48d9425ddfb52a190d7e3fc11422 source/ui/src/Signal.tsx
+27059fd2b5b03c96878c889af4002c1e61bdc4a3a43db5a8cb1c274907659326 source/ui/src/StatusDisplay.tsx
59070d9f7166df9b5d95e4d9d277798185f90e88da38f7b230f62a1c97ead0ed source/ui/src/SubnetSearch.tsx
00c56d182be79011673c6510a8501517647d3204d3b9a5fbdb1db99b38a84e23 source/ui/src/SwipeSet.tsx
8f5bcd2e2e6466427c1c10dde710f79dc94136e670654c1fbbdaf9430ecb5016 source/ui/src/SyncStatus.tsx
9bd378df5fdcb5624101b73a3bde89839d4150619f6fb5cdf10fc10f53c8377f source/ui/src/TestScreen.tsx
-18c13b1f15987e0504dd0f91376b927e566441830f506cf0a58282bc9c316dd4 source/ui/src/TrackCard.tsx
-8f495a42af1d46bc112588d88d9dd7b5ea64a284816bbf4abf3f1a9e33f39a2e source/ui/src/TrackInfoPopup.tsx
+e094ad4f39b9203d834b67be203fd442d54bb4f9d32b2750333f75a826ecf798 source/ui/src/TrackCard.tsx
+5bf2c9247882498342b6d34afc047df11c292d4beff3fbaf775483418ad94d32 source/ui/src/TrackInfoPopup.tsx
a937ef9267c735f2151f1c1947affaed832ad28f4bcbc258248f6b723e5f3d2f source/ui/src/Transcoding.tsx
e55f6f613890106dc043bb10134ba09af104eaf993b632158036fc89bda0f394 source/ui/src/api.ts
da0ef30162115daba501262d03b704d75a6382eba6d43f0d90425ed10de53263 source/ui/src/bandGeometry.test.ts
@@ -152,39 +164,46 @@ b33abdd84d3ece73853beaa94137f67d211cbb8e8256ca77f098cd0d609a6a56 source/ui/src/
ad237002a7174932599afb56db4afc6a32326bf418ce3f60bf5d77fb6c1247fb source/ui/src/build.d.ts
4bf1cbe7cf0ac9dc8f5b1a19544b0c7b740ebbdc9a075ca1e583ac49b882d824 source/ui/src/cueCountdown.test.ts
166ea6edfcd7f30f2fb716d99a81d0c38808aeeb01949d78ab43445e9b2a711f source/ui/src/cueCountdownModel.ts
+a09f72cef31c90f5d123c255fd4aa856a042f55f4866ee25284acdbd4f10ea61 source/ui/src/display.test.ts
+0cb06b806e05567b38b00d73abc01e3f912d0e03bbfa9851cb33d5a0e5f2077d source/ui/src/display.ts
ddfc963263857a85cb17b1b067abc752e5cf0a6295b9a1eeaea98ab4205d9eb8 source/ui/src/handoffCapture.test.ts
da2e1987d951993bc18aec293f18db31e4af9cd7e7e6c84f80eac679a1227033 source/ui/src/handoffCapture.ts
-4a811e5d6502acf5d94456ad609caa40f1f7e3d401423b986a974b9cef35a10b source/ui/src/jogTrace.test.ts
-0cccfeac737e1db5991cd13a3e33c68d82d37fbc5e8a43020d44dc03537ac52c source/ui/src/jogTrace.ts
+28ed9c00a438c70173773ac3680565495c3fb7ed7aa6da94384d590728a58b5f source/ui/src/jogTrace.test.ts
+9cd03f78e18751fa3bed1000873d39f791ab5f65ecb789d353e68e5ae53ce5f8 source/ui/src/jogTrace.ts
966d372b665e277ce86bbaee97f517ad8eb67598effc2fcd84276713792282f9 source/ui/src/keyCompatibility.test.ts
af5c06fd811365410fd72eb7ac72fc7cf48274fbc0cb3285d199cac922d4b506 source/ui/src/keyCompatibility.ts
-107a1a7283e1327b802b30d9fe127b40d2e6ccca405e59f4e836429c7fa6b981 source/ui/src/library.css
+4b91208816851f5a2e02b4cbfed67706b4aef176d028f0b88016d64f524ac9ee source/ui/src/library.css
055425fbfb6659640cd5a18cde45fb83dcd0ad501d4ec2aa68ba1da7c55ada48 source/ui/src/library.test.ts
df77dc5512202edfa69ebcf741548dd1edfbce9304d89c0e13a401f870b1f990 source/ui/src/libraryDensity.ts
c30911216aa1bf02c7d49f0b3188ee0565d01d59197f846f71f6e5696b7a7815 source/ui/src/libraryLoading.ts
0ccea972c00195464ce3f022e1a6e9bd007bdfdfe47c987c8ddfa5a79dddc2c1 source/ui/src/libraryModel.ts
666c2d79e0055e35930fa2bbe699f510f711cb72dcb97271430a51196422ddf2 source/ui/src/libraryPreferences.ts
-cb9ab3b2c34a285252e3992ee9e32a1b6d432fae5af6f38f6f6fe25d4950ddef source/ui/src/live.test.ts
+33a3476c38f9d51876612f160e1d7131b8bcf6d96a7880e8bd788bec579ea6e7 source/ui/src/live.test.ts
462e3e58a5ef97dc63d71f4fe12fef0b38ad757a2d3f4ded550077334f6d5e78 source/ui/src/localUsb.test.ts
-1d4d6823b207887d9ff4d09470bcdf8f943a57de289abff75adb866facc4ac25 source/ui/src/main.tsx
-008dfe4fd79e9cd8eb4e827bd80f40c7ced5c00d94468e20f01bae76ccecbac1 source/ui/src/model.ts
-7e4f418f6d35f14cf73bf4ea9ace392b94a08902cf65c068b936b99e68b611bb source/ui/src/playbackClock.test.ts
-5794c95a87a83d39439b9e5c064bd3636a4be8a65d408e221d17907399251dd6 source/ui/src/playbackClock.ts
-2ba44a90ce1bf0ce1c400c125d0600aa5ba9696e832173b1fa1a9220b077d456 source/ui/src/setHistory.css
+27d42d25a8a2d93294826b15687a98b5837d562d30cb8b7ba26b73661c316c41 source/ui/src/main.tsx
+c1e05ce93ba9a7e6f754eb27b106920807ce6515809f2e1b4c098edcbf55df20 source/ui/src/model.ts
+c2fcd464735688a617680de2ce170e6e249def1f5d0f0240582c00f3effae60a source/ui/src/phaseMeter.test.ts
+fe1e2ef144bc9678c5599532c384bbc6783f6f8cec0168601332232f58b77f45 source/ui/src/phaseMeter.ts
+ba77e69a3ae3b25448698ba136782e0db660e05c5da5a913795d7b3deb981e7a source/ui/src/playbackClock.test.ts
+decb3e9a9cac71064d3eceefc315145b968254887f5347e83149aa39ab5d0877 source/ui/src/playbackClock.ts
+919e55c574ef18bd1cd4a8eb989717e8f0b18800316c6b0571ee257320ae0272 source/ui/src/renderPerformance.ts
+52a836a58b5afc2c86ab45283d1632fbc0abc10acb3564b2733881b49424149f source/ui/src/setHistory.css
b8c6a8643a67d23a02b7e27fd4bcab3d826feacbad27cc63493771d3793a0858 source/ui/src/setHistory.test.ts
a68d2be44562b3269bc8ff2307eee0796b916466c6ce41fbbe76a727f006c658 source/ui/src/setHistoryExport.ts
-373ea48006a35dd5d5a2102f464854ea97265b70adbfad55c0e4483e5a4aa1d5 source/ui/src/setHistoryModel.ts
+6bbe408612b3240cb72749d9cc3594ebbf3904939be1df7dbdbda450c80c47f8 source/ui/src/setHistoryModel.ts
77cf56289d03f1a3d3fe5e5134361f57cc5b2076344c9a849f5c20e87012d2f5 source/ui/src/settings.test.ts
-e34c3c33a408d07a839ba00af5254b72bb54b9fb229aef36534a9a8a2512c90f source/ui/src/settings.ts
-e56fdf678b8a952392023f8c079dd33c4dd0a7809ef4eaf4656103c41fab1e96 source/ui/src/style.css
+f84f439a63944ea3ac648cbfd20fc23323f465a046307975aadb3fa6a53511a4 source/ui/src/settings.ts
+4c506d3599775a0866a5e53df3560e812aa2142d51f75c7fcc2101e489498f7a source/ui/src/style.css
17c75af7578a0a78bda3113ffc534f16fb28b4746db2c8485e0050153600a4d1 source/ui/src/syncPhase.test.ts
b1d9c916c07239a61f59221392e7034bbd155945c4e51b8d52a1f7c10ca8fdae source/ui/src/syncPhase.ts
d1e46dc3ab87c5335230ed7587b0e5930e5ed6d6c06f30d6757ff9b2b6726fad source/ui/src/trackCompatibility.test.ts
a0878bf2c8869a679e3f8d9a0165abaf195aa62ec00c6b30fa2476ad2735aa1b source/ui/src/trackCompatibility.ts
-c6869adfe240db0cbc893df628c62a2286ef9e8fd8c410cd13924d441e72792a source/ui/src/useLiveDecks.ts
+d6f2f952a26ed1a95b57c3bf9177f1bdad5c29ea63696b28b83671f4723c2e39 source/ui/src/useLiveDecks.ts
22ef2308be5782340ff44a36d868ea601b198e81418c68fb6cdd3a46fb0ac193 source/ui/src/useTrackWindow.ts
c5630f3796dd4ca39fd6ae7be419f00c2a4dcee4f2dee7d4955d563ba90e6cfc source/ui/src/waveform.test.ts
-6a35c7e5f632397d39deb1aff35e5674c8b451c54720da72bbffa32d6c86c4df source/ui/src/waveform.ts
+658c488a20ffec1cb666532ac7281128ae1a511da53729c8d1b05150dfc4fe5c source/ui/src/waveform.ts
+d6e290c36b0562cb939d43ada3220be8e1f5e6b2afbcb7086610ebc3f748b91b source/ui/src/waveformDownload.test.ts
+b94dbf4fce99695e71eb5c5bdef19887f4c9e25d7b6394c11f4e3b66de145d23 source/ui/src/waveformDownload.ts
d520b7485594edc61ad108bbd6864b0003b06d7dfd19ed8c4761f3507c54e1b8 source/ui/tsconfig.json
ff810e399770c5fffaf7cbdab316fe3511de272b7b9f6ef2cb1dfed1a278db01 source/ui/vite.config.ts
22434b1655cd21f021e5b443fc5e071afc836def5e0b1dde1c01bf2a892296f7 third-party-licenses/CARGO-NOTICES.txt
@@ -192,7 +211,7 @@ ff810e399770c5fffaf7cbdab316fe3511de272b7b9f6ef2cb1dfed1a278db01 source/ui/vite
3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986 third-party-licenses/NauticMixxx-LICENSE.txt
e0210963031a8b2e0a61ab999b177af2a3f0f5422340da2bb5c6fdcd388730bc third-party-licenses/NauticMixxx-THIRD-PARTY-NOTICES.md
7d5450cb2d142651b8afa315b5f238efc805dad827d91ba367d8516bc9d49e7a third-party-licenses/OpenSSL.txt
-55979dc2814194887b0dff80755eeb7d63645ac90b002b71d04a7d4438f2c6c4 third-party-licenses/Prolink-PROVENANCE.md
+dd3ca34b2bff51af7a66f130ddba5b4606015c467a663c75bfa142257b5a3d6f third-party-licenses/Prolink-PROVENANCE.md
022a84d9d8198478c4d07ddd1b3f9d3256ea730eab8e67969db1873b2e4e043b third-party-licenses/SOURCE-CREDITS.md
ea4fcb309f14a22065e1ea45362d494d320012249ed865fe9c7c0946db754131 third-party-licenses/SQLCipher.txt
08159509fe99d146416fe110053a7360ddfccbba5f0c8f955bdbda025d4d2a20 third-party-licenses/binrw-LICENSE-MIT.txt
@@ -202,7 +221,7 @@ b71592f004e94816c438b800d0753c60ba78dc2bb52387224c74c3c562bf151c third-party-li
f59ba65550f2a5adff98ec6478d783402c8e0a3eb515025c0b3438f3d30dc39e third-party-licenses/rusqlite.txt
e8017643158cc12ac26a2b8f1d42a207fc6b702e74b8b36e9bd8ab9bc04d1f07 vendor/prolink/Cargo.toml
3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986 vendor/prolink/LICENSE
-55979dc2814194887b0dff80755eeb7d63645ac90b002b71d04a7d4438f2c6c4 vendor/prolink/PROVENANCE.md
+dd3ca34b2bff51af7a66f130ddba5b4606015c467a663c75bfa142257b5a3d6f vendor/prolink/PROVENANCE.md
f5e80d8d1015230061c1ec46ca41e2ed8ae4c9544c72d0da06a2845971faeaeb vendor/prolink/crates/prolink/Cargo.toml
a2553752ed447e1147617c1b0bc46775232bbc2c9bf4654516721f9d488191d2 vendor/prolink/crates/prolink/LICENSE
f8a538bd5a6fb56cd5e8947babf870c71f99959cf76ec47a059b6162188301db vendor/prolink/crates/prolink/README.md
@@ -215,7 +234,7 @@ ef5722329d6216d313e0d66fe87501e009ce4f76c5800ea14274419ca8c74c15 vendor/prolink
dfb730bd44ce6e650832f8ff27a104f100ab1f08e73166e697f56612f854e51f vendor/prolink/crates/prolink/src/interface.rs
16e06b312b31bb6d38690fb1d6bfbbcbf21aee5e086a8e220d5168deb05e680d vendor/prolink/crates/prolink/src/lib.rs
dc7929ad6f893ac58117468669613bb516cdcc3c65ca0f6ed03ce795cd7ddc40 vendor/prolink/crates/prolink/src/media.rs
-fb4aa11a8897aa51fc058a85148368028d50bbe31132296c65cf487afa77ebcd vendor/prolink/crates/prolink/src/monitor.rs
+59a7054fa7484a7bc50c666b99acb42558d04492130a2fd5473d26fffa86938b vendor/prolink/crates/prolink/src/monitor.rs
1c4191a643d43e1798f6ab4df1850268c8049b5b59796b44d8c25aabc6fe938f vendor/prolink/crates/prolink/src/playback.rs
28443b720777c4629d05fb1e222cd49b0e35d13319f4822de99fa550a63cbb70 vendor/prolink/crates/prolink/src/serve/dbserver/analysis.rs
2f7030286d2fc56300cec17c95cd6fa340c8c86bf2a53e173a49fd423ede80e1 vendor/prolink/crates/prolink/src/serve/dbserver/fixtures/README.md
diff --git a/docs/configuration.md b/docs/configuration.md
index f49c91a..f6e8e88 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -20,6 +20,10 @@ When running the packaged Pi/Linux user service, MENU offers **Restart OLC** and
## Display
+**Screen resolution** defaults to Automatic, which follows the available window or fullscreen space. Presets include 1280 × 800, 1920 × 720, 1920 × 1080, 1280 × 720 and 1024 × 768. Presets keep their aspect ratio and scale to fit. Wider proportions provide wider waveforms and library rows.
+
+Extra-wide screens (aspect ratio at least 2.3:1, including 1920 × 720) default to **Side by side**, with CDJ 1 on the left and CDJ 2 on the right. Choose **Stacked** to retain vertically stacked waveforms. **Waveform comparison** selects a CDJ-3000-style beat phase meter or the other player’s compact reference waveform above each main waveform. Tap either comparison header to switch modes. The meter uses orange and cyan-blue horizontal rails, white beat ticks and red downbeats. Comparisons show unavailable when either live deck lacks fresh, reliable playback timing or is being moved manually. Compact reference waveforms have no phrase strip; the regular whole-track overview and phrase display remain below the track details.
+
Adjust waveform zoom, playhead position and color, motion smoothing and band emphasis. Choose elapsed or remaining time, and show or hide track overviews, phrase sections and extra details.
The CDJ STATUS zoom buttons and two-finger pinch change the visible window. Tapping a track's time switches elapsed/remaining time. **Restore defaults** resets display and filter preferences without deleting music or set history.
@@ -30,6 +34,10 @@ Choose **Show waveform performance** to inspect the last scrolling waveform meas
Waveform transfers use lossless packing when the host supports it and tolerate slow connections while data continues arriving. Failed downloads retry; changing tracks cancels the previous download. Small timing corrections are smoothed, including circular corrections within known loops. Relative phase refinement applies only to eligible normal forward non-master playback; it does not establish precise scratching or loop accuracy.
+## Track information
+
+Tap the **i** button on a deck waveform to open track information. My Tags appear as separate chips near the top, with category tooltips. Long metadata wraps without a two-line limit, and the panel scrolls within the available screen height.
+
## Library filters and track size
Choose which filters appear in BROWSE and arrange them in your preferred order. Set the BPM choices and include My Tag categories from your export.
diff --git a/docs/distribution.md b/docs/distribution.md
index 9402cf1..b951ccd 100644
--- a/docs/distribution.md
+++ b/docs/distribution.md
@@ -15,10 +15,10 @@ Closing the window keeps OLC running. **Quit OLC** stops it. **Open at Login** i
## Raspberry Pi Desktop
-Use a **Pi 4 or 5 with Raspberry Pi OS Bookworm or later, 64-bit**. Download both ARM64 `.deb` packages from the same release into one folder. For version 0.3.0, run this command in that folder:
+Use a **Pi 4 or 5 with Raspberry Pi OS Bookworm or later, 64-bit**. Download both ARM64 `.deb` packages from the same release into one folder. For version 0.4.0, run this command in that folder:
```sh
-sudo apt install ./onelibrarycompanion-host_0.3.0_arm64.deb ./onelibrarycompanion_0.3.0_arm64.deb
+sudo apt install ./onelibrarycompanion-host_0.4.0_arm64.deb ./onelibrarycompanion_0.4.0_arm64.deb
```
Open OneLibraryCompanion from the applications menu. It has its own desktop window, with full-screen and login-startup options. A compatible touchscreen is supported; use the system's on-screen keyboard for typing. Mount the music USB through the operating system before selecting it in OLC.
@@ -43,7 +43,7 @@ To use a Pi without a monitor or a logged-in user, use 64-bit Raspberry Pi OS Li
Log in once over SSH as the ordinary Pi account that will run OLC. Quit any running OLC desktop app and disable its login-startup option before switching to the service. Download the host `.deb` from the release, then run the following in its folder (replace the version in the filename with your downloaded version):
```sh
-sudo apt install ./onelibrarycompanion-host_0.3.0_arm64.deb
+sudo apt install ./onelibrarycompanion-host_0.4.0_arm64.deb
sudo loginctl enable-linger "$(id -un)"
systemctl --user enable --now olc-host.service
loginctl show-user "$(id -un)" --property=Linger
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 0a7fdd1..4edcba6 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -1,58 +1,34 @@
-# OneLibraryCompanion 0.3.0
+# OneLibraryCompanion 0.4.0
-Changes since the published Mac/Raspberry Pi 0.2.3 preview.
+Changes since the published Mac/Raspberry Pi 0.3.0 preview.
-## Automatic discovery and local USB loading
+## Flexible display sizing
-- Choose **Automatic discovery** in MENU to find CDJs on the local network. OLC reports the selected interface and searches again after network changes or disconnection. Manual IP connections and explicit interface selection remain available.
-- Local OneLibrary USB loading now works through automatic discovery for players 1 and 2. Leave player number 4 free for OLC; Mac serving still requires Local USB Support. One local library is served per connection session.
-- Overlapping load requests to the same player are rejected. OLC displays the local USB label for its served tracks.
+- Automatic sizing follows the available window or fullscreen space. Presets offer 1280 × 800, 1920 × 720, 1920 × 1080, 1280 × 720 and 1024 × 768, preserving proportions while fitting the window.
+- Extra-wide screens support side-by-side decks or the existing stacked layout. Browse, MENU and Set History adapt to the available space.
+- Waveform canvas resolution follows the actual display scale and refreshes after window resizing.
-## Browser audio preview
+## Deck comparison
-- Open **PLAY** in track details or hold a track title to open the browser player. Audio plays on the browser device, independently of the physical CDJs.
-- The popup includes play/pause, waveform seeking, artwork, time, BPM, key, genre, My Tags, comments and library color. Exported phrase sections and hot/memory cue markers appear when available.
-- Audio streams from host-attached or linked CDJ libraries, subject to browser format support. Local AIFF/AIFC files receive a temporary 44.1 kHz/16-bit WAV copy; original USB files and CDJ serving are unchanged.
-- Analysis previews now cover local and automatically discovered sources, combine DAT/EXT/2EX records, and retain valid cues and phrases when waveform data is missing.
+- Above each main waveform in the extra-wide side-by-side layout, switch between beat phase and the other deck's reference waveform by tapping the comparison header or changing MENU → Display.
+- The phase meter shows orange/cyan lanes, white beat ticks, red downbeats and the master player. Each lane follows its own beat grid and tempo.
+- Comparisons show unavailable when timing is stale, unreliable or under manual control. These displays do not establish hardware-validated phase accuracy.
-## Automatic set capture
+## Track information
-- Capture runs on the host without pressing Start set. More than 45 seconds of continuous playback or looping qualifies a track; browser preview is excluded.
-- More than five minutes without playback across the observed decks saves the session. Long tracks keep the session open; empty sessions are discarded.
-- **Split set here** separates performances, **Finish set** saves immediately, and **Join previous set** joins adjacent captured sessions while preserving edited track orders.
-- Start timestamps and repeat plays are retained. Short pauses, observation outages and restart recovery are handled without unnecessarily duplicating entries; uncertain observation boundaries are noted.
+- My Tags appear as individual chips near the top of the CDJ track-information panel, with category tooltips.
+- Long metadata is fully readable instead of being limited to two lines.
+- The panel fits the available screen height and scrolls when needed.
-See the [set history guide](set-history.md) for qualification, recovery and editing details.
+## Reliability and diagnostics
-## Headless Pi controls
-
-- MENU offers confirmed **Restart OLC**, **Shut down host** and **Unmount USB** controls on the packaged Linux user service.
-- Restart and shutdown block loaded OLC USB tracks unless fresh player status confirms they are stopped. Confirmation messages explain the emergency-loop and track-reload risk.
-- USB unmounting briefly stops OLC, handles mounted partitions together, reports completion and never forcibly unmounts a busy volume. Devices containing system mounts are excluded.
-- Shutdown and USB unmounting require the permissions described in the [installation guide](distribution.md#raspberry-pi-headless).
-
-## Connection reliability
-
-- Fixed a post-load disconnection caused by repeatedly copying cached waveform assets. Assets are cached once per track identity and serving packets drain without rebuilding the UI snapshot for every packet.
-- Failed USB analysis reads retry automatically, and the host records the last disconnection reason and timestamp for diagnostics.
-
-## Other performance and reliability improvements
-
-- Lossless packed waveform transfers reduced sampled responses by approximately 93%, with older uncompressed clients still supported.
-- Progress-aware downloads tolerate slow transfers, cancel superseded tracks, retry failures and display completed analysis promptly.
-- Relative beat-phase refinement supports eligible normal forward non-master playback. Small timing corrections are smoothed; known loops use circular correction while preserving wraps. Relative refinement excludes loops, reverse and manual motion; physical accuracy remains to be fully validated.
-- MENU can show recent waveform frame/drawing measurements and position-jump counts. iPad Safari supports launching OLC from a Home Screen icon without browser tabs or its address bar.
-- Updated Pi packaging, network capabilities, dependencies, regression checks and setup documentation.
+- Temporary Browse source-refresh errors clear after a successful retry, with a clearer reconnecting message.
+- Explicitly configured diagnostic hosts can record a one-minute bug report covering CDJ timing, browser errors and waveform performance. Browser capture continues when leaving MENU, retries failed uploads and offers a local download fallback. Reports remain on the configured host; recording is disabled by default.
## Downloads and setup
-- Apple Silicon: `OneLibraryCompanion-0.3.0-macos-arm64.dmg` or `.zip`.
-- Intel Mac: `OneLibraryCompanion-0.3.0-macos-x86_64.dmg` or `.zip`.
-- Raspberry Pi Desktop: install both `onelibrarycompanion-host_0.3.0_arm64.deb` and `onelibrarycompanion_0.3.0_arm64.deb`.
-- Pi headless: install the host package, enable lingering and the user service, then open the Pi's network address from another device. Configure local USB mounting at boot.
-
-Mac requires macOS 13+; Pi requires 64-bit Raspberry Pi OS Bookworm or later. Mac packages are ad-hoc signed and not notarized. Reinstall **Local USB Support** after updating the Mac app.
+Apple Silicon and Intel Mac downloads include DMG and ZIP packages. Raspberry Pi downloads include ARM64 host and desktop Debian packages. Mac requires macOS 13+; Pi requires 64-bit Raspberry Pi OS Bookworm or later. Mac packages are ad-hoc signed and not notarized. Reinstall **Local USB Support** after updating the Mac app.
-Stop players using OLC-served tracks before updating packages or restarting the host. Keep OLC running, the host awake and the USB attached during playback.
+Stop players using OLC-served tracks before updating packages or restarting the host; loaded tracks may require reloading afterward.
-[Installation and headless setup](distribution.md) · [Local USB and transcoding](local-usb.md) · [Compatibility and limits](compatibility.md).
+[Installation and headless setup](distribution.md) · [Display settings](configuration.md#display) · [Compatibility and limits](compatibility.md).
diff --git a/source/desktop/macos/Info.plist b/source/desktop/macos/Info.plist
index 300f8e4..d9b6de8 100644
--- a/source/desktop/macos/Info.plist
+++ b/source/desktop/macos/Info.plist
@@ -7,8 +7,8 @@
+ Record one minute of CDJ timing, waveform performance and browser
+ errors. Keep this browser open, then reproduce the issue. Reports are
+ saved on this RPi.
+ {status}
+ Side by side applies to extra-wide screens such as 1920 × 720. Tap
+ the comparison header above either main waveform to switch modes.
+
+ Automatic follows the available window or fullscreen size. Presets
+ keep their proportions and fit inside the window.
+
+ Available size: {window.innerWidth} × {window.innerHeight}
+
- {error || source?.error}
+ {error || source?.error || sourcePollError}
Bug report
+ Display
+
+
+
+ Local USB