New
- Tools run on both harnesses. A tool is one module that OpenCode and pi both run. Declare a project's own tools under
tools:inkortix.yaml, and limit which agents see them withagents.<name>.tools. - The Kortix tools are listed in
kortix.yaml.web_search,image_search,scrape_webpage,memoryandshowappear askortix:<name>. Delete a line to remove that tool.kortix tools lslists a project's tools, andkortix tools eject <name>copies one into the project so you can change it. - One-step MCP install. Installing an MCP app goes straight to the server's sign-in, and a connector you authorize with your own account loads its tools. The app and connector pages are redesigned.
- Every connector account picks its audience. Install adds the connector to the project. Add account then asks for a name and Who can use it: only you, everyone in the project, or specific people, groups or agents.
- Connect MCP in the project sidebar opens the MCP connect dialog.
- Connector calls from code. Apps and scripts can call a project's connectors through
@kortix/sdk, with typed handles and a stable result. - Reminders page. A calendar (day, week, month) and a list with bulk pause, resume and remove. Reminders is beta: enable Reminders under Settings → Feature flags.
- App event triggers (beta). Run an agent when something happens in a connected app, such as a new email or an opened pull request. Every app that publishes events is listed, and you can browse its events before you connect it. Enable App event triggers under Settings → Feature flags.
- Notification center (beta). Kortix tells the right person when a session needs them: an in-app inbox, Web Push and email. Off by default: enable Notification Center under Settings → Feature flags.
- Billing alerts for owners. Owners get an email when the wallet runs out, and when a declined card turns auto top-up off. The Billing pane says why auto top-up is off. A member who runs out of credits can ask the owners from the product. Budget managers get an email at 80% and 100% of an LLM gateway budget.
kortix feedback "<message>"files a bug, an idea or a friction report from a terminal or from inside a session.
Improved
- Streaming replies appear word by word, at the pace they arrive, on web and mobile.
- A long paste (more than 1,000 characters or 10 lines) becomes a "Pasted text" tile on web and mobile.
- Every prompt a person did not type, from a reminder, a trigger, another session or Slack, shows a source pill above a plain message.
- The server owns session state and sends it on one stream, so open tabs stop polling for it.
- Config releases run for every project. What merges to the base branch reaches new sessions, and a large repository no longer loses its config release.
- A sandbox sleeps sooner: a turn that waits on a person stops keeping it awake, and an open tab keeps it awake only while someone uses it.
- pi (experimental) loads the project's root
AGENTS.md, runs the agent you pick for a prompt, and can take back an unread steer or a queued prompt. - Agents in a session use the
kortixCLI for connectors; the in-sandboxkortix-connectorsMCP server is removed.kortix connectors connect --labelnames the new account. - The hosted MCP server at
api.kortix.com/v1/mcpis the one Kortix MCP server. The docs-only server atkortix.com/mcpis retired, andlist_projectsanswers an empty list on an account with no projects. - File listings show folders with more than 1,000 files, with search on web and mobile.
- The invite page names the project and the role. After you accept an invite or switch accounts, you land in that account.
- Mobile: New session opens project home with the composer focused. Sessions draw tables on a full grid, hide thinking, and keep a floating composer.
- CLI:
sessions lsandsessions status --jsonshow each session's model.triggers infoshows the webhook signing scheme with a sample.approvals lsprints the decision link.projects info --jsonincludes the project ID. - Session start, connector calls, cost summaries and the Reminders page use fewer database reads.
- A session with many images or binary files loads them a few at a time instead of all at once.
- Your computer shows the access the agent on that computer really has, in the browser and in the desktop app. Narrowing access applies at once from anywhere; widening it asks on the computer.
- 30 API routes that no client calls answer
410 Gone. - The subprocessor list adds six vendors.
- A finished turn folds its work into one Worked for row. The answer and any cards the agent showed stay visible below it.
- A question from the agent docks onto the composer as one surface, with previous/next and a confirm step that links back to each answer.
- The docs at
kortix.com/docsare rewritten: 31 pages, with Git as a core page. - Mobile asks you to update when the installed app is older than the minimum version the API sets.
- When you mention files on your own machine, the agent offers to connect your computer.
Fixed
- A Stop wins over a session that is still opening and over its queued prompts.
- A session whose sandbox provider is at capacity retries the start by itself, with backoff, instead of waiting for Restart.
- Queued prompts go out at the turn boundary and survive a busy queue. Only a queued prompt's author can edit, send or retry it, and an idle send shows as active, not queued.
- A session keeps its history when its runtime changes, a degraded transcript copy no longer serves a partial history, and a shorter read never deletes saved messages; only a rewind removes them.
- A reload paints the conversation this device kept without placeholder rows first, a streamed message settles when its turn ends, and a session whose sandbox lost its state keeps the conversation this device saved.
- Session boot:
sandbox.on_bootruns again after a session resumes, the boot finds its config when a pin file is missing, a failed environment build no longer breaks the boot, and a sandbox falls back to 4 GiB of memory when no size is set. - A failed sub-agent run can be retried in its own thread.
- Sessions: a failed-turn notice clears after you edit and resend, the turn outcome footer is back, the restart offer on a stuck boot follows the session's state, the session list pages correctly, and other tabs learn when a turn finishes.
- The composer waits for the model list during boot, and a new free account can send with the default model.
- The connector-connected notice joins the prompt queue and reaches the running turn.
- Triggers: a cron trigger fires at most once a minute, every webhook delivery runs exactly once, a failed fire is recorded on the trigger, the list says when a trigger runs next, a fire waits when the account has no usable model, and a manual or webhook fire the account cannot pay for answers
402with the reason instead of a server error. - Saving a connector credential is atomic, a Slack undo call is bounded by the call deadline, and a crash in the marketplace dialog stays inside the dialog.
- The email channel shows on the channels page, and the inbox of a deleted account tells the sender once per thread.
- Change requests: large change requests show their changed files, a blank diff says why, and the side-by-side toggle works on one-sided diffs.
- Binary file previews work again, and links to a session's files open instead of showing
[blocked]. - Computer use on a connected computer works for every tool and survives restarts and app updates. The CLI and the desktop app run as one runtime.
- Sign-in: a magic link works when the browser drops a cookie, a sign-in no longer bounces back to the sign-in page, and a sign-in or sign-up that stalls ends with an error you can retry. On mobile, SSO sign-in completes and the login stays until you sign out.
- The onboarding wizard opens on an account's first project, owners see the create-project screen on
/projects, and the account menu has a Settings row. - After a deploy, a page that loads stale code reloads once instead of breaking.
- Account deletion works when a session sandbox exists, never deletes an operator's login, and works on self-host.
- A push to GitHub that the remote rejects with a 500 is retried, and an expired checkout link answers with a clear not-found.
- Trigger and top-up controls show only to people who may use them, and the project config lists every registered agent.
- Translations and accessible names for icon buttons and the preview toggle.
/downloadhas its site navigation again, and/blogserves the blog.- CLI:
agents lslists the project's agents,shipand in-sandbox host selection use the right credentials, the CLI token list hides session tokens,reminders lsshows the prompt text, andtriggers firereports the real outcome. - Self-host:
doctorfails when sign-up is open and unconfirmed,self-host status --jsonprints clean JSON, the CLI refuses to rotateAPI_KEY_SECRETandPOSTGRES_PASSWORD, and/v1/setup/statusno longer stalls the API while it checks Docker. - Mobile: streaming turns stay stable, change requests anchor to their turn, the composer stays above the keyboard, and web links open in the in-app browser.
- The Add account dialog that Install opens proposes a name that is still free.
@kortix/agent-tunnel connectand the CLI's sandbox port proxy connect under Bun again.- The sidebar toggle tells screen readers whether the sidebar is open.
- The Providers tab no longer shows the Kortix-managed provider as connected when it serves no models.
- CLI:
kortix providerssubcommands reject unknown flags instead of ignoring them.
Security
- SSO is enforced at the API for every credential. Sign-up without a browser follows the sign-up policy and SSO-only domains. The admin allowlist never matches an SSO identity, and a personal account cannot set up SAML.
- Offboarding stops what a member left behind: computer calls, reminders, pushes and group memberships. A deleted account closes every side route, account erasure removes stopped sandboxes, session files and managed repos, and deleting a project deletes its managed git repo.
- A session push reaches only people who may still open the project, and a signed-out device stops getting pushes.
kortix secrets unsetrevokes every outstanding setup link for that secret./userinforejects tokens of a deactivated OAuth client.- A trigger with no agent runs with the permissions of the agent its run uses.
- A single-label egress wildcard matches exactly one subdomain label.
- The public installer verifies the release checksum.
- Pinning a session's runtime on the turn stream requires the session's own sandbox credential.
- Dependency updates for HIGH CVEs (gRPC,
golang.org/x/net, sharp, the MCP SDK, undici and others), and the sandbox daemon and release scripts create temporary files owner-only.
Not yet offered in Settings
- Apps hosting (static sites served without a sandbox, and server Apps on releases, machines and volumes, with a Convex backend as a template), project Files with per-folder access, session boot modes with persistent machines, and organization-wide Volumes and Stateless sessions sit behind switches only Kortix can turn on and are not offered in Settings yet.
Behind the scenes
- CI runs on GitHub-hosted runners, and database indexes, connection pooling, audit storage and infrastructure checks are tightened.
- Groundwork for a durable session log, off for every project.
What's Changed
- test(e2e): journey 23 asserts the toolkit search wire contract; connect POST only when sent by @markokraemer in #9314
- chore(release): VERSION → 0.13.53 [skip ci] by @github-actions[bot] in #9316
- fix(api): let a session's own credential open its own session (KRTX-1688) by @agent-kortix in #9235
- fix(audit): make the reconciliation dedupe probe an index condition (KRTX-618) by @agent-kortix in #9238
- fix(cli): explain a foreign env session instead of a bare Not found in reminders (KRTX-1686) by @agent-kortix in #9219
- fix(web): recover the settings panel's stale-deploy chunk with one reload (KRTX-1616) by @agent-kortix in #9222
- fix(cli): keep self-host status JSON output clean (KRTX-1325) by @agent-kortix in #8876
- fix(cli): include the project id in projects info --json (KRTX-1659) by @agent-kortix in #9240
- fix(models): serve the platform default to free tier so a fresh account can send (KRTX-1067) by @agent-kortix in #8983
- fix(api): refuse agent sessions on the project sandbox-provider pin (KRTX-1681) by @agent-kortix in #9212
- fix(cli): print the /approve decision link in approvals ls rows (KRTX-1669) by @agent-kortix in #9246
- fix(web): recover /auth from a stale client bundle after a deploy (KRTX-1685) by @agent-kortix in #9248
- fix(web): owners see the create-project empty state on first /projects (KRTX-1700) by @agent-kortix in #9250
- refactor(api): move the fast-boot bundle out of commits.ts and dedupe the diff parser (KRTX-1512) by @agent-kortix in #9218
- feat(cli): expose the session's resolved model in sessions ls/status --json (KRTX-1695) by @agent-kortix in #9251
- fix(projects): delete the managed git repo with its project (KRTX-1692) by @agent-kortix in #9252
- fix(web): the stuck-boot restart offer follows the lifecycle verdict (KRTX-1671) by @agent-kortix in #9286
- fix(api): account deletion never deletes an operator's login, and works on self-host (KRTX-1713) by @Ino-Bagaric in #9323
- fix(api): write runtimeSessionId on the migrated-session insert (KRTX-1536) by @agent-kortix in #9288
- test(infra): make the unit suites hermetic on a Kortix worker sandbox (KRTX-1320) by @agent-kortix in #8949
- fix(api): require the session sandbox credential for the turn-stream runtime_session pin (KRTX-1607) by @agent-kortix in #9290
- perf(api): one grouped scan per window for the cost summary (KRTX-1605) by @agent-kortix in #9300
- fix(web): restore the turn-outcome footer render the session-chat split dropped (KRTX-1622) by @agent-kortix in #9303
- fix(cli): report the real trigger fire outcome (KRTX-1504) by @agent-kortix in #9289
- fix(api): stage the opencode config through its dependency-tree filter (KRTX-1535) by @agent-kortix in #9313
- fix(supabase): use the current refresh-token rotation config key (KRTX-1656) by @agent-kortix in #9317
- fix(api): a single-label egress wildcard matches exactly one subdomain label (KRTX-1654) by @agent-kortix in #9321
- fix(api): list every registered agent from the project config summary (KRTX-1586) by @agent-kortix in #9296
- fix(sessions): only a queued prompt's author edits, sends or retries it (KRTX-1712) by @Ino-Bagaric in #9325
- fix(sdk): retry an errored no-data query with capped backoff so pages self-heal (KRTX-1632) by @agent-kortix in #9318
- fix(api): dispatch queued prompts at the turn boundary, not after the whole run (KRTX-1684) by @agent-kortix in #9319
- docs(kortix-release): edge-key rollout checklist by @markokraemer in #9327
- fix(cli): refuse to rotate API_KEY_SECRET and POSTGRES_PASSWORD (KRTX-1719) by @Ino-Bagaric in #9328
- fix(api): warn once per unreachable spell past its ride-out budget (KRTX-696) by @agent-kortix in #9228
- fix(ci): pin third-party CI actions to SHAs in credential-holding workflows (KRTX-1711) by @agent-kortix in #9281
- fix(sessions): queued-prompt writes survive the drain's admission claim (KRTX-1712) by @Ino-Bagaric in #9330
- chore(deps): bump bridgecrewio/checkov-action from 12.3125.0 to 12.3128.0 by @dependabot[bot] in #9180
- chore(deps): bump terraform-linters/setup-tflint from 6.3.1 to 6.3.2 by @dependabot[bot] in #9181
- chore(deps): bump anchore/sbom-action from 0.24.2 to 0.24.3 by @dependabot[bot] in #9182
- fix(api): the admin allowlist never matches an SSO identity; no SAML on a personal account (KRTX-1715) by @Ino-Bagaric in #9331
- fix(cli): verify the downloaded release checksum in the public installer (KRTX-1652) by @agent-kortix in #9322
- fix(web): the side-by-side toggle switches one-sided diffs too (KRTX-1691) by @agent-kortix in #9287
- fix(api): make transcript-mirror strings storable as jsonb (KRTX-1701) by @agent-kortix in #9253
- feat(cli): put the webhook signing scheme and sample in triggers info (KRTX-1666) by @agent-kortix in #9249
- fix(cli): show the reminder prompt text in reminders ls (KRTX-1524) by @agent-kortix in #9243
- fix(api): retry and de-noise a GitHub receive-pack 500 push rejection (KRTX-1683) by @agent-kortix in #9226
- fix(billing): map Stripe's no-such-checkout-session to the typed 404 (KRTX-1682) by @agent-kortix in #9223
- fix(web): reload once on a stale-deploy chunk-load error (KRTX-1613) by @agent-kortix in #9213
- fix(cli): resolve ship from workspace host credentials (KRTX-1258) by @agent-kortix in #8865
- fix(web): hold the composer model gate during session boot (KRTX-1667) by @agent-kortix in #9244
- fix(web): hide the seeded harness reflector from the Triggers list (KRTX-1299) by @agent-kortix in #8921
- fix(files): byte-accurate project reads restore binary previews (KRTX-1677) by @agent-kortix in #9247
- fix(api,cli): hide session-minted tokens from the project CLI token list (KRTX-1193) by @agent-kortix in #8926
- fix(web): put a Settings row in the account menu on /projects and /new (KRTX-1327) by @agent-kortix in #8925
- feat(billing): cap the scheduled deletion sweep at 25 per tick and add ACCOUNT_DELETION_SWEEP_PAUSED by @markokraemer in #9332
- test(api): make the audit partition suites independent of the migration week (KRTX-1633) by @agent-kortix in #9283
- fix(api): ask the in-place recovery gate before a background pass condemns a runtime (KRTX-208) by @agent-kortix in #9036
- test(web): preserve reporting of unknown input-stream failures (KRTX-984) by @agent-kortix in #8725
- perf(db): cover the per-session gateway rollup with one index (KRTX-1311) by @agent-kortix in #9012
- fix(ci): branch-deletion teardown no longer hits the 10000-row Platinum listing cap by @markokraemer in #9334
- perf(db): index the runtime-wake fence candidates on kortix.session_sandboxes (KRTX-1308) by @agent-kortix in #9292
- feat(web): full-screen MFA step-up and split-layout MCP connect modal by @sutharjay1 in #9335
- fix(infra): Terraform stops resetting reconciler-owned unhealthy-hosts alarm dimensions by @markokraemer in #9336
- fix(iam): enforce SSO only at the API for every credential (KRTX-1716) by @Ino-Bagaric in #9338
- fix(billing): account deletion fails with HTTP 500 for any account with an established session box by @markokraemer in #9337
- fix(web): restore the original phone screenshots on the /download mobile card by @sutharjay1 in #9339
- fix(slack): run the agent in a channel thread only when someone tags it by @sutharjay1 in #9333
- fix(mobile): call eas update:view without --non-interactive in the OTA publish by @sutharjay1 in #9342
- fix(session): render an idle send as an active prompt, not a queued one by @sutharjay1 in #9191
- fix(projects): a deleted workspace closes its side doors (KRTX-1714) by @Ino-Bagaric in #9344
- test: remove disposable containers with their volumes (docker rm -f -v) by @Ino-Bagaric in #9345
- fix(triggers): run every webhook delivery exactly once (KRTX-1735) by @Ino-Bagaric in #9347
- feat(sessions): R5 session truth — the server owns session state, one stream, no polls by @DimitrijeGlibic in #9312
- fix(platinum): list running boxes with state=running across all regions by @markokraemer in #9346
- fix(iam): offboarding stops what a member left behind: computer calls, reminders, pushes, groups (KRTX-1722) by @Ino-Bagaric in #9349
- fix(db): re-time session_changed_notify after migrations dev already ran; shell-quote 1.11.0 by @markokraemer in #9351
- feat(web): Slack messages render as a source pill over a plain bubble by @sutharjay1 in #9350
- fix(daemon): never restore the LLM proxy URL across a daemon restart by @DimitrijeGlibic in #9348
- fix(config-releases): honor export-ignore outside the agent config dir (KRTX-1728) by @Ino-Bagaric in #9355
- fix(sdk): an idle tab stops reading the transcript every 30 s; pre-push refuses an out-of-order migration by @DimitrijeGlibic in #9356
- fix(files): list every folder past 1,000 files, and search on web and mobile (KRTX-1723) by @Ino-Bagaric in #9359
- chore(dev-env): add KORTIX_INTERNAL_EDGE_KEY (encrypted) by @markokraemer in #9363
- fix(billing): clear legacy NO ACTION references to the auth user before deleting the login by @markokraemer in #9365
- fix(sessions): an open tab keeps the computer awake only while a person uses it (KRTX-1729) by @Ino-Bagaric in #9366
- fix(triggers): a cron trigger fires at most once a minute (KRTX-1721) by @Ino-Bagaric in #9368
- feat(session): one source pill for every non-typed prompt, web and mobile by @sutharjay1 in #9369
- fix(sessions): an empty page with a cursor is not an empty list (KRTX-1727) by @Ino-Bagaric in #9370
- fix(cli): honor an explicit in-sandbox hosts use selection; keep env-over-stored default (KRTX-1705) by @agent-kortix in #9352
- fix(web): trigger and top-up controls follow the leaf their route asserts (KRTX-1720) by @Ino-Bagaric in #9371
- fix(web): after an invite accept or an account switch, land in that account (KRTX-1731) by @Ino-Bagaric in #9372
- Mobile session: aligned tables, hidden thinking, and a floating composer by @sutharjay1 in #9358
- fix(session): clear a stale failed-turn row after the message is edited and resent by @sutharjay1 in #9361
- test: drive the SSO-required dialog in a browser (KRTX-1716) by @Ino-Bagaric in #9374
- fix(triggers): a failed manual or webhook fire is recorded; the listing says when a trigger runs next (KRTX-1743) by @Ino-Bagaric in #9375
- fix(web): open workspace file links instead of rendering [blocked] by @sutharjay1 in #9376
- test: run and attest the packages lane inside a factory sandbox (KRTX-1400) by @agent-kortix in #9353
- fix(mobile): stabilize streaming turns, anchor change requests per turn, keep the composer above the keyboard by @sutharjay1 in #9357
- feat(connectors): typed connector calls from code — call contract, SDK handles, codegen by @markokraemer in #9381
- fix(mobile): keep the login until the user signs out by @sutharjay1 in #9378
- feat(accounts): signed signup webhook for the sales factory (inert until SIGNUP_WEBHOOK_URL is set) by @markokraemer in #9382
- fix(api): one canonical default sandbox spec, memory fallback 4 GiB (KRTX-1534) by @agent-kortix in #9367
- chore(mobile): 1.4.4, dev builds next to the store app, manual production OTA ships prod by @sutharjay1 in #9383
- fix(sandbox): entrypoint repairs /etc/hosts to 0644 before the privilege drop (KRTX-1814) by @agent-kortix in #9340
- fix(web): keep the session on GoTrue's no_authorization 401 (KRTX-1693) by @agent-kortix in #9377
- fix(infra): make audit-archive tags Drata-readable (KRTX-1649) by @agent-kortix in #9341
- fix(api): audit ingest writes small batches the 25s budget reserve refused (KRTX-229) by @agent-kortix in #9379
- refactor(api,sdk): R6 deletions — 30 dead routes retired with 410, Suna migration chain, dead exports, mock-DB tests, pi worker table by @DimitrijeGlibic in #9360
- fix(web): always name ToolActionBar icon buttons (KRTX-1757) by @agent-kortix in #9373
- feat(apps): production Apps hosting — static sites without VMs, always-on server Apps, shared images, retention by @markokraemer in #9388
- feat(triggers): app event triggers — run an agent when something happens in a connected app (Composio first, provider-agnostic) by @markokraemer in #9390
- fix(web): serve the real blog at /blog when KORTIX_BLOG_ORIGIN is unset (KRTX-1766) by @agent-kortix in #9395
- fix(web): guard useFileHistory's retry against non-string error messages (KRTX-1781) by @agent-kortix in #9394
- fix(api): return a JSON array from list_projects on an empty account (KRTX-1783) by @agent-kortix in #9393
- test(flows): GH-8 cli-token list step fails when the minted token is missing (KRTX-1800) by @agent-kortix in #9397
- feat(invites): the invite page names the project and role; sign out and come back to the invite (KRTX-1731) by @Ino-Bagaric in #9398
- fix(email): a deleted workspace's inbox tells the sender, once per thread (KRTX-1714) by @Ino-Bagaric in #9399
- perf(db): cover the account+time cost aggregates with an INCLUDE index (KRTX-1769) by @agent-kortix in #9386
- fix(push): a signed-out device stops getting push notifications (KRTX-1722) by @Ino-Bagaric in #9400
- feat(billing): auto top-up says why it turned off, and emails the owners when a declined card does it (KRTX-1718) by @Ino-Bagaric in #9402
- feat(billing): Ask an owner — a member out of credits emails the owners (KRTX-1718) by @Ino-Bagaric in #9404
- feat(gateway): email the budget managers at 80% and 100% of a gateway budget (KRTX-1718) by @Ino-Bagaric in #9405
- fix(web): signal finished turns to tabs watching from elsewhere (KRTX-1795) by @agent-kortix in #9401
- feat(billing): email the owners when the wallet reaches $0 (KRTX-1718) by @Ino-Bagaric in #9406
- fix(sessions): cap what presence alone keeps a box awake, whatever the client reports (KRTX-1729) by @Ino-Bagaric in #9408
- fix(triggers): a connection finished outside Kortix goes live by itself; connect-finalize --owner project by @markokraemer in #9392
- feat(tools): harness-agnostic tools, kortix.yaml tools: and per-agent tool access by @DimitrijeGlibic in #9410
- fix(connectors): kortix-connectors MCP off by default; kortix connectors connect --label by @markokraemer in #9412
- fix(runtime): R7 — pi retract, per-prompt agent on pi, session list without a timer, /pty refusal by @DimitrijeGlibic in #9391
- feat(triggers): app event triggers name the connector profile and, optionally, the shared account by @markokraemer in #9413
- refactor(connectors): remove the in-sandbox kortix-connectors MCP; agents use the kortix CLI by @markokraemer in #9414
- fix(web): give /download its site nav and brand link back (KRTX-1792) by @agent-kortix in #9407
- test(secrets): delete the box-less sandbox rows the secrets flows insert by @Ino-Bagaric in #9415
- fix(triggers): status text names the app for slug-named connectors; learnings: secrets go in the deployed env bundle by @markokraemer in #9416
- feat(backends): Kortix Backends — self-hosted Convex with Kortix sign-in, ops and agent skills by @markokraemer in #9264
- feat(pi): load the project's root AGENTS.md into the system prompt by @DimitrijeGlibic in #9411
- fix(sessions): a turn that waits on a person stops renewing its box (KRTX-1739) by @Ino-Bagaric in #9418
- fix(apps-router): forward a User-Agent when the client sends none by @markokraemer in #9419
- feat(session): long pastes become a "Pasted text" tile on web and mobile by @sutharjay1 in #9380
- fix(web): align the preview modal's source-toggle aria-pressed with the file header (KRTX-1778) by @agent-kortix in #9409
- feat(web,mobile): smooth streaming replies, word by word by @sutharjay1 in #9420
- fix(web): show the Email channel on the channels page (KRTX-1801) by @agent-kortix in #9403
- fix(web): translate the command-attachment refuse description (KRTX-1710) by @agent-kortix in #9387
- fix(self-host): doctor fails on open unconfirmed sign-up; bootstrap-owner needs the host key (KRTX-1715) by @Ino-Bagaric in #9421
- refactor(mcp): one Kortix MCP server — remove kortix.com/mcp + WebMCP; fix dev's #9380 tests by @markokraemer in #9422
- feat(triggers): see every app event at a glance; the event source is an adapter type (source: composio) by @markokraemer in #9425
- feat(config-releases): build a release from the checkout or the project snapshot, so the 32 MiB archive cap no longer drops a session's config by @DimitrijeGlibic in #9424
- fix(cli): an app event error from its connector or source names the connector fix; TRG-18 race by @markokraemer in #9426
- learnings: run pnpm test:verify before merging into dev by @markokraemer in #9428
- fix(config-releases): a box with no base pin builds an archive-less release from its checkout at boot by @DimitrijeGlibic in #9429
- feat(tools): list the Kortix tools in kortix.yaml as kortix:; kortix tools ls/eject by @DimitrijeGlibic in #9427
- fix(ci): read each env blob from its own region, not the us-west-2 default by @DimitrijeGlibic in #9430
- docs(infra): the audit archive is a record, not a cache; copy it before a region switch by @DimitrijeGlibic in #9431
- fix(db): scope user_roles RLS policies to their JWT roles (KRTX-1166) by @agent-kortix in #9433
- fix(accounts): erasure removes parked boxes, session files and managed repos (KRTX-1734) by @Ino-Bagaric in #9435
- fix(push): a session push reaches only people who may still open the project (KRTX-1722) by @Ino-Bagaric in #9436
- fix(triggers): a failed app-event or monitor fire is recorded on the trigger (KRTX-1743) by @Ino-Bagaric in #9438
- fix(triggers): a trigger with no agent is authorized as the agent its run uses (KRTX-1720) by @Ino-Bagaric in #9439
- fix(auth): headless sign-up follows the sign-up policy and SSO-only domains (KRTX-1716) by @Ino-Bagaric in #9440
- refactor(mobile): split 1k files, dedupe shared UI, delete dead code (KRTX-1292) by @agent-kortix in #9441
- fix(session): subagent retry — reopenable thread + task_id-aware recovery prompt (KRTX-1746) by @agent-kortix in #9362
- refactor(web): reuse the shared bounded background-worker parser (KRTX-1756) by @agent-kortix in #9364
- feat(notifications): notify the right person on any surface: inbox, Web Push, email (KRTX-1742) by @Ino-Bagaric in #9446
- feat(config-releases): config releases run for every project — remove the config_releases flag by @DimitrijeGlibic in #9432
- feat(legal): add Hivelocity, OpenCode Zen, Morph, Plain, Pipedream and Expo to the subprocessor list by @markokraemer in #9451
- feat(web): Connect MCP row in the project sidebar, official MCP icon by @sutharjay1 in #9454
- refactor(kortixd): split config-provider and workspace-provider, share through lib/ by @DimitrijeGlibic in #9455
- chore(mobile): upgrade to Expo SDK 57 (React Native 0.86.3), version 1.5.0 by @sutharjay1 in #9458
- feat(mobile): New session focuses the project home composer by @sutharjay1 in #9457
- feat(notifications): KRTX-1742 behind the notification_center flag, off by default by @Ino-Bagaric in #9459
- feat(triggers): every app with events, browse before connecting, one clean trigger UI, and the event_triggers feature flag by @markokraemer in #9461
- feat(apps): Backends become Apps of kind convex — capabilities, project issuer, bindings, agnostic SDK by @markokraemer in #9463
- fix(notifications): flag-on edge cases, presence parity and copy for notification_center (KRTX-1742) by @Ino-Bagaric in #9464
- ci: read the CI, preview and prod env blobs off us-west-2; fix the raw reader #9430 missed by @DimitrijeGlibic in #9467
- fix(web): Next 16.4 with turbopackGc, so the dev cache stops filling the disk by @markokraemer in #9466
- perf(api): one joined session+sandbox read per /start tick (KRTX-2018) by @agent-kortix in #9465
- chore(release): VERSION → 0.13.54 [skip ci] by @github-actions[bot] in #9474
- chore(release): staging VERSION → 0.13.54 [skip ci] by @github-actions[bot] in #9475
- fix(db): wrap public.credit_ledger RLS auth.role() in an initplan scalar subquery (KRTX-1138) by @agent-kortix in #9434
- ci: run every job on free GitHub-hosted runners; remove Blacksmith by @markokraemer in #9453
- fix(review): show why a file's diff body is blank and stop shipping silent empty patches (KRTX-2010) by @agent-kortix in #9468
- fix(apps): budget only for on-demand Apps, access-filtered list, renewing App sessions by @markokraemer in #9476
- fix(triggers): gate the fire when the account has no usable model (KRTX-1505) by @agent-kortix in #9477
- fix(apps): settle provider state-change conflicts on App stop (KRTX-2027) by @agent-kortix in #9478
- fix(db): fold the boot schema probe into the request pool; raise DEFAULT_DB_POOL_MAX 5→6 (KRTX-2020) by @agent-kortix in #9442
- feat(api,cli): POST /v1/feedback and a kortix feedback CLI command (KRTX-1646) by @agent-kortix in #9389
- perf(connectors): one /call spends a bounded set of statements (KRTX-2017) by @agent-kortix in #9452
- fix(proxy): surface the upstream's own 5xx reason in the logs; consolidate dispatch (KRTX-2073) by @agent-kortix in #9479
- fix(sandbox): honor the KORTIX_PT_ENV_PATH seam in reloadSessionEnv (KRTX-2039) by @agent-kortix in #9481
- fix(kortixd): fail cursor transcript reads on a degraded mirror (KRTX-2040) by @agent-kortix in #9480
- fix(cli): list the project's agents in
agents ls(KRTX-1525) by @agent-kortix in #9470 - fix(review): render changed-file contents for large change requests (KRTX-2010) by @agent-kortix in #9460
- feat(drives): project Files with per-folder access, mounted and synced into sessions by @allenabraham999 in #9472
- feat(sessions): ephemeral boxes, persistent machines and release boot artifacts, behind one Volumes switch per org by @allenabraham999 in #9473
- fix(connectors): bound the Slack misfire-undo POST by the call deadline (KRTX-2062) by @agent-kortix in #9483
- fix(api): make upsertConnectionCredential a single atomic ON CONFLICT write (KRTX-2061) by @agent-kortix in #9485
- fix(api): unset revokes a secret's outstanding intake links (KRTX-2056) by @agent-kortix in #9484
- fix(marketplace): contain add-to-project dialog mount crashes to the dialog (KRTX-1950) by @agent-kortix in #9448
- feat(connectors): one-step MCP install, member-authorized tool catalogs, redesigned app and connector pages by @sutharjay1 in #9449
- fix(web): restore the post-signup onboarding wizard on the account's first project (KRTX-2092) by @agent-kortix in #9492
- fix(web): preview session drive files through the drive API by @allenabraham999 in #9493
- fix(api): /start retries a transient provision failure instead of replaying it by @allenabraham999 in #9489
- fix(billing): lock the legacy per-seat migration and route its writes through applyStripeSync (KRTX-2089) by @agent-kortix in #9488
- fix(api): env-build rejection can no longer escape the session boot paths unhandled (KRTX-2064) by @agent-kortix in #9494
- fix(sessions): a user Stop wins over in-flight opens and queued prompts by @allenabraham999 in #9495
- fix(sandbox): rerun project boot hooks after resume by @markokraemer in #9496
- fix(connectors): Install adds the project profile; each account picks its audience by @sutharjay1 in #9497
- fix(sessions): persistent machine Reset keeps chat; runtime assets never serve a stale digest by @allenabraham999 in #9491
- fix(mobile): finish SSO sign-in through the web handoff (KRTX-2052) by @sutharjay1 in #9490
- fix(web): magic-link sign-in survives a dropped action Set-Cookie (KRTX-2095) by @agent-kortix in #9498
- feat(web): rebuild the Reminders page with a calendar, bulk actions, and a List table by @sutharjay1 in #9499
- fix(connectors): the connector-connected notice joins the prompt queue and steers into the running turn by @DimitrijeGlibic in #9504
- test: pin SESS-48's exhausted-reason contract and #9499's ICU-sensitive label test (KRTX-2112) by @agent-kortix in #9503
- fix(api): attribute the boot-window 503 and stop paging it as a route 5xx (KRTX-397) by @agent-kortix in #9500
- fix(api): /userinfo rejects tokens of deactivated OAuth clients (KRTX-2107) by @agent-kortix in #9505
- fix(edge): drop the request body on GET/HEAD in the api-router worker (KRTX-2081) by @agent-kortix in #9501
- fix(release): clear the staging gate for the release after v0.13.53 by @DimitrijeGlibic in #9510
- fix(api): keep the old root's transcript rows when the runtime root changes by @DimitrijeGlibic in #9513
- fix(computer): desktop control works for every tool, survives restarts and app updates; CLI and desktop app are one runtime by @markokraemer in #9507
- feat(api-contract): add the kortix.session/2 session-log module (minor 1) by @DimitrijeGlibic in #9509
- fix(sandbox): resolve the OpenCode boot root from the claimed pin when the pin file is missing by @DimitrijeGlibic in #9515
- fix(release): clear the second staging gate round for the release after v0.13.53 by @DimitrijeGlibic in #9519
- feat(api-contract): freeze the session-log minor 1 additions and add a shape snapshot by @DimitrijeGlibic in #9517
- KRTX-532: batch the project-reminders session-visibility fan-out (64→~6 db statements/request) by @agent-kortix in #9437
- fix(auth): bound every sign-up/sign-in submit and make it retryable (KRTX-2072) by @agent-kortix in #9487
- fix(sdk): keep saved transcript rows on an empty runtime read (P0.4) by @DimitrijeGlibic in #9526
- fix(api): /v1/setup /status no longer blocks the event loop probing docker (KRTX-2108) by @agent-kortix in #9525
- fix(infra): pin prod API rolling overlap to 100% to fund the next DB pool raise (KRTX-586) by @agent-kortix in #9518
- feat(apps): Apps on the Fly.io model — releases, machines, volumes; convex becomes a template by @markokraemer in #9527
- test: clear the third staging gate round (stop-wins race, SDK poll-deadline flake) by @DimitrijeGlibic in #9528
- Promote dev 7825eae to staging by @DimitrijeGlibic in #9523
- feat(sandbox): session-log port and journal in kortixd (P2.4) by @DimitrijeGlibic in #9530
- feat(computers): the agent CLI is the one control surface; Kortix relays access, the app and web render it by @markokraemer in #9532
- fix(api): image copies manifest-schema's node_modules (dev API boot crash after #9527); restore i18n key order by @markokraemer in #9533
- fix(sdk): bound concurrent binary file reads; ship the provision timeline (KRTX-471) by @agent-kortix in #9516
- fix(cli): kortix apps launch keeps kortix.yaml byte-identical outside the new blocks by @markokraemer in #9535
- feat(apps): machines get KORTIX_USES_URL_ so a server App can call an App it uses by @markokraemer in #9537
- fix(triggers): one event-lock holder per process, so the connector sweep cannot deadlock the pool by @DimitrijeGlibic in #9541
- fix(cli): apps launch reads kortix.yaml once; hover-store tests poll for settled timers by @DimitrijeGlibic in #9543
- refactor(sdk): make the mobile warm-session pool an SDK adapter (KRTX-703) by @agent-kortix in #9538
- fix(api): isolate concurrent session refusal contexts (KRTX-2133) by @agent-kortix in #9539
- Promote dev 4987f19 to staging by @DimitrijeGlibic in #9544
- test: J36 asserts the visible session filter; drop unused test code CodeQL flagged by @DimitrijeGlibic in #9545
- fix(api): bound disk-quota Daytona REST fetches (KRTX-2132) by @agent-kortix in #9540
- fix: an unpayable trigger fire answers 402; a deleted project's gone screen stays; gate flows hold on a deployed target by @DimitrijeGlibic in #9548
- refactor(web): delete the host model flattener; the SDK is its only definition (KRTX-455) by @agent-kortix in #9536
- test: the Platinum sizing invariant gets its own 120 s budget; drop no-effect expressions CodeQL flagged by @DimitrijeGlibic in #9551
- Promote dev 96df3af to staging by @DimitrijeGlibic in #9549
- fix(api): the transcript capture never deletes because a read is shorter; only a recorded rewind does (P0.3) by @DimitrijeGlibic in #9555
- fix(worktree): run the repo's pinned supabase CLI for every worktree call by @DimitrijeGlibic in #9554
- fix(mobile): open every web link in the in-app browser by @sutharjay1 in #9550
- feat(api-contract): fromV1 and toV1 between the v1 mirror and the session log (P1.3) by @DimitrijeGlibic in #9556
- feat(db): session_log tables for kortix.session/2 (P2.1) by @DimitrijeGlibic in #9557
- test: gate round 10 — @local-only journeys stay off deployed lanes; flows wait out per-process caches by @DimitrijeGlibic in #9559
- fix(api-contract): session-log v1 typechecks under kortixd's flags; the packages lane runs kortixd's tsc by @DimitrijeGlibic in #9561
- feat(mobile): minimum-version gate driven by the API (P4.6) by @DimitrijeGlibic in #9562
- feat(api-contract): modelView and oracle normalizers for the session log (P1.4) by @DimitrijeGlibic in #9564
- feat(sandbox): pi session-log export adapter (P2.5) by @DimitrijeGlibic in #9565
- feat(sdk): session-log types vendored from api-contract with a drift guard (P1.5) by @DimitrijeGlibic in #9568
- test(api): Anthropic-transport resolver tests run on a fixture catalog; the daily catalog refresh goes green by @markokraemer in #9572
- chore(catalog): refresh model seeds by @github-actions[bot] in #9573
- feat(sandbox): OpenCode session-log export adapter (P2.6) by @DimitrijeGlibic in #9574
- fix(sdk): the Bedrock heal test asserts the invokable-profile intent, not one day's catalog by @DimitrijeGlibic in #9575
- Promote dev 9bbf745 to staging by @DimitrijeGlibic in #9570
- ci(tests-browser-nightly): read the deployed staging SHA before the target preflight by @markokraemer in #9578
- feat(api): session-log journal ingest and manifest routes (P2.2) by @DimitrijeGlibic in #9579
- feat(apps): display config, a signed-in Convex dashboard tab, CSP policy-list fix by @markokraemer in #9581
- fix(web): the Add account dialog that Install opens proposes a free name by @DimitrijeGlibic in #9583
- test(web): the content-timestamp check tolerates the squash commit that carries the manifest by @DimitrijeGlibic in #9585
- feat(sandbox): log.* events on the runtime stream behind schema=v2, capability session.log.v2 (P4.3) by @DimitrijeGlibic in #9586
- feat(session): fold a settled turn's work into one "Worked for" row by @sutharjay1 in #9558
- feat(api): hidden project flag session_log (P4.1) by @DimitrijeGlibic in #9587
- fix(agent-tunnel, cli): Bun WebSockets name themselves, so Cloudflare lets them through; the probe keeps its verdict by @markokraemer in #9576
- fix(web): KRTX-1581 make sidebar toggle state-aware for assistive tech by @agent-kortix in #9566
- ci(db-drift): compare prod only with migrations its ledger applied; ignore runtime audit partitions by @markokraemer in #9577
- docs: rewrite /docs from scratch — 31 pages, Git as a core Develop page by @markokraemer in #9588
- feat(session): dock the agent question onto the composer as one surface by @sutharjay1 in #9589
- Hotfix: the Add account dialog that Install opens proposes a free name (#9583) by @DimitrijeGlibic in #9591
- feat(api): session reads over the session log behind the session_log flag (P4.2) by @DimitrijeGlibic in #9596
- test(e2e): repair the five quarantined journeys against the current UI and provider contract by @markokraemer in #9597
- refactor(api): split provider-transition-store into routing and activation modules (KRTX-1528) by @agent-kortix in #9590
- feat(apps): previews stay loaded across the project; clean Convex template; apps// layout by @markokraemer in #9599
- Release v0.13.54 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9598
- ci: fix the v0.13.54 staging gate (gitleaks docs placeholders, journeys 27 + 34) and run package quality once per Tests run by @markokraemer in #9601
- fix(cli): reject unknown flags on providers subcommands (KRTX-1541) by @agent-kortix in #9600
- docs(skills): the agent offers to connect the user's computer when they mention local files by @markokraemer in #9602
- feat(sandbox): live-turn puts on the v2 session-log stream (P4.3b) by @DimitrijeGlibic in #9608
- feat(apps): a Convex App is the project's backend, not 'db' by @markokraemer in #9607
- feat(feature-flags): Volumes and Stateless sessions as operator-only organization flags by @allenabraham999 in #9592
- feat(api): log.* events on the session stream behind schema=v2, converted for old daemons (P4.4) by @DimitrijeGlibic in #9610
- fix(web, cli): a pooled App preview stays loading until it loads; apps launch writes with wx; journey 34 sub-agent fold by @markokraemer in #9611
- feat(sdk): session-log store, selectors and v2 negotiation (P4.5) by @DimitrijeGlibic in #9612
- fix(web): providers tab no longer claims the managed provider when zero models are served (KRTX-1482) by @agent-kortix in #9605
- test(e2e): journey 19 reads the organization origin label (#9592) by @markokraemer in #9619
- Promote dev ab602ab to staging by @markokraemer in #9620
- Release v0.13.55 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9625
- Hotfix: prod API keeps the live 200%/100% ECS rollout so Deploy Prod's Terraform applies (v0.13.55) by @markokraemer in #9634
- Release v0.13.56 — Tools on every harness, one-step MCP install, and billing alerts for owners by @github-actions[bot] in #9637
Full Changelog: v0.13.53...v0.13.56