What's New
Release notes for K2. Updates are published to GitHub.
v0.39.45
Latest0.39.45 — Messages that actually arrive: the comms-reliability release
k2so msg now confirms the Enter actually landed. Under heavy host load(big agent fleets), a delivered message could sit un-submitted in the
recipient's input box until a human pressed Enter — while the sender saw
success: true. Delivery now wraps the message in explicit paste framing and
*verifies* submission against the recipient's screen, re-sending Enter until
it lands. If it truly can't confirm, you get an honest no_submit error
(with guidance) instead of a silent stall.
~2.7 KB (~54 lines) and long live messages lost their tails — the payload
rode the URL, which had a hard cap. Message text and inbox bodies now travel
in a proper request body with no size limit, and anything that *would*
overflow the old path errors loudly instead of corrupting the record.
k2so msg appa finds the workspace named Appa; misses come back with a "did you mean …?" suggestion instead of
a bare not-found.
k2so connections stops lying. add failures actually print an error (they used to exit silently as if they'd worked), and list shows *whose*
connections you're looking at and flags peers that are no longer reachable.
window, the CLI, or a connected client now appears in the sidebar and
Settings on every client — no more manual window reload. CLI-created
workspaces no longer vanish into an unreachable no-focus-group limbo.
picker has a "+ New Folder" button, so you can create a fresh workspace
folder on the host instead of only adopting existing ones.
k2so settings --mode and k2so workspace list work. The mode setterwas a silent no-op and the list always failed with no output; both do their
jobs now.
heals any pinned Chat/Inbox tab stamped with a neighboring workspace's
identity during a switch race — on save *and* when serving older corrupted
layouts.
v0.39.44
0.39.44 — Clone-to actually brings your Claude chat history
mismatch meant K2SO and Claude Code looked in *different* directories for a
workspace's sessions whenever the path had an underscore (or a dotted name, or
lived under a symlinked location) — so a "Clone to" could report success yet
bring zero chat history, and /resume came up empty. K2SO now names those
folders exactly the way Claude Code does, so sessions — including worktree
history — bundle, transfer, and resume correctly. A one-time self-heal repairs
earlier clones (and local workspaces) that had landed in the wrong folder, and
the clone now logs how many sessions it moved.
v0.39.43
0.39.43 — Right-sized terminals + reliable pinned-chat switching
one server, the PTY now follows the active viewer — the focused client's (or
whoever just typed) screen dimensions are used — so a remote viewer no longer
gets a terminal clipped to someone else's window. Whoever last interacts owns
the size, and it hands back cleanly when the other side takes over.
conversation from the pinned-tab dropdown now reliably loads it: your explicit
choice is honored instead of being quietly reverted to the most-recent session.
v0.39.42
0.39.42 — Tabs behave when two clients share a server
two people — were connected to the same server, tab-order sync could spiral
into a fast loop that constantly rebuilt the tabs and reloaded the terminals
(and the pinned chat). Tab order now syncs cleanly and quietly.
longer rebuilds the panes — your terminals and pinned chat stay put instead of
reloading.
a teammate reordering tabs or switching their view no longer drags yours along.
Each person explores the workspace freely.
v0.39.41
0.39.41 — Pinned chats remember exactly where they were
pinned chat now has one canonical, server-owned identity — so reopening it,
switching devices, or restarting the host all return you to the *same* Claude
session instead of occasionally starting a fresh one. This is the root fix
behind the remote re-mint loop the last release patched.
v0.39.40
0.39.40 — Clone-to chat history lands, and remote pinned chats settle down
"Clone to", Claude's /resume came up empty on the destination because each
session still pointed at the *source* machine's folder. Clones now rewrite
those paths on arrival, and a one-time self-heal repairs workspaces you
already cloned — your conversations show up where they belong.
pinned chat from a connected/companion client could spin in a loop, minting a
brand-new session on every reconnect instead of resuming the real one. It now
resumes the workspace's actual session and stays put.
Settings top-bar instead of dropping below the window's traffic lights.
v0.39.39
0.39.39 — The server runs the show (steadier chats, less chatter)
chat's session end-to-end — opening, switching sessions, reloading, and
reviving the right session after a restart are all handled server-side. No more
open-flicker, and the tab keeps its icon.
for model status, agent activity, the review queue, and tunnel state. It now
receives those as live pushes — fresher, lighter, correct across multiple
devices, and it keeps working on a headless server.
Active bar, and heartbeat "live" state now sync to every connected device — one
consistent picture, not a per-window guess.
name belonged to another product). Settings and the website reflect it.
same "K2 ‹Server Name›" top-bar as the main view, with the host switcher there.
visible instead of black-on-dark.
v0.39.38
0.39.38 — Remote sessions stay alive, and Clone-to brings everything
dormant workspace's chat from a connected client, the host could mistake it
for a closed tab and reap the session out from under you. "Active" workspaces
and the cleanup that acts on them now live on the server itself, so opening a
workspace from *any* device keeps it alive — and the host (or a headless
server) does the cleanup correctly on its own.
one server, each sees the other's open workspaces appear in the Active bar —
one shared, live picture of what's in use, mirrored to every connected device.
the single newest session per workspace; it now brings every session by
default. A new "Include all chat history" toggle (on by default) lets you
opt back to live-only if you want a slimmer bundle.
it your own name.
switches the pinned chat to a past session, the reload button reloads the one
it names, and your chosen session is remembered across restarts (and reinstalls)
so it comes back without re-picking — it's stored on the server now.
immediately (no more "leave and come back"), and a workspace's first chat starts
fresh instead of failing on a not-yet-existent session.
alive even if the Settings panel isn't open — the host renews its own lease, so
remote access no longer drops out from under you.
owns it (no wrong-history on lookalike workspaces); a safety rail prevents a
misbehaving chat from respawning in a loop; plus test-suite reliability fixes.
v0.39.37
0.39.37 — Settings layout polish for connected hosts
downloads, installs, and relaunches it — so the button now says **"Update
Host"** (it was "Download," which implied a separate install step that
doesn't apply to app hosts).
into two equal halves with a full-height divider — your general settings on
the left, the connected host's Restart + Update controls on the right. On
your own Mac it's a single half-width column with no divider.
v0.39.36
0.39.36 — Reconnecting after a host restart just works
When a machine you're connected to restarts (e.g. right after a remote
update), its sign-in can expire. K2 now checks your session the moment it
reconnects and, if it's expired, prompts you to sign back in — instead of
silently opening a broken workspace where the file tree, chat history, and
terminals all fail with "invalid or missing auth token." One re-auth instead
of having to remove and re-add the connection. (A momentary network blip
never logs you out — only a genuinely expired session does.)
v0.39.35
0.39.35 — Remote updates that actually work (both kinds of host)
manifest bug was silently breaking every remote daemon self-update; that's
fixed. Headless/server hosts update via a verified binary swap;
desktop-app hosts update by triggering that machine's own app updater —
K2 now auto-detects which kind of host it is and picks the right path for you.
remote-update panel now shows the actual reason (download, signature, or
version detail) so a stuck update is diagnosable at a glance.
Update controls now sit together in their own right-hand column with a
divider; when you're on your own Mac, the page is a single column as before.
host-type reporting on the connection handshake, and a clear "open the app on
that machine" message if a desktop host's app isn't running.
v0.39.34
0.39.34 — Active bar that tells the truth (and uses less RAM)
at*.** Workspaces you haven't touched in a while age out of Active on their
own, and their background sessions get cleaned up — so K2 stops quietly
holding hundreds of MB for workspaces you walked away from days ago.
"Keep workspaces Active for [N] hours" — lower it for more aggressive
cleanup, raise it to keep sessions warm longer.
the workspace has a live session (grey when none), the braille spinner
when it's working, and an EKG icon when it has an enabled heartbeat (i.e.
it can run on its own). Pinned workspaces float to the top, separated
from the rest.
spinner while the agent is busy, then back when it's done.
icon when it actually has an enabled heartbeat — fixed a case where a
workspace with every heartbeat turned off still looked self-driving (and held
its session open forever).
UI. Plus K2 Connect settings polish and a reordered Settings list.
v0.39.33
0.39.33 — Remote reboot + remote updates (beta)
new Restart host control (Settings) appears only when you're on a remote
host and is clearly labelled for *that* machine, not your Mac. From the CLI,
k2so daemon restart --host does the same and waits for it to
come back up. Owner/Admin only.
check → download → verify → install & restart, with live progress and an
automatic rollback if the new build doesn't come back. The download is
minisign-verified before anything is swapped. The flow names the remote
machine at every step so it can never be mistaken for your local one.
k2so daemon install (and a curl … | sh one-liner) fetches, verifies the signature, and
installs the standalone daemon, registering a systemd/launchd service so it
stays up across restarts.
> Remote update and headless install are beta: the macOS path is wired end
> to end, while the Linux server binaries (built in CI) and the live
> download → swap → relaunch want a real-world shakeout. Signature verification
> is mandatory; all of it is Owner/Admin gated.
v0.39.32
0.39.32 — Leaner memory, smoother relaunch
and agent sessions are now force-reaped when their tab or workspace goes
away (or when a remote host-switch tears them down) instead of orphaning a
long-running claude/agent process (~150 MB each). If your machine felt
heavier the longer K2 ran, this was why.
a short grace period the dismissed workspace's pinned Chat (and any extra
terminals) are reaped to reclaim memory; reopening the workspace relaunches
the saved session right where you left off.
cold-start race where the first workspace's pinned Chat tab wouldn't spawn
until you clicked refresh.
list now reads from the host you're connected to.
shows a small, non-blocking indicator instead of a full overlay — the top
bar stays usable and the screen keeps updating; it only flags a real drop
after repeated failures.
once a clone finishes, and stale ones are pruned, on both source and
destination machines.
v0.39.31
0.39.31 — K2 Connect: the whole remote surface is host-aware
A batch of actions were quietly running against your *local* machine even
while you were connected to a remote — now they target the host you're
connected to: approving / rejecting / requesting-changes on agent reviews,
creating & deleting agents, editing heartbeats (add / edit / archive /
enable / rename), the agent presence locks, scheduler ticks, managing
skills, saving an agent's AGENT.md, regenerating the workspace skill,
workspace connections, and more.
running a local formatter against a file that lives on the host.
v0.39.30
0.39.30 — Fix: pinned-chat dropdown works on a remote machine
you're connected to.** Selecting a different chat from the dropdown was
updating only your *local* machine, so on a remote the chosen chat never
loaded — it now writes to the active host, so it works the same remote as
it does locally. (Working directly on the machine was already fine.)
v0.39.29
0.39.29 — Clone to: the cloned workspace shows up + "Open on host"
manual window reload to see it. After a clone finishes, the destination's
workspace list refreshes on its own.
freshly-cloned workspace on the remote machine, instead of hunting for it
in the sidebar.
v0.39.28
0.39.28 — Clone to: fix crash on workspaces with symlinked folders
contains a symlink pointing at a folder (for example, linked
agent-skills under .k2so/). Those links are now skipped while bundling;
symlinks to individual files are still copied. (0.39.27 introduced Clone
to — this makes it work for those workspaces.)
v0.39.27
0.39.27 — Clone a workspace to another machine + rock-solid remote tunnels
workspace and pick Clone to →
connected to over K2 Connect. It bundles the workspace — its files, the
agent's memory, and session history — pushes it over your existing
encrypted connection, unpacks it on the host, and registers it there with
its K2 settings, ready to resume. A quick pre-flight lets you **decide
whether to bring secrets** (.env, .auth/, in-workspace tokens): on by
default since it travels over your encrypted link, or off if you'd rather
re-add them on the host. (Your Claude login is never copied — the host
signs in as itself.)
K2 Connect host could go unreachable at after a software
update or daemon restart: the tunnel could pin a stale internal port, and
leftover tunnel processes could pile up and fight over your subdomain. The
host now always tracks its live port and clears out old tunnel processes
on start, so remote access self-heals on the next launch.
k2so tunnel and k2so daemon companion no longer printan error on their status output under newer Python versions.
v0.39.26
0.39.26 — K2 Connect: drag files straight onto the remote machine
When you're connected to another machine, dragging a file in from your
computer now actually transfers it to that machine, decided by where
you drop it:
.k2so/downloads/ and the path is dropped into the prompt, so the agent
can use a file that really exists on the host.
Local drag-and-drop is unchanged. (Both machines need 0.39.26 for the
host to accept the upload.)
v0.39.25
0.39.25 — Remote folder picker everywhere + agent slash-commands
browser now backs every "add workspace" entry point — the main
navbar +, the sidebar, the File menu, and ⌘O — not just Settings. So
while you're connected to another machine, adding a workspace always
browses that machine, never your local disk.
k2so msg gains a --command flag that prepends a slash-command (like /loop or /goal)
to the front of a delivered message — so one agent can kick off a
command in another. Omitted, messages deliver exactly as before.
v0.39.24
0.39.24 — K2 Connect: open a workspace on the remote machine
machine, "New Workspace" now lets you browse and pick a folder on **that
machine** — an in-app folder browser that walks the remote's filesystem —
instead of your local file picker (which could only see this computer).
hosts running an older K2SO, so you can always connect and sign in to
update one. And when a host is too old for a newer feature, the app now
tells you which version it needs instead of silently doing nothing.
v0.39.23
0.39.23 — K2 Connect: roles + cleaner remote settings
Owner, Admin, or Member. The owner can promote trusted people
to help run the server (including handing off ownership); admins can add
users and enable/disable them; members just connect and use it. Removing
users and changing roles stay owner-only.
*tunneling* controls — k2.dev sign-in, subdomain, start/stop — now hide
while you're connected to a remote host, since those belong to the machine
that owns the daemon. Managing that server's users still works from
right there.
k2so works from any folder. Fixed a bug where running the k2socommand (for example, an agent-to-agent message) from a directory that
isn't a git repository would exit silently with no output.
v0.39.22
0.39.22 — daemon onboarding fixes (#14, #15) + Settings host indicator
cached w/ 5s timeout) so agent CLIs in ~/.local/bin / Homebrew / nvm resolve.
ProgramArguments path before kickstart so a DMG-launched install converges
after upgrade; refuses to register from a DMG/translocated path.
Gate green: tsc 0, cargo 901, vitest pass (tabs flake only).
v0.39.21
0.39.21 — K2 Connect: client fully mirrors the active host
Fixes the host-switch state-leak class (#625): module-level zustand stores +
module Map/let singletons survive the
backed state loaded once against local leaked onto a remote connection. Added
onActiveHostChange()/activeHostKey() in connect-host.ts; on host change re-fetch
settings (focusGroupsEnabled etc.), focus-groups, panels, timer, custom-themes,
projects restore + clear ActiveBar memory / tabs sessions / active-agents pane
state / pending persist timer / stale session WS. Client prefs stay local.
Gate green: tsc 0, vitest 167, cargo 879.
v0.39.20
0.39.20 — K2 Connect: remote clients can read the host's data
Fixes the daemon /cli/* catchall, which gated on the owner token ONLY
(req_token != *state.token) instead of token_ok (owner OR valid connect-user
session). A connected remote user authenticated (whoami) but every data read
(projects/list, fs/read-dir, workspace/*, git, chat via cli::dispatch) 403'd
"Invalid or missing auth token", so the client showed stale LOCAL workspaces.
Now token_ok; owner-only routes still gated by require_owner above the catchall.
Validated: connect-user session reads projects/list (55) + fs/read-dir.
Update the HOST machine to 0.39.20.
v0.39.19
0.39.19 — Plan B: renderer talks to the daemon directly
Replaces 0.39.18's host-aware DaemonClient (Plan A), which had a global-override
race (failed connect blanked local workspaces) and a blocking-proxy beachball
over the tunnel. The renderer now calls the daemon over host-aware HTTP
(daemonCliGet/Post) for ALL data; the Tauri daemon-data proxy + A's
set_active_daemon chokepoint are deleted. Remote connect drives
nav/files/git/agents/settings reliably. Full gate green: tauri build, tsc 0,
vitest 156, cargo units 879. Verified locally (daemon 0.39.19, 55 workspaces).
v0.39.18
0.39.18 — K2 Connect: drive the remote machine
~90 Tauri-proxied routes (projects/git/agents/states/layouts/sections/
settings/timer/workspaces) to the active host instead of 127.0.0.1.
remote host (off public /boot-status) before a connect-user session
exists; parks polling until sign-in lands; proxied calls never fire
tokenless.
on startup — fresh host needs no brew install frpc.
v0.39.17
0.39.17 — K2 Connect sign-in fix
Production CSP connect-src was blocking the webview fetch()/wss:// to
Supabase and to *.k2.dev, so account sign-in showed "Load Failed" and the
remote-daemon connect would have failed the same way. Added
https://*.supabase.co, https://*.k2.dev, wss://*.k2.dev.
v0.39.16
K2 Connect — reach your K2 daemon from anywhere
0.39.16 introduces K2 Connect: expose your local K2 daemon at a public
https:// URL and connect to it securely from another computer.
Host this device
Users / Access (who may connect in)
https://.k2.dev .