Project creation restored, complete localization, and headless auth
New
5- Desktop asks which Kortix instance to use on first launch.
- Every supported language now has complete translations across settings, onboarding, project home and sidebar, sessions, password recovery, sign-in, and workspace administration. Serbian is a new locale. 241 entries that rendered as placeholders now show real text.
- Headless auth: multi-factor enrolment, enterprise SSO, and profile updates are available through the API and the SDK (
PATCH /v1/auth/user,KortixSession.subscribeas the replacement foronAuthStateChange). - Kortix Apps: one identity guard for every App (
createKortixAppGuard, groups always populated), and an embedded App can complete its own sign-in (cookieSameSite). - Session brief: hover a session to see its summary.
Improvements
8- Self-host operators can set
KORTIX_FRONTEND_MEMORY_LIMITto give the frontend more memory. The setting persists through CLI updates and affects only the frontend. - Account hub as a modal. Organization settings, members, groups, roles, identity, billing, and audit open over the page you are on instead of a separate route tree. The
/accountsroutes are gone; links resolve to?accountId=on the current page, and Back, reload, and pasted links keep working. - Signing in paints one brand mark across the whole path to the project instead of four different loading frames.
- Command palette: file search is offered only where it can run; the Open URL row and the Jump to message page are removed; the empty state no longer names a row that is not there.
- Connector catalogue: one-letter searches work, cache entries are compared by identity, and panel padding and search were corrected.
- Markdown code blocks inside lists are inset correctly.
- Slack and Teams: a live run keeps its thread after 15 quiet minutes.
- Triggers: a billing-rejected fire is terminal and keeps its reason code; a reuse, keyed, or pinned delivery handoff is recorded as fired.
Fixes
22- Sandboxes cannot outlive their work. A session turn now has an absolute ceiling as well as a renewable one. Renewal asks whether a turn is still running, and a wedged turn answers "yes" forever, so a turn record past the ceiling is now settled instead of being renewed indefinitely and its sandbox is reclaimed. This one cause sat behind several classes of server error.
- Fewer server errors when the database is busy. Connection-class and contention failures are now recognised as the temporary conditions they are and retried, instead of being reported as server faults.
- Errors say what actually went wrong. A failure now carries its real cause rather than the message of whatever wrapped it, and how serious it is follows that cause. Ordinary customer state no longer looks like a platform failure, so real failures stop being buried.
- A large unused database index is gone, removing its write cost from every audit record. It was 8.6 GB and had served no read in two and a half months.
- One subscription dialog, in the right place. The upgrade dialog now renders above the deepest panel that opened it, so its controls stay reachable and screen readers can see it. Escape closes it and leaves account settings open.
- Ordered lists size their gutter to the widest marker, so long lists no longer clip their numbers.
- Desktop: the Back control sits correctly on sign-in screens.
- Billing opens one subscription dialog from the account hub. Its controls remain accessible, and Escape closes the subscription dialog while keeping account settings open.
- Session Git pushes honor explicit ref grants within the effective IAM role. Manager-authorized sessions can update shared branches; agent grants cannot elevate a member to manager ref authority.
- Connectors keep working after a bad manifest read. A session no longer loses every connector when one read of
kortix.yamlanswers wrong. Each grant now records the manifest revision it came from; a grant read from the same revision or an older commit never replaces it, and an unreadable manifest keeps the last known grant. The channel that started a session (Slack, Teams, email) stays callable under any grant, so the agent can always report in its own thread. - Connector denials say why.
connector_not_assignednow names the agent, its granted list, the manifest revision, and what to change. A declared connector with no credential answersconnector_not_connectedand lists asneeds_auth. Composio connectors no longer showneeds_authwhile they are connected. - Slack progress is never silently dropped.
slack stepandslack sendfail with a reason when a checkpoint or an answer does not reach the thread, instead of reporting success. A replayed idle event no longer closes a turn that just started. Button clicks carry the full turn instructions and never vanish without a trace. - Sessions: the waiting row and the Stop button stay accurate while a prompt is in flight.
- Triggers: the manager override for reuse-mode prompt delivery works again.
- Web: auth tokens are preserved during hydration and fenced before cross-user adoption, and project access waits for auth, so cold loads no longer show "This project didn't load".
- Web: 18 toasts no longer render their own translation key; the template OG image route runs on Node and stops bundling every translation.
- Desktop: navigation layout restored, with parity checks in the package gate.
- Project creation: a failure while creating the managed repository is now logged with its cause. The edge router in front of the API is deployed with every release, so an origin error is never shown as a maintenance page. The managed-git token is verified by creating and deleting a probe repository before it is stored, and the status endpoint reports which credential is in use.
- Connector endpoints must be https on a public host. An invalid endpoint answers 400 instead of failing as a server error.
- Session attachments are reliable again.
- Kortix Apps: the App guard's trailing-slash handling could take seconds on one config string; the viewer secret is resolved per request; the access picker no longer promises options the code does not offer.
- MFA unenrol route typechecks (
gotrue()accepts DELETE).