Files
OrbitTv/docs/roadmap.md
T
pauljdandClaude Opus 5.5 e0418770f4
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 1m44s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m23s
Number channels in Sky-style blocks by category (0.69.0)
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-02 12:26:39 +00:00

18 KiB

Orbit TV roadmap

Approved by Paul on 1 November 2026. Companion documents: programming bible, metadata and matching, asset inventory. Source briefs are in briefs.

Decisions

Paul approved these on 1 November 2026.

Conflict found What the sources say Decision
103 name Installed as "Toonami". The bible has Vortex, and 103's search list also holds titles the bible now gives to Heroes and Orbit X. Rename the display to Vortex, keep 103 and its lineup. Toonami is a third-party brand, and the creative brief bars those as default branding.
101 name Installed as "Orbit One", bible says "Orbit 1". Use Orbit 1 on screen, keep 101.
Box office and game names The app and its artwork say OrbOffice and OrbHive. Both briefs say Orbit Drive-In and OrbitHive. Use Orbit Drive-In and OrbitHive going forward. Rename the app and artwork in a later build.
Orbit X and Ring X look Both call for silver or chrome with an aggressive red X, and the bugs will sit on the same screen. Keep the red X for Orbit X's cartoon slash. Give Ring X a distinct silhouette, decided when its board arrives.
102 content Built from Horror, Thriller and Science Fiction film searches. The bible separates Orbit Horror and defines After Dark as cult and late-night. Keep 102 as built. Change its rules when presets arrive, and don't claim adult controls before profiles exist.
Title moves Toy Story moves from Wonder to PixelZ. Batman Beyond and The Powerpuff Girls drop off Vortex in the new table. Latest table wins. Batman Beyond stays a permitted crossover and The Powerpuff Girls moves to Rewind. Existing 103 choices stay.
Order of work Your earlier order had controlled refresh and the grid guide. The new priority list names neither. Keep both, as shown in section E.
Profiles Listed as a later priority, yet matching treats audience suitability as a required filter. Capture ratings early and show them. Treat real enforcement as a gate before anyone outside your household uses mature channels.

Current status

The status below comes from the source code, the verification notes and Paul's reports from the box. The roadmap update's list of working features is right in spirit, but discovery and channel generation are much narrower than it implies.

Implemented

These are working, with Paul's confirmation noted where given.

Feature Actual extent Confirmed by
Emby sign-in and remembered login One fixed provider. Encrypted saved token, no saved password. Paul, on 0.14
Metadata access Hand-triggered, small queries: 20 items per page, 10 series per search, 5 episodes per series. No full library read. Paul, on 0.3
Clock-driven channels Repeating UTC timeline. Joins in progress, real Now and Next, automatic rollover. Paul, on 103
101 Orbit One Built from the checked sample, up to three titles. Partly: built and saved
103 Toonami One to three approved series, up to five episodes each, from a 23-title search list. Paul
102 Orbit After Dark Two or three approved films from genre searches. Paul: played, with a tuning-screen issue
After Dark artwork in the app Compact logo and lit-window background, on the review and guide screens. Paul
Programme strip and channel switching Strip hides after five seconds. Switching works between built channels. Paul for the strip; switching not separately reported
Demo guide grid, ticket previews, Services page Fictional data, not connected to Emby. Paul, on 0.2

0.16 replaces the blue tuning panel and passes 87 tests and lint. Paul confirmed on 1 November 2026 that it works on the box.

Approved direction

  • The 25-channel lineup in section A, as presets matched against each user's library, never bundled content.
  • Tick-based selection: available titles can be ticked, and missing titles stay visible, unticked and marked unavailable.
  • The clock-driven schedule stays, and new work plugs into it.
  • Original Orbit assets only. Concept art is reference, and After Dark is the reference workflow.
  • Optional, explainable personalisation, with no mandatory AI or cloud service.
  • Orbit Drive-In as occasions, not a catalogue.

Proposed

These need technical review: sections B, C and F, time-of-day and weekly programming, repeat rules, and the catalogue storage choice.

Future

Profiles and PINs, more providers, authorised IPTV and external guide data, themes, Catch Up, OrbitHive Bedlam, OrbText, first-run onboarding, self-hosting and public distribution.

Blocked or uncertain

  • Metadata quality: unknown until tested. Nobody has measured how much of it the provider returns.
  • Provider load: the provider's rate limits and any rules on full library reads are unknown.
  • Playability at scale: each title needs its own playback check, and only direct-play sources work because transcoding is off.
  • Names and rights: clearance isn't established for Orbit or any channel name. Curated title lists and references to other brands need review before public release.
  • Transparent video idents: support is unproven on the box, and current idents are opaque H.264.
  • New concept boards: the eight new boards haven't been received.

Indexing and programming engine

Audit and phased plan are in review, from docs/briefs/indexing-programming-engine-2026-11-01.md: https://claude.ai/artifact/YYGHnyn7fhxfM1NctEtexw. Nothing from it is approved or built yet.

Smart channels status

Phase A of the Smart Channels Foundation brief passed Paul's review on 2 November 2026, with Paradox on the box (VERIFICATION-0.39.0.md). Phase B (Terra and After Dark, VERIFICATION-0.40.0.md) and Phase C (Vortex, plus fewer repeats on Terra, VERIFICATION-0.41.0.md) are on the box as 0.41, tested and awaiting Paul's review. Day parts are on the box on Vortex and After Dark (VERIFICATION-0.42.0.md). Phase D (the remaining channels) needs separate approval. Reviewed suggestions are built and in use on After Dark and Vortex (VERIFICATION-0.47.0.md), the first piece of the programming director. Vortex Movie Night, the first weekday event, is on the box. Phase D has started with Orbit Gold (111), Heroes (121) and Evidence (141), on the box as 0.49, then ToonZ (122), Rewind (123) and Orbit X (124), all on the box as 0.51 with ten smart channels running (VERIFICATION-0.51.0.md). Orbit Three (112), Riot (113) and Dark Files (142, with day parts from the bible) are on the box as 0.59, making 13 smart channels (VERIFICATION-0.59.0.md). Paul's own channels, Detour (114), BritX (115), Orbit Junior (125) and Orbit Wild (143), are built as 0.63 from docs/briefs/new-channel-ideas-2026-11-02.md; Orbit Unsolved is held, as Dark Files covers it. Still to add: Orbit 2, Wonder, PixelZ, Orbit VHS, Orbit Sci-Fi, Orbit Horror, Orbit Action, Orbit Romance, Orbit Premiere, Odyssey and Ring X. Numbers are placeholders until Paul maps the lineup. A show may run on several channels but never at the same moment. Animated idents are design files only and aren't in the app yet.

Programming director

Paul's direction, 2 November 2026, for after broadcast reliability is proven. Proposed, not built.

  • Two tracks: broadcast reliability (episode progression, schedule recovery, film rotation, day parts) comes first. Smart programming (channel identity rules, discovery, variety, explainable recommendations, and eventually local learning) follows.
  • Two parts: the scheduler executes a stable programme plan. A separate programming director decides what belongs in that plan.
  • Personality setting: Familiar (more established favourites), Balanced (favourites mixed with discoveries), Surprise Me (more unusual programming). Illustrative, not in the app.
  • Not for this channel: Paul can't judge every suggested title in advance, so unsure ones stay in as discovery, with an option to remove a title while it's airing. Proposed 2 November 2026, not built.
  • Ownership: rule-based and transparent, with lightweight preference signals. Learning can be switched off entirely and reset. No cloud, no mandatory AI, no uploading viewing history.

Future polish ideas

Paul's ideas, 1 November 2026. Not fixes and not scheduled.

  • Subtle accent colour per category.

  • A tiny live pulse or movement on the On now cards, kept gentle and off for reduced motion.

  • The highlighted left-menu item could reflect the channel or theme, while yellow stays the clear focus signal.

  • Orbit Drive-In gets its own full-screen destination, opened from the teaser card.

  • Rings around the planet (Paul, 1 November 2026): Orbit 1's background had its rings off to one side of the planet. The app's copy is fixed, from orbit-1/sources/orbit_1_background_v2.svg. Orbit 1's ident and the other channels built from the same planet layout (Orbit 2, Orbit Sci-Fi and any others on that theme) still need checking and the same fix before they join the app.

  • Subtitles default (Paul, 1 November 2026): a setting behind the gear for subtitles on or off by default, in the viewer's language where a programme has it.

  • Orbit Drive-In name (Paul, 1 November 2026): decided, replacing OrbitOffice. Event types inside it are Orbit Marquee, Orbit Double Bill, Orbit Triple Bill and The Late Show. The briefs and design/interface still show the old name.

  • Orbit Drive-In (Paul, 2 November 2026): built in 0.67 with three scenes that take turns: his theatre and drive-in pictures, and the CRT. Marquee nights, Friday double bills, Saturday triple bills and late shows from his films, booked a week ahead. Still to come: reminders from a ticket.

  • Orbit Arcade (Paul, 2 November 2026): the look in design/arcade is approved: logo, honeycomb menu and Bedlam screen. Games are OrbitHive Bedlam, Snake, Block Drop, Brick Break, Pairs and Patience. Small games only, so the app stays small: drawn in code with no game engine, and measured for size when built. Not scheduled.

Channel numbers

Done in 0.69, as Paul asked: blocks like Sky, biggest channels first. 100s entertainment and comedy (101 Orbit 1, 102 Orbit 2, 103 Orbit Three), 200s factual, 300s films, 400s sport, 600s cartoons and kids. The full list is in VERIFICATION-0.69.0.md.

Interface direction

Paul's idea, 1 November 2026. Home, guide and watching controls were built in 0.25 to 0.34 and confirmed on the box. Back on home closes the app, by Paul's choice, rather than going full screen. Still to build: proper settings behind the gear, profiles and real Orbit Drive-In events.

  • Home: keep the colour scheme and refine the details. Old-Sky-style category list on the left (All Channels, Documentaries, Movies, Kids and so on), showing a category only if the viewer has channels in it. Right side shows what's on now and Orbit Drive-In events, selectable with the remote.
  • Guide: choosing a category opens its channel list below, with channel name, time and what's on. Live picture-in-picture sits at the top on one side, with the highlighted programme's description on the other. Moving through the list updates the description, and only pressing OK changes the picture.
  • Watching controls: OK shows the classic programme bar. Up and down change channel. Right opens subtitles. Holding OK opens a small box for typing a channel number, because the Xiaomi remote may have no number keys. Left jumps back to the last channel watched.
  • Settings: a gear at the top right holds connection, profiles, themes and editing, so setup stays out of the way.
  • Loading: today's menus are developer test screens. Replace them with simple viewer options behind the gear, once indexing is settled.
  • Principle: the TV should open onto something playing or one press away, so home can't become another catalogue.

Roadmap changes

The roadmap gains two steps the update doesn't name, the metadata audit and a generic channel list, and keeps every earlier milestone. P1 to P6 are your priorities, and arrows show what must exist first. Branding can run alongside the other work once channels exist.

flowchart TD
  fix["Now: 0.16 tuning fix, test on 102"] --> audit["Metadata audit"] --> cat["P1 Catalogue and refresh"]
  cat --> preset["P2 Preset matching"]
  cat --> list["Generic channel list"]
  preset --> rec["P5 Recommendations"]
  list --> grid["Grid guide restored"] --> brand["P4 Branding rollout"]
  list --> sched["P3 Schedule quality"] --> office["P6 Orbit Drive-In"]

Gate before mature channels reach other households: profiles and enforced ratings.

Later: more providers, IPTV, themes, Catch Up, OrbitHive Bedlam, OrbText, public release.

The grid guide comes before most new channels, because switching one at a time gets unwieldy past a handful. That follows your earlier request to bring the guide back as channels grow.

What each step needs from today's code

The clock engine stays. These limits are the parts that have to change, and only the last row changes how the clock behaves.

Today Why it matters Needed for
Queries capped at 20 items, by hand No library-wide view P1
512 KiB saved state, fixed channel slots, numbers 101 to 103 only Can't store a catalogue or a fourth channel P1, channel list
Channel lineups of 2 to 15 unique titles Too small for real channels, and blocks intentional repeats P3
One repeating loop anchored to UTC No concept of weekday, evening, local time or daylight saving Dark Files, Ring X, Orbit Drive-In

For that last row, I'd keep the loop as the default and add an optional local-time block layer that hands each block a lineup. It needs its own design and your approval before any work starts. That also meets your rule against replacing the engine.

Earlier milestones kept

Milestone Where it now sits
Original channel set: 101, 102, 103 Done
Controlled refresh, previewing additions and removals without shifting what's playing P1
Duplicate grouping and best-version choice, added 1 November 2026 P1, before preset matching
Smart rotation from large channel pools, added 1 November 2026 P3
Reusable and custom channel creation with ticks P2 and channel list
Grid guide with real Now and Next After channel list
Bottom-left bug, off by default P4
Optional idents with reduced-motion setting, never delaying the clock P4
Dashboard: On now, Coming up, Orbit Drive-In presents With P5 and P6
First-run onboarding and more providers Later, Emby preserved
Profiles, Kids, PIN Later, with the gate shown above
Themes, Catch Up, Games, OrbText Later, unchanged
Seasonal programming and themed weekends P3 and P6

The gate only applies once someone else's household is involved, so it doesn't hold up your own box. Until then, Orbit shouldn't describe any channel as age-protected.

Next development step

I recommend a read-only metadata coverage check as 0.17, after you've confirmed 0.16 on the box. It answers the question every later decision depends on: how much usable metadata does your provider return? Nothing gets built on guesses, and your channels are untouched.

Scope

  • Entry point: a new "Check metadata coverage" action under Menu, Connect Emby.
  • Requests: one sample each of films, series and episodes, at most 20 items each, and only when you press it.
  • Result: counts only, such as "Genres 18 of 20", for each field in section B. No titles are shown.
  • Sampling: existing queries sort by name, which favours titles starting with A. This one should take a spread across the library and label itself a sample.

It won't save anything, change a channel or schedule, classify titles, or build the catalogue.

Files likely to be involved

File Change
MetadataAudit.kt (new) Build the requests, count field coverage
EmbyConnectionScreen.kt The action and the results screen
MetadataAuditTest.kt (new) Fixture tests
app/build.gradle.kts, EmbyClient.kt, SecureMediaDataSource.kt Version bump, as in past releases
VERIFICATION-0.17.0.md (new) Release notes and evidence

Risks

Risk Handling
Provider load or rate limits Three small requests, only on demand. Existing cooldown applies, and a rate-limit reply stops the check.
Oversized replies from extra fields Existing 2 MiB response cap, with a clear message if hit
Sample misleads Label results as a sample, not a library total
A field name differs from Emby's documentation Check the documentation first, and report a missing field as zero, not as an error
Private catalogue exposure Counts only, nothing saved or logged

Acceptance criteria

  • One press sends at most three requests, each capped at 20 items.
  • The screen shows coverage counts for each item type and field, with no titles.
  • 101, 102 and 103 keep their lineups and timing, and saved setup is byte-for-byte unaffected by the check.
  • An expired login or rate limit gives a clear message and stops.
  • You can run it with the remote, then read or photograph the result for me.

Tests

Fixture tests cover the request limits and the token staying in the header, not the URL. They also cover missing and malformed fields, a server ignoring the limit, rate-limit and expired-login stops, and no saved-state writes. The full 87 existing tests and lint must still pass, and you then run it on the box.

Rollback

Reinstall the 0.16 APK kept in outputs/revision-0.16.0. The saved data format doesn't change, so your login and channels should survive, which I'd confirm during the test.

The project is now in git, so each release can also be rolled back from its commit, which the channel-list migration will need later.