Arclight Roadmap
Phase 1 status (2026-10-26)
Section titled “Phase 1 status (2026-10-26)”Phase 1 is partway through. The foundations and the data layer are built and tested: metadata (TMDB), library, profiles, indexers, download clients, the naming and notification packages, and the web shell. The release pipeline is the gap: the decision engine, grab, import, history, blocklist, calendar and notifications api modules do not exist yet (shared contracts for them are being written), and most web pages are placeholders. The parser package is being finished. Phase 0 is complete except authentication.
| Phase 1 item | Status |
|---|---|
| metadata (package, routes, refresh jobs) | done |
| library module | done, except disk scan |
| parser | in progress |
| profiles module | done, except separate language profiles |
| indexers module + package | done, except interactive-search UI and auto search |
| releases / decision engine | not started (contracts in progress) |
| downloads + download-clients package | in progress |
| organizer | in progress |
| history, blocklist, calendar, notifications | in progress |
| web | in progress |
Status markers below: [done], [in progress], [not started]. Tests: 778 passing across the workspace.
Clean-room build. Each phase ends with something that runs in Docker on the NAS and does
real work. Functionality first; the Tron theme is a layer in Phase 5 and does not block
anything before it. Behaviour specs for each area are written to docs/spec/ before the
code, derived from how the upstream apps behave.
Phase 0 — Skeleton that boots
Section titled “Phase 0 — Skeleton that boots”- [done] pnpm monorepo,
apps/api(Fastify + Drizzle/SQLite),apps/web(React + Vite),packages/shared(Zod contract). - [not started] Auth (first-run setup, sessions, API key). The api has no auth module and is unauthenticated today.
- [done] Settings store, system info, health, structured logging, in-process scheduler with a persistent job table, WebSocket feed (all present; the auth line above is the exception).
- [done] Multi-stage Dockerfile + compose with qBittorrent; PUID/PGID entrypoint. (The Dockerfile’s install layer copies only the api, web and shared manifests; verify the image still builds now that more packages exist.)
Done when: docker compose up on the NAS → setup wizard → dashboard, jobs visible.
Phase 1 — Library, metadata, parser, download pipeline (TV + movies)
Section titled “Phase 1 — Library, metadata, parser, download pipeline (TV + movies)”The core loop, for both media types from day one:
- [done]
packages/metadata: TMDB search/lookup for series and movies, images, refresh jobs. - [done]
librarymodule: root folders, series/seasons/episodes, movies, monitored flags, media files, disk scan, free-space. - [in progress]
packages/parser: release-name parser (title, year, season/episode/daily/anime/absolute numbering, quality source + resolution, codecs, HDR, audio, release group, proper/repack, languages, edition for movies, hash/scene checks). Fixture suite built from the documented upstream parser test cases (as data, not code). - [done]
profilesmodule: quality definitions and profiles, custom formats (spec engine), language profiles, delay profiles, release profiles (must/must-not contain, preferred). - [in progress]
indexersmodule +packages/indexers: Torznab/Newznab clients, categories, per-indexer settings, RSS sync, interactive + automatic search, indexer health/backoff. - [not started]
releasesmodule: decision engine (quality cutoff/upgrade, custom-format score, language, size limits, seeders, blocklist, already-grabbed, delay, protocol priority). - [in progress]
downloadsmodule (api module is nameddownload-clients) +packages/download-clients: qBittorrent client (add/track/remove, categories, seed limits, path mapping), queue, completed-download handling, import with episode/movie matching, failed-download handling and auto re-search. - [in progress]
organizermodule (the package exists with tests; no api module yet): naming tokens, rename preview, file moves/hardlinks, media management settings. - [in progress]
history,blocklist,calendar,notifications(Discord, Telegram, webhook, email, custom script, Jellyfin/Emby/Plex library refresh). - [in progress] Web: Library (one grid, TV + movies), item pages, add-new, Activity (queue/history/ blocklist), Calendar, Settings for everything above, interactive search modal.
Notes on partial items:
- metadata: image URL building only, no image caching yet.
- library: root-folder free space is reported; there is no disk scan.
- parser: 2910 of 2932 fixture cases pass (99.2%); package is uncommitted.
- profiles: language lives on the quality profile; no separate language-profile entity.
- indexers: Torznab/Newznab, caps, rate limit, backoff, RSS sync and manual search
(
GET /search) work. Automatic search needs the releases module. - downloads: qBittorrent client, remote path mappings, tracked downloads, queue and refresh job work. Completed-download handling, import and failed-download re-search need the imports module (in progress).
- history/blocklist/calendar/notifications: the
notificationspackage (agents for Discord, Telegram, webhook, email, script, push, media servers) is tested; the four api modules have no folders yet and only shared contracts exist. - web: shell, dashboard, search and the System pages are real; Library, Activity,
Calendar, Wanted and all Settings pages are
ComingSoonplaceholders.
Done when: add a series and a movie, both get searched, grabbed through qBittorrent, imported, renamed, and the media server is refreshed, with no other *arr installed.
Phase 2 — Indexer depth (Prowlarr parity)
Section titled “Phase 2 — Indexer depth (Prowlarr parity)”- YAML-defined site indexers (public and private trackers that lack Torznab), with login flows, search templates, result parsing. Definition format designed for Arclight, informed by Cardigann/Prowlarr’s catalogue.
- Indexer proxies (FlareSolverr, HTTP/SOCKS), per-indexer stats, rate limits, category mapping per media type, cross-indexer manual search page.
- Additional download clients: Transmission, Deluge, SABnzbd, NZBGet, rTorrent.
- Import lists (Trakt, TMDB lists, Plex watchlist, IMDb lists).
Phase 3 — Subtitles (Bazarr parity)
Section titled “Phase 3 — Subtitles (Bazarr parity)”subtitlesmodule: language profiles (forced/HI/cutoff), wanted list, per-file subtitle state, history, blacklist, upgrade logic, scoring with ranked matches.packages/subtitles: provider abstraction; OpenSubtitles.com, Subdl, Addic7ed, Podnapisi, Gestdown, Subf2m, Napisy24, Animetosho, embedded-subtitle extraction first; more by usage. Whisper (optional, external endpoint) last.- Post-processing: sync (ffsubsync/alass), encoding, custom scripts.
- Web: Subtitles pages — wanted, history, blacklist, profiles, providers, per-item manual search/upload.
Done when: subtitles arrive automatically after import for every configured language.
Phase 4 — Requests and discover (Seerr parity)
Section titled “Phase 4 — Requests and discover (Seerr parity)”- Users with roles, permission flags, quotas; local and media-server (Jellyfin/Emby/ Plex) sign-in.
requestsmodule: movie/series/season requests, approval flow and auto-approve, 4K/alternate-profile targets, override rules, issues + comments, watchlist sync, availability tracking against the library and the media server.- Discover: TMDB trending/popular/upcoming/genres/networks/people, configurable sliders.
- Notifications for request events; per-user notification agents (push, email, Discord DM, Telegram, webhook).
- Web: Discover pages, request flow, Requests admin, Issues, per-user settings.
Done when: a non-admin user requests a show, an admin approves, it is grabbed, imported, subtitled, and the user is notified it is available.
Phase 5 — neon light-grid theme and polish
Section titled “Phase 5 — neon light-grid theme and polish”- Theme tokens (neon cyan / orange on near-black, grid, glow), motion, typography.
- Dashboard as a live grid of activity; mobile layout; PWA.
Phase 6 — Adoption and release
Section titled “Phase 6 — Adoption and release”- Importer that reads existing Sonarr / Radarr / Prowlarr / Bazarr / Seerr databases and configs to adopt a running stack in place.
- Optional Sonarr/Radarr-shaped compatibility API for third-party tools.
- Backup/restore, update channel, docs, GHCR image, release process.
- Remove the pre-rename compatibility shims: the deprecated
MEDIATRON_*env fallback inapps/api/src/config.ts, the one-timemedia-tron.db->arclight.dbfile move inapps/api/src/db/index.ts, and acceptance ofmedia-tron_*.zipbackups in the backup module.