- Support multi-row selection with clean clipboard text - Preserve selections across playback updates and clear them on source changes
4.2 KiB
Domain Ownership
Status: active Last verified: 2026-07-15 Owner: Kyle Yasuda Read when: you need to find the owner module for a behavior or test surface
Runtime Domains
- Desktop app runtime:
src/main.ts,src/main/,src/core/services/ - Overlay renderer:
src/renderer/ - Launcher CLI:
launcher/ - mpv plugin:
plugin/subminer/
Product / Integration Domains
- Config system:
src/config/; Anki resolution is composed bysrc/config/resolve/anki-connect.tsfrom focused resolvers insrc/config/resolve/anki-connect/ - Overlay/window state:
src/core/services/overlay-*,src/main/overlay-*.ts - MPV runtime and protocol:
src/core/services/mpv*.ts - Subtitle/token pipeline:
src/core/services/subtitle-*.ts,src/core/services/tokenizer*,src/core/services/tokenizer/,src/subsync/ - Anki workflow:
src/anki-integration/,src/core/services/anki-jimaku*.ts - Immersion tracking:
src/core/services/immersion-tracker/Includes stats storage/query schema such asimm_videos,imm_media_art, andimm_youtube_videosfor per-video and YouTube-specific library metadata. Library-entry identity aliases and merge recommendations are persisted alongside this schema; the stats HTTP and SPA layers only expose and present those domain decisions.delete-maintenance-scheduler.tscoalesces and serializes stats deletes; the expensive work runs indelete-maintenance-worker-thread.tswhile the tracker queues playback writes. Each batch uses one transaction, lexical update, rollup refresh, and incremental lifetime subtraction (planLifetimeRemovals/applyLifetimeRemovalsinlifetime.ts). Merges, moves, AniList reassignments, andstats cleanup -luserepairLifetimeSummariesFromMedia(recompute from the per-video media ledger). The full lifetime rebuild survives only as the empty-table bootstrap; anywhere else it would collapse lifetime totals to the session retention window. - AniList tracking + character dictionary:
src/core/services/anilist/,src/main/runtime/composers/anilist-*,src/main/character-dictionary-runtime.ts,src/main/character-dictionary-runtime/ - Jellyfin integration:
src/core/services/jellyfin*.ts,src/main/runtime/composers/jellyfin-* - Window trackers:
src/window-trackers/ - Stats HTTP app:
src/core/services/stats-server.ts, with route groups and shared route support insrc/core/services/stats-server/ - Stats SPA:
stats/ - Public docs site:
docs-site/
Shared Contract Entry Points
The subtitle sidebar consumes parsed cues through SubtitleSidebarSnapshot. Its sourceKey
identifies the media and subtitle source so renderer selections are invalidated on source changes,
including changes whose cue text and timings are identical. Native selection and clean clipboard
serialization live in src/renderer/modals/subtitle-sidebar-selection.ts. Electron lets standard
Copy input reach the renderer, where sidebar selection takes priority over the live-subtitle binding.
The preload bridge writes selections through Electron's clipboard API so copying does not depend
on Chromium document focus or require activating the overlay window.
- Config + app-state contracts:
src/types/config.ts - Subtitle/token/media annotation contracts:
src/types/subtitle.ts - Runtime/window/controller/Electron bridge contracts:
src/types/runtime.ts - Anki-specific contracts:
src/types/anki.ts - External integration contracts:
src/types/integrations.ts - Runtime-option contracts:
src/types/runtime-options.ts - Settings UI contracts:
src/types/settings.ts - Session-binding contracts:
src/types/session-bindings.ts - Stats HTTP wire contracts:
src/types/stats-wire.ts,src/types/stats-http-contract.ts - Compatibility-only barrel:
src/types.ts
Ownership Heuristics
- Runtime wiring or dependency setup: start in
src/main/ - Business logic or service behavior: start in
src/core/services/ - UI interaction or overlay DOM behavior: start in
src/renderer/ - Command parsing or mpv launch flow: start in
launcher/ - Shared contract changes: add or edit the narrowest
src/types/<domain>.tsentrypoint; only touchsrc/types.tsfor compatibility exports. - User-facing docs:
docs-site/ - Internal process/docs:
docs/