Skip to content

Releases: mcdonc/klangk

v2.0a3

Choose a tag to compare

@github-actions github-actions released this 10 Sep 03:18

Added

  • Git authentication via the browser for Gitea hosts (#3385). A
    KLANGKWS_FEATURE_OAUTH_PROVIDERS entry with
    flow: authorization_code_pkce runs the OAuth authorization-code
    flow with PKCE (S256) for hosts like Gitea that implement no device
    flow: the first git clone opens 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 klangk wheel 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 format pre-commit hook verifies instead of rewriting
    (#3376).
    The hook now runs dart format --output=none --set-exit-if-changed via scripts/dart-format-verify.sh and fails
    on unformatted files instead of silently rewriting them mid-commit —
    rewrite mode flipped short→tall style in fresh worktrees (where no
    .dart_tool exists to resolve the language version) and wedged prek's
    stash rollback during cherry-picks. Files whose package has no
    .dart_tool yet are skipped with a notice; run dart format yourself
    before committing. The frontend CI workflow now checks formatting
    after pub get (src/frontend lib+test and 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).
    With login_banner_every_visit on, 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

Choose a tag to compare

@github-actions github-actions released this 08 Sep 10:05

Fixed

  • FIPS fetch pin is Linux-only (#3364). Under
    KLANGKD_FIPS_MODE, the startup step that pins ambient OpenSSL
    fetches to fips=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 sets default_properties = fips=yes, so every process in the
    container requires the fips property on provider-less algorithm
    fetches, and Node's crypto.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
    from crypto.getFips() and previously picked MD5 — refused by the
    fips provider — which failed every extension load with
    error:0308010C until pi -ne was 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

v2.0a1 Pre-release
Pre-release

Choose a tag to compare

@mcdonc mcdonc released this 08 Sep 06:44

Breaking

  • KLANGKD_LISTEN / KLANGKD_EGRESS_LISTEN values 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 binding listen:KLANGKD_PORT — move the
    port to KLANGKD_PORT / KLANGKD_EGRESS_PORT on 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
    like eth0, which is a syntactically valid host name that passes
    validation.

  • Host-header validation changes URL derivation for name-accessed
    deployments (#3276).
    A request's Host header now validates against
    klangkd's own configuration (loopback, the armed KLANGKD_TLS_HOSTNAME
    name, or the KLANGKD_LISTEN IP-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 to localhost. Migration: deployments reached by an
    identity klangkd does not configure (KLANGKD_LISTEN=0.0.0.0 by DNS
    name or non-literal address, a hostname listen, an outer proxy not
    in KLANGKD_TRUSTED_PROXY_CIDRS) must set KLANGKD_HOSTING_HOSTNAME
    or their links, container hosted-app URLs, and the OIDC redirect_uri
    (login fails on the mismatch) all name localhost. Loopback,
    automatic-TLS, and trusted-outer-proxy deployments are unaffected. See
    HTTPS Hosting.

  • Token-in-URL removal changes client contracts (#3201).
    Anything connecting to /ws or /ws/consent-decider must switch
    from the ?token= query param to the bearer WebSocket subprotocol
    (the JWT rides the handshake's Sec-WebSocket-Protocol header), and
    any client of the verify endpoint must POST the 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_ROOTS unset (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. Set KLANGKD_ALLOWED_MOUNT_ROOTS to 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 quota KLANGKD_VOLUME_QUOTA_PER_USER is now the
    per-workspace KLANGKD_VOLUME_QUOTA_PER_WORKSPACE
    (volume_quota_per_workspace).

  • Members can create workspaces by default (#3137). The seeded
    create-workspace Allow on /workspaces now targets the members
    group (which every new user joins) in addition to admins, 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 /workspaces rows
    , so
    existing deployments flip too; a deploy that wants the old
    admin-only posture adds one explicit Deny for members (or
    Authenticated) ahead of the Allow in the ACL editor. See
    ACL System.

  • KLANGKD_PER_HANDLE_HOME is 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 shape KLANGKD_ALLOW_SUDO got in #3047). While it is
    false (the default), every workspace gets the shared
    /home/klangk regardless of its stored per_handle_home value: a
    stored true (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
    set KLANGKD_PER_HANDLE_HOME=true on 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_available on /config), and
    the CLI --per-handle-home flag 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 stores allow_sudo: true (the Allow sudo
    toggle, which now defaults to unchecked in the Flutter dialog/settings
    panel and the TUI form, or klangk create --sudo / --sudo on edit);
    an absent key means locked down, and a true can never raise sudo
    past KLANGKD_ALLOW_SUDO=0. On upgrade, existing workspaces with
    no stored allow_sudo key lose sudo at their next container start

    (no bag migration runs) — opt them in with klangk edit <ws> --sudo
    if they need it. See Container
    packages
    .

  • Volumes are an admin surface (#2993). GET /volumes now checks
    the new view-volumes permission (the admin Volumes tab's listing
    gate), while POST /volumes and DELETE /volumes/{name} keep
    manage-volumes — both seeded Allow for the admins group 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-volumes holders 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 ls ships with
    it, but external API consumers must read the envelope.

  • Deploy-wide consent decider removed (#2976). The
    /ws/consent-decider handshake without a ?workspace= param is now
    refused (HTTP 403): consent authority is strictly per-workspace
    (egress-consent on /workspaces/{id}), and manage-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. The klangk shell popup 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/images no longer returns nix_available /
    sudo_available — read them from the new authenticated-only
    GET /api/v1/config fields of the same names. Hand-built clients
    reading the toggles off the images response must switch to /config.
    Migration 0025 also removes the retired seed's Deny Everyone row on
    /images (it gated no route): authenticated users' effective
    permissions on /images now include the view inherited 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 (replaces admin on the workspace),
    monitor-workspace, export-workspace, share-workspace,
    share-advanced (replaces change-acls), and files-view
    (replaces files). 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 of terminal: start-workspace,
    stop-workspace, and restart-workspace are 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 check manage-volumes and
    `view-...

Read more

v1.0.5

Choose a tag to compare

@github-actions github-actions released this 09 Jul 17:27
3e7c3ff

What's Changed

  • fix(backend): apply CA trust before Logfire's startup probe (#1406) by @mcdonc in #1407

Full Changelog: v1.0.4...v1.0.5

v1.0.4

Choose a tag to compare

@github-actions github-actions released this 07 Jul 20:44
20c72db

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

Choose a tag to compare

@github-actions github-actions released this 07 Jul 05:51
355072c

What's Changed

  • Move customize runtime dirs into customize/custom/ by @mcdonc in #1363

Full Changelog: v1.0.2...v1.0.3

v1.0.2

Choose a tag to compare

@github-actions github-actions released this 07 Jul 05:10
a059ef7

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

Choose a tag to compare

@github-actions github-actions released this 06 Jul 18:47
a4978be

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 ...
Read more

v1.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 14:50
a4978be

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 ...
Read more

v2026.06.10-1

Choose a tag to compare

@github-actions github-actions released this 11 Jun 06:52