RemotiveCLI
0.23.5 - 2026-07-22
Bug fixes
- install: Uninstall script for tar packages
Features
-
dist: GPG-sign RPM packages with a RemotiveLabs-owned key
Sign released .rpm packages with rpmsign so dnf can verify them with gpgcheck=1 — the per-package signature path works on both dnf4 (RHEL/Rocky/Alma) and dnf5 (Fedora), unlike the Artifact Registry repo-metadata signature, which dnf5 rejects ("Bad PGP signature").
- build-rpm.sh: opt-in signing step after the fpm build, driven by REMOTIVE_RPM_SIGNING_* env vars. Isolated ephemeral GNUPGHOME, non-interactive loopback pinentry, SHA-256 digest, passphrase optional (passphraseless signing subkey). Fails closed: verifies the package actually carries a signature, and REMOTIVE_REQUIRE_SIGNING=1 refuses to ship an unsigned rpm.
- Makefile: pass the signing env vars into the fpm build container (unset -> unsigned, local builds unaffected).
- cli-release.yaml: wire secrets.RPM_SIGNING_KEY_BASE64 + vars.RPM_SIGNING_KEY_ID into the package job with REMOTIVE_REQUIRE_SIGNING=1, and publish the public key next to install.sh on every release.
- Key: certify-only RSA-4096 master (offline custody) + passphraseless RSA-4096 signing subkey (CI). Public key committed at distribution/remotivelabs-rpm-signing-key.gpg; custody/rotation and rollout sequencing documented in distribution/README.md.
Verified end-to-end in the remotivelabs/fpm image with the real subkey: signed package passes rpm -K and installs with gpgcheck=1 on rockylinux:9 (dnf4) and fedora (dnf5); tampered package is rejected.
0.23.4 - 2026-07-19
Features
-
dist: Distribute CLI on macOS via Homebrew and a .pkg installer
Add first-class macOS distribution built from one self-contained bundle that embeds CPython 3.12 (like the deb/rpm/tar packages), so there is no dependency on the user's Python:
- Homebrew:
brew install remotivelabs/tap/remotivelabs-cli - Native, signed + notarized .pkg installer (no Homebrew required), with a
bundled uninstaller exposed on PATH as
remotive-uninstall
Add a cross-platform distribution/install.sh (served from the release bucket) that installs or upgrades via the native channel per platform and falls back to the self-contained glibc bundle:
macOS -> Homebrew tap (fallback: signed .pkg installer) Debian/Ubuntu -> apt repo (fallback: glibc tar bundle) RHEL/Fedora -> dnf/yum repo (fallback: glibc tar bundle)
On macOS with Homebrew present it prompts for Homebrew vs .pkg (read from /dev/tty so it works under
curl ... | bash); the latest version is resolved from a stable pointer on the release bucket, keeping the installer self-consistent with the bucket it downloads from. - Homebrew:
0.23.8 - 2026-07-16
0.23.7 - 2026-07-16
Features
-
dist: Resolve install.sh latest version from GCS pointer
install.sh resolved the latest version from PyPI, coupling the installer to a channel it does not download from — PyPI could point at a version whose GCS .pkg/.tar.gz artifacts do not exist. Read a bare version string from a stable latest/latest-version.txt on the release bucket instead (mirrors remotive-studio-desktop), so the installer is self-consistent with the bucket it installs from; hard-fail if the pointer is unreachable.
The release pipeline now writes that pointer in publish-macos-to-bucket after the per-version artifacts are uploaded, with cache-control: no-cache so the CDN serves the new version immediately.
-
dist: Let install.sh ask brew-vs-.pkg when Homebrew is present
On macOS with Homebrew installed, auto method-detection silently chose brew. Prompt the user to pick Homebrew or the standalone .pkg instead. The choice is read from the controlling terminal (fd 3 opened from /dev/tty) so it works even under 'curl ... | bash'; when no terminal can be opened it defaults to brew as before. Passing --method brew|pkg skips the prompt.
-
dist: Rename Homebrew formula remotive-cli -> remotivelabs-cli
Align the Homebrew formula name with the PyPI package name so all distribution channels use remotivelabs-cli consistently. Renames the formula template + Ruby class, and updates install.sh, the release workflow, and docs/comments. The .pkg files, GCS paths, Linux packages, bundle identifier (com.remotivelabs.cli) and the remotive command are unchanged. The docs changelog slug is intentionally left as remotive-cli.
0.23.6 - 2026-07-16
Features
-
dist: Bundle an uninstaller in the macOS .pkg
The .pkg format has no native uninstall path (unlike deb/rpm or Homebrew). Ship uninstall.sh in the payload at /opt/remotivelabs-cli/uninstall.sh and expose it on the PATH via a /usr/local/bin/remotive-uninstall symlink created in postinstall. It removes the install dir, the launcher, its own symlink, and the pkgutil receipt, guarding each removal so it never touches a foreign remotive on the PATH.
0.23.5 - 2026-07-15
Bug fixes
-
dist: Convert extension modules to MH_BUNDLE for clean brew install
pydantic_core and rpds link their C-extension as MH_DYLIB with an @rpath install ID instead of the conventional MH_BUNDLE. Homebrew's post-install fix_dynamic_linkage then tries to rewrite that dylib ID to its long opt/ path, which does not fit the Mach-O header padding, printing:
Error: Failed changing dylib ID of .../_pydantic_core...so Error: Failed to fix install linkage
build-macos.sh now converts these modules to a proper MH_BUNDLE via macho_dylib_to_bundle.py (flips the filetype and removes the now-invalid LC_ID_DYLIB, compacting the load commands) and re-signs, before signing/ archiving. Homebrew only rewrites the ID of true dylibs, so it skips bundles and the install is clean. dlopen loads either type, so CPython is unaffected.
Verified end-to-end: built the bundle, confirmed all .so are MH_BUNDLE, imports load, and 'brew install' from the local tarball completes with no relinkage errors.
0.23.4 - 2026-07-15
Features
-
dist: Distribute CLI on macOS via Homebrew and a .pkg installer
Add two macOS install paths built from one self-contained bundle that embeds CPython 3.12 (like the deb/rpm/tar packages), so there is no dependency on the user's Python:
- Homebrew:
brew install remotivelabs/tap/remotive-cli - Native .pkg installer (no Homebrew required), signed + notarized
- Homebrew:
-
dist: Add cross-platform install.sh with upgrade support
Add distribution/install.sh, served at the stable bucket URL remotivelabs-cli/install.sh, that installs or upgrades the CLI using the proper native channel per platform and falls back to the self-contained bundle (its own CPython, no host Python required):
macOS -> Homebrew tap (fallback: signed .pkg installer) Debian/Ubuntu -> apt repo (fallback: glibc tar bundle) RHEL/Fedora -> dnf/yum repo (fallback: glibc tar bundle)
Re-running upgrades in place: brew/apt/yum upgrade, and the .pkg/tar paths compare the installed version and replace only when newer or -f. The tar fallback guards against musl (Alpine) since the bundle is glibc.
Wire a publish-install-script job in cli-release.yaml to upload the script to the bucket, and document the curl|bash one-liner in README.
-
dist: MacOS is Apple Silicon (arm64) only
Drop Intel/x86_64 macOS support everywhere:
- build-macos.sh / build-macos-pkg.sh: remove the x86_64 arch branch; any non-arm64 arch is now rejected
- package-macos CI matrix: remove the x86_64/macos-13 entry
- Homebrew formula: drop the on_intel block and @@SHA_X86_64@@ token; render only the arm64 sha
- release summary: remove the macOS x86_64 row
- install.sh: reject x86_64 macOS with a clear message
- docs: README + distribution/README note Apple Silicon only
Linux x86_64/amd64 is unaffected.
0.23.3 - 2026-07-13
Bug fixes
-
deps: Bump click to 8.4.2 (PYSEC-2026-2132)
Resolves the click.edit() command injection advisory affecting click <=8.3.2. The CLI does not call click.edit(), so this clears the dependency scanner rather than a live exploit path.
click 8.4 makes ParamType generic over its convert() return type, so annotate the three broker ParamType subclasses accordingly.
0.23.2 - 2026-07-13
0.23.1 - 2026-07-07
Bug fixes
-
Document org/studioRunner role in service-accounts --help
Adds org/studioRunner (can start RemotiveStudio) to the supported-roles help shown by service-accounts create/update, mirroring org/topologyRunner.
0.23.0 - 2026-07-02
Bug fixes
- security: Bumped packages caught by audit
Features
-
auth: Mandatory default organization selection
Require selecting a default organization on login/activate, and restructure the related auth commands around it:
- prompt for and persist a default organization on login/activate, auto-selecting only when the listing returns exactly one org
- auto-set the organization for service accounts, resolving it from the token itself
- validate organization uid input (OPLANE_REQ-00109680)
- split 'auth organization' into print/set subcommands and shim the deprecated 'organizations default' onto it
- drop the --account/--organization column toggles from 'auth list'
- don't fail login/activate when org selection fails; retry invalid selections with a loop instead of recursion
0.22.0 - 2026-06-24
0.21.0 - 2026-06-24
0.20.4 - 2026-06-22
Bug fixes
-
Tab completion with typer>=0.26
Tab-completion silently returned no suggestions on installs resolving Typer 0.26 or newer. Typer began vendoring its own Click in 0.26, which left the cached command tree empty; it is now rebuilt correctly.
0.20.3 - 2026-06-22
Features
-
release: Generate and publish checked-in changelogs for the CLI
The release flow produces two checked-in changelogs via remotive-release (a curated CHANGELOG.md for the docs site and a full CHANGELOG.dev.md, both with commit bodies), replacing the git-changelog setup. A dedicated workflow publishes the checked-in changelog to the docs site on push to main, and DEV.md recommends the basecamp commit-msg hook.
0.20.2 - 2026-06-18
Features
-
Cloud now allows service-accounts to read organization info + features for an organization.
This makes it simpler to use a service-account locally since it can be activated, set default organization and get subscription status in the same way as a personal user.
0.20.1 - 2026-06-17
Bug fixes
- Improve error messages when instance file is missing
Features
- Bump RemotiveStudio to 1.20.0
0.20.0 - 2026-06-17
Bug fixes
-
studio: Verify macOS signature + notarization before install
The macOS install path skipped integrity verification entirely, relying on the no-quarantine extraction trick to run an unsigned/ad-hoc app. Now that the desktop app is Developer ID signed + notarized, verify it instead:
- _verify_macos_bundle runs codesign --verify --deep --strict and spctl --assess --type execute on the mounted .app; either failing aborts the install via _SignatureVerificationError.
- _stage_dmg verifies before copytree, so a tampered/improperly-signed download never reaches /Applications.
- macOS now records signature_verification success/failure (was "skipped"), matching the Linux Ed25519 path.
0.19.0 - 2026-06-16
Bug fixes
- Make index_yaml_to_data non-blocking
Features
-
topology: Add host-gateway mapping for docker runs
-
trace: Add --trace troubleshooting mode
Add a --trace flag that logs the underlying operations the CLI performs for troubleshooting. Supports decorator-based tracing, honest mkdir logging, and tracing of container commands, with secrets redacted from logged container commands.
0.18.0 - 2026-06-12
- The completion cache moves from the legacy location to $XDG_CACHE_HOME/remotive/. Users with shell completions installed may need to regenerate them on first run.
Features
-
topology: Use $id URL for workspace schema
The workspace marker (
remotive.yaml) now references its schema through aschemakey carrying the canonical versioned URL from the schema's$id:replacing the
remotive-topology-workspace:0.1identifier. Generated markers start with a yaml-language-server modeline so editors validate and complete them out of the box, and no longer include an emptydescriptionby default.Schemas are published to releases.remotivelabs.com at their
$idURL, versioned by the schema's own version instead of the CLI release version. -
XDG dirs and topology workspace commands
- BREAKING: The completion cache moves from the legacy location to $XDG_CACHE_HOME/remotive/. Users with shell completions installed may need to regenerate them on first run.
Honors the XDG Base Directory Specification for all CLI state. Configuration, cache, state, and data files now live under $XDG_CONFIG_HOME, $XDG_CACHE_HOME, $XDG_STATE_HOME, and $XDG_DATA_HOME (each sub-keyed by
remotive/); each kind can be overridden via REMOTIVE_CONFIG_DIR, REMOTIVE_CACHE_DIR, REMOTIVE_STATE_DIR, REMOTIVE_DATA_DIR. Existing state files at the legacy location are copied forward on first run with permissions clamped to 0600.Adds a workspace surface that materializes and inspects a
remotive.yaml-marked project root:remotive topology workspace init remotive topology workspace current
The marker file is described by a JSON Schema at
schemas/remotive-topology-workspace.schema.json. Legacy workspaces that only have the.remotive/directory get the marker backfilled on first touch (seesettings/migration/migrate_legacy_workspace_marker.py).Adds binary-dispatched topology lifecycle commands:
remotive topology build [--no-workspace] remotive topology clean remotive topology prune [--all]
buildwrites outputs under<workspace>/.remotive/build/by default; pass a positional<output_path>(must lie inside the workspace, unless--no-workspaceis set) to override.prune --allclears every workspace's topology cache root (reclaims orphans from moved or renamed workspaces).The Studio runtime API resolves the active instance YAML inside a workspace sandbox:
<workspace>/.remotive/instances/(canonical), falling back to<workspace>/.remotive/cache/instances/for workspaces written by older binaries. Symlink escapes from the workspace are refused; the endpoint returns a workspace-relative POSIX string.Container subprocess invocation uses identity-mapped bind-mounts — host and container share the same paths for the workspace, config, and cache — and pins those paths via REMOTIVE_<KIND>_DIR env vars inside the container. Supported on WSL2, macOS, and Linux.
0.17.2 - 2026-06-08
Features
-
studio: Harden desktop install — version validation, interactive-only installs, audit log
- Validate --desktop-version (strict ASCII semver, max 32 chars) via Typer callback, and fail closed on a malformed remotely-resolved "latest" so no unvalidated string reaches asset names, release URLs, or paths.
- Installs are interactive-only: without a TTY nothing is ever downloaded or installed — an existing install launches as-is (no update check), a missing install is an error. Removes --desktop-force-install.
- Append a JSON-line audit entry (0o600, in the install state dir) for every install action: action, version source, version, signature verification result, outcome (completed/failed/aborted/declined/refused), user.
Implements OPLANE_REQ-00085620, OPLANE_REQ-00085622, OPLANE_REQ-00085627.
0.17.1 - 2026-06-08
Bug fixes
- Add no-cache header to studio SPA files
Features
- Added endpoint to check broker/topology health(up/down)
0.16.1 - 2026-06-03
Bug fixes
-
Improved checks to determine if a graphical environment is available on linux
-
Allows to retry the pkce code max 3 times to allow for copy-paste issues
-
User Input Validation for PKCE Verification Code in Token Exchange OPLANE_REQ-00080722
Also printing server response in error instead of guessing.
-
Trust XDG_SESSION_TYPE=x11/wayland as a graphical session fast-path
Skips the xdpyinfo probe when logind reports an unambiguous graphical session. Unset/tty values still fall through to the DISPLAY check and probe, so WSL/containers/non-systemd keep their current behavior.
Follow-up to #291.
-
Always show hint about --no-browser even if we think that a browser window was opened.
0.16.0 - 2026-06-01
Bug fixes
-
cli: Set cache dir for custom topology CLI cmd
Make sure to explicitly set cache dir using REMOTIVE_CACHE_DIR env var when calling topology CLI through remotive CLI with a custom command argument. This forces the cache to be populated in the legacy directory ./remotive/cache
Features
-
Adding --with-metrics flag
Requires support for this in remotive-topology
0.15.1 - 2026-05-22
Bug fixes
-
studio: Repair desktop embedded mode on direct launch (not with cli)
macOS GUI apps launched from Spotlight don't inherit the user's shell env, so REMOTIVE_STUDIO_DESKTOP_ENABLED was missing when the Electron app re-spawned the CLI — embedded mode fell back to HTTP and both the CLI and Electron opened a browser window. Drop the toggle check from _embedded_mode_enabled(); REMOTIVE_CLI_RUN_EMBEDDED alone is enough, since only the Electron spawn path sets it.
Also reject --desktop with click's standard "No such option" error when the feature toggle is off, via an option callback.
0.15.0 - 2026-05-21
Features
-
studio: Install RemotiveStudio Desktop on demand and launch with --desktop
Adds a --desktop flag to
remotive studiothat installs the RemotiveStudio Desktop Electron app (if missing) and spawns it detached, forwarding the workspace path and --broker-url. The desktop app then re-invokes the CLI with REMOTIVE_CLI_RUN_EMBEDDED=1, which serves the SPA over HTTPS using the local cert and emits a JSON {event:"ready", url, version} handshake on stdout for the Electron side to connect on.Installer (studio/app_install.py):
- Linux (x86_64, arm64) and macOS (arm64); native Windows rejected, WSL2 treated as Linux.
- Downloads from releases.beamylabs.com, then on Linux verifies an Ed25519 signature over a SHA-256 sidecar using a public key bundled in the CLI. The key's fingerprint is pinned in source so a swap of just the .pem cannot redirect trust; rotating the signing key requires a CLI release that updates both. The sidecar must name this artifact (guards against replaying a signed hash from a different file) and the digest is checked with hmac.compare_digest.
- macOS: the Linux signing pipeline doesn't cover DMGs yet. The DMG is downloaded over HTTPS, mounted via hdiutil, and copy-installed via shutil.copytree — none of which set com.apple.quarantine, so Gatekeeper never engages and the ad-hoc-signed bundle runs. A user-downloaded DMG opened from Finder would still hit Gatekeeper; the "unsigned but works" property only holds because the CLI is the install path. Real Developer ID signing + notarization is a follow-up if/when the DMG becomes a public-download artifact.
- Install is atomic: stage to a sibling dir, backup-rename the target, rename staging into place, rmtree the backup. A failed download leaves the existing install untouched.
- Linux post-install writes a .desktop entry + icon and refreshes a bin symlink at ~/.local/bin/remotive-studio-desktop — but only if that path is unset or already points into our managed dir. A real user file at that path is never clobbered.
- If the install is current but the .desktop entry, icon, or bin symlink is missing, post-install re-runs to restore them without redownloading.
- Concurrent installers serialize on an flock around the state dir to avoid racing on the atomic-swap rename.
Studio HTTPS serving (studio/start.py):
- Embedded mode listens on https://localhost:<port> using the server-key/full-chain from settings.cert_paths, validated through file_io.validate_restrictive_file before being handed to uvicorn.
- Browser mode is unchanged HTTP.
- Stale-launch detection: with stdio fully detached we have no IPC signal, so we sleep 1.5s and check if Electron is still alive. Heuristic — a slow-crashing launch escapes detection.
Studio API (studio/api/topology_runtime.py):
- Passes the per-broker verify (from broker.lib.helper. resolve_https_localhost_verify) through app state into the grafana probe so https://localhost brokers backed by the self-signed CA validate.
Studio mount (studio_mount.py):
- REMOTIVE_STUDIO_SPA_PATH dev-override: serve a built SPA from a chosen directory instead of the packaged UI, for iterating on the SPA without rebuilding the CLI.
-
studio: Gate desktop app behind REMOTIVE_STUDIO_DESKTOP_ENABLED
Adds a preview-feature toggle for the RemotiveStudio Desktop launcher. The desktop install + spawn path is not ready for GA, so until the toggle is flipped on:
- --desktop is hidden from
remotive studio --help. The Typer option'shidden=is evaluated against the env var at command registration, so the flag only surfaces once the env var is set in the user's environment. - A runtime check rejects --desktop with a clear error if a user discovers and passes the (still-accepted-but-hidden) flag without the env var set. Click accepts hidden options on the command line, so visibility alone isn't enough — the runtime check is what actually gates the feature.
- Embedded mode (REMOTIVE_CLI_RUN_EMBEDDED=1, set by the Electron app when it re-invokes the CLI to serve the SPA over HTTPS) is also gated on the same toggle. Without this, a stray REMOTIVE_CLI_RUN_EMBEDDED in the environment could opt a CLI run into HTTPS embedded mode while the feature is supposed to be off.
The toggle accepts the same truthy values as other CLI feature flags ("true", "1", "yes", "on"). Removing the toggle later is a one-line revert per file.
- --desktop is hidden from
-
tls: Provision local TLS certs and gRPC trust for HTTPS localhost
Generates a self-signed CA + server cert lazily via trustme on first settings access (stored under ~/.config/remotive/certs/ with 0700/0600 on POSIX), then exposes them via Settings.cert_paths. The CA, server cert, and server key are consumed by any localhost HTTPS server we run — the local broker on https://localhost:50443 and the Studio backend serving the SPA over HTTPS in embedded mode.
Wires gRPC to trust both system roots and the local CA in the same process: ensure_grpc_trust_bundle() runs once at CLI bootstrap and writes a combined certifi + local-CA bundle, pointing GRPC_DEFAULT_SSL_ROOTS_FILE_PATH at it. gRPC C-core caches that file on first SSL credential creation, so the bundle has to be in place before any TLS channel is built — handling it once at startup rules out the "did we remember to call configure before opening this channel?" hazard. Operator-supplied GRPC_DEFAULT_SSL_ROOTS_FILE_PATH is honored.
For requests, resolve_https_localhost_verify(url) returns the local CA path for https://localhost endpoints (and True elsewhere) so cloud / corporate-proxy setups remain untouched and REQUESTS_CA_BUNDLE keeps working.
Also adds validate_restrictive_file() — refuses to load a cert/key unless it's a 0600 regular file owned by us, sitting under a 0700 parent dir owned by us. Used before handing key material to a TLS stack. lstat on both the file and the parent guards against symlink swaps.
Bumps remotivelabs-broker to ~=0.13.8 and adds trustme + certifi as runtime deps.
0.14.1 - 2026-05-21
Bug fixes
-
search: Silence luqum PLY LALR warnings on import (luqum #115)
-
studio: Serialize gRPC and subprocess to avoid fork race
The studio FastAPI process had two thread-pool sides racing on fork(): gRPC AIO calls in /runtime/* ran on the event loop while sync subprocess.run() in /files/, /environment, /search/ ran on anyio threadpool workers. When fork() landed while a gRPC RPC was in flight, gRPC C-core's pre-fork handler bailed out ("fork_posix.cc:71 Other threads are currently calling into gRPC, skipping fork() handlers") and the parent could deadlock.
Convert every studio handler that shells out to async def, route the subprocess through asyncio.create_subprocess_exec, and gate both the gRPC RPCs and the fork itself with a process-wide asyncio.Lock on app.state. Lock is held only across the fork instruction (not the full subprocess lifetime) so concurrency is preserved elsewhere.
The sync run_topology path is kept for the Typer CLI; only the studio server takes the new run_topology_async path.
-
studio: Sanitize subprocess errors and add timeouts
Async subprocess calls in the studio API leaked unstructured stderr, stdout, and exception strings into HTTP 500 responses (file paths, stack traces, command args) and had no timeout, so a wedged child could pin a server slot indefinitely. Add a 120s default timeout on run_subprocess_async (600s for the docker pull), kill the child and raise TimeoutExpired on overrun, decode with errors="replace", and log failures server-side. Studio handlers now map TimeoutExpired to HTTP 504 and return generic messages for unparseable stderr — the JSON-structured stderr contract from the topology CLI still forwards as 400.
Closes OPLANE_REQ-00064396.
Refactor
-
studio: Collapse sync topology runner into async wrapper
The fork-race fix introduced parallel sync and async paths through
run_in_container.py(spinner, container runner, top-level dispatcher). Drop the sync versions and route the Typer CLI throughasyncio.run(run_topology_async(..., timeout=None))so there is one implementation. Also trim the verbose lock comments at the studio call sites — the lock's docstring at its definition carries the rationale.
0.14.0 - 2026-05-18
Bug fixes
- Removed old "remotive tui" function
Features
-
mock-broker: In-process gRPC mock broker for TUI workflows
Replaces
search/mock_indexwith a real gRPC server implementing the Network/Restbus/System services. Synthesises namespaces, frames, and distribution streams so the TUI can be exercised end-to-end without a live broker.python -m remotivelabs.cli.mock_broker(orpoe mock-broker) to run it standalone.- Wired into the dev deps (
pytest-xdist,pytest-flakefinder,ipython) and excluded from the wheel viasource-exclude. pytestnow runs with-n autofor parallelism.
-
search: Lucene grammar + unified AST
The TUI gains Lucene query syntax.
name:foo OR -unit:degC, regex/RPM\d+/, ranges, and parens.REST and MCP keep their existing wire contract (
field:value,f1,f2:valuecomma-prefix multi- field,operator=or,substring=true) and we don't pass this to Lucene yet. We adapt a bit to the new things in the AST, this made searching for numbers work, e.g. cycle time as well as getting suggestions for senders/receivers. -
tui: Rebuild the broker explorer end-to-end
Reshapes
remotive broker --uion top of the existing signal browse / live values view:- New capabilities — restbus publish + plan modals, an in-app help
screen, a command palette, and Lucene-syntax search
(
name:foo OR -unit:degC, regex, ranges). - Restructured input — one search bar drives all navigation; marks let you pick signals across multiple queries and feed them into the live view, restbus modal, or publish modal.
- Restructured layout — sidebar, tree, detail, and live view are now independent widgets sharing a single App-owned broker connection, so reconnects, namespace activity, and subscription lifetimes are handled centrally instead of per pane.
- New capabilities — restbus publish + plan modals, an in-app help
screen, a command palette, and Lucene-syntax search
(
Refactor
-
search: Drive SQLite schema from Column dataclass
Adding a searchable/tokenized column is now one line in columns.py instead of edits across schema.py, index.py, and the FTS triggers. Drops the dead in-memory migration loop in the same swing.
0.12.0 - 2026-05-15
Bug fixes
-
Read instance files under two locations, one contains the hash(workspace) id
This is due to a bug in topology-cli that writes it under this location. Lets consider how and when we solve this. Related to cache dir etc due to bazel compatibility