Repository navigation
Releases
Marquee v1.3.0
The biggest release so far: a new web app, Android TV and a faster Samsung TV app, Play now, Swedish, documentaries
and SVT Play, anime, shared libraries, and Cloudflare Access signing people in with their Marquee password.
Added
-
A new web app. The whole web app was redesigned: a cinematic home screen with a billboard and rows, peek
previews, full title pages (logo art, tagline, cast, recommendations), season pages with episode descriptions,
a new player, settings in groups, sheets and toasts, and the sign-in and password pages in the same style. -
Marquee as the sign-in for Cloudflare Access (OIDC). Access can use Marquee's own accounts as its login
(/c/oidc/,OIDC_CLIENT_ID,OIDC_CLIENT_SECRET,OIDC_REDIRECT_URIS): people sign in with their Marquee
password instead of email codes, and an invite signs the new person straight in. Anyone without a password yet
is asked to pick one; owners can send a Password link. See docs/remote-access.md. -
Setup knows the new settings.
node setup.jsand the Windows wizard (MarqueeSetup.exe) now offer the
Marquee sign-in for Access (they generate the client secret, work out the callback address from the team
domain and show what to enter in Cloudflare;node setup.js oidcshows it again), a cache folder for
browser copies and previews (CACHE_DIR, new installs) and the adult-content filter (CONTENT_FILTER).
With the Marquee sign-in on, the owner's password is required.doctorchecks half-setOIDC_*, short
secrets, a missingPUBLIC_URLand unknownCONTENT_FILTERvalues. -
Android TV app.
tv/androidis the Samsung app's twin for Android TV and Google TV, offered at/android
on the home network (install steps with Downloader) with self-updates through/android.json. Releases now
carryMarquee.apkandMarquee.json, built without a server address (the app asks on its first start), and
install.sh/install.ps1/ MarqueeSetup.exe put them intv/android/distunless a newer app is there.
See docs/android-tv.md. -
The Samsung TV app in Rust. Rewritten in Rust compiled to WebAssembly and drawn with WebGL
(public/tv-rs): faster browsing and the revamp look, with Skip intro, Up next, downloads and search. -
Shared libraries. People can share one library; titles one of them adds show up for all of them.
-
Versions. One title can have several qualities, with a picker and shared progress; a second copy of the
same quality is refused. -
Upgrade quality and Best Quality by picture. Best Quality ranks releases by source and bitrate instead of
seeders, and Upgrade quality sits on season pages and in the player's Quality menu. -
Anime. Nyaa search, season batches, AniList-aligned numbering, episode ranges for long seasons and a Dubbed
choice (dual-audio releases only). -
Add to library in one press when someone else already has the title, and Remove from my library while
it's still downloading. -
Profile pictures everywhere, and a redesigned Watch Together room; rooms now open, invite and play without a
Ready step. -
Trailers on title pages, a Cast line under descriptions (names link to TMDB) and seeder counts in
download details. -
Phone quality. Big 4K files play on phones as a live 1080p/720p stream (
PHONE_STREAMS_MAX). -
Adult-content filter for search and downloads (
CONTENT_FILTER=on|members|off,CONTENT_FILTER_WORDS). -
Subtitles: people's translations first and machine-translated ones labelled and replaced when a better one
appears, Georgian and Tagalog, rare languages found behind common ones, and English OCR mistakes fixed as
subtitles are served. -
Play on TV starts with the player's default subtitles, and the phone remote has Skip intro and Next episode.
-
Update notifications. Each new update in
whats-new.jsonis pushed once to everyone who hasn't read it, with
its title, a short summary and "Tap to read more", which opens its notes (/?update=<id>). New setting
Settings → Notifications → Marquee updates (pushUpdate, on by default). Only updates dated today or yesterday
go out, after the file has been unchanged for 90 s; sent ids are kept inDATA_DIR/.marquee-update-pushes.json. -
Watch Together on Play now. A room can be started on a video that is still downloading; guests need no access to the
download, the room is their access. The server holds the room until the download is far enough ahead (30 s that it
keeps, or a lead that lets the rest arrive in time, or 5 minutes buffered) and stops it at 8 s left, so nobody's player
runs dry mid-scene; the room says it's waiting for the download, with an estimate. When the download finishes, the host's
Switch now moves everyone to the library file from the same spot; a room whose download has left qBittorrent moves by
itself. In a room, Play now's own stall hold and buffering popup stay out of the way. -
Preview switch (
PREVIEW_DIR). Point it at a secondpublic/folder (for example a worktree of a redesign
branch) and/previewswitches one browser to it, with the live API, sign-in and permissions;/preview/off
switches back. Missing files fall back topublic/, the path guard is the same, preview pages get their own build
id (so they offer a reload when the preview is updated) and/api/statussayspreview: true. Server-drawn pages
(sign-in, share pages) get the preview'spages.css. Off by default; see docs/configuration.md. -
Title page data.
GET /api/title/:type/:id/page(TMDB logo art, tagline, runtime, genres, age rating, cast
with photos, recommendations; one cached TMDB call) andGET /api/tv/:id/season/:n(episode descriptions,
running times, air dates and stills). Not used by the current web app yet. -
GET /api/art?path=/t/p/w300/…. Small TMDB pictures through the server (TMDB's host and sizes up to w300 only, kept in
memory for a day), so the web app can read their colours: TMDB's CDN sometimes serves a copy cached without CORS headers. -
Play now. Watch a film or episode while it downloads, in any browser and on iPhones, whatever its format. qBittorrent downloads
it in order, and ffmpeg reads it through a loopback server that holds each read until those pieces are verified
(src/partial-stream.js), making the usual live HLS stream of up to 1080p. A popup explains when the video stops to wait for the
download, and another offers the full-quality file when it's finished. Subtitles, audio choices, casting and Watch Together
wait for the finished file. Browsers without HLS use hls.js 1.7.4 (Apache-2.0), vendored inpublic/vendor.
PARTIAL_STREAMS=offturns it off. -
Documentaries. A Documentaries tab in Discover and on the TV's home screen, with over 30 categories built from TMDB's genre,
keyword and country filters (src/documentaries.js) and SVT Play's own. -
SVT Play. Its free catalogue in Documentaries and search; Add copies the streams into the library without re-encoding, with
Swedish subtitles (src/svtplay.js,src/svt-queue.js). Smart Download uses it first for Swedish originals and otherwise when no
torrent can be found.SVT_PLAY=offleaves it out. -
Knaben as a torrent source (
KNABEN_URL), 1337x's Documentaries category for documentaries, and searches with å, ä and ö
also try the plain spelling that release names use. -
Downloads on the TV. Titles on their way show in an On its way row in the TV library with live progress, and a
Go to library button appears after adding a title. Smart-download messages and House warnings are translated too. -
Languages. Settings → Language switches all of Marquee between English and Svenska: the web app, player,
What's new, server messages, notifications, sign-in and share pages. The choice follows the account across
devices; a browser set to Swedish starts in Swedish. TMDB descriptions and genre names follow it, titles don't,
because the library and release search go by them. Add a line in the code and tests/i18n.test.mjs asks for its
Swedish (public/i18n-sv.js, src/i18n-sv.json, whats-new.sv.json). -
Jellyfin. The Marquee plugin for Jellyfin
shows someone's library in their own Jellyfin server. It pairs with a code entered under
Settings → Jellyfin, reads/c/jf/v1/library, streams through per-video HMAC-signed links,
copies saved subtitles and reports progress to Continue watching. Keys are stored hashed in
jellyfin_links(.marquee.db); disconnecting there, removing the person, or from the plugin
revokes the key and every link made with it. See docs/jellyfin.md. -
Agents can ask for your attention.
POST /api/agent/notify(House token, home network only) sends the
owner one notification; switch it off under Settings › Notifications › Agents.
Changed
- Conversions run copies and encodes side by side, keep their cache on any drive (
CACHE_DIR,
AUDIO_FIX_DIR), cap browser copies (BROWSER_COPIES_MAX_GB) and wait when a drive is nearly full
(MIN_FREE_GB). Browsers that play HEVC keep HEVC, and the banner says what each job is for. - Clip trims start with a hidden lead-in instead of lossless frames, which removes the stutter at the start.
- Skip intro finds titles after very long cold opens. When the first eight minutes hold no shared theme song, the search reaches fifteen minutes, and both neighbouring episodes must agree on what it finds. Results from the normal search are unchanged.
- Play now stutters less. It starts with up to 45 s in order when the download brings that within 20 s of the old minimum of 20 s.
In hls.js browsers a stall now holds the picture until a useful amount is buffered (8, then 16, then 32 s when stalls repeat) instead of
stopping after every 4 s piece. Episodes in season packs now really download in order: top file priority, which ...
Marquee v1.2.0
Security
- Marquee's own sign-in. Accounts are created on the server (
node setup.js user add EMAIL [--owner], alsopasswd,remove,signout,list); people sign in at/signinand can change
their password or sign out in Settings. scrypt password hashes, random session tokens stored only
as hashes,HttpOnly; SameSite=Laxcookies, per-account backoff and per-address lockout. - Visitors from the internet must sign in. The shared Home network account is given only to
visitors connecting directly from a private, loopback or Tailscale address, so a port forwarded by
mistake (or a tunnel without Access) shows a sign-in page instead of the library.
HOME_NETWORK_ACCESS=signinmakes everyone sign in. - Unwanted requests are refused: changes from other websites (CSRF,
Origin/Sec-Fetch-Site),
requests for unknown host names (DNS rebinding;ALLOWED_HOSTSadds names), and framing by other
sites. Security headers on every response. - Windows autostart without SYSTEM. The
Marquee Watchdogtask ran a script from the Marquee
folder as SYSTEM, so anyone able to change that script could take over the PC. TheMarqueetask
now restarts itself every 2 minutes as your account, without elevation; re-running
install-service.ps1removes the old task and limits write access to the Marquee folder.
node setup.js doctorwarns about both. - Clipper is pinned.
node setup.js clipperinstalls one reviewed commit and checks its SHA-256
tree hash before running anything, lists what Clipper installs, and no longer defaults to yes.
The commands for another PC check the installer's checksum instead of pipingmaininto a shell.
Added
- Windows setup wizard.
MarqueeSetup.exe(a release asset) is a normal Windows window that
installs Node.js and Marquee, then walks through library, network, sign-in, services, game clips
and start at boot, with folder pickers, a live port check and connection tests. The Clipper
add-on page installs the pinned Clipper on this PC, or gives the command for another PC and can
share the clips folder. It runs the same commands as the terminal setup (nothing of its own writes
.env), adds Marquee Setup to the Start menu for later changes, andnode setup.js guiopens
it. Newnode setup.js wizard info|check|clipperprint JSON for graphical front ends (read-only,
secrets reported only as set or not);install-service.ps1 -CredentialFiletakes the Windows
password from the wizard (DPAPI-encrypted for your account, deleted once read). - Download to phone. To phone on a film, a phone button on each episode and Season to
phone make small offline copies: Small (480p) or Standard (720p) H.264/AAC MP4s with the saved
subtitles as tracks and HDR tone-mapped to SDR, made one at a time (NVENC or x264), listed under
For your phone in the Library and announced by notification when ready. Full quality
downloads the file as it is.TRAVEL_DIR,TRAVEL_KEEP_DAYS(7),TRAVEL_MAX_GB(50). - Skip intro: a button (or S) during an episode's opening titles, found from an
Intro/Opening chapter or the theme song shared with neighbouring episodes of the season (audio
fingerprint of the first eight minutes, cached with the credits). Settings → Watching → Intros
can skip them automatically.GET /api/media/<lib|dl>/<id>/intro. - Notifications through Web Push with no dependencies (
src/push.js: VAPID ES256 signing and
RFC 8291 aes128gcm encryption onnode:crypto, checked against the RFC's test vector). Settings →
Notifications turns them on per device and switches downloads ready, new episodes (a show
you follow or have in your library got a new episode) and Watch Together invites (new Invite button in the
room bar) on or off. A service worker (public/sw.js), web app manifest and icons; iPhone needs
Marquee on the Home Screen. Keys and devices live in.marquee-push.json; endpoints must belong to
a known push service. - Bedtime menu in the player (moon button). Night mode (also N) evens out loud and
quiet scenes and lifts voices through Web Audio; the sleep timer pauses after 15–90 minutes
with a short fade, or at the end of the episode without starting the next one. - Subtitle look: style (Box, Shadow, Outline) and height (Low, Mid, High) next to the size,
and a second subtitle language shown above the first. - What's new: after an update, everyone sees its notes once in a sheet (written in
whats-new.json,
newest first; items can be marked"audience": "owner"). Settings → What's new lists past updates,
and a page left open through an update offers a reload. A What's new button in the header opens
the full history any time and lights up while an update is unseen; older updates back to the first
version are listed there too ("announce": falsekeeps an entry out of the popup). - Stats for nerds in the player: press
I(or right-click / long-press the picture) for a live
panel with everything about the stream. From the server's ffprobe of the exact file being
played: container, size, overall and per-stream bitrate, codec with profile and level, frame
rate, pixel format, colour primaries/transfer/matrix/range, HDR10/HLG/Dolby Vision with mastering
and light levels, every audio and subtitle stream, and the original release when a browser copy
is playing (GET /api/stream-info?src=). From the browser: codec string and whether it decodes
in hardware and smoothly, decoded and drawn size, presented frame rate and jitter, dropped
frames, startup and seek times, stalls, buffer ahead and download rate with one-minute graphs,
the active audio and subtitle choice, Watch Together clock and casting state. Copy puts the
whole report on the clipboard. node setup.js clipper: sets up game clips in one go. It createsCLIPS_DIR(next to
MEDIA_DIRby default) and either downloads and installs Clipper,
the replay-buffer recorder, on this computer, or prints what to run on your gaming PC (Windows
or Linux) with the share path, Marquee's address and the quality filled in, plus how to share
the folder. Quality is a preset (compact,balanced,high,max,smooth) or
bench:quality|smooth|balanced|small, which has Clipper measure the PC and pick.
Marquee v1.1.0
The first public release meant for installing on your own machine: a setup wizard, installers,
Docker images, autostart on every major platform, and a security fix for how accounts are identified.
Security
- Identity headers are no longer trusted from every client. Earlier versions took the account
fromCf-Access-Authenticated-User-Emailon any request, so a device that could reach Marquee's
port directly could act as any account, including the owner. Proxy and identity headers are now
removed unless the connection comes fromTRUSTED_PROXIES(default: this machine, where
cloudflared or a local proxy connects from), or the request carries a Cloudflare Access token that
Marquee verifies itself (CF_ACCESS_TEAM_DOMAIN+CF_ACCESS_AUD).
Added
node setup.js: interactive or unattended (--yes,--config) setup that detects the system,
edits.envin place without losing comments or unknown keys, generatesHOUSE_TOKENand
SCREENTIME_TOKEN, checks integrations, can install ffmpeg/Tesseract and set qBittorrent's save
path, and registers autostart. Privileged or system-changing steps always ask first; unattended
runs need explicit--allow-*flags.--dry-runshows changes without making them.node setup.js doctor: read-only health check of runtime, settings, data, disk space, ffmpeg
(with real test encodes), OCR, Apple TV, port, autostart and integrations.node setup.js backup(consistent SQLite copy plus state) andmigrate-data(move state to a new
DATA_DIR, keeping the originals aside).node setup.js service install|status|restart|uninstallfor Windows Task Scheduler, systemd (user
or system; waits for network and the media mount), launchd and OpenRC.install.shandinstall.ps1: install or update from a release archive verified against its
SHA-256 checksum; updates replace application files only and keep the previous version.- Docker image
ghcr.io/tjabooo/marqueefor linux/amd64 and linux/arm64 (non-root, healthcheck,
ffmpeg and Tesseract included) and a Compose file with qBittorrent, VPN (Gluetun, fails closed) and
FlareSolverr profiles, plus an NVIDIA override. DATA_DIR,HOST,TRUSTED_PROXIES,CF_ACCESS_TEAM_DOMAIN,CF_ACCESS_AUD,TESSERACTand
MARQUEE_ENV_FILEsettings;GET /api/health.- Windows: a "Marquee Watchdog" task that starts Marquee if Windows skipped its boot trigger.
- Notes image search on Linux and macOS through Tesseract.
- Startup warnings for broken settings; clean shutdown on SIGTERM.
- Documentation: install guides per platform, configuration reference (checked against the code by
a test), remote access, hardware acceleration, upgrading and backups, troubleshooting. - CI on Ubuntu, Windows and macOS with Node.js 22.16 and 24, Docker build and Compose start-up; a
release workflow with build provenance attestations.
Changed
- Node.js 22.16 or later is required. Notes search uses SQLite FTS5, which
node:sqlitein
Node.js 22.13-22.15 lacks; 1.0 documented Node.js 20, which never worked. - Server code moved into
src/;node server.jsstill starts Marquee. Windows scripts moved to
scripts/windows/(setup-autostart.ps1is nowinstall-service.ps1);start-marquee.cmdstays
at the root so existing scheduled tasks keep working. .env.examplelists every setting with integrations off by default; the README is now a short
landing page with details underdocs/.
Fixed
- Nine tests that no longer matched the app.
Upgrading from 1.0
See docs/upgrading-and-backups.md. If
cloudflared or your reverse proxy runs on a different machine than Marquee, set TRUSTED_PROXIES or
the Access token settings, or everyone will appear as the Home network account.