Skip to content
Buy · $14.99 Opens the GitHub repository in a new tab. The signed build is a separate download; see the README for what is in each.
Changelog

Bastion 1.6.0

Version 1.6.0 ·

Added

  • Eleven more servers in the catalog. MongoDB, DBHub, Kubernetes, Context7, Firecrawl, Exa, Tavily, Playwright, Supabase, Netlify and Apify. These are the first entries published by their own maintainers rather than by mgcrea, so each row now says whose it is.

    The write gate had to learn two things to hold across them. MongoDB, DBHub and Kubernetes name their switch as the thing it disables rather than the thing it allows, so a profile's write toggle is resolved against each server's own polarity instead of one assumed for all. Playwright, Supabase, Netlify and Apify take no argv at all, which leaves no variable for Bastion to set: those are gated by tool name instead, and the question of whether a server has a write path now reads both mechanisms rather than one.

    Their protocol dialect is measured rather than declared. A live handshake asking for 2026-07-28 makes each server answer with its own newest, where asking for 2025-06-18 would only have echoed the request back; all eleven land on 2025-11-25.

  • An update path on Bastion's own server. The window has had one since the catalog became editable — Check for updates, then Update to x — and an agent driving Bastion through bastion had no way to reach it: install_server adds a catalog entry and refuses anything already in the list, so a server that was installed was a server nothing could move.

    Two tools, in the order the pane asks in. check_server_update runs npm's own --dry-run against the installed tree and writes nothing, so it sits on the read side of the write gate; the answer lands under update in get_server, and list_servers carries update_available on any row a check found a newer version for. update_server resolves the package at latest again and re-downloads it — which is also the retry for a download that failed and the repair for a tree npm would rebuild, because re-resolving is all any of those three ever did.

    Both report the state a version number alone gets wrong. With a minimum package age set, npm resolves latest to the newest version old enough, which can be older than what is installed — so pinned-older is its own machine-readable state and says which direction pressing on would go, rather than offering an update that is a downgrade.

    Neither runs on a timer. Bastion reaches the registry when something asks it to, and update reads unchecked until something has.

Changed

  • The sidebar lists the clients you actually have. Every client Bastion knows how to configure used to get a row whether or not the Mac had it, so most people were shown a list of editors they had never installed, each with a status dot reporting on a file that does not exist. The Clients section now shows the installed ones and disappears entirely when there are none.

    Installed is asked of LaunchServices first, so an editor in ~/Applications or on a second volume counts, and an editor installed this morning counts before it has written any config. The config directory is the fallback, for the two clients that are a command rather than an app.

    Nothing about what can be wired has narrowed. wire_client still resolves against the whole list, and wiring a client that is not installed yet is allowed — it writes the config that client will read on first launch. list_clients filters the same way the sidebar does but then says what it left out, naming the absent ids in not_installed rather than dropping them silently; include_not_installed asks for their full rows, with the paths their configs would live at. A window can afford to say nothing about a client you do not have; an agent deciding what it may wire cannot.

Fixed

  • scripts/builtin-check.sh honours BASTION_PORT. It read the variable for its own requests and never passed -gatewayPort to the build it launched, so on a machine already running Bastion the build under test failed to bind, every assertion landed on the other copy, and the run failed reporting that its own fixture profiles did not exist. audit-listener.sh had already been fixed for this; this is the same one line.