# TVAnarchy v2 — pillar model TVAnarchy is organized into **product pillars**. Everything in the repo maps to one primary pillar, plus **cross-pillar** settings (theme) and infrastructure (transport, tooling). One app shell hosts all pillar UI. ``` TVAnarchy ├── Watch — playback + Home/Player UX ├── Library — catalog, scan, metadata, grouping ├── Download — media over BitTorrent (get + keep alive) ├── Net — TVAnarchy data from other installs (friends → network) └── Devices — registry, install pairing, shared media volume ``` **Settings:** each pillar owns its section; **cross** owns theme and shell chrome ([pillars/settings.md](./pillars/settings.md)). **Watch** and **Download** are largely shipped. **Net** is specified here; code lands in a later stage (see [roadmap.md](./roadmap.md)). All three pillars have **UI inside one app** — not three apps. Watch and Download each get sidebar tabs; Net uses Settings + Player hooks (see [correlation/ui.md](./correlation/ui.md)). ## Docs | Doc | Contents | |-----|----------| | [pillars/watch.md](./pillars/watch.md) | Playback, Home, Player | | [pillars/library.md](./pillars/library.md) | Catalog, scan, metadata, grouping | | [pillars/library-display.md](./pillars/library-display.md) | Canonical episode display names | | [pillars/library-titles.md](./pillars/library-titles.md) | Title Library dataset + MLX M2 | | [pillars/download.md](./pillars/download.md) | Torrents, custody, governor | | [pillars/net.md](./pillars/net.md) | Federated data editions | | [pillars/devices.md](./pillars/devices.md) | Device registry, install pairing | | [pillars/devices-storage.md](./pillars/devices-storage.md) | Shared media volume, extension warmup | | [pillars/settings.md](./pillars/settings.md) | Per-pillar + cross settings model | | [pillars/watch-appearance.md](./pillars/watch-appearance.md) | Themes, Winamp `.wsz` (cross chrome) | | [correlation/components.md](./correlation/components.md) | Full repo → pillar map | | [correlation/state.md](./correlation/state.md) | Config + state files by pillar | | [correlation/ui.md](./correlation/ui.md) | macOS + iOS surfaces by pillar + nav details | | [correlation/cross-cutting.md](./correlation/cross-cutting.md) | Fleet, transport, tools + theming notes | | [glossary.md](./glossary.md) | Pillar-aware terms | | [roadmap.md](./roadmap.md) | Phase checklist (short) | | [plan.md](./plan.md) | **Full v1 → v2 build plan** (phases, PRs, tests, risks, **Appendix C: best practices / pillar sep DRY / switching / theming**) | | [features.md](./features.md) | **Feature state comparison table** (v1 vs v2: complete / partial / exists) | | [docs/marketing/](./docs/marketing/) | **Press & GTM kit** (one-pager, demo script, founder post, FAQ, releases) | | [packages/bittorrentdrive.md](./packages/bittorrentdrive.md) | Shared drive: Net external, Devices internal | | [manifest.json](./manifest.json) | Machine-readable correlation index | **New in this build-out**: [plan.md](./plan.md) Appendix C thoroughly documents best coding practices, how pillars achieve separation while staying DRY (packages + faces + pattern reuse + correlation as spec), how pillar "switching" works (single RootView sidebar + selection-driven detail + subnav), and UI theming (custom hybrid sprite system, not SwiftUI legoblocks; no Godot/Rust). Update these when nav or chrome changes. ## How pillars interact ```mermaid flowchart TB subgraph library [Library] Cat[Catalog + metadata] end subgraph watch [Watch] Play[Player + Home] end subgraph devices [Devices] Reg[Device registry] Vol[Shared media volume] end subgraph download [Download] Acq[Search + Transmission] Custody[Custody + Reaper] end subgraph net [Net] Parts[Parts + editions] end Acq -->|completed files| Cat Vol -->|logical paths| Cat Cat --> Play Reg --> Vol Parts -->|grouping, intro-markers| Cat Parts -->|intro-markers| Play Play -->|extended warmup| Vol Play -->|watchlog| Parts Custody --> Vol subgraph drive [BitTorrentDrive package] Int[internal face] Ext[external face] end Vol --> Int Parts --> Ext ``` ## Feature State Comparison: v1 vs v2 See the dedicated [v2/features.md](./features.md) for the full feature state comparison table (v1 vs v2, with states complete / partial / exists). ## Legacy docs Pre-v2 cross-cutting docs remain in [`../docs/`](../docs/) (architecture, data-model, operations, roadmap). **v2 is the organizational lens**; it does not replace operational runbooks until explicitly migrated. ## Clarity during transition (no v1/v2 code split) Per the plan (v2/plan.md §1 and Appendix C): v2 uses a *lens* (pillars + correlation/* + manifest.json) on the *existing single codebase*, not a structural v1/ or v2/ folder move in Sources/ (that would create the exact legacy baggage the plan rejects). Use these for "clear v1 vs v2 view": - `correlation/components.md` + `state.md` + `ui.md`: every component tagged by primary pillar (e.g. Mesh/* = cross under Devices pillar; DeviceConfig = Devices). - `manifest.json`: machine-readable pillar index. - `pillars/*.md` + `glossary.md`: the product model (e.g. Devices pillar owns "install" as group term; "fleet" is internal only). - Code comments now point back to v2/ (see recent alignments in FleetState, MeshEnrollController, DeviceConfig, MeshJoinView). - `v2/features.md` + `roadmap.md`: exact shipped vs in-progress state. This gives the separation/clarity benefit without forking the tree. Update correlation/ + this README + pillar comments in the same change as any new code. ## v2 directory layout (this tree) ## v2 directory layout (this tree) ``` v2/ ├── README.md ← you are here ├── manifest.json ← pillar tags for every component ├── glossary.md ├── roadmap.md ├── pillars/ ← product definition per pillar │ └── watch-appearance.md ← Winamp .wsz (Watch sub-spec) ├── correlation/ ← repo inventory mapped to pillars ├── features.md ← v1 vs v2 feature state table (complete/partial/exists) ├── packages/ ← shared engines (not pillars) — [packages/README.md](./packages/README.md) │ ├── README.md ← full catalog │ └── bittorrentdrive.md ← Net external + Devices internal faces └── schema/net/ ← Net part schemas (first Net slice) ``` Future implementation code for Net may live under `v2/net/` or the top-level `net/` package once the first part ships; schemas are defined now so Watch and Download can subscribe without renaming.