Skip to main content

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Added

  • tvlabs execute --region names the teleport region the session is tunnelled through, the same flag tvlabs run has. Omitting it leaves device matching exactly as it was.

[0.1.69] - 2026-09-09

Added

  • TVLABS_CONJURE_PORT and TVLABS_CONJURE_TOKEN on smartcast. A SmartCast harness had to hardcode 7345 and had no way to authenticate at all, so every Conjure operation worth making came back REQUIRES_PAIRING, and pairing is not self-service: it needs a PIN read off the TV screen. The port is the forwarded one, so an ephemeral forward works, and the token goes in an AUTH header your harness sets itself.

Fixed

  • A malformed session event no longer prints its values to stderr. The dump is now the payload's shape, keys and the type of each value, which is what diagnoses a wire-format mismatch. stderr is the job log in CI, and this release is the one that puts a credential in that payload.

[0.1.68] - 2026-09-02

Added

  • tizen runs under --containerized. The image carries sdb, already pointed at this session's device, so sdb shell … and sdb install app.wgt reach it with no flags of yours. Both architectures are covered: Samsung has never published an arm64 Linux sdb, so on arm64 the amd64 binary runs under qemu-x86_64 behind a wrapper of the same name, which is what the sidecar fleet has done for a long time.
  • TVLABS_CERTIFICATE_URL on tizen, on host runs too: the URL of the signing certificate your device trusts. A .wgt has to be signed with it before sdb install will accept it. The URL is presigned, so it expires with the session.

[0.1.67] - 2026-09-02

Added

  • vega runs under --containerized, and gains TVLABS_VDA_ADDR on host runs too: the host:port of the device's VDA debug bridge. VDA is Amazon's rebuild of adbd, so a stock adb drives it. Note this is the device and not a server, unlike TVLABS_ADB_ADDR on the Android platforms: your own adb server attaches to it with adb connect "$TVLABS_VDA_ADDR". In a container that is done for you before your entrypoint starts, with ANDROID_SERIAL set, so adb shell vpm list packages reaches the device with no flags of yours.
  • web_os runs under --containerized. The image carries the ares-* webOS CLI, and the device is registered as an ares profile inside the container before your entrypoint starts, so ares-install -d "$TVLABS_ARES_DEVICE" app.ipk reaches it there the way it does on a host run. The device's pre-paired key is mounted read only for the run and deleted with it; it is never put in your entrypoint's environment.

Changed

  • --webos-tools-dir is refused with --containerized rather than ignored. It points webOS's setup at an ares CLI on your host, and a containerized run reaches for the image's own instead, so a directory here would decide nothing.

[0.1.66] - 2026-09-01

Added

  • The runner image --containerized uses is published, for linux/amd64 and linux/arm64, so a run no longer needs a local build of it. A missing image is pulled during preflight, before a device is requested, with the download's own progress on stderr.
  • android_tv and android_mobile run under --containerized, alongside roku. The image carries adb, and ANDROID_ADB_SERVER_ADDRESS, ANDROID_ADB_SERVER_PORT and ANDROID_SERIAL are set before your entrypoint starts, so adb shell … reaches the device with no flags of yours.
  • The image also carries python3 and pip, node and npm, and a headless JRE, so a harness no longer depends on what happens to be installed on the machine it runs on.

Fixed

  • TVLABS_ADB_SERIAL is the serial the session's adb server actually reports, read from that server rather than derived. It was the device's address with :5555 appended, which is the serial only for a device attached over TCP; a USB-attached device answers to a hardware serial, so adb -s "$TVLABS_ADB_SERIAL" addressed nothing on those.
  • A --containerized run on an Android platform no longer fails for a missing host adb. Both the preflight and the platform setup demanded one, which a container run has no use for, and the setup's demand landed after a device had already been warmed for the run.

[0.1.65] - 2026-08-10

Fixed

  • connect, execute, run, session, upload, and projects no longer fail with error parsing JSON: invalid character '<' looking for beginning of value on networks that interfere with plain HTTP. The CLI's version check requested version.json over http:// and relied on the redirect to HTTPS surviving the trip; a network that answers port 80 itself returned its own HTML, which the check then tried to parse as JSON. It requests https:// directly. Every one of those commands is gated on the version check, so one intercepted request took the whole CLI down with it, on a network where the tunnel and the platform connection were both perfectly healthy.
  • A version check that receives something other than JSON now reports the status and content type it got back, instead of a parse error. A proxy block page or a captive portal sign-in page is diagnosable from the message rather than looking like a bug in the CLI.

[0.1.64] - 2026-08-04

Added

  • tvlabs execute --containerized runs your entrypoint in a container on your own machine instead of directly on the host. The image owns the toolchain, so a run no longer depends on what happens to be installed here, and the container sees only --context (mounted at /workspace) and the TVLABS_* contract — none of your environment. Experimental, roku only, and macOS with Docker Desktop only for now. Build the image with mise run build-runner-image; it is not published yet. See Containerized runs.
  • tvlabs execute --image names the container image for --containerized, defaulting to tvlabsai/execute-runner:<cli version>. Customers who need more than the base image provides can FROM it and pass their own.

Changed

  • A containerized run's device forwards bind ephemeral local ports instead of the platform's documented ones. The TVLABS_* contract already promised that "a port is one the local end really binds", and it now reports what was actually bound rather than what the port map expected. So --containerized no longer collides with an adb server you already have running, a dev server on 8080, or a second tvlabs run — and two runs can share one machine, which [0.1.62]'s preflight could only report as a failure. Read every port from its TVLABS_* variable and this is invisible to your harness; a harness that hardcodes 8060 or 5037 will only work on the host path. Host runs are unchanged and still bind the documented ports.
  • TVLABS_DEVICE_HOST is host.docker.internal under --containerized — the container's route back to your machine — while --bind-address continues to control what the tunnel binds. TVLABS_OUTPUT_DIR is a /workspace/... path in that mode; its contents still land under --context on the host, through the mount.

[0.1.63] - 2026-07-31

Fixed

  • The --target example in tvlabs execute --help targeted platform_key:fire_tv, which matches no platform and now fails with unknown platform_key "fire_tv". Fire TV and Google TV are OS variants of android_tv: target them with platform_key:android_tv AND platform_os_variant:fire_tv.
  • A --target naming platform_key:fire_tv or platform_key:google_tv no longer reports a missing local adb in place of the real problem. The preflight treated both as platforms needing the Android toolchain; since neither is a platform key, the run now goes straight to the server and reports unknown platform_key instead.

[0.1.62] - 2026-07-31

Added

  • tvlabs execute checks the local platform toolchain before it requests a device. When --target names a platform_key, a missing adb / sdb / ares-setup-device, or any port the platform's tunnel binds already taken — the adb server's 5037, the sdb server's 26099, webOS's 3000, Roku's 8080, whichever applies — exits 1 in under a second instead of after a device has been matched and warmed. Targets whose platform the CLI cannot determine up front are checked as soon as the server reports the device, and also exit 1. See Local requirements.
  • tvlabs execute builds its TVLABS_* environment per platform, and ships the variables a harness needed and had to work out for itself: TVLABS_DEVICE_IP, TVLABS_DEVICE_NAME, TVLABS_OUTPUT_DIR, TVLABS_ADB_ADDR and TVLABS_ADB_SERIAL (Android), TVLABS_SDB_ADDR (Tizen), TVLABS_ARES_DEVICE and TVLABS_SSH_ADDR (webOS), TVLABS_ECP_PORT and TVLABS_ROKU_DEV_PORT (Roku). A variable that does not apply to the matched platform is now absent rather than empty. See Environment contract.
  • tvlabs execute --webos-tools-dir, matching tvlabs connect, for a runner that keeps the ares CLI off PATH. The preflight above honours it: the ares CLI may live there rather than on PATH.

Changed

  • tvlabs execute no longer passes TVLABS_API_KEY (or any other TVLABS_* key, token, secret, password or passphrase) to the entrypoint. A harness that shells out to tvlabs itself — or to the TV Labs API — must now be given the key explicitly: --env "TVLABS_API_KEY=$TVLABS_API_KEY". Your own secrets are untouched.
  • TVLABS_INSPECTOR_PORT is set only on the platforms where something is actually listening on it, and the docs now say what answers there per platform. It was previously set on every platform, including ones where nothing was bound.
  • The port-collision error now names the fix instead of lsof: a busy 5037 or 26099 recommends adb kill-server / sdb kill-server.

Fixed

  • tvlabs execute checks that --context can be written to while validating flags, instead of failing after a device had been matched and warmed.
  • tvlabs execute sets the Viera log file path and the webOS tools directory it had been omitting, which made the Viera log server fail every write.
  • A platform missing from the port map (a typo, or a platform with no documented port list) no longer silently reports a successful connection with zero device port forwards. tvlabs connect / tvlabs execute now print a warning and forward only the app port.

Removed

  • google_tv and fire_tv as platform keys. Both are OS variants of android_tv, not platforms of their own — a Fire TV or Google TV device reports platform android_tv to the CLI and resolves through the android_tv port map and ADB handler. The dedicated entries were unreachable on every real code path.

[0.1.61] - 2026-07-27

Added

  • tvlabs execute (alias tvlabs exec), an experimental command that requests a device, tunnels to it, and runs a script of yours against it — built for CI. See tvlabs execute for the environment contract and exit codes. Experimental means its flags, TVLABS_* variables and exit codes may change without a major version bump; pin your CLI version if you depend on it.

[0.1.60] - 2026-07-22

Fixed

  • Fixed an issue that could cause some requests to TV Labs services to be rejected.

[0.1.59] - 2026-07-13

Changed

  • Roku ports 8080 (debugger) and 8085 (BrightScript console) now forward to the sidecar, which multiplexes the telnet console across clients on the backend.

Removed

  • CLI-side console multiplexer for Roku port 8085, along with the --logs and --mode flags on tvlabs connect. Connect to :8085 on the sidecar instead — multiple concurrent clients are now supported.

[0.1.58] - 2026-07-13

Added

  • Web inspector for Android, Fire TV, and TiVo WebViews. Press d during tvlabs connect to open Chrome DevTools on the foreground app, or add the inspector port (default 9222, set with --inspector-port) as a chrome://inspect network target.

Fixed

  • adb kill-server interception scans only the bytes actually received, avoiding false matches.

[0.1.56] - 2026-04-22

Added

  • Local /_dev/certificate endpoint to serve Tizen dev certificate bundle
  • certificate_url field in session device payload for platform-specific signing

[0.1.55] - 2026-04-14

Added

  • --webos-tools-dir flag for tvlabs connect to specify a custom directory for ares-* CLI tools
  • --mock-tunnel and --local-device dev-only flags for local testing
  • --base-url dev-only flag to override the API/WebSocket host
  • Local HTTP status API for external tools to query tunnel state

Fixed

  • WebOS platform handler uses absolute paths from --webos-tools-dir instead of relying on PATH
  • Synchronized concurrent writes to mux upstream
  • Cross-platform PID liveness check for session files
  • Sanitized session ID in file paths
  • Thread-safe access to active mux server via atomic pointer

[0.1.54] - 2026-04-13

Added

  • --headless flag for tvlabs connect to run without TUI (for VS Code extension integration)
  • --session flag auto-connects to a specific session directly, skipping session selection
  • TVLABS_API_KEY environment variable support for API key authentication

Fixed

  • Check PATH before appending install location in install script

Removed

  • Deprecated port mappings for app ports and Viera log server

[0.1.53] - 2026-04-01

Added

  • Support for local.tvlabs.ai stable DNS name for device companion host resolution with app ports and Viera log server.

[0.1.52] - 2026-03-06

Added

  • Port mapping for browser devices

[0.1.51] - 2026-02-25

Changed

  • Tizen debugger functionality uses static port forwarding instead of dynamic forwarding to allow the system to access the debugger for network capture.

[0.1.50] - 2026-02-17

Fixed

  • Fix for app port forwarding when device is connected to subnet 10.42.0.0/24

[0.1.49] - 2026-02-02

Added

  • Support for user hosted web applications

Fixed

  • Output messages about upgrading, invalid API key, internal server errors to stderr instead of stdout

[0.1.48] - 2025-10-08

Added

  • Support non-interactive mode with tvlabs upload and tvlabs test commands

[0.1.47] - 2025-09-22

Added

  • Chromium debugger support for TiVo platform

[0.1.46] - 2025-09-22

Added

  • adb server support for Android Mobile devices

[0.1.45] - 2025-09-17

Added

  • Handling for existing builds in upload command
  • Compute SHA256 hash of uploaded file, send in metadata
  • Send service name and version in channel join

[0.1.44] - 2025-08-11

Added

  • Viera debug log server and connect options

[0.1.43] - 2025-07-15

Fixed

  • Critical race condition in run command that caused "concurrent map writes" crashes during automation execution
  • Improved terminal output: base64 images now shown as 🖼️, better error handling, less whitespace, and proper resource cleanup

[0.1.42] - 2025-07-14

Added

  • run command to execute project-based automations from CLI with same capabilities as web interface
  • projects command group to organize project-related functionality
  • projects list command to list all accessible automation projects with comprehensive project information
  • projects targets command to discover available app/device combinations for automation projects

[0.1.41] - 2025-05-10

Fixed

  • Issue where upload command would hang if API key was not set, or set incorrectly

Added

  • whoami command to display information about the current user

[0.1.40] - 2025-05-09

Added

  • upload command supports uploading for target application by slug

[0.1.39] - 2025-05-08

Changed

  • upgrade command will upgrade the CLI to the latest version instead of printing the instructions to do so

[0.1.38] - 2025-05-08

Fixed

  • Bug where upload command could generate unuseable builds when upload is interrupted
  • Bug where upload command error messages were not being displayed

[0.1.37] - 2025-04-30

Changed

  • upload command processes build after upload
  • upload command now accepts an -n option, when specified, there's no newline printed after the build ID

[0.1.36] - 2025-04-24

Changed

  • upload command file metadata collection improvements

[0.1.35] - 2025-04-23

Added

  • Support for Vizio debugger

[0.1.34] - 2025-04-10

Added

  • connect command now accepts --bind-address or -b flag to bind the SSH tunnel to a specific address instead of the default value of localhost.

[0.1.33] - 2025-03-19

Added

  • Sessions can be ended from tvlabs connect by pressing e

Changed

  • Display instructions to get/generate API keys when no API keys were set or found with invalid API keys.
  • Updated adb instructions to specify device
  • Updated adb instructions to include opening app

[0.1.32] - 2024-12-30

Changed

  • sdb server now runs remotely next to the the device instead of locally. Prior versions of the CLI will not be able to connect to Tizen devices via sdb.

Fixed

  • Issue where -i flag on upload command would add in a unwanted newline

[0.1.31] - 2024-12-12

Added

  • upload command now supports --id-only or -i flag to output only the build ID

[0.1.30] - 2024-11-27

Added

  • Support for Tizen and WebOS websocket remotes

[0.1.29] - 2024-11-26

Fixed

  • Issue where Roku ECP requests would fail if the Host header was not set to the device IP.

[0.1.28] - 2024-11-22

Fixed

  • Fixed some incorrect URLs to some documentation pages
  • Improved text readability when the terminal has a white background

[0.1.27] - 2024-10-28

Added

  • Install powershell script for Windows
  • upgrade command instructions for Windows

Fixed

  • Issue where home directory in Windows was not being set correctly
  • Issue where tvlabs check would fail in Windows like environments

[0.1.26] - 2024-10-10

Fixed

  • Issue where tvlabs connect would fail on Windows environments when trying to save pre-paired keys.

[0.1.25] - 2024-09-30

Added

  • Display installed apps when connected to a device. Currently only supported on the webOS platform.

[0.1.24] - 2024-08-07

Added

  • Display toast in web UI when session is connected to with tvlabs connect
  • Retry logic on adb connect

Changed

  • Avoid logging sensitive info

Fixed

  • Issue where connection status could show as successful when it failed

[0.1.23] - 2024-08-05

Added

  • connect command warning about unrestored keys on start after improper shutdown
  • connect command restore keys functionality on main menu after improper shutdown

[0.1.22] - 2024-08-02

Changed

  • Retry attempts on sdb connect

[0.1.21] - 2024-08-02

Added

  • connect returns to session selection menu when current session ends

[0.1.20] - 2024-08-01

Fixed

  • Bug where port forward would fail to shutdown on reconnect
  • Status indicator state when SSH tunnel fails to connect

[0.1.19] - 2024-08-01

Fixed

  • Issue where Tizen inspector would fail if more than one device connected

[0.1.18] - 2024-08-01

Added

Fixed

  • Issue where connection would not close when session ends

[0.1.17] - 2024-07-31

Fixed

  • Race condition on tvlabs connect exit where keys might not be restored.

[0.1.16] - 2024-07-30

Added

  • connect command accepts --inspector-port or -i argument to control local inspector port

Changed

  • connect command webOS inspector now runs on a default debugger port

[0.1.15] - 2024-07-29

Added

  • Support for Chrome development tools inspector on the webOS platform.

[0.1.14] - 2024-07-29

Fixed

  • connect command help text for WebOS

[0.1.13] - 2024-07-24

Added

  • connect command support for Fire TV

[0.1.12] - 2024-07-23

Added

  • include version in distributed binary file names

[0.1.11] - 2024-07-19

Added

  • connect command improved initial state text

[0.1.10] - 2024-07-19

Added

  • upgrade now provides a link to this changelog

Fixed

  • connect instructions for Roku
  • upgrade fix help instructions
  • upload fix help instructions

[0.1.9] - 2024-07-17

Fixed

  • connect command retry hot-key