Files
iptvnator/docs/maintenance/agent-guidance-migration.md
T
4gray faad8fd8fd docs(agents): compact root guidance and preserve task-specific knowledge (#1645)
* docs(agents): compact root guidance and preserve task-specific knowledge

* fix(agents): parse guidance navigation with Markdown tokens

* fix(agents): validate generic literal repository paths

* fix(agents): distinguish code symbols and shortcut images

* fix(agents): recognize SCSS filename literals

* fix(agents): handle fenced imports and encoded paths

* fix(agents): parse prose and rendered HTML anchors

* fix(agents): validate rendered HTML navigation

* fix(agents): use GitHub-compatible heading slugs

* fix(agents): require standalone top-level Claude import

* fix(agents): exclude HTML-contained guidance imports

* fix(agents): handle image fragments and quoted imports

* fix(agents): validate visible HTML and image source sets

* fix(agents): recognize package scopes and route source work

* fix(agents): parse JSONC and constrain package exemptions

* fix(agents): decode link entities and allow package subpaths

* fix(agents): route source work and check extensionless files

* fix(agents): support package versions and source fragments

* fix(agents): accept qualified package prose

* fix(agents): retain rendered context for Markdown references

* fix(agents): validate visible headings and spaced paths

* fix(agents): validate media and hyphenated literal paths

* fix(agents): decode full HTML entities and media assets

* fix(agents): recognize possessive package mentions

* fix(agents): validate extensionless imports and version comparators

* fix(agents): retain visible backticks and explicit path punctuation

* fix(agents): validate image-map navigation targets

* fix(agents): count all Markdown line endings in budgets

* fix(agents): delimit package prose at Unicode punctuation

* fix(agents): normalize punctuation for extensionless imports

* fix(agents): preserve filenames across prose punctuation

* fix(agents): validate iframe document references

* fix(agents): inspect document suffix before URL fragments

* fix(agents): unify Markdown suffix and encoded import guards

* fix(agents): handle wildcard versions and alternate documents

* fix(agents): validate document formats and trim HTML URLs

* fix(agents): cover document families and guidance basenames

* fix(agents): require files for media references

* fix(agents): preserve block boundaries and validate embeds

* fix(agents): normalize internal HTML URL whitespace

* fix(agents): reject empty media and ignore URL at-signs

* fix(agents): validate srcdoc references and empty srcset

* fix(agents): honor HTML bases and preserve adjacent imports

* fix(agents): convert base file URLs to native paths

* fix(agents): preserve imports after bare URL punctuation

* fix(agents): exclude opaque URI prose from import scans

* fix(agents): keep import tokens outside URI scheme matches

* fix(agents): restrict opaque URI exemptions to parsed links

* fix(agents): handle opening prose delimiters

* fix(agents): scan nested imports and share document suffixes

* fix(agents): reject pathless media and direct file URLs

* fix(agents): reject file bases and preserve quoted URL boundaries

* fix(agents): distinguish URL quotes and cover guidance variants

* fix(agents): validate SVG images and conventional guides

* fix(agents): handle declared package names handles and SVG use

* fix(agents): normalize closing punctuation on federated handles

* fix(agents): normalize Unicode punctuation on handles

* fix(agents): normalize possessive federated handles

* fix(agents): separate parenthetical prose from handles

* fix(agents): exclude www autolinks from import scanning

* ci: allow manual CodeQL validation of PR branches

* fix(agents): reject nonportable Windows drive links
2026-09-21 18:07:14 +02:00

191 KiB
Raw Blame History

Agent guidance migration ledger

Issue #1643, 2026-09-20. Immutable source commit: d4df0fd81a71f0bf196ceac2b45efe3697feb973. Original files: AGENTS.md (1,217 lines, 88,565 bytes) and CLAUDE.md (2,022 lines, 231,858 bytes). Table coordinates refer to these immutable files, not the shortened roots. This is audit evidence; it is not a required startup document.

Method and coverage

Every non-empty source block was inventoried. Headings, standalone labels, separator lines and Nx markers are structural; their contents are represented below. Lists are split at each top-level item; code fences stay intact. The 17,847-character CLAUDE.md line 1315 is split into sentence-level entries so individual constraints do not disappear behind one row. Repeated entries from the two agents intentionally retain separate source references.

716 content entries are accounted for below; there are no unassigned source blocks. "Existing contract" means the canonical document already carries the behavior and was reviewed instead of copying another summary. "Added" and "Moved" identify knowledge incorporated during this change. Destination sections are entry points into the owning contract; adjacent subheadings cover supporting exceptions and examples. The context map is the live navigation surface; this ledger records the one-time relocation.

Corrections and consolidation decisions

  • Root growth/mirroring requirements are replaced by one source of common rules and topic-specific maintenance in agent workflow. Root limits do not apply to canonical reference docs; those load on demand.
  • Stalker static URL wording was oversimplified. Missing flag evidence still requires minting a link (with the directly playable radio exception), as specified in playback link resolution and implemented by the existing Stalker link-semantics utilities. Keep the authoritative decision table, not the old "otherwise static" shorthand.
  • Generic Electron detection is not an individual capability gate. Desktop also has Chromium settings storage, PWA supports browser-selected uploads, and SQL and IndexedDB schemas are not identical. Preserve the existing DataFactory boundary with these corrections in service factory and build bases.
  • Browser wake-lock auto-release clears the sentinel; the next media/visibility/ PiP sync reacquires. Preserve actual renderer behavior, not an implication of immediate unconditional reacquisition; see display sleep.
  • Full-file formatting recovery must preserve unrelated user edits. Replace the unconditional merge-base overwrite recipe with safe reconstruction.
  • The TypeScript hard limit is 400, not a variable 350–400; target under 300. HostBinding/HostListener conventions are retained, not silently modernized.
  • Nx tools and global skills are optional. Retain discovery fallbacks and the managed markers in AGENTS.md.
  • Build/serve examples use local pnpm Nx or package scripts. Packaging uses package:app (make --prepackageOnly), not the obsolete electron-backend:package target suggested in the old alternative command.
  • Version-specific signing patch rationale was missing from canonical docs and now lives in the dependency contract.
  • Exhaustive trees, diagrams and code examples are consolidated into the owning architecture/maintenance sections; they do not become a second project map. Existing snapshot inventories are navigation aids, not instructions to duplicate every new project in the root. Plan saving respects active no-write modes.

Block inventory

Original source Section and contract / example Canonical destination Disposition
AGENTS.md:3–3 AGENTS.md — This file provides guidance to coding agents working in this repository. Plans and completion reports Moved / consolidated
AGENTS.md:7–7 Plan Mode — When an agent is in Plan Mode and produces a final <proposed_plan>, it must also save that finalized plan… Plans and completion reports Moved / consolidated
AGENTS.md:8–8 Plan Mode — Save only finalized plans. Do not write interim exploration, questions, or draft revisions to .plans/. Plans and completion reports Moved / consolidated
AGENTS.md:9–9 Plan Mode — Use the filename pattern YYYY-MM-DD-short-topic.md such as .plans/2026-03-12-channel-filtering.md. Plans and completion reports Moved / consolidated
AGENTS.md:10–10 Plan Mode — If the intended filename already exists, append a numeric suffix such as -2, -3, and so on. Plans and completion reports Moved / consolidated
AGENTS.md:14–14 Agent Bootstrap — In a fresh worktree, run pnpm install --frozen-lockfile before relying on Nx project discovery, lint,… Fresh Worktree Bootstrap and Discovery Existing contract
AGENTS.md:15–15 Agent Bootstrap — Re-run the install whenever the checkout moves — git pull, git reset --hard, a rebase, or a worktree… Fresh Worktree Bootstrap and Discovery Existing contract
AGENTS.md:16–16 Agent Bootstrap — Never run prettier --write on CLAUDE.md, AGENTS.md or docs/. These files are not Prettier-clean upstream,… Protected Markdown edits Corrected safe restore
AGENTS.md:17–17 Agent Bootstrap — After dependencies are installed, verify workspace discovery with pnpm nx show projects. Fresh Worktree Bootstrap and Discovery Existing contract
AGENTS.md:18–18 Agent Bootstrap — Use scoped path aliases from tsconfig.base.json such as @iptvnator/services, @iptvnator/shared/interfaces,… Import Aliases and Public APIs Existing contract
AGENTS.md:19–19 Agent Bootstrap — Every Nx project should keep scope:, domain:, and type: tags in project.json so… Project Tags Existing contract
AGENTS.md:20–20 Agent Bootstrap — See docs/architecture/nx-workspace-boundaries.md for the current Nx tag and alias policy. Import Aliases and Public APIs Existing contract
AGENTS.md:21–22 Agent Bootstrap — Keep nx and every official @nx/ package on the same exact version; run pnpm run deps:nx:validate after… Nx Dependency Updates Existing contract
AGENTS.md:23–24 Agent Bootstrap — Use the Node version in .nvmrc for development and CI. Angular 22 requires Node ^22.22.3 || ^24.15.0 and… Angular 22 Toolchain Compatibility Existing contract
AGENTS.md:25–29 Agent Bootstrap — Vite 8.1.5, resolved through Angular's build tooling, retains upstream precise matchers and adds bounded… Vite Dev-Server Patch Existing contract
AGENTS.md:30–40 Agent Bootstrap — app-builder-lib 26.15.7 (electron-builder's macOS signing) is patched in… Electron Builder signing patch Added missing detail
AGENTS.md:41–47 Agent Bootstrap — node-gyp is a declared root devDependency because apps/electron-backend/build-embedded-mpv.js resolves it… Packaging State Existing contract
AGENTS.md:48–52 Agent Bootstrap — nx-electron@22.0.0 uses a local Nx 23 export-path patch and an explicit webpack-node-externals package… Angular 22 Toolchain Compatibility Existing contract
AGENTS.md:53–59 Agent Bootstrap — A directory holding files consumed by other projects must be an Nx project. Nx builds its graph from… Shared Stylesheets and Cache Inputs Existing contract
AGENTS.md:60–63 Agent Bootstrap — Update Nx with pnpm nx migrate nx@<target> --skipInstall, regenerate the lockfile, run generated… Nx Dependency Updates Existing contract
AGENTS.md:64–64 Agent Bootstrap — ESLint enforces max-lines on TypeScript files: production code targets under 300 with a hard maximum of… TypeScript File Size Existing contract
AGENTS.md:65–65 Agent Bootstrap — Project lint targets that shell out to eslint must quote the glob, e.g. eslint "apps/<project>//.ts". An… Command-Based Lint Targets Existing contract
AGENTS.md:66–66 Agent Bootstrap — Repository-specific skills live under .codex/skills/. Repository skills Moved / consolidated
AGENTS.md:67–68 Agent Bootstrap — Frontmatter descriptions are trigger-only and begin with Use when; keep each skill at or below 500 words. Repository skills Moved / consolidated
AGENTS.md:69–70 Agent Bootstrap — Run pnpm run skills:validate after editing a committed skill or a literal path it documents. Repository skills Moved / consolidated
AGENTS.md:71–72 Agent Bootstrap — Keep .codex and .claude copies of release-notes and release-cut byte-identical. Repository skills Moved / consolidated
AGENTS.md:76–76 Documentation After Changes — After implementing a meaningful change, agents must assess whether canonical repo docs need updates before… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:77–77 Documentation After Changes — Meaningful changes include new or changed user-visible behavior, architecture or data-flow changes,… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:78–78 Documentation After Changes — Skip doc updates for trivial refactors with unchanged behavior, formatting-only edits, and isolated… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:79–82 Documentation After Changes — Prefer updating an existing authoritative doc before creating a new one: 1. README.md for top-level… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:83–83 Documentation After Changes — Keep the root CLAUDE.md and this file up to date. They are living documents: whenever a change touches… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:84–84 Documentation After Changes — When adding a new feature area, check whether the Architecture or Key Features sections of CLAUDE.md… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:85–85 Documentation After Changes — Do not let CLAUDE.md or AGENTS.md drift: a stale path or route in these files poisons the context of every… Maintaining canonical knowledge Moved / consolidated
AGENTS.md:86–86 Documentation After Changes — Repo docs are canonical even when they were originally drafted by an LLM. Maintaining canonical knowledge Moved / consolidated
AGENTS.md:87–87 Documentation After Changes — Final task summaries should state whether docs were updated and which doc changed. Maintaining canonical knowledge Moved / consolidated
AGENTS.md:91–91 Release Notes For User-Visible Changes — Any change a user could notice — new behavior, changed behavior, bug fix, performance win, breaking change… File Existing contract
AGENTS.md:92–92 Release Notes For User-Visible Changes — Name it <area>-<short-slug>.md; area matches the conventional-commit scope. There is no version field —… File Existing contract
AGENTS.md:93–93 Release Notes For User-Visible Changes — Write the body for a user, not a reviewer: "the player now remembers volume between episodes", not "hoist… Writing the body Existing contract
AGENTS.md:94–94 Release Notes For User-Visible Changes — type: internal records invisible maintenance. Internal notes stay collapsed in CHANGELOG.md, are omitted… Writing the body Existing contract
AGENTS.md:95–95 Release Notes For User-Visible Changes — highlight: <short headline> (max 60 characters, rejected on type: internal) marks a note as one of the… Writing the body Existing contract
AGENTS.md:96–96 Release Notes For User-Visible Changes — Skip the note for test-only changes, docs, CI/workflow plumbing, and pure refactors with no behavior… When a note is not needed Existing contract
AGENTS.md:97–97 Release Notes For User-Visible Changes — CI enforces this: the "Release note gate" job in .github/workflows/ci.yml fails PRs that change runtime… Surfaces built from one set of notes Existing contract
AGENTS.md:98–98 Release Notes For User-Visible Changes — The release-notes skill covers writing notes; the release-cut skill covers the full release sequence.… Surfaces built from one set of notes Existing contract
AGENTS.md:99–99 Release Notes For User-Visible Changes — Validate before finishing: pnpm run release:notes:validate. Commands Existing contract
AGENTS.md:100–100 Release Notes For User-Visible Changes — Announcement drafts and highlight cards are built from the same notes: pnpm --silent run… Writing the body Existing contract
AGENTS.md:101–101 Release Notes For User-Visible Changes — Pushes to master and v can publish Docker images. A v tag build creates a draft GitHub release. Two phases Existing contract
AGENTS.md:102–102 Release Notes For User-Visible Changes — pnpm run release:verify:draft waits for that tag build (polling until the run is indexed, then gh run… Draft verification Existing contract
AGENTS.md:103–103 Release Notes For User-Visible Changes — Publishing the GitHub release verifies its Snap assets and automatically uploads them to edge;… After verification Existing contract
AGENTS.md:104–104 Release Notes For User-Visible Changes — Release-post screenshots come only from the release capture script running against the mock servers. Never… Screenshots Existing contract
AGENTS.md:105–105 Release Notes For User-Visible Changes — Final task summaries should state whether a release note was added or why it was skipped. Plans and completion reports Moved / consolidated
AGENTS.md:109–114 AppImage Manager Metadata — AppManager full-download discovery uses appImage.desktop.entry URL fields. Electron Builder generates the… Surfaces built from one set of notes Existing contract
AGENTS.md:118–118 Upgrade And Migration Compatibility — Users may skip releases. The application must apply all required migrations in dependency order when… Upgrade Compatibility And Migrations Existing contract
AGENTS.md:119–119 Upgrade And Migration Compatibility — Preserve migration paths for existing persisted data. Do not make deleting a database/profile or… Upgrade Compatibility And Migrations Existing contract
AGENTS.md:120–120 Upgrade And Migration Compatibility — Create required tables first, add missing columns before dependent indexes/triggers/queries, and make… Upgrade Compatibility And Migrations Existing contract
AGENTS.md:121–121 Upgrade And Migration Compatibility — For persistence changes, test real SQLite initialization with representative historical schemas and data,… Upgrade Compatibility And Migrations Existing contract
AGENTS.md:122–122 Upgrade And Migration Compatibility — See libs/shared/database/README.md for SQLite migration ownership and validation guidance. Upgrade Compatibility And Migrations Existing contract
AGENTS.md:126–126 Regression Prevention And Test Updates — Before the final summary for any feature, behavior change, bug fix, data-flow change, Electron… Test impact and completion Existing contract
AGENTS.md:127–127 Regression Prevention And Test Updates — Bug fixes must normally include regression coverage that fails on the old behavior and passes with the… Test impact and completion Existing contract
AGENTS.md:128–128 Regression Prevention And Test Updates — Feature work and behavior changes must update existing tests when assertions, fixtures, mocks, routes, or… Test impact and completion Existing contract
AGENTS.md:129–133 Regression Prevention And Test Updates — Default validation ladder: 1. Run targeted unit tests for directly affected projects with pnpm nx test… Test impact and completion Existing contract
AGENTS.md:134–134 Regression Prevention And Test Updates — Electron-specific changes affecting IPC, SQLite, packaged runtime, external players, native file access,… Test impact and completion Existing contract
AGENTS.md:135–135 Regression Prevention And Test Updates — Final task summaries must list tests added or updated, validation commands run with results, and any… Test impact and completion Existing contract
AGENTS.md:139–146 Legacy Desktop Profile Migration — electron-profile-bootstrap.ts selects the known v0.19 electron-backend profile before eager main-process… Desktop upgrades from legacy profiles Existing contract
AGENTS.md:148–154 Legacy Desktop Profile Migration — Startup shows AppStartupStatusComponent until the initial route and source inventory are ready, including… Desktop upgrades from legacy profiles Existing contract
AGENTS.md:158–158 Electron Debugging (CDP) — Start the Electron development app with: nx serve electron-backend Start and attach Moved / consolidated
AGENTS.md:159–159 Electron Debugging (CDP) — Package-script equivalent: pnpm run serve:backend Start and attach Moved / consolidated
AGENTS.md:160–160 Electron Debugging (CDP) — Electron is configured to start with: --remote-debugging-port=9222 Start and attach Moved / consolidated
AGENTS.md:161–161 Electron Debugging (CDP) — Connect Chrome DevTools Protocol tools to: 127.0.0.1:9222 Start and attach Moved / consolidated
AGENTS.md:162–162 Electron Debugging (CDP) — For Electron automation/debugging tasks, use the electron skill Start and attach Moved / consolidated
AGENTS.md:163–163 Electron Debugging (CDP) — Do not auto-open DevTools during normal CDP automation. In development, DevTools is opt-in via… Start and attach Moved / consolidated
AGENTS.md:164–164 Electron Debugging (CDP) — If DevTools is open, agent-browser --cdp 9222 ... may attach to the DevTools page instead of the IPTVnator… Start and attach Moved / consolidated
AGENTS.md:165–165 Electron Debugging (CDP) — If that happens, inspect targets with curl http://127.0.0.1:9222/json/list and connect directly to the… Start and attach Moved / consolidated
AGENTS.md:166–166 Electron Debugging (CDP) — The app holds a single-instance lock (acquireSingleInstanceLock in… Start and attach Moved / consolidated
AGENTS.md:170–170 Trace / Debug Startup — Full startup tracing: Start and attach Moved / consolidated
AGENTS.md:172–174 Trace / Debug Startup — bash IPTVNATOR_TRACE_STARTUP=1 nx serve electron-backend Start and attach Moved / consolidated
AGENTS.md:176–184 Trace / Debug Startup — Narrower trace flags: - IPTVNATOR_TRACE_IPC=1 traces renderer window.electron. bridge calls -… Start and attach Moved / consolidated
AGENTS.md:186–188 Trace / Debug Startup — Settings, portal request/response, and trace payloads must use @iptvnator/shared/logging or the redacting… Start and attach Moved / consolidated
AGENTS.md:190–190 Trace / Debug Startup — If local Nx state gets weird before a rerun: Start and attach Moved / consolidated
AGENTS.md:192–194 Trace / Debug Startup — bash pnpm nx reset Start and attach Moved / consolidated
AGENTS.md:198–203 agent-browser (global install) — bash agent-browser --cdp 9222 tab list agent-browser --cdp 9222 tab 1 agent-browser --cdp 9222 snapshot -i… Start and attach Moved / consolidated
AGENTS.md:207–209 Fallback — bash npx --yes agent-browser --cdp 9222 tab list Start and attach Moved / consolidated
AGENTS.md:213–218 DevTools Workaround — bash ELECTRON_OPEN_DEVTOOLS=1 nx serve electron-backend curl http://127.0.0.1:9222/json/list agent-browser… Start and attach Moved / consolidated
AGENTS.md:222–226 Xtream Category Management — The Electron Live TV, Movies, and Series category dialog applies Select/Deselect to search results while a… Behavior Notes Existing contract
AGENTS.md:230–234 XMLTV Response Compression — Electron decodes HTTP compression before the gzip file layer. For .gz/gzip metadata plus HTTP gzip, a… XMLTV response compression Existing contract
AGENTS.md:238–256 XMLTV Source Removal — Saving Settings → EPG reconciles cached XMLTV with committed global URLs and all enabled M3U playlist… XMLTV source lifecycle Existing contract
AGENTS.md:260–269 Web Backend Provider Redirects — All four provider proxy routes use ValidatedHttpClient: automatic redirects are disabled, the initial URL… Web Backend Existing contract
AGENTS.md:273–278 Portal Connectivity Preference — Half-open trial slots follow the complete request lifetime with no elapsed-time expiry. All four… Desktop preference and account feedback Existing contract
AGENTS.md:279–286 Portal Connectivity Preference — Desktop Settings > General > Portal connections exposes default-on Settings.portalConnectivityGuard. Only… Desktop preference and account feedback Existing contract
AGENTS.md:287–289 Portal Connectivity Preference — Both account-info dialogs explain guard refusals with localized paused-request copy and Retry now; Stalker… Desktop preference and account feedback Existing contract
AGENTS.md:293–299 Live Channel Return — Xtream and Stalker (including radio) capture displayed playback order on explicit selection. Remote… Live channel return and playback order Existing contract
AGENTS.md:303–309 Stalker Live Search — ITV sidebar and fullscreen searches independently filter the complete selected category; only All Items… Full ITV Channel List Cache Existing contract
AGENTS.md:313–339 Live TV Panel Levels — Portal live layouts (Xtream live, Stalker itv/radio) fold their panels from the outside in, in three… Collapsible Live Sidebar Existing contract
AGENTS.md:343–358 Channel and Detail Keyboard Scrolling — Channel scroll owners use ChannelScrollFocusDirective; pointer selection focuses the viewport, native… Detail Scroll and Focus Existing contract
AGENTS.md:362–370 Xtream Connection Test — Add/Edit source Test HTTPS and HTTP discloses plaintext credential use before the click and can replace an… Explicit protocol discovery Existing contract
AGENTS.md:374–382 Xtream Live Auto Format — The routed Xtream live host supplies liveAutoTsUrl only for Auto with explicit HLS+TS account evidence,… Initial Auto HLS failure Existing contract
AGENTS.md:386–402 Xtream Catch-Up Server Timezone — The {Y-m-d:H-M} segment of a timeshift URL is read by the panel in ITS timezone (server_info.timezone),… Catch-Up Playback URLs Existing contract
AGENTS.md:406–406 Radio / Audio Player — M3U playlists can contain radio channels identified by the radio="true" attribute on #EXTINF lines. When a… Radio audio player Existing contract
AGENTS.md:408–408 Radio / Audio Player — The dedicated AudioPlayerComponent (libs/ui/playback/src/lib/audio-player/) renders instead of a video player Radio audio player Existing contract
AGENTS.md:409–409 Radio / Audio Player — The audio player always uses the built-in inline player — external player settings (MPV/VLC) are ignored Radio audio player Existing contract
AGENTS.md:410–410 Radio / Audio Player — The EPG panel is hidden (radio streams have no EPG data) Radio audio player Existing contract
AGENTS.md:411–411 Radio / Audio Player — The layout uses a cinematic hero pattern: the station logo is blurred as a full-area backdrop with a… Radio audio player Existing contract
AGENTS.md:412–412 Radio / Audio Player — Volume is shared with the video player via localStorage key 'volume' Radio audio player Existing contract
AGENTS.md:413–413 Radio / Audio Player — Keyboard shortcuts: ArrowUp/ArrowDown (volume +/-5%), M (mute toggle) Radio audio player Existing contract
AGENTS.md:414–414 Radio / Audio Player — Radio detection in the video player template: activeChannel.radio === 'true' — this is a string… Radio audio player Existing contract
AGENTS.md:416–416 Radio / Audio Player — Key files: Radio audio player Existing contract
AGENTS.md:418–418 Radio / Audio Player — libs/ui/playback/src/lib/audio-player/audio-player.component.ts — the audio player component Radio audio player Existing contract
AGENTS.md:419–419 Radio / Audio Player — libs/ui/playback/src/lib/audio-player/audio-player.component.scss — cinematic hero styling Radio audio player Existing contract
AGENTS.md:420–420 Radio / Audio Player — libs/playlist/m3u/feature-player/src/lib/video-player/video-player.component.html — template conditionals… Radio audio player Existing contract
AGENTS.md:421–421 Radio / Audio Player — libs/shared/interfaces/src/lib/channel.interface.ts — radio: string field on Channel interface Radio audio player Existing contract
AGENTS.md:425–434 M3U Playback Mode — isLikelyM3uVod in libs/shared/m3u-utils recognizes video-file extensions and exact /movie/, /movies/,… M3U Playback Mode Existing contract
AGENTS.md:438–440 M3U URL User-Agent — PlaylistsService.getPlaylist() joins the per-playlist mutation queue so a route opened during refresh… User-Agent for URL sources Existing contract
AGENTS.md:441–445 M3U URL User-Agent — The URL import form accepts an optional User-Agent and stores it as Playlist.userAgent. Electron sends it… User-Agent for URL sources Existing contract
AGENTS.md:446–448 M3U URL User-Agent — Reuse the existing source editor and channel-over-playlist playback header precedence. Contract:… User-Agent for URL sources Existing contract
AGENTS.md:452–466 Shared Player Controls — Stream info popover: an info button in the top-right corner of the shared controls overlay shows live… Stream info popover Existing contract
AGENTS.md:468–473 Shared Player Controls — The Embedded MPV native-view dock follows app theme tokens as a solid app surface, including Material… Player And EPG Theme Boundaries Existing contract
AGENTS.md:475–478 Shared Player Controls — libs/ui/playback/src/lib/player-controls/ contains the additive, engine-neutral PlayerController contract,… Landed architecture Existing contract
AGENTS.md:479–494 Shared Player Controls — The subtitle menu carries capability-gated advanced subtitle support (#1408): external subtitle file… Advanced subtitle support Existing contract
AGENTS.md:495–501 Shared Player Controls — In fullscreen, app-player-controls shows a pointer-transparent media-title overlay at the top while… Fullscreen media title Existing contract
AGENTS.md:502–524 Shared Player Controls — Auto-hide pauses while the pointer is over the controls bar or keyboard focus is inside it, but only… Keyboard ownership Existing contract
AGENTS.md:525–534 Shared Player Controls — Persisted Settings.webPlayerSharedControls is default-ON (absent stored values coerce with !== false; only… Current status Added missing detail
AGENTS.md:535–543 Shared Player Controls — Settings.showCaptions is deliberately outside this rollout gate: it is engine state, not controls UI.… Current status Existing contract
AGENTS.md:544–554 Shared Player Controls — The modes differ in how long the preference is enforced. Shared controls are authoritative for the… Caption preference in both modes Existing contract
AGENTS.md:555–563 Shared Player Controls — Shared controls include a per-session quality menu (Auto + "1080p"-style levels via setQualityLevel;… Quality (bitrate/level) selection Existing contract
AGENTS.md:564–568 Shared Player Controls — Embedded MPV ignores the web-player preference. Frame-copy always uses shared DOM controls through its… Embedded MPV rendering constraints Existing contract
AGENTS.md:569–576 Shared Player Controls — Frame-copy shared controls own DOM surface interactions, shortcuts, fullscreen, and recording feedback.… Embedded MPV rendering constraints Existing contract
AGENTS.md:577–660 Shared Player Controls — WebPlayerViewComponent renders app-fullscreen-channel-panel… Fullscreen channel panel Existing contract
AGENTS.md:661–670 Shared Player Controls — Embedded MPV seek steps (arrow keys, ±10 s buttons, PlayerController.seekBy) go through the relative… Resume And Track Handling Existing contract
AGENTS.md:671–676 Shared Player Controls — M3U Favorites and Recently Viewed resolve Channel.drm into ResolvedPortalPlayback.drm through… DASH + ClearKey Playback Existing contract
AGENTS.md:677–694 Shared Player Controls — DASH (.mpd) sources play through a lazily imported Shaka Player source engine… DASH + ClearKey Playback Existing contract
AGENTS.md:695–701 Shared Player Controls — mpegts.js 1.8.1 errors from HTML5, Video.js, and ArtPlayer cross one version-locked structured evidence… Codec And Container Diagnostics Existing contract
AGENTS.md:702–834 Shared Player Controls — Browser playback diagnostics and recovery policy live in libs/playback/util and are exported by… Codec And Container Diagnostics Existing contract
AGENTS.md:835–852 Shared Player Controls — The built-in HTML5/hls.js player is the second guarded consumer. HtmlVideoPlayerComponent provides a… Web adapter and web-engine bridges Existing contract
AGENTS.md:853–886 Shared Player Controls — Video.js is the third guarded consumer. VjsPlayerComponent provides a component-scoped… Web adapter and web-engine bridges Existing contract
AGENTS.md:887–904 Shared Player Controls — ArtPlayer is the fourth guarded consumer. ArtPlayerComponent provides a component-scoped… Web adapter and web-engine bridges Existing contract
AGENTS.md:905–914 Shared Player Controls — Shared web picture-in-picture stays inside that default-on rollout. PlayerController exposes capability… Standard element picture-in-picture Existing contract
AGENTS.md:915–933 Shared Player Controls — WebVideoControlsAdapter supplies its current video and binding generation to… Standard element picture-in-picture Existing contract
AGENTS.md:934–935 Shared Player Controls — Canonical docs: docs/architecture/player-controls-contract.md and docs/architecture/embedded-mpv-native.md Web adapter and web-engine bridges Existing contract
AGENTS.md:939–946 Display Sleep During Playback — PlaybackKeepAwakeService (apps/web/src/app/services/playback-keep-awake.service.ts) watches every <video>… Display sleep during playback Added missing detail
AGENTS.md:947–953 Display Sleep During Playback — Electron: a main-process powerSaveBlocker behind window.electron.setPlaybackKeepAwake… Display sleep during playback Added missing detail
AGENTS.md:954–956 Display Sleep During Playback — Radio's <audio> deliberately never blocks display sleep. Embedded MPV holds its own blocker in… Display sleep during playback Added missing detail
AGENTS.md:960–962 Windows Embedded MPV Pin Maintenance — PR, master, and tag builds resolve the Windows runtime only from… Windows CI pin lifecycle Existing contract
AGENTS.md:963–964 Windows Embedded MPV Pin Maintenance — Validate the checked-in schema and provenance with pnpm embedded-mpv:windows-runtime-pin:check. Windows CI pin lifecycle Existing contract
AGENTS.md:965–968 Windows Embedded MPV Pin Maintenance — Prepare a manual rotation with pnpm embedded-mpv:windows-runtime-pin:refresh -- --force. The weekly… Windows CI pin lifecycle Existing contract
AGENTS.md:969–972 Windows Embedded MPV Pin Maintenance — The PAT-backed refresh job must keep every third-party action pinned to a full commit. Do not mirror the… Windows CI pin lifecycle Added missing detail
AGENTS.md:976–979 Linux Embedded MPV Packaging — Official Linux frame-copy artifacts are x64-only. AppImage, DEB, RPM, Pacman, Snap, and Flatpak are… Linux Support Matrix Existing contract
AGENTS.md:980–986 Linux Embedded MPV Packaging — Packaging runs three isolated profiles: - system: DEB/RPM/Pacman, no private native/lib, with package… Linux Support Matrix Existing contract
AGENTS.md:987–990 Linux Embedded MPV Packaging — Flatpak is an isolated packaging pass and keeps iptvnator as the real Electron ELF so Electron Builder's… Linux Support Matrix Existing contract
AGENTS.md:991–993 Linux Embedded MPV Packaging — The DEB system-runtime contract is Ubuntu 24.04+ (libmpv2). Ubuntu 22.04 provides libmpv1, so use the x64… Linux Support Matrix Existing contract
AGENTS.md:994–997 Linux Embedded MPV Packaging — Only iptvnator_mpv_helper may link libmpv. The Electron executable, Electron libraries, embedded_mpv.node,… Linux Support Matrix Existing contract
AGENTS.md:998–1002 Linux Embedded MPV Packaging — electron-backend/native{,//} is excluded from app.asar; afterPack exclusively writes the… Linux Support Matrix Existing contract
AGENTS.md:1003–1005 Linux Embedded MPV Packaging — Packaged addon, frame-reader, and helper discovery is package-owned app.asar.unpacked only. Writable… Linux Support Matrix Existing contract
AGENTS.md:1006–1010 Linux Embedded MPV Packaging — Pristine afterPack/unpacked layouts scan Electron libraries recursively. Extracted Snap payloads exclude… Linux Support Matrix Existing contract
AGENTS.md:1011–1015 Linux Embedded MPV Packaging — Linux frame-copy availability is fail-closed. The packaged manifest, artifact modes, declared bundled… Linux Support Matrix Existing contract
AGENTS.md:1016–1027 Linux Embedded MPV Packaging — Snap is core22/strict and uses an exact private shared-memory plug plus the graphics-core22 content plug… Frame-Copy Engine (Experimental, Apple Silicon, Linux and Windows) Existing contract
AGENTS.md:1028–1054 Linux Embedded MPV Packaging — The probe and playback helper share one sanitized loader environment: ambient audit, preload, library,… Frame-Copy Engine (Experimental, Apple Silicon, Linux and Windows) Existing contract
AGENTS.md:1055–1059 Linux Embedded MPV Packaging — In the exact packaged Flatpak /app context, reconstruct only Freedesktop Platform 24.08's immutable… Frame-Copy Engine (Experimental, Apple Silicon, Linux and Windows) Existing contract
AGENTS.md:1060–1063 Linux Embedded MPV Packaging — The packaged x64 Playwright smoke runs its fixture-contract target first and passes Chromium… Same-Version Desktop Release Gate Existing contract
AGENTS.md:1064–1116 Linux Embedded MPV Packaging — Bundled Linux releases must publish the exact source archives/git records, checksums, licenses, flags,… Same-Version Desktop Release Gate Existing contract
AGENTS.md:1120–1120 Repo Skills — .codex/skills/iptvnator-nx-architecture/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1121–1121 Repo Skills — .codex/skills/iptvnator-sqlite-db-worker/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1122–1122 Repo Skills — .codex/skills/iptvnator-theme-style/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1123–1123 Repo Skills — .codex/skills/iptvnator-ui-design/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1124–1124 Repo Skills — .codex/skills/release-cut/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1125–1125 Repo Skills — .codex/skills/release-notes/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1126–1126 Repo Skills — .codex/skills/stalker-portal/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1127–1127 Repo Skills — .codex/skills/xtream-electron/SKILL.md Repository skills Moved / consolidated
AGENTS.md:1129–1130 Repo Skills — Descriptions and trigger conditions are canonical in each skill's frontmatter; do not duplicate them here. Repository skills Moved / consolidated
AGENTS.md:1137–1137 General Guidelines for working with Nx — For navigating/exploring the workspace, invoke the nx-workspace skill first when it is available - it has… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1138–1138 General Guidelines for working with Nx — When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through nx… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1139–1139 General Guidelines for working with Nx — Prefix nx commands with the workspace's package manager (e.g., pnpm nx build, npm exec nx test) - avoids… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1140–1140 General Guidelines for working with Nx — You have access to the Nx MCP server and its tools, use them to help the user General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1141–1141 General Guidelines for working with Nx — For Nx plugin best practices, check node_modules/@nx/<plugin>/PLUGIN.md. Not all plugins have this file -… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1142–1142 General Guidelines for working with Nx — NEVER guess CLI flags - always check nx_docs or --help first when unsure General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1146–1146 Scaffolding & Generators — For scaffolding tasks (creating apps, libs, project structure, setup), ALWAYS invoke the nx-generate skill… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1150–1150 When to use nx_docs — USE for: advanced config options, unfamiliar flags, migration guides, plugin configuration, edge cases General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1151–1151 When to use nx_docs — DON'T USE for: basic generator syntax (nx g @nx/react:app), standard commands, things you already know General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1152–1152 When to use nx_docs — The nx-generate skill handles generator discovery internally - don't call nx_docs just to look up… General Guidelines for working with Nx Retained; tools conditional
AGENTS.md:1158–1162 Catch-Up URL Copying — EPG timeline/list programme details expose Copy archive URL for supported Xtream/M3U archives, including… Copy archive URL Existing contract
AGENTS.md:1166–1196 Xtream Archive Downloads — Desktop Xtream Live TV programme details can enqueue completed catch-up as contentType: catchup. The queue… Xtream archive downloads Existing contract
AGENTS.md:1200–1205 Desktop Source Health — Electron switcher/source rows share bounded, cached Xtream/Stalker/M3U URL checks through… Desktop source health Existing contract
AGENTS.md:1207–1213 Desktop Source Health — Desktop Sources also offers library-wide selective cleanup through dialog-scoped SourceCleanupService.… Desktop inactive-source cleanup Existing contract
AGENTS.md:1215–1217 Desktop Source Health — Startup source auto-refresh uses SourceActivityService to protect busy IDs from cleanup. Late batch… Desktop inactive-source cleanup Existing contract
CLAUDE.md:3–3 CLAUDE.md — This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:5–5 CLAUDE.md — > The process sections below (Plan Mode, Documentation After Changes, Upgrade And Migration Compatibility,… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:9–9 Plan Mode — When Claude Code is in Plan Mode and produces a final <proposed_plan>, it must also save that finalized… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:10–10 Plan Mode — Save only finalized plans. Do not write interim exploration, question turns, or draft revisions to .plans/. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:11–11 Plan Mode — Use the filename pattern YYYY-MM-DD-short-topic.md such as .plans/2026-03-12-channel-filtering.md. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:12–12 Plan Mode — If the intended filename already exists, append a numeric suffix such as -2, -3, and so on. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:16–16 Documentation After Changes — After implementing a meaningful change, Claude Code must assess whether canonical repo docs need updates… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:17–17 Documentation After Changes — Meaningful changes include new or changed user-visible behavior, architecture or data-flow changes,… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:18–18 Documentation After Changes — Skip doc updates for trivial refactors with unchanged behavior, formatting-only edits, and isolated… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:19–22 Documentation After Changes — Prefer updating an existing authoritative doc before creating a new one: 1. README.md for top-level… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:23–23 Documentation After Changes — Keep this file (CLAUDE.md) itself up to date. It is a living document: whenever a change touches something… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:24–24 Documentation After Changes — When adding a new feature area, check whether the Architecture or Key Features sections of CLAUDE.md… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:25–25 Documentation After Changes — Do not let CLAUDE.md drift: a stale path or route in this file poisons the context of every future agent… Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:26–26 Documentation After Changes — Repo docs are canonical even when they were originally drafted by an LLM. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:27–27 Documentation After Changes — Final task summaries should state whether docs were updated and which doc changed. Maintaining canonical knowledge Moved / consolidated
CLAUDE.md:31–31 Release Notes For User-Visible Changes — Any change a user could notice — new behavior, changed behavior, bug fix, performance win, breaking change… File Existing contract
CLAUDE.md:32–32 Release Notes For User-Visible Changes — Name it <area>-<short-slug>.md; area matches the conventional-commit scope. There is no version field —… File Existing contract
CLAUDE.md:33–33 Release Notes For User-Visible Changes — Write the body for a user, not a reviewer: "the player now remembers volume between episodes", not "hoist… Writing the body Existing contract
CLAUDE.md:34–34 Release Notes For User-Visible Changes — type: internal records invisible maintenance. Internal notes stay collapsed in CHANGELOG.md, are omitted… Writing the body Existing contract
CLAUDE.md:35–35 Release Notes For User-Visible Changes — highlight: <short headline> (max 60 characters, rejected on type: internal) marks a note as one of the… Writing the body Existing contract
CLAUDE.md:36–36 Release Notes For User-Visible Changes — Skip the note for test-only changes, docs, CI/workflow plumbing, and pure refactors with no behavior… When a note is not needed Existing contract
CLAUDE.md:37–37 Release Notes For User-Visible Changes — CI enforces this: the "Release note gate" job in .github/workflows/ci.yml fails PRs that change runtime… Surfaces built from one set of notes Existing contract
CLAUDE.md:38–38 Release Notes For User-Visible Changes — The release-notes skill covers writing notes; the release-cut skill covers the full release sequence.… Surfaces built from one set of notes Existing contract
CLAUDE.md:39–39 Release Notes For User-Visible Changes — Validate before finishing: pnpm run release:notes:validate. Commands Existing contract
CLAUDE.md:40–40 Release Notes For User-Visible Changes — Announcement drafts and highlight cards are built from the same notes: pnpm --silent run… Writing the body Existing contract
CLAUDE.md:41–41 Release Notes For User-Visible Changes — Pushes to master and v can publish Docker images. A v tag build creates a draft GitHub release. Two phases Existing contract
CLAUDE.md:42–42 Release Notes For User-Visible Changes — pnpm run release:verify:draft waits for that tag build (polling until the run is indexed, then gh run… Draft verification Existing contract
CLAUDE.md:43–43 Release Notes For User-Visible Changes — Publishing the GitHub release verifies its Snap assets and automatically uploads them to edge;… After verification Existing contract
CLAUDE.md:44–44 Release Notes For User-Visible Changes — Release-post screenshots come only from the release capture script running against the mock servers. Never… Screenshots Existing contract
CLAUDE.md:45–45 Release Notes For User-Visible Changes — Final task summaries should state whether a release note was added or why it was skipped. Plans and completion reports Moved / consolidated
CLAUDE.md:49–54 AppImage Manager Metadata — AppManager full-download discovery uses appImage.desktop.entry URL fields. Electron Builder generates the… Surfaces built from one set of notes Existing contract
CLAUDE.md:58–58 Upgrade And Migration Compatibility — Users may skip releases. The application must apply all required migrations in dependency order when… Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:59–59 Upgrade And Migration Compatibility — Preserve migration paths for existing persisted data. Do not make deleting a database/profile or… Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:60–60 Upgrade And Migration Compatibility — Create required tables first, add missing columns before dependent indexes/triggers/queries, and make… Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:61–61 Upgrade And Migration Compatibility — For persistence changes, test real SQLite initialization with representative historical schemas and data,… Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:62–62 Upgrade And Migration Compatibility — See libs/shared/database/README.md for SQLite migration ownership and validation guidance. Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:66–66 Regression Prevention And Test Updates — Before the final summary for any feature, behavior change, bug fix, data-flow change, Electron… Test impact and completion Existing contract
CLAUDE.md:67–67 Regression Prevention And Test Updates — Bug fixes must normally include regression coverage that fails on the old behavior and passes with the… Test impact and completion Existing contract
CLAUDE.md:68–68 Regression Prevention And Test Updates — Feature work and behavior changes must update existing tests when assertions, fixtures, mocks, routes, or… Test impact and completion Existing contract
CLAUDE.md:69–73 Regression Prevention And Test Updates — Default validation ladder: 1. Run targeted unit tests for directly affected projects with pnpm nx test… Test impact and completion Existing contract
CLAUDE.md:74–74 Regression Prevention And Test Updates — Electron-specific changes affecting IPC, SQLite, packaged runtime, external players, native file access,… Test impact and completion Existing contract
CLAUDE.md:75–75 Regression Prevention And Test Updates — Final task summaries must list tests added or updated, validation commands run with results, and any… Test impact and completion Existing contract
CLAUDE.md:79–79 Project Overview — IPTVnator is a cross-platform IPTV player application built with Angular and Electron, supporting M3U/M3U8… Service factory and build bases Existing contract
CLAUDE.md:81–81 Project Overview — Dual Environment Support: The application is designed to work in both Electron and as a Progressive Web… Service factory and build bases Existing contract
CLAUDE.md:87–90 Agent Bootstrap — bash pnpm install --frozen-lockfile pnpm nx show projects Fresh Worktree Bootstrap and Discovery Existing contract
CLAUDE.md:92–92 Agent Bootstrap — Run the install step in a fresh worktree before relying on Nx discovery, lint, test, or build commands.… Fresh Worktree Bootstrap and Discovery Existing contract
CLAUDE.md:93–93 Agent Bootstrap — Re-run the install whenever the checkout moves — git pull, git reset --hard, a rebase, or a worktree… Fresh Worktree Bootstrap and Discovery Existing contract
CLAUDE.md:94–94 Agent Bootstrap — Never run prettier --write on CLAUDE.md, AGENTS.md or docs/. These files are not Prettier-clean upstream,… Protected Markdown edits Corrected safe restore
CLAUDE.md:95–95 Agent Bootstrap — Use scoped path aliases from tsconfig.base.json such as @iptvnator/services, @iptvnator/shared/interfaces,… Import Aliases and Public APIs Existing contract
CLAUDE.md:96–96 Agent Bootstrap — Do not add new imports from legacy bare aliases such as services, shared-interfaces, components,… Import Aliases and Public APIs Existing contract
CLAUDE.md:97–97 Agent Bootstrap — Every Nx project should keep scope:, domain:, and type: tags in project.json. Project Tags Existing contract
CLAUDE.md:98–98 Agent Bootstrap — See docs/architecture/nx-workspace-boundaries.md for the current Nx tag and alias policy. Import Aliases and Public APIs Existing contract
CLAUDE.md:99–100 Agent Bootstrap — Keep nx and every official @nx/ package on the same exact version; run pnpm run deps:nx:validate after… Nx Dependency Updates Existing contract
CLAUDE.md:101–102 Agent Bootstrap — Use the Node version in .nvmrc for development and CI. Angular 22 requires Node ^22.22.3 || ^24.15.0 and… Angular 22 Toolchain Compatibility Existing contract
CLAUDE.md:103–107 Agent Bootstrap — Vite 8.1.5, resolved through Angular's build tooling, retains upstream precise matchers and adds bounded… Vite Dev-Server Patch Existing contract
CLAUDE.md:108–118 Agent Bootstrap — app-builder-lib 26.15.7 (electron-builder's macOS signing) is patched in… Electron Builder signing patch Added missing detail
CLAUDE.md:119–125 Agent Bootstrap — node-gyp is a declared root devDependency because apps/electron-backend/build-embedded-mpv.js resolves it… Packaging State Existing contract
CLAUDE.md:126–130 Agent Bootstrap — nx-electron@22.0.0 uses a local Nx 23 export-path patch and an explicit webpack-node-externals package… Angular 22 Toolchain Compatibility Existing contract
CLAUDE.md:131–137 Agent Bootstrap — A directory holding files consumed by other projects must be an Nx project. Nx builds its graph from… Shared Stylesheets and Cache Inputs Existing contract
CLAUDE.md:138–141 Agent Bootstrap — Update Nx with pnpm nx migrate nx@<target> --skipInstall, regenerate the lockfile, run generated… Nx Dependency Updates Existing contract
CLAUDE.md:142–142 Agent Bootstrap — Repository-specific skills live under .codex/skills/. Repository skills Moved / consolidated
CLAUDE.md:143–144 Agent Bootstrap — Frontmatter descriptions are trigger-only and begin with Use when; keep each skill at or below 500 words. Repository skills Moved / consolidated
CLAUDE.md:145–146 Agent Bootstrap — Run pnpm run skills:validate after editing a committed skill or a literal path it documents. Repository skills Moved / consolidated
CLAUDE.md:147–148 Agent Bootstrap — Keep .codex and .claude copies of release-notes and release-cut byte-identical. Repository skills Moved / consolidated
CLAUDE.md:152–192 Building and Serving — bash # Serve the Angular web app only (development mode, baseHref="/") pnpm run serve:frontend # or nx… Build and serve commands Moved / consolidated
CLAUDE.md:196–198 Windows Embedded MPV Pin Maintenance — PR, master, and tag builds resolve the Windows runtime only from… Windows CI pin lifecycle Existing contract
CLAUDE.md:199–200 Windows Embedded MPV Pin Maintenance — Validate the checked-in schema and provenance with pnpm embedded-mpv:windows-runtime-pin:check. Windows CI pin lifecycle Existing contract
CLAUDE.md:201–204 Windows Embedded MPV Pin Maintenance — Prepare a manual rotation with pnpm embedded-mpv:windows-runtime-pin:refresh -- --force. The weekly… Windows CI pin lifecycle Existing contract
CLAUDE.md:205–208 Windows Embedded MPV Pin Maintenance — The PAT-backed refresh job must keep every third-party action pinned to a full commit. Do not mirror the… Windows CI pin lifecycle Existing contract
CLAUDE.md:212–212 Electron CDP Debugging — Start Electron in dev mode with: nx serve electron-backend Start and attach Moved / consolidated
CLAUDE.md:213–213 Electron CDP Debugging — Package-script equivalent: pnpm run serve:backend Start and attach Moved / consolidated
CLAUDE.md:214–214 Electron CDP Debugging — The workspace is configured to always launch Electron with: --remote-debugging-port=9222 Start and attach Moved / consolidated
CLAUDE.md:215–215 Electron CDP Debugging — Use CDP clients (Chrome DevTools Protocol tools) against: 127.0.0.1:9222 Start and attach Moved / consolidated
CLAUDE.md:216–216 Electron CDP Debugging — When the task is Electron automation/debugging, use the electron skill Start and attach Moved / consolidated
CLAUDE.md:217–217 Electron CDP Debugging — Do not auto-open DevTools during normal CDP automation. In development, DevTools is opt-in via… Start and attach Moved / consolidated
CLAUDE.md:218–218 Electron CDP Debugging — If DevTools is open, agent-browser --cdp 9222 ... may attach to the DevTools page instead of the IPTVnator… Start and attach Moved / consolidated
CLAUDE.md:219–219 Electron CDP Debugging — The app holds a single-instance lock (acquireSingleInstanceLock in… Start and attach Moved / consolidated
CLAUDE.md:221–221 Electron CDP Debugging — For startup tracing or white-screen debugging: Start and attach Moved / consolidated
CLAUDE.md:223–225 Electron CDP Debugging — bash IPTVNATOR_TRACE_STARTUP=1 nx serve electron-backend Start and attach Moved / consolidated
CLAUDE.md:227–227 Electron CDP Debugging — Useful narrower flags: Start and attach Moved / consolidated
CLAUDE.md:229–229 Electron CDP Debugging — IPTVNATOR_TRACE_IPC=1 traces renderer window.electron. bridge calls Start and attach Moved / consolidated
CLAUDE.md:230–230 Electron CDP Debugging — IPTVNATOR_TRACE_DB=1 traces DB worker requests and DB progress events Start and attach Moved / consolidated
CLAUDE.md:231–231 Electron CDP Debugging — IPTVNATOR_TRACE_SQL=1 traces SQLite statements in both main and worker connections Start and attach Moved / consolidated
CLAUDE.md:232–232 Electron CDP Debugging — IPTVNATOR_TRACE_WINDOW=1 traces BrowserWindow navigation/load lifecycle Start and attach Moved / consolidated
CLAUDE.md:233–233 Electron CDP Debugging — IPTVNATOR_TRACE_PLAYER=1 traces external-player activity, bounded Embedded MPV runtime-probe stderr, and… Start and attach Moved / consolidated
CLAUDE.md:234–234 Electron CDP Debugging — IPTVNATOR_TRACE_RENDERER_CONSOLE=1 mirrors renderer console logs into the Electron terminal Start and attach Moved / consolidated
CLAUDE.md:235–235 Electron CDP Debugging — IPTVNATOR_PERF_CAPTURE=1 enables development/test-only, redacted M3U and Xtream preload IPC… Start and attach Moved / consolidated
CLAUDE.md:236–236 Electron CDP Debugging — IPTVNATOR_PERF_WORKER_PROFILING=1 enables development/test-only, request-scoped worker… Start and attach Moved / consolidated
CLAUDE.md:238–240 Electron CDP Debugging — Settings, portal request/response, and trace payloads must use @iptvnator/shared/logging or the redacting… Start and attach Moved / consolidated
CLAUDE.md:242–242 Electron CDP Debugging — If the Nx daemon gets into a bad state before rerunning Electron: Start and attach Moved / consolidated
CLAUDE.md:244–246 Electron CDP Debugging — bash pnpm nx reset Start and attach Moved / consolidated
CLAUDE.md:248–248 Electron CDP Debugging — Use global agent-browser (preferred): Start and attach Moved / consolidated
CLAUDE.md:250–263 Electron CDP Debugging — bash # Verify CDP targets agent-browser --cdp 9222 tab list # Switch to the app tab and inspect… Start and attach Moved / consolidated
CLAUDE.md:265–265 Electron CDP Debugging — If agent-browser is not in PATH, use: Start and attach Moved / consolidated
CLAUDE.md:267–269 Electron CDP Debugging — bash npx --yes agent-browser --cdp 9222 tab list Start and attach Moved / consolidated
CLAUDE.md:273–294 Testing — bash # Run frontend tests pnpm run test:frontend # or pnpm nx test web # Run backend tests pnpm run… Unit And Type Checks Existing contract
CLAUDE.md:296–296 Testing — Before finishing behavior changes or bug fixes, follow Regression Prevention And Test Updates above and… Unit And Type Checks Existing contract
CLAUDE.md:300–307 Linting — bash # Lint all projects (CI runs this on master; PRs lint affected projects) pnpm run lint # Lint a… Unit And Type Checks Existing contract
CLAUDE.md:309–315 Linting — CI lints affected projects on PRs (nx affected) and every project on master pushes… TypeScript File Size Existing contract
CLAUDE.md:317–317 Linting — Production TypeScript: hard maximum 400 lines. TypeScript File Size Existing contract
CLAUDE.md:318–324 Linting — Tests: 1200. /.spec.ts, /.spec-data.ts, /.e2e.ts and everything under apps/-e2e/ — a spec is a flat list… TypeScript File Size Existing contract
CLAUDE.md:325–326 Linting — Blank lines and comments are not counted (skipBlankLines, skipComments), so a docblock is never the reason… TypeScript File Size Existing contract
CLAUDE.md:328–340 Linting — Pre-existing oversized files are baselined in tools/eslint/max-lines-baseline.mjs; regenerate the baseline… TypeScript File Size Existing contract
CLAUDE.md:342–349 Linting — Project lint targets that shell out to eslint must quote the glob, e.g. eslint "apps/<project>//.ts". An… TypeScript File Size Existing contract
CLAUDE.md:353–360 Legacy Desktop Profile Migration — electron-profile-bootstrap.ts selects the known v0.19 electron-backend profile before eager main-process… Desktop upgrades from legacy profiles Existing contract
CLAUDE.md:362–368 Legacy Desktop Profile Migration — Startup shows AppStartupStatusComponent until the initial route and source inventory are ready, including… Desktop upgrades from legacy profiles Existing contract
CLAUDE.md:374–374 Monorepo Structure (Nx Workspace) — This is an Nx monorepo with the following structure: Placement Decision Existing contract
CLAUDE.md:376–376 Monorepo Structure (Nx Workspace) — apps/web - Angular application (frontend, shared by Electron and PWA) Placement Decision Existing contract
CLAUDE.md:377–377 Monorepo Structure (Nx Workspace) — apps/electron-backend - Electron main process Main-process ownership Moved / consolidated
CLAUDE.md:378–378 Monorepo Structure (Nx Workspace) — apps/web-backend - HTTP backend for the self-hosted PWA (/parse, /parse-xml, /xtream, /stalker CORS proxy… Web Backend Existing contract
CLAUDE.md:379–379 Monorepo Structure (Nx Workspace) — apps/remote-control-web - Mobile remote-control web app served by the Electron backend Remote Web App Existing contract
CLAUDE.md:380–380 Monorepo Structure (Nx Workspace) — apps/web-e2e - Playwright E2E tests against the web app E2E Existing contract
CLAUDE.md:381–381 Monorepo Structure (Nx Workspace) — apps/electron-backend-e2e - Playwright E2E tests against the Electron app E2E Existing contract
CLAUDE.md:382–382 Monorepo Structure (Nx Workspace) — apps/stalker-mock-server - Mock Stalker/Ministra portal for dev and E2E Stalker Mock Server Architecture Existing contract
CLAUDE.md:383–383 Monorepo Structure (Nx Workspace) — apps/xtream-mock-server - Mock Xtream Codes API for dev and E2E Xtream Mock Server — Architecture Existing contract
CLAUDE.md:384–384 Monorepo Structure (Nx Workspace) — apps/website - Astro + Tailwind landing page, blog (guides carry faq: frontmatter → FAQPage JSON-LD and… IPTVnator Website Existing contract
CLAUDE.md:385–411 Monorepo Structure (Nx Workspace) — libs/ - Shared libraries: - epg/data-access - EPG services, runtime bridge, program normalization -… Placement Decision Existing contract
CLAUDE.md:415–415 Frontend Architecture (Angular) — State Management: Uses NgRx for playlist state management: State Management (libs/m3u-state/) Existing contract
CLAUDE.md:417–417 Frontend Architecture (Angular) — Store configuration in apps/web/src/app/app.config.ts State Management (libs/m3u-state/) Existing contract
CLAUDE.md:418–418 Frontend Architecture (Angular) — Playlist state, actions, effects, and reducers in libs/m3u-state/ State Management (libs/m3u-state/) Existing contract
CLAUDE.md:419–419 Frontend Architecture (Angular) — Entity adapter pattern for managing playlists collection State Management (libs/m3u-state/) Existing contract
CLAUDE.md:420–420 Frontend Architecture (Angular) — Router store integration for route-based state State Management (libs/m3u-state/) Existing contract
CLAUDE.md:422–422 Frontend Architecture (Angular) — XtreamStore Architecture (Signal Store with Feature Composition): Store composition and catalog windowing Added / consolidated
CLAUDE.md:424–424 Frontend Architecture (Angular) — The Xtream Codes module uses NgRx Signal Store with a layered architecture: Store composition and catalog windowing Added / consolidated
CLAUDE.md:426–455 Frontend Architecture (Angular) — ┌─────────────────────────────────────────────────────────────────┐ │ PRESENTATION LAYER │ │ Components… Store composition and catalog windowing Added / consolidated
CLAUDE.md:457–457 Frontend Architecture (Angular) — File structure: Store composition and catalog windowing Added / consolidated
CLAUDE.md:459–492 Frontend Architecture (Angular) — libs/portal/xtream/ ├── data-access/src/lib/ │ ├── stores/ │ │ ├── features/ │ │ │ ├──… Store composition and catalog windowing Added / consolidated
CLAUDE.md:494–494 Frontend Architecture (Angular) — Key patterns: Store composition and catalog windowing Added / consolidated
CLAUDE.md:496–496 Frontend Architecture (Angular) — Feature stores: Each with.feature.ts uses signalStoreFeature() for focused functionality Store composition and catalog windowing Added / consolidated
CLAUDE.md:497–497 Frontend Architecture (Angular) — Facade pattern: XtreamStore composes all features, maintaining backward compatibility Store composition and catalog windowing Added / consolidated
CLAUDE.md:498–499 Frontend Architecture (Angular) — Data source abstraction: IXtreamDataSource has SQLite-backed and API/in-memory implementations Store composition and catalog windowing Added / consolidated
CLAUDE.md:500–503 Frontend Architecture (Angular) — Factory injection: provideXtreamDataSource() selects ElectronXtreamDataSource only when… Store composition and catalog windowing Added / consolidated
CLAUDE.md:504–516 Frontend Architecture (Angular) — Catalog lazy loading: catalog grids scroll infinitely instead of paging. withSelection keeps a… Store composition and catalog windowing Added / consolidated
CLAUDE.md:518–518 Frontend Architecture (Angular) — Xtream data strategies by runtime capability: Store composition and catalog windowing Added / consolidated
CLAUDE.md:520–523 Frontend Architecture (Angular) — | Capability | Strategy | | --------------------------------- |… Store composition and catalog windowing Added / consolidated
CLAUDE.md:527–527 M3U Playlist Module Architecture: — The M3U playlist module handles traditional M3U/M3U8 playlists with support for 90,000+ channels. Channel List Container Existing contract
CLAUDE.md:529–543 M3U Playlist Module Architecture: — ┌─────────────────────────────────────────────────────────────────────┐ │ VIDEO PLAYER PAGE │ │… Channel List Container Existing contract
CLAUDE.md:545–545 M3U Playlist Module Architecture: — The live EPG panel is a horizontal timeline ribbon under the player (app-epg-timeline,… Channel List Container Existing contract
CLAUDE.md:547–547 M3U Playlist Module Architecture: — Collapsible live channel rail (M3U player, Xtream/Stalker live layouts, unified favorites/recent live… Collapsible Live Sidebar Existing contract
CLAUDE.md:549–549 M3U Playlist Module Architecture: — Cover grids (Xtream/Stalker VOD + series catalogs, favorites/recent, dashboard rails): sized by… Cover Grids Existing contract
CLAUDE.md:551–551 M3U Playlist Module Architecture: — Radio Channel Layout (when channel.radio === 'true'): Radio audio player Added / consolidated
CLAUDE.md:553–567 M3U Playlist Module Architecture: — ┌─────────────────────────────────────────────────────────────────────┐ │ ┌─────────────┐… Radio audio player Added / consolidated
CLAUDE.md:569–569 M3U Playlist Module Architecture: — Key radio behavior: Radio audio player Added / consolidated
CLAUDE.md:571–571 M3U Playlist Module Architecture: — Detection: channel.radio === 'true' (string from M3U radio attribute) Radio audio player Added / consolidated
CLAUDE.md:572–572 M3U Playlist Module Architecture: — The audio player always renders inline — shouldShowInlinePlayer is bypassed for radio Radio audio player Added / consolidated
CLAUDE.md:573–573 M3U Playlist Module Architecture: — EPG panel is conditionally hidden in the template when radio is active Radio audio player Added / consolidated
CLAUDE.md:574–574 M3U Playlist Module Architecture: — Volume is shared with video player via localStorage key 'volume' Radio audio player Added / consolidated
CLAUDE.md:575–575 M3U Playlist Module Architecture: — Keyboard: ArrowUp/Down adjusts volume by 5%, M toggles mute Radio audio player Added / consolidated
CLAUDE.md:576–576 M3U Playlist Module Architecture: — Component: libs/ui/playback/src/lib/audio-player/audio-player.component.ts Radio audio player Added / consolidated
CLAUDE.md:578–591 M3U Playlist Module Architecture: — M3U Movie Recognition (VOD detail instead of the EPG zone): an M3U entry recognized as a movie FILE swaps… Movie Recognition (VOD Detail View) Existing contract
CLAUDE.md:593–601 M3U Playlist Module Architecture: — M3U playback mode is independent of this metadata gate: isLikelyM3uVod recognizes video-file extensions… M3U Playback Mode Existing contract
CLAUDE.md:603–603 M3U Playlist Module Architecture: — Channel List Component Structure (parent coordinator pattern): Channel List Container Existing contract
CLAUDE.md:605–613 M3U Playlist Module Architecture: — libs/ui/components/src/lib/channel-list-container/ ├── channel-list-container.component.ts # Parent -… Channel List Container Existing contract
CLAUDE.md:615–615 M3U Playlist Module Architecture: — Key patterns: Channel List Container Existing contract
CLAUDE.md:617–617 M3U Playlist Module Architecture: — EnrichedChannel: Pre-computed EPG data attached to channels for performance Channel List Container Existing contract
CLAUDE.md:618–618 M3U Playlist Module Architecture: — Parent coordinator: Manages shared signals (channelEpgMap, progressTick, favoriteIds) Channel List Container Existing contract
CLAUDE.md:619–619 M3U Playlist Module Architecture: — Virtual scrolling: CDK virtual scroll for 90,000+ channel lists Channel List Container Existing contract
CLAUDE.md:620–620 M3U Playlist Module Architecture: — Infinite scroll: IntersectionObserver in groups view loads 50 items at a time Channel List Container Existing contract
CLAUDE.md:621–621 M3U Playlist Module Architecture: — Global progress tick: Single 30s interval instead of per-item intervals Channel List Container Existing contract
CLAUDE.md:623–623 M3U Playlist Module Architecture: — State management via NgRx (libs/m3u-state/): Channel List Container Existing contract
CLAUDE.md:625–625 M3U Playlist Module Architecture: — PlaylistActions: loadPlaylists, addPlaylist, removePlaylist, parsePlaylist Channel List Container Existing contract
CLAUDE.md:626–626 M3U Playlist Module Architecture: — ChannelActions: setChannels, setActiveChannel, setAdjacentChannelAsActive Channel List Container Existing contract
CLAUDE.md:627–627 M3U Playlist Module Architecture: — EpgActions: setActiveEpgProgram, setCurrentEpgProgram, setEpgAvailableFlag Channel List Container Existing contract
CLAUDE.md:628–628 M3U Playlist Module Architecture: — FavoritesActions: updateFavorites, setFavorites, hydrateFavorites Channel List Container Existing contract
CLAUDE.md:630–630 M3U Playlist Module Architecture: — See docs/architecture/m3u-playlist-module.md for complete documentation. Channel List Container Existing contract
CLAUDE.md:632–632 M3U Playlist Module Architecture: — Routing: Lazy-loaded routes in apps/web/src/app/app.routes.ts. All user-facing routes are nested under the… Route Contract Existing contract
CLAUDE.md:634–634 M3U Playlist Module Architecture: — Dashboard: /workspace/dashboard; sources overview: /workspace/sources Route Contract Existing contract
CLAUDE.md:635–635 M3U Playlist Module Architecture: — M3U player: /workspace/playlists/:id (children: favorites, recent, :view) — routes in… Route Contract Existing contract
CLAUDE.md:636–636 M3U Playlist Module Architecture: — Xtream Codes: /workspace/xtreams/:id (children: live, vod, series, search, actor/:personId, discover,… Route Contract Existing contract
CLAUDE.md:637–637 M3U Playlist Module Architecture: — Stalker portal: /workspace/stalker/:id (children: itv, vod, radio, series, favorites, recent, search,… Route Contract Existing contract
CLAUDE.md:638–638 M3U Playlist Module Architecture: — Global collections: /workspace/global-favorites, /workspace/global-recent Route Contract Existing contract
CLAUDE.md:639–639 M3U Playlist Module Architecture: — Global search: /workspace/search (Electron-only; a guard redirects the PWA to /workspace/sources) Route Contract Existing contract
CLAUDE.md:640–644 M3U Playlist Module Architecture: — Downloads: /workspace/downloads with focused /workspace/downloads/:downloadId; source-scoped equivalents… Route Contract Existing contract
CLAUDE.md:645–645 M3U Playlist Module Architecture: — Settings: /workspace/settings/:section — one page per section (general, playback, epg, dashboard,… Route Contract Existing contract
CLAUDE.md:647–647 M3U Playlist Module Architecture: — Service Architecture (Factory Pattern): Service factory and build bases Corrected; see decisions
CLAUDE.md:649–649 M3U Playlist Module Architecture: — Abstract DataService class in libs/services/src/lib/data.service.ts defines the contract Service factory and build bases Corrected; see decisions
CLAUDE.md:650–652 M3U Playlist Module Architecture: — Two environment-specific implementations: - ElectronService… Service factory and build bases Corrected; see decisions
CLAUDE.md:653–659 M3U Playlist Module Architecture: — Factory function DataFactory() in apps/web/src/app/app.config.ts determines which implementation to… Service factory and build bases Corrected; see decisions
CLAUDE.md:663–666 Data Storage (Environment-Specific): — Electron: SQLite database via Drizzle ORM (better-sqlite3 driver) - Location:… Service factory and build bases Corrected; see decisions
CLAUDE.md:667–670 Data Storage (Environment-Specific): — PWA (Web): IndexedDB via ngx-indexed-db - Browser-based NoSQL storage - Same schema structure but… Service factory and build bases Corrected; see decisions
CLAUDE.md:674–678 TypeScript File Size Rule: — Keep production TypeScript files under 300 lines. Hard maximum is 350–400 lines, and CI enforces the 400.… TypeScript File Size Existing contract
CLAUDE.md:680–680 TypeScript File Size Rule: — When creating new files, design them to stay within this limit from the start. TypeScript File Size Existing contract
CLAUDE.md:681–681 TypeScript File Size Rule: — When adding a feature to an existing file that would push it past 350 lines, refactor first: extract… TypeScript File Size Existing contract
CLAUDE.md:682–682 TypeScript File Size Rule: — When you notice a file already exceeds 350 lines, proactively suggest a refactoring (or perform it if the… TypeScript File Size Existing contract
CLAUDE.md:684–684 TypeScript File Size Rule: — Typical split strategies: TypeScript File Size Existing contract
CLAUDE.md:686–686 TypeScript File Size Rule: — Angular components: extract child components, move logic to a dedicated service or store feature TypeScript File Size Existing contract
CLAUDE.md:687–687 TypeScript File Size Rule: — Signal store features: split into smaller with feature functions in separate files TypeScript File Size Existing contract
CLAUDE.md:688–688 TypeScript File Size Rule: — Services: split by responsibility (e.g. separate API, transformation, and state concerns) TypeScript File Size Existing contract
CLAUDE.md:689–689 TypeScript File Size Rule: — Utility files: group by domain and export from a barrel index.ts TypeScript File Size Existing contract
CLAUDE.md:691–691 TypeScript File Size Rule: — This rule exists to keep the codebase navigable and reviewable. A 150-line file is always preferable to a… TypeScript File Size Existing contract
CLAUDE.md:697–697 Angular Coding Standards: — This project uses modern Angular signal-based APIs and patterns. ALWAYS use the following: Angular conventions Moved / consolidated
CLAUDE.md:699–699 Angular Coding Standards: — Component Queries: Use viewChild(), viewChildren(), contentChild(), contentChildren() instead of… Angular conventions Moved / consolidated
CLAUDE.md:701–709 Angular Coding Standards: — typescript // ✅ Correct - Signal-based readonly menu = viewChild.required<MatMenu>('menuRef'); readonly… Angular conventions Moved / consolidated
CLAUDE.md:711–711 Angular Coding Standards: — Important: When using signals in templates with properties that expect non-signal values, unwrap the… Angular conventions Moved / consolidated
CLAUDE.md:713–719 Angular Coding Standards: — html <!-- ✅ Correct - Unwrap the signal --> <button [matMenuTriggerFor]="menu()">Open Menu</button> <!-- ❌… Angular conventions Moved / consolidated
CLAUDE.md:721–721 Angular Coding Standards: — Component Inputs/Outputs: Use input() and output() functions instead of @Input() and @Output() decorators Angular conventions Moved / consolidated
CLAUDE.md:723–733 Angular Coding Standards: — typescript // ✅ Correct - Signal-based readonly title = input.required<string>(); readonly size =… Angular conventions Moved / consolidated
CLAUDE.md:735–735 Angular Coding Standards: — Reactive State: Use signal primitives for reactive state management Angular conventions Moved / consolidated
CLAUDE.md:737–747 Angular Coding Standards: — typescript // ✅ Use signal(), computed(), effect(), linkedSignal() readonly count = signal(0); readonly… Angular conventions Moved / consolidated
CLAUDE.md:749–749 Angular Coding Standards: — Host Bindings: Use @HostBinding() and @HostListener() decorators (these don't have signal equivalents yet) Angular conventions Moved / consolidated
CLAUDE.md:751–754 Angular Coding Standards: — typescript @HostBinding('class.active') get isActive() { return this.active(); } @HostListener('click')… Angular conventions Moved / consolidated
CLAUDE.md:756–756 Angular Coding Standards: — Control Flow: Use @if, @for, @switch instead of ngIf, ngFor, ngSwitch Angular conventions Moved / consolidated
CLAUDE.md:758–771 Angular Coding Standards: — typescript // ✅ Correct - Modern syntax @if (isLoggedIn()) { <p>Welcome!</p> } @for (item of items();… Angular conventions Moved / consolidated
CLAUDE.md:775–775 Backend Architecture (Electron) — Main Entry: apps/electron-backend/src/main.ts Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:777–777 Backend Architecture (Electron) — Bootstraps Electron app and initializes database Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:778–778 Backend Architecture (Electron) — Registers event handlers for IPC communication Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:779–779 Backend Architecture (Electron) — Creates the main window per the startup window mode (app/app.ts initMainWindow, resolver in… Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:780–780 Backend Architecture (Electron) — Persists the app zoom level (issue #1109): the preload restores it with webFrame.setZoomLevel (temporary,… Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:781–781 Backend Architecture (Electron) — Recovers a renderer reload on an in-app route: the packaged renderer is index.html over file:// with path… Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:782–782 Backend Architecture (Electron) — Holds a single-instance lock (app/services/single-instance.ts), requested after the userData override so… Window Chrome And Custom Title Bar Existing contract
CLAUDE.md:786–786 Database: — ORM: Drizzle ORM with better-sqlite3 (local SQLite file) Exports Existing contract
CLAUDE.md:787–787 Database: — Location: ~/.iptvnator/databases/iptvnator.db (avoids spaces in path) Exports Existing contract
CLAUDE.md:788–801 Database: — Schema (libs/shared/database/src/lib/schema.ts — canonical;… Exports Existing contract
CLAUDE.md:802–805 Database: — Connection: libs/shared/database/src/lib/connection.ts - createTables() auto-creates tables on init… Exports Existing contract
CLAUDE.md:809–812 IPC Communication: — Preload script: apps/electron-backend/src/app/api/main.preload.ts - Exposes window.electron API via… Preload API Type Contract Existing contract
CLAUDE.md:813–823 IPC Communication: — Event handlers: apps/electron-backend/src/app/events/ - database.events.ts - Database CRUD operations -… Preload API Type Contract Existing contract
CLAUDE.md:825–825 IPC Communication: — Workers (apps/electron-backend/src/app/workers/): Current Ownership Existing contract
CLAUDE.md:827–827 IPC Communication: — EPG parsing: epg-parser.worker.ts; main-process worker lifecycle is coordinated from… Current Ownership Existing contract
CLAUDE.md:828–828 IPC Communication: — Non-EPG SQLite work: database.worker.ts (see docs/architecture/sqlite-db-worker.md). Catalog deletes and… Current Ownership Existing contract
CLAUDE.md:829–829 IPC Communication: — Playlist refresh: playlist-refresh.worker.ts; explicit cancellation is main-process-owned and terminates… Current Ownership Existing contract
CLAUDE.md:833–837 Xtream Category Management — The Electron Live TV, Movies, and Series category dialog applies Select/Deselect to search results while a… Behavior Notes Existing contract
CLAUDE.md:843–851 Xtream Connection Test — Add/Edit source Test HTTPS and HTTP discloses plaintext credential use before the click and can replace an… Connection Input Existing contract
CLAUDE.md:855–863 Xtream Live Auto Format — The routed Xtream live host supplies liveAutoTsUrl only for Auto with explicit HLS+TS account evidence,… Initial Auto HLS failure Existing contract
CLAUDE.md:867–883 Xtream Catch-Up Server Timezone — The {Y-m-d:H-M} segment of a timeshift URL is read by the panel in ITS timezone (server_info.timezone),… Catch-Up Playback URLs Existing contract
CLAUDE.md:887–889 M3U URL User-Agent — PlaylistsService.getPlaylist() joins the per-playlist mutation queue so a route opened during refresh… User-Agent for URL sources Existing contract
CLAUDE.md:890–894 M3U URL User-Agent — The URL import form accepts an optional User-Agent and stores it as Playlist.userAgent. Electron sends it… User-Agent for URL sources Existing contract
CLAUDE.md:895–897 M3U URL User-Agent — Reuse the existing source editor and channel-over-playlist playback header precedence. Contract:… User-Agent for URL sources Existing contract
CLAUDE.md:901–901 Playlist Support: — M3U/M3U8 files (local or URL) User-Agent for URL sources Existing contract
CLAUDE.md:902–902 Playlist Support: — Xtream Codes API (username, password, serverUrl) User-Agent for URL sources Existing contract
CLAUDE.md:903–903 Playlist Support: — Stalker portal (macAddress, url) User-Agent for URL sources Existing contract
CLAUDE.md:905–920 Playlist Support: — Stalker playback links: create_link runs only when the catalog row sets use_http_tmp_link or… Playback Link Resolution Corrected; see decisions
CLAUDE.md:922–941 Playlist Support: — Opening a playlist from the OS (Electron only): a .m3u/.m3u8 path passed on the command line, opened… Opening playlists from the operating system Added / consolidated
CLAUDE.md:943–959 Playlist Support: — The OS-level registration that makes those paths reachable is fileAssociations in electron-builder.json —… Opening playlists from the operating system Added / consolidated
CLAUDE.md:963–968 Video Players: — The Embedded MPV native-view dock follows app theme tokens as a solid app surface, including Material… Player And EPG Theme Boundaries Existing contract
CLAUDE.md:970–977 Video Players: — Built-in web players: HTML5+hls.js, Video.js, and ArtPlayer. The HTML5 player and ArtPlayer pick their… Codec And Container Diagnostics Existing contract
CLAUDE.md:978–986 Video Players: — mpegts.js 1.8.1 errors from all three built-in players cross one version-locked structured evidence… Codec And Container Diagnostics Existing contract
CLAUDE.md:987–1119 Video Players: — Browser playback diagnostics and recovery policy live in libs/playback/util and are exported by… Codec And Container Diagnostics Existing contract
CLAUDE.md:1120–1125 Video Players: — M3U Favorites and Recently Viewed resolve Channel.drm into ResolvedPortalPlayback.drm through… Codec And Container Diagnostics Existing contract
CLAUDE.md:1126–1150 Video Players: — DASH + ClearKey (M3U module): .mpd channels play through a lazily loaded Shaka Player source engine inside… Codec And Container Diagnostics Existing contract
CLAUDE.md:1151–1165 Video Players: — Stream info popover: an info button in the top-right corner of the shared controls overlay shows live… Codec And Container Diagnostics Existing contract
CLAUDE.md:1166–1166 Video Players: — External players: MPV, VLC (via IPC to Electron backend) Codec And Container Diagnostics Existing contract
CLAUDE.md:1167–1181 Video Players: — Display sleep during playback: PlaybackKeepAwakeService… Codec And Container Diagnostics Existing contract
CLAUDE.md:1182–1182 Video Players: — Embedded MPV (experimental, macOS/Windows/Linux): renders mpv video inside the Electron window through a… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Two per-session knobs are captured at session creation from the main-process settings mirror… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Contract: docs/architecture/embedded-mpv-native.md ("Session Options", "Network Auto-Reconnect"). macOS… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Windows uses in-process libmpv with --wid against an app-owned child HWND; How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Linux spawns an out-of-process mpv --wid=<x11-window> controlled over a JSON IPC socket (X11/XWayland… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Renderer bounds are CSS pixels; the service converts them to native units in the main process… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Arrow-key and ±10 s button steps go through the relative seekEmbeddedMpvBy IPC (mpv seek <delta>… How It Is Embedded Existing contract
CLAUDE.md:1182–1182 Video Players: — Service: apps/electron-backend/src/app/services/embedded-mpv-native.service.ts; full architecture:… How It Is Embedded Existing contract
CLAUDE.md:1183–1314 Video Players: — Embedded MPV frame-copy engine (experimental, macOS Apple Silicon + Linux x64 + Windows; enabled via… How It Is Embedded Existing contract
CLAUDE.md:1315–1315 Video Players: — Shared player-controls layer: libs/ui/playback/src/lib/player-controls/ exports the engine-neutral… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Its subtitle menu carries capability-gated advanced subtitle support (#1408): external subtitle file… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — HTML5/ArtPlayer implement it through the neutral source bridge (.srt/.vtt via a DOM file picker with… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Embedded MPV frame-copy implements it through new helper protocol commands… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Video.js shared mode, vendor-chrome paths, native-view, and the Linux out-of-process path advertise no… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Contract details: docs/architecture/player-controls-contract.md ("Advanced subtitle support"). Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Shared controls include a per-session quality menu (Auto + “1080p”-style levels via setQualityLevel; Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — AUTO_QUALITY_LEVEL_ID restores ABR): the capability derives from the manifest — advertised only when the… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — In fullscreen, app-player-controls shows a pointer-transparent media-title overlay at the top while… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Persisted Settings.webPlayerSharedControls is default-ON (absent stored values coerce with !== false in… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The shared surface has explicit touch semantics (ControlsSurface.wasTouchInteraction): viewport taps… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Only keyboard-originated focus pins the bar open: Chromium also focuses a clicked <button>, so… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — A completed pointer click then releases the focus it left on the control (onBarClick →… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Keyboard activation (empty pointerType) keeps focus, only buttons and range sliders are released, Chromium… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Deliberately dropped vs. vendor chrome (opt-out retains them): Video.js spatial navigation, ArtPlayer… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — WebPlayerViewComponent snapshots the preference into the immutable token for each new player host. Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The parent /workspace route awaits the initial SettingsStore load, including cold-start direct links,… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Saving applies to the next host without an application restart; an existing session never changes controls… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Embedded MPV ignores the web-player preference: frame-copy always uses shared DOM controls through… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The Embedded MPV host selects exactly one controls UI for its reported engine. Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — showControls=false detaches the shared surface, modal overlays gate frame-copy playback shortcuts,… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Same-session IPC replies yield to a broadcast snapshot received while the command was pending, so a… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The built-in HTML5/hls.js player is the second guarded consumer: HtmlVideoPlayerComponent provides a… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — HtmlVideoElementSession owns native video-event lifecycle, persisted volume, and start-time/time/ended… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Video.js is the third guarded consumer: VjsPlayerComponent provides a component-scoped… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Reset-driven raw MPEG-TS changes pause first, coalesce to the latest desired source, preserve actual… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — In shared-controls mode, Video.js native controls, click/double-click/hotkey actions, and spatial… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — ArtPlayer is the fourth guarded consumer: ArtPlayerComponent provides a component-scoped… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — ArtPlayerSourceSession owns HLS/DASH(Shaka)/MPEG-TS/native sources, the neutral web-video bridge, exact… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Shared ArtPlayer mode uses authoritative live/VOD metadata, HLS/Shaka/native tracks and caption… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Vendor chrome/hotkeys are disabled, and a transparent capture layer gives shared controls exclusive click… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — WebPlayerViewComponent.resolvedIsLive supplies authoritative metadata; visible playback diagnostics… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The view also renders app-fullscreen-channel-panel beside the engine, staged on fullscreenSurface and… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Providers: M3U VideoPlayerComponent (app-m3u-fullscreen-channel-list, a local icon-only… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Xtream's two PortalChannelsListComponent instances relay favorite toggles through… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — CDK overlays follow the fullscreen element via FullscreenOverlayContainer in app.config.ts. Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Series playback gets the same panel as an episode list: PortalInlinePlayerComponent — the component both… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Movies never get it (contentType !== 'episode' → null), external MPV/VLC never mount the inline player,… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — M3U also zaps with PageUp/PageDown, yielding to already-handled events and menu/dialog or scrollable-list… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — While the live web-player host owns fullscreen (itself, or through the nested surface a legacy player… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Contract section "Fullscreen channel panel" in docs/architecture/player-controls-contract.md. Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — On the preference-off path, all three web players retain their existing controls, source behavior, and… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The legacy Video.js chrome also releases the focus a pointer interaction leaves on a control… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — It is driven mainly by focusin, not the click, because choosing a menu item moves focus to the menu button… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The release is scoped to .vjs-control-bar so the caption-settings dialog (a modal sibling of the bar)… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Settings.showCaptions is deliberately outside this rollout gate: it is engine state, so the preference-off… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — The two modes differ in how long it is enforced: shared controls are authoritative for the session (user… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Mode selection is the optional playbackStarted probe the legacy owners pass to all three helpers (HLS,… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — WebPlayerViewComponent reads it from SettingsStore instead of a host input so every host (M3U,… Landed architecture Existing contract
CLAUDE.md:1315–1315 Video Players: — Contract: docs/architecture/player-controls-contract.md. Landed architecture Existing contract
CLAUDE.md:1316–1325 Video Players: — Shared web picture-in-picture stays inside that default-on rollout. PlayerController exposes capability… Landed architecture Existing contract
CLAUDE.md:1326–1344 Video Players: — WebVideoControlsAdapter supplies its current video and binding generation to… Landed architecture Existing contract
CLAUDE.md:1348–1376 Download Manager: — Fresh Xtream movie and series-episode downloads propagate the playlist's User-Agent, Referer, and Origin,… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1377–1380 Download Manager: — The desktop-only manager shares one global download store across the global, Xtream-scoped, and… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1381–1420 Download Manager: — Series details route individual and selected-season episode downloads through the provider-neutral… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1421–1438 Download Manager: — Episode ownership uses normalized episode.id as the canonical xtreamId for both providers; Stalker… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1439–1444 Download Manager: — Ready cards (movies, grouped series, and standalone episodes) open a focused local detail; local file… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1445–1449 Download Manager: — Downloads capture a versioned metadata snapshot from the rendered Xtream or Stalker movie/episode detail… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1450–1459 Download Manager: — View in portal resolves a concrete Xtream category/item route. Stalker accepts a recently-viewed shape… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1460–1462 Download Manager: — Download rows and local files survive source deletion. The global offline library remains visible with no… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1463–1465 Download Manager: — If a finalized file disappears while a focused detail is open, the authoritative download list refreshes… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1466–1497 Download Manager: — Live-TV recordings (Embedded MPV stream-record) are tracked beside downloads in their own recordings table… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1498–1499 Download Manager: — Canonical contract: docs/architecture/download-manager.md; provider handoff:… Queuing, persistence, and UX notes Existing contract
CLAUDE.md:1501–1501 Download Manager: — Collection Detail Portal Handoff (View in portal for inline details): Summary Existing contract
CLAUDE.md:1503–1507 Download Manager: — Details opened outside portal category context — /workspace/global-favorites, /workspace/global-recent… Summary Existing contract
CLAUDE.md:1508–1515 Download Manager: — Visibility is DI-gated, never URL-sniffed: app-view-in-portal-action… Summary Existing contract
CLAUDE.md:1516–1521 Download Manager: — Targets come from getUnifiedCollectionDetailNavigation()… Summary Existing contract
CLAUDE.md:1522–1558 Download Manager: — Stalker section resolution mirrors resolveStalkerCollectionDetailMode()… Summary Existing contract
CLAUDE.md:1559–1561 Download Manager: — Unlike the download handoff this bridge does NOT pass detailPresentation: 'provider-only' — the item… Summary Existing contract
CLAUDE.md:1562–1562 Download Manager: — Contract: docs/architecture/portal-detail-navigation.md. Summary Existing contract
CLAUDE.md:1566–1566 VOD/Series Detail Pages (two-state layout): — Xtream and Stalker detail pages use the shared PortalDetailShellComponent… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1567–1567 VOD/Series Detail Pages (two-state layout): — The inline player (PortalInlinePlayerComponent) renders a full-width theater stage… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1568–1568 VOD/Series Detail Pages (two-state layout): — For inline series playback on wide windows the stage instead docks the player left and shows an "Up Next"… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1569–1569 VOD/Series Detail Pages (two-state layout): — Watch state derives from inlinePlayback() !== null only; external MPV/VLC playback keeps the browse… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1570–1570 VOD/Series Detail Pages (two-state layout): — Xtream VOD treats metadata presentation and playability as separate contracts. Empty or sparse… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1571–1571 VOD/Series Detail Pages (two-state layout): — A successful external MPV/VLC episode launch immediately persists the selected episode as the latest… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1572–1572 VOD/Series Detail Pages (two-state layout): — Stalker preserves this contract for regular /series, embedded VOD series[], and lazy Ministra VOD… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1573–1573 VOD/Series Detail Pages (two-state layout): — Hosts pass hero chips/meta/actions as appDetailTags/appDetailMeta/appDetailActions templates; the shell… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1574–1574 VOD/Series Detail Pages (two-state layout): — Seasons are tabs (SeasonTabsComponent, dropdown beyond 6 seasons; the dropdown's menu rows and closed… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1575–1575 VOD/Series Detail Pages (two-state layout): — The season header hosts a bulk watched toggle next to "Download season" (both portals): marking writes… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1576–1576 VOD/Series Detail Pages (two-state layout): — Movies get the same manual toggle in the detail action row (Xtream: icon square after Favorite,… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1577–1577 VOD/Series Detail Pages (two-state layout): — The dashboard hero CTA and the Continue Watching cards' explicit "Resume episode" ⋮ action for an Xtream… Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1578–1578 VOD/Series Detail Pages (two-state layout): — See docs/architecture/embedded-inline-playback.md ("Two-State Detail Layout") Two-State Detail Layout (Browse ↔ Watch) Existing contract
CLAUDE.md:1580–1580 VOD/Series Detail Pages (two-state layout): — VOD Multi-Source (alternative sources for a movie): VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Finds the same movie in the user's other imported playlists and adds a "Sources N" chip to the Xtream VOD… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — The chip opens a 660px anchored CDK-overlay popover (libs/ui/components/src/lib/vod-sources/; not MatMenu,… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — It opens ABOVE the chip (right edges aligned, pressed state on the chip while open), height-capped by the… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — A row's language is vodSourceLanguage (libs/shared/interfaces/src/lib/vod-source-language.util.ts): the… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Unicode lookalikes, bracketed, or ALL-CAPS spaced-dash form; VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Latin/Cyrillic 2–4 letters + MULTI; only the legacy pipe form is permissive — bracket/dash matches must… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Both forms are parsed guesses: browse filter and chips only, never ranking/failover/dub-warning inputs. VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Recognition alone is not enough — normalizeTitleKeys must STRIP the same tag or the copy is never… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — It goes no further on purpose: a wrong guess costs a filter option, a wrong strip corrupts identity, and… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — The one shape that cannot decide itself is a strip leaving NO real word behind — decided by running the… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Every vocabulary entry is one the catalog proves prefixes hundreds of ordinary titles — never one that… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Verify such widenings against the real catalog before shipping them, over movies AND series: a movie-only… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Checks run through a 4-slot queue and settled verdicts are cached 10 min per movie+source… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — Both chips are handed the same matchKind and vodAutoFailover and both write the setting back. VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — The details-page chip badge counts TOTAL copies across all playlists (the in-player chip still counts… VOD Multi-Source Existing contract
CLAUDE.md:1582–1582 VOD/Series Detail Pages (two-state layout): — The action row's Favorites and Download buttons are icon-only 64px squares: filled red heart when… VOD Multi-Source Existing contract
CLAUDE.md:1583–1583 VOD/Series Detail Pages (two-state layout): — Scope v1 is Xtream ↔ Xtream, movies only, Electron only. Stalker never reaches the content table and M3U… VOD Multi-Source Existing contract
CLAUDE.md:1584–1584 VOD/Series Detail Pages (two-state layout): — Metadata provenance is the core contract. Every field is {value, provenance} where api/probe are facts… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — Discovery (DB_FIND_TITLE_SOURCES, trigram FTS over content_title_fts) is lazy and returns only what the… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — A source that is never read looks exactly like one that does not exist, so: the current playlist is… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — The year gate covers BOTH match tiers: normalizeTitleKeys strips bracketed segments, so "Dune (1984)"… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — A non-ASCII token cannot be folded by LOWER() (ASCII-only) but CAN be by a GLOB character class (UTF-8… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — The movie's own year comes from releaseTagYear (bracketed or trailing only), never extractYear: a year… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — One row inside the excluded playlist is kept when the caller names it (keepContentId), because a pin can… VOD Multi-Source Existing contract
CLAUDE.md:1585–1585 VOD/Series Detail Pages (two-state layout): — Resolution is deferred to click/pin/check because content stores no container_extension and… VOD Multi-Source Existing contract
CLAUDE.md:1586–1586 VOD/Series Detail Pages (two-state layout): — Switching = one inlinePlayback.set({...next, startTime}), never null-then-set, so the player and engine… VOD Multi-Source Existing contract
CLAUDE.md:1587–1587 VOD/Series Detail Pages (two-state layout): — Pins are keyed portal-agnostically (tmdb:{id} else title:{base}:{year} else the yearless title:{base}:,… VOD Multi-Source Existing contract
CLAUDE.md:1588–1588 VOD/Series Detail Pages (two-state layout): — Claims in the present tense (the "Playing from" caption and the source row's Playing badge) are gated on… VOD Multi-Source Existing contract
CLAUDE.md:1589–1589 VOD/Series Detail Pages (two-state layout): — Pins are included in playlist backup as the optional sourcePins collection, carried under the playlist… VOD Multi-Source Existing contract
CLAUDE.md:1590–1590 VOD/Series Detail Pages (two-state layout): — Auto-failover is Settings.vodAutoFailover, opt-in and off by default, web engines only — the toggle is… VOD Multi-Source Existing contract
CLAUDE.md:1591–1591 VOD/Series Detail Pages (two-state layout): — HEAD probe reuses the main-process handler extracted to… VOD Multi-Source Existing contract
CLAUDE.md:1592–1592 VOD/Series Detail Pages (two-state layout): — See docs/architecture/vod-multi-source.md VOD Multi-Source Existing contract
CLAUDE.md:1596–1596 Radio Player: — Dedicated audio player for channels with radio="true" M3U attribute Radio audio player Added / consolidated
CLAUDE.md:1597–1597 Radio Player: — Cinematic layout: blurred station logo as backdrop, floating artwork card, transport controls Radio audio player Added / consolidated
CLAUDE.md:1598–1598 Radio Player: — Always uses the built-in inline player — external player settings (MPV/VLC) are ignored for radio Radio audio player Added / consolidated
CLAUDE.md:1599–1599 Radio Player: — EPG panel is hidden for radio channels (radio streams have no EPG data) Radio audio player Added / consolidated
CLAUDE.md:1600–1600 Radio Player: — Volume synced with video player via shared localStorage key 'volume' Radio audio player Added / consolidated
CLAUDE.md:1601–1601 Radio Player: — Keyboard shortcuts: ArrowUp/ArrowDown (volume), M (mute) Radio audio player Added / consolidated
CLAUDE.md:1602–1602 Radio Player: — Component: libs/ui/playback/src/lib/audio-player/audio-player.component.ts Radio audio player Added / consolidated
CLAUDE.md:1606–1606 EPG (Electronic Program Guide): — XMLTV format support, from http(s) links or local files (Electron only): a file: URL, an absolute POSIX… EPG Integration Existing contract
CLAUDE.md:1607–1607 EPG (Electronic Program Guide): — Background parsing in worker thread; HTTP/file gzip compatibility follows… EPG Integration Existing contract
CLAUDE.md:1608–1608 EPG (Electronic Program Guide): — Stored in database for quick lookup EPG Integration Existing contract
CLAUDE.md:1609–1609 EPG (Electronic Program Guide): — Global display-time offset (Settings.epgOffsetMinutes, Settings → EPG, ±720 min, Electron only):… EPG Integration Existing contract
CLAUDE.md:1610–1610 EPG (Electronic Program Guide): — Programme guide (Electron, M3U): app-epg-guide in libs/ui/epg fed by the host-provided EPG_GUIDE_SOURCE;… EPG Integration Existing contract
CLAUDE.md:1611–1611 EPG (Electronic Program Guide): — Manual EPG mapping (Electron only): right-click a channel in any list (M3U views, Xtream portal list,… EPG Integration Existing contract
CLAUDE.md:1613–1613 EPG (Electronic Program Guide): — TMDB Metadata Enrichment (opt-in): TMDB Metadata Enrichment Existing contract
CLAUDE.md:1615–1615 EPG (Electronic Program Guide): — Enriches Xtream and Stalker VOD/series detail views with TMDB data (plot, cast with avatar chips,… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1616–1616 EPG (Electronic Program Guide): — The M3U player consumes it too: entries recognized as movie files open in the VOD detail shell fed purely… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1617–1617 EPG (Electronic Program Guide): — "Similar" rail in ALL detail views: TMDB recommendations matched against the provider catalog by… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1618–1618 EPG (Electronic Program Guide): — Season/episode enrichment: opening a season lazily fetches /tv/{id}/season/{n} and overlays real episode… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Dashboard: opt-in "Trending this week" rail (weekly TMDB trending matched against imported Xtream… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Electron-only, dashboardRails.tmdbTrending toggle), a "Because you watched" recommendations rail… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — TMDB has no account-free "for you" endpoint, so DashboardRecommendationsService seeds per-title… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — The hero lookup must carry the same identity the detail view used, not just the display title —… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — The lookup key is the WHOLE attempt sequence, since two rows can share title/year/id yet differ in whether… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Stalker items never reach the content table, so their backdrop rides in the stored entry… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Xtream rows carry the same identity on the content row: the detail views back-fill… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Writes are per-column and never overwrite (enrichment supplies the pieces at different times, so a… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — release_year is the year the PROVIDER stated, never one read out of the title (readers still apply that… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1619–1619 EPG (Electronic Program Guide): — Both sides validate through normalizeContentMetadataPatch (libs/shared/interfaces), so legacy rows,… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1620–1620 EPG (Electronic Program Guide): — Series detail views show a TMDB production-status chip (tmdb_status, e.g. Ended / Returning) — TMDB sends… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1621–1621 EPG (Electronic Program Guide): — Actor pages: cast avatar chips are clickable (TMDB person id) and open actor/:personId inside the current… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1622–1622 EPG (Electronic Program Guide): — Discover pages (clickable metadata chips, issue #1449): year, genre, and country chips on all four detail… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1623–1623 EPG (Electronic Program Guide): — Actor page "All portals" scope (Electron only): batched DB_MATCH_TITLES worker op (trigram FTS over all… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1624–1624 EPG (Electronic Program Guide): — All DB_MATCH_TITLES consumers (Trending rail, "Because you watched" recommendations rail, cross-portal… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1625–1625 EPG (Electronic Program Guide): — Opt-in via Settings > Metadata (TMDB) (sends titles to TMDB); the section also has a "check key" button… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1626–1626 EPG (Electronic Program Guide): — Match confidence: a provider tmdb_id is a strong hint, not gospel — its payload is weighed against the… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1627–1627 EPG (Electronic Program Guide): — Detail views render provider data immediately; enrichment patches the selection asynchronously… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1628–1628 EPG (Electronic Program Guide): — Cached in SQLite tmdb_metadata (Electron, via DB worker ops DB_GET/SET_TMDB_METADATA, plus… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1629–1629 EPG (Electronic Program Guide): — Service layer: libs/services/src/lib/tmdb/; store glue:… TMDB Metadata Enrichment Existing contract
CLAUDE.md:1630–1630 EPG (Electronic Program Guide): — TMDB attribution (logo + disclaimer) is required and shown in the settings TMDB section and About TMDB Metadata Enrichment Existing contract
CLAUDE.md:1631–1631 EPG (Electronic Program Guide): — See docs/architecture/tmdb-metadata-enrichment.md TMDB Metadata Enrichment Existing contract
CLAUDE.md:1635–1635 Portal Account Info: — Both portal types expose an account-info dialog through the same entry points: header playlist switcher… Account Info Dialog Existing contract
CLAUDE.md:1636–1636 Portal Account Info: — Xtream: AccountInfoComponent (libs/portal/xtream/feature/src/lib/account-info/), queries get_account_info… Account Info Dialog Existing contract
CLAUDE.md:1637–1637 Portal Account Info: — Stalker: StalkerAccountInfoComponent (libs/portal/stalker/feature/src/lib/stalker-account-info/),… Account Info Dialog Existing contract
CLAUDE.md:1638–1638 Portal Account Info: — Dashboard source cards carry a passive subscription-expiry chip (amber within 7 days, error-toned once… Source subscription expiry Added / consolidated
CLAUDE.md:1642–1642 Stalker Portal Mode and Endpoint Discovery: — Every resolved Edit commit is guarded by the source connection authority captured when Edit began.… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1643–1643 Stalker Portal Mode and Endpoint Discovery: — Portal mode (full vs. simple) follows OBSERVED behavior, never a URL substring. The single predicate is… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1644–1644 Stalker Portal Mode and Endpoint Discovery: — Import requires an explicit HTTP(S) scheme but accepts a bare host, /c, or a concrete .php address. It… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — The playlist-info Edit dialog loads the complete persisted Stalker row before enabling the form, because… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — A metadata-only Save omits connection/mode fields from its queued update, so the stored connection stays… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — A persisted portalUrl keeps the row on the Stalker save path even if legacy Xtream fields remain. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Changing URL, MAC, credentials, serial, device IDs or signatures blocks duplicate saves, disables dialog… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Before discovery, PWA acquires a shared playlist-authority barrier plus an exclusive origin-wide… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Add/delete, backup restore, and bulk replacement take the same row lock, while Delete All takes the… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — A concurrent Edit or stale dialog fails before remote discovery; a replacement waits for the current owner. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Same-tab Save first publishes its local authentication owner, drains an existing lazy repair through… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — PWA fails closed if Web Locks are unavailable, while Electron relies on its single-instance local owner. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — The reservation blocks every new authentication (including fingerprint-equivalent URL edits) and repair,… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — If discovery returns after its bounded drain while an abandoned authentication is still on the wire, that… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Once Save starts, navigation or dialog destruction does not discard a later successful result: get_profile… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — That late commit uses transformPlaylistMeta() inside the per-playlist write queue to merge only… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Success uses one awaited write to atomically replace endpoint, mode, normalized identity and session… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — This preserves playback headers and other metadata absent from the form. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — Runtime configuration authority covers the observed full/simple mode as well as the session fingerprint,… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — A changed authority may rebase only when the persisted row proves that it owns the same playlist ID,… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1645–1645 Stalker Portal Mode and Endpoint Discovery: — The transient PlaylistMetaUpdate.stalkerSessionPatch preserves on absence, clears on null, and fully… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — executeStalkerRequest() (stores/utils/stalker-request.utils.ts) is the choke point for catalog, content… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Four callers are deliberately outside it because they run below or before the thing it routes on —… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — They are exempt from the routing, not from the repair it hooks, but only fetchViaProfile() wires… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Anything new that is not auth or discovery belongs on executeStalkerRequest(). Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Existing playlists are repaired LAZILY (StalkerPortalRepairService) — only after a request fails with a… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Before an unrecorded repair reads the persisted source or calls discovery, PWA takes the same… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — This prevents repair in another tab from authenticating alongside Edit or crossing delete/restore. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — The persisted-row preflight still verifies that the caller owns the failing source, so a late pre-Edit… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Its in-session override is bound to source endpoint, mode, device identity, and credentials; an Edit or… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — Each repair installs a session-level authentication fence synchronously, drains the existing token slot… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1646–1646 Stalker Portal Mode and Endpoint Discovery: — There is deliberately no eager one-shot migration: a portal that works is never re-probed. Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1647–1647 Stalker Portal Mode and Endpoint Discovery: — Explicit Edit advances the repair generation before installing its resolved session. Lazy repair captures… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1648–1648 Stalker Portal Mode and Endpoint Discovery: — Both transports build the wire format from the same shared builders in @iptvnator/shared/interfaces —… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1649–1649 Stalker Portal Mode and Endpoint Discovery: — Simple portals skip the auth lifecycle (no handshake, token or watchdog) but their requests are not… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1650–1650 Stalker Portal Mode and Endpoint Discovery: — Contract: docs/architecture/stalker-portal.md ("Portal Mode and Endpoint Discovery", "Request Transport… Portal Mode and Endpoint Discovery Existing contract
CLAUDE.md:1654–1654 Stalker Session Authentication: — Full portals authenticate through StalkerSessionService… Session Authentication Lifecycle Existing contract
CLAUDE.md:1655–1655 Stalker Session Authentication: — get_profile's js.status decodes as: full profile/0 = OK, 1 = refused (device-conflict when the message… Session Authentication Lifecycle Existing contract
CLAUDE.md:1656–1656 Stalker Session Authentication: — Refusals throw StalkerPortalError (login-required / login-rejected / device-conflict / blocked /… Session Authentication Lifecycle Existing contract
CLAUDE.md:1657–1657 Stalker Session Authentication: — Auth failures are HTTP 200 + plain text (Authorization failed. / Access denied. / Unauthorized request.),… Session Authentication Lifecycle Existing contract
CLAUDE.md:1658–1658 Stalker Session Authentication: — The handshake is idempotent, so Playlist.stalkerToken is re-presented and get_profile is skipped when it… Session Authentication Lifecycle Existing contract
CLAUDE.md:1659–1659 Stalker Session Authentication: — Watchdog: get_events immediately (init=1), then every watchdog_timeout s (default 120, clamped 30–3600)… Session Authentication Lifecycle Existing contract
CLAUDE.md:1660–1660 Stalker Session Authentication: — Full contract: docs/architecture/stalker-portal.md ("Session Authentication Lifecycle"). Session Authentication Lifecycle Existing contract
CLAUDE.md:1664–1664 Stalker Identity Hardening: — The MAC is canonicalized to 00:1A:79:XX:XX:XX by normalizeStalkerMacAddress (@iptvnator/shared/interfaces)… Stalker Identity Policy Existing contract
CLAUDE.md:1665–1665 Stalker Identity Hardening: — Format is enforced, the Infomir OUI is advisory only: hasInfomirMacOui drives a hint, never a rejection.… Stalker Identity Policy Existing contract
CLAUDE.md:1666–1666 Stalker Identity Hardening: — deriveStalkerDeviceIdsFromMac returns the StbEmu / stalker-to-m3u PAIR: SHA256(MAC) for device_id and… Stalker Identity Policy Existing contract
CLAUDE.md:1667–1667 Stalker Identity Hardening: — get_profile reports one coherent MAG250 via STALKER_STB_PROFILE_PARAMS (ver, stb_type — previously empty… Stalker Identity Policy Existing contract
CLAUDE.md:1668–1668 Stalker Identity Hardening: — Contract: docs/architecture/stalker-portal.md ("Stalker Identity Policy"). Stalker Identity Policy Existing contract
CLAUDE.md:1672–1672 Favorites and Recently Viewed: — Per-playlist favorites and global favorites Summary Existing contract
CLAUDE.md:1673–1673 Favorites and Recently Viewed: — Recently viewed tracks watch history Summary Existing contract
CLAUDE.md:1674–1690 Favorites and Recently Viewed: — Live channels in the unified favorites/recent live tab (global collections and a portal's own tabs) carry… Summary Existing contract
CLAUDE.md:1694–1694 Internationalization: — Uses @ngx-translate with 19 language files in apps/web/src/assets/i18n/ Features Existing contract
CLAUDE.md:1700–1700 Environment Detection and Dual-Mode Architecture — The app determines whether it's running in Electron or as a PWA by checking: Service factory and build bases Corrected; see decisions
CLAUDE.md:1702–1704 Environment Detection and Dual-Mode Architecture — typescript window.electron; // truthy in Electron, undefined in browser Service factory and build bases Corrected; see decisions
CLAUDE.md:1707–1707 Why Dual Mode? — IPTVnator supports both Electron (desktop app) and PWA (web browser) to provide flexibility: Service factory and build bases Corrected; see decisions
CLAUDE.md:1709–1709 Why Dual Mode? — Electron: Full-featured desktop experience with local database, external player support (MPV/VLC), and… Service factory and build bases Corrected; see decisions
CLAUDE.md:1710–1710 Why Dual Mode? — PWA: Lightweight web version that runs in any browser without installation Service factory and build bases Corrected; see decisions
CLAUDE.md:1714–1714 Environment-Specific Behavior: — app.config.ts - DataFactory() selects DataService implementation based on environment Service factory and build bases Corrected; see decisions
CLAUDE.md:1715–1715 Environment-Specific Behavior: — app.routes.ts - Same /workspace/... route tree in both environments; guards keep Electron-only routes… Service factory and build bases Corrected; see decisions
CLAUDE.md:1716–1718 Environment-Specific Behavior: — Storage layer switches automatically: - Electron → SQLite/Drizzle ORM →… Service factory and build bases Corrected; see decisions
CLAUDE.md:1719–1719 Environment-Specific Behavior: — External player support (MPV/VLC) only available in Electron Service factory and build bases Corrected; see decisions
CLAUDE.md:1720–1720 Environment-Specific Behavior: — File system operations only available in Electron (uploading playlists from disk) Service factory and build bases Corrected; see decisions
CLAUDE.md:1723–1723 Base Href Configuration: — The app uses different base href values depending on the build target: Service factory and build bases Corrected; see decisions
CLAUDE.md:1725–1727 Base Href Configuration: — Development & PWA: baseHref="/" (from index.html) - Used by: pnpm run serve:frontend, pnpm run… Service factory and build bases Corrected; see decisions
CLAUDE.md:1728–1730 Base Href Configuration: — Electron Production: baseHref="./" (overridden in build config) - Used by: pnpm run build:backend, pnpm… Service factory and build bases Corrected; see decisions
CLAUDE.md:1732–1732 Base Href Configuration: — Build configurations in apps/web/project.json: Service factory and build bases Corrected; see decisions
CLAUDE.md:1734–1734 Base Href Configuration: — production: Electron build with baseHref="./" Service factory and build bases Corrected; see decisions
CLAUDE.md:1735–1735 Base Href Configuration: — pwa: Web deployment with baseHref="/" Service factory and build bases Corrected; see decisions
CLAUDE.md:1736–1736 Base Href Configuration: — development: Dev mode with baseHref="/" from index.html Service factory and build bases Corrected; see decisions
CLAUDE.md:1739–1739 Factory Pattern Implementation: — The factory pattern ensures a single codebase works in both environments without conditional checks… Service factory and build bases Corrected; see decisions
CLAUDE.md:1742–1742 Build Commit In About: — CI injects the git commit into apps/web/src/environments/build-commit.ts via… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — Master pushes are the nightly channel. Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — The leading nightly-version job computes one <patch>-nightly.<commit date>.<run number> version per run… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — Settings.updateChannel (Settings → About, Electron only, default stable) is mirrored into the main-process… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — AppUpdateService applies the channel to electron-updater before every check (app-update-feed.ts: feed… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — Switching back to stable is forward-only: the nightly stays until a newer stable release exists, because a… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — The About section's status badge names the channel the verdict describes (status.verdictChannel, stamped… Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — setChannel re-checks on its own) — a check against an unsaved channel is deliberately not offered. Nightly channel Existing contract
CLAUDE.md:1745–1745 Nightly Builds And Update Channel: — Contract: docs/architecture/release-pipeline.md ("Nightly channel"). Nightly channel Existing contract
CLAUDE.md:1749–1749 Testing Strategy — Unit tests: Jest with jest-preset-angular and ng-mocks Unit And Type Checks Existing contract
CLAUDE.md:1750–1750 Testing Strategy — E2E tests: Playwright testing the web app and Electron app Unit And Type Checks Existing contract
CLAUDE.md:1751–1751 Testing Strategy — Backend tests use standard Jest Unit And Type Checks Existing contract
CLAUDE.md:1752–1752 Testing Strategy — Bug fixes should add focused regression coverage unless there is a documented reason not to. Unit And Type Checks Existing contract
CLAUDE.md:1753–1753 Testing Strategy — Use the impact-based validation policy in Regression Prevention And Test Updates to choose targeted unit… Unit And Type Checks Existing contract
CLAUDE.md:1757–1757 Nx Commands — Use nx CLI for better performance: Build and serve commands Moved / consolidated
CLAUDE.md:1759–1763 Nx Commands — bash pnpm nx run <project>:<target> # Example: pnpm nx run web:build # Example: pnpm nx run… Build and serve commands Moved / consolidated
CLAUDE.md:1765–1765 Nx Commands — To run multiple projects: Build and serve commands Moved / consolidated
CLAUDE.md:1767–1769 Nx Commands — bash pnpm nx run-many --target=test --all Build and serve commands Moved / consolidated
CLAUDE.md:1773–1773 Electron Build Process — The Electron backend depends on the web app being built first: Build and serve commands Moved / consolidated
CLAUDE.md:1775–1775 Electron Build Process — electron-backend:build depends on web:build Build and serve commands Moved / consolidated
CLAUDE.md:1776–1776 Electron Build Process — Output goes to dist/apps/electron-backend (backend) and dist/apps/web (frontend) Build and serve commands Moved / consolidated
CLAUDE.md:1777–1777 Electron Build Process — Packaging combines both into distributable Build and serve commands Moved / consolidated
CLAUDE.md:1781–1781 Database Migrations — Database initialization is owned by libs/shared/database/src/lib/connection.ts. createTables() creates… Upgrade Compatibility And Migrations Existing contract
CLAUDE.md:1787–1790 IPC Communication: — 1. Define handler in appropriate events file (e.g., database.events.ts) 2. Register with ipcMain.handle()… Adding behavior across layers Moved / consolidated
CLAUDE.md:1794–1797 Adding New Playlist Source: — 1. Add type to libs/shared/interfaces/src/lib/playlist.interface.ts 2. Create event handler in… Adding behavior across layers Moved / consolidated
CLAUDE.md:1801–1801 State Management: — Use NgRx for global application state (M3U playlists, libs/m3u-state) Adding behavior across layers Moved / consolidated
CLAUDE.md:1802–1802 State Management: — Use NgRx Signal Store with signalStoreFeature() composition for portal/feature state (XtreamStore,… Adding behavior across layers Moved / consolidated
CLAUDE.md:1803–1803 State Management: — Use NgRx signals for reactive data streams Adding behavior across layers Moved / consolidated
CLAUDE.md:1810–1810 General Guidelines for working with Nx — For navigating/exploring the workspace, invoke the nx-workspace skill first when it is available - it has… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1811–1811 General Guidelines for working with Nx — When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through nx… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1812–1812 General Guidelines for working with Nx — Prefix nx commands with the workspace's package manager (e.g., pnpm nx build, npm exec nx test) - avoids… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1813–1813 General Guidelines for working with Nx — You have access to the Nx MCP server and its tools, use them to help the user General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1814–1814 General Guidelines for working with Nx — For Nx plugin best practices, check node_modules/@nx/<plugin>/PLUGIN.md. Not all plugins have this file -… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1815–1815 General Guidelines for working with Nx — NEVER guess CLI flags - always check nx_docs or --help first when unsure General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1819–1819 Scaffolding & Generators — For scaffolding tasks (creating apps, libs, project structure, setup), ALWAYS invoke the nx-generate skill… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1823–1823 When to use nx_docs — USE for: advanced config options, unfamiliar flags, migration guides, plugin configuration, edge cases General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1824–1824 When to use nx_docs — DON'T USE for: basic generator syntax (nx g @nx/react:app), standard commands, things you already know General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1825–1825 When to use nx_docs — The nx-generate skill handles generator discovery internally - don't call nx_docs just to look up… General Guidelines for working with Nx Retained; tools conditional
CLAUDE.md:1831–1835 XMLTV Response Compression — Electron decodes HTTP compression before the gzip file layer. For .gz/gzip metadata plus HTTP gzip, a… XMLTV response compression Existing contract
CLAUDE.md:1839–1857 XMLTV Source Removal — Saving Settings → EPG reconciles cached XMLTV with committed global URLs and all enabled M3U playlist… XMLTV source lifecycle Existing contract
CLAUDE.md:1861–1870 Web Backend Provider Redirects — All four provider proxy routes use ValidatedHttpClient: automatic redirects are disabled, the initial URL… Web Backend Existing contract
CLAUDE.md:1874–1879 Portal Connectivity Preference — Half-open trial slots follow the complete request lifetime with no elapsed-time expiry. All four… Desktop preference and account feedback Existing contract
CLAUDE.md:1880–1887 Portal Connectivity Preference — Desktop Settings > General > Portal connections exposes default-on Settings.portalConnectivityGuard. Only… Desktop preference and account feedback Existing contract
CLAUDE.md:1888–1890 Portal Connectivity Preference — Both account-info dialogs explain guard refusals with localized paused-request copy and Retry now; Stalker… Desktop preference and account feedback Existing contract
CLAUDE.md:1894–1920 Live TV Panel Levels — Portal live layouts (Xtream live, Stalker itv/radio) fold their panels from the outside in, in three… Collapsible Live Sidebar Existing contract
CLAUDE.md:1924–1930 Live Channel Return — Xtream and Stalker (including radio) capture displayed playback order on explicit selection. Remote… Live channel return and playback order Existing contract
CLAUDE.md:1934–1940 Stalker Live Search — ITV sidebar and fullscreen searches independently filter the complete selected category; only All Items… Full ITV Channel List Cache Existing contract
CLAUDE.md:1944–1959 Channel and Detail Keyboard Scrolling — Channel scroll owners use ChannelScrollFocusDirective; pointer selection focuses the viewport, native… Detail Scroll and Focus Existing contract
CLAUDE.md:1963–1967 Catch-Up URL Copying — EPG timeline/list programme details expose Copy archive URL for supported Xtream/M3U archives, including… Copy archive URL Existing contract
CLAUDE.md:1971–2001 Xtream Archive Downloads — Desktop Xtream Live TV programme details can enqueue completed catch-up as contentType: catchup. The queue… Xtream archive downloads Existing contract
CLAUDE.md:2005–2010 Desktop Source Health — Electron switcher/source rows share bounded, cached Xtream/Stalker/M3U URL checks through… Desktop source health Existing contract
CLAUDE.md:2012–2018 Desktop Source Health — Desktop Sources also offers library-wide selective cleanup through dialog-scoped SourceCleanupService.… Desktop source health Existing contract
CLAUDE.md:2020–2022 Desktop Source Health — Startup source auto-refresh uses SourceActivityService to protect busy IDs from cleanup. Late batch… Desktop source health Existing contract

Master integration follow-up

During conflict resolution with master on 2026-09-21, the compact root guidance was retained and the new upstream knowledge was checked against canonical docs:

The original 716-entry inventory above remains tied to its immutable source.

A subsequent master integration on 2026-09-21 also preserved TMDB year-evidence ranking, its accepted older-season ambiguity, and v4 lookup-cache migration in the updated TMDB contract. These upstream additions stay in that canonical document rather than CLAUDE.md.