ryOS ryOS / Docs
GitHub Launch

TV

TV (Ryo TV) is a channel-surfing television app for ryOS. It plays curated YouTube videos as numbered channels with authentic CRT shader effects, procedural CRT sound effects, AI-generated channels, and an MTV music-video channel that displays per-word KRC-timed Geneva CC plate captions.

Overview

TV turns ryOS into a retro television set. Channels are lineups of YouTube videos (drawn from the Videos library or AI-generated on demand) and are numbered like a real TV. Switching channels powers up the simulated CRT — center-beam unfold, scale-coupled glow, scanline noise, and an LCD filter — and switching off cleanly collapses the image like a real tube. A channel-bug logo overlay sits in the corner, with occasional idle bursts (spin / watermark / shimmer with a glossy overlay blend). The window can also go full-screen with controls aligned to Karaoke (dismiss button + CH± pills, viewport-scaled captions).

The app is reachable at the /tv route and has its own OG share card. It is fully localized.

Features

  • Channel surfing: Up/down arrows or CH+ / CH− cycle channels; number keys jump straight to a channel. The current lineup and active channel are exposed to Ryo's chat tools.
  • AI-generated channels: Inline channel-creation prompt with shimmer loading; AI lineups exclude YouTube Shorts both server-side and via a client onDuration filter.
  • MTV music videos: A dedicated MTV channel plays music videos with a single-line lyrics overlay styled as a Geneva CC plate, revealed per word using KRC timings (with a typewriter reveal and synced push transitions).
  • CRT effects: Multi-stage power-on/off animations, a CRT static bed, an LCD filter toggle, and a channel-bug overlay (visible in fullscreen) with idle bursts.
  • CRT sound design: Procedural SFX for power, channel switch, and static; drawer open/close SFX; clean cleanup so noise doesn't bleed across states.
  • Drawer / playlist UI: Side-panel + compact bottom layout, drawer remove control, cached random playlists, playlist-order preservation when removing, square channel-strip buttons, channel-logo tray strip, and a marquee that fades the right edge when paused and overflowing.
  • Cloud sync: Dedicated channel cloud sync; default channels are prepopulated from the exported library (including Taiwan), can be hidden, and the hidden/reset state stays in sync across devices.
  • YouTube paste: Paste a YouTube URL into the drawer to add it to the current channel.
  • Channel-creation auth gate: Creating channels requires login — TV shows a toast and the login dialog if you're signed out.
  • Full-screen parity with Karaoke: Dismiss button, CH± pill controls, viewport-scaled captions, and the CRT static bed/canvas are skipped while fullscreen for performance.
  • Cross-app integration: TV pulls from the Videos library; Ryo's chat exposes a tvControl tool with createChannel fanout and the current channel/custom lineup in system state.

User Guide

Getting Started

Launch TV from the desktop or visit /tv. The window powers on with the current channel; on mobile Safari it opens powered off (autoplay isn't allowed) — tap once to start.

Key Actions

  • Change Channel: Up/Down arrows, CH+ / CH−, or press 16 to jump.
  • Change Video: Left/Right arrows skip within the current channel.
  • Power: Pause to turn the screen off; press play (or use Next/Prev/CH) to power back on.
  • Full Screen: Controls ▸ Full Screen (or via window chrome). Use the on-screen dismiss button or Esc to exit.
  • Create a Channel: Use the inline AI prompt in the drawer (login required).
  • Manage Lineup: Open the drawer to add, remove, or reorder videos; paste a YouTube URL to append.
  • LCD Filter / CC: Toggle the LCD Filter and closed captions from the Controls menu.
  • Reset Channels: Use the reset-channels item to restore defaults; hidden defaults remain hidden across devices.

Tips & Shortcuts

  • Press Esc to exit full-screen quickly; the dismiss button is also available on mobile via the shared FullscreenMobileDismiss portal.
  • Default channels are prepopulated from the exported library — including a Taiwan channel — so a fresh install already has content.
  • The MTV channel uses the song's KRC timings, so captions track the audio per word rather than per line.

Technical Details

Window Configuration

  • The TV window is registered under the tv app id and lives next to Videos in the app catalog.

Component Architecture

The app consists of these components under src/apps/tv/components/:
  • TvAppComponent.tsx — Main app component; wires the player, drawer, CRT effects, and channel state.
  • TvMenuBar.tsx — Menu bar with Controls (Full Screen, LCD Filter, CC, reset channels).
  • TvCrtEffects.tsx — CRT shader, static noise canvas, scanlines, and power-on/off animations.
  • TvChannelBug.tsx — Corner channel-bug logo with shimmer/spin/watermark idle bursts and glossy overlay blend.
  • TvVideoDrawer.tsx — Playlist drawer (side panel + compact bottom layout) with remove, reorder, and YouTube paste.
  • MtvLyricsOverlay.tsx — Single-line Geneva CC plate captions for MTV with per-word KRC reveal.
  • ChannelPromptInput.tsx / CreateChannelDialog.tsx — Inline AI channel-creation prompt and dialog with shimmer loading.

Shared FullscreenMobileDismiss is extracted at src/components/layout/FullscreenMobileDismiss.tsx and reused by Karaoke for fullscreen parity.

Hooks & Utilities

State Management

TV uses local React state for UI (drawer open, fullscreen, dialogs) and the shared useVideoStore / TV-specific Zustand state for channels, lineups, hidden defaults, and cloud sync. The current channel and custom lineup are also surfaced in system state so the chat AI's tvControl tool can read and mutate them.

Related Apps

  • Videos — TV pulls from the Videos library; the Videos app is where the underlying YouTube collection lives.
  • Karaoke — Shares fullscreen patterns (dismiss + CH± pills) and per-word lyric/timing infrastructure with TV's MTV channel.
  • Chats — Hosts the tvControl chat tool that drives channel creation and exposes the current TV state.