Discord Rich Presence, Android TV ADB telemetry, desktop client support, Smart Skip, and premium artwork for Stremio & Wako
Ascend Media RPC connects Android TV playback over built-in ADB tooling, plus supported desktop clients, to Discord Rich Presence.
Show what you are watching from Stremio or Wako directly on Discord with live titles, artwork, playback progress, timestamps, custom branding, Smart Skip status, and a real-time local telemetry dashboard.
| Main Dashboard | Device Connections | Global Settings |
|---|---|---|
![]() |
![]() |
![]() |
| Playback History | Live Analytics | Trakt Integration |
|---|---|---|
![]() |
![]() |
![]() |
[!TIP] The dashboard is fully responsive and can be accessed from any device on your network to control your RPC in real-time.
- What Is Ascend Media RPC?
- Dashboard Showcase
- Discord Community
- What Does RPC Mean?
- Core Features
- How It Works
- Artwork Examples
- Animated Network Icons with Nuvio
- Requirements
- Quick Start
- Installation
- What run.bat Does
- CLI and Headless Mode
- Best Discord Visuals with Vencord
- Docker Deployment
- Remote Setup (Tailscale)
- Android TV Setup
- Connection Methods
- Configuration
- Example config.json
- API Keys and Providers
- API Integrations
- Using with Stremio
- Using with Wako
- Dashboard
- Smart Skip Pipeline
- Skipit Setup Guide
- Analytics
- Plugin System
- Privacy and Security
- Customization
- Troubleshooting
- API Reference
- Built With
- Credits
- Disclaimer
- Support
Ascend Media RPC can update normal Discord Rich Presence on the standard Discord desktop app, but the richest and cleanest activity layout is designed for the bundled Ascend Vencord/Equicord build.
Use this when you want the activity to look its best:
- Correct Stremio/Wako activity naming instead of generic app labels
- Cleaner pause/play state display
- Better visual formatting for details, state, and timestamps
- Support for Discord Stable, PTB, Canary, Development, or a custom Discord install folder
- Easy custom plugin management through
plugins.txtandlocal_plugins
- Install Git and Node.js LTS if you do not already have them.
- Open the bundled installer:
vencord_installer\run.bat- Click Check Requirements.
- If pnpm is missing, click Install / Repair pnpm.
- Select the Discord client you use: Stable, PTB, Canary, Development, or a custom folder.
- Click Build + Inject.
- Restart Discord with
Ctrl+Rafter the installer finishes.
After Discord restarts:
- Open Discord User Settings.
- Open Vencord/Equicord Plugins.
- Search for
BetterStremioActivity. - Enable it.
- Make sure Discord Activity Sharing / Display current activity as a status message is enabled.
Important
Ascend Media RPC will still work without this plugin, but the RPC may not look correct. For the intended rich layout, install the bundled Vencord/Equicord build and enable BetterStremioActivity.
The installer supports custom plugins without editing the Python GUI:
- Add Git plugin URLs to
vencord_installer\plugins.txt, one URL per line. - Put local plugin folders in
vencord_installer\local_plugins\. - Rerun
vencord_installer\run.bat, then click Build + Inject again.
The bundled BetterStremioActivity plugin is always copied from:
vencord_installer\bundled_plugins\betterStremioActivityAscend Media RPC is a local application that bridges Android TV ADB playback telemetry and supported desktop clients with Discord Rich Presence.
When you play something in Stremio or Wako on Android TV, or a supported local desktop client, Ascend Media RPC detects the playback activity, enriches it with metadata and artwork, and updates your Discord status in real time.
It can display:
- Movie, show, season, and episode information
- Playback state
- Elapsed or remaining time
- Posters, backdrops, season art, and episode thumbnails
- Custom Discord branding text
- Small playback, app, network, or device icons
- Smart Skip status with 8 skip providers
- Real-time telemetry in a local browser dashboard
- Watch history and analytics
- Integration status for 9+ connected services
Ascend Media RPC runs on Windows natively, and on Linux or any platform via Docker or headless mode.
Need help, want updates, or want to hang out around the broader Cxsmo-ai projects?
Main site:
https://DeepAscension.netSupport site:
https://throne.com/cxsmoJoin the Discord for project support, release updates, setup help, and community discussion:
https://discord.gg/njSKPUQtFaIn this project, RPC means:
Rich Presence ClientA Rich Presence Client connects to Discord and updates your profile activity with live, detailed information.
Instead of Discord only showing that you are online, Ascend Media RPC can show what you are currently watching.
Example Discord status:
Watching Interstellar
1h 12m remaining
on StremioFlow:
Stremio / Wako
|
Ascend Media RPC
|
Discord Rich PresenceOfficial Discord Rich Presence documentation:
https://docs.discord.com/developers/platform/rich-presence- Built-in ADB tooling β no manual ADB installation required
- Auto IP scanning and mDNS/Zeroconf device discovery
- Dashboard-based device scanner with manual IP fallback
- Android TV, Google TV, NVIDIA Shield, and Chromecast with Google TV support
- Stremio and Wako playback detection
- Playback state and progress tracking
- Device reconnect support
- Multi-device management
- ADB command deduplication and retry logic
- First-time debugging permission support
- Supported local desktop clients can feed playback state without an Android TV
- Stremio desktop/enhanced detection for local playback workflows
- Desktop mode can run alongside Android TV ADB mode, so users can choose the source that fits their setup
- Live Discord activity updates for movies and TV shows
- Season and episode display
- Custom branding text
- Elapsed or remaining time display
- Poster, backdrop, season, and episode thumbnail artwork
- Best visual layout with the Ascend Vencord/Equicord build and bundled BetterStremioActivity plugin
- Small icon modes: playback state, app, network, device, animated Nuvio GIFs
- Status message cycling with configurable interval
- Dynamic button URLs
- Multi-activity support
- Privacy mode (hides what you are watching)
- RPC history logging
- Profanity filter
- Multi-Discord account support
Important
Ascend Media RPC can send normal Discord Rich Presence, but the activity is designed to look correct with the Ascend Vencord/Equicord build. Use the bundled installer in vencord_installer\run.bat and enable BetterStremioActivity for the intended Stremio/Wako activity naming, pause state, and rich visual layout.
Ascend Media RPC includes a local web dashboard with 7 tabs for monitoring and control.
Default URL:
http://localhost:5466Dashboard tabs:
| Tab | Description |
|---|---|
| Dashboard | Connection status, playback info, artwork preview, live log, skip HUD |
| Connections | API keys, skip sources with priority reordering, pipeline sandbox, 9 integration cards |
| Settings | Appearance, RPC customization, privacy, config management, device management, setup wizard |
| History | Watch history and session log |
| Analytics | Watch stats, top genres, peak hours heatmap, streaks, search |
| Debug | Audit log viewer, skip cache stats, system health, plugins |
| Trakt | Trakt OAuth login and scrobbling status |
Dashboard features:
- Toast notification system (replaces alert dialogs)
- Sidebar navigation with icon tooltips
- Config export and import (JSON)
- Multi-step onboarding wizard (6 steps: Welcome, ADB, Discord, TMDB, Artwork, Skip)
- Dark/light/OLED theme toggle with custom accent colors
- Optional PIN-based authentication
- Optional HTTPS support
- Live SSE event stream with real-time UI updates
- Browser push notifications
- Glassmorphism UI with gradient accents and staggered animations
Multi-source artwork system for Discord and dashboard visuals.
Supported artwork types:
- Movie and TV show posters
- Season posters and episode thumbnails
- Backdrops and logos
- Rating badges and provider-enhanced posters
Artwork providers:
- EasyRatingsDB β rating overlays, generated posters
- Top Posters β modern streaming-style posters
- TMDB β fallback artwork
- FanArt.tv β high-quality fan-made artwork (posters, backgrounds, logos)
- Nuvio β animated network GIF icons
Configurable fallback chain with drag-and-drop reordering in the dashboard:
"artwork_fallback_chain": ["tmdb", "fanart", "tvdb"]9-provider skip segment pipeline with priority ordering, category-aware conflict resolution, and TTL caching.
Supported skip providers:
| # | Provider | Description |
|---|---|---|
| 1 | IntroDB.app | Intro and outro timestamps |
| 2 | TheIntroDB.org (TIDB) | Intro, recap, credits, preview, filler segments |
| 3 | Remote JSON | Custom skip database from a remote URL |
| 4 | VideoSkip.org | Mature content filters (sex, violence, profanity) |
| 5 | NotScare.me (Major) | Major jump scare timestamps |
| 6 | NotScare.me (Minor) | Minor jump scare timestamps |
| 7 | AniSkip | Anime opening and ending skip segments |
| 8 | SkipMe.db | Community skip database |
| 9 | Skipit (getskipit.com) | Premium community-driven skip database with auto-refreshing authentication |
Features:
- Individual enable/disable toggles per provider
- Drag-to-reorder priority in the dashboard
- Cloudflare bypass via cloudscraper for TIDB and NotScare
- Category-aware conflict resolution
- TTL-based skip segment cache (thread-safe)
- Pipeline Sandbox in dashboard for testing
Skip Me (Skipit) requires specific authentication tokens that must be retrieved from your browser while logged in to their website.
- Login: Go to getskipit.com and log in to your account.
- Open DevTools: Press
F12(orCtrl+Shift+I) to open your browser's Developer Tools. - Find the Frontend API:
- Go to the Network tab.
- Refresh the page.
- Look for a request starting with
clerk.(e.g.,clerk.getskipit.com). - The domain you see here is your
skipit_frontend_api.
- Find the Tokens:
- Go to the Application tab (Chrome/Edge) or Storage tab (Firefox).
- In the sidebar, look under Cookies ->
https://getskipit.com. - Copy the value of the
__client_uatcookie. This is yourskipit_token. - Copy the value of the
__sessioncookie. This is yourskipit_session_cookie.
- Find the Session ID:
- Go back to the Network tab in DevTools.
- Look for any request to the clerk API (e.g.
clerk.getskipit.com/v1/client). - In the Response (JSON), look for the
"last_active_session_id"field. - This string (starting with
sess_) is yourskipit_session_id.
Enter these 4 values into the Ascend RPC Dashboard or config.json to enable high-priority community skips!
Jump scare detection for horror content via notscare.me.
- Major and Minor severity levels
- Episode slicing from full season pages
- Cloudflare bypass via cloudscraper
- Dashboard HUD alerts
All manageable from the dashboard Connections tab. Integrations auto-scrobble and sync during active playback β toggling an integration ON actually calls its API methods in the main playback loop.
| Integration | Description |
|---|---|
| AniList | Track anime progress and sync watchlist |
| Simkl | Sync watch history across platforms |
| Kitsu | Connect to the Kitsu anime community |
| Letterboxd | Log movies to your diary as you watch |
| Last.fm | Scrobble soundtrack info |
| JustWatch | Find where content is streaming |
| OpenSubtitles | Find and fetch subtitles |
| Plex / Jellyfin / Emby | Media server connections |
| Notion / Obsidian | Watch journals and note logging |
Extended Trakt features beyond basic scrobbling:
- Collection Sync β auto-add watched content to your Trakt collection
- Friends Watching β see what your Trakt friends are watching right now
- Calendar β upcoming episodes from your watchlist
- Check-In β auto check-in to Trakt when watching
- Recommendations β get personalized recommendations
- Ratings β rate content during or after watching
- Stats β view your Trakt watch statistics
Local SQLite-backed watch analytics:
- Total watch time, session counts, average session duration
- Top genres breakdown
- Peak watch hours (24-hour heatmap)
- Watch streak tracking
- Total skips count
- Session search
- Auto-migration from legacy JSON format
- Skip provider analytics β per-provider success rates and hit counts
- Skip category breakdown β stats per category (intro, outro, recap, etc.)
- Weekly reports β aggregated watch statistics for the past 7 days
- Monthly reports β aggregated watch statistics for the past 30 days
- Shareable stats cards β generate PNG images of your watch statistics (Spotify Wrapped style)
- Watch history filter β filter by status (all, completed, in progress, abandoned)
- Per-show grouping β group watch history entries by show title
| Module | Description |
|---|---|
| audit_log.py | Config change and auth event logging with sensitive key masking |
| skip_cache.py | Thread-safe TTL cache for skip segments |
| rpc_history.py | RPC activity history with SQLite storage |
| api_validator.py | API key validation against provider endpoints |
| config_watcher.py | File system watcher for config hot-reload |
| plugin_system.py | Abstract base classes and registry for extending functionality |
| stats_card_generator.py | Shareable PNG stats card generation (requires Pillow, optional) |
| integrations/fanart.py | FanArt.tv high-quality artwork client |
Android TV / Google TV
|
Stremio or Wako playback
|
Ascend Media RPC built-in ADB tooling
|
Playback and app telemetry
|
Metadata, artwork, ratings, and skip providers
|
Discord Rich Presence + Dashboard + Analytics + IntegrationsAscend Media RPC runs locally on your PC and communicates with your Android TV over your local network using built-in ADB tooling. You do not need to manually install ADB or run ADB commands.
Ascend Media RPC can:
- Scan your local network for Android TV devices (IP scan + mDNS/Zeroconf)
- Connect automatically using Auto IP mode
- Detect Stremio or Wako playback
- Fetch metadata and artwork from supported providers
- Fetch skip segments from 8 providers simultaneously
- Update Discord Rich Presence
- Display live telemetry in the local dashboard
- Log watch history and analytics
- Sync with connected integrations (Trakt, AniList, Last.fm, etc.)
Ascend Media RPC can use premium artwork providers to create cleaner, richer visuals for Discord Rich Presence and the local dashboard.
| EasyRatingsDB Example | Top Posters Example |
|
|
Ascend Media RPC can use Nuvio community GIF covers as animated Discord small icons for streaming networks (Netflix, Paramount+, Prime Video, Hulu, Disney+, HBO Max, etc.).
Demo animated WebP:
Links:
https://nuvioapp.space/
https://nuvioapp.space/covers?format=gif&sort=popularSetup:
- Sign up or sign in at Nuvio.
- Open the Ascend Media RPC dashboard.
- Set the small icon mode to the Nuvio network GIF option.
- Enable Nuvio Network GIFs.
- Enter your Nuvio email and password.
- Save settings.
Notes:
- 401 in the log means the Nuvio login failed or expired.
- If no animated GIF is found, Ascend Media RPC falls back to a static network logo.
- wsrv.nl is used for static PNG resizing only. Animated GIFs are handled without wsrv.nl.
- Windows PC, Linux machine, or Docker environment
- Discord desktop app installed and running (for RPC features)
- Android TV, Google TV, NVIDIA Shield, Chromecast with Google TV, or another Android-based streaming device
- Stremio or Wako installed on the Android TV, or a supported desktop client on the host machine
- PC and Android TV on the same local network
- Developer Options and ADB/Network/Wireless Debugging enabled on the Android TV
- Python 3.x (if running without Docker)
- Optional API keys for artwork, metadata, ratings, and skip features
You do not need to manually install ADB. Ascend Media RPC includes its own ADB tooling.
- Download or clone this repository.
- Install dependencies:
pip install -r requirements.txt- Enable Developer Options on your Android TV.
- Enable ADB, Network Debugging, or Wireless Debugging.
- Open config.json and configure your settings.
- Run the app:
Windows:
run.bat
Any platform (headless):
python start_gui.py --headlessDocker:
docker compose up -d- Open the dashboard:
http://localhost:5466
- Connect to your Android TV and start playback.
- Click Code then Download ZIP
- Extract the ZIP
- Install dependencies:
pip install -r requirements.txt- Edit config.json
- Double-click run.bat
git clone https://github.com/Cxsmo-ai/Ascend-Media-RPC.git
cd Ascend-Media-RPC
pip install -r requirements.txtEdit config.json, then run run.bat or python start_gui.py --headless.
See the Docker section below.
run.bat is the main launcher for Ascend Media RPC on Windows. It prepares the local environment, installs dependencies, starts the controller, connects to your Android TV via built-in ADB tooling, starts Discord Rich Presence updates, and serves the local dashboard.
Ascend Media RPC supports CLI arguments and a headless mode for running without a GUI.
python start_gui.py [options]| Flag | Description | Example |
|---|---|---|
| --headless | Run without GUI (Flask API only) | python start_gui.py --headless |
| --config PATH | Use a custom config file | python start_gui.py --config /path/to/config.json |
| --port PORT | Override dashboard port | python start_gui.py --port 8080 |
| --host HOST | Override ADB host address | python start_gui.py --host 192.168.1.50 |
Headless mode is useful for Linux servers, Docker containers, and environments without a display.
Environment variables also work:
HEADLESS=1 python start_gui.pyAscend Media RPC includes Docker support for containerized deployment. Published images are available at:
ghcr.io/cxsmo-ai/ascend-media-rpc:latestdocker compose up -dThe docker-compose.yml includes:
- Health checks every 30 seconds
- Automatic restart on failure
- Host network mode (required for ADB and Discord IPC)
- Volume mount for persistent config
- The GHCR image URL plus a local build fallback for development
docker build -t ascend-media-rpc .
docker run -d --network host --name ascend-rpc ascend-media-rpcThe container uses Python 3.11 slim, runs in headless mode by default, serves the dashboard on port 5466, and includes a health check at /api/health.
| Variable | Description | Default |
|---|---|---|
| HEADLESS | Run in headless mode | 1 |
| GUI_MODE | UI mode | browser |
| ASCEND_PORT | Dashboard port override | β |
| DASHBOARD_PORT | Compose-friendly dashboard port override | 5466 |
| ASCEND_ADB_HOST | ADB host override | β |
| ADB_HOST | Compose-friendly ADB host override | β |
| ASCEND_CONFIG_PATH | Config file path override | β |
| DASHBOARD_PUBLIC_BASE_URL | Public dashboard URL shown to integrations | http://localhost:5466 |
Note:
network_mode: hostis required for ADB device communication and Discord IPC on Linux hosts. Openhttp://localhost:5466after the container starts, or changeDASHBOARD_PORT/ASCEND_PORTif you need another port.
Ascend Media RPC needs Android TV debugging enabled so it can communicate with your device locally. You do not need to type ADB commands manually.
On your Android TV:
- Open Settings
- Go to System, Device Preferences, or About
- Find Android TV OS build or Build number
- Click it about 7 times
- You should see: You are now a developer!
Go to Settings then System then Developer options and enable whichever debugging option your device provides (ADB debugging, Network debugging, or Wireless debugging).
The first time Ascend Media RPC connects, your Android TV will show a permission prompt. Select Always allow from this computer, then Allow.
Ascend Media RPC can connect to your Android TV in four ways:
"auto_ip": trueScans your local network for compatible Android TV devices and connects automatically. Easiest option for most setups.
"mdns_discovery_enabled": trueUses Zeroconf to find Android TV devices broadcasting _adb._tcp services. Faster and more reliable than IP scanning on some networks.
Open the dashboard at http://localhost:5466 and use the built-in scanner to find and select your device.
Find your Android TV IP in Settings then Network & Internet, then set:
"adb_host": "192.168.1.50"Ascend Media RPC uses a single config.json file in the project root. All settings are managed from this one file β there is no second config file. The Python module src/core/config.py is the code that loads, saves, and validates config.json.
The config is organized into 12 labeled sections:
- ADB / Device Connection β host, port, retry, mDNS, multi-device
- Metadata Providers β TMDB, MAL API keys and rate limits
- Discord RPC β branding, icons, buttons, cycling, history, privacy
- Skip Providers β provider toggles, priority order, cache settings
- Artwork & Covers β provider, fallback chain, Top Posters, ERDB, Nuvio
- Wako Mode β Wako-specific detection settings
- API Integrations β Tracking β AniList, Simkl, Kitsu, Letterboxd, Last.fm
- API Integrations β Discovery β JustWatch, OpenSubtitles
- API Integrations β Media Servers β Plex, Jellyfin, Emby
- API Integrations β Journals β Notion, Obsidian
- Privacy & Security β privacy mode, dashboard auth, blacklist
- Dashboard & System β port, HTTPS, headless, rate limiting, audit log, health check
Config features:
- Validation β warns about invalid values and unknown keys
- Export β export config as JSON (sensitive keys excluded)
- Import β import config from JSON, merged with current config
- Hot-reload β watch config file for changes and reload automatically (config_hot_reload: true)
- Schema validation β validates config keys against the default schema
- Migration β automatically migrates legacy key names
{
"auto_ip": true,
"adb_host": "",
"adb_port": 5555,
"dashboard_port": 5466,
"tmdb_api_key": "YOUR_TMDB_API_KEY",
"mal_client_id": "YOUR_MAL_CLIENT_ID",
"erdb_token": "YOUR_ERDB_TOKEN",
"top_posters_api_key": "YOUR_TOP_POSTERS_API_KEY",
"discord_client_id": "",
"rpc_branding": "on Stremio",
"rpc_large_image_mode": "season",
"rpc_small_icon_mode": "content_network_gif",
"rpc_time_display": "remaining",
"nuvio_covers_enabled": true,
"nuvio_covers_email": "you@example.com",
"nuvio_covers_password": "YOUR_NUVIO_PASSWORD",
"introdb_enabled": true,
"tidb_enabled": true,
"videoskip_enabled": true,
"notscare_major_enabled": true,
"notscare_minor_enabled": true,
"aniskip_enabled": false,
"skipme_enabled": true,
"wako_mode": false,
"anilist_enabled": false,
"simkl_enabled": false,
"kitsu_enabled": false,
"letterboxd_enabled": false,
"lastfm_enabled": false,
"justwatch_enabled": false,
"opensubtitles_enabled": false,
"plex_enabled": false,
"jellyfin_enabled": false,
"emby_enabled": false,
"notion_enabled": false,
"obsidian_enabled": false,
"privacy_mode": false,
"dashboard_auth_enabled": false,
"audit_log_enabled": true,
"config_hot_reload": false
}API keys are optional but unlock better artwork, metadata, ratings, and skip features. You do not need every key for Ascend Media RPC to launch.
TMDB provides movie/show metadata and fallback artwork.
"tmdb_api_key": "YOUR_TMDB_API_KEY"Get your key at: https://www.themoviedb.org/settings/api
EasyRatingsDB provides generated artwork with rating overlays.
"erdb_token": "YOUR_ERDB_TOKEN"Get your token at: https://easyratingsdb.com/configurator
Top Posters provides modern streaming-style posters with rating badges.
"top_posters_api_key": "YOUR_TOP_POSTERS_API_KEY"Get your key at: https://api.top-streaming.stream/user/register
Nuvio provides community GIF covers for animated Discord network badges.
"nuvio_covers_enabled": true,
"nuvio_covers_email": "you@example.com",
"nuvio_covers_password": "YOUR_NUVIO_PASSWORD"Sign up at: https://nuvioapp.space/
Trakt provides metadata and scrobbling with automatic token refresh.
"trakt_client_id": "YOUR_TRAKT_CLIENT_ID",
"trakt_client_secret": "YOUR_TRAKT_CLIENT_SECRET"Create an app at: https://trakt.tv/oauth/applications
MyAnimeList provides anime metadata.
"mal_client_id": "YOUR_MAL_CLIENT_ID"Get your key at: https://myanimelist.net/apiconfig
Track anime progress and sync your watchlist automatically via the AniList GraphQL API.
"anilist_enabled": true,
"anilist_access_token": "YOUR_ANILIST_TOKEN"Get your token at: https://anilist.co/settings/developer
Sync watch history across TV, movies, and anime platforms.
"simkl_enabled": true,
"simkl_client_id": "YOUR_SIMKL_CLIENT_ID",
"simkl_access_token": "YOUR_SIMKL_TOKEN"Get your key at: https://simkl.com/settings/developer/
Connect to the Kitsu anime community and library.
"kitsu_enabled": true,
"kitsu_access_token": "YOUR_KITSU_TOKEN"Log movies to your Letterboxd diary as you watch.
"letterboxd_enabled": true,
"letterboxd_api_key": "YOUR_LETTERBOXD_KEY",
"letterboxd_api_secret": "YOUR_LETTERBOXD_SECRET"Scrobble soundtrack and score info to Last.fm.
"lastfm_enabled": true,
"lastfm_api_key": "YOUR_LASTFM_KEY",
"lastfm_api_secret": "YOUR_LASTFM_SECRET"Get your key at: https://www.last.fm/api/account/create
Find where movies and shows are streaming in your country.
"justwatch_enabled": true,
"justwatch_country": "US"No API key required β uses public data.
Find and fetch subtitles for your media.
"opensubtitles_enabled": true,
"opensubtitles_api_key": "YOUR_OPENSUBTITLES_KEY",
"opensubtitles_username": "YOUR_USERNAME",
"opensubtitles_password": "YOUR_PASSWORD"Get your key at: https://www.opensubtitles.com/en/consumers
Connect to your media server for playback sync.
Plex:
"plex_enabled": true,
"plex_url": "http://192.168.1.100:32400",
"plex_token": "YOUR_PLEX_TOKEN"Jellyfin:
"jellyfin_enabled": true,
"jellyfin_url": "http://192.168.1.100:8096",
"jellyfin_api_key": "YOUR_JELLYFIN_KEY"Emby:
"emby_enabled": true,
"emby_url": "http://192.168.1.100:8096",
"emby_api_key": "YOUR_EMBY_KEY"Log watch activity to a Notion database.
"notion_enabled": true,
"notion_api_key": "YOUR_NOTION_KEY",
"notion_database_id": "YOUR_DATABASE_ID"Write watch notes to an Obsidian vault folder.
"obsidian_enabled": true,
"obsidian_vault_path": "/path/to/your/vault"High-quality fan-made artwork for movies and TV shows.
"fanart_enabled": true,
"fanart_api_key": "YOUR_FANART_API_KEY"Get your key at: https://fanart.tv/get-an-api-key/
All integrations can be enabled/disabled from the dashboard Connections tab. They initialize lazily in a background thread only when their enabled flag is true.
"wako_mode": false- Enable debugging on your Android TV.
- Start Ascend Media RPC (run.bat or python start_gui.py --headless).
- Open the dashboard at http://localhost:5466.
- Connect to your Android TV.
- Start playing in Stremio.
- Discord Rich Presence updates automatically.
"wako_mode": true- Enable debugging on your Android TV.
- Start Ascend Media RPC.
- Open the dashboard.
- Connect to your Android TV.
- Start playback in Wako.
- Discord Rich Presence updates automatically.
Wako-specific config options:
| Config Key | Description |
|---|---|
| wako_player_only | Only detect player activity |
| wako_stay_awake_on_pause | Keep device awake when paused |
| wako_focus_lock | Lock focus to Wako app |
| wako_title_overrides | Manual title corrections |
| wako_title_cache_enabled | Cache parsed titles |
| wako_focus_lock_whitelist | Apps allowed when focus lock is on |
| wako_focus_lock_cooldown | Cooldown between focus checks (seconds) |
The dashboard is the local control center for Ascend Media RPC at http://localhost:5466.
Connection status, device scanner, playback info (app, title, state, progress), artwork preview, Discord RPC status, Smart Skip HUD, and live log.
- Core APIs β TMDB, MAL, Trakt, Discord credential inputs
- Skip Sources β Provider priority list with reorder arrows and toggles, provider config (API keys, URLs, TMDB/MAL ID overrides), Pipeline Sandbox for testing
- Tracking & Scrobbling β AniList, Simkl, Kitsu, Letterboxd, Last.fm cards with toggles and descriptions
- Discovery & Utilities β JustWatch, OpenSubtitles cards
- Media Servers β Plex, Jellyfin, Emby cards
- Watch Journals β Notion, Obsidian cards
- Trakt Social β collection sync, friends watching, calendar, check-in cards with toggles
- Integration Status β overview grid showing connected/disconnected status
Appearance and theme (dark/light/OLED mode, accent color picker), RPC customization, skip category per-category toggles (8 categories: intro, outro, recap, preview, credits, filler, mature content, jump scares), artwork fallback chain configuration with drag reordering, FanArt.tv settings (enable toggle, API key), device health monitoring (battery, CPU, memory, storage), ADB Wi-Fi pairing wizard, push notification toggle, privacy mode, dashboard PIN authentication, config export/import, and multi-step setup wizard.
Watch history entries and session log with filter buttons (All, Completed, In Progress, Abandoned) and per-show grouping view.
Total watch time, top genres, peak watch hours heatmap, watch streak, total skips, average session duration, session search, skip provider stats (per-provider success rates), skip category breakdown, weekly and monthly reports, and shareable stats card generator (PNG).
Audit log viewer (searchable, filterable), skip cache statistics (hit rate, size, clear button), system health (uptime, status), plugin list, and log export (last 50, last 200, or all logs as JSON download).
Trakt OAuth login flow and scrobbling status.
The Smart Skip pipeline fetches skip segments from up to 8 providers simultaneously using a thread pool executor.
- When playback starts, Ascend Media RPC resolves the media IMDB ID (via TMDB lookup or manual override).
- All enabled providers are queried in parallel.
- Results are merged using category-aware conflict resolution:
- Segments of different categories (e.g. structure vs mature content) are all kept.
- Segments of the same category that overlap are resolved by provider priority order.
- Results are cached using a TTL-based cache (default 1 hour, configurable).
The dashboard includes a Pipeline Sandbox for testing skip providers without active playback:
- Go to the Connections tab.
- Scroll to Pipeline Sandbox.
- Enter a title (e.g. Stranger Things), season, and episode.
- Click Run Pipeline Test.
- View color-coded results grouped by source.
| Provider | Notes |
|---|---|
| IntroDB.app | Intro/outro timestamps for TV episodes |
| TheIntroDB.org (TIDB) | Cloudflare-protected; uses cloudscraper for bypass |
| Remote JSON | Custom URL for your own skip database |
| VideoSkip.org | Mature content markers (sex, violence, profanity) |
| NotScare.me | Cloudflare-protected; uses cloudscraper. Supports episode slicing from season pages |
| AniSkip | Requires MAL ID for anime lookups |
| SkipMe.db | Community skip segment database |
Ascend Media RPC stores watch analytics in a local SQLite database (analytics.db).
- SQLite backend with WAL mode and indexed columns
- Automatic migration from legacy JSON format
- Watch stats β total sessions, total watch time, average session
- Top genres β genre breakdown from TMDB metadata
- Peak hours β 24-hour heatmap
- Watch streak β consecutive days of watching
- Total skips β count of all skipped segments
- Search β search sessions by title, genre, or date
View analytics in the Analytics tab of the dashboard.
Ascend Media RPC includes a plugin system for extending functionality.
| Plugin Type | Base Class | Description |
|---|---|---|
| Metadata | MetadataProvider | Custom metadata sources |
| Skip | SkipProvider | Custom skip segment sources |
| Scrobble | ScrobbleProvider | Custom scrobbling destinations |
| Artwork | ArtworkProvider | Custom artwork sources |
Plugins are loaded from a configurable directory via the PluginRegistry. The plugin list is visible in the Debug tab.
The plugin system provides the base classes and registry. No concrete plugins are bundled β this is scaffolding for community extensions.
Hide what you are watching from Discord:
"privacy_mode": true,
"privacy_hidden_text": "Watching something"Privacy mode can also blacklist specific titles, pause analytics, and pause Trakt scrobbling.
Protect your dashboard with a PIN:
"dashboard_auth_enabled": true,
"dashboard_auth_pin": "1234"Enable HTTPS for the dashboard:
"dashboard_https_enabled": true,
"dashboard_cert_path": "/path/to/cert.pem",
"dashboard_key_path": "/path/to/key.pem"Track config changes and auth events with sensitive key masking:
"audit_log_enabled": true,
"audit_log_max_entries": 1000View the audit log in the Debug tab.
"rate_limit_enabled": true,
"rate_limit_default": "60/minute"- Only enable debugging on trusted home networks
- Do not expose Android TV debugging ports to the internet
- Do not publicly expose the dashboard port
- Do not share API keys or tokens publicly
"rpc_branding": "on Stremio""rpc_large_image_mode": "season"Options: show, season, episode
"rpc_time_display": "remaining"Options: remaining, elapsed
"dashboard_port": 5466"rpc_status_cycling_enabled": true,
"rpc_cycling_messages": ["Chilling", "Binge watching", "Movie night"],
"rpc_cycling_interval": 30"rpc_dynamic_buttons": [
{"label": "My Profile", "url": "https://example.com"}
]- Android TV is turned on and awake
- PC and Android TV are on the same network
- Developer Options and debugging are enabled
- VPN/firewall is not blocking local discovery
- Try enabling mDNS discovery (mdns_discovery_enabled: true)
- Try manual IP fallback
- Confirm auto_ip: true
- Debugging is enabled on the TV
- First-time debugging prompt was accepted
- Try mDNS discovery or manual IP
- Discord desktop app is open and logged in
- Activity Status is enabled in Discord settings (User Settings then Activity Privacy)
- Ascend Media RPC is running
- Stremio or Wako is actively playing
- Another Discord RPC app is not overriding the status
- Check run.bat or start_gui.py is still running
- Try http://localhost:5466 (or your custom port)
- No other app is using the same port
- Correct Android TV device is selected
- wako_mode matches the app you are using (false for Stremio, true for Wako)
- TV is awake
- API keys are correct in config.json
- Internet connection is working
- Media exists in TMDB or selected artwork provider
- Try TMDB as fallback
- Provider is enabled in config or dashboard
- Media has data in that provider database
- For TIDB/NotScare: cloudscraper is installed (pip install cloudscraper)
- For TIDB: Cloudflare may IP-block certain networks
- For AniSkip: valid MAL ID is required
- Check server logs for errors
Ascend Media RPC exposes a REST API for the dashboard and external integrations.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/health | Health check (uptime, version, status) |
| GET | /api/state | Current app state (playback, config, metadata) |
| POST | /api/update_settings | Update config values |
| GET | /api/events | SSE event stream for live updates |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/config/export | Export config as JSON (sensitive keys excluded) |
| POST | /api/config/import | Import config from JSON |
| GET | /api/config/validate | Validate current config |
| GET | /api/config/schema | Get config schema with types |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/test/skip_pipeline | Test skip pipeline (title, season, episode) |
| GET | /api/skip/cache | Skip cache statistics |
| DELETE | /api/skip/cache | Clear skip cache |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/analytics/advanced | Full analytics (genres, hours, streaks, stats) |
| GET | /api/analytics/search?q=QUERY | Search watch sessions |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/audit | Audit log entries |
| GET | /api/rpc/history | RPC activity history |
| POST | /api/validate/keys | Validate API keys |
| GET | /api/plugins | List loaded plugins |
| GET | /api/integrations/status | Integration connection status |
| GET | /api/devices | List discovered devices |
| POST | /api/devices/switch | Switch active device |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/auth/login | Dashboard PIN login |
| POST | /api/auth/logout | Dashboard logout |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/onboarding/status | Onboarding progress |
| POST | /api/onboarding/start | Start setup wizard |
| POST | /api/onboarding/complete | Mark onboarding complete |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/trakt/collection | Get Trakt collection |
| POST | /api/trakt/collection | Add to Trakt collection |
| POST | /api/trakt/checkin | Check in to Trakt |
| GET | /api/trakt/friends | Friends watching now |
| GET | /api/trakt/calendar | Upcoming episodes |
| GET | /api/trakt/recommendations | Personalized recommendations |
| POST | /api/trakt/rate | Rate content |
| GET | /api/trakt/stats | Trakt watch stats |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/analytics/skip/providers | Per-provider skip stats |
| GET | /api/analytics/skip/categories | Per-category skip breakdown |
| GET | /api/analytics/report/weekly | Weekly watch report |
| GET | /api/analytics/report/monthly | Monthly watch report |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/history/filter?status=STATUS | Filter history (completed/in_progress/abandoned) |
| GET | /api/history/grouped | History grouped by show |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/device/health | Device health (battery, CPU, memory, storage) |
| POST | /api/device/adb-pair | ADB Wi-Fi pairing (IP:port + code) |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/remote/text | Send text input to device |
| POST | /api/remote/launch | Launch app on device |
| GET | /api/remote/apps | List installed apps |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/fanart/images | Fetch FanArt.tv images for a title |
| GET | /api/artwork/chain | Get artwork fallback chain order |
| POST | /api/artwork/chain | Set artwork fallback chain order |
| GET | /api/theme | Get current theme settings |
| POST | /api/theme | Update theme (mode, accent, OLED) |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/stats-card | Generate shareable stats card (PNG) |
| GET | /api/logs?limit=N | Get recent logs |
| GET | /api/logs/export?limit=N | Export logs as JSON download |
You can control your Android TV and update Discord from anywhere in the world using Tailscale. This creates a secure, private tunnel between your PC and your TV.
- Install Tailscale on both your PC and your Android TV.
- Enable ADB TCP/IP on your TV (run
adb tcpip 5555while on the same WiFi). - Find the TV's Tailscale IP (starts with
100.x.y.z). - Connect: In Ascend Media RPC, use the Tailscale IP as your ADB Host.
Tip
Run adb shell settings put secure always_on_vpn_app com.tailscale.ipn on your TV to keep Tailscale alive forever.
Ascend Media RPC is fully containerized and can run headlessly on a home server or VPS.
docker run -d \
--name ascend-rpc \
--network host \
--restart unless-stopped \
-v $(pwd)/config.json:/app/config.json \
-v $(pwd)/data:/app/data \
-v $(pwd)/rpc_artwork_cache:/app/rpc_artwork_cache \
-e ASCEND_PORT=5466 \
-e ADB_HOST=100.x.y.z \
ghcr.io/cxsmo-ai/ascend-media-rpc:latestOpen the dashboard at:
http://localhost:5466services:
ascend-rpc:
image: ghcr.io/cxsmo-ai/ascend-media-rpc:latest
network_mode: host
volumes:
- ./config.json:/app/config.json
- ./data:/app/data
- ./rpc_artwork_cache:/app/rpc_artwork_cache
environment:
- HEADLESS=1
- ASCEND_PORT=5466
- ADB_HOST=100.x.y.z- Python
- Flask
- pypresence
- cloudscraper
- guessit
- anitopy
- SQLite
- Zeroconf
- Pillow (optional, for stats card PNG generation)
- Built-in ADB tooling
- Discord Rich Presence
- TMDB, EasyRatingsDB, Top Posters, FanArt.tv, Nuvio
- Trakt, MyAnimeList
- AniList, Simkl, Kitsu, Letterboxd, Last.fm, JustWatch, OpenSubtitles
- Plex, Jellyfin, Emby
- Notion, Obsidian
- IntroDB, TheIntroDB.org, VideoSkip, NotScare, AniSkip, SkipMe, Skipit
Developed by Cxsmo-ai.
This project is not affiliated with Discord, Stremio, Wako, TMDB, Trakt, MyAnimeList, EasyRatingsDB, Top Posters, FanArt.tv, Nuvio, AniSkip, IntroDB, TheIntroDB.org, SkipMe, VideoSkip, NotScare, AniList, Simkl, Kitsu, Letterboxd, Last.fm, JustWatch, OpenSubtitles, Plex, Jellyfin, Emby, Notion, Obsidian, or Skipit.
All trademarks, names, logos, and brands belong to their respective owners.
Ascend Media RPC does not provide, host, index, distribute, or stream media content. It only detects local playback activity and updates Discord Rich Presence.
If you like this project, consider starring the repository.
Ascend Media RPC
Rich Presence Client + Smart Skip + Android TV Telemetry + Analytics + Integrations







