What's New

Release notes for K2. Updates are published to GitHub.

v0.40.62

Latest
July 25, 2026

0.40.62 — Settings that scale: Connect, LLMs, General

K2 Connect is easier to navigate

Settings → K2 Connect is no longer a permanent side-by-side Host /

Servers wall. You get clear tabs:

-Tunnel — expose this machine + host policies
-Access — users and invite (half-width again, so forms aren’t stretched)
-Servers — your address book, updates, and federation pairing

Pair two cloud servers while you’re signed into one

The saved-servers list (this Mac’s address book) stays visible when

you’re connected to a remote. That unlocks Pair as federated peer

between two K2 Cloud boxes without bouncing back to Local first. The

top-bar server switcher still always shows *your* list — not the remote

machine’s.

Agentic systems are just on

No more Agentic Systems beta toggle. Canonical Agent Flow, Heartbeats,

workspace Skills, and agent polling are always available. Older

“turn agentic off” flags no longer hide the product.

Editors and LLMs are separate

-Editors — default editor/terminal and detected apps
-LLMs — default agent, presets, CLI install guide, and a Credentials

column for the big seven (Claude live auto-refresh; Codex, Grok, Gemini,

Cursor Agent, Hermes, Pi coming soon)

Nav: LLMs sits under Styles. Workspace settings are labeled

Workspaces / Agents.

General has real tabs

Settings → General:

| Tab | What’s there |

|---|---|

| General | Version, CLI, What’s new, your name, reset |

| Workspaces | Active-bar hours, completion sound, Canonical Agent Flow help |

| Server | K2 Server + keep running when the window closes |

| Local LLM beta | Workspace assistant / model |

Canonical Agent Flow is no longer its own top-level page — it lives under

General → Workspaces, with room for the diagram and a shorter intro.

Agent presets & CLI guide

Built-in order puts Grok before Gemini. CLI Tools Setup matches that

list and includes Hermes. Existing installs get the Grok/Gemini swap

on the next daemon start (or use Reset Built-ins).

---

Download K2_0.40.62_aarch64.dmg (38.3 MB)

v0.40.61

July 23, 2026

0.40.61 — Linux servers actually update (and stay reachable)

Update from the app installs the new daemon

On a remote Linux host (Settings → ConnectionsUpdate to …),

K2 now finishes the full install path: download → verify → **install &

restart**. Before this release, that button could download and stage a

build without ever swapping the binary, so the box looked like it

“updated,” came back on the same version, and left you thinking

nothing changed.

After install, the app only treats the update as successful when the

host’s /boot-status reports the expected new version — not merely

“online again.”

(Settings → General → remote host Download / Install & restart

was already the complete flow; Connections is now aligned.)

Tunnel stays in sync after restart

Restarting a Linux daemon (including for an update) could leave the

public *.k2.dev tunnel pointing at a dead local port while the

daemon listened elsewhere — external HTTP 000 until an operator

SSHed in and ran systemctl restart.

0.40.61 keeps the live HTTPS listener port as the source of truth for

frpc, hardens tunnel stop/reap so orphan frpc is less likely, and

self-heals when frpc’s local port is unreachable but a live listener

exists (rewrite frpc only — agent sessions are not killed for that

heal).

Ops note for already-provisioned boxes: new install scripts use

KillMode=control-group so orphan tunnel helpers die with the unit.

Existing units may still say KillMode=process until you redeploy the

unit or:

`bash

sudo sed -i 's/KillMode=process/KillMode=control-group/' /etc/systemd/system/k2-daemon.service

sudo systemctl daemon-reload && sudo systemctl restart k2-daemon

`

Update both the thin client and the daemon on the host so the

new Connections flow and the tunnel self-heal land together.

---

Download K2_0.40.61_aarch64.dmg (38.2 MB)

v0.40.60

July 23, 2026

0.40.60 — Tickets, and chat text you can actually select

Feedback is now Tickets

The Feedback surface is Tickets end to end — page label, agent CLI

(k2 tickets …), and wording. Existing ticket data and routes keep

working; this is a product rename, not a wipe.

Ticket polish

-Planned status alongside waiting / answered / closed
-Assignees so a ticket can target the right people
-Drafts that survive leaving a ticket and coming back
-Reply box auto-grows, autofocuses when a thread is ready, and

resizes with the detail panel

-Clickable links in ticket and project chat bodies

Highlight and copy chat text

You can drag-select and copy message bodies in Tickets threads

and Project chat — not only the composer.

A global “return focus to the terminal” path was treating those

message divs as dead space and clearing the highlight almost instantly.

That reclaim now leaves a live selection alone (and skips full-page

Tickets / Projects / Wiki overlays).

---

Download K2_0.40.60_aarch64.dmg (38.3 MB)

v0.40.59

July 23, 2026

0.40.59 — Files tree no longer bounces on busy hosts

On remote (and busy local) machines, the Files drawer could flash

Loading... over and over, making the tree jump while agents or other

tools wrote under the workspace.

Live refresh still updates when real project files change. High-churn

paths (agent/runtime state, .git, build caches, logs) no longer thrash

the list, and a directory you already have open refreshes quietly in the

background instead of re-showing the loading row.

Update both the thin client and the daemon on the host (e.g. NSI)

so the quieter watcher and the calmer UI land together.

---

Download K2_0.40.59_aarch64.dmg (38.2 MB)

v0.40.58

July 22, 2026

0.40.58 — Files that keep up, and previews that actually work

The Files drawer is a real workspace browser again — not a list that

lags behind agents or only shows plain text when you open something.

Live refresh when others change the tree

When an agent, another client, or a process on the host adds, renames, or

deletes files, the Files tree updates without a full window reload. That

covers local workspaces and remote hosts the same way.

Dropping files no longer multiplies copies

Dragging from Finder (or another app) into Files used to sometimes create

several copies of the same drop — especially with multiple panes open.

Drops are routed once and uploads single-flight, so one drag means one

landing.

Open more than code

Click a file and K2 picks a preview when it can:

-Images — PNG, JPEG, GIF, WebP, SVG, ICO (and friends), including

files on remote hosts

-CSV / TSV — table view you can scroll and edit
-Zip — list contents, with a clear path to Extract on the host
-Audio / video — play on your machine (the thin client), not the

remote server’s speakers; bytes stream from the host daemon

-Diagrams — Mermaid (.mmd / .mermaid) rendered in the viewer
-Everything else binary — a clear empty state instead of a broken

text tab

Spreadsheets and slide decks (xlsx / pptx) are still out of scope for this

release.

Polished tree

Folders sort first, icons follow light/dark (Seti-style), and **Reveal in

Finder** / the OS equivalent is labeled correctly.

---

Download K2_0.40.58_aarch64.dmg (38.2 MB)

v0.40.57

July 22, 2026

0.40.57 — Live agent terminals stay alive across brief disconnects

The Active reaper no longer kills a live agent terminal just because the

app or control plane briefly disconnects. If the PTY is still running, the

session is left alone — only truly idle/orphaned sessions are aged out.

Explicit dismiss still closes chats the way you expect. Closing or

dismissing a session yourself is unchanged.

Daemon stderr is quieter too: terminal poll performance histogram lines no

longer spam the log during normal use.

---

Download K2_0.40.57_aarch64.dmg (37.3 MB)

v0.40.56

July 21, 2026

0.40.56 — Agent passports no longer die overnight

Long-running agents were losing the ability to use the K2 CLI

(k2 msg, inbox, peers, and other in-cell tools) after about a day, with

errors that looked like an expired auth token — even though the agent

session itself was still alive.

What was wrong

Each agent cell gets a scoped passport (K2_HOOK_TOKEN) at spawn so it

can call the daemon without holding the full owner secret. That passport

had a hard 24-hour wall-clock expiry, and there was no way to refresh

it while the process was running. After 24 hours the daemon rejected the

token; messaging and other CLI verbs failed until you restarted the cell.

What we fixed

Passports now last for the life of the agent cell. They still stop

when the session is torn down (or on a global revoke) — that is intentional

security. They no longer suddenly expire just because the clock advanced.

If an agent already hit the old expiry, restart that session once after

updating so it mints a fresh passport under the new rules.

---

Download K2_0.40.56_aarch64.dmg (37.3 MB)

v0.40.55

July 21, 2026

0.40.55 — Clone To: full chat history + your pin comes with you

Clone To is a real workspace migration again — not “files only, then

figure out /resume.”

Chats show up after clone (no awkward first resume)

Past conversations appear in Chat History and the agent chat dropdown as

soon as the workspace lands on the destination. You no longer need a

mystery /resume just to make the list wake up.

Pinned Chat stays pinned to the same conversation

If the workspace had a Pinned Chat tied to a specific session, that

session id travels with the clone (when the transcript is present). Stars

and custom chat names for those sessions come along too.

More than Claude — the agents you actually use

Clone To can now carry session history for the major harnesses K2 already

knows how to resume:

-Claude Code (as before, plus the list fix above)
-Cursor Agent chats
-Gemini CLI
-Pi
-Codex
-Grok
-Hermes (workspace rows only — never a whole account database)

Paths and project slugs are rewritten for the destination machine so

resume keeps working when the home path changes (Mac → Linux, etc.).

What we deliberately do *not* copy

Provider logins and subscriptions stay put. The destination server is

expected to use its own Claude / Grok / Codex / … accounts. Clone To

moves workspace + chat history, not credentials, auth tokens, or

Keychain blobs. Sign in on the other box if you haven’t already.

Also unchanged: tunnel identity, connect-users, and machine-local K2

state stay on each host.

---

Download K2_0.40.55_aarch64.dmg (37.3 MB)

v0.40.54

July 21, 2026

0.40.54 — Tunnel resilience + hosted web (beta)

Two Connect upgrades: tunnels that actually stop, and a beta browser

client for your machine at https://.app.k2.dev.

Hosted web client — beta, available now

Open your K2 server in a normal browser while the desktop app (or headless

daemon) is online with Connect running:

-URL: https://.app.k2.dev (example: https://z3thon.app.k2.dev).
-Same workspace UI you know from the app — sign in with your K2 Connect

user, sessions and terminals over the tunnel.

-Owner wall: hosted web can be turned off with the daemon

web_client_enabled / owner settings if you do not want browser access.

-Beta means: real and usable for day-to-day poking and remote access;

expect rough edges, rapid fixes, and desktop remaining the primary client.

-Security note: the browser path is standard secure-web (TLS at the

edge, cookie session on your daemon). Desktop Connect to

.k2.dev stays the true end-to-end tunnel path.

Bookmark your .app.k2.dev URL once the tunnel is up. If the machine is

asleep or the tunnel is down, the page will say so until it comes back.

Tunnel resilience (Stop means stopped)

Connect tunnels that used to leave a live frpc behind after Stop,

daemon restart, or self-update — and that could desync from the live

listener on older builds — now tear down cleanly and keep serving after a

transient frpc drop without a full daemon restart.

#### Stop actually kills the tunnel

-Stop / disable / SIGTERM always reaps the supervised frpc for this

daemon's config, including the default single-relay (solo) path.

-No more "UI says stopped, subdomain still registered" from an orphaned

local frpc after update or restart.

-Tunnel stop status is taken from the real connector state after the kill.

#### Self-heal on frpc drop (no agent kill)

-When frpc exits and the daemon stays up, reconnect reuses the live

E2E listener port — it does not invent a new localPort while sockets

are still bound.

-Full daemon restart still produces consistent ports (the path that always

worked). Prefer this build on any box that saw silent external outages

while systemctl still showed active (fleet boxes on pre-fix builds

should upgrade).

#### Identity for multi-device tunnels

-frpc login metadata now carries device_id when the daemon has one,

so the relay can tell same-token machines apart (groundwork for

cross-machine eviction on the control plane).

#### Connect tunnel picker — apex only

-After signing in to your k2.dev account, the subdomain list for **Start

tunnel only shows purchased apex** names (you.k2.dev). Nested

routes (api.you.k2.dev, staging.you.k2.dev, …) no longer appear as

tunnel targets — those are routing under an apex tunnel, not separate

tunnels.

Upgrade any Connect server that flapped after tunnel restart or left

orphan frpc after systemctl stop / self-update — and try the beta web

client at https://.app.k2.dev once the tunnel is up.

Download K2_0.40.54_aarch64.dmg (37.3 MB)

v0.40.53

July 20, 2026

0.40.53 — Remote Session (safer-than-SSH help over Connect)

Consent-gated, time-boxed shell drive on a K2 device — for migrations and

remote help without handing out root SSH or permanent keys.

Turn it on (owner)

-Default OFF. Nothing remote can open a shell until you enable it.
-k2 remote-session enable / disable. Master wall; disable kills every

remote shell immediately.

-k2 remote-session grant --ttl 45m --label "…". Mints a one-time

k2rs_… drive token (shown once). Revoke with

k2 remote-session revoke .

Drive (helper / agent)

-k2 remote-session shell --token k2rs_… opens a daemon-user login

shell (never root). Works locally or via Connect with --host.

-write / read drive that session. Wrong token, expired grant, or

wall OFF → clear teaching errors (not a silent failure).

-Audited denials. Attempts while OFF (or without a grant) show on

k2 remote-session status so you always know someone tried.

What this is for

-Laptop → server growth / soul-transplant work as the K2 user, without

root SSH. Full automated runbooks come later; this release is the safe

hands + grant layer so real migrations can teach the runbook.

See docs/remote-session.md for the full cookbook.

Download K2_0.40.53_aarch64.dmg (37.3 MB)

v0.40.52

July 17, 2026

0.40.52 — Headless Connect CLI + wiki session revive

Provision a Linux box from the shell, and public-wiki chat sessions recover

cleanly after idle reaping.

Headless K2 Connect onboarding

-k2 users add. Create the first owner (or more Connect users) on a

headless daemon: hidden password prompt or --password-stdin, then

--role owner|admin|member|viewer. Uses the daemon owner token on the

box (external setup works without a session passport); in-cell agents

stay on their scoped passport and cannot elevate.

-k2 connect login. Pair a purchased k2.dev subdomain from the CLI:

account email/password (or --token access JWT) → pick a subdomain →

write tunnel config → start tunnel → print the live URL. Session stored

in ~/.k2/connect-account.json (0600); password is never written.

k2 connect status / k2 connect logout for check and re-auth.

Manual K2_TUNNEL_TOKEN remains the automation fallback.

Public wiki session lifecycle

-Close audit tabs when reaped. Idle host-session PTYs no longer leave

a dead terminal open in the app.

-Resume opens a new audit tab. After reaper kill, waking the same

session (stored session id) surfaces a fresh tab so the inject is visible

again.

-Cold inject path aligned with k2 msg --wake. Host-session first

message uses settle + readiness + screen quiescence so Grok (and peers)

don’t lose the paste during first paint.

Download K2_0.40.52_aarch64.dmg (37.2 MB)

v0.40.51

July 16, 2026

0.40.51 — Public wiki chat + agents control heartbeats

Wiki visitors can talk to a workspace agent in the site itself, and agents

can manage their own heartbeat schedules without fake “invalid token”

errors.

Public wiki chat

-Ask this wiki. Workspaces can turn on public chat for a published

wiki (default off). Visitors get a third-column chat panel on the live

site; messages run through the same host-session API as external keys,

with the chat key held only on the daemon (never in HTML or browser

responses).

-Unattended from the first turn. Enabling public chat opts the

workspace into skip-permissions for host sessions so the visitor’s

first message isn’t stuck on a human approval prompt. First-message

inject also waits for screen quiescence so the paste isn’t wiped by

the agent’s startup repaint.

-Guest policy. Owner-set guest framing still applies on every turn

(read-only preference + k2 respond), same as other API host sessions.

Agents own heartbeat schedules

-k2 heartbeat works from agent sessions. Agents can list, add,

edit, enable/disable, and fire workspace schedules with their session

passport (UDS when in-cell, TCP dual-auth otherwise). The daemon stamps

the caller’s workspace so one agent can’t schedule into another’s

project.

-Clear owner-only teaching. OS tick install, fleet-wide lists, and

similar owner surfaces no longer say “Invalid or missing auth token”

when an agent passport is presented — they return owner_only with a

hint to ask the human. Agents stop chasing a “broken token” that was

really a scope boundary.

Download K2_0.40.51_aarch64.dmg (37.2 MB)

v0.40.50

July 15, 2026

0.40.50 — CLI stays current on Linux servers

Server updates no longer leave the k2 command stuck on an old version

while the daemon moves ahead.

Server updates

-The k2 CLI can no longer fall behind the daemon. On Linux

servers, the daemon refreshes the k2 command alongside itself on

every update. If the system-wide install at /usr/local/bin/k2 isn't

writable by the daemon's user (a common setup/migration artifact), the

daemon now stages the current CLI at ~/.local/bin/k2 instead of

silently leaving the old version in place. Server provisioning also

installs the CLI daemon-writable from the start.

Download K2_0.40.50_aarch64.dmg (37.1 MB)

v0.40.49

July 15, 2026

0.40.49 — Pair as federated peer

Cross-server agents needed one more obvious step: trust. Turning on

federation and signing into a server was never enough by itself — the two

daemons still had to pin each other as peers. That step is now a button.

Federated peer pairing

-Pair as federated peer. On Settings → Connections, each signed-in

server tile has a Pair as federated peer button. One click establishes

mutual trust between this Mac and that server (owner on both sides). When

it works, the tile shows Peer: trusted.

-No more chicken-and-egg. Workspace Federated Connections used to ask

you to pick a federated server before any peer existed — and there was no

UI path to create the first one. Pair from Connections first; then the

server shows up in Federated Connections so you can link agents.

-Clear empty states. Federated servers and Federated Connections empty

lists now point you at the Pair button instead of a vague "pair first"

hint.

Download K2_0.40.49_aarch64.dmg (37.2 MB)

v0.40.48

July 15, 2026

0.40.48 — Resilient reconnect

Server reboots and updates are now a non-event. When a host you're

connected to restarts, K2 notices, waits politely, and reconnects on its

own — no more infinite "Reconnecting…", no more restarting your app to

recover.

Reconnect that actually recovers

-Restarts self-heal. When a remote host reboots or updates, K2

detects the fresh server instance and quietly reconnects and resyncs.

The recovery pill (now square, matching the rest of K2) tells you

what's happening and gets out of the way when it's done.

-The stuck-connection escape hatch. Some macOS network sessions can

keep reusing a dead connection after a server restart (the "works in

curl, broken in the app" wedge). K2 now detects this with an

out-of-app probe, clears it automatically where possible, and — in the

rare case only a restart cures it — says so plainly with a

Restart K2 button instead of spinning forever.

-No more retry storms. While a host is recovering, K2 stops hammering

it: requests fail fast, retries are spread out, and reconnection happens

the moment the host is genuinely back.

Remote updates you can trust

-"Updated and reconnected." After Update Host, the status line no

longer freezes on "Installing & restarting…" — K2 watches the host come

back and confirms the version it actually returned with. If an update

rolled back, it tells you that instead of pretending it worked.

-Servers release their tunnel cleanly. Daemons now shut down

gracefully on restarts and self-updates (including supervisor stops),

releasing their tunnel registration immediately — so the offline window

during an update is seconds, not minutes.

Heartbeats

-Remote heartbeats show up. The sidebar Heartbeats panel now shows

the heartbeats of the server you're connected to — not your local

machine's. Live/resumable/scheduled states come straight from the host.

-Settings audits the right machine. The workspace Settings →

Heartbeats page (roster, fire history, session picker, delivery

target) now manages the connected host's heartbeats too — everything

you see and change lands on the server you're looking at.

-The fleet Heartbeats page follows your connection. The system-wide

Heartbeats page (every workspace's heartbeats + the fires audit log +

wake-scheduler apply) now shows and manages the host you're connected

to. Requires the host to also run 0.40.48+ for the cross-workspace

lists; older hosts show an honest error instead of silently showing

the wrong machine.

-Errors surface instead of hiding. A failed heartbeat load shows the

actual error instead of an eternal "Loading…".

Layout

-Column splits stick on remote hosts. Splitting the tab area into

columns now saves immediately and survives connection blips — no more

splits quietly reverting when you're connected to a server.

Agent messaging

-Messages to sleeping agents actually arrive. Waking a dormant

agent with k2 msg/k2 talk used to report success while the message

silently vanished — the injection raced the resumed session's redraw.

Delivery now waits for the woken terminal to settle before typing, so

the message lands every time.

-No more false "Agent launch failed" popups. The old launch-failure

guess fired on healthy agent-to-agent messaging (and could quietly

spawn duplicate sessions via its auto-retry). It's gone; the daemon

owns spawn health.

Active area

-Active means alive. A workspace now appears in the Active area

exactly when it has a live terminal session (or is pinned). An agent

woken by a message pops back in the moment its session exists — on

every connected client.

-Dismiss works again. Right-click → Dismiss removes the workspace

from the Active area immediately; its session is put to sleep a few

seconds later.

Download K2_0.40.48_aarch64.dmg (37.1 MB)

v0.40.47

July 14, 2026

0.40.47 — Workspace wiki brain map

Your notes become a living map. Open View Wiki on a workspace to explore

[[wikilinks]] as a force graph, read articles side-by-side, and zoom out to

every brain on the machine.

Workspace knowledge base

-View Wiki. From the workspace panel: a full-page map of

.k2/wiki/ Markdown notes. Click a node to read it; wikilinks in the

article jump to other notes. Hide article collapses the reader so

the graph uses the full width.

-Search + Articles count. Filter notes by title, tags, or aliases.

Articles shows how many real notes match the current scope and

search (not phantom missing links).

-Global / Local. Global is the whole workspace brain. Local zooms to

the neighborhood of the selected note (depth 1–2). Home stays lightly

blue when not selected so you can always find it.

-Seed & Serve. One click creates Home + Index under .k2/wiki/.

Serve a read-only localhost site when you want to share or browse in a

browser. CLI: k2 wiki status|index|note|seed|serve.

K2 fleet map

-K2 tab. See every workspace brain registered on this host

(~/.k2/wiki). Workspace hubs connect into each brain without polluting

per-workspace notes.

-Projects | Groups. Two fleet lenses in their own tab strip:

- Projects — project squares link to member workspace hubs. Filter

with the same workspace/project dropdown used on Feedback.

- Groups — focus-group squares link to hubs when focus groups are

on. Filter with a focus-group menu (All / Ungrouped / each group).

-Membership ≠ wikilinks. Dashed edges are organizational (project or

focus group). Solid edges inside a brain are real [[wikilinks]].

Cleanup

-State is gone product-wide. Workspace States settings and related

surface area are removed so the model stays simpler: workspaces,

projects, and agents.

Download K2_0.40.47_aarch64.dmg (37.1 MB)

v0.40.46

July 14, 2026

0.40.46 — Cross-server agents + WebGL terminal you can tune

Two big tracks since 0.40.45: **federated agent messaging that actually

pairs and talks, and Kessel WebGL** spacing, weight, scroll, and

recovery after workspace switches.

Cross-server agents

-Connect a remote agent in one gesture. On a workspace’s **Federated

Connections**, pick a paired server and an agent it exposes. K2

auto-pairs both daemons (mutual trust, no codes) and records the link

both ways, so either side can message the other. X removes that

agent link (and the reverse when it can). Peer pickers only — no

free-typed hostnames.

-agent::host, not mail. Federated addresses use double-colon

(cortana::rosson.k2.dev). Inbound chat shows [from agent::host], so

agents use k2 msg instead of k2 mail. Legacy agent@host

still works on the way in.

-Install on both machines — the daemon restarts with the app. A

same-version AirDrop used to leave the *old* launchd daemon running

(version matched, binary on disk was new). The app now detects a

replaced k2-daemon and kickstarts it. Open the app once after install

so federation fixes load.

-Clearer federation CLI. k2 fed peers lists pinned servers and

trust. Failed k2 msg agent::host names known peers and hints when a

reply path isn’t paired yet. Error copy says k2, not the old k2so

name.

-Roster only shows contactable agents. Remote agent lists respect

Remote Access / contact permission so you don’t pick agents that won’t

accept federated messages.

-Passport dual-auth on send. Agents can send across servers under

their scoped credential when the connection and trust gates pass —

without elevating to disk-owner for every hop.

Terminal (WebGL painter)

-Per-style text weight. Dark styles preset heavier; light styles

thinner. Override under **Settings → Styles → Terminal text weight

(WebGL) — saved per style and scheme**, live on open tabs. Switching

styles restores that style’s weight.

-Line height & character spacing. Global knobs under

Settings → Terminal (WebGL only): line height (default 1.2× font

size) and character spacing/tracking. Same values across themes; open

tabs update live. DOM painter is unchanged.

-Smoother scroll under pressure. Prewarm backs off before it can

force an atlas clear; wheel paint and scrollbar drag use live geometry;

resync after a big backlog no longer yanks the view when you’re

scrolled up (content seam-match re-anchoring).

-WebGL recovers after workspace switches. Hiding a tab or opening

Settings used to lose the GL context for good. The painter remounts when

the surface is shown again instead of permanently falling back to DOM.

-Richer glyph edges. Default coverage gamma moves so edges keep a

little more ink after smoothing.

Download K2_0.40.46_aarch64.dmg (37.0 MB)

v0.40.45

July 13, 2026

0.40.45 — Safer agent mail, cleaner terminals, smoother painting

Agents get clearer boundaries on mail and messaging — and the terminal

looks and scrolls the way you expect, whether you stick with the classic

painter or try the new WebGL one.

-Mail that knows who you are. Agent mail keeps riding the same

grants and levels you already set, but catalog and send paths are

tighter: the inboxes list is dual-auth with a real session passport,

linked/BYO send follows the same agent-send gate as hosted mail, and

listing every hosted address stays owner-only. Agents can also

schedule outbound mail with --at / --in and track it in the

outbox. Owner-only hostmail and access verbs now answer with a clear

owner-only teaching error (exit 3) instead of a misleading

“invalid token.”

-Connections before you talk. Cross-workspace msg, read, and

inbox compose from an agent require a local connection first — no more

silent surprise paths. Creating those connections stays **off by

default** until you enable “Allow agents to create connections” in

Settings (or per workspace). Compose and inbox targets also stay put

under stamp (no more writing the wrong inbox after identity stamp).

-Copy that actually pastes. New agent sessions inherit a proper

UTF-8 locale, so box-drawing and typography copied from TUI tools

(Claude Code, etc.) land on the pasteboard cleanly instead of as

mojibake.

-Terminal painter upgrades (opt-in WebGL still in Settings). Better

synthetic box/block glyphs, steadier scroll (no hop or jump-back while

scrolled up), fuller TUI wheel forwarding, weight/smoothing fixes for

“chonky” text, and emoji that keep their width and a bit more presence.

Flip Settings → Terminal → Terminal Painter when you want WebGL;

DOM remains the default.

-Phone push that actually fires. Feedback and project-chat already

knew how to notify; a gateway URL normalization fix means those

notifications reach registered devices instead of dying on a bad path.

Download K2_0.40.45_aarch64.dmg (37.0 MB)

v0.40.44

July 13, 2026

0.40.44 — DNS your agents can manage

Point a domain at K2 and let an agent run its DNS — safely, because every

agent now carries its own identity.

-Manage DNS from the CLI. If a domain's nameservers point at K2, your

agents can now view and change its records with k2 dns — `k2 dns

access to see what they're allowed to touch, list / records` to

read, and record add|remove for A / AAAA / CNAME / TXT / MX / SRV /

CAA. It's off by default: nothing happens until you grant it, per

server or per workspace, in Settings → K2 Connect. Creating or deleting

whole zones stays a human-only action.

-Every agent gets its own secure identity. Under the hood, each agent

session now carries an unforgeable credential that K2 issues the moment

the session starts — so a capability you grant one agent can't be

borrowed by another, even on the same machine. This is what makes

handing an agent real power like DNS safe, and it's the foundation the

rest of the permission system now builds on. Nothing to configure; it

just works.

-A cleaner CLI contract for agents. k2 publish now speaks --json

like k2 dns, k2 mail, and k2 tunnel do, and help text, error

format, and exit codes are consistent across all of them — so agents

scripting against K2 get predictable, machine-readable output

everywhere.

Download K2_0.40.44_aarch64.dmg (36.9 MB)

v0.40.43

July 12, 2026

0.40.43 — Resilient Edge

Your tunnel now survives infrastructure failures — and you get real control

over its lifecycle.

-Automatic tunnel failover. K2's secure tunnel now knows about a

*list* of relay servers instead of one. If your relay becomes

unreachable — mid-session or at connect time — the tunnel automatically

re-homes to a backup relay within seconds and fails back once the

primary has proven stable. New K2 Cloud servers get the two-relay

configuration out of the box; existing tunnels keep working exactly as

before and gain failover as their configuration updates. Nothing to set

up, nothing changes about your you.k2.dev address.

-Disable vs. Release — two clear tunnel controls. *Disable* pauses

the tunnel and stays paused across daemon restarts, reboots, and even a

forgotten background daemon — no more zombie processes reclaiming your

subdomain. *Release* goes further: it permanently retires this device's

claim on the subdomain (with a confirmation step), so a stale backup or

an old machine can never contest the name again. `k2 tunnel

disable|enable|release` from the CLI, or Settings → K2 Connect in the

app. k2 migrate now releases the old machine's claim automatically as

its final step.

-Public API toggle in Settings. The /v1 HTTP API can now be

switched on per server by the owner in Settings (or k2 api on|off) —

it takes effect immediately, no restart, and the K2_API=1 environment

variable still works as a force-on for headless deployments.

-Fixed: remote updates on Linux now actually install. On some Linux

deployments, "Download & install" would verify and stage the new

version, restart — and come back running the *old* one, with no error.

(The helper process that swapped the binary was being killed by systemd

before it could do its job.) The daemon now installs the update itself

before restarting, so it works on any Linux box regardless of how its

service was set up — and if an update ever fails to boot, it rolls back

to the previous version automatically.

Download K2_0.40.43_aarch64.dmg (36.9 MB)

v0.40.42

July 12, 2026

0.40.42 — K2 gets email

The big one: agents can now run and use real email. Three pieces, tied together by one CLI.

-A mail CLI built for agents (k2 mail). The layer that brings it

all together: a workspace's agent can mint addresses, list and read

incoming mail, block on k2 mail wait for a verification code, and

send / reply / draft — all under your governance (off by default,

approval, or on, with an outbox and audit trail). Every message body

arrives wrapped in BEGIN/END EXTERNAL EMAIL markers so the agent treats

it as data, never instructions. Whether an address is hosted by K2 or a

linked account you own, it's the same verbs.

-Host your own mail server — Email Hosting (Linux). On a Linux

deployment, Settings → Email Hosting stands up a real mail server: add a

domain and K2 shows the exact MX / SPF / DKIM / DMARC / rDNS records

to set, verifies them, then you mint unlimited addresses on that

domain (cPanel-style, with catch-all and plus-addressing). A built-in

deliverability doctor probes port 25, reverse DNS, blocklists, TLS,

and open-relay safety and grades your send readiness; send **direct from

the box or via a relay** (SMTP / SES / Mailgun / Resend). (On Mac the

page shows with a "Linux deployments only" banner.)

-Or link an inbox you already have — Email Linking. Connect your own

account as a read + draft (and, when you allow it, send) assistant

inbox, bound to one workspace. Two ways in: an app-password over

IMAP (Gmail, Fastmail, company IMAP), or Gmail over OAuth — sign

in through Google in your browser, no app-password to generate. Reply

drafts land in the account's real Drafts folder for you to review.

Microsoft (Outlook / 365) is coming soon.

-Attachments + bring-your-own OAuth. k2 mail send/reply take

--attach (repeatable), and k2 mail outbox lists what you

attached. And Settings → Email Link → OAuth apps (advanced) points

K2 at your *own* registered Google/Microsoft OAuth client — your quota,

your consent screen — instead of the built-in default; the client secret

is write-only, vaulted and never shown back.

-Organize + polish. Move, flag, archive, delete-to-Trash, and manage

folders on any inbox — plus a batch of help-text, status, routing, and

wording fixes from real agent testing.

Download K2_0.40.42_aarch64.dmg (36.9 MB)

v0.40.41

July 11, 2026

0.40.41 — The heartbeat CLI you were promised

-Point a heartbeat at a trained session. Every heartbeat tile (in

Workspace Settings and the Heartbeat Settings page) now has a delivery

drop-down: Pinned chat, Own session (fresh on next fire), or

any saved session in the workspace — Claude, Codex, Gemini, whichever.

Train a session once, then let the heartbeat wake *that exact session*

on schedule; a one-line wakeup is enough because the session already

knows the flow. The open button beside it jumps straight to wherever

the heartbeat delivers. Agents get the same lever via

k2 heartbeat session [--pinned|--auto|--set --provider

].

-k2 connect is now k2 publish (breaking). Putting a subdomain

on the internet is *publishing*, so the CLI verb finally says so:

k2 publish status and `k2 publish subdomain

create/list/point/rm/claim/unclaim. There is no alias — k2 connect`

now fails with a one-line pointer to the new verb. (Only the CLI verb

changed; the K2 Connect product and Settings page keep their name.)

-k2 heartbeat --help is finally just help. Asking any heartbeat

command for help used to get parsed as a schedule and *written* —

routine discovery corrupted your schedule state. Help now prints usage

and exits, everywhere, guaranteed. (GH#22, #23, #24)

-The documented commands exist now. `k2 heartbeat schedule

add/list/remove/edit/rename/enable/disable and k2 heartbeat signal

fire/wakeup/wake` — the surface the docs and skills always described —

are wired to the real named-heartbeat system. Bare k2 heartbeat

lists your schedules instead of erroring. Unknown subcommands and

misspelled flags are loud usage errors instead of silent writes or

silently-ignored options. (GH#10, #24)

-Give a heartbeat its job at birth. `k2 heartbeat schedule add

--instructions "..." (or --instructions-file `) writes the

WAKEUP.md at create time — no more schedules that fire with no defined

work, and no $EDITOR required for headless agents. (GH#23, #24)

-No more heartbeats that can never fire. Creating a heartbeat now

warns loudly if the schedule transport (launchd/cron) isn't installed

or has stopped ticking. The daemon also rejects junk schedule writes

from older CLIs and cleans up any junk they already left behind.

(GH#22, #23)

Download K2_0.40.41_aarch64.dmg (35.6 MB)

v0.40.40

July 9, 2026

# K2 0.40.40

Hotfix on hotfix/chat-styles-shortcuts (from main). Five focused fixes.

Fixes

Project chat permissions + attribution

-UI: composer gated on Connect role (Owner / Admin / Member can post;

Viewer read-only) — no longer blocked by presence window-mode.

-Daemon: POST /cli/project-group/msg requires ≥ Member; Viewers get 403.
-Human posts store the real session author (username / owner), not always

"owner".

Styles are per-client

-Style selection SSOT is localStorage; daemon is no longer canonical.
-Host switch does not restyle the client.
-One-shot migrate from daemon style when local mirror is empty.
-Multi-window sync via storage events.

Cmd+N single-fire

-File menu accelerators that duplicated useTerminalShortcuts chords

(N / T / Shift+T / D / O / W) removed; webview is the keyboard owner.

Projects wake → Active

-Dashboard (and Feedback) wake / live attach call activateProject for

the member workspace before ensure-pinned-chat, so Active reaper

spares the session (~15s grace no longer fires while watching).

Commits

-fix(projects): gate project chat post on Connect role (not window-mode)
-fix(daemon): project chat msg requires ≥ Member + real author attribution
-fix(styles): per-client Style selection — stop daemon SSOT + migrate local
-fix(shortcuts): Cmd+N creates one note — drop menu accelerators that double-fire
-fix(projects): activate member workspace on dashboard wake so Active reaper spares it
Download K2_0.40.40_aarch64.dmg (35.6 MB)

v0.40.39

July 8, 2026

0.40.39 — The agent status you can trust

-Tab spinners tell the truth now. The little braille spinner on a

tab used to die a second after you switched away — the app lost sight

of hidden panes. Activity detection now lives in the daemon, which

watches every session whether or not anyone's looking, so spinners

stay accurate across tab switches, across windows, and across remote

connections.

-The completion chime rings when the agent actually finishes. Same

root cause: switching away used to fire the chime ~5 seconds later

regardless of whether the agent was done. Now it rings at the real

moment of completion — and only for work you weren't watching.

-An amber square shows you WHICH tab finished. When an agent

completes while you're elsewhere, its tab now shows an amber square in

the spinner slot (matching the Active bar's amber dot) until you visit

it. Lots of tabs, one chime — now you know where to look. Hover still

gives you the ✕ if you just want to close it.

-Your agent sessions are now archived before providers delete them.

Some agent CLIs quietly remove session transcripts after ~30 days. K2

now sweeps daily and copies aging sessions into

.k2/session-archive/ inside each project (originals untouched —

resume keeps working). Default is 14 days; configurable via the

session_archive_days setting, 0 disables.

-Remote sessions feel local. Tab renames, project settings, and

chat history now update instantly for everyone connected to a server —

no more reloading to see a teammate's changes.

-Tab icons survive logout. Agent launcher icons (and launch

commands shown in tab tooltips) no longer vanish when you log out of a

server and back in.

Download K2_0.40.39_aarch64.dmg (35.6 MB)

v0.40.38

July 8, 2026

# K2 0.40.38 — "Make K2 yours: Styles"

The modular Style System: K2's entire visual language — colors, radii, borders/rings,

shadows, glass materials, spacing, motion, terminal colors — is now schema-validated

data, switchable at runtime.

Styles

-Settings → Styles (new page): master-detail picker with style cards, palette

swatches (including terminal ANSI-16 strips), Light/Dark/Auto scheme control

(Auto follows the OS appearance live), density presets, style dials, and a live

mini-K2 preview. Hover to preview, click to commit, Esc-safe.

-Three first-party Styles, each with dark + light palettes:

- Square — the classic look, rebuilt on the contract (pixel-parity verified by a

zero-threshold screenshot harness). Palettes: Charcoal, Paper (warm paper-and-ink

light). Density: Compact/Regular/Spacious (floating tiles with draggable seams).

- Liquid Glass *(experimental preview)* — frosted translucent chrome over an

ambient canvas; terminals stay opaque; reduced-transparency and no-backdrop-filter

fallbacks. Palettes: Obsidian, Veil. Includes a Frost dial (blur 0–30px).

- Bezel *(experimental preview)* — the layered-ring aesthetic: hairline → bright

gap → outer line, keycap controls. Palettes: Graphite, Porcelain (the light

original of the ring technique).

-Terminals are part of the theme: every palette carries fg/bg/cursor/selection +

ANSI-16; live terminals repaint on switch (KesselConfigProvider bridge).

-macOS traffic lights follow the style: floating-chrome styles inset the window

buttons with the UI (new set_traffic_light_inset command; re-asserted on resize).

-Style choice persists in daemon settings (AppSettings.style, new typed struct) with

a localStorage mirror for flash-free first paint; cross-window sync via sync:settings.

Under the hood

-Style contract: styles// packages (manifest + tokens + palettes + bounded

overrides.css) compiled by scripts/build-styles.mjs into generated CSS + a typed

registry. Every slot required; missing slots fail the build loudly.

-UI primitives (components/ui/): Surface/Button/Input/Toggle/Callout/Dialog —

the only layer that spells out shape slots. ~600 hardcoded colors migrated to

contract slots across parity-gated waves.

-Style lint ratchet (bun run styles:lint): per-file raw-color budgets that can

only shrink; CI-enforced.

-Community styles: CONTRIBUTING-STYLES.md + a styles CI workflow (schema

validation, policy lint, per-style screenshot matrix attached to PRs). Live authoring

via bun run styles:watch + vite HMR.

-Parity guarantee: Square/Charcoal is byte-identical to 0.40.37 on all content

screens (Playwright WebKit harness, threshold 0); Settings screens differ only by the

new nav item.

Docs

-CONTRIBUTING-STYLES.md, styles/README.md, README "Styles" section.
-Future-work PRDs with builder pre-mortems: runtime-loaded styles V2, email server.
Download K2_0.40.38_aarch64.dmg (35.5 MB)

v0.40.37

July 8, 2026

0.40.37 — Spring cleaning, part one

-The legacy .k2so era is ending — safely. Every internal path now

uses ~/.k2 directly, and on first launch K2 quietly rewrites any

agent CLI configs (Claude/Cursor/Gemini) that still pointed at the old

location. Nothing changes for you; the compatibility link stays in

place as a safety net while the transition completes over the next

releases. A new build-time guard makes sure the old paths can never

sneak back in.

-Settings tell the truth about file locations. A few Settings labels

showed the old ~/.k2so/... paths for models and logs; they now show

where the files actually live.

Download K2_0.40.37_aarch64.dmg (35.5 MB)

v0.40.36

July 8, 2026

0.40.36 — Copy that

-**Copy in a remote terminal, paste on your machine — for real this

time.** Selecting text in a TUI on a remote server now lands on YOUR

clipboard. The 0.40.34 plumbing was right, but the final OS-clipboard

write was silently rejected by the webview; it now goes through a

native path that can't be. Copies go only to the person who made the

selection.

-Open any page in a browser tab. Cmd+K, type or paste a URL (bare

domains like example.com work), hit Enter — a browser tab opens.

Previously only intercepted links could create one.

-Remote workspace images pick from the server. Setting a workspace

or project icon while connected to a remote host now browses the

HOST's files in K2's own picker instead of your local Finder.

-Cmd+Shift+T spawns exactly one terminal. A triple-stacked event

bug could spawn 2–4 agents per press. One press, one terminal.

-Server connections are more reliable for everyone, today. A relay

fix (no app update needed) cures a class of "Server unreachable" /

silent connect failures where the app's requests could bypass tunnel

routing entirely. If relaunching K2 used to fix your connection —

this was why.

Download K2_0.40.36_aarch64.dmg (35.5 MB)

v0.40.35

July 7, 2026

0.40.35 — Fresh-install pairing fix

-New installs pair with the daemon again. A recent change stopped

creating a compatibility link the app relies on to find its daemon, so

brand-new installs on 0.40.33/0.40.34 couldn't connect on first launch.

Fixed — and if you already installed one of those versions, K2 repairs

the link automatically the next time it starts on this version.

Download K2_0.40.35_aarch64.dmg (35.5 MB)

v0.40.34

July 7, 2026

0.40.34 — The web comes to K2

-A real browser tab. K2 can now open web pages in a native browser

pane — a new tab type alongside terminals and files, with an address

bar. It's the foundation for agents that browse.

-Terminal links open in K2 — even from remote servers. When anything

in a session opens a URL (xdg-open, $BROWSER, or clicking a link in

the terminal), it now opens as a K2 browser tab on your screen — even

when the session runs on a headless server an ocean away, where

"opening a browser" used to mean nothing happening on a machine with no

display.

-Remote servers feel live now. Project members, project chat, and

feedback used to update in real time only on your local machine — on a

hosted server you had to leave the page and come back. All of it now

streams live over the same channel that follows your connection.

-Copying inside TUIs works across the tunnel. When a terminal app

copies your selection (OSC 52), the text now lands on the clipboard of

the person who selected it — and only theirs — whether the session is

local or on a remote host.

-API keys can finally reach workspaces. k2 api-key create gained

--workspaces ('*' or a list) — keys minted without a grant authorize

nothing on the /v1 API by design, and the CLI previously had no way to

say otherwise (it now warns loudly when you mint an ungranted key).

Download K2_0.40.34_aarch64.dmg (35.5 MB)

v0.40.33

July 7, 2026

0.40.33 — Your files, where you left them

-Dragging files into K2 always copies now — never moves. Dropping a

file from Finder into the file tree used to silently relocate the

original, which could look like losing it entirely if you thought it

was headed to a remote server. External drops are copies, full stop;

reorganizing files within the tree still moves them like before.

-Clones carry your whole workspace. "Clone to server" quietly left

behind anything your .gitignore listed — which usually meant your

agent's entire .k2/ folder (persona, skills, heartbeats) and your

.env files, even with "Include secrets" checked. Agent state now

always travels, and the Include-secrets toggle genuinely decides

whether your .env/.auth files come along.

-New machines stop growing a mystery .k2so folder. The

compatibility symlink now only appears on machines that actually

migrated from the pre-0.40 layout.

Download K2_0.40.33_aarch64.dmg (35.5 MB)