- Strip the tarball's top-level folder; stage inside the install root
(same filesystem) and swap with full rollback; keep file modes.
- Semver prerelease ordering (1.2.3-rc1 < 1.2.3).
- UpdateController: background check, download with progress, apply,
restart; required-update wording for newer protocols; Check now.
- update.sh/update.bat in the bundle; Windows apply path (untested).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Updater: watch-together --upgrade checks updates/manifest.json,
downloads the tarball, verifies sha256, applies over the live
install (extract-temp + delete-first move-over; rename-safe on
Linux while running). Zero Flutter imports, 7 tests incl.
stub-server flows. Version stamped via --dart-define=APP_VERSION
in package script. Warns (never silently jumps) on proto mismatch.
Roadmap: phases retired as tracker (history in git log), now flat
Built/Backlog/Epics/Deferred; Jellyfin next feature, transcode
never; updater expansion stays an epic. Endpoint publishing
(manifest + release tarball) is user-owned.
One command: flutter build linux --release, then bundles into
dist/watch-together-<version>-linux-x64.tar.gz with a single
top-level folder (executable, lib/, data/). Uploads via
DISCORD_WEBHOOK_URL env (never committed) as a Components V2 card:
version header, short git commit, stat codeblock, tarball as File
component. --noupload skips, --skip-build reuses the last bundle.
Verified: 0.1.0 builds, exec bit preserved, payload asserted
against a stub (flag 32768, container+file shape, attachment ref).