CDVR listens on IPv6

$ curl  -v http://[::1]:8089/status
*   Trying [::1]:8089...
* Connected to ::1 (::1) port 8089 (#0)
> GET /status HTTP/1.1
> Host: [::1]:8089
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Cache-Control: no-cache, no-store
< Content-Type: application/json; charset=utf-8
< X-Channels-Dvr-Identifier: UGxlYXNlIGRvbid0IG92ZXJyZWFjdCB0byB0aGlzIG1lc3NhZ2U
< Date: Mon, 13 Apr 2026 14:29:06 GMT
< Content-Length: 714
<
* Connection #0 to host ::1 left intact
{"arch":"x86_64","booted":true,"description":"the daemon powering Channels DVR","eol":0,"eol_link":"","features":{"bonjour":true,"bytelimitedhls":true,"comskip":true,"cpu":true,"dev":false,"download_chrome":true,"dvr":true,"events":true,"guide":true,"imgproxy":true,"m3u":true,"nat":false,"playlist":true,"playon":false,"remote":true,"roku":false,"tailscale":false,"tmsimgproxy":true,"transcode":true,"tve":true,"virtual":true},"local_port":8089,"name":"channels-dvr","os":"linux","prerelease":true,"start_time":"2026-04-13T07:15:08.149467404-07:00","subscription":"active","suspected_docker_gateway":null,"suspected_proxies":null,"url":"https://getchannels.com/dvr","username":"hal9000","version":"2026.04.09.2054"}
$ ss -ltnp6  sport = :8089 
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      4096               *:8089            *:*    users:(("channels-dvr",pid=2845299,fd=11))

I believe that Channels will attempt to bind to port 8089 on any interface and IP the server has. If you are running a dual-stack network, it will also bind to 8089 on the IPv6 address(es) handed out by your router, as well as the interface's IPv6 addresses it assigns itself (if your system is setup for that).

The point is, it shouldn't do that.

We have always and will continue to listen on all interfaces by default. If you don't want it to do that, you can specify what you want it to listen to.

Can I specify 0.0.0.0?

1 Like

I think that's the default.
Have you tried using the -host option?

/channels-dvr/latest # ./channels-dvr --help
Usage of ./channels-dvr:
  -dir string
        working directory for runtime data and logs
  -host string
        bind address for local web interface
  -port int
        port for local web interface (default 8089)
  -safety-check
        run safety check and exit

And isn't [::1] the local loopback address (like IPv4 127.0.0.1)

Yes. The IPv6 equivalent of 0.0.0.0 is [::].

The default is [::] and CDVR ignores 0.0.0.0 as the --host argument. I hope this will be fixed in an upcoming release since IPv6 is not even on the roadmap.

But [::] and 0.0.0.0 aren't host addresses.
They either mean all interfaces or default route, depending on the context.
Can't you use the -host option to bind to a specific host IPv4 address?
That's what eric was talking about.

@eric was talking talking about interfaces, not protocol families.

0.0.0.0 means all interfaces on IPv4
[::] all interfaces on IPv6

They are valid addresses for bind/listen calls -

net package - net - Go Packages

The network must be "tcp", "tcp4", "tcp6", "unix" or "unixpacket".
For TCP networks, if the host in the address parameter is empty or a literal unspecified IP address, Listen listens on all available unicast and anycast IP addresses of the local system. To only use IPv4, use network "tcp4".