[
  {
    "version": "2.9.0",
    "channel": "prod",
    "build_id": "v2.9.0",
    "prefix": "v2.9.0",
    "date": "2026-07-16T00:23:04.908Z",
    "git_sha": "1036edb417e56dd38ecbc4be704b1b0caf47ee5a",
    "run_id": "29459754413",
    "note": "",
    "notes_md": "### Added\n\n- **Linux builds (Debian/Ubuntu).** The release pipeline now ships a\n  `Transit_<version>_amd64.deb` (x86_64; Ubuntu 24.04+ / Debian 13+)\n  alongside the macOS and Windows installers, hosted at\n  [downloads.transitai.app](https://downloads.transitai.app) with a stable\n  `/download/linux-deb` always-latest link and the same `SHA256SUMS.txt`\n  integrity story. In-app auto-update remains macOS/Windows-only — the\n  Tauri updater can't swap a `.deb` — so on Linux the update banner and\n  periodic checks are disabled and Settings → Updates links the downloads\n  page instead. Browser sign-in round-trips correctly into the running app\n  (the package ships a desktop entry that passes the `transit://` callback\n  URL through to the app — `Exec … %U`).",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.9.0_aarch64.dmg",
        "sha256": "d57f56a5a076adc680ae05fc3f032f6e3b5edef6b517f85a667d3ba4bbd88ec7",
        "size": 11413572
      },
      "linux_deb": {
        "name": "Transit_2.9.0_amd64.deb",
        "sha256": "f51938aa9cfe276834e3d895b14aec91025d4b7c1cf294a72eed7ff429dac983",
        "size": 13595250
      },
      "windows_nsis": {
        "name": "Transit_2.9.0_x64-setup.exe",
        "sha256": "70f215d92bdbb0a05e16eeda379b0e1ec6edd087f8ebef4e5a5f09c66a1a581f",
        "size": 7112096
      },
      "windows_msi": {
        "name": "Transit_2.9.0_x64_en-US.msi",
        "sha256": "8fb5a427eb31fe1d87c088c39d8e446f9ca61e33bbf3e73b3a11015de4ed4035",
        "size": 10473472
      }
    }
  },
  {
    "version": "2.8.1",
    "channel": "prod",
    "build_id": "v2.8.1",
    "prefix": "v2.8.1",
    "date": "2026-07-15T14:10:58.756Z",
    "git_sha": "3f4e7c4a1cd8290b32919fac55719048c7ce3618",
    "run_id": "29420230754",
    "note": "",
    "notes_md": "### Added\n\n- **Multi-select + \"Launch all\" in the sessions sidebar.** Select\n  several connections with Shift-click (range) or Cmd/Ctrl-click\n  (toggle), then right-click → **Launch all (N devices)**; or\n  right-click a group folder → **Launch all in group** to open every\n  connection under it, subgroups included. Tabs appear as each device\n  connects, a *Connecting… X of N* banner with a **Stop** button\n  tracks progress, and one failed device doesn't stop the rest — \n  failures roll up into a single summary toast. Connects run\n  sequentially so first-contact host-key prompts and legacy-crypto\n  approvals appear one at a time.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.8.1_aarch64.dmg",
        "sha256": "2bc27e61b17dd9575096d526823687184fe3f258c779a3d2066273173644f8d2",
        "size": 11412256
      },
      "windows_nsis": {
        "name": "Transit_2.8.1_x64-setup.exe",
        "sha256": "0ac36baf4bf709609ed17bc295477c11012d4c4ce81de7f3162cdc2b6d61679b",
        "size": 7118440
      },
      "windows_msi": {
        "name": "Transit_2.8.1_x64_en-US.msi",
        "sha256": "a78e4bcd30d88b43895622b26b27d7df79fd7ac75d2422f5cd9c4686a313e5ed",
        "size": 10473472
      }
    }
  },
  {
    "version": "2.8.0",
    "channel": "prod",
    "build_id": "v2.8.0",
    "prefix": "v2.8.0",
    "date": "2026-07-13T02:21:47.062Z",
    "git_sha": "c8761a8b94a6c542a3ef80224c768b712670e977",
    "run_id": "29218271945",
    "note": "",
    "notes_md": "### Added\n\n- **Transit Classic theme** — the previous default color scheme,\n  preserved unchanged as a selectable theme (Settings → Appearance)\n  for anyone who prefers the original neutral look.\n\n### Changed\n\n- **New default look — Transit brand colors.** The built-in Transit\n  Default theme now wears the Transit AI brand palette: ink-black\n  surfaces with subtly raised panels, teal primary buttons, electric-\n  blue focus rings, and matching terminal accents (teal cursor, brand\n  blue/cyan ANSI colors). Applies only to the default theme — if you\n  picked any other theme it is untouched, and the old default lives on\n  as **Transit Classic**. The Max-tier account badge also trades\n  violet for teal (the brand retired purple).\n- Editing an SSH-key auth profile now prefills the private-key file\n  path, so changing the username or passphrase no longer forces\n  re-browsing for a key file the profile already points at.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.8.0_aarch64.dmg",
        "sha256": "9a0891cfddeb999bd9e9cf2cf603d3f86cd3a1e4e872b72926763102985e2c0f",
        "size": 11411963
      },
      "windows_nsis": {
        "name": "Transit_2.8.0_x64-setup.exe",
        "sha256": "a664d58e7a881b7b08604541edebd3d3268cb5166122127bb1f486477dc28c12",
        "size": 7114264
      },
      "windows_msi": {
        "name": "Transit_2.8.0_x64_en-US.msi",
        "sha256": "8c76ced69a82dbc7f8e07656a7a491534c9027ad2196596839987f7d77c10404",
        "size": 10473472
      }
    }
  },
  {
    "version": "2.7.0",
    "channel": "prod",
    "build_id": "v2.7.0",
    "prefix": "v2.7.0",
    "date": "2026-07-11T00:04:49.309Z",
    "git_sha": "b030e1017babe4c29dfd8d7560e3565c29cd9ce7",
    "run_id": "29130742560",
    "note": "",
    "notes_md": "### Added\n\n- **Multiple button bars** — keep separate named button sets (say, a\n  VOIP bar and a routers-and-switches bar) and flip between them with\n  the new up/down arrows on the left of the button bar, or jump\n  straight to one by clicking the bar's name. Right-click the bar for\n  New / Rename / Delete bar. Your existing buttons carry over\n  automatically into a \"Default\" bar; with a single bar the strip\n  looks exactly as before.\n- **Per-chat device scope** — a new picker in the AI chat header\n  (next to the model picker) restricts that chat's AI to the devices\n  you check, the same way the broadcast bar's target list works.\n  Scope a chat to the two switches you're debugging and the AI can't\n  see, read, or propose commands against anything else — enforcement\n  is in the Rust core, not just the UI, and a device you untick mid-\n  run is cut off immediately (even if an approval dialog was already\n  open). Default is unchanged: new chats see all devices. Pairs\n  nicely with multi-chat tabs — one chat per project, each scoped to\n  its own gear.\n- **GPT-5.6 family** in the model picker (cloud rollout 2026-07-10):\n  **GPT-5.6 Luna** (Easy), **GPT-5.6 Terra** (Medium), and **GPT-5.6 Sol**\n  (Advanced). Sol is included on Pro and Max; on Operator it unlocks with\n  your own OpenAI key (BYOK), the same way Opus 4.8 does with an Anthropic\n  key. GPT-5.5 and GPT-5.4 mini retired — existing chats and stale\n  selections are served transparently by the closest 5.6 successor, and\n  the picker refreshes automatically.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.7.0_aarch64.dmg",
        "sha256": "fbf1aaa190c0d706d862af419fdcfe154ec034d1b312cf1eec0706d8b32cd7c3",
        "size": 11412899
      },
      "windows_nsis": {
        "name": "Transit_2.7.0_x64-setup.exe",
        "sha256": "0e4f395a3fbd2bac49559001339ef1b69dd3153338f2cad698f35aaa13f833b1",
        "size": 7084256
      },
      "windows_msi": {
        "name": "Transit_2.7.0_x64_en-US.msi",
        "sha256": "e301f7a71f8be0e162ea1419902200926be0fd1df6e089ac761456c4618b92a0",
        "size": 10457088
      }
    }
  },
  {
    "version": "2.6.3",
    "channel": "prod",
    "build_id": "v2.6.3",
    "prefix": "v2.6.3",
    "date": "2026-07-09T23:32:53.778Z",
    "git_sha": "fedd6b529624cf37feea9acd8854e3bd0d9af08d",
    "run_id": "29056562473",
    "note": "",
    "notes_md": "### Added\n\n- The multi-line paste dialog's editor grew a **Find & Replace** row for\n  adapting pasted config templates before they're sent — swap a hostname,\n  VLAN, or IP across dozens of lines without leaving the confirm step.\n  Open it with the **Find & replace** button or **Cmd/Ctrl+F** while the\n  dialog is up. Matching is literal (no regex), with a live \"2 of 17\"\n  match counter, **Match case** and **Whole word** toggles (whole-word\n  treats `/` `.` `:` `-` as boundaries, so replacing `0/0/1` doesn't also\n  hit `0/0/10`), Enter / Shift+Enter (or F3 / Shift+F3) to step through\n  matches, and **Replace** / **Replace all** with a one-click **Undo**.\n  Escape closes the find row first, the dialog second. The dialog is\n  wider and the editor no longer soft-wraps long config lines (it scrolls\n  horizontally instead). The safety property is unchanged: what you paste\n  is exactly what's sent — edits, replacements and all.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.6.3_aarch64.dmg",
        "sha256": "72d1cee659452d976cf9e97645e4e9c0b11f7cb91d126a385d8f6c5579e9d6c5",
        "size": 11397794
      },
      "windows_nsis": {
        "name": "Transit_2.6.3_x64-setup.exe",
        "sha256": "0c60bc7365b7dbd4fef4c7056e7f1ce8e41a1385c78ad10d5ec4de56cc983168",
        "size": 7078488
      },
      "windows_msi": {
        "name": "Transit_2.6.3_x64_en-US.msi",
        "sha256": "363c1ec4682af4a7632b0f8536accf218335437473b315b4331012fbd5aa244f",
        "size": 10403840
      }
    }
  },
  {
    "version": "2.6.2",
    "channel": "prod",
    "build_id": "v2.6.2",
    "prefix": "v2.6.2",
    "date": "2026-07-08T00:38:37.316Z",
    "git_sha": "9fb61589ec86186c07e9652963939a4dd4eaf763",
    "run_id": "28908292427",
    "note": "",
    "notes_md": "### Added\n\n- Host-key rotation is now handled in-app. When a device's SSH host key\n  changes since the last connect (re-image, RMA, firmware re-key), Transit\n  shows a changed-key warning dialog with the pinned and new fingerprints\n  side by side instead of a dead-end error that pointed at hand-editing\n  `known_hosts.toml`. Replacing the pin takes two deliberate steps — tick\n  \"I've verified this key change is legitimate\", then the red\n  **Replace & connect** — and the pin is rewritten only after the\n  connection also authenticates, so a failed login never displaces a\n  good pin. Declining (or any attempt to dismiss the dialog) leaves the\n  old pin untouched and fails the connect with the familiar mismatch\n  error. There is intentionally no \"remember\" shortcut: every key change\n  gets its own confirmation.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.6.2_aarch64.dmg",
        "sha256": "b686fe18d73440d37d3d035a9e73be110b9d63f12fefc1c66effde490f896c9d",
        "size": 11856812
      },
      "windows_nsis": {
        "name": "Transit_2.6.2_x64-setup.exe",
        "sha256": "36e30104a9dab9ee095218ddf30e5b036eae3840d8779c3efa0d68eec412a995",
        "size": 7138328
      },
      "windows_msi": {
        "name": "Transit_2.6.2_x64_en-US.msi",
        "sha256": "c61be95255a5c79828156fe66c525736641102ee359be434fb8fd1f0145fff5d",
        "size": 10534912
      }
    }
  },
  {
    "version": "2.6.1",
    "channel": "prod",
    "build_id": "v2.6.1",
    "prefix": "v2.6.1",
    "date": "2026-07-07T21:14:34.139Z",
    "git_sha": "c74f7c3b017d578155d4d2c0679453379aea60cc",
    "run_id": "28898311467",
    "note": "",
    "notes_md": "### Added\n\n- Operator tier can now use Claude Opus 4.8 when BYOK is on with an\n  Anthropic key enrolled — the model runs on your own key, so it's\n  available without upgrading. The chat model picker shows Opus only\n  when BYOK is active for Anthropic; a hint points at Settings → BYOK\n  otherwise. Turning BYOK off (or clearing the key) mid-chat switches\n  the chat back to Sonnet with a notice, and a cloud rejection now\n  reads \"Opus needs your own Anthropic key\" instead of a generic\n  plan error. Requires the matching cloud release.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.6.1_aarch64.dmg",
        "sha256": "bab70225c23cda47e346ee77b6f25030f36ea7e5cf8c446190115d43b4c4fd64",
        "size": 11844761
      },
      "windows_nsis": {
        "name": "Transit_2.6.1_x64-setup.exe",
        "sha256": "2317b8d772343f7c79e627a5427f8eb28a87d3e2bc6f0656ce7e134b7a362cba",
        "size": 7133816
      },
      "windows_msi": {
        "name": "Transit_2.6.1_x64_en-US.msi",
        "sha256": "d675c2f3c848c38b4c9d9f0eb5cf55e1163fc32ec54c0cdcd3e57162e6985823",
        "size": 10518528
      }
    }
  },
  {
    "version": "2.6.0",
    "channel": "prod",
    "build_id": "v2.6.0",
    "prefix": "v2.6.0",
    "date": "2026-07-07T19:20:10.065Z",
    "git_sha": "6f0400fa08d3d2571a5350450f1e05e061d60721",
    "run_id": "28891424430",
    "note": "",
    "notes_md": "### Added\n\n- Free-trial support (dormant until the cloud launch flip): `/me` now decodes\n  the cloud's `trial` block; a bottom-left banner shows \"N days left in your\n  trial\" with an Upgrade Now action, and Settings → Billing gains a trial row +\n  Upgrade Now. Inert while the cloud's `TRIAL_ENABLED` flag is off — no UI\n  change for current users.\n\n### Changed\n\n- The bottom-left cards (update prompt, customer notice, trial countdown) now\n  stack in a single column that packs toward the corner — no more floating\n  gaps when one of them is dismissed or snoozed.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.6.0_aarch64.dmg",
        "sha256": "af371b0ffba0783838db47a3de27867ba5672fa2a2fe18347e476988091b8bce",
        "size": 11844184
      },
      "windows_nsis": {
        "name": "Transit_2.6.0_x64-setup.exe",
        "sha256": "354e46c11e0077ccdf03988395e98e91b86f4a8f9f985c0b06cf6d4b74db31ec",
        "size": 7141720
      },
      "windows_msi": {
        "name": "Transit_2.6.0_x64_en-US.msi",
        "sha256": "db0a032ead175d212f8d52e79d95276a862bb3f5dc40779de0fdbe87de621b95",
        "size": 10526720
      }
    }
  },
  {
    "version": "2.5.0",
    "channel": "prod",
    "build_id": "v2.5.0",
    "prefix": "v2.5.0",
    "date": "2026-07-06T16:16:57.714Z",
    "git_sha": "c195e05c42118d011eb9072c73a7aa1b137afbc7",
    "run_id": "28805027347",
    "note": "",
    "notes_md": "### Added\n\n- **Multiple concurrent AI chat tabs.** The chat panel now supports several\n  chats at once — a tab strip with a **+** button (also **⌘/Ctrl+T** or the\n  command palette's \"New chat\"), each tab its own conversation running its own\n  agent loop. Double-click a tab to rename it; the model picker is per-chat.\n  Chats keep running in the background — a long agent task in one tab keeps\n  going while you work in another, or even while the chat panel is collapsed.\n  - **Cross-chat notifications.** A chat that isn't the one you're looking at\n    surfaces a stacking, clickable card (bottom-right) and a **tab dot** —\n    amber when it needs command approval, green when its task finishes. Click\n    the card to jump straight to that chat. Approval always happens in that\n    chat's own modal (never a stolen pop-up), so two chats needing approval at\n    once can't collide.\n  - A setting (on by default) controls whether a completed prompt in an\n    unfocused tab raises a notification card.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.5.0_aarch64.dmg",
        "sha256": "87acd86f6d97ddd930097d2968e8a0db8a360ba878279217900eec63bac67ef6",
        "size": 11840153
      },
      "windows_nsis": {
        "name": "Transit_2.5.0_x64-setup.exe",
        "sha256": "746b8a82934ee0465b1afccebdb0b5d173a109da51ac784e2bbd21515a210cc0",
        "size": 7127728
      },
      "windows_msi": {
        "name": "Transit_2.5.0_x64_en-US.msi",
        "sha256": "dee26fb0b41296a1e7fb89b1d861ae3a40cdbe2f2723462b1df05502cf2b42df",
        "size": 10510336
      }
    }
  },
  {
    "version": "2.4.0",
    "channel": "prod",
    "build_id": "v2.4.0",
    "prefix": "v2.4.0",
    "date": "2026-07-06T14:37:25.518Z",
    "git_sha": "6748b6df67fd2ea876cf380a4ccbd43f5af2659e",
    "run_id": "28798573691",
    "note": "",
    "notes_md": "### Added\n\n- **Broadcast input bar — send a command to all sessions at once**\n  (SecureCRT-style). Enable it from **View → Broadcast Input**: a bar appears\n  at the bottom where a line you type is sent to every open session\n  simultaneously (press Enter). It targets all live sessions by default, with\n  a selector to exclude specific ones (e.g. a production box) and a live\n  \"Sending to N of M\" device count. A mouse-only **Interrupt all (^C)** button\n  sends Ctrl-C to every target — normal Ctrl+C in a terminal still goes only\n  to that one session. The bar is deliberately loud and red: it's human input\n  going to many devices at once, so the visible count is your confirmation.\n\n### Fixed\n\n- **App content no longer shifts left / clips its first column when the tab\n  strip scrolls.** After opening enough sessions for the scrollable tab\n  strip's arrows to show (v2.3.4), the whole workspace could shift a few\n  pixels left — clipping the first character of the sidebar entries, the tab\n  labels, and the terminal prompt (e.g. `AZ104-SW06-22>` showed as\n  `Z104-SW06-22>`). Cause: the tab strip's \"keep the active tab visible\"\n  logic used `scrollIntoView`, which scrolls *every* scrollable ancestor;\n  combined with a stray pixel of horizontal overflow in the shell layout, it\n  nudged the entire app sideways. The reveal now scrolls only the tab strip\n  itself, and the layout is hardened so nothing but the tab strip can scroll\n  horizontally. (Previously the only workaround was toggling the button bar\n  off and on, which reset the scroll.)",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.4.0_aarch64.dmg",
        "sha256": "3ae5a3e02157e25fc13630b4f32428d562d1c07190ecab8dbbd45bf9eb45e847",
        "size": 11836172
      },
      "windows_nsis": {
        "name": "Transit_2.4.0_x64-setup.exe",
        "sha256": "e7e85abcd75a174c3b4f553a49c229edd1f80a4315802a8da5de3696167787bb",
        "size": 7136544
      },
      "windows_msi": {
        "name": "Transit_2.4.0_x64_en-US.msi",
        "sha256": "8e4e63530ac33d9a1323de45b0ebfd3f0e4887eaec0e11dd16b453f4bee985bd",
        "size": 10502144
      }
    }
  },
  {
    "version": "2.3.5",
    "channel": "prod",
    "build_id": "v2.3.5",
    "prefix": "v2.3.5",
    "date": "2026-07-05T18:49:17.557Z",
    "git_sha": "c974511d472aedc9730a1d0cad0bccda2cb45fcf",
    "run_id": "28750758559",
    "note": "",
    "notes_md": "### Changed\n\n- **Clearer error when a device sends a malformed SSH handshake.** Some\n  switch firmware builds emit a key-exchange field that isn't valid\n  ASCII/UTF-8 (which the SSH standard doesn't permit), causing the\n  handshake to fail before any connection can be negotiated. Transit now\n  reports this as an actionable message pointing at a device firmware\n  update, instead of a cryptic low-level \"character encoding invalid\"\n  error. There is no in-app workaround — the malformed data arrives before\n  Transit can act — so a firmware update on the device is the resolution.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.5_aarch64.dmg",
        "sha256": "ce52d4a7c70f7b16bd3dd999ea7ac1c7cb50b1e3d017de815c5a9c5573c74309",
        "size": 11826588
      },
      "windows_nsis": {
        "name": "Transit_2.3.5_x64-setup.exe",
        "sha256": "052ef72448a64b658a233337d7680213c94f3f2ad54f007463b549535d226fcd",
        "size": 7116864
      },
      "windows_msi": {
        "name": "Transit_2.3.5_x64_en-US.msi",
        "sha256": "f21341cfbdc3d67c43b1bcdc5dd6ea014a66057e591d375cfd38eb936bb6f056",
        "size": 10502144
      }
    }
  },
  {
    "version": "2.3.4",
    "channel": "prod",
    "build_id": "v2.3.4",
    "prefix": "v2.3.4",
    "date": "2026-07-05T16:20:08.182Z",
    "git_sha": "2a58abad1100ae71553294630f11eacd5d550a90",
    "run_id": "28746656784",
    "note": "",
    "notes_md": "### Added\n\n- **Close all sessions.** A \"Close all tabs\" item on the tab right-click\n  menu disconnects every open session and clears the strip in one action,\n  with a single confirmation summarizing how many are still connected (or\n  no dialog at all when every tab has already ended). Requested by a user\n  running dozens of switch sessions at once.\n- **Scrollable tab strip.** When open tabs overflow the window, left/right\n  chevron buttons appear (MTPuTTY-style) to page through them; the active\n  tab always scrolls into view, and trackpad/horizontal-wheel scrolling\n  works too. Previously the strip clipped tabs off the right edge.\n- **Scrollable button bar.** The SecureCRT-style button bar is now a single\n  horizontally scrollable row with the same chevron affordance, instead of\n  wrapping into extra rows that ate terminal height.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.4_aarch64.dmg",
        "sha256": "79471ebb61bd74fbdb384997a368033c92ec5acc2da6b91b0d98685ac94d9121",
        "size": 11824144
      },
      "windows_nsis": {
        "name": "Transit_2.3.4_x64-setup.exe",
        "sha256": "30a3507a9665f6193c6c73a25c91c915477a1bded66a6a1e622529044abb3c7c",
        "size": 7121672
      },
      "windows_msi": {
        "name": "Transit_2.3.4_x64_en-US.msi",
        "sha256": "efaabe653d5f40b211a0de251e54b7b9c1d246fd5a419a0fb710830448495cc9",
        "size": 10502144
      }
    }
  },
  {
    "version": "2.3.3",
    "channel": "prod",
    "build_id": "v2.3.3",
    "prefix": "v2.3.3",
    "date": "2026-07-05T00:48:20.130Z",
    "git_sha": "e9e63f45f7630b8f4b78605c2c9d640759d9a186",
    "run_id": "28724501043",
    "note": "",
    "notes_md": "### Fixed\n\n- **Legacy SSH: group-exchange-only switches connect after the weak-crypto\n  opt-in.** The legacy (weak-crypto) path now requests Diffie-Hellman\n  group-exchange bounds a 2048-bit-era server can satisfy (min/preferred\n  2048; previously russh's default min 3072). BDCOM-based FS.com campus\n  switches that offer only `diffie-hellman-group-exchange-sha1` answered\n  the old request by disconnecting mid-handshake — the same error as\n  before the opt-in, so \"Connect Anyway\" appeared to do nothing. 2048-bit\n  GEX matches the `group14-sha1` strength the legacy list already\n  accepts; the strict path keeps russh's defaults.\n\n### Changed\n\n- **Connect errors now carry the device's own disconnect reason.** When a\n  device refuses the SSH handshake with a protocol-level disconnect\n  message, Transit surfaces that text (sanitized, length-capped) in the\n  connect error instead of a bare \"server disconnected during handshake\"\n  — so the error names the algorithm slot the device couldn't match,\n  whenever the device says so.\n- **Honest error when the opt-in isn't enough.** The handshake-interrupted\n  error no longer advises \"allow weak crypto when prompted\" (it can only\n  appear after weak crypto was already allowed); it now explains that the\n  device refused even the legacy algorithm set and points at device SSH\n  settings/firmware or a firewall/ACL.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.3_aarch64.dmg",
        "sha256": "d95352c5c077836fc51d6af5cd87dab430de6eb167be50ea9166ad688b2b8c9c",
        "size": 11827618
      },
      "windows_nsis": {
        "name": "Transit_2.3.3_x64-setup.exe",
        "sha256": "3377503f4515954ccf95ac2b488fc2c31759e8300be261c84335f420ca7db6a7",
        "size": 7120784
      },
      "windows_msi": {
        "name": "Transit_2.3.3_x64_en-US.msi",
        "sha256": "93dc8353d4078a5fd9f2cbf452551817cb4cda458ce71f00e1d0f98908df996c",
        "size": 10498048
      }
    }
  },
  {
    "version": "2.3.2",
    "channel": "prod",
    "build_id": "v2.3.2",
    "prefix": "v2.3.2",
    "date": "2026-07-04T15:10:35.061Z",
    "git_sha": "7ebc85ab443dfafcdd72d755574b0d16bc35c557",
    "run_id": "28709953640",
    "note": "",
    "notes_md": "### Fixed\n\n- **Legacy switches now actually connect after \"Connect Anyway.\"** v2.3.0\n  started showing the weak-crypto prompt for switches that drop the SSH\n  handshake (Cisco SG300/SG500, FS.com S5500), but the retry still failed with\n  \"handshake … interrupted before algorithm negotiation completed (key exchange\n  init failed).\" The cause was key-exchange preference: the legacy algorithm\n  list offered Diffie-Hellman **group-exchange** before the **fixed** groups,\n  and these switches answer a group-exchange request with a 1024-bit modulus —\n  below the 2048-bit floor our SSH library enforces — so the exchange failed (or\n  the switch dropped the connection) every time. Transit now prefers the\n  fixed-group `group14-sha1`/`group1-sha1` exchanges (which these switches also\n  advertise) over group-exchange on the legacy path, so the opt-in completes the\n  handshake. Weak crypto is still never used without the explicit per-device\n  prompt, and the strict default handshake is unchanged.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.2_aarch64.dmg",
        "sha256": "eb75bbd925ee1f06403c7d59e30b42c5f91a5629d79bb0e860abfccdcb0c119f",
        "size": 11818490
      },
      "windows_nsis": {
        "name": "Transit_2.3.2_x64-setup.exe",
        "sha256": "da9b49fd7abfc4410df3ff383fb6280f7b416edc51c5b8d4700804be1a7ddcf6",
        "size": 7121736
      },
      "windows_msi": {
        "name": "Transit_2.3.2_x64_en-US.msi",
        "sha256": "498fcdcda9b4ca961fae53be473f1cb25a2f229b15688724d07f20f49cd7ca5a",
        "size": 10489856
      }
    }
  },
  {
    "version": "2.3.1",
    "channel": "prod",
    "build_id": "v2.3.1",
    "prefix": "v2.3.1",
    "date": "2026-07-03T18:39:54.699Z",
    "git_sha": "021ca18420cde2d0fd4c3a294c34c59b10568c15",
    "run_id": "28677342789",
    "note": "",
    "notes_md": "### Fixed\n\n- **Windows: \"Hide\" no longer makes the window disappear with no way back.**\n  The Transit menu carried macOS-only **Hide / Hide Others / Show All** items on\n  Windows and Linux, where they have no equivalent — on Windows, \"Hide\" hid the\n  window with no Dock, tray, or \"Show All\" to restore it, so Transit kept\n  running invisibly and only Task Manager → End task recovered it. Those three\n  items are now macOS-only; on Windows/Linux the Transit menu is **About +\n  Exit**, and you minimize/restore the window the normal way. (Thanks to the\n  customer who reported this on Windows Server 2019.)",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.1_aarch64.dmg",
        "sha256": "17e5dfc8667909c3b5876bfc3f7d57d5f8fc9129a26db488cc5c20126c2aca1c",
        "size": 11810736
      },
      "windows_nsis": {
        "name": "Transit_2.3.1_x64-setup.exe",
        "sha256": "20a988717489775f155ad1259ea8387fa054a35cc7d847aef60cd5fb16795359",
        "size": 7122984
      },
      "windows_msi": {
        "name": "Transit_2.3.1_x64_en-US.msi",
        "sha256": "e746fb0cf39e8e20b8bff6048aeb5f4975ba3d15faf0cc63423d38e3a7cd97da",
        "size": 10493952
      }
    }
  },
  {
    "version": "2.3.0",
    "channel": "prod",
    "build_id": "v2.3.0",
    "prefix": "v2.3.0",
    "date": "2026-07-03T16:17:00.402Z",
    "git_sha": "74650e839b553b2dda1c60587a49034e9195c7f8",
    "run_id": "28671381664",
    "note": "",
    "notes_md": "### Added\n\n- **Export your sessions to CSV.** Right-click anywhere in the sessions\n  sidebar — the empty area, a device, or a group folder — and choose\n  **Export sessions…** to save every connection to a CSV. The file uses the\n  same columns Transit imports (`name,host,port,username,vendor,group,\n  key_path`), so it round-trips: export from one machine, import on another\n  (or back up your inventory). As with import, **secrets are never\n  exported** — the CSV carries only usernames and key-file paths, never a\n  password or key passphrase.\n\n### Fixed\n\n- **Connecting to legacy switches that require older SSH algorithms now\n  works.** Some older gear — Cisco SG300/SG500 small-business switches,\n  FS.com S5500 switches — drops the SSH connection during the handshake\n  instead of negotiating, because it offers only SHA-1 key exchange\n  (`diffie-hellman-group1-sha1`, `diffie-hellman-group-exchange-sha1`) or\n  `ssh-rsa` host keys. Transit used to surface this as a dead-end \"Key\n  exchange init failed\" / \"Disconnected\" error with no way forward. It now\n  recognizes it as a possible legacy-crypto requirement and shows the same\n  per-device **weak-crypto opt-in** prompt used for other legacy devices —\n  approve it (optionally \"remember for this device\") and the connection\n  retries with the legacy algorithm set. Weak crypto is still never enabled\n  silently, and a genuinely unrelated failure surfaces its real error after\n  the retry rather than being masked.\n- **\"About Transit\" now works on Windows.** The App → About Transit menu\n  item did nothing on Windows (it worked fine on macOS). It now opens the\n  About page (Settings → About) with the version and license. macOS keeps\n  its native About panel.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.3.0_aarch64.dmg",
        "sha256": "646e0eb2dc7fee153c8acb0616981ad09c83136eea5289abf8fd6251ad58536f",
        "size": 11816039
      },
      "windows_nsis": {
        "name": "Transit_2.3.0_x64-setup.exe",
        "sha256": "00364bf2fc653b00da651d6f1df9cba5a58331275f6f67c143189711a5714169",
        "size": 7112496
      },
      "windows_msi": {
        "name": "Transit_2.3.0_x64_en-US.msi",
        "sha256": "a16fa00bef150d9118dd1840a0b110f8994d1ed82b29d0816e2db6e246cc3557",
        "size": 10489856
      }
    }
  },
  {
    "version": "2.2.7",
    "channel": "prod",
    "build_id": "v2.2.7",
    "prefix": "v2.2.7",
    "date": "2026-07-03T00:58:18.463Z",
    "git_sha": "012ee5ba498b28bfcf51807e9fbbe4fbe10e5702",
    "run_id": "28630744488",
    "note": "",
    "notes_md": "### Added\n\n- **Import your MTPuTTY and MobaXterm connections.** The Import wizard\n  (sidebar → Import, or `⌘K` → \"Import connections…\") now reads **MTPuTTY**\n  server lists (`mtputty.xml`) and **MobaXterm** bookmarks (`MobaXterm.ini`\n  or a `.mxtsessions` export) alongside SecureCRT, OpenSSH `ssh_config`,\n  and CSV. Hosts, ports, usernames, folder hierarchy, and key-file paths\n  come across; SSH sessions import, and anything else (telnet/RDP/VNC/\n  serial, or MTPuTTY entries whose details live in a PuTTY saved session\n  in the Windows registry) is listed in the preview as skipped so nothing\n  disappears silently. As with every import source, **stored passwords are\n  never read or decrypted** — they stay in the source app, and you map\n  each deduped login to a Transit auth profile once.\n\n### Changed\n\n- **The terminal is free — signing in without a subscription no longer hides\n  the workspace.** Previously, a signed-in account with no active plan saw a\n  full-screen \"Subscribe to use Transit AI\" panel in place of the entire app.\n  The workspace (terminal, sessions, inventory) now always renders; the\n  subscribe prompt lives inside the chat panel, since only the AI assistant\n  requires a plan. Use Transit as a standard SSH/serial terminal at no cost.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.7_aarch64.dmg",
        "sha256": "ce6c44eba30af0d6f4ac22b49fd667ee89868ea0900eb2248bd34bbbb2145763",
        "size": 11801487
      },
      "windows_nsis": {
        "name": "Transit_2.2.7_x64-setup.exe",
        "sha256": "79d447f98ecb145a6f3e307693bcc80afd8ef1a9236f704e182672e595d9e2c1",
        "size": 7102176
      },
      "windows_msi": {
        "name": "Transit_2.2.7_x64_en-US.msi",
        "sha256": "85e8fb3860d103e9041dba9a9836dbbfb1b043daa3120794264bd5d48983b0a0",
        "size": 10481664
      }
    }
  },
  {
    "version": "2.2.5",
    "channel": "prod",
    "build_id": "v2.2.5",
    "prefix": "v2.2.5",
    "date": "2026-07-02T01:44:51.543Z",
    "git_sha": "c56ef35631e34bd9432e3d81299356ab15bb1c23",
    "run_id": "28558587469",
    "note": "",
    "notes_md": "### Security\n\n- **Policy gate hardening (defense-in-depth).** Strengthened the per-vendor\n  read-only command gate: it now denies native output redirection\n  (`>` / `>>`), catches a blocked pipe stage even when it is hidden behind\n  a quote (network CLIs don't parse shell quoting the way the gate's\n  allow-matcher does), tightens NX-OS `| sort` (write/exec flags),\n  backports the Cisco/Arista `show tech-support <destination>` block from\n  IOS-XR, and blocks Junos `monitor … write-file`. Every agent-proposed\n  command already requires explicit per-command user approval (Rule 3);\n  these refinements harden the automated gate that runs ahead of it.\n- **Broader redaction coverage.** Expanded the device-output → AI\n  redaction filter to more credential shapes: IPsec pre-shared keys\n  carrying an encryption-type token (`pre-shared-key local|remote 0|6\n  <psk>`), modern OpenAI project keys (`sk-proj-…`), SNMP community strings\n  on `snmp-server host` trap targets, credentials embedded in\n  connection-string / URL userinfo (`scheme://user:PASSWORD@host`), HTTP\n  Basic `Authorization` headers, and wireless/WPA pre-shared keys.\n- **Terminal paste review.** The multi-line paste confirmation dialog now\n  reliably intercepts keyboard paste (Cmd/Ctrl+V), so multi-line content is\n  always reviewed before it reaches the device.\n- **Additional hardening.** On-disk SSH private-key material is zeroized\n  from memory after use; the inventory loader rejects plaintext secrets\n  regardless of TOML key spelling (bare, quoted, or dotted); the SSH\n  connection's compile-time thread-safety assertion now covers its full\n  captured set; and the release build's symbol scan fails closed on a\n  stripped binary.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.5_aarch64.dmg",
        "sha256": "b33e8360b9068df4f2c1c2a88c2424d3d2e81c62b78aea4cc1b9e546c055dcde",
        "size": 11789076
      },
      "windows_nsis": {
        "name": "Transit_2.2.5_x64-setup.exe",
        "sha256": "e0afbcd1ad3322e77e2878e082dd6aafb0a2843ede542919832d78742b49e4af",
        "size": 7093856
      },
      "windows_msi": {
        "name": "Transit_2.2.5_x64_en-US.msi",
        "sha256": "61a0ff9154e4085168dcc8461be4ab6eac6e205c11804a11e1a962098cb90642",
        "size": 10465280
      }
    }
  },
  {
    "version": "2.2.4",
    "channel": "prod",
    "build_id": "v2.2.4",
    "prefix": "v2.2.4",
    "date": "2026-07-01T19:52:27.650Z",
    "git_sha": "7018f7da0399643338a791ede809e54fbf6b76ee",
    "run_id": "28543027715",
    "note": "",
    "notes_md": "### Changed\n\n- **Higher limits for importing large connection sets.** Raised the\n  connection-import file cap (SecureCRT `SCRTConfig.xml` / OpenSSH\n  `ssh_config` / CSV) from 8 MiB to 64 MiB, and the inventory file cap\n  from 256 KiB to 4 MiB (~10k+ devices). Importing hundreds-to-thousands\n  of sessions no longer trips a \"file is too large to import\" error or an\n  inventory-size ceiling.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.4_aarch64.dmg",
        "sha256": "2cbd000790490644cfde2e20def1a7adab9996ab3ef672b410e31da3d515854b",
        "size": 11785342
      },
      "windows_nsis": {
        "name": "Transit_2.2.4_x64-setup.exe",
        "sha256": "437f7c62cfc24c894003d573014305504611e79b71fc357d9b463cc41b42ab86",
        "size": 7083152
      },
      "windows_msi": {
        "name": "Transit_2.2.4_x64_en-US.msi",
        "sha256": "286c4891a2e93508f1c4b778745123f40c3627927bc931a7c2daba3c14ddc1c6",
        "size": 10452992
      }
    }
  },
  {
    "version": "2.2.3",
    "channel": "prod",
    "build_id": "v2.2.3",
    "prefix": "v2.2.3",
    "date": "2026-07-01T16:17:05.041Z",
    "git_sha": "b0f151d51c154ac13f72693076362080399177d0",
    "run_id": "28529791929",
    "note": "",
    "notes_md": "### Security\n\n- **Further enhancements to modern secret redactions.** Extends the\n  device-output → AI redaction filter beyond device credentials to\n  cover common cloud/SaaS API tokens (GitHub, Stripe, Slack, OpenAI,\n  GitLab, and Google API keys), plus cleartext `line`/console and VTP\n  passwords and modern password-hash formats, so more secret material\n  is masked before it can reach the AI. Redaction remains one layer of\n  defense-in-depth alongside the per-command policy gate and approval\n  modal.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.3_aarch64.dmg",
        "sha256": "3c568b7d465f02c703d2391eabbe5ec2e8099266104f287695ee94f424fddf06",
        "size": 11785202
      },
      "windows_nsis": {
        "name": "Transit_2.2.3_x64-setup.exe",
        "sha256": "943567c1c3a1900944a54bab1015d4b9ab1e57bdbbe76745996963f0b98a858f",
        "size": 7089080
      },
      "windows_msi": {
        "name": "Transit_2.2.3_x64_en-US.msi",
        "sha256": "259d2f7a00a02d546f2d93d52c1026e85491749cc6f17a6a3a6c86399a76490d",
        "size": 10452992
      }
    }
  },
  {
    "version": "2.2.2",
    "channel": "prod",
    "build_id": "v2.2.2",
    "prefix": "v2.2.2",
    "date": "2026-07-01T02:35:51.397Z",
    "git_sha": "1496d78c63a8666498ce5aeeaa4eba0c2bb8ce1c",
    "run_id": "28488595734",
    "note": "",
    "notes_md": "### Security\n\n- **Enhanced vendor-specific redaction filter.** Broader, more reliable\n  redaction of platform-specific credential formats in device output\n  before it reaches the AI — covering password hashes, VPN pre-shared\n  keys, and BGP/OSPF/IS-IS/EIGRP routing-authentication secrets across\n  all supported platforms (Cisco IOS/IOS-XE/IOS-XR/NX-OS, Juniper Junos,\n  Arista EOS, and Palo Alto PAN-OS), plus a vendor-agnostic catch-all for\n  standard password-hash formats regardless of the surrounding command.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.2_aarch64.dmg",
        "sha256": "7292ea4580029ad529504b55081101e48a15c9440137c23b63e6a5dab769b10e",
        "size": 11773992
      },
      "windows_nsis": {
        "name": "Transit_2.2.2_x64-setup.exe",
        "sha256": "d82ba32790147c0b85d081cefdb6a7d669bd003c8736cdc65fd2e2601255374b",
        "size": 7074304
      },
      "windows_msi": {
        "name": "Transit_2.2.2_x64_en-US.msi",
        "sha256": "02672c343ce74311afc6498ce3f1ac49e6715c88239acab6357955438cdc0967",
        "size": 10461184
      }
    }
  },
  {
    "version": "2.2.1",
    "channel": "prod",
    "build_id": "v2.2.1",
    "prefix": "v2.2.1",
    "date": "2026-06-30T23:03:50.503Z",
    "git_sha": "4592e25582b5963ae17b99ad512d6985d01cc30c",
    "run_id": "28480197786",
    "note": "",
    "notes_md": "### Fixed\n\n- **You can now install an update from Settings → Updates.** \"Check for\n  updates\" there correctly detected new versions but offered no way to\n  install one — it now shows a **Download & Install** button (with inline\n  download/install progress) whenever an update is available, matching the\n  bottom-left prompt.\n- **The update prompt no longer disappears forever after \"Later.\"** \"Later\"\n  now means \"not right now, maybe next launch\" — the prompt re-appears the\n  next time you open the app while the update is still available. A new\n  **Skip this version** action permanently dismisses one specific version\n  (and only that one — a newer release still notifies you).",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.1_aarch64.dmg",
        "sha256": "76415297e76f6f5fc739d94c053e14a4ab28c035588248259d66a3523d16bd8c",
        "size": 11769109
      },
      "windows_nsis": {
        "name": "Transit_2.2.1_x64-setup.exe",
        "sha256": "d89b823043376c6bdde15671c79c960692cd514a4a3a7e31284e2977004d7d58",
        "size": 7079328
      },
      "windows_msi": {
        "name": "Transit_2.2.1_x64_en-US.msi",
        "sha256": "1e3d02b5b8b512158750d80e22dbd9c99fe7a4fbfe602e48aa3488a78c9b87f3",
        "size": 10457088
      }
    }
  },
  {
    "version": "2.2.0",
    "channel": "prod",
    "build_id": "v2.2.0",
    "prefix": "v2.2.0",
    "date": "2026-06-30T21:32:19.279Z",
    "git_sha": "52785e846522d536d8ef8966af83882551c44d62",
    "run_id": "28475636413",
    "note": "",
    "notes_md": "### Added\n\n- **Claude Sonnet 5.** Transit now offers **Claude Sonnet 5** — the new default\n  Sonnet for new chats across all plans. It's priced the same as Sonnet 4.6,\n  with a newer knowledge cutoff (January 2026) and the same 1M-token context.\n  Claude Sonnet 4.6 remains available in the model picker, and existing chats\n  keep whatever model you selected.\n\n### Changed\n\n- **Agent auto-approve is now chat-scoped, with a clearer approval modal.**\n  The \"auto-approve a matching regex\" affordance in the command-approval\n  modal now persists for the **life of the chat** (cleared when the chat\n  closes) instead of resetting after every message — approve `^show` once\n  and it holds for the rest of the investigation. It sits behind a\n  clearly-labeled, collapsed **\"Auto-approve matching commands? Expand\n  here\"** disclosure with its own dedicated button — kept deliberately\n  separate from the primary Approve so it can't be armed by a reflex click\n  (modal-fatigue mitigation, threat-model T18) — and the regex field is\n  pre-filled with `^show`. The per-vendor policy gate still runs on every command\n  regardless, and the affordance stays hidden/refused for generic-Linux\n  (unrestricted) and custom (BYOP) vendors, which require a per-command\n  click. Also closes a gap where a custom-vendor auto-approve was silently\n  ignored backend-side.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.2.0_aarch64.dmg",
        "sha256": "38f7e31adcb2936a6f87f9ca6ac6affb3820337528184fc355a36d848c04ce1c",
        "size": 11772427
      },
      "windows_nsis": {
        "name": "Transit_2.2.0_x64-setup.exe",
        "sha256": "b5f986cfe61b4b45d61ff1a954aabeced6a4676d19606f5f34c5a416bcb0aea7",
        "size": 7082840
      },
      "windows_msi": {
        "name": "Transit_2.2.0_x64_en-US.msi",
        "sha256": "1c71fe233070a5a5e7fa59b76d758e5f0c045f662ecebed149fffa476389e0f0",
        "size": 10465280
      }
    }
  },
  {
    "version": "2.1.0",
    "channel": "prod",
    "build_id": "v2.1.0",
    "prefix": "v2.1.0",
    "date": "2026-06-29T20:49:26.093Z",
    "git_sha": "78b4511bd6718a29c0d0f5340d1434085f1408b5",
    "run_id": "28400145960",
    "note": "",
    "notes_md": "### Added\n\n- **Cisco IOS-XR command policy** — seventh gated vendor. Read-only gate for\n  Cisco's carrier-grade OS (ASR 9000 / NCS / CRS / XRv), with XR-specific\n  shell-escape blocks: `run` (classic 32-bit/QNX task shell), `bash` (64-bit\n  eXR Linux root shell), `tclsh`, `script` (XR-7.x `script run` on-box\n  Python/bash automation), `admin` (System Admin VM), and `attach`\n  (per-node shell). Encodes the two-stage commit config model (`configure` /\n  `commit` blocked; XR has no `write` verb), hardens `show tech-support`\n  against its file-writing forms, and pipe-blocks the write/escape stages\n  (`| file`, `| redirect`, `| utility`, `| tee`, `| append`). Select it per\n  device via the inventory vendor `cisco_ios_xr`. Verified by an\n  allowed/blocked corpus, a no-bypass proptest, and cargo-mutants on the gate.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.1.0_aarch64.dmg",
        "sha256": "3452e8267029f4b0c7958b138410ed047d5ffb84584fea51efa96004fe0a93e0",
        "size": 11771280
      },
      "windows_nsis": {
        "name": "Transit_2.1.0_x64-setup.exe",
        "sha256": "2347976ded9846ad1983db0c381dca08a4095bb435cce641f64b8baa59aa46dc",
        "size": 7077024
      },
      "windows_msi": {
        "name": "Transit_2.1.0_x64_en-US.msi",
        "sha256": "f75993916a22f8fd58d28768f9eee847efc222dc63635eef22015b6c5cb2e8a0",
        "size": 10452992
      }
    }
  },
  {
    "version": "2.0.0",
    "channel": "prod",
    "build_id": "v2.0.0",
    "prefix": "v2.0.0",
    "date": "2026-06-28T16:25:59.252Z",
    "git_sha": "dbf9003fd959211520dd7499c0933e9ac1d515d8",
    "run_id": "28327971542",
    "note": "",
    "notes_md": "This release adds a version-aware **Terms & Privacy consent gate**. Signed-in\nusers who have not affirmatively accepted the current Terms of Service and\nPrivacy Policy — anyone who signed up before the sign-up consent checkbox\nexisted, and everyone after a future Terms change — are shown a one-time\nblocking screen and must click **I Agree** before using the app. Acceptance is\nrecorded server-side as an auditable consent record.\n\n### Added\n\n- **Terms & Privacy consent gate.** A blocking, non-dismissible screen replaces\n  the workspace when the signed-in account hasn't accepted the current\n  Terms/Privacy version. It links to the live Terms and Privacy pages and\n  records an affirmative \"I Agree\" before the app unlocks. New accounts that\n  accept at sign-up never see it; a future Terms revision re-shows it to\n  everyone exactly once.",
    "files": {
      "macos_dmg": {
        "name": "Transit_2.0.0_aarch64.dmg",
        "sha256": "be2eb920da5e00f175ca751daf397045a7fdc9f7879ecf71af8b5525f6cc6dce",
        "size": 11768758
      },
      "windows_nsis": {
        "name": "Transit_2.0.0_x64-setup.exe",
        "sha256": "e323d19893bd99752f005aa1f4823f74408855982b79816ca3f3c5f241634473",
        "size": 7076968
      },
      "windows_msi": {
        "name": "Transit_2.0.0_x64_en-US.msi",
        "sha256": "2fc4831089fc80db07b7e5be5c479bcda599c4199cbb8f341e80169c3ae2b7e0",
        "size": 10452992
      }
    }
  },
  {
    "version": "1.6.5",
    "channel": "prod",
    "build_id": "v1.6.5",
    "prefix": "v1.6.5",
    "date": "2026-06-26T15:56:26.850Z",
    "git_sha": "d9aff46ad92a78b3653ff04a17f33c8f6070b6bb",
    "run_id": "28248066952",
    "note": "",
    "notes_md": "This release rolls up the work versioned 1.6.4 (which was never tagged for\nproduction) together with the multi-line-paste focus fix.\n\n### Fixed\n\n- **Clear-terminal shortcut (⌘⇧K / Ctrl+Shift+K) now works on Windows and\n  Linux.** It previously only fired on macOS: the keystroke was wired solely to\n  the native menu accelerator, which the focused terminal swallows on\n  Windows/Linux (only macOS's global menu bar intercepts it first). Worse, when\n  the terminal had focus the chord was sent to the device as a `Ctrl+K`\n  kill-line instead of clearing. The shortcut is now handled in the app itself,\n  so it clears the active session on every platform — and no longer leaks a\n  keystroke to the remote device.\n- **The terminal cursor no longer disappears after a multi-line paste.**\n  Confirming (or cancelling) the multi-line paste dialog left keyboard focus\n  on nothing, so the cursor went hollow and you had to click back into the\n  terminal before you could type or press Enter. Focus now returns to the\n  active terminal on every way of closing that dialog.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.6.5_aarch64.dmg",
        "sha256": "5bc4f27fed9144ff1ca7abc27dc5865b38322a5bdc4a3b3d021c8f040b9fc449",
        "size": 11759138
      },
      "windows_nsis": {
        "name": "Transit_1.6.5_x64-setup.exe",
        "sha256": "d179c83d0c408955442b7d87eb3f5f0ca06de47d6cddbb7f649426ed2620a2dc",
        "size": 7067968
      },
      "windows_msi": {
        "name": "Transit_1.6.5_x64_en-US.msi",
        "sha256": "d942ef4cfdebae98411754a2f6853655bd8f47c2aaa6423636d8b9adbfbccbee",
        "size": 10440704
      }
    }
  },
  {
    "version": "1.6.3",
    "channel": "prod",
    "build_id": "v1.6.3",
    "prefix": "v1.6.3",
    "date": "2026-06-25T23:47:37.706Z",
    "git_sha": "5820316f063b8f8cbda2b2681c7bf2e85d33275a",
    "run_id": "28207246997",
    "note": "",
    "notes_md": "### Changed\n\n- **The \"Approve command?\" dialog now identifies the session by its tab name**\n  (e.g. `vEX1`, or your custom rename) instead of an internal identifier, so\n  it's clear which open session the agent wants to run a command in. The full\n  session id remains available on hover.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.6.3_aarch64.dmg",
        "sha256": "7d8dac0f610d3237b3f23cc10e393f567dbaf603ce9729e94da761f4265dd3bb",
        "size": 11757835
      },
      "windows_nsis": {
        "name": "Transit_1.6.3_x64-setup.exe",
        "sha256": "9a72890721bcb2a8c8ade2ba23bb4696c96ee76dc67e2a5babd2ef5a4a61451d",
        "size": 7059272
      },
      "windows_msi": {
        "name": "Transit_1.6.3_x64_en-US.msi",
        "sha256": "13c04cae58a7713730b7447c26d12544607292d0b422dc81419f5d01d249d76c",
        "size": 10444800
      }
    }
  },
  {
    "version": "1.6.2",
    "channel": "prod",
    "build_id": "v1.6.2",
    "prefix": "v1.6.2",
    "date": "2026-06-25T22:34:24.338Z",
    "git_sha": "22211934910fde620d49528d4d4c2bb5ec6184e8",
    "run_id": "28204253955",
    "note": "",
    "notes_md": "### Added\n\n- **A keyboard shortcut to clear the terminal.** Press **⌘⇧K** (**Ctrl+Shift+K**\n  on Windows/Linux), or use the new **View → Clear Terminal** menu item, to clear\n  the active session's screen and scrollback — the same action already on the\n  tab's right-click menu.\n\n### Changed\n\n- **A clearer notice when AI is paused by the usage safety limit.** If a burst of\n  unusually high usage trips Transit's safety limit, the chat now shows a calm\n  banner that explains it's a protective pause (not an outage), counts down to the\n  automatic unlock (~15 minutes), and offers a one-click **Resume now** — replacing\n  the old generic \"Transit Cloud is temporarily paused\" error. Heavy Operator/Pro\n  users also see a hint that a higher plan includes more headroom.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.6.2_aarch64.dmg",
        "sha256": "b6daa25a0519872c07fbcb342b87db7af5b859503999a4216edc43d85d698290",
        "size": 11759618
      },
      "windows_nsis": {
        "name": "Transit_1.6.2_x64-setup.exe",
        "sha256": "9d3a87d0ffff190815134cd8a47d7509fb9a855c311fe2e6fad67b14cfc19cea",
        "size": 7064400
      },
      "windows_msi": {
        "name": "Transit_1.6.2_x64_en-US.msi",
        "sha256": "834f1d17db8a589c3b8d6bea71f0c2e536795febd7096ebc53f9e68bd74b710c",
        "size": 10440704
      }
    }
  },
  {
    "version": "1.6.1",
    "channel": "prod",
    "build_id": "v1.6.1",
    "prefix": "v1.6.1",
    "date": "2026-06-25T13:18:43.788Z",
    "git_sha": "065d75ce697b81d91071950619a1b3f2299c5dc9",
    "run_id": "28172323745",
    "note": "",
    "notes_md": "### Added\n\n- **Bulk import now sets up your key-based logins for you.** When you\n  import from SecureCRT / `ssh_config` / CSV, every login that uses an\n  on-disk SSH key or an SSH agent can become a working auth profile in one\n  click. Transit checks each referenced key file (read-only) and, for\n  encrypted keys, asks for the passphrase right in the credential step —\n  saving it to your OS keychain (never the inventory file). Creating a\n  profile by hand is prefilled too: **+ New** opens already set to \"SSH key\n  file\" with the detected path and username filled in.\n\n### Fixed\n\n- **The import \"Map credentials\" step now fills the window** instead of a\n  narrow centered column, so long SSH key paths are fully visible (no more\n  truncated `/Users/…/id_ed25519`).",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.6.1_aarch64.dmg",
        "sha256": "0850c15a6c98c80296c7037dc0376d0e3a56deb7cbc9e0e207bb480df6eb1426",
        "size": 11735831
      },
      "windows_nsis": {
        "name": "Transit_1.6.1_x64-setup.exe",
        "sha256": "4e4309eedd42c0a6d827a93899043f4f8dbbc1dc7fb6f498337b780633408432",
        "size": 7060280
      },
      "windows_msi": {
        "name": "Transit_1.6.1_x64_en-US.msi",
        "sha256": "a49157f23eb11934918035c0c5ad21d07e830b550b6d34e589d608f1015a9886",
        "size": 10436608
      }
    }
  },
  {
    "version": "1.6.0",
    "channel": "prod",
    "build_id": "v1.6.0",
    "prefix": "v1.6.0",
    "date": "2026-06-24T22:28:03.475Z",
    "git_sha": "a4e198bcd31e3dda08f11dbe0fb5a02a8b5a0432",
    "run_id": "28133195813",
    "note": "",
    "notes_md": "### Added\n\n- **Sign in with an SSH key file (SecureCRT-style).** Create an auth\n  profile that points at a private key on disk — pick it with a file\n  browser, no `ssh-agent` setup required (a relief on Windows\n  especially). OpenSSH, PEM, and PuTTY `.ppk` keys all work; if the key\n  has a passphrase, enter it once and it's saved to your OS keychain\n  (never the inventory file). The key file stays where it is — Transit\n  stores only its path.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.6.0_aarch64.dmg",
        "sha256": "e3128e539364e086b4baf0596f31fd3c07de91dfb67efd62ee82ccf5222651b9",
        "size": 11747451
      },
      "windows_nsis": {
        "name": "Transit_1.6.0_x64-setup.exe",
        "sha256": "78e9108ef9f6a23c15ff12e2570e9daac524d676d805fe7c45888b05399e1660",
        "size": 7056144
      },
      "windows_msi": {
        "name": "Transit_1.6.0_x64_en-US.msi",
        "sha256": "72f68941077960f7d787d385d422d052de37318e4da4ebc4ab0d30667c430ee0",
        "size": 10428416
      }
    }
  },
  {
    "version": "1.5.1",
    "channel": "prod",
    "build_id": "v1.5.1",
    "prefix": "v1.5.1",
    "date": "2026-06-24T19:09:44.401Z",
    "git_sha": "2201df7f0eede97424ce5f6ef039ee44719ebecc",
    "run_id": "28122413599",
    "note": "",
    "notes_md": "### Fixed\n\n- **A half-typed command is no longer garbled when you switch session\n  tabs.** Typing a line without pressing Enter, switching to another\n  tab, and switching back could leave the prompt text and cursor\n  corrupted (e.g. `R1#This is a line` came back as `R1#This i`). Hidden\n  tabs are no longer re-measured while collapsed, so the in-progress\n  input line survives the round trip.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.5.1_aarch64.dmg",
        "sha256": "e337b1620ae617b166dd5a32f19430ac682134a236928ada606dffe0635272a8",
        "size": 11493182
      },
      "windows_nsis": {
        "name": "Transit_1.5.1_x64-setup.exe",
        "sha256": "2bad105fa3520ab151686c948f37264020b59590aec392131f6ff140b013dc81",
        "size": 6908152
      },
      "windows_msi": {
        "name": "Transit_1.5.1_x64_en-US.msi",
        "sha256": "5174e3e78840715306fe783ce842f2c03683437ddf95f1d81446bd185f8e0a93",
        "size": 10203136
      }
    }
  },
  {
    "version": "1.5.0",
    "channel": "prod",
    "build_id": "v1.5.0",
    "prefix": "v1.5.0",
    "date": "2026-06-23T19:10:15.032Z",
    "git_sha": "9cc75afcb6fd29598bab363ff43f7f5e9504d535",
    "run_id": "28048650771",
    "note": "",
    "notes_md": "### Added\n\n- **Works behind corporate TLS inspection.** Transit's connection to Transit\n  Cloud now trusts your operating system's certificate store by default, so it\n  keeps working on networks that inspect TLS traffic — a firewall's CA installed\n  in your system keychain/store is honored. A new **Settings → Network** tab adds\n  a **Strict TLS** toggle (off by default) that, when on, trusts only the\n  built-in public certificate authorities and refuses any inspected connection.\n  Takes effect on the next launch. SSH device connections use a separate trust\n  model and are unaffected.\n- **Actionable certificate errors.** When the server certificate can't be\n  verified, the account area now shows a clear message that deep-links to\n  Settings → Network, instead of an opaque transport error.\n\n### Changed\n\n- **Settings is now a gear in the sidebar.** Opening Settings is a one-click\n  gear next to the account chip, rather than hidden inside the account popover.\n\n### Fixed\n\n- **Terminal focus when switching session tabs.** Clicking another session's tab\n  (e.g. R1 → R2) now puts the cursor in that terminal immediately, instead of\n  requiring a second click into the pane. The v1.4.1 fix focused the pane the\n  moment it activated — before it was laid out and before the tab click released\n  DOM focus — so the focus didn't land; it's now deferred a frame so it sticks.\n  (The v1.4.1 button-bar focus hand-back was unaffected and keeps working.)",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.5.0_aarch64.dmg",
        "sha256": "027209ff02d18e9d228b9b497d09446727c517810c4c90e73cf925bd3e332ba0",
        "size": 11498564
      },
      "windows_nsis": {
        "name": "Transit_1.5.0_x64-setup.exe",
        "sha256": "8de7f92b38f67d1ecd403cc6e92f4cccf5781f2306b18a8c8e8a7ac5daf13c2e",
        "size": 6912928
      },
      "windows_msi": {
        "name": "Transit_1.5.0_x64_en-US.msi",
        "sha256": "16d568bd367c9a8c11c795cbf1e01ea9c21bf8ad6083aed0de6e973975715e95",
        "size": 10207232
      }
    }
  },
  {
    "version": "1.4.1",
    "channel": "prod",
    "build_id": "v1.4.1",
    "prefix": "v1.4.1",
    "date": "2026-06-23T01:53:00.564Z",
    "git_sha": "9dc6644f4e2cba96f86d90924d1f00c3b60ecf14",
    "run_id": "27995673019",
    "note": "",
    "notes_md": "### Fixed\n\n- **Terminal focus on tab click.** Clicking a session tab now puts the cursor\n  in that terminal immediately, so you can type without a second click into the\n  pane.\n- **Terminal focus after a button-bar press.** Sending a macro from the button\n  bar now returns focus to the active terminal (the button click no longer\n  leaves the cursor on the button).\n- **\"New device in this group\" now pre-fills the group.** Choosing *New device\n  in this group…* from a group's context menu correctly seeds the Group/Folder\n  field. Previously the field came up blank because the dialog stayed mounted\n  and ignored the group on reopen.\n\n### Changed\n\n- **Clearer New/Edit device dialog labels.** *ID* → **Friendly Name** (hint\n  *Router1*), *Port* → **SSH Port** (Transit is SSH-only), *Vendor* → **Vendor\n  — Policy Gate** (it selects the command policy gate, not just a label), and\n  *Group* → **Group/Folder**.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.4.1_aarch64.dmg",
        "sha256": "6fcf2e3cb83b6e918f47f82c0ce184ff52f3cda694016a346a8cc18ba9759975",
        "size": 10737707
      },
      "windows_nsis": {
        "name": "Transit_1.4.1_x64-setup.exe",
        "sha256": "69318a7e4421c4036cf26f0cbb7cb4ccdd7823c65819a8591fe3ab7ddf3cb1b1",
        "size": 6784968
      },
      "windows_msi": {
        "name": "Transit_1.4.1_x64_en-US.msi",
        "sha256": "61f9096623118150a8ef098254c212a1f16c6963b5d0f2d6121dde7c9aa6c81c",
        "size": 9986048
      }
    }
  },
  {
    "version": "1.4.0",
    "channel": "prod",
    "build_id": "v1.4.0",
    "prefix": "v1.4.0",
    "date": "2026-06-20T02:29:31.066Z",
    "git_sha": "52b8f68ab2a9bc9b0a6fe742f29d8493567969ac",
    "run_id": "27856888214",
    "note": "",
    "notes_md": "### Added\n\n- **Clear terminal.** Right-click a session tab → **Clear terminal** wipes the\n  visible terminal output and resets that session's backend scrollback ring, so\n  the embedded agent's `read_scrollback` returns only post-clear output. Works\n  for both SSH and serial-console sessions. (A keyboard shortcut may follow.)\n- **Confirm before disconnecting a live session.** The pane's **Disconnect**\n  button now asks first when the session is still connected, so a misclick can't\n  silently drop the connection. An already-ended tab's **Close** button is\n  unchanged (no prompt).\n- **Warn before quitting with an active session.** Quitting Transit — via\n  **Cmd+Q** or the window-close button — while an SSH/console session is still\n  **connected** pops a \"Quit anyway?\" confirm instead of silently dropping the\n  connection. Anchored to true liveness: a tab you `logout`/`exit`-ed from (its\n  channel is dead, even if the tab lingers) is safe and does **not** prompt.\n- **Button bar (SecureCRT-style).** A configurable toolbar of command buttons,\n  toggled from the new **View → Button Bar** menu. Each button sends a string to\n  the active session with SecureCRT's \"Send String\" escape codes — `\\r` (Enter),\n  `\\n` (newline), `\\p` (1-second pause), `\\v` (paste clipboard), `\\e`/`\\###`\n  (ESC/octal), `\\\\` (literal backslash) — so one button can fire a full command\n  plus Enter, or a multi-step macro. Right-click the bar to add a button or hide\n  it; right-click a button to edit or delete. Buttons persist locally. (v1 ships\n  a single shared bar; multiple named bars may follow.)\n- **Native application menu.** Transit gains a proper menu bar (App · Edit ·\n  View · Window) — primarily to host **View → Button Bar**, with the standard\n  Quit / Copy / Paste / Undo / Hide items so the usual keyboard shortcuts keep\n  working.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.4.0_aarch64.dmg",
        "sha256": "1118966b3243e1918a1b17b425e19b65df44b468e9c6af464bd2c5554b02c28d",
        "size": 10735857
      },
      "windows_nsis": {
        "name": "Transit_1.4.0_x64-setup.exe",
        "sha256": "7a0a9376314babc1077978184c7785a2e25d761a225986289c243db45eb34973",
        "size": 6787440
      },
      "windows_msi": {
        "name": "Transit_1.4.0_x64_en-US.msi",
        "sha256": "2727552d4963a07c4b8415f9b8ea4ca428d368aafd743ab7bbc61093bfecb61f",
        "size": 9994240
      }
    }
  },
  {
    "version": "1.3.3",
    "channel": "prod",
    "build_id": "v1.3.3",
    "prefix": "v1.3.3",
    "date": "2026-06-18T18:40:26.568Z",
    "git_sha": "1c0ebe242586a7798aa36f465ed02f2503d9447f",
    "run_id": "27780818788",
    "note": "",
    "notes_md": "### Changed\n\n- **Clearer labels in the New/Edit Auth Profile dialog.** Renamed fields\n  and dropdown options for plain-language clarity — \"Transit Friendly\n  Name\", \"OS keychain (passwords)\", \"SSH agent (ssh-agent, 1Password,\n  etc.)\", \"OS Keyring Friendly Name\", \"Password Value\" — and the username\n  placeholder now shows `root`. Display-only; no change to stored\n  credentials or `transit.toml`.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.3.3_aarch64.dmg",
        "sha256": "9fed55732df32e8748b5268db881d5fac5920c536c5e42c4752fc7895e859488",
        "size": 10704804
      },
      "windows_nsis": {
        "name": "Transit_1.3.3_x64-setup.exe",
        "sha256": "7304cba78897102bf796a5343714ec25290302c51f7677427e742b6089a7e37b",
        "size": 6761072
      },
      "windows_msi": {
        "name": "Transit_1.3.3_x64_en-US.msi",
        "sha256": "0eae828644775c1092e4fa94b3b461ec797f4cf31a800edd76753dc3a3c76c9d",
        "size": 9945088
      }
    }
  },
  {
    "version": "1.3.2",
    "channel": "prod",
    "build_id": "v1.3.2",
    "prefix": "v1.3.2",
    "date": "2026-06-18T17:13:17.792Z",
    "git_sha": "35b6020753471aa8fa71367af4ef20e794e3a1af",
    "run_id": "27775725842",
    "note": "",
    "notes_md": "### Fixed\n\n- **1Password SSH keys now work without manual `SSH_AUTH_SOCK` setup on\n  macOS.** When a connection pins a key fingerprint and that key isn't in\n  the agent `SSH_AUTH_SOCK` points at — on macOS that's Apple's built-in\n  agent by default, which shadows 1Password — Transit now also checks\n  1Password's well-known agent socket automatically. The private key never\n  leaves 1Password, and every signature is still gated by 1Password's\n  approval. When a key still can't be found, the error now pinpoints the\n  cause (agent not enabled vs. 1Password locked vs. fingerprint mismatch)\n  instead of a generic \"not available.\"",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.3.2_aarch64.dmg",
        "sha256": "456a3a7c3adb8dc42fb998d835e16599506972d5455c3cb4c4525e54ec5900df",
        "size": 10706403
      },
      "windows_nsis": {
        "name": "Transit_1.3.2_x64-setup.exe",
        "sha256": "7a77776a4b829150b036632fb8dff685f46e77e64dba09cd5e341ed7b2c9df8d",
        "size": 6757984
      },
      "windows_msi": {
        "name": "Transit_1.3.2_x64_en-US.msi",
        "sha256": "5a856e8aaceae74a0c492858f0e936804ca2d13b8bed4f8f44f4ce27280d2597",
        "size": 9940992
      }
    }
  },
  {
    "version": "1.3.1",
    "channel": "prod",
    "build_id": "v1.3.1",
    "prefix": "v1.3.1",
    "date": "2026-06-18T14:58:54.481Z",
    "git_sha": "0caae8ae43630cf7c9e5da4d7906707d276c4fec",
    "run_id": "27767692821",
    "note": "",
    "notes_md": "### Fixed\n\n- **Connect to SSH hosts that require keyboard-interactive authentication** —\n  notably **VMware ESXi**, and any host configured with the SSH `password`\n  method disabled (`PasswordAuthentication no` + `KbdInteractiveAuthentication\n  yes`). Transit now answers the server's keyboard-interactive prompts with\n  your saved password — exactly as the OpenSSH command-line client does —\n  instead of failing with \"authentication failed … server rejected the\n  credential.\" Public-key (SSH agent) connections are unchanged.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.3.1_aarch64.dmg",
        "sha256": "e0be6b8203744d0a0eb82812cf56e03eb423d9007ba9e4463299b8c506734182",
        "size": 10692287
      },
      "windows_nsis": {
        "name": "Transit_1.3.1_x64-setup.exe",
        "sha256": "6e09a058427728235738e52481b76c4a55514af85f95dc8c59dbadf92857ec3b",
        "size": 6766928
      },
      "windows_msi": {
        "name": "Transit_1.3.1_x64_en-US.msi",
        "sha256": "975cd8f40fd7fdf15b0423319dabe58657b1217f1c780943e89e248e5eb81fa9",
        "size": 9953280
      }
    }
  },
  {
    "version": "1.3.0",
    "channel": "prod",
    "build_id": "v1.3.0",
    "prefix": "v1.3.0",
    "date": "2026-06-16T22:22:35.848Z",
    "git_sha": "54c7712f33739c7455a5f6659f562c8a424c0180",
    "run_id": "27651385991",
    "note": "",
    "notes_md": "### Added\n\n- **Import connections from other clients.** Bring an existing fleet into\n  Transit in one pass instead of re-entering it by hand. The **Import** button\n  in the sidebar header (and on the welcome screen, or `⌘K → Import`) reads\n  **SecureCRT** (an exported `SCRTConfig.xml`), an **OpenSSH `~/.ssh/config`**,\n  or a **CSV**, then walks you through three steps: it groups your saved logins\n  so you map each shared credential **once** — reuse an auth profile you already\n  made, or create one (the secret goes straight to your OS keychain) — then\n  shows every connection in an editable grid where you can bulk-assign vendor\n  and group, rename, and exclude rows before importing. Transit reads host,\n  port, username, folder structure, and key-file paths; it never reads or\n  decrypts your stored passwords. Devices that collide with an existing name are\n  flagged and skipped until you rename them, and the whole import is atomic —\n  if anything is wrong, nothing is written.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.3.0_aarch64.dmg",
        "sha256": "fd75ad2eb63acf242d850963dd747ef7fb7eafe1a434ce10496fec2469388257",
        "size": 10684550
      },
      "windows_nsis": {
        "name": "Transit_1.3.0_x64-setup.exe",
        "sha256": "e487fd7be96d7557ccedad3041917633d834aaab6c502b48845603ee02cf1f19",
        "size": 6757424
      },
      "windows_msi": {
        "name": "Transit_1.3.0_x64_en-US.msi",
        "sha256": "66e59f2d1746238b664d436516996c88741e7a49fc390f9f6637e62b071e662d",
        "size": 9949184
      }
    }
  },
  {
    "version": "1.2.0",
    "channel": "prod",
    "build_id": "v1.2.0",
    "prefix": "v1.2.0",
    "date": "2026-06-15T17:48:30.581Z",
    "git_sha": "c59e612ad3282e7c4b85a19ee506d14fe50231cf",
    "run_id": "27563576017",
    "note": "",
    "notes_md": "### Added\n\n- **In-app notices.** Transit can now surface short announcements — a\n  changelog, a newly available model, or an important account or policy\n  notice — as a dismissible card in the bottom-left corner, fetched\n  alongside your account info. Only the highest-priority unread notice\n  shows at a time, and dismissing one is remembered. Notices are\n  delivered from Transit's service, so they reach installed builds\n  without waiting for an app update.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.2.0_aarch64.dmg",
        "sha256": "25447304601345d927145f0f6538b598db3baa872143540cb8b3b635af06bc3a",
        "size": 10577221
      },
      "windows_nsis": {
        "name": "Transit_1.2.0_x64-setup.exe",
        "sha256": "7d53b30c303346f079899ece6eee38f033dafd4e00aa9a5f52ce245499c3d211",
        "size": 6676192
      },
      "windows_msi": {
        "name": "Transit_1.2.0_x64_en-US.msi",
        "sha256": "1cb5a75f2ebd745fc724d158a9dd84990658e29adf3c358fbe4eae3cdd4ee306",
        "size": 9838592
      }
    }
  },
  {
    "version": "1.1.0",
    "channel": "prod",
    "build_id": "v1.1.0",
    "prefix": "v1.1.0",
    "date": "2026-06-13T16:48:27.553Z",
    "git_sha": "1b8f01c1d8e69319fa672fdabe18219ea550c6df",
    "run_id": "27472179623",
    "note": "",
    "notes_md": "### Added\n\n- **Connections pane group management.** Organize the sidebar from the\n  GUI: right-click → **New group** (empty groups now persist), **New\n  subgroup**, **Rename**, and **Delete group** (its connections and\n  subgroups move up to the parent — nothing is deleted). **Drag a\n  connection** from one group into another, or onto the \"Drop here to\n  ungroup\" zone. Group expand/collapse state is remembered across\n  launches. Backed by a small `groups` registry in `transit.toml` (so a\n  device-less group survives) layered over the existing per-device group\n  path; pre-existing inventories load unchanged.\n- **Chat font size.** Settings → General gains a chat font-size control\n  (+/− / value / Reset) alongside the terminal font-size row. It scales\n  the agent chat panel's message thread — prose, code blocks, and inline\n  code — independently of the terminal, defaulting to 14px (prose reads a\n  touch larger than the monospace terminal default). Persisted to\n  localStorage like the terminal preferences.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.1.0_aarch64.dmg",
        "sha256": "042e0cb5bf98151781979dd30aff81028e4df413a2b974f1dd8d96da863e5146",
        "size": 10717587
      },
      "windows_nsis": {
        "name": "Transit_1.1.0_x64-setup.exe",
        "sha256": "dd80cf64f86ac53df843e577b5fb7b3bcc8418d3a330de6605953e15f474a9c4",
        "size": 6679360
      },
      "windows_msi": {
        "name": "Transit_1.1.0_x64_en-US.msi",
        "sha256": "3041a90cf85bed47c751bea6f1ae1b73e13c885c1fabea8ace56eaf0145b85ba",
        "size": 9842688
      }
    }
  },
  {
    "version": "1.0.2",
    "channel": "prod",
    "build_id": "v1.0.2",
    "prefix": "v1.0.2",
    "date": "2026-06-12T15:04:07.553Z",
    "git_sha": "55e69c4f3d36c186506c05542b23eb578a67fbbc",
    "run_id": "27423396654",
    "note": "",
    "notes_md": "### Added\n\n- **Terminal font picker.** Settings → General's font field is now a\n  dropdown of the monospace fonts actually installed on your machine —\n  and filtered to the ones the terminal renderer can really use, so\n  families the OS ships but withholds from app web content (SF Mono)\n  no longer appear just to silently fall back. Each option previews in\n  its own face. **Custom…** keeps the previous free-text path for\n  hand-written fallback stacks and fonts that don't advertise fixed\n  pitch.\n- **Editable paste confirmation.** The multi-line paste dialog now lets\n  you edit the pending text before sending — trim a stray trailing\n  newline, drop a line, fix a typo — instead of cancelling and\n  re-staging the whole paste. What you paste is exactly what's in the\n  box, the line count updates live, and emptying the box disables\n  Paste.\n\n### Changed\n\n- **Wider Settings dialog** (672 → 896 px max) so the General and\n  Policies tabs stop crowding their controls.\n\n### Fixed\n\n- **Connections sidebar: host:port no longer clips.** Two layers. The\n  real culprit: the sidebar's scroll viewport sized its content to the\n  widest row, so one long hostname pushed every row's right-aligned\n  address past the visible edge — the viewport's content wrapper is\n  now pinned to the sidebar width. Within a row, the address also\n  keeps a readable minimum width, truncates predictably, and both\n  fields show their full value on hover.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.0.2_aarch64.dmg",
        "sha256": "c56f1e49aab7e83d3b1f3627f873bdff4e21cc459691967ae796965782fd6e5d",
        "size": 10673358
      },
      "windows_nsis": {
        "name": "Transit_1.0.2_x64-setup.exe",
        "sha256": "e4ce1b7134fb9b36d870641df1b31196a639adae41894e7a3b33e8d1efac9176",
        "size": 6630560
      },
      "windows_msi": {
        "name": "Transit_1.0.2_x64_en-US.msi",
        "sha256": "49c544efb8e0baa6e0ca33c9d145a4ec0f0dd615b715e4dc2940e466aabfa28e",
        "size": 9773056
      }
    }
  },
  {
    "version": "1.0.1",
    "channel": "prod",
    "build_id": "v1.0.1",
    "prefix": "v1.0.1",
    "date": "2026-06-11T17:27:59.160Z",
    "git_sha": "d39bf0e12df0d8bbd2093f7d0658d4cd44da1078",
    "run_id": "27364633054",
    "note": "",
    "notes_md": "### Added\n\n- **Terminal font setting.** Settings → General gains a font-family field —\n  type the name of any monospace font installed on your machine (e.g.\n  JetBrains Mono) and every terminal pane switches live. Falls back to the\n  stock font stack when the field is empty or the font isn't installed.\n- **Per-vendor syntax-highlighting packs.** When a device opts into syntax\n  highlighting, vendor-specific vocabulary now layers over the generic set:\n  Cisco IOS / IOS-XE / NX-OS / Arista EOS get syslog mnemonics colored by\n  severity (`%SYS-2-…` red, `%LINK-3-…` yellow, `%SYS-5-…` cyan) plus\n  `connected` / `notconnect` / `err-disabled` interface status; Juniper Junos\n  gets `commit complete`, the truncated BGP `Establ` state, and chassis-alarm\n  classes. Picked automatically from the device's vendor.\n\n### Fixed\n\n- **Terminal bottom row no longer clips after font zooming.** Changing the\n  font size (⌘+ / ⌘− / ⌘0) or family re-fits the pane on the next frame, after\n  the renderer's cell metrics settle — previously repeated zooming could push\n  the prompt line below the visible area until the window was resized.\n\n### Changed\n\n- **Claude Opus 4.7 retired from the model picker** — superseded by Claude\n  Opus 4.8 (same speed tier and price). Chats still set to Opus 4.7 are served\n  by Opus 4.8 automatically; no action needed.\n\n### Security\n\n- **PAN-OS policy: viewer commands grammar-anchored.** The `less` / `tail` /\n  `find` / `grep` allow-rules now require PAN-OS's own grammar (a `…-log` area\n  for the first three, the literal `find command` form), so their GNU\n  namesakes (`less /etc/passwd`, `find / -exec …`) can no longer satisfy the\n  allowlist on a mislabeled device. Defense-in-depth — such commands were\n  already subject to the approval modal.",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.0.1_aarch64.dmg",
        "sha256": "ac0565965120b8f3c980f79e065795af032ea4552f180300f12882cdbd8d3a77",
        "size": 10640466
      },
      "windows_nsis": {
        "name": "Transit_1.0.1_x64-setup.exe",
        "sha256": "a788c555d408e9c6b367d917826fc21177b86f6360ddb94050d0ce4113f0faba",
        "size": 6633728
      },
      "windows_msi": {
        "name": "Transit_1.0.1_x64_en-US.msi",
        "sha256": "d45d56392d224cfe07e17cea1aa14084363875197ff65d98be4dca3edfb77f15",
        "size": 9760768
      }
    }
  },
  {
    "version": "1.0.0",
    "channel": "prod",
    "build_id": "v1.0.0",
    "prefix": "v1.0.0",
    "date": "2026-06-10T19:53:55.361Z",
    "git_sha": "c293bda6ac92a821e4b2fb76bd7f47ba430b1a6f",
    "run_id": "27301474173",
    "note": "",
    "notes_md": "First stable release. Headline features: Bring Your Own Policy, custom\nvendors, connection-name-aware AI, and open-session-scoped policy briefing.\n\n### Added\n\n- **The AI assistant now knows your connections by name.** Sessions surface\n  the connection name you gave the device (its inventory id, e.g. \"R1\")\n  instead of a `host:port` stand-in, so \"what is R1's loopback IP?\" resolves\n  to the right session. The session list the assistant sees also includes\n  each device's vendor.\n- **Bring Your Own Policy (BYOP).** Supply your own command policies, layered\n  over the built-in ones: add read-only allowed commands to a shipped vendor,\n  or define an entirely new vendor (e.g. Fortinet, MikroTik) with its own\n  `<vendor>.yaml`. Point Transit at a policy directory (the `Vendor` field in\n  the device dialog accepts a custom name; set the directory via\n  `TRANSIT_USER_POLICIES` or the Settings → Policies tab). The directory can\n  live on a shared drive for team use. Your additions can never weaken the\n  built-in safety floor — a shipped block (config mode, write commands, shell\n  escapes) stays blocked no matter what a user policy says — and a custom\n  vendor still requires per-command approval for every command.\n- **Sample policies for popular vendors** (`policies/samples/`): vetted\n  read-only starting points for Fortinet FortiOS and MikroTik RouterOS,\n  ready to drop into your BYOP policy directory and doubling as worked\n  examples of the policy schema.\n\n### Changed\n\n- **The AI assistant's policy briefing is now scoped to your open sessions.**\n  The system prompt includes only the command policies for vendors you\n  currently have sessions to (plus an explicit default-deny note for devices\n  with no policy), instead of every shipped vendor's full policy on every\n  conversation. Cuts per-turn token overhead and clears the path to a much\n  larger vendor catalog; enforcement is unchanged — every proposed command\n  still runs the full policy gate and the approval modal (Rule 3).",
    "files": {
      "macos_dmg": {
        "name": "Transit_1.0.0_aarch64.dmg",
        "sha256": "1c65748e504a90eb247a22fcfbaabad2e4de08ed80a739cb6851744120e5e75c",
        "size": 10639608
      },
      "windows_nsis": {
        "name": "Transit_1.0.0_x64-setup.exe",
        "sha256": "1e70d2e4b52f3205b8868d2e844ab8b917302b6b4dc9d84651cf101719914405",
        "size": 6635696
      },
      "windows_msi": {
        "name": "Transit_1.0.0_x64_en-US.msi",
        "sha256": "cbdd04c13bfc9ddcda3327adfb51797484d04dfdd527803449051daf8c618bdc",
        "size": 9760768
      }
    }
  },
  {
    "version": "0.3.0",
    "channel": "prod",
    "build_id": "v0.3.0",
    "prefix": "v0.3.0",
    "date": "2026-06-09T22:31:16.770Z",
    "git_sha": "fff8bbe4f4149f448ae95a82a434d13a1a042669",
    "run_id": "27239321071",
    "note": "",
    "notes_md": "Security-hardening release resolving the findings of an internal code review.\n\n### Security\n\n- **The AI command gate can no longer be tricked by multi-line commands.** A\n  proposed command that tried to hide a second statement behind a newline (or\n  other control character) is now rejected before it is evaluated, the approval\n  modal shows the full command faithfully instead of collapsing hidden lines,\n  and the SSH/serial executors refuse to send control-character payloads.\n  Command matching is now case-insensitive, so block rules can't be sidestepped\n  with alternate capitalization.\n- **Stronger device-output redaction.** Added high-entropy key/hash catch-alls\n  and coverage for `key chain` key-strings and PPP passwords, and redaction now\n  runs over the full buffer before any truncation — so a secret split across a\n  buffer boundary can no longer slip through to the AI.\n- **Sign-in tokens are no longer written to logs.** The desktop stopped logging\n  the `transit://` sign-in callback URL (which carried access/refresh tokens),\n  and the logging subsystem is now actually initialized.\n\n### Fixed\n\n- More resilient cloud connections: requests now time out instead of hanging,\n  a transient server blip during token refresh no longer signs you out, and\n  simultaneous refreshes are coalesced.\n- Out-of-quota, rate-limit, spend-pause, and unavailable-model responses now\n  show a clear message in chat instead of a generic status code.\n- SSH sessions: a close signal could occasionally be missed (leaving a tab that\n  never showed as closed); one stuck session could freeze the others; and\n  carefully verifying a new host key no longer risks a spurious connect timeout.\n- The inventory editor no longer errors on hand-written inline-table TOML,\n  editing a device preserves a remembered \"allow weak crypto\" choice, and\n  multibyte terminal output split across packets now renders correctly.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.3.0_aarch64.dmg",
        "sha256": "0f01d50b4df876a8013e25beeabd9eaf00e76f16fc021e9049db7efd3fc49407",
        "size": 10559936
      },
      "windows_nsis": {
        "name": "Transit_0.3.0_x64-setup.exe",
        "sha256": "68b52f4a76c84e6d27a14b77f063c08f14cc5f4250ee73c989023018a07cc7c6",
        "size": 6589776
      },
      "windows_msi": {
        "name": "Transit_0.3.0_x64_en-US.msi",
        "sha256": "620218df8fa1953497c3e37cf79d040f7f0982c3cc299ae7b84b989d1c3b97f5",
        "size": 9703424
      }
    }
  },
  {
    "version": "0.2.2",
    "channel": "prod",
    "build_id": "v0.2.2",
    "prefix": "v0.2.2",
    "date": "2026-06-07T18:20:59.365Z",
    "git_sha": "2338d3071f5c2def2e43b6a7ad67dd67c712a8d4",
    "run_id": "27100669716",
    "note": "",
    "notes_md": "### Added\n\n- **Claude Opus 4.8** in the chat model picker (under Advanced) —\n  Anthropic's most capable model, at the same speed tier and price as\n  Opus 4.7.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.2.2_aarch64.dmg",
        "sha256": "e4173f2c9b05603464a188e1225fc612844132eb8ccb822c4cab4b09be1bb647",
        "size": 10349530
      },
      "windows_nsis": {
        "name": "Transit_0.2.2_x64-setup.exe",
        "sha256": "0fd73120b23584ea5914df3793c77ae67ed3aaab9a8ddee0ef0b1759d5290923",
        "size": 6476872
      },
      "windows_msi": {
        "name": "Transit_0.2.2_x64_en-US.msi",
        "sha256": "89df852be4bd9a4dfe21fc713c5210f69fb47b2ab2ea5293f5f0760e5c597b16",
        "size": 9527296
      }
    }
  },
  {
    "version": "0.2.1",
    "channel": "prod",
    "build_id": "v0.2.1",
    "prefix": "v0.2.1",
    "date": "2026-06-05T19:41:14.332Z",
    "git_sha": "24a587b2a5b654c56d823b501df4fadbee18ae58",
    "run_id": "27034926175",
    "note": "",
    "notes_md": "### Added\n\n- **New color theme: Transit Twilight** — an original dark scheme (deep\n  twilight indigo with teal and amber accents). Pick it in Settings →\n  General → Theme.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.2.1_aarch64.dmg",
        "sha256": "f9e3e50b272eeae02f8f76dda5d52db71f1b0e404f0e9c24fe11367e703fa0d9",
        "size": 10347155
      },
      "windows_nsis": {
        "name": "Transit_0.2.1_x64-setup.exe",
        "sha256": "f26f234e219145ea0274ea0a3049f70be77109fd2f5729e89f8a95a5c041353b",
        "size": 6470728
      },
      "windows_msi": {
        "name": "Transit_0.2.1_x64_en-US.msi",
        "sha256": "8a8a34d96722e60e363c66ba43119815e356edf13f8b726f21fdd81ac8bd061f",
        "size": 9527296
      }
    }
  },
  {
    "version": "0.2.0",
    "channel": "prod",
    "build_id": "v0.2.0",
    "prefix": "v0.2.0",
    "date": "2026-06-05T15:33:48.368Z",
    "git_sha": "6f4712e820384c974c8679ef3525e3f1503335a4",
    "run_id": "27023548277",
    "note": "",
    "notes_md": "### Added\n\n- **Automatic updates.** Transit now checks for a new version on launch and\n  shows a small prompt in the bottom-left corner when one is available. Click\n  **Install & Restart** and Transit downloads the update, verifies its\n  signature, swaps itself in place, and relaunches — no manual reinstall.\n  Choose **Later** to be reminded at the next release. Settings → Updates shows\n  your current status and a manual **Check for updates** button. (macOS Apple\n  Silicon and Windows.)\n\n### Changed\n\n- The AI investigation loop no longer stops every dozen rounds and makes\n  you type \"continue\". It now runs continuously through an investigation\n  and only pauses for a one-click **Continue** after a long autonomous\n  burst (~50 commands), with an always-visible Stop and a live activity\n  readout (commands run · elapsed · tokens). A per-turn timeout guards a\n  stalled model response. Large command / scrollback outputs are capped,\n  and older ones collapse to a re-readable note, so long log-parsing\n  sessions stay responsive instead of degrading.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.2.0_aarch64.dmg",
        "sha256": "332157a3ce2671bfbee2bfce8ccafb20fefe5f42d9cb168ac2ee0082c4a64e58",
        "size": 10348417
      },
      "windows_nsis": {
        "name": "Transit_0.2.0_x64-setup.exe",
        "sha256": "b1bc336c2e76756f5c862d1b9818012d8ea093a6285e1671ed8592f9c3f1bbb9",
        "size": 6471816
      },
      "windows_msi": {
        "name": "Transit_0.2.0_x64_en-US.msi",
        "sha256": "fb9710123772f7bfb8d9439cd0102656ea4bbdb675c19d8d5b656b11fd04d3f9",
        "size": 9527296
      }
    }
  },
  {
    "version": "0.1.2",
    "channel": "prod",
    "build_id": "v0.1.2",
    "prefix": "v0.1.2",
    "date": "2026-06-01T19:14:45.977Z",
    "git_sha": "dee8a5caa22ef0b3593d74894830a52c567b6794",
    "run_id": "26775647954",
    "note": "",
    "notes_md": "### Changed\n\n- Upgraded the terminal to xterm.js 6 — rendering now uses the WebGL addon\n  (with an automatic fallback to the DOM renderer on GPU context loss).\n- Migrated the styling pipeline to Tailwind CSS v4.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.1.2_aarch64.dmg",
        "sha256": "d34cff733d3f54a58116d030c9d60842b329c5e11c851db014b898b754e82460",
        "size": 9709716
      },
      "windows_nsis": {
        "name": "Transit_0.1.2_x64-setup.exe",
        "sha256": "e22c59eaa088fada44cab762e8602045c6379909b74fa2fc56501b19bbb4766c",
        "size": 6201296
      },
      "windows_msi": {
        "name": "Transit_0.1.2_x64_en-US.msi",
        "sha256": "8d7303e870ba5c0c8eb7e682398f58d24b970eca1e87ee98077e1bdc9414aebd",
        "size": 8998912
      }
    }
  },
  {
    "version": "0.1.1",
    "channel": "prod",
    "build_id": "v0.1.1",
    "prefix": "v0.1.1",
    "date": "2026-06-01T17:11:15.284Z",
    "git_sha": "42d8150dbb222b5f98a6f14d1056699b9bdb9539",
    "run_id": "26769403585",
    "note": "",
    "notes_md": "### Changed\n\n- Refreshed Rust dependencies (`age` 0.11, `toml` 1.x, `toml_edit` 0.25,\n  `dirs` 6, `getrandom` 0.4, `tauri` 2.11.2, and related transitive\n  updates). Encrypted session export migrated to `age` 0.11's API with no\n  change to the on-disk format — exported files stay decryptable with\n  `age -d` (scrypt KDF + ChaCha20-Poly1305).\n- Refreshed frontend dependencies — notably TypeScript 6, lucide-react 1,\n  and lint-staged 17, plus minor TanStack Query, React Hook Form, ESLint,\n  Vite, and Vitest updates. No user-facing behavior change.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.1.1_aarch64.dmg",
        "sha256": "66f1d5a003430a7b1238d9d9b822f13494b7dbe6dcb294b31c47f508ce0b0af3",
        "size": 9683740
      },
      "windows_nsis": {
        "name": "Transit_0.1.1_x64-setup.exe",
        "sha256": "543afed9cae96410b79f213600df4f20dc1fe8887e623cfa72af14a9e25e7724",
        "size": 6169392
      },
      "windows_msi": {
        "name": "Transit_0.1.1_x64_en-US.msi",
        "sha256": "9a4a76b15644597e67478d00746bece945ce463e60c6d1059d73b006d8130c49",
        "size": 8978432
      }
    }
  },
  {
    "version": "0.1.0",
    "channel": "prod",
    "build_id": "v0.1.0",
    "prefix": "v0.1.0",
    "date": "2026-05-31T22:01:05.833Z",
    "git_sha": "e10129147dbc0d3af1bd130a40e9c4f19429193b",
    "run_id": "26725383910",
    "note": "",
    "notes_md": "### Added\n\n- Cross-platform GUI SSH client (Apple Silicon macOS + Windows x64): xterm.js\n  terminal, multi-session tabs, host-key trust-on-first-use, a modern-crypto\n  handshake with a per-device legacy opt-in, and optional per-device syntax\n  highlighting and SecureCRT-style quick copy/paste.\n- Embedded read-only AI investigation agent with a fixed four-tool surface, a\n  per-vendor command policy gate, and a device-output redaction filter on\n  everything the model sees.\n- Shipped vendor policies: Juniper Junos; Cisco IOS, IOS-XE, NX-OS; Arista\n  EOS; Palo Alto PAN-OS; plus an unrestricted generic-Linux profile.\n- Transit Cloud account flow: Clerk sign-in, subscription billing, and\n  bring-your-own-key (BYOK) support on paid tiers.\n- Signed + notarized macOS `.dmg` and Authenticode-signed Windows `.msi` /\n  NSIS `-setup.exe` installers, distributed via the dev and prod release\n  channels.",
    "files": {
      "macos_dmg": {
        "name": "Transit_0.1.0_aarch64.dmg",
        "sha256": "424cb78e9346c3a19551d47d899319538f222c4472c8c1705a0b83a1052c3b38",
        "size": 9935096
      },
      "windows_nsis": {
        "name": "Transit_0.1.0_x64-setup.exe",
        "sha256": "8bf4be9a8368305cf55725c58b60b3444a5df0f6647d89985880b8b603f64b9d",
        "size": 6300592
      },
      "windows_msi": {
        "name": "Transit_0.1.0_x64_en-US.msi",
        "sha256": "483da5bc8c95c68084cd49b936117d338eff4e1acc764b26557cfd3350d0227d",
        "size": 9150464
      }
    }
  }
]
