tool/package_windows.ps1 builds watch-together-<ver>-windows-x64.zip (same layout as the Linux tarball, libmpv bundled, update.bat and watch-together-server.exe). The release workflow gets a windows job; ci runs the updater tests on Windows. Publishing moves to tool/release_publish.dart (dart: only, no python/bash on Windows), which tolerates both jobs racing to create the release and replaces an asset on re-runs. release.sh writes both asset URLs into the manifest. Windows jobs check out with plain git (the host's cached actions/checkout clone was corrupt). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.7 KiB
2.7 KiB
Roadmap
Backlog and epics, in order. Done work lives in git history. Check an item off by deleting it in the same commit as the code. Wire changes also edit PROTOCOL.md.
Backlog
-
Windows: first real install. CI builds and publishes
watch-together-<ver>-windows-x64.zip(libmpv bundled) and runs the updater tests on NTFS, but nobody has launched the app on Windows yet. Check: playback, fullscreen controls, hosting (firewall prompt), in-app update from one release to the next. The rest of the desktop tests are not in CI. -
Jellyfin (epic, below).
-
Smaller items
- Video output robustness: if media_kit's hardware path regresses to software (see ARCHITECTURE, Media: render mode), vendor a media_kit_video fix that builds the EGL display from GDK's native display. The video freeze after GPU idle is not explained by this; next suspect is media_kit's context switching on the raster thread with NVIDIA.
- Link conveniences: a link swap in session updates the remembered media; show the open link with an open-in-browser button.
- Time UI: remaining time, scrubber preview.
- mpv / mpv.net shortcut parity.
- Sounds: replace
NoopSfxService(cues already fire). Candidates: Kenney Interface Sounds (CC0), ObsydianX Pack 1 (CC0), akx/Notifications (CC0); playback via flutter_soloud. Keep seek/pause/resume near silent. - Chaos suite: host drop 5 s / 30 s, viewer stall, 20-seek storm, long
outage with cache exhaustion (
tool/shaper.dart --kill-after); assert no OOM, no stuck session, drift recovers. - Chat history pane (today: activity log only).
- Avatar caching: serve avatar bytes once by hash instead of base64 in
every
statebroadcast. - The
statebroadcast carries the full media URL, which can include anapi_key(recognised Jellyfin links become refs; other links do not). - TLS: document a reverse proxy in front of the server.
- Playlist:
queue-add,queue-skip, auto-advance like a swap. - Sidecar subtitles.
Epic: Jellyfin
What is left (the rest is in ARCHITECTURE.md, "Jellyfin in a session"):
- Queue: put several library items (a season, a pick list) up as a
playlist that advances like a swap (shares
queue-add/queue-skipwith the backlog's Playlist item). - Auto-advance cancel for everyone: today Cancel is per screen (the designated swapper's Cancel stops the swap; a seek stops all). A shared cancel needs a wire message.
- Sidecar (external) subtitle streams of Jellyfin items: only embedded tracks are mapped to mpv today.
Deferred
P2P, Android. Never: transcoding, web clients.