New
- Your computer, on the web. Each physical computer appears once, even after you re-pair it. Computer Use runs inside the Kortix desktop app, and it asks for every macOS permission right after you connect. Pairings with no hardware id that stay silent for 30 days are removed.
- Edit a queued prompt in place. The prompt queue sits in its own card above the composer.
- Review Center has its own page. You approve requests in a modal on the approve page.
- Channel bindings live in one dialog, with one tab per platform and a settings dialog for each binding. Teams bindings read "Team › Channel" and include the thread title.
- Shared sessions show who sent each message, with an avatar per sender.
- Marketplace redesign: one card per item, a file tree in the sidebar, and related skills.
- A new /developers page. Its "copy prompt command" output now pastes safely into any POSIX shell.
- One-day personal API keys. You can create a key that expires after one day.
- Apps on mobile: a new Apps tab in the project drawer.
- Show files name the file in a hover card.
Improved
- Audit log, rebuilt. Events are written to weekly partitions with time-ordered ids, without the per-session lock that slowed ingestion. Noise rows (missing-secret probes, a login event per request) are gone. Weeks older than 90 days move to S3 under Object Lock, and exports read archived weeks too.
- The agent harness: Kortix tools run on both supported harnesses, and the web, CLI, and mobile clients render from the Kortix session contract.
- Slack: messages name people and channels instead of showing ids, and plan steps render channels natively. Agent history and thread reads name each author. Slack shows its own logo everywhere.
- Connectors: discovery tries managed connectors first, with explicit API and MCP sources. Discovery still works when a spec source cannot load.
- Sandbox file uploads send 8 MiB requests, so a 1 MiB file uploads in about 2 s instead of 20 s.
- Sessions honor US compute placement and reuse warm sessions. Warm sessions you are billed for stay visible in the session list. You can switch agents in a started session, and the locked agent picker explains why it is locked.
- Each sandbox sends its calls to its own regional control plane.
- Database health: RLS policies evaluate the signed-in user once per query, duplicate indexes are dropped, foreign keys are indexed, and unused legacy tables are removed.
- Apps: deleting an App deletes its deployment images, and you can delete a single deployment.
- Invite emails name the invited address.
Fixed
- A session whose turn ends with a terminal error now parks, instead of staying busy.
- The CLI:
--hostand named-host project context route to the right host, browser login uses the target host, and--jsonoutput carries no human notices.accounts current --jsonexits 1 when no account is active,projects usereports errors instead of crashing, andtokens rmwith a malformed id returns 400. - Credit balances read the same on the CLI and the web, and a free account sees its balance on Plan.
- Sign-in keeps the details of an email sign-in failure. Rate-limit errors show guidance instead of raw text, and account deletion ends active sessions at once.
- The web: the command palette finds active projects, the selected language persists, the account hub opens from deep links, connected-account settings open again, and settings rows stack on narrow screens. The Apps card shows its live preview again.
- Video: unsupported fullscreen and blocked autoplay no longer raise errors.
- Mobile: the composer detects mention and command triggers at the caret, not only at the end of the text.
- Marketplace installs report failures instead of exiting silently.
What's Changed
- feat(session): participants endpoint and per-message sender avatars for shared sessions by @sutharjay1 in #8493
- feat(computers): "Your computer" on the web; re-pairing says "already connected" by @markokraemer in #8660
- fix(auth): end sessions after immediate account deletion (KRTX-951) by @agent-kortix in #8640
- feat(desktop): Computer Use runs inside Kortix; macOS grants go to Kortix, asked at once by @markokraemer in #8678
- test(kortixd): wait for the note's content, not for the file (W5 E4 race) by @DimitrijeGlibic in #8651
- refactor(web): one toast surface, delete lib/toast wrapper by @sutharjay1 in #8682
- refactor(sdk): separate facade, transport and working decisions (KRTX-916) by @agent-kortix in #8577
- fix(web): guard unsupported video fullscreen API (KRTX-942) by @agent-kortix in #8621
- chore(api): revert archived wake budget extension (KRTX-440) by @agent-kortix in #8662
- chore(api): revert slow chunk read diagnostics (KRTX-797) by @agent-kortix in #8663
- refactor(sdk): revert audit query builder deduplication (KRTX-413) by @agent-kortix in #8664
- chore(api): revert resource-grant timing instrumentation (KRTX-821) by @agent-kortix in #8665
- chore(api): revert proxy failure log enrichment (KRTX-811) by @agent-kortix in #8666
- refactor(mobile): revert session action flow extraction (KRTX-774) by @agent-kortix in #8668
- chore(api): revert account-key session start denial (KRTX-426) by @agent-kortix in #8669
- chore(api): revert config deadline stage attribution (KRTX-818) by @agent-kortix in #8670
- refactor(web): revert sidebar menu extraction (KRTX-651) by @agent-kortix in #8671
- chore(api): revert Platinum reaper throttle classification (KRTX-345) by @agent-kortix in #8672
- refactor(api): revert preview helper extraction (KRTX-328) by @agent-kortix in #8673
- chore(api): revert secrets read timing instrumentation (KRTX-819) by @agent-kortix in #8674
- chore(web): revert dead connector hook deletion (KRTX-709) by @agent-kortix in #8676
- feat(computers): setup on the spot: every macOS permission asked right after connecting by @markokraemer in #8687
- fix(web): persist selected language in browser session (KRTX-950) by @agent-kortix in #8680
- fix(sessions): honor US compute placement and warm reuse by @kubet in #8653
- fix(web): restore connected account settings destination (KRTX-961) by @agent-kortix in #8683
- refactor(search): share runtime ranking and delete host shims (KRTX-394) by @agent-kortix in #8684
- refactor(api): compress shared middleware and value projections (KRTX-960) by @agent-kortix in #8685
- fix(web): include active projects in palette search (KRTX-964) by @agent-kortix in #8686
- revert(messaging): take agents-message-people out of main, keep message authors by @markokraemer in #8659
- chore(release): VERSION → 0.13.48 [skip ci] by @github-actions[bot] in #8691
- chore(release): staging VERSION → 0.13.48 [skip ci] by @github-actions[bot] in #8692
- feat(computers): one entry per physical computer; older connections apart by @markokraemer in #8697
- feat(capture): Kortix Capture — 24/7 screen capture per user, searchable by people and agents by @markokraemer in #8698
- fix(main): packages lane red — 4 capture audit labels untranslated in 8 locales, capture sweeper unclassified by @markokraemer in #8700
- feat(computers): remove pairings without a hardware id after 30 silent days by @markokraemer in #8701
- feat: OpenCode decoupling W6 — clients on the Kortix contract (web renders from SDK kinds, neutral CLI/TUI seam, mobile on @kortix/sdk) by @DimitrijeGlibic in #8699
- fix(db): drop three audit_events indexes no read path uses (22 GB) by @markokraemer in #8703
- infra(capture): allow the dev capture bucket to be destroyed (step 1 of removing Kortix Capture from main) by @markokraemer in #8704
- revert(capture): remove Kortix Capture from main by @markokraemer in #8705
- fix(audit): stop writing noise rows — missing-secret probes, per-request login, self-audit by @markokraemer in #8706
- chore: restore 13 wrongly reverted PRs (merge-gate revert cascade, 2026-10-01) by @markokraemer in #8702
- fix(audit): the git proxy's legacy-token fallback is a probe by @markokraemer in #8711
- refactor(web): consolidate connector setup concerns (KRTX-966) by @agent-kortix in #8689
- fix(auth): retain email sign-in failure details (KRTX-958) by @agent-kortix in #8712
- fix(connectors): managed-first discovery with explicit API/MCP sources (KRTX-885) by @agent-kortix in #8713
- feat(audit): new audit_events rows get a time-ordered UUIDv7 event_id (1/5) by @markokraemer in #8708
- feat(audit): remove the per-session lock and hash chain from audit ingestion (2/5) by @markokraemer in #8710
- feat(audit): weekly range partitions for audit_events, swapped in without moving rows (3/5) by @markokraemer in #8715
- feat(infra): audit-archive S3 bucket with Object Lock for audit_events by @markokraemer in #8709
- feat(audit): archive weeks older than 90 days to S3 under Object Lock and drop their partitions (4/5) by @markokraemer in #8716
- feat(audit): export reads archived audit weeks from S3; retention docs and viewer note (5/5) by @markokraemer in #8717
- chore(env): dev runs the audit archive (mirror of kortix-dev-env) by @markokraemer in #8718
- refactor(web): unify Drive row interactions and remove unused paths (KRTX-986) by @agent-kortix in #8720
- fix(web): reject failed careers application responses (KRTX-979) by @agent-kortix in #8721
- refactor(web): compress file renderer lifecycles (KRTX-983) by @agent-kortix in #8723
- refactor(markdown): share fenced-code language aliases (KRTX-992) by @agent-kortix in #8724
- refactor(web): unify marketing tree and boundary renderers (KRTX-980) by @agent-kortix in #8726
- refactor(web): unify tab lists and diagram zoom (KRTX-1008) by @agent-kortix in #8727
- fix(api): invalidate archived-project secret intake (KRTX-991) by @agent-kortix in #8728
- refactor(shared): own CLI and TUI host storage (KRTX-993) by @agent-kortix in #8729
- fix(slack): show channel and people names instead of ids by @Ino-Bagaric in #8730
- feat(slack): name each author in agent history and thread reads by @Ino-Bagaric in #8731
- fix(email): invite names the invited address and clears SpamAssassin's image-only window by @Ino-Bagaric in #8732
- feat(web): edit each channel binding in a settings dialog by @Ino-Bagaric in #8733
- feat: OpenCode decoupling W7 — Kortix tools on pi, system skills and docs describe both harnesses by @DimitrijeGlibic in #8714
- perf(mobile): stop the waking-session freeze, cut re-renders, render markdown images by @sutharjay1 in #8468
- fix(slack): plan steps name people as text and render channels natively by @Ino-Bagaric in #8735
- feat(web): rebuild the /developers page by @sutharjay1 in #8736
- fix(apps): delete releases App deployment images; delete one deployment by @kubet in #8734
- feat(web): show the prompt queue as its own card above the composer by @sutharjay1 in #8737
- feat(web): channel bindings in one dialog with a tab per platform by @Ino-Bagaric in #8739
- fix(platinum): call each sandbox's own control plane, not the home one by @kubet in #8740
- fix(connectors): Connectors API Discover is off by default again (hotfix) by @markokraemer in #8741
- fix(teams): name channel bindings Team › Channel, with the thread title by @Ino-Bagaric in #8744
- fix(dev): build the default image and make it resident in US before the API rolls by @kubet in #8743
- fix(config-releases): the meta coordinator runs its own governance-only release by @DimitrijeGlibic in #8745
- fix(web): Slack's own logo on session channel cards, not pink by @Ino-Bagaric in #8749
- perf(mobile): remove render and animation hot paths before store release by @sutharjay1 in #8747
- fix(web,mobile): Slack's own logo everywhere: connector detail and mobile by @Ino-Bagaric in #8757
- fix(cli): accounts current --json exits 1 when no account is active (KRTX-1044) by @agent-kortix in #8752
- fix(cli): reject missing named-host project context (KRTX-1042) by @agent-kortix in #8758
- feat(sessions): edit a queued prompt in place by @sutharjay1 in #8753
- fix(web): make the locked session agent picker read inert with a why tooltip by @agent-kortix in #8748
- fix(settings): render the account hub on deep links (KRTX-1050) by @agent-kortix in #8762
- fix(computer): honor empty-directory deletion contract (KRTX-1057) by @agent-kortix in #8764
- refactor(web): share factory across circular dotm variants (KRTX-656) by @agent-kortix in #8558
- fix(connectors): expose computer discovery RPCs (KRTX-1055) by @agent-kortix in #8766
- perf(api,sdk): R1 hot path: fewer statements, sleeps and git calls between a prompt and the harness by @DimitrijeGlibic in #8765
- feat(web): Review Center as its own page, approvals in the approve-page modal by @sutharjay1 in #8761
- fix(api): the latency bench's restart guard is local-only; R1 numbers on dev by @DimitrijeGlibic in #8770
- fix(files): upload sandbox files in 8 MiB requests, not 64 KiB round trips (1 MiB: 20 s → 2 s) by @kubet in #8768
- fix(sandbox): a box registers every model it is told to use; the gateway decides what is served by @DimitrijeGlibic in #8772
- fix(billing): show free account balance on Plan (KRTX-1060) by @agent-kortix in #8769
- fix: make main green: SQL guard, queued-prompt e2e, and the four failures it was hiding by @kubet in #8771
- fix(web): replace raw auth rate-limit errors with guidance (KRTX-1049) by @agent-kortix in #8763
- refactor(web): delete unreachable hooks (KRTX-1063) by @agent-kortix in #8773
- fix(runtime): no relaunch on first open of a swapped template; direct regional creates by @kubet in #8775
- fix(cli): align human credit output with web units (KRTX-1054) by @agent-kortix in #8776
- fix: main green — page heading on standalone project pages; two stale tests by @kubet in #8778
- refactor(sdk): centralize provider admin state (KRTX-1014) by @agent-kortix in #8777
- perf(proxy): /v1/p reads the token row once and overlaps the sandbox row with auth by @kubet in #8774
- perf(snapshots): exact-name Platinum template lookups; reap the predecessor off the session path by @kubet in #8780
- fix(cli): route projects use --host to the named host (KRTX-1041) by @agent-kortix in #8750
- perf(db): drop duplicate index on basejump.account_user (KRTX-1078) by @agent-kortix in #8782
- perf(db): index the account_tokens foreign keys (KRTX-1091) by @agent-kortix in #8788
- fix(db): drop duplicate index idx_agents_account_non_suna (KRTX-1083) by @agent-kortix in #8783
- perf(db): index the basejump.account_user account_id foreign key (KRTX-1085) by @agent-kortix in #8786
- fix(api): park a session whose turn ends with a terminal error (KRTX-1046) by @agent-kortix in #8755
- refactor(web): delete unreachable analytics, desktop and notification paths (KRTX-1059) by @agent-kortix in #8791
- fix(cli): state the one-way disable semantics in the tokens help (KRTX-1070) by @agent-kortix in #8784
- fix(db): index the app_deployment_events runtime foreign key (KRTX-1092) by @agent-kortix in #8805
- perf(db): prepared connections plan every execution for its own parameters by @DimitrijeGlibic in #8839
- fix(db): index the unindexed basejump.invitations foreign keys (KRTX-1087) by @agent-kortix in #8817
- fix(billing): name the session in sandbox compute ledger debits (KRTX-1069) by @agent-kortix in #8813
- fix(db): index the granted_by FK on the legacy public.user_roles (KRTX-1124) by @agent-kortix in #8831
- fix(db): index the legacy public.credit_ledger created_by FK (KRTX-1122) by @agent-kortix in #8807
- fix(db): evaluate auth.uid() once in the checkout_clicks RLS policy (KRTX-1135) by @agent-kortix in #8810
- fix(db): wrap public.api_keys RLS auth.uid() in an initplan (KRTX-1133) by @agent-kortix in #8824
- fix(db): wrap legacy credit_accounts RLS auth calls in subqueries (KRTX-1136) by @agent-kortix in #8827
- ci: stop burning Actions minutes on every push to main by @markokraemer in #8844
- perf(db): add covering indexes for the unindexed foreign keys on public.agent_versions (KRTX-1121) by @agent-kortix in #8801
- perf(api): resolve the admin accounts search users-first (KRTX-1127) by @agent-kortix in #8832
- chore(api,sdk): refactor plan R0 guard rails by @DimitrijeGlibic in #8294
- fix(db): rebuild the basejump.accounts owner policy as an initplan (KRTX-1129) by @agent-kortix in #8815
- fix(db): wrap legacy public deletion-request policies for the RLS init plan (KRTX-1130) by @agent-kortix in #8819
- fix(db): wrap auth.uid() in the agent_runs select policy (KRTX-1131) by @agent-kortix in #8821
- fix(api): turn-ledger savepoint log carries the error in the message by @agent-kortix in #8845
- fix(db): wrap legacy public.credit_usage RLS policy auth calls in InitPlan subqueries (KRTX-1140) by @agent-kortix in #8814
- fix(db): drop the legacy basejump account_user select policy (KRTX-1128) by @agent-kortix in #8793
- fix(db): re-date pending concurrent migrations to unblock dev (KRTX-1083) by @agent-kortix in #8838
- feat(test): local test attestation gate by @markokraemer in #8850
- perf(db): index the account_secret_resources.project_id foreign key (KRTX-1090) by @agent-kortix in #8833
- perf(db): index the basejump.accounts foreign keys (KRTX-1086) by @agent-kortix in #8851
- fix(mobile): remove inactive sandbox switch shortcut (KRTX-898) by @agent-kortix in #8561
- fix(cli): keep human notices off the machine stream for --json (KRTX-1043) by @agent-kortix in #8751
- fix(api): keep billed warm sessions visible in the project session list (KRTX-1068) by @agent-kortix in #8835
- fix(api): rate-limit the dead-credential 401 warn line (KRTX-1039) by @agent-kortix in #8754
- fix(api): degrade connector auth discovery when a spec source cannot be loaded (KRTX-1038) by @agent-kortix in #8756
- fix(marketplace): surface install failures instead of silent exit 0 (KRTX-1045) by @agent-kortix in #8781
- fix(sdk): never retry a 4xx in the picker and tunnel query retry policies (KRTX-1040) by @agent-kortix in #8837
- refactor(web): compress public route helpers (KRTX-989) by @agent-kortix in #8722
- fix(db): re-date the invitations FK index migration after the ordering violation (KRTX-1087) by @agent-kortix in #8846
- fix(db): remove broken agent_runs_select_policy_initplan migration (unblocks deploys) by @markokraemer in #8852
- docs(learnings): a migration naming a nonexistent column blocks every dev deploy by @markokraemer in #8853
- fix(api): R2 reliability with 3 replicas — no per-process state, no swallowed writes, no sleeps by @DimitrijeGlibic in #8848
- fix(db): the local migration lint refuses a migration dated before main's newest by @DimitrijeGlibic in #8932
- fix(cli): drop the per-subcommand --help promise from projects group help (KRTX-1261) by @agent-kortix in #8888
- feat(iam): offer one-day personal key expiry (KRTX-936) by @agent-kortix in #8606
- fix(web): stack settings rows below sm so help text stays readable (KRTX-1313) by @agent-kortix in #8909
- fix(api): answer 400 for a malformed token id in tokens rm (KRTX-1330) by @agent-kortix in #8892
- fix(cli): parse projects use error responses instead of crashing (KRTX-1192) by @agent-kortix in #8891
- fix(web): show the full Linux download size on narrow viewports (KRTX-1291) by @agent-kortix in #8903
- fix(mobile): detect composer triggers at the caret (KRTX-1248) by @agent-kortix in #8856
- fix(cli): route browser login through target host (KRTX-1255) by @agent-kortix in #8864
- refactor(web): delete unused apps-web exports, badge and rail item (KRTX-909) by @agent-kortix in #8900
- fix(cli): scope account defaults to explicit host (KRTX-1336) by @agent-kortix in #8868
- fix(cli): scope cloud E2E token rename/cleanup to the minted row (KRTX-1342) by @agent-kortix in #8887
- refactor(web): drop the dead email-code action the link flow replaced (KRTX-1332) by @agent-kortix in #8889
- refactor(web): separate Apps concerns and remove unreachable code (KRTX-977) by @agent-kortix in #8719
- feat(web): marketplace redesign — one card, sidebar file tree, related skills by @sutharjay1 in #8945
- fix(deps): devalue 5.9.3; ignore unreachable node-forge CVE-2026-85393 by @markokraemer in #8951
- fix(test): key attestation to the PR diff so unrelated main-merges don't invalidate it by @markokraemer in #8952
- refactor(web): compress project workflows and remove obsolete onboarding code (KRTX-1010) by @agent-kortix in #8760
- fix(session): keep agent switching available in a started session (KRTX-1290) by @agent-kortix in #8943
- fix(web): handle play() rejections and drop the autoplay NotAllowedError noise (KRTX-1333) by @agent-kortix in #8946
- feat(mobile): an Apps tab in the project drawer (KRTX-1286) by @agent-kortix in #8947
- perf(db): drop the unused indexes on kortix.access_requests (KRTX-1174) by @agent-kortix in #8893
- fix(db): consolidate legacy credit account select policies (KRTX-1160) by @agent-kortix in #8885
- perf(db): scope legacy credit ledger policies by role (KRTX-1162) by @agent-kortix in #8882
- perf(db): cache legacy credit purchase RLS auth calls (KRTX-1139) by @agent-kortix in #8878
- perf(db): drop invalid duplicate messages index (KRTX-1084) by @agent-kortix in #8859
- chore(db): retire the dead legacy public.credit_balance table (KRTX-1137) by @agent-kortix in #8849
- fix: clear staging gate #8950 — CodeQL highs + web tests by @markokraemer in #8957
- fix(db): drop the legacy file_uploads table (KRTX-1142) by @agent-kortix in #8842
- perf(db): wrap message_select_policy auth.uid() calls in initplans (KRTX-1143) by @agent-kortix in #8840
- feat(web): name show files in a hover card, drop the file-name row by @sutharjay1 in #8958
- perf(db): index the public.credit_usage message_id foreign key (KRTX-1123) by @agent-kortix in #8812
- refactor(db): drop the duplicate account_memberships unique index (KRTX-1082) by @agent-kortix in #8785
- fix(web): /developers copies the prompt command with POSIX single quotes by @markokraemer in #8962
- fix: core lane for staging #8960 — credit_purchases RLS qualification, stale shiki php diff by @markokraemer in #8963
- fix(web): apps card shows the live preview again (journey 18) by @markokraemer in #8965
- fix(db): re-date out-of-order public_credit_usage_message_id_index (unblock dev) by @markokraemer in #8967
- fix(db): re-point account_secret_grants FK before dropping the duplicate membership index by @markokraemer in #8969
- fix(db): snapshot companion for the duplicate account_memberships index drop by @markokraemer in #8970
- fix(db): re-date 8 migrations that sort before dev's applied set by @markokraemer in #8971
- fix: clear CodeQL highs on staging PR #8968 by @markokraemer in #8972
- fix(web): journey 18 modal steps match the product by @markokraemer in #8973
- ci(tests): the core lane installs Chromium too by @markokraemer in #8974
- fix(api): stamp created_at when a warm session is adopted by @sutharjay1 in #8953
- fix(release): unblock dev deploy and the v0.13.48 staging gate by @markokraemer in #8976
- Promote main 1cf6d6e to staging by @markokraemer in #8977
- Release v0.13.48 — Your computer on the web, a rebuilt audit log, and editable queued prompts by @github-actions[bot] in #8746
Full Changelog: v0.13.47...v0.13.48