Releases: tltv-org/cli
tltv-cli v1.17.1
tltv-cli v1.17.1
Hardening release for relay resilience, safer self-updates, and smoother viewer/operator workflows.
Changes
-
Relay resilience and cache tuning — the relay now retries initial upstream discovery instead of failing fast on transient startup races, and the cache hit path reduces read contention under load. Local 500-receiver benchmarking cut segment latency from p95/p99 22/171 ms to 11/123 ms.
-
Safer release and ops workflow —
tltv updatenow verifies release archives againstchecksums.txtbefore replacing the binary. Daemons reopen--log-filetargets onSIGHUP, Docker images ship with a basicHEALTHCHECK, and/healthresponses now include the running CLI version. -
Viewer and CLI metadata polish — relayed icons preserve their real image content type,
/api/infoincludesicon_datafor the active viewer icon path, and shell completion/help output now coversmirror, machine-readablecompletion --flags, and the v1.17 short-flag cleanup.
Docker image: ghcr.io/tltv-org/cli:v1.17.1
docker pull ghcr.io/tltv-org/cli:v1.17.1tltv-cli v1.17.0
tltv-cli v1.17.0
Production web viewer, standalone portal, and router upgrades.
Changes
-
Production viewer (
--viewer) — Phosphor-matching dark theme with HLS.js player, SVG icon controls, EPG guide grid with per-channel program blocks, relay badge from signed origins,tltv://URI display with click-to-copy, audio/subtitle track selectors, stall detection with auto-recovery, and mobile responsive layout. Replaces the previous debug viewer as the default; the original diagnostic viewer is now--debug-viewer. -
Standalone portal (
tltv viewer) — Freeform tune box with federated resolution. Tune by hostname to discover all channels, or bytltv://URI for a specific channel. Saved channels persist in browser localStorage with optional file-backed persistence via--saved-channels. Icons fetched as base64 data-URIs at resolve time. SSRF-safe resolve when listening on non-loopback addresses. -
Viewer display config —
--viewer-titlesets the nav bar label,--no-viewer-footerhides the footer links. Available on all daemons. -
Router path-prefix routing —
--route host/prefix=backenddispatches by longest-prefix match within a hostname. Multi-backend round-robin with--route host=backend1,backend2. Config routes support arrays and path prefixes. Lock-free hot-reload via atomic pointer swap with automatic ACME cert provisioning for new hostnames. -
Debug viewer enhancements — Per-variant stream sections with resolution, bandwidth, codecs, and live stats. Audio/subtitle track listing. Origins field and
on_demandin channel section. Guide showsupdatedandseqfields. Single-rendition channels skip empty variant section. -
Security hardening — SSRF-safe
/api/resolveon non-local listeners, token leak prevention (no upstream URLs in browser JSON), portal timer leak fix, private embedded viewer token propagation via sharedwithToken()helper. -
Audio-only overlay — Music note SVG with label shown when playing audio-only channels, on both production and debug viewers.
-
661 tests — 19 new viewer infrastructure tests, 11 new server viewer tests, 39 new router tests, 3 new mirror tests.
Docker image: ghcr.io/tltv-org/cli:v1.17.0
docker pull ghcr.io/tltv-org/cli:v1.17.0tltv-cli v1.16.0
tltv-cli v1.16.0
TLTV-to-TLTV content flow: bridge channels from the network, mirror origins for same-key failover.
Changes
-
Bridge TLTV sources —
tltv://URIs are now valid bridge inputs. Rebroadcast another channel under your own identity with automaticrelay_fromattribution and token passthrough. Re-resolves upstream metadata every poll cycle. -
Single-key bridge mode —
--key FILE(-k) for single-channel bridge operation, as an alternative to--keys-dirfor multi-channel setups. -
Mirror daemon —
tltv mirrorreplicates a channel from its primary origin using the same private key (spec §10.8). Passive mode serves the primary's signed metadata verbatim and proxies the HLS stream. After consecutive poll failures, automatically promotes to active signer with sequence continuity. State persists across restarts. -
Status page background — Fixed status page CSS so the black background extends to the full viewport height, even when content is short.
Docker image: ghcr.io/tltv-org/cli:v1.16.0
docker pull ghcr.io/tltv-org/cli:v1.16.0tltv-cli v1.15.0
tltv-cli v1.15.0
Changes
-
SNI router (
tltv router) — lightweight L7 reverse proxy with built-in ACME TLS. Routes HTTPS by Host header, auto-issues Let's Encrypt certs for each hostname, health checks backends. Eliminates nginx/traefik/caddy. Config file or--routeflags with hot-reload. -
Multi-domain ACME cert store — the ACME client now manages certificates for multiple hostnames from a single process. Shared across router, server, bridge, and relay when TLS is enabled. Per-domain issuance and renewal.
-
Node failover — viewer, receiver, and relay upstream automatically cascade through known nodes when the connected node becomes unreachable. Tier-aware ordering: relays try other relays first then origins, origins try other origins first then relays. Draws candidates from signed
origins, peer exchange, and URI hints. -
Buffered relay (
--buffer,--delay) — proactively fetches and stores segments in a per-channel ring buffer.--buffer 2hprovides origin-down resilience (relay keeps serving from buffer).--delay 30menables time-shifted rebroadcast. Memory-limited with--buffer-max-memory. -
Custom stream composition — the test signal server now supports arbitrary HLS media configurations:
--audio-tracks "rock:440,jazz:880"— demuxed alternate audio tracks with#EXT-X-MEDIA TYPE=AUDIO--audio-only— pure audio channels (no video)--no-audio— video-only mode (digital signage)--subtitles "clock,counter,lorem"— WebVTT subtitle tracks with#EXT-X-MEDIA TYPE=SUBTITLES--program-date-time—EXT-X-PROGRAM-DATE-TIMEtags for DVR-style seeking
-
Viewer track selection — the web viewer now shows audio and subtitle track selectors when the stream includes alternate media. Channel picker grid for multi-channel nodes.
-
Hardened private playback — token-gated viewer routes, relay config reload fixes, bridge guide state sync, loadtest verification wiring.
569 tests. Run make test to verify.
Docker image: ghcr.io/tltv-org/cli:v1.15.0
docker pull ghcr.io/tltv-org/cli:v1.15.0tltv-cli v1.14.0
tltv-cli v1.14.0
Origin verification from signed metadata, multi-channel server, multi-rendition HLS, protocol conformance hardening, and full metadata field parity.
Security & Conformance
-
Origin verification — the
originsfield in signed channel metadata (spec §11) is now used as the source of truth for origin vs relay determination. The unsigned/.well-known/tltvdiscovery document is trivially spoofable with a reverse proxy.tltv info,tltv resolve, and the viewer now annotate each channel:(origin)when the connected hostname matches signed origins,(relay — real origin is X)for honest relays, and(spoofed origin — real origin is X)when discovery claims origin but signed metadata disagrees. JSON output includesverified_origin,signed_origins, andorigin_warningfields. -
Constant-time token comparison — access token validation now uses
subtle.ConstantTimeCompareto prevent timing side-channels. -
Client protocol conformance —
checkV1Support()validates protocol v1 in the node's versions array before proceeding.checkAccessMode()rejects unknown access values per spec §5.2. Both checks are wired into all client entry points (info,channel,viewer,receiver). -
Token format validation —
validateToken()enforces RFC 3986 unreserved characters and a 256-char limit on server and bridge startup.
Server
-
Multi-channel server —
--channels Ngenerates N independent channels, each with its own key, segmenter, metadata, guide, and test pattern. Key management:--keyapplies to channel 1, channels 2+ auto-generate keys. -
Multi-rendition server —
--variants 1080p,720p,360pgenerates an HLS master playlist with per-variant media playlists and segments. Bandwidth measured from actual segment size, codec tag derived from H.264 level. Works with--channelsfor multi-channel × multi-rendition. -
Private channels —
--access tokenand--tokenfor access-controlled channels.--on-demandmarks channels as on-demand. Private channels are excluded from/.well-known/tltv.Referrer-Policy: no-referrerandCache-Control: private, no-storeheaders on all private responses. -
Metadata field parity —
--description,--tags,--language,--timezone,--iconon server and bridge. Guiderelay_fromfield (spec §6.3). Default TLTV logo SVG icon served at the protocol icon path when no--iconis provided.
Client
-
Receiver master playlist support —
parseMasterPlaylist()detects master playlists,selectVariant()picks the rendition by quality preference.--qualityflag:best(default),worst, or a resolution like720p. Wired through to loadtest. -
Viewer relay badge — a "relay" badge appears in the viewer controls bar when the connected node is not an origin (determined from signed metadata). The badge turns yellow when a spoofed origin is detected.
-
Viewer channel selector — dropdown for multi-channel servers, switches via
?channel=id. Quality selector for multi-rendition streams. Curated metadata display (description, language, timezone, tags, icon). -
--proxyflag — SOCKS5/HTTP/HTTPS proxy support on relay, bridge, receiver, and loadtest. Not available on the SSRF-safe client (security invariant).
Other
-
Short flag aliases — every flag across all commands now has long form, short form, and env var. No exceptions.
-
Discovery fix —
parseTargetOrDiscovernow checks bothchannels[]andrelaying[]arrays. Relay-only nodes previously failed bare hostname discovery.
Docker image: ghcr.io/tltv-org/cli:v1.14.0
docker pull ghcr.io/tltv-org/cli:v1.14.0tltv-cli v1.13.2
tltv-cli v1.13.2
Nav bar polish and private origins documentation.
Changes
-
Nav bar SVG wordmark — replaced text-based nav bar label with the proper SVG wordmark, matching Phosphor's design. Hidden scrollbars across all web surfaces (viewer, status page).
-
Private origins documentation — documented the
--hostnameomission pattern: running a server or bridge without--hostnamecreates a private origin whose address cannot be discovered by relays or peers. Updated README, help text, and docs for both server and bridge.
Docker image: ghcr.io/tltv-org/cli:v1.13.2
docker pull ghcr.io/tltv-org/cli:v1.13.2tltv-cli v1.13.1
tltv v1.13.1
Fix viewer stream stats flashing and unify the web page template.
Changes
-
Fix viewer stream flashing — stream fields (bitrate, buffer, resolution) no longer disappear on each HLS manifest reload. All fields are built once with stable element IDs and updated in-place.
-
Unified web template — shared
pageHead()andpageNav()used by both the viewer and status page. Logo + "tltv" mark on the left, page title on the right. Same pattern for any future pages.
Docker image: ghcr.io/tltv-org/cli:v1.13.1
docker pull ghcr.io/tltv-org/cli:v1.13.1tltv-cli v1.13.0
tltv v1.13.0
Unified CLI with new info command, --watch auto-refresh, and consistent section layout across CLI, viewer, and status page.
Changes
-
Rename
fetch→channel— section name matches command name. Same fields, same data, new name.fetchis removed. -
tltv infocommand — show all info about a target in one shot.info host:portshows node section only;info tltv://id@hostshows all 5 sections (channel, stream, guide, node, peers). Active channel marked with>in node list. -
--watchmode — auto-refresh on all 6 network commands (info,channel,stream,guide,node,peers). Default 2s interval,--intervalto customize. Ctrl-C to exit. -
Stream manifest parsing —
tltv streamnow shows Content-Type, segment count, target duration, and media sequence from the HLS manifest. -
Channel output: curated fields + remaining — shows Verified, Name, URI, Status, Access, Stream, Guide, XMLTV, Updated, Seq in defined order, then dumps any additional document keys. Missing optional fields are omitted. Future-proof against new spec fields.
-
Viewer section reformat — sections reordered to channel → stream → guide → node → peers. Channel uses curated fields instead of alphabetical key dump. Stream shows manifest-derived fields (segments, target duration, media sequence). Guide shows verified status, URLs, from/until, entry count with now-playing marker. Node shows combined "tltv protocol v1" with labeled Origin/Relay subsections.
-
Status page — when a daemon runs without
--viewer,GET /returns a static HTML status page with nav bar and node section. Same Phosphor Dark design. No video, no JS. -
Peers self-exclusion — relay and bridge no longer include their own channels in
/tltv/v1/peers. Own channels are visible via/.well-known/tltv. Peers shows the network around the node. -
Help text rewrite — new command categories: Network, Discovery, Servers, Clients, Identity, Documents, URIs, Tools.
Docker image: ghcr.io/tltv-org/cli:v1.13.0
docker pull ghcr.io/tltv-org/cli:v1.13.0tltv-cli v1.12.5
tltv-cli v1.12.5
Debug viewer now shows full node and peer info.
Changes
-
Node info section — viewer fetches
/.well-known/tltvand displays protocol, versions, channels, and relaying lists. Shows "via origin" or "via relay" next to the verified checkmark. -
Peers section — viewer fetches
/tltv/v1/peersand displays all peers with their hints. -
Full clickable URLs — guide, stream, and xmltv links expand to full URLs using
window.location.originfor embedded viewers. -
Unified viewer — standalone
tltv viewerand embedded--viewerrender the same sections from the same JS, fetching protocol endpoints directly via CORS.
Docker image: ghcr.io/tltv-org/cli:v1.12.5
docker pull ghcr.io/tltv-org/cli:v1.12.5tltv-cli v1.12.4
tltv-cli v1.12.4
Viewer fixes: full URLs, config file support, relay/bridge indicator.
Changes
-
Full URLs in viewer — embedded viewer now expands relative paths (guide, stream, xmltv) to full clickable URLs using
window.location.origin. All three links are now consistently clickable. -
Config file support for
--viewer—"viewer": trueor"viewer": "TVabc..."in daemon config files. Precedence: CLI flag > config file >VIEWERenv var. -
Via indicator — relay viewer shows "via relay", bridge shows "via bridge" in the channel info section, so it's clear the stream is proxied.
Docker image: ghcr.io/tltv-org/cli:v1.12.4
docker pull ghcr.io/tltv-org/cli:v1.12.4