Claude Worker
70460232f0
feat: Add scrubber with A/B markers for video editing/downloading
2026-07-18 17:59:20 +00:00
Claude Worker
046aa67108
feat: Add visual scrubber to video editor
...
Task #69 completed by ClaudeQueue
ClaudeQueue
2026-07-18 17:50:27 +00:00
Claude Worker
8c0776f97d
feat: Add support for editing video
...
Add an Edit
2026-07-18 16:43:15 +00:00
Jonathan Sykes
6fff68884b
add per-song remember-position flag and playlist play-in-full mode
2026-07-14 15:15:11 +08:00
Jonathan Sykes
88c89d66af
fix portrait PWA nav dead while playing by making body the scroll container
2026-07-10 13:55:31 +08:00
Jonathan Sykes
b72c079fb4
respect repeat settings when a-b loop reaches point b
2026-07-04 18:11:21 +08:00
Jonathan Sykes
327a67004d
Show build time in GMT+8 with 'built N ago' in Settings About
2026-07-04 12:49:41 +08:00
Jonathan Sykes
b8c7ad4ad1
fix: let list pane shrink in stacked layout so settings can scroll in mid-width windows
2026-07-03 06:05:16 +08:00
Jonathan Sykes
94140a5433
feat: add passkey-style online profiles for cross-device sync and show build time in About
2026-07-03 05:16:05 +08:00
Jonathan Sykes
048817bcf4
fix: fall back to copy when OPFS move() throws on WebKit and retry failed worker downloads on the main thread
2026-07-03 05:16:05 +08:00
Jonathan Sykes
76f8ec525d
feat: add opt-in save-before-playing setting backed by server-compiled single-file downloads
2026-07-03 00:07:50 +08:00
Jonathan Sykes
ba05f0dafe
fix: make audio the playback clock in dual mode so video rebuffering never pauses or seeks live audio; harden viewport anchor guard and add modal backdrop dismiss
2026-07-02 23:58:42 +08:00
Jonathan Sykes
ed9f93b0b7
fix: stop playback stutter and save failures via async yt-dlp, per-download OPFS workers, lazy playback blobs, GPU composite trims, and landscape pane scrolling
2026-07-02 23:40:49 +08:00
Jonathan Sykes
2af2eebacc
feat: redesign portrait PWA as mobile app UI with thumb-zone transport, bottom-sheet modals, and floating mini-player
2026-07-02 22:38:14 +08:00
Jonathan Sykes
722457312c
fix: re-anchor stray iOS layout-viewport scroll that broke nav taps
2026-07-02 21:48:31 +08:00
Jonathan Sykes
e6f032a6f2
feat: add shuffle toggle for upcoming tracks with S shortcut
2026-07-02 21:01:28 +08:00
Jonathan Sykes
dd71f6b2ab
fix: fetch and activate the new service worker on Refresh UI when none is waiting yet
2026-07-02 13:40:36 +08:00
Jonathan Sykes
f36f6aeee1
fix: only treat a waiting service worker as an update when a controller exists
2026-07-02 13:40:36 +08:00
Claude Worker
8018060d26
feat: update ready keeps showing even after updating
...
Task #61 completed by ClaudeQueue
ClaudeQueue
2026-07-01 17:40:50 +00:00
Claude Worker
42ff13b135
feat: audio playback issue
...
Task #60 completed by ClaudeQueue
ClaudeQueue
2026-07-01 07:26:33 +00:00
Claude Worker
395af38246
feat: update ready reloade stuck
...
Task #55 completed by ClaudeQueue
ClaudeQueue
2026-07-01 02:38:45 +00:00
Claude Worker
50cf655b71
feat: fullscreen video button not working in pwa mode
...
Task #52 completed by ClaudeQueue
ClaudeQueue
2026-07-01 02:18:50 +00:00
Claude Worker
ffeef5d520
feat: audio playback intermittent issue
...
Task #50 completed by ClaudeQueue
ClaudeQueue
2026-07-01 01:53:09 +00:00
Claude Worker
7cf3517dd3
feat: ensure ui automatically updates regardless of version number
...
Task #53 completed by ClaudeQueue
ClaudeQueue
2026-06-30 21:14:06 +00:00
Claude Worker
2b195d3b6b
feat: add topbar adjustments for notch devices on pwa
...
Task #47 completed by ClaudeQueue
ClaudeQueue
2026-06-30 20:45:00 +00:00
Jonathan Sykes
d01f51a7d0
fix: send SKIP_WAITING to waiting SW, not active controller, to break reload loop
2026-07-01 04:43:33 +08:00
Jonathan Sykes
ebe60a7be2
fix: start next track at beginning (or A point) instead of resuming, and store A-B per playlist
...
When auto-advancing through a queue or playlist — or stepping with
next/prev — the next video previously jumped to its saved resume
timestamp. A freshly selected track now starts at the beginning, or at
the A marker when an A-B loop is set for it. Resuming still applies when
you reopen a single video directly.
A-B markers set while playing from a playlist are now stored on that
playlist's own copy of the video (entry.ab), so each playlist keeps its
own loop and the markers sync to the database alongside the playlist.
Non-playlist playback keeps using the global per-video marker map.
Bumps service worker to v1.0.3 to bust the client cache.
2026-07-01 04:29:00 +08:00
Jonathan Sykes
79359dba44
feat: show app version and server build tag in settings
...
Adds an About section at the bottom of Settings displaying the app
version. In WEB mode it fetches /api/version and appends the live
server build tag so you can confirm which deploy is running.
2026-07-01 04:04:15 +08:00
Jonathan Sykes
30a05d3ebd
fix: make sidebar scroll as one unit so playlists stay reachable on short screens
...
The sidebar contained two .playlist-list blocks each with flex:1 and its own
overflow-y:auto, nested inside the sidebar's own scroll. On screens too short
to fit everything, those inner flex regions collapsed toward zero height and
the playlists became unreachable. Drop the inner scroll/flex-grow and let the
whole sidebar scroll as a single unit at any screen size.
2026-07-01 03:58:52 +08:00
Jonathan Sykes
fec069479f
chore: bump service worker version to v1.0.2 to trigger client updates
2026-07-01 01:24:45 +08:00
Jonathan Sykes
041fc6a974
feat: add Reset UI section in settings (force refresh + full reset app)
2026-07-01 01:18:45 +08:00
Jonathan Sykes
6738644d4b
feat: poll /api/version buildTag to detect new deploys and prompt reload
...
Server stamps a BUILD_TAG (stable per process, changes on restart/deploy)
into GET /api/version alongside the existing version string. Cache-Control
is set to no-store so the response is never cached by the SW or browser.
Client (WEB mode only) baselines the tag on first fetch after boot, then
rechecks every 5 minutes. On mismatch it calls the existing showUpdateBanner()
so the user sees the 'Update ready — Reload now' toast and can reload at will.
This mirrors the build-id polling pattern used across the BukidBountyApp
derivatives to avoid stale UI after deploys.
2026-07-01 01:13:37 +08:00
Claude Worker
d9371fdea4
feat: fix portrait mode design in pwa — YouTube-style bottom bar
...
Task #46 completed by ClaudeQueue
ClaudeQueue
2026-06-30 17:02:25 +00:00
Claude Worker
fc61defba5
feat: fix portrait mode design in pwa
...
Task #44 completed by ClaudeQueue
ClaudeQueue
2026-06-30 15:36:12 +00:00
Claude Worker
136e21f1fa
feat: Follow-up: add portrait orientation design for mobile that only triggers in portrait pwa mode
...
Task #43 completed by ClaudeQueue
ClaudeQueue
2026-06-30 08:01:54 +00:00
Claude Worker
02153d877d
feat: add portrait orientation design for mobile that only triggers in portrait pwa mode
...
Task #42 completed by ClaudeQueue
ClaudeQueue
2026-06-30 06:51:31 +00:00
ClaudeQueue
05e78677b0
feat: side bar playlist and other items not present on some screensizes. make completely responsive
...
Task #40 completed by ClaudeQueue
ClaudeQueue
2026-06-30 01:06:54 +00:00
Jonathan Sykes
f266c4ffb9
fix: bump service worker cache to v1.0.1 to evict stale app shell
...
Existing PWA installs cache the app shell (app.js et al.) cache-first under
ytplayer-v1.0.0. Without a version bump they'd keep serving the old app.js
that lacked WEB-mode OPFS support, so the offline-cache fix would never reach
already-installed clients. Bumping forces activate → old cache delete →
re-fetch, and triggers the in-app 'Update ready' banner.
2026-06-30 08:40:23 +08:00
Jonathan Sykes
84d6487125
feat: wire up WEB-mode OPFS offline cache for PWA
...
The PWA conversion shipped sw.js, opfs.js, manifest and icons, but app.js
was never updated to use them — it still routed cache_* calls through the
native bridge (call('cache.list', ...)), which throws 'No native bridge
available' in a browser. That surfaced as 'Offline cache unavailable /
not available in this build' on the Saved videos and Settings pages.
- Add WEB mode detection (no Tauri/zero bridge present)
- Route cache_* through OPFS (opfsDownload/Status/List/Delete/Clear)
- Proxy downloads via /api/download so the browser never hits YouTube CDN
- Load fingerprint.js + opfs.js; add manifest link and PWA meta tags
- Relax CSP to allow blob: media/img and worker-src 'self' for the SW
2026-06-30 08:37:45 +08:00
Jonathan Sykes
4efa1d1182
feat: convert to PWA — OPFS storage, service worker, Bun/Hono server
...
- Move native shells (Zig/src, Tauri/src-tauri, app.zon, releases) to legacy/
- Add Bun + Hono server with yt-dlp proxy endpoints (search, channel, streams,
download), libsql (concurrent SQLite fork) for fingerprint-keyed playlist/
history sync, and static file serving for the frontend
- Add Dockerfile + docker-compose.yml (single container, volume-mounted DB)
- Add frontend/sw.js: app-shell cache-first, /api/* network-only,
thumbnails stale-while-revalidate, SW_UPDATE_AVAILABLE broadcast,
SKIP_WAITING message handler for seamless auto-update
- Add frontend/manifest.webmanifest: standalone PWA, vermilion theme,
search/history shortcuts
- Add frontend/icons/icon-{192,512}.png: generated PWA icons
- Add frontend/fingerprint.js: canvas+UA djb2 fingerprint, localStorage-cached,
exposes window.getFingerprint() for server-side playlist keying
- Add frontend/opfs.js: full OPFS video store (writeFromResponse streams
directly without full-file buffering), exposes window.OPFS
- Add scripts/make-pwa-icons.js: regenerate icons without external deps
- Patch frontend/app.js: WEB mode detection, webFetch + opfs* bridge wrappers,
API object routes to WEB helpers when no native bridge present,
Player.loadVideo handles OPFS blob URLs + revokes them on next load,
SW registration + update banner in boot()
- Patch frontend/index.html: manifest link, theme-color, Apple PWA meta,
CSP blob:/worker-src, fingerprint.js + opfs.js script tags
- Patch frontend/styles.css: .toast-update + .toast-reload-btn for update banner
- Native Tauri/Zig builds unchanged — all new code is additive via WEB flag
2026-06-30 06:43:23 +08:00
Jonathan Sykes
fea26fd435
feat: make channel names clickable in related, up-next, and mini-bar
2026-06-21 21:13:44 +08:00
Jonathan Sykes
20cd2f29ba
feat: sleep timer, A-B loop, related panel, smart playlists, history delete/search, batch ops, auto-backup
2026-06-21 18:43:26 +08:00
Jonathan Sykes
3ad2e40606
Refresh Windows release artifacts and sync build outputs
2026-06-21 16:15:30 +08:00
Jonathan Sykes
f497eecebd
Merge branch 'main' of ssh://git2.hesed.sbs:6612/josh/ytplayer
...
# Conflicts:
# frontend/app.js
2026-06-21 15:43:45 +08:00
Jonathan Sykes
38511fa450
feat: queue, channel view, downloads/saved pages, repeat/loop, accessibility, perf, multithreading
2026-06-21 15:39:58 +08:00
Claude Worker
44fa24ca52
refactor: tidy playlist-menu label and catch blocks
...
Pre-push code analysis pass for task #1
ClaudeQueue
2026-06-18 18:48:07 +00:00
Claude Worker
95dc9e3f98
feat: Prevent UI hanging during video save or playlist add
...
Task #1 completed by ClaudeQueue
ClaudeQueue
2026-06-18 18:43:48 +00:00
Jonathan Sykes
d15d9021b7
Add cache cap, playlist export/import, yt-dlp build flag
...
Cache cap: dropdown setting (no limit / 1/2/5/10 GB) stored in
settings.cacheCap (actual eviction handled by native side).
Export: downloads playlists as JSON via Blob. Import: file reader
merges new playlists by id. yt-dlp: feature gate 'embed-ytdlp'
(default on), skip with --no-default-features for faster debug builds.
Files:
- frontend/app.js: exportPlaylists/importPlaylists, cache cap select
- src-tauri/Cargo.toml: [features] embed-ytdlp
- src-tauri/src/main.rs: #[cfg(feature = embed-ytdlp)] guards
2026-06-14 15:29:10 +08:00
Jonathan Sykes
c6b8dfceb8
Add rotating quick-search chips, video_id sanitize, retry button
...
Rotating chips: 4 sets of 4 chips rotate every 8 seconds on the
hero landing. Sanitize video_id: new sanitizeId() strips path
separators and dangerous chars. Retry button: appears on stream
extraction failure, re-triggers Player.loadVideo.
Files:
- frontend/app.js: sanitizeId(), CHIP_SETS + rotateChips(),
retry button in loadVideo catch
2026-06-14 15:23:14 +08:00
Jonathan Sykes
c1855a1a91
Add persistent mini now-playing bar
...
Fixed bar at bottom of window when video is playing. Shows title,
channel, progress, play/pause toggle. Click to restore player view.
Files:
- frontend/index.html: mini-bar markup
- frontend/app.js: showMiniBar/hideMiniBar/updateMiniBar, wiring
- frontend/styles.css: .mini-bar, .mini-bar-inner, .mini-progress styles
2026-06-14 15:18:57 +08:00