# Unspooled Project State — 2026-05-31

> Supersedes stale stats in SKILL.md frontmatter. SKILL.md is at 100K limit — use this reference for current numbers.

## Build

```bash
cd /home/rurouni/Unspooled
JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 ./gradlew :app:assembleDebug
```

- **APK:** `app/build/outputs/apk/debug/app-debug.apk` (~62MB)
- **GitHub:** `ramon-gonzalez-jr/unspooled.git` (master, 17 commits)
- **File counts:** 313 KT source files, 14 test files, 171 tests, 0 compile warnings

## NuvioTV Feature Parity (2026-05-31 — all 6 complete)

| Feature | Status |
|---------|--------|
| TmdbMetadataService (cast, trailers, more-like-this) | ✅ 391 lines |
| IdBridge (IMDB↔TMDB caching, Room) | ✅ |
| PersonDetailScreen (cast browsing) | ✅ |
| Episode-level enrichment (fetchEpisodeEnrichment) | ✅ |
| CompletableDeferred in-flight dedup on all endpoints | ✅ |
| ContinueWatchingEnrichmentCache (profile-scoped JSON) | ✅ |

## Scraper Architecture (debrid-agnostic)

- `services/nexstream-scraper/` — Node.js Express, port 3091
- 5 parallel scrapers: Torrentio, Comet, MediaFusion, Jackett, Zilean
- Deduplicates by infoHash, returns magnet URIs
- **No debrid keys on server** — app resolves via DebridService with user's OAuth tokens
- SQLite cache + in-memory L1

## Debrid Resolution Pipeline

```
Scraper → infoHash + magnet
   ↓
DebridService.resolveStream() → RealDebrid/AllDebrid/Premiumize/TorBox client.getDownloadUrl()
   ↓
PlaybackOrchestrator → validates URL → PlayerManager (Media3/ExoPlayer)
```

## Remaining Work

- [ ] Focus/density audit on cards (NetflixMediaCard, ContinueWatchingCard)
- [ ] AndroidManifest configChanges — density/font/screen/ui mode
- [ ] Real-device QA on physical Android TV hardware
- [ ] CircularRail decision — remove or keep behind feature flag
- [ ] Compose TV focus tests for standard sidebar
- [ ] Scraper Docker deployment (docker-compose.yml exists, untested)
- [ ] addon-config-worker Cloudflare Worker deployment

## Dead Code Removed (May 31)

- TmdbRepository.kt → replaced by TmdbMetadataService + IdBridge
- TmdbService.kt → redundant; IdBridge handles IMDB↔TMDB caching
- ServiceConnectionState.kt, UiEffect.kt → unused domain models
- docs/ (IMPLEMENTATION_PLAN.md, CIRCULAR_RAIL_IMPLEMENTATION_PLAN.md) → consolidated into PROJECT_STATE.md
