v2.37.0
Changelog
Note
This is a mainline Coder release. We advise enterprise customers without a staging environment to install our latest stable release while we refine this version. Learn more about our Release Schedule.
BREAKING CHANGES
-
Coder Agents chats API promoted from
/api/experimentalto/api/v2(#28496)The Coder Agents chats API is moving from
/api/experimentalto/api/v2. The experimental routes remain available for a one-month migration period. Integrations using endpoints promoted to/api/v2must migrate before the compatibility routes are removed in v2.38.Migration: Update any integration that calls the experimental chats API to the
/api/v2equivalents before v2.38, when the compatibility routes are removed. -
Default-organization chat-model routes removed (#28632)
The obsolete default-organization chat-model routes
/api/experimental/chats/modelsand/api/experimental/chats/model-configsare removed immediately in v2.37.Migration: Use
/api/v2/organizations/{organization}/chats/modelsinstead. -
OAuth authorization rejects unsupported or over-broad scopes (#28178)
OAuth authorization requests now reject unsupported or over-broad scopes with
invalid_scope. Integrations sending values such asopenid,profile, oremailmay fail.Migration: Review your OAuth integrations and remove unsupported or over-broad scope values so requests are not rejected with
invalid_scope. -
Dynamic client registration disabled by default (#27316)
POST /oauth2/registeris now controlled by the persistent deployment settingoauth2_dcr_enabled, which defaults to disabled. When disabled, Coder omitsregistration_endpointfrom discovery metadata and returns an RFC 7591-style403for new dynamic client registrations; existing registered clients continue to work.Migration: If your deployment relies on Dynamic Client Registration, explicitly enable it after upgrading through
PUT /api/v2/oauth2-provider/settings. Existing registered clients are unaffected; only new registrations are gated. -
Agent external auth now resolves by template, not deployment config order (#27854)
For hostname-only external auth requests at runtime, such as Git operations through
GIT_ASKPASS, Coder now resolves the provider from the workspace template's declaredcoder_external_authentries instead of whichever deployment-configured provider matched last in config order. This is breaking for deployments that relied on provider ordering or stale template declarations, because ambiguous declared matches and declared-but-unconfigured providers now return HTTP 404 instead of silently substituting a different provider's token.Migration: If a template declares several providers that match the same host, give them non-overlapping
CODER_EXTERNAL_AUTH_<N>_REGEXvalues or fetch the token with an explicit ID viacoder external-auth access-token <id>. If a template declares a provider that was renamed or removed, restore that provider or update the template declaration. Declaring the intended provider in templates is recommended but not required. -
login_type=nonedeprecated; existing accounts converted to password login (#26851)Legacy
login_type=noneusers are deprecated in favor of service accounts.POST /usersandcoder users createnow rejectlogin_type=noneand the deprecated--disable-loginpath unless a service account is explicitly requested, and migration000554_legacy_none_login_to_passwordconverts existing non-system, non-service-accountlogin_type=noneusers tologin_type=passwordwhile preserving email addresses and existing API tokens.Migration: Existing affected users are converted automatically on upgrade. Update any automation that creates
login_type=noneusers to create service accounts instead, and set a password only if a converted account needs interactive login. -
Coder Tasks disabled and deprecated (#28008)
Coder Tasks is disabled and deprecated. If
--hide-ai-tasksremains in the Coder server command-line arguments, orclient.hideAITasksremains in YAML configuration files, the Coder server will fail to start with an unknown-option error.Migration: Before upgrading, remove
--hide-ai-tasksfrom the Coder server command-line arguments and removeclient.hideAITasksfrom YAML configuration files. -
Coder Agents model configurations and overrides are organization-scoped (#27955, #27959, #28440, #28442, #28704)
Coder Agents model configurations and overrides are now organization-scoped. Existing model configurations are assigned to the default organization and are not copied to other organizations. Existing deployment-level and personal model overrides are not migrated. API integrations must use the organization-scoped model endpoints; the separate model-availability endpoint has been removed and its availability data is now included in the models response.
Migration: Configure a usable default model for each organization that uses Coder Agents, and reselect any deployment-level and personal model overrides. Update API integrations to use the organization-scoped model endpoints and read availability data from the models response.
-
MCP server configuration is organization-scoped (#27942)
MCP server configuration is now organization-scoped. Existing configurations retain their credentials and move to the default organization; other organizations must configure their own MCP servers.
Migration: Configure MCP servers for each organization that needs them, and migrate API consumers from the deployment-scoped experimental routes to the organization-scoped routes.
-
Native chat spend limits removed in favor of AI Gateway budgets (#27329)
Native chat spend limits are removed in favor of AI Gateway budgets. Limits are not migrated, and deployments without AI Gateway entitlement lose chat-spend enforcement.
Migration: Move chat-spend enforcement to AI Gateway budgets. Deployments without AI Gateway entitlement will no longer enforce chat spend.
SECURITY
- Invalidate provisioner daemon sessions on key deletion (#26532, 866e676) (@jscottmiller)
Features
Coder Agents
Coder Agents is now generally available: production-ready, commercially supported self-hosted infrastructure for AI coding workflows, from interactive development to headless background work. This release introduces deeper organization-level administration, agent time licensing and usage controls, a stable Chats API, and substantial improvements to chat performance, reliability, and usability.
Chat lifecycle hooks
New backend dispatch, chatd wiring, and dashboard surfacing for chat lifecycle hooks, including suffix messages, idle-failure and content-update support, change visibility, and an insecure-HTTP escape hatch for hook URLs.
- Lifecycle hook dispatch backend and chatd wiring (#27401, #27429)
- Suffix messages, idle failure, and content-update support (#27428)
- Surface hook outcomes in the chats UI and show what a hook changed (#27430, #27655)
--chat-hook-allow-insecureto allow plain HTTP hook URLs (#27896)
MCP: migration to the official Go SDK
Migrated every MCP surface (coderd server, exp mcp stdio server, external client, workspace agent client, and the aibridge injected-MCP proxy) to the official MCP Go SDK. (#28056, #28057, #28058, #28059, #28060)
MCP server configs, tools, and sharing
- Org-scoped MCP server configs with group/user ACLs, an org picker on settings pages, and audit logging (#27943, #27944, #28150)
- Allow sharing MCP servers with users and groups (#28593)
- Add Coder Agents chat tools to the MCP toolsdk; defer tool schemas behind a
find_toolssearch (#28025, #28225) - Extend agent chat MCP tools for remote UAT evidence loops (#28233)
- Remove task management MCP tools (#28354)
Subagents & providers
- Surface subagents in the chat sidebar and render
list_subagent_modelstool results (#28234, #28116) - Limit concurrent chat agents with pooled admission (#27902)
- Per-model OpenAI Responses API toggle (#27683)
- Apply reasoning effort and surface thinking blocks for Google chat models (#28273)
Chat search
Full-text chat search wired into the search box, with cache invalidation and chats-by-workspace cache reconciliation. (#27973, #27892, #27901)
agent-browser
Built-in Browser tab for agent-browser, plus the dogfood live-preview app. (#27910, #27838)
Agents workspace UI
- Consolidate the git panel tab strip into a view-switcher dropdown; move the PR icon to the diff line, center the unread dot, and persist the kebab (#27012, #28326)
- Redesign the advisor tool row; add a provider icon to the chat model selector (#28069, #28330)
- Label
process_outputrows with the process command; migrate agent chat scrolling; dim unselected sidebar chat titles (#28300, #28130, #28382) - Add download and export for personal skills (#28032)
Per-template Coder Agents access control
Per-template access control with dashboard controls and a --agents-allowed CLI flag. (#27285, #27514, #27517)
Auditing
AI Governance
Cost Control & budgets
Cost tracking now flows through AI Gateway rather than native chat tracking, with a group AI spend endpoint, estimated-spend labeling, and admin budget notifications.
- Back the per-chat cost endpoint with AI Gateway data; remove native chat cost tracking (#27328, #27330)
- Group AI spend endpoint; label AI spend as estimated (#27568, #27584)
- CTAs on AI budget admin notifications (#28138)
- Announce the cost controls move to AI Governance (#27543)
AI model price book
- Automate a weekly AI model price-book refresh; experimental CLI to price unpriced models (#28146, #27926)
- Distinguish default vs. custom prices, support custom prices, and add a source filter; show best-effort pricing on the model form (#28204, #28328, #28329, #28290)
Agent runtime hours (billing & licensing)
Metering and billing for Coder Agent runtime, surfaced through license entitlements and a per-license Products section.
- Hourly
hb_agent_runtime_v1usage events and runtime-hour license claims/entitlement (#27312, #27459) - Report runtime-hour usage in entitlements; tolerate unusable claims and decode
-1as unlimited (#27985, #27984) - Per-license Products section with Coder Agents price gates; show total agent hours on the licenses page (#28051, #27953)
- Harden runtime instrumentation for billing; bill completed and interrupted tool batches and record live tool-execution stamps (#27451, #28360, #28361, #28362)
AI Gateway sessions
- Network-calls summary/list on the AI session threads API and detail card (#27417, #27425, #27418, #27426)
- Default the sessions list to a 24h range; shared
DateTimeRangeFilter/ quick-pick date-time range picker used on the AI sessions page (#28256, #28255, #28392, #28426) - Track Junie as an AI Gateway client (#28266)
- YAML config option for the standalone AI Gateway (#28258)
RBAC & Organizations
- Organization-scoped chat models: RBAC resource, org-scoped model usage, telemetry org IDs, and audit logging (#27957, #27960, #27956, #28439)
- Enable Coder Agents for organization members (#28186)
- Server-side search and pagination for the groups page, plus a paginated groups API endpoint (#27994, #27603)
- Search users by display name; username/email user search filters (#27398, #27922)
- Promote the
MinimumImplicitMemberexperiment to GA (#27472) - Unhide the
--oidc-redirect-urlserver option (#28072)
OAuth2 & Identity
- Admin-controlled dynamic client registration exposed in deployment settings (#27480)
- Public OAuth2 clients: schema-layer public client tokens, register public clients without a secret, and scope columns / single-use delete queries (#27712, #28046, #28007)
- Modernize the OAuth2 applications settings UI; constrain the client-type column; derive client type from
token_endpoint_auth_method(#27562, #27931, #28043) - Compare scopes by permission coverage (#28167)
Workspaces & Templates
- Template creation builder: redirect to the builder after first-time setup, make sidebar steps navigable / scroll to module on click, and tighten the base-infra step grid and typography (#27670, #28153, #27351, #27797)
- Confirm before batch-stopping workspaces (#27631)
- Include agent metadata in workspace list responses (#27934)
- Hide workspace resources when lacking workspace-create permission (#27278)
Secrets
coder secret importfor bulk secret files, with bulk import upload in the Add secret dialog (#27534, #26725)- Enable/disable support for user secrets (#27537)
Dashboard & Platform
- Premium paywalls and badging: appearance settings and external-auth settings paywalls, premium badging, updated paywall component/copy linked to feature docs, CTA/form handling, and conversion telemetry (#27948, #28435, #27847, #28070, #28339, #28226, #28425)
- Add "Install Coder Desktop" to the user dropdown; replace the proxy emoji with a latency radio icon (#28244, #28128)
Infrastructure & Observability
- Log tailnet tunnels to the connection log; correlate request logs and spans by
client_session_id(#27423, #27671) - Add a workspace agent session-count protocol (#28125)
- Helm: make the HTTPS redirect status code configurable (#27360)
- Log rate-limited external-auth token validation; add a redirect-URL override for external auth (#26754, #28082)
Bug fixes
Security & authentication
- Reject workspace proxy hostname prefixes (#27544, 8cc7f2b) (@geokat)
- Prevent protocol-relative login redirects (#27363, 84f4a8b) (@ThomasK33)
- Prevent IP leaks via external chat images (#27362, 496ed75) (@ThomasK33)
- Server: Block SSRF in MCP OAuth2 discovery and client registration (#27989, 37b3f11) (@ThomasK33)
- Server: Enforce Force On MCP server policy on the backend (#27990, 91d3027) (@ThomasK33)
- Gate MCP user tokens on owner-scoped personal RBAC (#27945, a3eb1ee) (@ibetitsmike)
- Harden org-scoped MCP config chat gating, updates, and visibility (#28065, f7a0de7) (@ibetitsmike)
- Dashboard: Defer external app API key generation to on-click (#27907, bab9963) (@jakehwll)
- Reject PKCE code_verifier below RFC 7636 length floor (#28003, 209d1ca) (@BobbyHo)
- Server: Set Cache-Control: no-store on OAuth2 responses (#28143, 1aa3553) (@BobbyHo)
- Server: Accept RFC 9728 resource metadata with array-valued resource (#28592, 7986365) (@f0ssel)
- Bound request body size on JSON API endpoints (#28168, 166d92b) (@BobbyHo)
- Add distributed protection for external auth refresh (#27479, 7ba2e6e) (@code-asher)
- Gate group settings page and fix unauthorized group patch (#28314, ab66010) (@ssncferreira)
- Prevent markdown injection in notifications (#28340, f24d671) (@BobbyHo)
- Server: HTML-escape the email template values (#28397, 29cae5f) (@BobbyHo)
- Server: Reject agent requests from suspended owners (#28513, dbd479b) (@hwang251)
AI Gateway & providers
- fix(aibridge): handle sonnet 5 adaptive thinking in bedrock (#27339, b371262) (@johnstcn)
- Require bedrock model fields for the invoke-model protocol (#27846, 1142706) (@evgeniy-scherbina)
- Server: Classify bedrock credential errors as non-retryable (#27913, 4e2620d) (@johnstcn)
- Server: Extract plain-text provider error bodies (#27597, 5d2a69d) (@johnstcn)
- Serialize empty MCP tool properties as {} not null for OpenAI (#28380, 5480299) (@DanielleMaywood)
- Enable Copilot HTTP transport fallback (#28494, b7d7be9) (@ssncferreira)
- Dashboard: Allow single-label AI provider endpoints (#28122, 444fb8a) (@johnstcn)
- Surface duplicate AI provider hostname as warning, not error (#28208, 9b609dc) (@johnstcn)
- Server: Also retry on 503 (#28218, aa80fa3) (@johnstcn)
- Detect out-of-range AI Gateway costs instead of wrapping silently (#27602, dae41eb) (@evgeniy-scherbina)
- Price AI usage by configured provider type (#27836, db88ec3) (@ssncferreira)
Token accounting & runtime billing
- fix(aibridge): use latest streaming chat usage instead of cross-chunk sum (#27967, ad10045) (@ibetitsmike)
- Report per-request Anthropic usage in chat token accounting (#27966, 88e1135) (@ibetitsmike)
- Keep chat token usage for streams ending with usage-less chunks (#28068, b3607f5) (@ibetitsmike)
- fix(aibridge): record token usage without an MCP proxier (#27886, 7a545b3) (@blockgroot)
- Enforce uniqueness and hour alignment for agent runtime usage events (#27983, 20c376a) (@jaaydenh)
- Add cache write accounting to OpenAI interceptors and service tier to TokenUsage metadata for all interceptors (#28714, 89df1c2)
Coder Agents & chat
- Dashboard: Order chat transcript by message id (#27620, fb30674) (@ibetitsmike)
- Dashboard: Show error state with retry when chat fetch fails (#27887, 5ed73f0) (@DanielleMaywood)
- Dashboard: Treat chat deleted watch events as archive instead of eviction (#27921, 192842c) (@DanielleMaywood)
- Dashboard: Stop attachment downloads from trapping iOS PWAs (#27853, ac11ae5) (@ibetitsmike)
- Keep chat attachments while a linking chat exists (57f38b5) (@ibetitsmike)
- Allow manual chat compaction from the error state (#28022, 1458d27) (@ibetitsmike)
- Server: Remove per-chat system prompt limit (#28294, c2bb624) (@hugodutka)
- Repair stale chat agent bindings after workspace rebuild (#28152, 521c383) (@ibetitsmike)
- Server: Make edit_files schema and errors actionable for models (#28121, 48e1e28) (@ibetitsmike)
- Dashboard: Prefer permitted organization for chat creation (#28078, bca5d72) (@ibetitsmike)
- Dashboard: Persist empty MCP selection (#28238, 30dc7eb) (@ethanndickson)
- Dashboard: Treat interrupting chats as busy in the composer (#28209, 14e3ae3) (@DanielleMaywood)
- Dashboard: Stop gating chat stream parts on client status (#28207, 9590e95) (@DanielleMaywood)
- Dashboard: Disallow queued message edits (#28265, ba5717d) (@ibetitsmike)
- Dashboard: Clear streamed message when a chat errors (#28277, eed420a) (@DanielleMaywood)
- Avoid 500 when generating chat title from rename dialog and remove unused endpoint (#28306, 67db41c) (@f0ssel)
- Stem chat search terms with the english text search config (#28319, 31e8160) (@f0ssel)
- Server: Keep NUL out of jsonb chat content (#28625, a73c8af) (@mafredri)
- Dashboard: Auto-select MCP server after successful OAuth (#28155, 05fcd06) (@ibetitsmike)
- Dashboard: Disable archive actions for active chats (#28264, 610f321) (@ibetitsmike)
- Dashboard: Improve chat slash menu enter handling, anchoring, and placement (#28411, 6f1d225) (@ibetitsmike)
- Dashboard: Show chat instead of the right panel on small viewports (#28387, bb7f2f2) (@bpmct)
- Dashboard: Centralize UUID generation and fix non-secure crash (#28285, 1bb0978) (@phorcys420)
- Make chat model sharing work for sharers without directory access (#28703, e1f017e)
AI Governance (budgets & pricing)
- Report combined member limit in group AI spend (#27589, 0b40950) (@ssncferreira)
- Ai cost control cap configurable AI spend limit (#27640, e71249a) (@ssncferreira)
- Dashboard: Refresh group member budgets after overrides (#27553, e3a5a69) (@EhabY)
- Hide AI budget override controls without permission (#27654, b4eda32) (@ssncferreira)
- Show no budget instead of unlimited for empty group AI budget (#27993, 97cb722) (@tracyjohnsonux)
- Dashboard: Fix price threshold display and debounce model price lookup (#28298, 29c129e) (@DanielleMaywood)
- Dashboard: Distinguish cross-org budgets (#28596, d99f257) (@ssncferreira)
Organizations, RBAC & models
- SDK: Read trial claim instead of misspelled trail (#28014, 5bdabc9) (@jaaydenh)
- Server: Prevent stale chat model config writes (#27968, cd1362a) (@ethanndickson)
- Move organization model overrides from Models to Coder Agents settings (#28473, d935313) (@ethanndickson)
- Dashboard: Harden organization-scoped model loading (#28495, f5f4032) (@ethanndickson)
- Dashboard: Show Manage agents link to organization model admins (#28637, 71cf4d0) (@ethanndickson)
- Dashboard: Let organization admins manage agent templates (#28636, ff22804) (@ethanndickson)
- Dashboard: Remove member-facing Models nav item (#28772, 152c5b1) (@ethanndickson)
- Dashboard: Include owner context in Agents org picker permission check (#28076, d509e1e) (@ibetitsmike)
- Database: Match group name case-insensitively in search (#27894, d458fe4) (@david-fraley)
Workspaces & templates
- Agent: Detect IPv6-bound listening ports (#27765, 8a4adee) (@bpmct)
- Agent: Create missing log_path parent directory (#28166, af90d8e) (@35C4n0r)
- Only create workspace agents for start builds (#28276, 676b9bb) (@aslilac)
- Hide the favorite button for workspaces you don't own (#28000, ddb2799) (@aslilac)
- Dashboard: Allow only template admins/owners to navigate to template version pages by clicking VersionRow (#27550, ca3de3c) (@aqandrew)
- Dashboard: Name template versions in promote/archive dialogs and toasts (#27633, 6c8a864) (@jakehwll)
- Dashboard: Correct autostop restart prompt on the workspace schedule page (#27632, a76c51d) (@jakehwll)
- Dashboard: Show tooltip in AppLink + WorkspacesTable when coder_app URL is invalid (#27556, 3e2a8bd) (@aqandrew)
Secrets
- Support adding multiline secrets via the UI (#27253, f44e8c1) (@rowansmithau)
- Dashboard: Prevent Add secret dialog overflow (#27649, e30a7bc) (@dylanhuff-at-coder)
Deployment (Helm)
- Helm: Render service nodePort with an explicit if guard (#27682, e819dd4) (@pawbana)
- Remove nodePort from required service fields of ai-gateway chart (#27696, 6df2463) (@pawbana)
Documentation
- Present AI Governance as included with Premium (#27545) → AI Governance
- Add standalone AI Gateway docs (#27592) → AI Gateway · Setup
- Document AI Gateway cost controls (#27643) → AI Gateway
- Update 2.35 latest release to v2.35.3 (#27511) → Releases
- Note user secret target uniqueness and delivery boundary (#27532) → User secrets
- Bump AI Gateway client modules to latest and remove Coder Tasks refs (#27810) → AI Gateway · Client Configuration
- Correct 2.35 stable version to v2.35.3 (#27842) → Releases
- Document per-template agents_allowed (#27518) → Coder Agents
- Refresh JFrog Artifactory integration guide for SaaS (#28005) → JFrog Artifactory
- Remove beta references from Coder Agents docs and manifest (#27939) → Coder Agents
- Document prebuilds quota group behavior (#28015) → Prebuilt workspaces
- Remove AI Governance Add-On references (#28073) → AI Governance
- Use approximate spend and add Everyone group tip for AI Gateway cost controls (#28012) → AI Gateway
- Add Coder Desktop stale-tunnel recovery and improve macOS log capture (#26735) → Coder Desktop
- Remove invalid
--yesflag fromcoder template version promote(#28084) → CLI reference - Correct broken CLI commands and flags from drift sweep (#28098) → CLI reference
- Add Licensing & Usage page and reorder agents manifest (#28263) → Coder Agents
- Remove inaccurate Agent Firewall filesystem protection claim (#28286) → AI Governance (Agent Firewall)
- Note JetBrains client attribution in AI Gateway (#28296) → AI Gateway · Client Configuration
- Fix prebuilt-workspaces example syntax and defaults (#28088) → Prebuilt workspaces
- Fix broken callout on the AI Gateway Monitoring page (#28303) → AI Gateway · Reference
- Complete swagger annotations for organization-scoped MCP routes (#28064) → API reference
- Clarify who can set AI model prices and how they are keyed (#28401) → AI Gateway
- Streamline agent instructions (#28243) → Coder Agents · Getting Started
- Address AI Gateway documentation review feedback (#28309) → AI Gateway
- Documentation: Document the chat search: full-text filter (#28474) → Coder Agents
- Remove early access label from chats API reference (#28761) → API reference
- Lead with env vars in admin docs and add configuration reference (#26824) → Admin · Setup
- Replace enterprise-base image references with example-base (#27025) → Admin · Templates
- Note bulk stop confirmation (#27908) → Workspace management
- Refresh workspace-management screenshots with current UI (#28356) → Workspace management
- Add a glossary to the reference section (#27165) → Reference · Glossary
- Fix Helm TLS/ingress value keys in admin/setup (#28087) → Install · Kubernetes
- Correct nginx X-Forwarded-Proto and certbot instructions flavor (#28086) → Admin · Setup
- Fix prometheus metric name and slack webhook backtick (#28085) → Admin · Monitoring
- Rebrand Windsurf doc page to Devin Desktop (#28205) → IDEs · Access Workspaces
- Remove JetBrains Fleet references (#28301) → IDEs · Access Workspaces
- Update Tallyman Agent Time reporting (#28275) → Coder Agents
Internal docs maintenance (no single user-facing page): Fix self-violating examples (#27849), style-guide rule against "whose" (#27866), STE-derived prose rules (#27852), P2/P3 typo/syntax drift-sweep fixes (#28101), self-violation audit fixes (#27855), uppercase callout markers [DOCS-681] (#28304), remove space in callout markers [DOCS-680] (#28305), fix broken .style/ link (#28180), markdown_url front matter for About page (#28281), CLI/API doc generators emit front-matter metadata (#27246).
Performance improvements
- Server: Collapse org authorization to a set-membership test (#27244, 7e708b2) (@jeremyruppel)
- Server: Build span role attributes only when recording (#27310, d9d6ce9)
- Server: Batch authcheck permissions via rbac.Filter (#27309, 51a9aa1)
- Server: Build the workspace build fan-out maps once per batch (#28074, 62f4afb) (@jscottmiller)
- Server: Use conditional requests for GitHub JSON reads (#27628, 2acfe7e) (@joshfree)
Other changes
- Change all windsurf.com links to devin.ai links (#28270, 27e3d0f) (@nickvigilante)
Compare: e96e7cfec23ca55d6700b684474b82df97cfd22b...v2.37.0
Container image
docker pull ghcr.io/coder/coder:2.37.0
Install/upgrade
Refer to our docs to install or upgrade Coder, or use a release asset below.