A native tvOS app that turns M3U/M3U8 playlists into a traditional TV channel-surfing experience. Built for simplicity — designed so your parents (or anyone who misses the simplicity of cable TV) can just sit down and flip channels.
Modern streaming apps are overwhelming. Multiple menus, profiles, algorithms, and endless scrolling. BoomerTV strips all of that away. Power on your Apple TV, launch the app, and start flipping channels with the Siri Remote — just like the old days.
- Cable TV Feel — Swipe up/down to change channels instantly, just like a remote
- 5-Channel Jump — Swipe left/right to skip 5 channels at a time
- Pre-buffered Channels — Adjacent channels are pre-loaded for near-instant switching
- YouTube TV-Style Overlay — Clean channel info with logo, name, and LIVE badge appears briefly on switch
- Channel Guide — Press Menu to browse channels organized by category
- M3U Playlist Support — Load any M3U/M3U8 playlist URL
- Built-in Sample Channels — 15 free live channels included for immediate use
- Background Audio — Audio continues during brief app interruptions
BoomerTV/
├── BoomerTVApp.swift # App entry point + audio session config
├── ContentView.swift # Main TV view + Siri Remote input handling
├── Models/
│ └── ChannelModel.swift # Channel, PlayerState, PlaylistConfig models
├── Views/
│ ├── VideoPlayerView.swift # AVPlayerViewController wrapper
│ ├── ChannelOverlayView.swift # Channel overlay + persistent logo bug
│ ├── ChannelGuideView.swift # Category-grouped channel guide
│ └── SettingsView.swift # Playlist URL configuration
├── ViewModels/
│ └── ChannelPlayerViewModel.swift # State orchestrator (@MainActor)
└── Services/
├── M3UParser.swift # M3U/M3U8 playlist parser
└── PlayerService.swift # 3-player AVPlayer pool manager
PlayerService maintains a pool of 3 AVPlayer instances — previous, current, and next. When you switch channels, the adjacent player is promoted to current and starts playing immediately while a new player is created for the newly adjacent channel. This makes channel switching feel instant.
automaticallyWaitsToMinimizeStallingis disabled for fast startup- Forward buffer is kept small (2 seconds for current channel) to reduce initial load time
- Adjacent channels use capped bitrates to save bandwidth
- Stale stream detection auto-recovers frozen channels after 15 seconds
| Action | Control |
|---|---|
| Channel Up | Swipe Up / D-pad Up |
| Channel Down | Swipe Down / D-pad Down |
| Jump +5 Channels | Swipe Right / D-pad Right |
| Jump -5 Channels | Swipe Left / D-pad Left |
| Show Channel Info | Press Select (click) |
| Open Channel Guide | Press Menu |
| Close Guide | Press Menu again |
| Open Settings | Long-press Menu |
| Play / Pause | Press Play/Pause |
- tvOS 17.0+
- Xcode 15.0+
- Swift 5.9+
- Apple TV 4K (recommended) or Apple TV HD
- Open
BoomerTV.xcodeprojin Xcode - Select your Apple TV (simulator or physical device) as the build target
- Set your Development Team in Signing & Capabilities
- Press Cmd+R to build and run
For physical Apple TV deployment, ensure your Mac and Apple TV are on the same network.
By default, BoomerTV loads 15 sample free live channels. To use your own M3U playlist:
- Long-press Menu on the Siri Remote to open Settings
- Enter your M3U/M3U8 playlist URL
- Tap Load Playlist
Standard M3U/M3U8 playlists are supported:
#EXTM3U
#EXTINF:-1 tvg-name="Channel Name" tvg-logo="https://logo.url/logo.png" group-title="News",Channel Name
https://stream.url/live.m3u8
Supported attributes: tvg-name, tvg-logo, group-title
- Sample channels: Edit
M3UParser.swift→samplePlaylistContent - Buffer duration: Adjust
preferredForwardBufferDurationinPlayerService.swift - Overlay duration: Adjust
showOverlayBriefly(duration:)inChannelPlayerViewModel.swift(default: 4 seconds)
MIT