Features
What the app actually does, on the machines it ships for:
- Providers. Xtream Codes, M3U / M3U8 playlists, and Stalker / Ministra / MAG portals. Multiple playlists: add, refresh, remove, switch the active one.
- Live TV. Categories, logos, Now / Next EPG on the channel list, fullscreen playback, fast switching, auto-retry, and errors that name the failure (401, timeout, unsupported format).
- Movies and series. Catalog, details, seasons, episodes, next / previous episode, continue watching.
- Library. Home rows, search across live / movies / series, favorites, watch later, watch history.
- Player. Hardware decode on desktop (mpv); native players on iOS and Android. Audio tracks, subtitle appearance (size, font, colour, background, position), aspect ratio, speed, volume, fullscreen.
- Downloads. Offline movies and series on desktop, with a chosen folder, progress, and a notification when a title is ready.
- Parental controls. PIN, lock all live / movies / series, lock categories and titles, optional lock on settings.
- Appearance. Light and dark themes, accent colour, 12 / 24-hour time. UI in English, Arabic, French, German, Spanish, and Turkish.
- Platforms. Windows, macOS, iOS, and Android, with automatic desktop updates.
How it's built
Veyra is a TypeScript monorepo - not a single app folder that grew packages by accident.
@veyra/domain- models and interfaces@veyra/player-PlayerEngine, so the UI never imports ExoPlayer, AVPlayer, or mpv directly@veyra/xtream,@veyra/m3u,@veyra/stalker- provider adapters behind oneIPTVProviderinterface@veyra/storage- SQLite repositories and migrationsapps/mobile- React Nativeapps/desktop- Electron + React + mpv sidecar on Windows/macOS
The interesting contract is simple: the user already has a provider. The app should play it reliably, remember what they watch, and not freeze while it imports fifty thousand channels.
Veyra does not host, sell, or ship television. You bring the provider.
Engineering choices
- Playback before features. Desktop uses mpv with hardware decode. Mobile uses native players behind
PlayerEngine. If a stream dies, the UI should say why - 401, timeout, unsupported format - not shrug. - A catalog, not a playlist view. IPTV libraries are tens of thousands of rows. SQLite is the store. Provider JSON is imported in the background. The database is the source of truth.
- Interfaces wider than the first ship.
IPTVProviderandPlayerEngineknow about VOD and EPG even when a phase only ships part of the surface area. That avoids painting into a second app later. - A player, legally. No bundled playlists. No demo provider with real channels. Veyra does not ship TV.
Stack
TypeScript, React Native, Electron, React, SQLite (better-sqlite3 on desktop, op-sqlite on mobile), TanStack Query, mpv, and generic HTTPS auto-update feeds on license.t4mer.net.
Result
The app plays the provider you already have. Free to download for now. The engineering story above is why it exists.
