That's the file you’re asking about. Make all your edits and then reload in channels.
For me using a Synology, I copy the file to make my edits then replace back to the folder. Go to channels and reload m3u, then redownload guide.
ok, I was trying / instead of the usual \ in windows.. 
this was what I was supposed to do.

thanks for helping all us 10t's out here.
so now that i'm using the integrated webui+, I'm circling back to an issue i noticed a while back, but didn't have time to dig into.
/env does nothing
/config does nothing except restart ah4c (which interrupts a recording, I expect this if I make a change and commit it, but alas i don't get the opportunity.)
forgot my log for ya.
2026/03/08 12:30:47 [GIN-debug] Request: 172.19.0.1 GET /env, latency: 1.472259ms, status: 200
2026/03/08 12:31:05 [START] ah4c is starting
2026/03/08 12:31:05 [ENV] Not loading env
2026/03/08 12:31:05 [ENV] IPADDRESS minipc:7654
2026/03/08 12:31:05 [ENV] ALERT_SMTP_SERVER smtp.gmail.com:587
2026/03/08 12:31:05 [ENV] ALERT_AUTH_SERVER smtp.gmail.com
2026/03/08 12:31:05 [ENV] ALERT_EMAIL_FROM [email protected]
2026/03/08 12:31:05 [ENV] ALERT_EMAIL_PASS xxxxxxxxxxxxxxxx
2026/03/08 12:31:05 [ENV] ALERT_EMAIL_TO [email protected]
2026/03/08 12:31:05 [ENV] ALERT_WEBHOOK_URL
2026/03/08 12:31:05 [ENV] ALLOW_DEBUG_VIDEO_PREVIEW
2026/03/08 12:31:05 [ENV] Creating tuner 1
2026/03/08 12:31:05 [ENV] ENCODER1_URL http://10.0.0.121/live/stream0
2026/03/08 12:31:05 [ENV] TUNER1_IP 10.0.0.130:5555
2026/03/08 12:31:05 [ENV] CMD1
2026/03/08 12:31:05 [ENV] TEECMD1
2026/03/08 12:31:05 [ENV] PRE SCRIPT ./scripts/osprey/dtvosprey/prebmitune.sh
2026/03/08 12:31:05 [ENV] START SCRIPT ./scripts/osprey/dtvosprey/bmitune.sh
2026/03/08 12:31:05 [ENV] STOP SCRIPT ./scripts/osprey/dtvosprey/stopbmitune.sh
2026/03/08 12:31:05 [ENV] REBOOT SCRIPT ./scripts/osprey/dtvosprey/reboot.sh
2026/03/08 12:31:05 [ENV] Creating tuner 2
2026/03/08 12:31:05 [ENV] ENCODER2_URL http://10.0.0.121/live/stream1
2026/03/08 12:31:05 [ENV] TUNER2_IP 10.0.0.131:5555
2026/03/08 12:31:05 [ENV] CMD2
2026/03/08 12:31:05 [ENV] TEECMD2
2026/03/08 12:31:05 [ENV] PRE SCRIPT ./scripts/osprey/dtvosprey/prebmitune.sh
2026/03/08 12:31:05 [ENV] START SCRIPT ./scripts/osprey/dtvosprey/bmitune.sh
2026/03/08 12:31:05 [ENV] STOP SCRIPT ./scripts/osprey/dtvosprey/stopbmitune.sh
2026/03/08 12:31:05 [ENV] REBOOT SCRIPT ./scripts/osprey/dtvosprey/reboot.sh
2026/03/08 12:31:05 [START] ah4c is ready
2026/03/08 12:32:08 Attempting network tune for device http://10.0.0.121/live/stream0 10.0.0.130:5555 356
2026/03/08 12:32:08 [EXECUTE] Running [./scripts/osprey/dtvosprey/prebmitune.sh 10.0.0.130:5555 356]
2026/03/08 12:32:12 [EXECUTE] Stdout: 'already connected to 10.0.0.130:5555
Waking 10.0.0.130:5555
prebmitune.sh is exiting for 10.0.0.130:5555 with exit code 0
'
2026/03/08 12:32:12 [EXECUTE] Stderr: '+ streamerIP=10.0.0.130:5555
+ streamerNoPort=10.0.0.130
+ adbTarget='adb -s 10.0.0.130:5555'
+ mkdir -p 10.0.0.130
+ trap finish EXIT
+ main
+ adbConnect
+ adb connect 10.0.0.130:5555
+ local -i adbMaxRetries=3
+ local -i adbCounter=0
+ true
+ adb -s 10.0.0.130:5555 shell input keyevent KEYCODE_WAKEUP
+ local adbEventSuccess=0
+ [[ 0 -eq 0 ]]
+ break
+ adbWake
+ adb -s 10.0.0.130:5555 shell input keyevent KEYCODE_WAKEUP
+ sleep 2
+ echo 'Waking 10.0.0.130:5555'
+ touch 10.0.0.130/adbAppRunning
+ finish
+ echo 'prebmitune.sh is exiting for 10.0.0.130:5555 with exit code 0'
'
2026/03/08 12:32:12 [EXECUTE] Finished running ./scripts/osprey/dtvosprey/prebmitune.sh in 4.468438464s
2026/03/08 12:32:12 [EXECUTE] Running [./scripts/osprey/dtvosprey/bmitune.sh 356 10.0.0.130:5555]
2026/03/08 12:32:14 [EXECUTE] Stdout: 'bmitune.sh is exiting for 10.0.0.130:5555 with exit code 0
'
2026/03/08 12:32:14 [EXECUTE] Stderr: '+ channelID='"356"'
+ specialID=356
+ streamerIP=10.0.0.130:5555
+ streamerNoPort=10.0.0.130
+ adbTarget='adb -s 10.0.0.130:5555'
+ m3uName=dtvosprey.m3u
+ trap finish EXIT
+ main
+ matchEncoderURL
+ case "$streamerIP" in
+ encoderURL=http://10.0.0.121/live/stream0
+ tuneChannel
+ adb -s 10.0.0.130:5555 shell input text '"356"'
+ finish
+ echo 'bmitune.sh is exiting for 10.0.0.130:5555 with exit code 0'
'
2026/03/08 12:32:14 [EXECUTE] Finished running ./scripts/osprey/dtvosprey/bmitune.sh in 1.508550968s
12:30 was /env
12:31 was /config
I've somehow never gotten around to removing those options from the Docker build -- as they don't apply. I'll get to it soon.
is portainer the only way to edit then?
Yes.
I am setting up ah4c on a Synology NAS via Portainer to control a TiVo Stream 4K through a JTECH-ENCH4 encoder. I could not get olivetin EZstart to run, so I used portainer to build ah4c container with image bnhf/ah4c:latest@sha256:082599e69621c401db3be6663a5cd1232848c9d12f047b78f16da1291721f604. I have confirmed the encoder's HTTP stream is working in VLC (http://192.168.10.218/0.ts) and I can manually send ADB commands to the TiVo. However, when attempting to tune via the ah4c dashboard, I receive a "device(s) not available" error. Also, from the ah4c dashboard, it shows 0 192.168.10.219:5555 http://192.168.10.218/0.ts false, so ah4c thinks the tuner is offline?
Current Environment:
- Network Mode: Host.
- Tuner Device: TiVo Stream 4K (192.168.10.219:5555).
- Encoder: JTECH-ENCH4 (192.168.10.218).
- Container Port: 7654.
Relevant Environment Variables:
- NUMBER_TUNERS: 1
- TUNER1_IP: 192.168.10.219:5555
- ENCODER1_URL: http://192.168.10.218/0.ts
- STREAMER_APP: hulu
- IPADDRESS: 192.168.10.10:7654
Logs showing the error:
Attempting network tune for device http://192.168.10.218/0.ts 192.168.10.219:5555 9003
[EXECUTE] Running [./hulu/prebmitune.sh 192.168.10.219:5555 9003]
[EXECUTE] Finished running ./hulu/prebmitune.sh in 427.405µs
[ERR] Failed to run pre script: fork/exec ./hulu/prebmitune.sh: no such file or directory 192.168.10.219:5555
[ERR] Failed to tune device(s) not available
[GIN-debug] Request: 192.168.10.99 GET /play/tuner/9003, latency: 66.865901ms, status: 500
Question: It appears the container cannot find the ./hulu/ directory or the prebmitune.sh script. Should I be using a different value for STREAMER_APP, or is there a specific script package I need to map into the container?
Any help would be appreciated. I’m probably 20 hours into this and cant stop now!
You shouldn't run any container in host mode unless it's absolutely required -- which it is not here.
This value is incorrect. Try scripts/firetv/hulu, which should get you started. I didn't originally write that particular set of scripts though, and have never tested them -- so some adjustments will very likely be required for your streaming devices.
What were your errors when trying to set up Olive Tin. I'd be more worried about that. Once you get that running, it's almost on cruise control. Did you create all the required folders? You’ve already got the hardest part done. You don’t need Easy Start, just use the base compose and put your variables in and deploy in Portainer.
@bnhf con probably point you to the correct topic.
Here's the latest with my Tivo Stream 4K/Hulu live nightmare..
I’m ready to take a sledgehammer to my dusty old Tivo Stream 4K but figured I’d send this “Hail Mary” post to see if anyone out there has a working Tivo Stream 4K/Hulu Live TV setup working.
I’m running the setup in a container on a Synology NAS (via portainer), and while the bridge is up, the tuning process has become a "road to nowhere."
The Core Issue: Standard deep links and intents for Hulu seem to fail or be ignored by the TiVo (I often get Error type 3 when trying to launch specific activities). Because of this, I’ve had to resort to "Menu Climbing"—using ADB input keyevent to navigate the sidebar, select search, and type the channel name.
The Current Roadblocks:
- The "A" Keyboard Ghost: When the script reaches the Hulu search bar and sends input text the TiVo virtual keyboard remains focused on the letter "A." The result is a search box filled with "AAAAA" instead of the intended string.
- Ghost Locks: If the script hangs or takes too long (hitting the 30s timeout), ah4c gets stuck in a Tuner 0 is active - skipping loop. I’ve added rm -f /dev/shm/tuner* to a prebmitune.sh script, but it’s a constant battle with 500 errors.
- App Launching: I'm currently forced to use monkey -p com.hulu.livingroom.plus 1 because direct activity starts like com.hulu.livingroom.plus/.MainActivity aren't working reliably.
My Environment:
- Host: Synology NAS (Docker/Portainer)
- Image: bnhf/ah4c
My Questions:
- Has anyone found a reliable Deep Link or Direct Intent for Hulu Live on the TiVo 4K that bypasses the need for manual navigation?
- Is there a way to bypass the TiVo's "Leanback" keyboard via ADB so input text actually works?
- At this stage, is the TiVo simply too finicky for this level of automation? Would moving to an ONN or Google TV 4K Pro solve the ADB/Keyboard issues, or is this just the nature of the beast with the current Hulu app?
I’ve spent several days tweaking sleeps and navigation steps, but the "human emulation" method via ADB keyevents feels extremely fragile on this hardware. Any advice or working script snippets would be greatly appreciated! I’m really hoping to keep Hulu Live since it’s channel package meets my needs the best but realize that if the Hulu app just isn’t built for this automation so be it.
Hi, trying to run project one-click to install ah4c. I already have portainer running and channels dvr running in a container. I get this error when after hitting button to "Create an ah4c Stack in Portainer + CDVR Custom Channels" using project one-click " JSON response from 192.168.10.10:8089: {"error":"failed to load m3u: no channels found in m3u"}. Is there a pre-requisite to running one-click such as ensuring that I have certain paths defined on my Synology NAS? I already have these 2 folders defined: /volume2/data/ah4c/scripts and /volume2/data/ah4c/m3u and both of these folders are currently empty.
You should start with valid values for HOST_DIR, STREAMER_APP and CDVR_M3U_NAME, and then later if you want to create something custom, you can do that and contribute it back to the project.
So for example, if you're still working with Hulu, these would be typical on Synology:
HOST_DIR=/volume1/docker
STREAMER_APP=scripts/firetv/hulu
CDVR_M3U_NAME=hulu.m3u
In the above example on Synology, /volume1/docker/ah4c needs to be created in advance.
Thanks, I was able to get the one-click to run error-free. ah4c container is running and I can access the website via IP_Addr:7654. tuner status still shows false. Logs are below:
That just means you're not actively streaming anything.
so the logs look to be in a good state? The ah4c tuner did appear as a source in CDVR admin. Is there a way to see what is coming out on HDMI port (like the "view" ability on adbtuner). Tried to play a channel via this tuner but no luck. this is progress!
tried to play a channel via the ah4c tuner using channels app on android phone. Got this error:
Streaming to the tuner failed. Press Play to try again. M3U: GET: http://192.168.10.10:5592/stream/1: 404 Not Found
You can use VLC connected to the same encoder URL to view what's happening as you're connecting.
Haven't you already done a bunch of this recently when you were trying to get your other streaming device working with ah4c?
this is that same device (Tivo Stream 4K) and I never got it to work. Figured I'd back off and start from scratch this time using Project 1-click. When I bring up the encoder URL via VLC I see the Tivo device home screen. Thoughts on the error I'm getting when I try to tune to a channel that is now present in the ah4c tuner? Here is the error: Streaming to the tuner failed. Press Play to try again. M3U: GET: http://192.168.10.10:5592/stream/1: 404 Not Found
Please post the complete set of env vars you're using with ah4c, so I can see where you're at, and we don't need to do this piecemeal.

