Releases: mcdonc/klangk
Release list
v2.0a3
Added
-
Git authentication via the browser for Gitea hosts (#3385). A
KLANGKWS_FEATURE_OAUTH_PROVIDERSentry with
flow: authorization_code_pkceruns the OAuth authorization-code
flow with PKCE (S256) for hosts like Gitea that implement no device
flow: the firstgit cloneopens an authorization popup, approval
happens on the Gitea page, and the tab session refreshes the token
headlessly afterwards. The operator registers a public OAuth
application in Gitea's user settings pointing at the klangk origin;
see the new Gitea docs chapter. GitHub and GitLab device
flows are unchanged. -
PyPI project links (#3369). The
klangkwheel now carries
project.urls— Homepage, Documentation, Repository, Issues, and
Changelog — so the PyPI project and release pages show the sidebar
links. Changelog points at the docs-rendered changelog page.
Changed
dart formatpre-commit hook verifies instead of rewriting
(#3376). The hook now runsdart format --output=none --set-exit-if-changedviascripts/dart-format-verify.shand fails
on unformatted files instead of silently rewriting them mid-commit —
rewrite mode flipped short→tall style in fresh worktrees (where no
.dart_toolexists to resolve the language version) and wedged prek's
stash rollback during cherry-picks. Files whose package has no
.dart_toolyet are skipped with a notice; rundart formatyourself
before committing. The frontend CI workflow now checks formatting
afterpub get(src/frontendlib+testand every feature package
with tests), and the five files that were off-canonical at the pinned
language version were reformatted.
Fixed
- SSO login completes under an every-visit login banner
(#3371). Withlogin_banner_every_visiton, the browser's
return from the identity provider carried a one-time login code
that the banner gate discarded by redirecting to the consent page
first, so single sign-on could never finish (the code expires in 60
seconds and the redirect replaces the URL). The OIDC callback page
now redeems the code before the banner is shown, and the user is
sent to the consent page on the next navigation as usual. A failed
code exchange shows the error with a “Go to Login” button instead
of stranding the browser on the callback page.
v2.0a2
Fixed
- FIPS fetch pin is Linux-only (#3364). Under
KLANGKD_FIPS_MODE, the startup step that pins ambient OpenSSL
fetches tofips=yes(#3350) now runs only on Linux, where
OpenSSL's FIPS provider exists. On other platforms the step is
skipped and the regular process-posture check still governs
startup; on macOS the previous ctypes load of the system libcrypto
aborted the whole process at load time. - FIPS images pin ambient OpenSSL fetches to
fips=yes(#3359).
The activation config in the FIPS workspace and FIPS host images
now setsdefault_properties = fips=yes, so every process in the
container requires the fips property on provider-less algorithm
fetches, and Node'scrypto.getFips()reports FIPS mode as active.
In the FIPS workspace image this un-breaks the pi coding agent:
jiti (its TypeScript extension loader) chooses its cache-key hash
fromcrypto.getFips()and previously picked MD5 — refused by the
fips provider — which failed every extension load with
error:0308010Cuntilpi -newas used. The configs also set
config_diagnostics = 1: a config that fails to parse now aborts
the process instead of silently falling back to the default
provider.
v2.0a1
Breaking
-
KLANGKD_LISTEN/KLANGKD_EGRESS_LISTENvalues are validated
(#3275). Both settings now fail startup (and deny a SIGHUP reload)
with the setting named unless the value is a bare bind address — an
IPv4/IPv6 literal or a host name, stored stripped + lowercased (a
bracketed IPv6 literal normalizes to the bare form; a trailing DNS
root dot is dropped). A port inside the address (127.0.0.1:8080)
used to boot while silently bindinglisten:KLANGKD_PORT— move the
port toKLANGKD_PORT/KLANGKD_EGRESS_PORTon upgrade; CIDR and
newline values used to wedge the proxy watchdog in an endless
kill/respawn loop or inject Caddyfile directives. The proxy watchdog
now also aborts instead of respawning when Caddy rejects the config
because a configured listener address cannot be bound (unparsed,
unresolvable, non-local, or already taken) — e.g. an interface name
likeeth0, which is a syntactically valid host name that passes
validation. -
Host-header validation changes URL derivation for name-accessed
deployments (#3276). A request'sHostheader now validates against
klangkd's own configuration (loopback, the armedKLANGKD_TLS_HOSTNAME
name, or theKLANGKD_LISTENIP-literal address) before it may name
the authority of any URL klangkd builds — reset/verification emails,
invitations, the OIDC redirect, hosted-app URLs; every other value
falls back tolocalhost. Migration: deployments reached by an
identity klangkd does not configure (KLANGKD_LISTEN=0.0.0.0by DNS
name or non-literal address, a hostnamelisten, an outer proxy not
inKLANGKD_TRUSTED_PROXY_CIDRS) must setKLANGKD_HOSTING_HOSTNAME
or their links, container hosted-app URLs, and the OIDCredirect_uri
(login fails on the mismatch) all namelocalhost. Loopback,
automatic-TLS, and trusted-outer-proxy deployments are unaffected. See
HTTPS Hosting. -
Token-in-URL removal changes client contracts (#3201).
Anything connecting to/wsor/ws/consent-decidermust switch
from the?token=query param to thebearerWebSocket subprotocol
(the JWT rides the handshake'sSec-WebSocket-Protocolheader), and
any client of the verify endpoint mustPOSTthe token in the body
(the GET form is gone). Verification/reset emails sent by a
pre-upgrade server stop working after the upgrade (the new one-time
bindings reject the old token shapes) — affected users must request
a fresh link. See the token delivery policy. -
User bind mounts disabled by default (#3153). With
KLANGKD_ALLOWED_MOUNT_ROOTSunset (previously: any non-protected
host path was allowed), workspace mount entries with a host-path
source are now rejected at create/edit — only named volumes may be
mounted. SetKLANGKD_ALLOWED_MOUNT_ROOTSto a comma-separated
list of roots to allow bind mounts under them. klangkd's own
mounts (workspace home, config, SSL trust, per-workspace nix) are
internal and unaffected. -
Volume ownership + quota rename (#3153). Named volumes are
workspace-owned and cannot be shared across workspaces; volumes
created before this change (user-id labeled, no workspace label) are
no longer mountable — remove and recreate their mounts. The
per-user quotaKLANGKD_VOLUME_QUOTA_PER_USERis now the
per-workspaceKLANGKD_VOLUME_QUOTA_PER_WORKSPACE
(volume_quota_per_workspace). -
Members can create workspaces by default (#3137). The seeded
create-workspaceAllow on/workspacesnow targets themembers
group (which every new user joins) in addition toadmins, so a
stock multi-user deploy is self-service out of the box — bounded by
the admission/quota controls (KLANGKD_ADMISSION_*,
max_running_workspaces_per_user,volume_quota_per_user) and
allowed_images/allowed_mount_roots. On upgrade, migration
m0029 appends the grant after any existing/workspacesrows, so
existing deployments flip too; a deploy that wants the old
admin-only posture adds one explicit Deny formembers(or
Authenticated) ahead of the Allow in the ACL editor. See
ACL System. -
KLANGKD_PER_HANDLE_HOMEis now a ceiling, not a default (#3135).
The flag no longer just pre-selects the home layout for new
workspaces — it gates whether per-handle homes are permitted at all
(the same shapeKLANGKD_ALLOW_SUDOgot in #3047). While it is
false(the default), every workspace gets the shared
/home/klangkregardless of its storedper_handle_homevalue: a
storedtrue(including the population migration 0009 backfilled
for pre-feature workspaces) is inert, clamped at the next
connect/start and never rewritten — no create/edit request is
rejected. Operators whose workspaces rely on per-handle homes must
setKLANGKD_PER_HANDLE_HOME=trueon upgrade. With the ceiling on,
behavior is unchanged (workspaces choose either layout; an omitted
create field stores the flag's value). The Per-handle home toggle
is hidden in the web dialog/settings panel and the TUI forms while
the ceiling is off (per_handle_home_availableon/config), and
the CLI--per-handle-homeflag cannot raise a workspace past the
ceiling. Reloadable on SIGHUP; applies to containers started after
the change. See
Workspaces. -
Per-workspace sudo is now opt-in (#3046, #3047).
KLANGKD_ALLOW_SUDO
no longer grants passwordless sudo by itself — it is now only the
ceiling that permits a workspace to opt in. Sudo is on for a workspace
only when its settings bag storesallow_sudo: true(the Allow sudo
toggle, which now defaults to unchecked in the Flutter dialog/settings
panel and the TUI form, orklangk create --sudo/--sudoon edit);
an absent key means locked down, and atruecan never raise sudo
pastKLANGKD_ALLOW_SUDO=0. On upgrade, existing workspaces with
no storedallow_sudokey lose sudo at their next container start
(no bag migration runs) — opt them in withklangk edit <ws> --sudo
if they need it. See Container
packages. -
Volumes are an admin surface (#2993).
GET /volumesnow checks
the newview-volumespermission (the admin Volumes tab's listing
gate), whilePOST /volumesandDELETE /volumes/{name}keep
manage-volumes— both seeded Allow for theadminsgroup only,
so non-admin users lose volume list/create/delete access on
upgrade (migration m0026 replaces the old rows; custom operator
rows that don't match the seeded shapes survive below the new admin
rows — re-grant via the ACL editor if a deploy wants self-service
volumes back). The tab lists and deletes volumes (delete needs
manage-volumes); there is no create surface, and
manage-volumesholders may delete any instance volume. The
listing now returns the whole inventory — creator provenance,
using-workspace names, search, and paging — in a
{volumes, page, page_size, total}envelope documented in
docs/reference/api-endpoints.md;klangk volumes lsships with
it, but external API consumers must read the envelope. -
Deploy-wide consent decider removed (#2976). The
/ws/consent-deciderhandshake without a?workspace=param is now
refused (HTTP 403): consent authority is strictly per-workspace
(egress-consenton/workspaces/{id}), andmanage-server-schedule
no longer authorizes any consent path. Operators who relied on a
standing admin decider covering every interactive workspace lose that
override: a workspace with no connected member decider now reverts to
its static allow-list. Theklangk shellpopup decider and the web
workspace page both register a decider whenever the member holds
egress-consent, so interactive workspaces keep working for their own
members. -
Deploy capability toggles moved off the images listing (#2994).
GET /api/v1/imagesno longer returnsnix_available/
sudo_available— read them from the new authenticated-only
GET /api/v1/configfields of the same names. Hand-built clients
reading the toggles off the images response must switch to/config.
Migration0025also removes the retired seed's Deny Everyone row on
/images(it gated no route): authenticated users' effective
permissions on/imagesnow include theviewinherited from/,
visible in/my-permissions— informational only. -
Workspace-sphere permission names (#2946). Every stored ACE and
every client that checks a workspace permission must use the new
specific names:create-workspace(on/workspaces),
edit-workspace,delete-workspace,duplicate-workspace,
transfer-workspace(replacesadminon the workspace),
monitor-workspace,export-workspace,share-workspace,
share-advanced(replaceschange-acls), andfiles-view
(replacesfiles). Migration m0022 renames the stored ACE rows
automatically, including per-workspace role groups;view,
terminal,files-download,files-write, and the egress/shared-
terminal names are unchanged. Scripts and hand-built clients that
check or grant the old names must rename them the same way.
Lifecycle control also splits out ofterminal:start-workspace,
stop-workspace, andrestart-workspaceare now checked on their
own. m0022 grants the trio to every existing workspace's
coders-*/collaborators-*role groups (matching the fresh seeds);
spectators no longer hold lifecycle control — re-grant the trio
manually if a spectator group should keep it. -
Self-service surfaces are permission-gated (#2946). The volumes
API and the images listing now checkmanage-volumesand
`view-...
v1.0.5
What's Changed
Full Changelog: v1.0.4...v1.0.5
v1.0.4
What's Changed
- Upgrade to klangk-plugin-api v0.2.0 and render plugin app bar actions by @mcdonc in #1370
- Upgrade to klangk-plugin-api v0.2.0 and render plugin app bar actions by @mcdonc in #1371
Full Changelog: v1.0.3...v1.0.4
v1.0.3
What's Changed
Full Changelog: v1.0.2...v1.0.3
v1.0.2
What's Changed
- fix(backend): disable uvicorn ProxyHeadersMiddleware for outer proxy compatibility by @mcdonc in #1356
- Expose a build variant version alongside the canonical klangk version by @mcdonc in #1359
- Consolidate customization dirs into KLANGK_CUSTOMIZE_DIR by @mcdonc in #1361
Full Changelog: v1.0...v1.0.2
v1.0.1
What's Changed
- feat: per-workspace JWT auth for container→host endpoints by @mcdonc in #232
- feat: chat history pagination — load older messages on scroll by @mcdonc in #244
- feat(ws): auto-reconnect WebSocket with exponential backoff by @mcdonc in #247
- perf(e2e): extract API tests to reduce E2E wall time by @mcdonc in #243
- Add workspace-open timing instrumentation by @mcdonc in #249
- fix(terminal): reassemble PTY UTF-8 across read chunks (terminal ghosting) by @runyaga in #250
- Stop pushing :latest tags to GHCR, pin workspace base image by @mcdonc in #257
- Add [skip ci] to automated base image bump commits by @mcdonc in #259
- Bump workspace base image to 2026.06.11-2603487 by @mcdonc in #258
- Run tests automatically on pushes to release branches by @mcdonc in #260
- docs: update ARCHITECTURE.md and HACKING.md to reflect current state by @mcdonc in #263
- fix(build): regenerate web plugin registrant when the plugin set changes by @runyaga in #254
- feat(terminal): ⌘/Ctrl-click terminal paths open in the file viewer by @runyaga in #252
- docs: convert to Zensical docs site by @mcdonc in #266
- feat: add customize/ example for custom host container deployments by @mcdonc in #268
- Update workspace base image: bash shell, remove sudo by @mcdonc in #287
- Fix crun fchownat errors with rootless userns by @mcdonc in #291
- Use tmux as terminal initial command by @mcdonc in #288
- fix(plugins): send workspace JWT to browser-delegate bridge calls by @runyaga in #275
- Bump workspace base image to 2026.06.12-170fe20 by @github-actions[bot] in #292
- fix(workspace): set tmux extended-keys-format to csi-u by @mcdonc in #295
- feat(workspace): add Shut Down Container button by @mcdonc in #305
- feat(workspace): per-user HOME directories with handle-based naming by @mcdonc in #302
- fix(workspace): auto-create handle on workspace connect, not ui_ready by @mcdonc in #309
- Bump workspace base image to 2026.06.12-c965428 by @github-actions[bot] in #308
- fix(devenv): share podman image storage across checkouts by @mcdonc in #311
- chore: stop tracking pubspec.lock by @mcdonc in #312
- feat(terminal): add tmux window management for terminal tabs by @mcdonc in #314
- feat(terminal): shared terminal backend with permission model by @mcdonc in #321
- fix(devenv): guard su/util-linux to Linux-only by @runyaga in #335
- feat(chat): AI agent integration via Pi RPC by @mcdonc in #336
- fix(container): serialize container creation per workspace by @mcdonc in #337
- fix(terminal): shared terminal E2E fixes and state persistence by @mcdonc in #340
- fix(e2e): relax PageUp assertion on Firefox by @mcdonc in #346
- fix(container): populate home with /etc/skel so .bashrc works by @mcdonc in #347
- fix(container): setup-home.sh script with default PS1 by @mcdonc in #348
- feat(container): per-user Pi agent config (#300) by @mcdonc in #349
- fix(terminal): target joiner session in select_window for shared terminals by @mcdonc in #352
- feat(acl): grant collaborators share-terminals permission by @mcdonc in #350
- feat(cli): add ~. escape to disconnect from klangk shell by @mcdonc in #353
- feat(agent): give MrBoops a real home directory with Pi config by @mcdonc in #358
- docs(chat): rewrite chat docs with AI agent section by @mcdonc in #343
- feat(container): restore passwordless sudo for klangk user by @mcdonc in #361
- fix(container): warm userns mapping to avoid 27s first-create delay by @mcdonc in #363
- docs: add invitation and files feature documentation with screenshots by @mcdonc in #366
- docs: clean up features index, getting started, and CLI reference by @mcdonc in #369
- feat(terminal): add KLANGK_DISABLE_TMUX toggle for plain shell by @runyaga in #360
- fix(container): add UTF-8 locale for tmux unicode support by @mcdonc in #372
- Bump workspace base image to 2026.06.16-fc124ea by @github-actions[bot] in #373
- fix(terminal): auto-exit tmux copy mode on scroll to bottom by @mcdonc in #381
- fix(terminal): send Shift+PgUp/PgDn to PTY for tmux scrollback and mouse scroll wheel in klangk shell by @mcdonc in #383
- feat(container): make passwordless sudo configurable via KLANGK_ALLOW_SUDO by @mcdonc in #386
- docs: document password reset token flow and JWT renewal gap by @mcdonc in #394
- fix(api): use explicit resource function for workspace role ACL checks by @mcdonc in #387
- docs: document workspace JWT lifetime limitation and lack of renewal by @mcdonc in #395
- fix(security): restrict CORS origins instead of allowing all by @mcdonc in #391
- feat(plugins): plugin configuration system (#385) by @mcdonc in #401
- feat(container): git credential helper for browser-delegated auth by @mcdonc in #402
- fix(devenv): track devenv.lock to pin nix inputs by @mcdonc in #406
- fix(cli): add retry with backoff for transient HTTP failures (#341) by @mcdonc in #404
- fix(cli): skip broadcast messages while waiting for workspace_ready by @mcdonc in #415
- feat(plugins): lifecycle hooks and flattened tools by @mcdonc in #413
- fix(podman): add 30s timeout to podman subprocess calls by @mcdonc in #416
- feat(bridge): replace bridge token with browser ID by @mcdonc in #417
- feat(terminal): cross-viewport text selection via tmux mouse mode by @mcdonc in #418
- fix(e2e): increase WebSocket timeouts for shared terminal tests by @mcdonc in #424
- fix(ws): stop auto-reconnect after 5 minutes by @mcdonc in #425
- feat(git-credential): GitHub OAuth device flow by @mcdonc in #426
- fix(workspace): add navigation to loading/disconnected screens by @mcdonc in #433
- feat(chat): display user handle instead of email by @mcdonc in #435
- feat(frontend): stale build detection with reload banner by @mcdonc in #434
- fix: plug memory leaks in long-running server processes by @mcdonc in #438
- fix(e2e): raise tab-speed threshold to 3s for CI headroom by @mcdonc in #436
- fix(devenv): stop generating podman storage.conf by @mcdonc in #441
- docs(features): add AI Coding Harnesses chapter by @mcdonc in #445
- chore: remove KLANGK_PODMAN_STORAGE env var by @mcdonc in #443
- fix(podman): raise create/start timeout to 120s by @mcdonc in #446
- cli: rename 'klangk list' to 'klangk ls' by @mcdonc in #448
- fix(chat): read agent identity from DB, not env vars at runtime by @mcdonc in #449
- fix(chat): show handles instead of emails in tab completion and presence by @mcdonc in #450
- fix: clean up sharing data on workspace delete by @mcdonc in #455
- fix: prevent deletion of system agent user by @mcdonc in #457
- Replace aiosqlite with SQLAlchemy async engine for connection pooling by @mcdonc in #458
- fix(chat): show handles instead of emails in presence avatar tooltips by @mcdonc in #466
- fix(agent): detect process death and broadcast disconnect immediately by @mcdonc in #459
- fix(container): set HERDR_SOCKET_PATH to tmpfs for macOS virtiofs compat by @mcdonc ...
v1.0
What's Changed
- feat: per-workspace JWT auth for container→host endpoints by @mcdonc in #232
- feat: chat history pagination — load older messages on scroll by @mcdonc in #244
- feat(ws): auto-reconnect WebSocket with exponential backoff by @mcdonc in #247
- perf(e2e): extract API tests to reduce E2E wall time by @mcdonc in #243
- Add workspace-open timing instrumentation by @mcdonc in #249
- fix(terminal): reassemble PTY UTF-8 across read chunks (terminal ghosting) by @runyaga in #250
- Stop pushing :latest tags to GHCR, pin workspace base image by @mcdonc in #257
- Add [skip ci] to automated base image bump commits by @mcdonc in #259
- Bump workspace base image to 2026.06.11-2603487 by @mcdonc in #258
- Run tests automatically on pushes to release branches by @mcdonc in #260
- docs: update ARCHITECTURE.md and HACKING.md to reflect current state by @mcdonc in #263
- fix(build): regenerate web plugin registrant when the plugin set changes by @runyaga in #254
- feat(terminal): ⌘/Ctrl-click terminal paths open in the file viewer by @runyaga in #252
- docs: convert to Zensical docs site by @mcdonc in #266
- feat: add customize/ example for custom host container deployments by @mcdonc in #268
- Update workspace base image: bash shell, remove sudo by @mcdonc in #287
- Fix crun fchownat errors with rootless userns by @mcdonc in #291
- Use tmux as terminal initial command by @mcdonc in #288
- fix(plugins): send workspace JWT to browser-delegate bridge calls by @runyaga in #275
- Bump workspace base image to 2026.06.12-170fe20 by @github-actions[bot] in #292
- fix(workspace): set tmux extended-keys-format to csi-u by @mcdonc in #295
- feat(workspace): add Shut Down Container button by @mcdonc in #305
- feat(workspace): per-user HOME directories with handle-based naming by @mcdonc in #302
- fix(workspace): auto-create handle on workspace connect, not ui_ready by @mcdonc in #309
- Bump workspace base image to 2026.06.12-c965428 by @github-actions[bot] in #308
- fix(devenv): share podman image storage across checkouts by @mcdonc in #311
- chore: stop tracking pubspec.lock by @mcdonc in #312
- feat(terminal): add tmux window management for terminal tabs by @mcdonc in #314
- feat(terminal): shared terminal backend with permission model by @mcdonc in #321
- fix(devenv): guard su/util-linux to Linux-only by @runyaga in #335
- feat(chat): AI agent integration via Pi RPC by @mcdonc in #336
- fix(container): serialize container creation per workspace by @mcdonc in #337
- fix(terminal): shared terminal E2E fixes and state persistence by @mcdonc in #340
- fix(e2e): relax PageUp assertion on Firefox by @mcdonc in #346
- fix(container): populate home with /etc/skel so .bashrc works by @mcdonc in #347
- fix(container): setup-home.sh script with default PS1 by @mcdonc in #348
- feat(container): per-user Pi agent config (#300) by @mcdonc in #349
- fix(terminal): target joiner session in select_window for shared terminals by @mcdonc in #352
- feat(acl): grant collaborators share-terminals permission by @mcdonc in #350
- feat(cli): add ~. escape to disconnect from klangk shell by @mcdonc in #353
- feat(agent): give MrBoops a real home directory with Pi config by @mcdonc in #358
- docs(chat): rewrite chat docs with AI agent section by @mcdonc in #343
- feat(container): restore passwordless sudo for klangk user by @mcdonc in #361
- fix(container): warm userns mapping to avoid 27s first-create delay by @mcdonc in #363
- docs: add invitation and files feature documentation with screenshots by @mcdonc in #366
- docs: clean up features index, getting started, and CLI reference by @mcdonc in #369
- feat(terminal): add KLANGK_DISABLE_TMUX toggle for plain shell by @runyaga in #360
- fix(container): add UTF-8 locale for tmux unicode support by @mcdonc in #372
- Bump workspace base image to 2026.06.16-fc124ea by @github-actions[bot] in #373
- fix(terminal): auto-exit tmux copy mode on scroll to bottom by @mcdonc in #381
- fix(terminal): send Shift+PgUp/PgDn to PTY for tmux scrollback and mouse scroll wheel in klangk shell by @mcdonc in #383
- feat(container): make passwordless sudo configurable via KLANGK_ALLOW_SUDO by @mcdonc in #386
- docs: document password reset token flow and JWT renewal gap by @mcdonc in #394
- fix(api): use explicit resource function for workspace role ACL checks by @mcdonc in #387
- docs: document workspace JWT lifetime limitation and lack of renewal by @mcdonc in #395
- fix(security): restrict CORS origins instead of allowing all by @mcdonc in #391
- feat(plugins): plugin configuration system (#385) by @mcdonc in #401
- feat(container): git credential helper for browser-delegated auth by @mcdonc in #402
- fix(devenv): track devenv.lock to pin nix inputs by @mcdonc in #406
- fix(cli): add retry with backoff for transient HTTP failures (#341) by @mcdonc in #404
- fix(cli): skip broadcast messages while waiting for workspace_ready by @mcdonc in #415
- feat(plugins): lifecycle hooks and flattened tools by @mcdonc in #413
- fix(podman): add 30s timeout to podman subprocess calls by @mcdonc in #416
- feat(bridge): replace bridge token with browser ID by @mcdonc in #417
- feat(terminal): cross-viewport text selection via tmux mouse mode by @mcdonc in #418
- fix(e2e): increase WebSocket timeouts for shared terminal tests by @mcdonc in #424
- fix(ws): stop auto-reconnect after 5 minutes by @mcdonc in #425
- feat(git-credential): GitHub OAuth device flow by @mcdonc in #426
- fix(workspace): add navigation to loading/disconnected screens by @mcdonc in #433
- feat(chat): display user handle instead of email by @mcdonc in #435
- feat(frontend): stale build detection with reload banner by @mcdonc in #434
- fix: plug memory leaks in long-running server processes by @mcdonc in #438
- fix(e2e): raise tab-speed threshold to 3s for CI headroom by @mcdonc in #436
- fix(devenv): stop generating podman storage.conf by @mcdonc in #441
- docs(features): add AI Coding Harnesses chapter by @mcdonc in #445
- chore: remove KLANGK_PODMAN_STORAGE env var by @mcdonc in #443
- fix(podman): raise create/start timeout to 120s by @mcdonc in #446
- cli: rename 'klangk list' to 'klangk ls' by @mcdonc in #448
- fix(chat): read agent identity from DB, not env vars at runtime by @mcdonc in #449
- fix(chat): show handles instead of emails in tab completion and presence by @mcdonc in #450
- fix: clean up sharing data on workspace delete by @mcdonc in #455
- fix: prevent deletion of system agent user by @mcdonc in #457
- Replace aiosqlite with SQLAlchemy async engine for connection pooling by @mcdonc in #458
- fix(chat): show handles instead of emails in presence avatar tooltips by @mcdonc in #466
- fix(agent): detect process death and broadcast disconnect immediately by @mcdonc in #459
- fix(container): set HERDR_SOCKET_PATH to tmpfs for macOS virtiofs compat by @mcdonc ...
v2026.06.10-1
Full Changelog: v2026.06.10...v2026.06.10-1