32848aaf71a216a2cc85e58b76c3b208e9e8aa31
release.sh writes updates/manifest.json at release time (predictable asset URL) — no CI commit-back, no push-token problem, no detached checkout dance. release_publish.sh is create-release + upload only. Manifest sha256 now optional; updater skips verification with a note when absent (HTTPS + gzip CRC cover the realistic cases). Fixed the repo-URL sed keeping a .git suffix (caught by a worktree dry run). Updater tests: 8 (sha-less manifest flow added).
sync_relay_project
Watch-together desktop app (working title). One binary, three modes:
- Client — GUI Join, sync WS + mpv. No server code runs.
- Server+Client (Host) — GUI Host starts
packages/serverin-process, listens on a port, self-connects via loopback. Host must open ports. Clients never open ports. - Headless —
watch.exe --headless, same server package, no window.
v1 order: links support (shared http(s) media URL, Syncplay-style sync) first, file relay (server-proxied bytes, whitelist case) after. Jellyfin native + auto-update are deferred as their own undertakings.
Layout:
/packages/core protocol, sync engine, messages (pure Dart, no Flutter)
/packages/server room + media HTTP endpoint (pure Dart, no Flutter)
/apps/desktop Flutter app embedding packages/server (the ONE binary)
/tool spikes + harnesses (range_logger, shaper, fake_viewer, e2e_check)
/deploy systemd unit, notes
/docs PROTOCOL.md, ARCHITECTURE.md, mpv-http-contract.md, ROADMAP.md
Phases + status: docs/ROADMAP.md. Session handoff: HANDOFF.md (root).
Enforcement: core and server must have zero Flutter imports (tested).
Languages
Dart
69%
GLSL
28.7%
C++
1%
CMake
0.7%
Shell
0.4%
Other
0.1%