138 lines
6.7 KiB
Markdown
138 lines
6.7 KiB
Markdown
|
|
# 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.
|