pauljdandClaude Opus 5.5 c423af00a6
pauljd/davidson-ci: Davidson CI / quality (push) Failing after 1m42s
pauljd/davidson-ci: Davidson CI / ai-review (push) Failing after 1m26s
Note the subtitles default and OrbitOffice name ideas on the roadmap
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-11-01 23:05:46 +00:00
2026-11-01 17:25:30 +00:00
2026-11-01 17:25:30 +00:00

Orbit TV — local prototype

A native Android TV prototype for review on Paul's Xiaomi TV Box S 3rd Gen.

Roadmap and plans: docs/roadmap.md, programming bible, metadata and matching, asset inventory.

Revision 0.6.0 — one scheduled Emby channel

Paul confirmed the 0.5.0 strip hides and displays correctly. The next increment adds a sample guide for one real channel: Menu → Connect Emby → Check 20 items → Create sample channel. It checks at most five media-source metadata responses and keeps up to three eligible titles. A precise UTC timeline repeats the lineup, joins in progress and advances automatically. Watch channel uses the ordinary clock; Check transition jumps near an end for a quick handover check and is labelled as a test. It may affect normal provider viewing history. Now/Next in the strip and sample guide comes from that timeline. Pause/seek remain on-demand features; the scheduled channel follows the clock. Back returns to the sample guide. No channel, credentials or tokens are persisted yet. See docs/sample-scheduled-channel.md. This version needs approval before TV installation and real channel/rollover acceptance testing.

Revision 0.5.0 — Classic programme strip

Paul confirmed 0.4.0 played real provider media. This visual revision replaces its persistent top banner/stock controller with a bottom classic programme strip that hides after five seconds of active playback. OK reveals it; while visible OK toggles pause/play, and left/right seek. The channel/guide/subtitle legend is visual only for now, as requested. Back still returns to the sample. The stock subtitle/audio menu is not shown in this presentation pass. See docs/classic-programme-strip.md. Logo artwork also loses the CRT's white cabinet outline. The new presentation needs its own TV acceptance check and approval before installation.

Revision 0.4.0 — small-sample playback test

The 20-item connection check succeeded on Paul's Xiaomi box. The next revision makes those sample items playable, retaining the temporary login in memory until the sample screen exits. Select a title, use fullscreen pause/seek/audio/subtitle controls, and Back to return to the sample. Direct streaming is tested first: no automatic video transcoding, full scan or saved credentials. Playback may update normal provider watch history. See docs/emby-playback-test.md for boundaries.

The 0.4.0 APK was installed, and Paul confirmed real media playback. An original gold/charcoal OrbOffice drive-in ticket logo concept is included in design/, separately from the app interface. Brand-name clearance is not established. The Android CLI skill was assessed, not installed.

Revision 0.3.0 — Connect Emby

Menu → Connect Emby opens an on-TV username/password form for the selected provider. Check 20 items performs one sign-in, one metadata-page request and a temporary-session logout. The sample shows titles, media types, durations and available container/codec metadata. No password, token or sample is persisted. Credentials stay out of chat and the APK. The connection screen blocks screenshots and clears transient data when backgrounded. The fixed provider URL is displayed before submission; no real account has been used in tests. This does not yet import a library or play Emby video. See docs/emby-connection-check.md.

The prior 0.2.0 APK was installed and verified on Paul's Xiaomi box. The 0.3.0 build was subsequently installed; Paul confirmed the 20-record sample succeeded. Later profile requirements are recorded in docs/profiles-roadmap.md.

Revision 0.2.0

  • Top navigation is now 1 Menu / 2 TV Guide / 3 Box Office.
  • Menu links to the guide, OrbOffice and Services (including the OrbHive Bedlam roadmap).
  • OrbOffice has two selectable fictional event ticket previews with an original perforated stub design.
  • Barlow and Barlow Condensed are bundled for the new sections; their OFL licences are in licenses/.
  • Existing guide and fullscreen playback-bar styling is preserved.
  • Proper logo work is deferred; Paul wants a centred mark with safe padding in the TV app tile.
  • Reproduce the design previews with design/render-designs.sh (requires FigCraft CLI and Pillow). Fonts are loaded from a project-local XDG data directory, without a system font installation.

The first APK was installed on Paul's Xiaomi box. Paul confirmed navigation, tuning, fullscreen playback and the bottom programme bar worked. Revision 0.2.0 was subsequently installed and verified on the box.

What works in source

  • Offline TV guide with three fictional channels and three half-hour columns.
  • D-pad focus, programme descriptions, OK to tune the current show, Back to the guide.
  • Current programme is determined from fixed UTC slots, not app launch time.
  • Media3 joins the original 30-minute local demo video at the scheduled offset.
  • One player moves between guide preview and fullscreen; playback pauses in background.
  • Box Office is a ticket preview; Services keeps OrbHive Bedlam as an explicit roadmap item.
  • Independent loopback-only TypeScript guide API, with no runtime npm dependencies.
  • Editable FigCraft mockup and VectorCraft wordmark.

The Android app uses its bundled Kotlin schedule. It does not call the TypeScript service yet. The same fictional titles and slot algorithm are duplicated for this proof of concept; replace these with an API contract before adding real channel editing. All channels use the same silent original test signal. This is not an Emby integration. Titles and synopses are fictional. No third-party programme footage is included.

Build

Prerequisites: Java 21; Android platform 36, build-tools 36.0.0 and platform-tools. The inspected SDK is /opt/android-sdk. android/local.properties records that machine-local path and is excluded from version control. Set ANDROID_HOME on another machine and create an appropriate local.properties if needed.

Run ./build-android.sh from the project root. The checked-in wrapper downloads the SHA-256-pinned Gradle 9.3.1 distribution. Google/Maven Central access is needed initially. Build dependencies, debug signing key and Gradle caches stay under .tooling/ when using the script. The build uses AGP 9.1.1 and its built-in Kotlin support, with Compose compiler 2.2.10. APK: android/app/build/outputs/apk/debug/app-debug.apk Tests: android/app/build/test-results/testDebugUnitTest/ Lint: android/app/build/reports/lint-results-debug.html

Backend

Requires Node 24 and npm. This PikaOS Node package lacks native TypeScript support, so compilation uses the pinned TypeScript dev dependency.

cd server
npm ci --ignore-scripts
npm test
npm start

The development server binds only to 127.0.0.1:4317. Stop with Ctrl+C. GET /health; GET /guide; optional ?at=&count=1..48. node smoke-test.mjs starts the service, checks responses and stops it automatically.

Xiaomi hardware testing

The PC was paired with Paul's box; 0.1.0 and 0.2.0 were installed successfully. Ask before installing a new revision. After approving a connection method, use Google's platform-tools to pair/connect as supported by the box, then install the debug APK with adb install -r <apk-path>. The launcher entry is Orbit TV. Pairing prompts and IP/port details come from the device; do not guess them or expose ADB outside your trusted network. The demo runs entirely on-device and needs no PC backend connection.

Acceptance checks on hardware:

  1. Navigate every guide cell using only arrows and OK; check readable focus and text at sofa distance.
  2. Tune each current programme, return with Back, open future programme information.
  3. Open at 18 minutes past a half-hour and confirm Media3 joins around 18 minutes.
  4. Cross a half-hour boundary in fullscreen and guide; ensure guide and video switch together.
  5. Background/resume across a slot boundary; verify the current schedule is rejoined.
  6. Check Box Office and Services return paths. Record Android version and output resolution.

Remaining work

Paul confirmed playback, focus and remote navigation on 0.1.0 and praised the installed 0.2.0 revision. New connection form/keyboard behaviour needs hardware testing. No emulator was installed. No Emby credentials or authenticated library have been accessed by development tools. The provider's public identification API was checked read-only. No VPS administration was performed. No services or firewall were changed. Emby indexing, incremental reconciliation, parental rules, calendar programming blocks, channel editing, theme switching, seasonal events and OrbHive Bedlam are not implemented. Open-source licensing and final branding remain decisions for Paul.

S
Description
No description provided
Readme
246 MiB
Languages
Kotlin 67.1%
Python 25.1%
Java 4.9%
JavaScript 1.9%
Shell 0.5%
Other 0.5%