{"id":49855818,"url":"https://github.com/gabrielmaialva33/streamix-tv","last_synced_at":"2026-06-11T01:01:33.906Z","repository":{"id":351590968,"uuid":"1211653450","full_name":"gabrielmaialva33/streamix-tv","owner":"gabrielmaialva33","description":"📺 Smart TV streaming app built with Lightning 3 + SolidJS for Tizen, webOS, Android TV and Fire TV. Personalized rails, semantic search and native IME.","archived":false,"fork":false,"pushed_at":"2026-05-14T18:50:38.000Z","size":5070,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-14T20:42:15.034Z","etag":null,"topics":["android-tv","fire-tv","iptv","lightningjs","samsung-tv","smart-tv","solidjs","streaming","ten-foot-ui","tizen","typescript","vite","webgl","webos"],"latest_commit_sha":null,"homepage":"https://streamix.mahina.cloud","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabrielmaialva33.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-04-15T15:58:26.000Z","updated_at":"2026-05-14T18:50:44.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gabrielmaialva33/streamix-tv","commit_stats":null,"previous_names":["gabrielmaialva33/streamix-tv"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/gabrielmaialva33/streamix-tv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fstreamix-tv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fstreamix-tv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fstreamix-tv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fstreamix-tv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrielmaialva33","download_url":"https://codeload.github.com/gabrielmaialva33/streamix-tv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fstreamix-tv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34177444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-tv","fire-tv","iptv","lightningjs","samsung-tv","smart-tv","solidjs","streaming","ten-foot-ui","tizen","typescript","vite","webgl","webos"],"created_at":"2026-05-14T20:00:59.503Z","updated_at":"2026-06-11T01:01:33.798Z","avatar_url":"https://github.com/gabrielmaialva33.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003cimg src=\".github/assets/streamix-icon.svg\" alt=\"Streamix TV\" width=\"200\"\u003e\n  \u003cbr\u003e\n  Streamix TV\n  \u003cbr\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eA cinematic 10-foot streaming client built with LightningJS + SolidJS, targeting Samsung Tizen, LG webOS, Android TV, and Fire TV. The TV companion to the Streamix platform.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/LightningJS-3.0+-ff3c7e?style=flat\" alt=\"LightningJS\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/SolidJS-1.9+-2c4f7c?style=flat\u0026logo=solid\" alt=\"SolidJS\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-6-3178c6?style=flat\u0026logo=typescript\" alt=\"TypeScript\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Vite-8-646cff?style=flat\u0026logo=vite\" alt=\"Vite\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Tizen-Samsung-1428a0?style=flat\u0026logo=samsung\" alt=\"Tizen\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/webOS-LG-a50034?style=flat\u0026logo=lg\" alt=\"webOS\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/AndroidTV-3ddc84?style=flat\u0026logo=androidtv\" alt=\"Android TV\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/FireTV-ff9900?style=flat\u0026logo=amazon\" alt=\"Fire TV\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/hls.js-1.6+-d32f2f?style=flat\" alt=\"hls.js\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/License-MIT-16a34a?style=flat\" alt=\"License\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/assets/demo.png\" alt=\"Streamix TV — Home screen on a Samsung smart TV\" width=\"900\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#sparkles-highlights\"\u003eHighlights\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#art-architecture\"\u003eArchitecture\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#tv-runtime-surfaces\"\u003eRuntime Surfaces\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#computer-stack\"\u003eStack\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#package-quick-start\"\u003eQuick Start\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#memo-project-notes\"\u003eProject Notes\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003e [!NOTE]\n\u003e This repository contains only the Smart TV client. The Phoenix + LiveView backend, APIs, and web surface live in the\n\u003e [Streamix](https://github.com/gabrielmaialva33/streamix) repository.\n\n## :sparkles: Highlights\n\n### Native-feel TV Experience\n\n- **10-foot UI** optimized for D-pad and remote navigation\n- **WebGL rendering** via LightningJS for 60fps animations on low-power TV SoCs\n- **Hero carousel, row-based browsing**, and cinematic focus transitions\n- **Fast channel switching** with pre-buffered HLS streams\n- **Exit dialog, skeleton loaders**, and scroll indicators tuned for TV ergonomics\n- **MSDF fonts** (NotoSans with full PT-BR diacritics coverage) for crisp type on any screen\n\n### Streamix-Connected\n\n- **Auth** with session persistence in TV-local storage\n- **Live TV, movies, and series** browsing with remote catalog paging\n- **Favorites and watch history** synced with the backend, optimistic UI with rollback\n- **Continue watching row** with server-side progress tracking\n- **EPG now / next** for live channels\n- **Semantic search** when the backend has Qdrant + Gemini configured\n- **Playback telemetry** for bitrate, position, and error tracking\n\n### Cross-Device Builds\n\n- **Samsung Tizen** (`.wgt` packaging with certificate signing + `sdb` deploy)\n- **LG webOS** (`.ipk` packaging through the webOS TV CLI)\n- **Android TV and Fire TV** through a Capacitor Android shell fed by the Fire TV Vite target\n- **Device config plugin** that swaps polyfills and feature flags per target\n- **Log server** over WebSocket for live debugging on TV hardware\n\n## :fire: Why Streamix TV Feels Different\n\nStreamix TV is not a wrapped web app running in a TV browser. It renders through WebGL with LightningJS, which means the\nUI is a scene graph of textures rather than a DOM tree. Focus traversal, animations, and list virtualization are all\nbuilt for the constraints of TV hardware (limited GPU, slow CPU, remote latency).\n\nThe app is opinionated about what makes a good TV experience: no hover, no scroll, no hidden menus. Everything is\nfocus-driven, everything has a visible selection state, and every screen answers the \"what can I press next\" question\nwithout guessing.\n\n## :art: Architecture\n\n### High-Level View\n\n```mermaid\ngraph TD\n    R[Remote Control]\n\n    subgraph TVApp[\"Streamix TV (LightningJS + SolidJS)\"]\n        AS[AppShell]\n        ML[MainLayout + Sidebar]\n        RT[Router]\n        FM[Focus Manager]\n        PL[Player + hls.js]\n        API[API Client]\n        STG[Storage / Session]\n    end\n\n    subgraph Pages[\"Pages\"]\n        HM[Home / Hero]\n        MV[Movies]\n        SR[Series]\n        CH[Channels]\n        GD[Guide / EPG]\n        FV[Favorites]\n        SC[Search]\n        DT[Movie / Series Detail]\n    end\n\n    subgraph Platform[\"Platform Layer\"]\n        TZ[Tizen Device Config]\n        LG[webOS Device Config]\n        WEB[Web / Dev]\n    end\n\n    subgraph Backend[\"Streamix Backend\"]\n        AUTH[Auth API]\n        CAT[Catalog API]\n        HST[History + Favorites]\n        EPG[EPG API]\n        TEL[Telemetry API]\n        STR[Signed Stream URLs]\n    end\n\n    R --\u003e FM\n    FM --\u003e AS\n    AS --\u003e ML\n    ML --\u003e RT\n    RT --\u003e Pages\n    Pages --\u003e API\n    Pages --\u003e PL\n    API --\u003e AUTH\n    API --\u003e CAT\n    API --\u003e HST\n    API --\u003e EPG\n    API --\u003e TEL\n    PL --\u003e STR\n    STG --\u003e API\n    AS --\u003e Platform\n```\n\n### Playback Flow\n\n```mermaid\nsequenceDiagram\n    participant User as User + Remote\n    participant UI as Page / Detail\n    participant API as API Client\n    participant Token as Backend StreamToken\n    participant HLS as hls.js / Native\n    participant TV as TV Video Pipeline\n\n    User-\u003e\u003eUI: Press OK on title\n    UI-\u003e\u003eAPI: Request signed stream URL\n    API-\u003e\u003eToken: POST /catalog/.../stream\n    Token--\u003e\u003eAPI: Signed HLS URL\n    API--\u003e\u003eUI: Playable URL\n    UI-\u003e\u003eHLS: Attach source\n    HLS-\u003e\u003eTV: Feed segments\n    TV--\u003e\u003eUser: Picture\n    UI-\u003e\u003eAPI: Post playback telemetry (progress, bitrate)\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eCore modules worth knowing\u003c/strong\u003e\u003c/summary\u003e\n\n| Area             | Main modules                                                       |\n| ---------------- | ------------------------------------------------------------------ |\n| App shell        | `src/app/AppShell.tsx`, `src/app/bootstrap.tsx`, `routes.tsx`      |\n| Layout + nav     | `src/app/MainLayout.tsx`, `src/components/Sidebar.tsx`             |\n| Pages            | `src/pages/Home.tsx`, `Movies.tsx`, `Series.tsx`, `Guide.tsx`, ... |\n| UI primitives    | `src/components/Card.tsx`, `Hero.tsx`, `Row.tsx`, `ExitDialog.tsx` |\n| Player           | `src/features/player/` (hls.js integration, telemetry)             |\n| Auth             | `src/features/auth/LoginPage.tsx`, `RequireAuth.tsx`               |\n| API client       | `src/lib/api.ts`, `src/lib/storage.ts`                             |\n| Device targeting | `devices/tizen/`, `devices/lg/`, `devices/common/`                 |\n| Fonts            | `src/fonts.ts` (NotoSans MSDF)                                     |\n\n\u003c/details\u003e\n\n## :tv: Runtime Surfaces\n\n### Pages\n\n- `/` home with hero + continue watching + curated rows\n- `/login` session + register\n- `/movies`, `/series`, `/channels`\n- `/movies/:id`, `/series/:id` detail with cast, seasons, episodes\n- `/guide` EPG now / next for live channels\n- `/favorites`\n- `/search` with semantic + fulltext\n- `/player/:type/:id` full-screen playback\n\n### Focus Model\n\n- Sidebar is the root focus column; pages mount a `MainLayout` that forwards focus to their first row\n- Rows implement horizontal D-pad traversal; columns implement vertical\n- `ExitDialog` captures the back key on the home screen instead of closing the app blindly\n\n## :computer: Stack\n\n### Runtime\n\n| Technology             | Version   | Role                                              |\n| ---------------------- | --------- | ------------------------------------------------- |\n| LightningJS Renderer   | `^3.0.1`  | WebGL scene graph and rendering                   |\n| @lightningtv/solid     | `^3.1.18` | SolidJS bindings for Lightning                    |\n| SolidJS                | `^1.9.12` | Reactive UI primitives                            |\n| @solidjs/router        | `^0.16.1` | Client-side routing                               |\n| hls.js                 | `^1.6.16` | Adaptive streaming in browsers without native HLS |\n| @solid-primitives/i18n | `^2.2.1`  | Internationalization                              |\n\n### Tooling\n\n| Technology        | Role                                         |\n| ----------------- | -------------------------------------------- |\n| Vite 8            | Dev server, build, legacy target for old TVs |\n| TypeScript 6      | Types across app, components, API            |\n| ESLint + Prettier | Lint + format                                |\n| Vitest            | Unit + browser tests via Playwright          |\n| Storybook         | Isolated component development               |\n\n### Target Platforms\n\n| Platform      | Status    | Notes                                                     |\n| ------------- | --------- | --------------------------------------------------------- |\n| Samsung Tizen | supported | `.wgt` packaging, `sdb` install, certificate `StreamixTV` |\n| LG webOS      | supported | `TARGET_DEVICE=lg` build, `appinfo.json`, `.ipk` package  |\n| Android TV    | supported | Capacitor Android shell, Chromium WebView                 |\n| Fire TV       | supported | Fire TV Vite target copied into the Android shell         |\n| Browser       | dev only  | Used for iteration via `pnpm start`                       |\n\n## :package: Quick Start\n\n### Prerequisites\n\n- Node.js 20+\n- pnpm 9+\n- A running Streamix backend (see [Streamix repo](https://github.com/gabrielmaialva33/streamix))\n- For Tizen: Tizen Studio CLI + certificate profile `StreamixTV`\n- For webOS: webOS TV CLI (`ares-package`, `ares-install`) when packaging or deploying\n- For Fire TV / Android TV: Android SDK, Java 21, Capacitor CLI, and `adb`\n\n### 1. Install\n\n```bash\npnpm install\n```\n\n### 2. Configure environment\n\nCreate an `.env` based on `environments/` defaults. Typical values:\n\n```dotenv\nVITE_API_URL=https://your-streamix-host/api/v1\nVITE_API_KEY=your-streamix-api-key\n```\n\n### 3. Run in the browser\n\n```bash\npnpm start\n```\n\nOpens on [http://localhost:5173](http://localhost:5173) with hot reload. Arrow keys + Enter behave like a remote.\n\n### 4. Build and package targets\n\n```bash\npnpm build:tizen      # dist/tizen/ + Tizen config.xml\npnpm build:webos      # dist/lg/ + webOS appinfo.json\npnpm build:firetv     # dist/firetv/ for Capacitor Android\n\npnpm tizen:package    # creates a .wgt from dist/tizen/\npnpm webos:package    # creates an .ipk from dist/lg/\npnpm firetv:apk       # syncs dist/firetv/ into android/ and builds debug APK\n```\n\nTarget orchestration lives in `scripts/platform.mjs`. Platform manifests live under `platforms/` and are copied into the\nmatching `dist/` folder after Vite builds, so Tizen/webOS metadata does not leak into generic web or Android packages.\nFor Tizen, packaging follows the Samsung TV CLI flow: Vite build -\u003e copy `config.xml` -\u003e `tizen build-web` -\u003e\n`tizen package` from `.buildResult`.\n\n### 5. Deploy to Tizen (TV or emulator)\n\n```bash\n# Physical TV. Override TIZEN_DEVICE_IP or TIZEN_TARGET when needed.\npnpm tizen:deploy\n\n# Samsung emulator\npnpm tizen:deploy:emu\n```\n\nThat pipeline runs `build:tizen` -\u003e `tizen:package` -\u003e `tizen:install` -\u003e `tizen:run`.\n\n### 6. Live device logs\n\n```bash\n# Tizen device logs. Set TIZEN_DEVICE_IP or TIZEN_TARGET when needed.\npnpm tizen:logs\n\n# Restart the app in Tizen Web Inspector mode and open DevTools.\npnpm tizen:debug\n\n# WebSocket log relay from the TV into your terminal\npnpm logs\n```\n\nUseful Tizen debug variables:\n\n```bash\nTIZEN_DEVICE_IP=192.168.1.6 pnpm tizen:debug\nTIZEN_TARGET=emulator-26101 pnpm tizen:logs\nTIZEN_APP_ID=EI8qhrd7xh.streamix pnpm tizen:inspect:restart\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eDevice build matrix\u003c/strong\u003e\u003c/summary\u003e\n\n| Command             | Target               | Output         | Package source                     |\n| ------------------- | -------------------- | -------------- | ---------------------------------- |\n| `pnpm build`        | generic web          | `dist/`        | none                               |\n| `pnpm build:tizen`  | Samsung Tizen        | `dist/tizen/`  | `platforms/tizen/config.xml`       |\n| `pnpm build:webos`  | LG webOS             | `dist/lg/`     | `platforms/webos/appinfo.json`     |\n| `pnpm build:firetv` | Fire TV / Android TV | `dist/firetv/` | `capacitor.config.ts` + `android/` |\n\n\u003c/details\u003e\n\n## :wrench: Developer Commands\n\n```bash\npnpm start              # dev server, browser\npnpm start:tizen        # dev server with Tizen polyfills\npnpm platform -- build tizen\npnpm platform -- build webos\npnpm platform -- build firetv\npnpm test               # vitest\npnpm tsc                # type-check only\npnpm lint               # eslint\npnpm lint-fix           # eslint --fix\npnpm format             # prettier --write\npnpm storybook          # component workbench\npnpm build:analyze      # bundle visualizer\n\npnpm tizen:install      # install last .wgt\npnpm tizen:run          # launch app on TV\npnpm tizen:debug        # restart app in Web Inspector mode\npnpm tizen:logs         # stream Tizen dlog filters\npnpm tizen:kill         # kill app on TV\npnpm tizen:uninstall    # remove app from TV\npnpm webos:package      # package dist/lg/ with ares-package\npnpm firetv:apk         # build Android debug APK from dist/firetv/\n```\n\n## :memo: Project Notes\n\n- The app is pinned to `@lightningtv/solid@3.1.18` because 3.2.x calls `animateProp`, which the pinned renderer `3.0.x`\n  does not expose. Do not bump solid bindings without also bumping the renderer.\n- MSDF fonts are required; the Tizen 4 Chromium (M56) cannot `fetch` `file://` URLs, so the font config uses relative\n  URLs and registers NotoSans with explicit style/stretch descriptors.\n- All code and comments are English-only; pt-BR is reserved for chat and commit messages.\n- The signed stream URL returned by the backend requires `X-API-Key` on the final request; the player must inject it.\n- Focus flow follows the `solid-demo-app` pattern: `App` → `MainLayout` → pages with a `forwardFocus` callback.\n\n## :handshake: Contributing, License\n\n- [AGENTS.md](AGENTS.md)\n- [LICENSE](LICENSE)\n- [NOTICE](NOTICE)\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://avatars.githubusercontent.com/u/26732067\" alt=\"Gabriel Maia\" width=\"92\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  Crafted by \u003cstrong\u003eGabriel Maia\u003c/strong\u003e\u003cbr\u003e\n  \u003ca href=\"mailto:gabrielmaialva33@gmail.com\"\u003egabrielmaialva33@gmail.com\u003c/a\u003e ·\n  \u003ca href=\"https://github.com/gabrielmaialva33\"\u003eGitHub\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmaialva33%2Fstreamix-tv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrielmaialva33%2Fstreamix-tv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmaialva33%2Fstreamix-tv/lists"}