EDIT 2025.11.11: I've modified the importable ADBTuner JSON channel list to include both the FireStick and Google Android package names, so this will work on both platforms without modification.
EDIT2 2025.11.11: The change needed in your ADBTuner stack to add an extra_hosts value, has been updated to work more cross-platform (especially on a Mac).
EDIT 2025.11.12: @KineticMan now has a pre-built image on GitHub, so the Docker Compose has been updated to use that. In addition, there's a sample set of env vars (overrides to the default values) for use in the Environment variables section of the Portainer-Stacks Editor.
Using recent features added by @turtletank to ADBTuner and @KineticMan to ESPN4cc4c. it's now possible to implement a hybrid of both projects!
What you'll get, with the set of steps below, are 40 custom channels with ESPN+ events on them (for ESPN+ subscribers only of course).
First, spin up @KineticMan's project, which you can either build locally with his instructions -- or use this Docker Compose to pull it off of Docker Hub:
services:
espn4cc4c:
# 2025.11.12
# GitHub home for this project: https://github.com/kineticman/ESPN4CC4C
# Docker container home for this project with setup instructions: https://github.com/kineticman/ESPN4CC4C/pkgs/container/espn4cc4c
image: ghcr.io/kineticman/espn4cc4c:${TAG:-latest}
container_name: espn4cc4c
dns_search:
- ${DOMAIN:-localdomain} # Change to the name of your LAN's domain, which is usually local or localdomain
- ${TAILNET} # Change to the name of your Tailnet, which is in the form tailxxxxx.ts.net
ports:
- ${PORT:-8094}:${PORT:-8094}
environment:
- TZ=${TZ:-America/New_York}
- VC_RESOLVER_BASE_URL=${VC_RESOLVER_BASE_URL:-http://192.168.86.72:8094}
- CC_HOST=${CC_HOST:-192.168.86.72}
- CC_PORT=${CC_PORT:-5589}
- PORT=${PORT:-8094}
- APP_MODULE=${APP_MODULE:-bin.vc_resolver:app}
- VALID_HOURS=${VALID_HOURS:-72}
- LANES=${LANES:-40}
- ALIGN=${ALIGN:-30}
- MIN_GAP_MINS=${MIN_GAP_MINS:-30}
- M3U_GROUP_TITLE=${M3U_GROUP_TITLE:-ESPN+ VC}
- VC_M3U_PATH=${VC_M3U_PATH:-/app/out/playlist.m3u}
- WATCH_API_KEY=${WATCH_API_KEY:-0dbf88e8-cc6d-41da-aa83-18b5c630bc5c}
volumes:
- ${HOST_DIR:-.}/data:/app/data
- ${HOST_DIR:-.}/out:/app/out
- ${HOST_DIR:-.}/logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8094/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
restart: unless-stopped
Rather than editing the above directly, I recommend using Portainer and customize these env vars for your installation. TAILNET is only required for Tailscale users using MagicDNS:
TAILNET=tailxxxxx.ts.net
TZ=US/Mountain
VC_RESOLVER_BASE_URL=http://htpc6:8094
CC_HOST=cc4c2
HOST_DIR=/data/espn4cc4c
Next, for ADBTuner, you'll want to be running at least development build 20251108-1. If you're a Windows or Mac user an internal host called host.docker.internal should already be configured. Linux users will want to add this to their Docker Compose (Portainer is once again the easiest way to do this):
extra_hosts:
- host.docker.internal:${DOCKER_GATEWAY:-host-gateway} # host.docker.internal is generally not predefined on Linux hosts.
With ADBTuner updated, and extra hosts: added, you'll need the following in your ADBTuner Custom Configurations:
{
"name": "ESPN+ Deep Links - Show Tuning Process",
"author": "bnhf",
"version": "1.0",
"description": "Load content via ESPN+ deep link URLs (where supported). Show tuning process.",
"uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac",
"global_options": {
"wait_for_video_playback_detection": false,
"use_fixed_delay": true,
"fixed_delay_seconds": 1,
"check_for_and_clear_whos_watching_prompts": false,
"wait_after_post_playback_start_commands_seconds": 0
},
"pre_tune_commands": [
"input keyevent KEYCODE_MEDIA_STOP"
],
"tune_commands": [
"am start -n ||TARGET_PACKAGE_NAME||/com.espn.startup.presentation.StartupActivity -d ||TARGET_URL_OR_IDENTIFIER||"
],
"post_playback_start_commands": [
"sleep 20",
"input keyevent KEYCODE_DPAD_DOWN",
"input keyevent KEYCODE_DPAD_DOWN",
"input keyevent KEYCODE_DPAD_RIGHT",
"input keyevent KEYCODE_DPAD_CENTER"
],
"post_tune_commands": [
"input keyevent KEYCODE_MEDIA_STOP",
"input keyevent KEYCODE_MEDIA_PAUSE",
"input keyevent KEYCODE_HOME"
]
}
Next, in the ADBTuner WebUI Import/Export, you can import this list of 40 fixed channels for your ESPN+ events to appear on in the guide:
[
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+1",
"url": "http://host.docker.internal:8094/whatson/1?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+2",
"url": "http://host.docker.internal:8094/whatson/2?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+3",
"url": "http://host.docker.internal:8094/whatson/3?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+4",
"url": "http://host.docker.internal:8094/whatson/4?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+5",
"url": "http://host.docker.internal:8094/whatson/5?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+6",
"url": "http://host.docker.internal:8094/whatson/6?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+7",
"url": "http://host.docker.internal:8094/whatson/7?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+8",
"url": "http://host.docker.internal:8094/whatson/8?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+9",
"url": "http://host.docker.internal:8094/whatson/9?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+10",
"url": "http://host.docker.internal:8094/whatson/10?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+11",
"url": "http://host.docker.internal:8094/whatson/11?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+12",
"url": "http://host.docker.internal:8094/whatson/12?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+13",
"url": "http://host.docker.internal:8094/whatson/13?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+14",
"url": "http://host.docker.internal:8094/whatson/14?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+15",
"url": "http://host.docker.internal:8094/whatson/15?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+16",
"url": "http://host.docker.internal:8094/whatson/16?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+17",
"url": "http://host.docker.internal:8094/whatson/17?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+18",
"url": "http://host.docker.internal:8094/whatson/18?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+19",
"url": "http://host.docker.internal:8094/whatson/19?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+20",
"url": "http://host.docker.internal:8094/whatson/20?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+21",
"url": "http://host.docker.internal:8094/whatson/21?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+22",
"url": "http://host.docker.internal:8094/whatson/22?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+23",
"url": "http://host.docker.internal:8094/whatson/23?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+24",
"url": "http://host.docker.internal:8094/whatson/24?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+25",
"url": "http://host.docker.internal:8094/whatson/25?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+26",
"url": "http://host.docker.internal:8094/whatson/26?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+27",
"url": "http://host.docker.internal:8094/whatson/27?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+28",
"url": "http://host.docker.internal:8094/whatson/28?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+29",
"url": "http://host.docker.internal:8094/whatson/29?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+30",
"url": "http://host.docker.internal:8094/whatson/30?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+31",
"url": "http://host.docker.internal:8094/whatson/31?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+32",
"url": "http://host.docker.internal:8094/whatson/32?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+33",
"url": "http://host.docker.internal:8094/whatson/33?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+34",
"url": "http://host.docker.internal:8094/whatson/34?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+35",
"url": "http://host.docker.internal:8094/whatson/35?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+36",
"url": "http://host.docker.internal:8094/whatson/36?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+37",
"url": "http://host.docker.internal:8094/whatson/37?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": "",
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+38",
"url": "http://host.docker.internal:8094/whatson/38?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+39",
"url": "http://host.docker.internal:8094/whatson/39?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
},
{
"provider_name": "ESPN",
"number": "",
"name": "ESPN+40",
"url": "http://host.docker.internal:8094/whatson/40?deeplink=1&dynamic_url_json_key=deeplink_url",
"package_name": "com.espn.gtv",
"alternate_package_name": "com.espn.score_center",
"tvc_guide_stationid": "",
"guide_offset_hours": 0,
"configuration_uuid": "51af5028-092f-4ddc-b4ea-d5e5fca58cac"
}
]
And finally, to put them together, the M3U will come from ADBTuner and the XML from ESPN4cc4c:
As always, be sure you have the ESPN app installed on your encoder-attached streaming sticks, and are logged in with your credentials. 20010 is the recommended starting channel number to use (assuming it's available on your setup) for the guide data to match automatically.
BTW, you can also use this same guide data for cc4c or ah4c.

