New
- Review: agent questions and permission asks no longer block a session. After a short live wait they park in the new Review page, and the answer reaches the session as a new message. (#11797, #11803, #11806)
- Spaces: Slack-style spaces where every message is a thread, with a router that hands work to agents and agents that post into spaces (flags
Spaces-Router,Spaces-ChatInput). (#11712, #11783, #11804, #11838) - Live co-editing of Artifact docs: people and agents type together, with presence, carets and pointers. Artifact cards show open comment threads. (#11747, #11727, #11730, #11723, #11749)
- Watcher Apps:
kortix apps launch --template watcherruns a 24/7 watcher in one function. Every App event is visible in an event log,kortix apps events emit --waitproves the wiring, and app triggers can expect an event within a time window. (#11818, #11814, #11815, #11817, #11823, #11825) - Goals: create, pause, resume, restart and answer goals from the Goals page or the home composer, with role-based brief templates. (#11758, #11812, #11828, #11785)
- ChatGPT and Claude logins show the signed-in email, plan, and 5-hour and weekly usage, warn before a limit runs out, and a session moves to the connected account with the most headroom. (#11751, #11756, #11768, #11816, #11820, #11832)
- Voice: a Kortix agent joins a Google Meet with its voice, joins any web call, and speaks into and transcribes audio files. (#11677, #11742, #11829)
- Connect X and YouTube in one click; agents upload videos of any size. (#11781, #11738, #11770)
- Agents can switch models and re-steer a running session. (#11675)
- TUI:
/providersand/connectorsconnect like the web, and artifacts show in the tray. (#11692, #11698, #11691) - Capture shows each computer's version, update failures and device details. (#11760)
- Mobile: native interactive Liquid Glass on Expo SDK 58, app version 1.6.0. (#11736)
- Solid colour project icons with Kortix marks and custom colours. (#11846)
- Shared Drives are on by default: a team shares Drive folders with its agents out of the box, and a project can turn it off. (#11858)
- In
kortix.yaml,"*"means every name on every grant (tools,skills,connectors,secrets, …).allstays valid, andkortix validate --fixrewrites it to"*". (#11853) - Agents can file
kortix feedbackfrom inside a session. (#11850)
Improved
- Sub-agents, agent messages and workflows show as agent rows. An agent opens in the side panel beside the chat. (#11581, #11753, #11735, #11774, #11776)
- Request logs open the exact session message, with server-side filters. (#11696)
- Routing rules read as one table with a floating save bar. (#11827)
- Send and Customize no longer wait on the slow project detail. (#11754)
- Agents start connections and secret links in the chat instead of sending people to settings. (#11763)
- Up and Down in an empty session composer recall earlier prompts. (#11732)
- Self-hosting: operator addresses cannot be claimed by sign-up, and public instances without email start invite-only. (#11764)
- Closed accounts are erased before day 90, with an evidence row for each decision. (#10797)
- Voice calls are faster and more accurate: cheaper lookups, correct greetings, hints for transcribed files and fewer misheard words. (#11667, #11759, #11766, #11773, #11779, #11790, #11795, #11798, #11799, #11801, #11802, #11809, #11810, #11831, #11836, #11839, #11845)
- Sidebar and session rows are cleaner: one leading mark, type icons, folder-style groups, readable queued messages. (#11726, #11729, #11734, #11767, #11775, #11786, #11789, #11731, #11813)
- Breaking: the SDK drops its OpenCode-era surface. Kortix CLI versions below 0.14.13 must update. (#11821, #11748, #11777)
- Breaking: API and SDK fields drop their OpenCode names: read
runtime_session_id,runtime_sessions,harness_versionandmodel; theopencode_*aliases are gone. (#11848) - Session restore is always on, and an agent on a stateless sandbox is told so. (#11849)
- Error reports name the real API release. (#11854)
- Self-hosting:
kortix self-host updatestarts the new API before it stops a drifted one, anddoctoraccepts an external Capture store. (#11750)
Fixed
- Claude Code turns survive memory pressure, and image-heavy turns stop copying every screenshot on every step. (#11761, #11778)
- A Claude session falls back to the project's fallback model at its plan limit, and an exhausted Claude account shows as a usage limit. (#11822, #11757)
- An always-on App that crashed starts again. Test events no longer count as the App alive. (#11819, #11830, #11833)
- OpenCode-era conversations that never reached the session log are recovered, and the recovery gives up quickly on a stopped box. (#11788, #11834, #11840)
- Shared Drive files stop flipping owners between boxes, and Drive writes retry when storage rate-limits them. (#11807, #11708)
- The desktop shows a loader until it answers, never a 404. (#11805)
- Expanded tool trees stay open when a session completes, and "Worked for" never hides a card. (#11673, #11728)
- At most one confirmation or password-reset email per address per minute. (#11792, #11811)
- Security: signed trigger webhooks reject replays, headless auth redirects are allow-listed, voice guests write nothing, and every fixable critical, high, ReDoS and file-race alert is closed. (#11793, #11693, #11771, #11782, #11791, #11794, #11835, #11842, #11847, #11704, #11694, #11697, #11772)
- Git mirror retries on process exhaustion, so secret prompts stop being refused in bursts. (#11701)
- The gateway never plans an image model the project disabled, and explains Claude session-only models. (#11713, #11705)
- Delete-account dialogs state the 14-day grace period and that billing records are kept. (#11678, #11683)
- The TUI keeps your scroll position while a reply streams, and
/linkcopies only the session link. (#11682, #11681) - API validation errors (400) use zod 4 issue codes, for example
invalid_formatinstead ofinvalid_string. (#11842) - A bash line with an unbalanced quote (a heredoc body with an apostrophe, a
# don'tcomment) no longer stops an unattended session on a permission ask. (#11850) - A cancelled send keeps its draft, and renaming an artifact waits until IME input finishes. (#11851)
- The browser tab shows the open artifact's name. (#11856)
- A workflow result returned as JSON reads as its document. (#11743)
What's Changed
- docs(learnings): keep internal agent fleets out of the customer provider org's pool by @markokraemer in #11672
- fix(ui): preserve expanded tool trees when sessions complete (KRTX-4011) by @agent-kortix in #11673
- fix(tests): MEMORY-4 reads the My Kortix memory layer, not the removed company layer by @markokraemer in #11676
- fix(web,mobile): delete-account dialog says billing records are kept, not removed by @markokraemer in #11678
- feat(api): closed accounts are erased before day 90, with a dry-run default and an evidence row per decision by @markokraemer in #10797
- fix(tui): /link copies only the session web link by @markokraemer in #11681
- fix(tui): scrolling up while a reply streams no longer snaps back to the bottom by @markokraemer in #11682
- feat(sessions): KRTX-4012 let agents switch models and re-steer by @agent-kortix in #11675
- fix(mobile): account deletion says 14 days, the grace period the API schedules by @markokraemer in #11683
- fix(tests): GH-17 retries the token rebind the NOWAIT trigger refuses under contention by @markokraemer in #11684
- fix(ci): restore Trivy installation after DNS failure (KRTX-4013) by @agent-kortix in #11679
- fix(tests): the feature-gate test seeds the project row it reads by @markokraemer in #11686
- feat(tui): artifacts and shown outputs in the tray, the transcript, and Alt+O by @markokraemer in #11691
- feat(tui): /providers connects ChatGPT, Claude and API keys like the web by @markokraemer in #11692
- fix(gateway): return 405 with Allow header (KRTX-3993) by @agent-kortix in #11685
- fix(security): linear-time frontmatter and voice regexes; exclusive voice recording file by @markokraemer in #11694
- fix(api): accept session sandbox_id in proxy URLs (KRTX-3454) by @agent-kortix in #11689
- fix(api): enforce a redirect_to origin allow-list on the headless auth routes (KRTX-4024) by @agent-kortix in #11693
- feat(models): request logs open the exact session message, with server-side filters by @markokraemer in #11696
- fix(security): voice cuts a subtitle credit out before the hallucination test by @markokraemer in #11697
- feat(tui): /connectors connects apps like the web; /connect picks providers or connectors by @markokraemer in #11698
- fix(security): vendor log lines strip line breaks; code-scanning suppressions with reasons by @agent-kortix in #11704
- fix(api): sample the customer-state dead-letter warn (KRTX-4017) by @agent-kortix in #11700
- fix(api): retry git mirror on fork/spawn exhaustion so secret prompts stop being refused in bursts by @agent-kortix in #11701
- fix(gateway): explain Claude session-only models (KRTX-4033) by @agent-kortix in #11705
- docs(learnings): a new sandbox host counts only after a real session ran on it by @markokraemer in #11710
- fix(drives): resend a Platinum 429 rate_limited exec like a transfer_limit 429 (KRTX-4020) by @agent-kortix in #11708
- fix(iam): coalesce concurrent IAM permission probes into one batch request (KRTX-4005) by @agent-kortix in #11711
- fix(gateway): never plan an image model the project disabled (KRTX-4035) by @agent-kortix in #11713
- test(spec): ART-5 states the 500-character quote limit (KRTX-3894) by @Ino-Bagaric in #11499
- feat(artifacts): show open comment threads on Artifact cards (KRTX-3668) by @Ino-Bagaric in #11723
- docs(artifacts): an Artifacts guide section, the Artifact SDK reference and CLI commands (KRTX-3668) by @Ino-Bagaric in #11724
- fix(ui): sidebar session rows show one leading mark and one count by @sutharjay1 in #11726
- fix(ui): make queued messages and agent updates readable by @sutharjay1 in #11729
- fix(session): Worked for folds every finished turn and never hides a card by @sutharjay1 in #11728
- feat(artifacts): live presence on Artifacts — tickets, rooms across pods, change pings, agent focus (KRTX-3669) by @Ino-Bagaric in #11727
- feat(session): agent rows for sub-agents, agent messages and workflows by @sutharjay1 in #11581
- feat(web): Up and Down in an empty session composer recall earlier prompts by @sutharjay1 in #11732
- fix(ui): sidebar child rows show their type icon, status only while live by @sutharjay1 in #11734
- feat(web): live presence on Artifacts — avatars, carets, page pointers, typing, agents (KRTX-3669) by @Ino-Bagaric in #11730
- feat(ui): compact app links in Markdown, no underline, mark centered on cap height by @sutharjay1 in #11731
- fix(voice): a call rings in place and runs as it does locally: fast steps, greeting, its agent's tools by @kubet in #11667
- fix(audit): label GET gateway/logs/facets so the audit label test is green by @Ino-Bagaric in #11737
- feat(voice): a Kortix agent joins a Google Meet with its voice by @kubet in #11677
- feat(session): workflow phase rows with progress rings, a cleaner agent dialog, solid done checks by @sutharjay1 in #11735
- feat(connectors): YouTube connects in one click and agents upload videos at any size by @Ino-Bagaric in #11738
- fix(audit): a request row names the route Hono ran, not the last match by @Ino-Bagaric in #11739
- docs(learnings): never retry a paid vendor order in a loop by @markokraemer in #11740
- fix(tests): GW-MANAGED-1 retries a misread vision answer like a throttle by @markokraemer in #11741
- chore(release): staging VERSION → 0.14.20 [skip ci] by @github-actions[bot] in #11744
- chore(release): VERSION → 0.14.20 [skip ci] by @github-actions[bot] in #11745
- docs(learnings): retire templates built on a guest kernel the host no longer runs by @markokraemer in #11746
- fix(session): a workflow result returned as JSON reads as its document by @sutharjay1 in #11743
- fix(cli): self-host update rolls a drifted API start-first; doctor accepts an external Capture store by @markokraemer in #11750
- feat(providers): ChatGPT and Claude logins show who they are and their plan usage by @markokraemer in #11751
- fix(api): old boxes update before they serve; old CLIs must update by @DimitrijeGlibic in #11748
- feat(voice): call turns read as a conversation; the lane hands over and searches on Kortix; join any web call by @kubet in #11742
- fix(ui): connector catalogue cards prefetch on hover, not on sight by @DimitrijeGlibic in #11752
- feat(session): an agent opens beside the chat, in the side panel by @sutharjay1 in #11753
- fix(projects): Send and Customize no longer wait on the slow project detail by @DimitrijeGlibic in #11754
- docs(learnings): a gate that holds Send or a page reads the project row, never the detail by @DimitrijeGlibic in #11755
- feat(providers): ChatGPT and Claude login cards name the signed-in email and plan by @markokraemer in #11756
- fix(llm-gateway): Claude Code shows an exhausted Claude account as a usage limit, not 'not your usage limit' by @DimitrijeGlibic in #11757
- feat(web): artifact comments get one tab row, quiet threads and the bell's corner count by @sutharjay1 in #11749
- feat(voice): the router knows what a Kortix project holds (notes, agents, skills answered from files) by @kubet in #11759
- feat(chat): Slack-style Spaces and DMs — every message a thread, threads without work, free tabs, Rooms removed; one chat input; talk-only threads (flags) by @markokraemer in #11712
- fix(agents): agents start connections and secret links in the chat instead of sending people to settings by @markokraemer in #11763
- feat(self-host): operator addresses can't be claimed by signing up; public instances without email start invite-only by @markokraemer in #11764
- docs(learnings): an admin address must never be claimable by self sign-up on a self-host by @markokraemer in #11765
- fix(voice): reminder after an unheard reply; one-to-one web calls; the project named in its data by @kubet in #11766
- fix(claude): Claude Code turns survive memory pressure, image windows keep the prompt cache, and a stress test runs the real binary by @markokraemer in #11761
- feat(accounts): a session stays on its Claude or ChatGPT account, and moves to the one with the most headroom when its usage runs out by @markokraemer in #11768
- fix(ui): goal sessions lead with one target that carries their status; child counts drop the caret by @sutharjay1 in #11767
- fix(voice): Strix's findings on the web call: guests write nothing, every request public-only, audio from the call's own frame by @kubet in #11771
- YouTube uploads get a quota of their own: the operator's OAuth app wins, and the 429 says when it resets by @Ino-Bagaric in #11770
- fix(voice): a one-to-one call with nobody trusted never reaches the agent, hidden turns included by @kubet in #11772
- fix(sdk): read catalog auth helpers from /lite, never the full entry (KRTX-4082) by @agent-kortix in #11769
- fix(session): the agent panel keeps its header in place and uses the panel's color by @sutharjay1 in #11774
- fix(ui): a session group reads as a folder row, and an empty group says to drag a session in by @sutharjay1 in #11775
- fix(voice): the project read when asked, not at load; typed words during a reply never dropped by @kubet in #11773
- feat(session): the agent panel scrolls back to the newest message in one click by @sutharjay1 in #11776
- feat(goals): create, pause, resume and answer goals from the Goals page by @sutharjay1 in #11758
- fix(sandbox): an image-heavy Claude turn stops copying every screenshot on every model step by @markokraemer in #11778
- refactor: no API or client path reads a box below the runtime floor by @DimitrijeGlibic in #11777
- fix(voice): a voice asked for by name is the voice; a voice it lacks is never claimed by @kubet in #11779
- feat(analytics): track user journeys and ad/video attribution in PostHog by @DimitrijeGlibic in #11780
- fix(voice): Strix's second findings: IPv6-mapped hosts, guest tags, batched turns, voice namespaces by @kubet in #11782
- feat(connectors): connect X in one click with Kortix's own X OAuth client by @agent-kortix in #11781
- feat(artifacts): live co-editing of docs — people and agents type together (KRTX-3670) by @Ino-Bagaric in #11747
- fix(ui): restore production queue padding by @sutharjay1 in #11786
- feat(web): goal page shows local times, colored activity, favicon links and a cleaner share dialog by @sutharjay1 in #11785
- feat(capture): see each computer's Capture version, update failures and device details by @markokraemer in #11760
- feat(analytics): the #7144 dashboards and server events; no email, no replay by @DimitrijeGlibic in #11787
- fix(llm-gateway): an unrepresentable plan-usage reset time is no reset time (KRTX-4085) by @agent-kortix in #11784
- feat(ui): GitHub profile and repo links get the app mark; hover underlines the label by @sutharjay1 in #11789
- fix(voice): a request after a cut-off reply is done, not the cut-off one again by @kubet in #11790
- fix(voice): a speaker's label in a meeting cannot be forged by @kubet in #11791
- fix(auth): at most one confirmation email per address per minute by @markokraemer in #11792
- fix(voice): a call greets as the agent it was placed to, not as the default one by @kubet in #11795
- fix(api): key the shared-response flood cap on an existing share, not the token shape (KRTX-4105) by @agent-kortix in #11794
- feat: agent questions and permission asks park in Review instead of blocking the session by @markokraemer in #11797
- fix(voice): the search beside the router is one cheap call, not three by @kubet in #11798
- fix(voice): lookups ahead read no pages; a box's search costs are the router's by @kubet in #11799
- fix(voice): a reply goes into the call's history once by @kubet in #11801
- feat(spaces): a router that hands work to agents through shared thread files, and agents that configure and post into Spaces by @markokraemer in #11783
- fix(voice): a lookup ahead is one cheap search, not a race of three by @kubet in #11802
- chore(api): configure the X OAuth client on dev (KRTX-4114) by @agent-kortix in #11800
- fix(review): Review cards look and work like the session's question and permission cards by @markokraemer in #11803
- feat(spaces): a message sent in a space opens its thread on the right at once by @markokraemer in #11804
- fix: a signed trigger webhook needs a fresh timestamp, so a captured one cannot replay (KRTX-4098) by @agent-kortix in #11793
- fix(desktop): show a loader until the desktop answers, never the edge's 404 by @markokraemer in #11805
- fix(session): a parked question's answer shows as the answered-question row, as before by @markokraemer in #11806
- fix(drives): shared drive files stop flipping owners between boxes by @markokraemer in #11807
- fix(voice): memory questions reach the agent; a late card fact beats search snippets by @kubet in #11809
- fix(voice): the router asks back only for a detail a lookup needs by @kubet in #11810
- fix(auth): apply the per-address auth-email cooldown to password reset (KRTX-4118) by @agent-kortix in #11811
- fix(ui): show spawned sessions and goals in hovercards by @sutharjay1 in #11813
- feat(apps): every App event is visible: event log, unmatched events, a per-App limit by @Ino-Bagaric in #11814
- feat(apps): prove a watcher's wiring with a test App event: kortix apps events emit --wait by @Ino-Bagaric in #11815
- feat(web): start a goal from the home composer and role-based templates by @sutharjay1 in #11812
- feat(triggers): know when a watcher App goes quiet: expect_event_within on app triggers by @Ino-Bagaric in #11817
- feat(models): find and track connected subscription usage by @sutharjay1 in #11816
- feat(apps): a 24/7 watcher in one function: kortix apps launch --template watcher by @Ino-Bagaric in #11818
- fix(apps): an always-on App that crashed is started again instead of staying down by @Ino-Bagaric in #11819
- feat(models): warn before subscription limits are exhausted by @sutharjay1 in #11820
- feat(mobile): native interactive Liquid Glass, Expo SDK 58, version 1.6.0 by @sutharjay1 in #11736
- feat(api): recover OpenCode-era conversations that never reached the session log by @DimitrijeGlibic in #11788
- feat(sdk)!: remove the OpenCode-era surface; CLI below 0.14.13 must update by @DimitrijeGlibic in #11821
- feat(web): the App page shows a watcher App's events and health by @Ino-Bagaric in #11823
- refactor: voice and workflow resume stop reading OpenCode-era routes by @DimitrijeGlibic in #11824
- fix(models): a Claude session falls back to the project's fallback model at the plan limit by @sutharjay1 in #11822
- fix(watchers): agents watch a page with an App and hear when it stops by @Ino-Bagaric in #11825
- fix(api): the runtime trigger route parses again by @Ino-Bagaric in #11826
- feat(goals): start a stopped goal again, and 10 brief templates per role by @sutharjay1 in #11828
- feat(voice): the agent speaks into audio files and transcribes them, with or without a call by @kubet in #11829
- feat(web): Routing rules read as one table with a floating save bar by @sutharjay1 in #11827
- fix(apps): test events never count as the App alive; My Kortix wires after deploy by @Ino-Bagaric in #11830
- fix(voice): a transcribed file gets the call's Whisper hint by @kubet in #11831
- fix(models): show usage for existing subscription connections by @sutharjay1 in #11832
- fix(apps): a watcher hears the recovery after an incident by @Ino-Bagaric in #11833
- fix(api): the history recovery gives up in 30 s on a box another writer stopped by @DimitrijeGlibic in #11834
- fix(secrets): enforce account isolation for subscription usage by @sutharjay1 in #11835
- fix(voice): a choice handed back is taken, and a place that is nowhere is a misheard word by @kubet in #11836
- chore(sandbox): voxl v0.3.3 on the session desktop, its Host and Origin checks on behind the Kortix proxy by @markokraemer in #11808
- chore(flags): name the Spaces flags Spaces-Router and Spaces-ChatInput by @markokraemer in #11838
- fix(voice): nothing to search is never searched by @kubet in #11839
- fix(api): the history recovery parks a Daytona box whose start answered 502 by @DimitrijeGlibic in #11840
- fix(email): the footer sits on the logo's edge and links the mobile apps by @sutharjay1 in #11841
- fix(security): close every fixable critical and high dependency alert on dev by @markokraemer in #11842
- fix(build): the API image builds again: kortixd's bun.lock resolves zod 4 by @markokraemer in #11843
- docs(learnings): a kortixd dependency bump regenerates its standalone bun.lock by @markokraemer in #11844
- fix(voice): through the Kortix router, read the top result's page alone by @kubet in #11845
- feat(projects): solid colour project icons with Kortix marks, brand icon and custom colours by @sutharjay1 in #11846
- fix(security): close the fixable ReDoS and file-race code-scanning alerts by @markokraemer in #11847
- feat!: DB columns, session metadata and API fields drop OpenCode names by @DimitrijeGlibic in #11848
- feat(sessions): restore always on; stateless sandboxes warn the agent by @DimitrijeGlibic in #11849
- docs(learnings): a breaking migration's outage lasts until old tasks stop by @DimitrijeGlibic in #11852
- fix(api): Better Stack errors name the real API release, not kortix-api@dev by @markokraemer in #11854
- fix(clients): preserve drafts and cancel stale UI work by @sutharjay1 in #11851
- docs(learnings): Better Stack pages only for prod by @markokraemer in #11855
- fix(api,kortixd): agents can file kortix feedback from a session; heredocs stop blocking on ask by @markokraemer in #11850
- fix(web): show the artifact name in the browser title by @sutharjay1 in #11856
- feat(drives): shared Drives are on by default by @markokraemer in #11858
- fix(release): green the contract lanes for v0.14.20 by @markokraemer in #11837
- feat(manifest): "" means every name on every kortix.yaml grant; --fix updates all to "" by @markokraemer in #11853
- Promote dev b277886 to staging by @github-actions[bot] in #11859
- fix(release): carry the v0.15.0 suite fixes to frozen staging by @DimitrijeGlibic in #11864
- fix(ci): carry the gitleaks allowlists to frozen staging by @DimitrijeGlibic in #11867
- ci(release): carry the advisory Strix gate to frozen staging by @DimitrijeGlibic in #11870
- fix(ui): give the declaration build its own 6 GB heap (cherry-pick #11878 for v0.15.0) by @agent-kortix in #11879
- fix(tests): carry the reskin e2e build heap to frozen staging by @DimitrijeGlibic in #11886
- Release v0.15.0 — Review, Spaces, live doc editing, and watcher Apps by @github-actions[bot] in #11872
Full Changelog: v0.14.19...v0.15.0