feat: add devin-desktop module - #1050
Conversation
…8214) ## Summary `coder/registry#1050` adds a new `devin-desktop` module that opens Devin Desktop via a `devin://` deep link (Devin Desktop is Cognition's June 2, 2026 rebrand of Windsurf). Coder's frontend gates which external app URI schemes it will open with a session token, `ALLOWED_EXTERNAL_APP_PROTOCOLS` in `site/src/modules/apps/apps.ts`. `devin:` isn't in that list yet, so without this change the "Open" button on that app would return the raw URL with the `$SESSION_TOKEN` placeholder unsubstituted, an unusable link. ## Change Add `"devin:"` to `ALLOWED_EXTERNAL_APP_PROTOCOLS`, next to the existing `"windsurf:"` entry. ## Validation - `pnpm exec biome check --error-on-warnings src/modules/apps/apps.ts`: clean. - `pnpm exec vitest run src/modules/apps/apps.test.ts`: 21/21 pass. - `make pre-commit`: passes. ## Sequencing `coder/registry#1050` should not be merged until this lands in a released Coder version, otherwise the `devin-desktop` module's deep link would be broken on deployments running an older Coder version. Tracked together in REG-77 / DEVEX-777. > 🤖 This PR was created with the help of Coder Agents, and needs a human review. 🧑💻
Module Scorecard Check
|
| Presentation & Onboarding | IDE Integration | Credential Hygiene | Restricted-Environment Readiness | Engineering Quality | Overall |
|---|---|---|---|---|---|
| 13 / 25 | 18 / 25 | 20 / 20 | N/A | 8 / 10 | 74 / 100 |
Drilldown
Presentation & Onboarding — 13 / 25
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Configuration-mode examples | 12 | 12 | README provides examples for default usage, opening in a specific directory, and configuring MCP servers. Each example is complete and demonstrates sensible defaults. |
| Coder-context framing | 8 | 1 | README states "Add a button to open any workspace with a single click in Devin Desktop" and mentions the Coder Remote VS Code Extension, but does not explain what the module adds on top of Coder or show where Coder fits in the flow. Minimal context provided. |
| Visual preview | 5 | 0 | No image, GIF, or video in the README. Only an icon reference in frontmatter. |
IDE Integration — 18 / 25
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Dashboard entry point | 7 | 7 | Module uses coder_app via the vscode-desktop-core submodule with proper launch behavior using the devin:// protocol. Slug and display_name are configurable. |
| Managed configuration | 6 | 6 | Documented support for managed MCP configuration via the mcp input variable. README example shows how to configure MCP servers with JSON-encoded string written to ~/.config/devin/mcp_config.json. |
| Configurable folder or workdir | 6 | 5 | The folder variable is documented with an example showing opening in a specific directory. However, the description is minimal ("The folder to open in Devin Desktop") without explaining behavior when empty or invalid paths. Half point deducted for under-documentation. |
| Pre-installed extensions | 6 | 0 | N/A - Devin Desktop is a desktop IDE, not a web IDE. This criterion does not apply. Scoring 0 as per rubric (not excluded from denominator for IDE track). |
Credential Hygiene — 20 / 20
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Secrets marked sensitive | 16 | 16 | The module has no sensitive inputs of its own. The MCP example uses data.coder_external_auth.github.access_token which is handled by Coder's external auth mechanism, not as a raw secret input. No inline secrets in examples. |
| Non-hardcoded auth path | 4 | 4 | README example demonstrates OAuth via coder_external_auth resource for GitHub authentication in the MCP configuration, avoiding raw API keys. |
Restricted-Environment Readiness — N/A
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Mirrorable artifact source | 10 | N/A | Module downloads nothing; it only configures a coder_app and optionally writes a config file. No artifacts to mirror. |
| Bring-your-own binary | 5 | N/A | Module does not install any binaries; Devin Desktop is assumed to be installed on the client machine. |
| Egress transparency | 3 | N/A | Module makes no network calls itself; it only configures the IDE launch URL and writes local config. |
| Runs without sudo | 2 | N/A | The coder_script writes to $HOME/.config/devin/mcp_config.json without sudo. Script uses set -eu, mkdir -p, base64 -d, and chmod 600 - all standard unprivileged operations. Full credit would apply, but marking N/A as this is the only script and restricted-environment theme is already N/A. |
Engineering Quality — 8 / 10
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Input quality | 6 | 4 | Variables have descriptions and sensible defaults. However, mcp lacks validation (should validate JSON structure), and folder has no validation for path format. agent_id is required but has no description beyond "The ID of a Coder agent." Partial credit for incomplete validation and minimal descriptions. |
| Test coverage | 4 | 4 | Comprehensive TypeScript tests in main.test.ts cover default output, folder configuration, open_recent behavior, slug/display_name overrides, and MCP file writing with container-based verification. Tests verify both business logic and end-to-end behavior. |
Overall — 74 / 100
Raw 59 / 80 → round(59 / 80 × 100) = 74
coder/windsurf: 78 → 73
| Theme | Before | After |
|---|---|---|
| Presentation & Onboarding | 17 / 25 | 13 / 25 |
| Integration | 17 / 25 | 17 / 25 |
| Credential Hygiene | 20 / 20 | 20 / 20 |
| Restricted-Environment | N/A | N/A |
| Engineering Quality | 8 / 10 | 8 / 10 |
| Overall | 78 / 100 | 73 / 100 |
Full scorecard for this PR
| Presentation & Onboarding | IDE Integration | Credential Hygiene | Restricted-Environment Readiness | Engineering Quality | Overall |
|---|---|---|---|---|---|
| 13 / 25 | 17 / 25 | 20 / 20 | N/A | 8 / 10 | 73 / 100 |
Drilldown
Presentation & Onboarding — 13 / 25
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Configuration-mode examples | 12 | 12 | README provides examples for default usage, opening in a specific directory, and configuring MCP servers. Each example is clear with sensible defaults. |
| Coder-context framing | 8 | 1 | README mentions "Add a button to open any workspace with a single click in Windsurf Editor" and references the Coder Remote VS Code Extension, but does not explain what the module adds on top of Coder or show where Coder fits in the flow. Minimal framing. |
| Visual preview | 5 | 0 | No image, GIF, or video in the README. Only an icon reference. |
IDE Integration — 17 / 25
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Dashboard entry point | 7 | 7 | Module uses coder_app via the vscode-desktop-core submodule with proper launch behavior (windsurf:// protocol URL). |
| Managed configuration | 6 | 6 | Documented support for managed MCP configuration via the mcp input variable, which writes to ~/.codeium/windsurf/mcp_config.json. Example shows GitHub MCP server configuration. |
| Configurable folder or workdir | 6 | 4 | The folder variable is documented and tested, but the README example and description are minimal. The variable description is only "The folder to open in Windsurf Editor." without explaining behavior when unset or how it integrates with the workspace. Partial documentation. |
| Pre-installed extensions | 6 | 0 | N/A - Windsurf is a desktop IDE, not a web IDE. This criterion does not apply. |
Credential Hygiene — 20 / 20
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Secrets marked sensitive | 16 | 16 | The mcp variable is not marked sensitive, but it contains configuration, not secrets. The README example shows proper use of data.coder_external_auth.github.access_token within the JSON structure, avoiding inline secrets. No sensitive inputs exist in this module. |
| Non-hardcoded auth path | 4 | 4 | README example demonstrates OAuth via coder_external_auth resource for GitHub authentication in the MCP configuration, avoiding raw API keys. |
Restricted-Environment Readiness — N/A
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Mirrorable artifact source | 10 | N/A | Module downloads nothing; it only configures a coder_app and optionally writes a config file. No artifacts to mirror. |
| Bring-your-own binary | 5 | N/A | Module does not install any binary; it assumes Windsurf is already installed on the client machine (desktop IDE). |
| Egress transparency | 3 | N/A | Module makes no network calls itself; it only generates URLs and writes local config. |
| Runs without sudo | 2 | N/A | The coder_script for MCP config uses only mkdir, echo, base64, and chmod without sudo. Runs as unprivileged user. Full credit from code inspection. |
Engineering Quality — 8 / 10
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Input quality | 6 | 4 | Variables have descriptions and sensible defaults. However, descriptions are terse (e.g., folder just says "The folder to open in Windsurf Editor" without explaining default behavior). No validation blocks present where they could help (e.g., validating mcp is valid JSON). |
| Test coverage | 4 | 4 | Comprehensive TypeScript tests in main.test.ts cover default output, folder configuration, open_recent behavior, and MCP file writing with container-based end-to-end validation. No .tftest.hcl file, but business logic is minimal (delegated to vscode-desktop-core). |
Overall — 73 / 100
Raw 58 / 80 → round(58 / 80 × 100) = 73
Wait, recalculating: IDE track adds 25 pts, but Pre-installed extensions is N/A (6 pts).
- Universal: 75 pts, but Restricted-Environment is N/A (20 pts) = 55 pts available
- IDE track: 25 pts, but Pre-installed extensions is N/A (6 pts) = 19 pts available
- Total denominator: 55 + 19 = 74 pts
Scores:
- Presentation: 13 / 25
- IDE Integration: 17 / 19 (7 + 6 + 4 + 0 N/A)
- Credential Hygiene: 20 / 20
- Restricted-Environment: N/A (all 20 pts excluded)
- Engineering Quality: 8 / 10
Total: 13 + 17 + 20 + 8 = 58 / 74 → round(58 / 74 × 100) = 78
Scored against SCORECARD.md with claude-sonnet-4-5. Language-model scores are advisory.
## Summary Cognition (maker of Devin) rebranded the Windsurf Editor as Devin Desktop on June 2, 2026, after acquiring it from Codeium in July 2025. Our docs still referred to the editor as Windsurf and linked to a dead `codeium.com` domain. ## Changes - Renamed `docs/user-guides/workspace-access/windsurf.md` to `devin-desktop.md`, rewritten to lead with Devin Desktop branding, note the Codeium -> Windsurf -> Devin Desktop history, and use current links (`windsurf.com`, `docs.windsurf.com`) instead of dead `codeium.com` ones. - Updated `docs/manifest.json` and `docs/user-guides/workspace-access/index.md` to reference the new page. - Updated remaining Windsurf mentions to Devin Desktop in `docs/ai-coder/ide-agents.md`, `docs/ai-coder/index.md`, `docs/reference/glossary.md`, and `docs/ai-coder/ai-gateway/clients/index.md`. - Added `windsurf.com`/`devin.ai` to `.github/.linkspector.yml` ignore patterns; both rate-limit repeated automated requests with 429s (same class of issue as the `codeium.com`/`marketplace.visualstudio.com` fix in #28203). - Switched every module reference from `windsurf` to the new `devin-desktop` registry module (`docs/about/contributing/modules.md`, the three `get-started/customize-your-template/*.md` Terraform tutorials, and the main doc page's module link), since the new module actually renders `display_name = "Devin Desktop"` / `slug = "devin-desktop"` in the UI (the old `windsurf` module hardcodes "Windsurf Editor"). <details> <summary>Scope notes / sequencing</summary> The `devin-desktop` module referenced here is being added in [coder/registry#1050](coder/registry#1050) (not yet merged/released). That PR is itself gated on [#28214](#28214) (whitelisting the `devin:` URI scheme) shipping in a released Coder version first. This docs PR can merge independently, the module link will 404 until #1050 is released, same as any docs-ahead-of-registry-release sequencing. The Terraform code samples now show `module "devin-desktop"` because that module's `display_name`/`slug` are properly parameterized (unlike `windsurf`, which hardcodes "Windsurf Editor"/`windsurf` regardless of what's passed in), so the docs stay accurate to the rendered UI. </details> ## Validation - `make lint` (docs lint, markdownlint, repo checks) passes. - Manually verified the new outbound links (`docs.windsurf.com`) return 200; `windsurf.com`/`devin.ai` are rate-limited (429) from this environment too, hence the added ignore patterns. Stacked on #28203 (targets that branch so the diff here stays scoped to the rebrand; will retarget to `main` once #28203 merges). > 🤖 This PR was created with the help of Coder Agents, and needs a human review. 🧑💻
8bc9c06 to
01abcd9
Compare
- drop windsurf tag from devin-desktop (already covered by devin/ide/ai) - drop rebrand-history/placeholder admonitions from devin-desktop README now that devin:// has been hands-on verified against a live install - bump windsurf module to 1.3.2 (patch) for the deprecation-notice README change
- protocol input is unnecessary now that devin:// is confirmed working; hardcode it directly - write MCP config to the new ~/.config/devin/mcp_config.json location instead of the inherited ~/.codeium/windsurf/ path
|
will review this later because it seems mostly AI generated so it will take more time to review thouroughly :) |
DevelopmentCats
left a comment
There was a problem hiding this comment.
I tested this myself and everything works as expected with the devin coder_app and the mcp server config.
The only thing I notice @matifali is that you need Devin to be open already for it to actually open the remote connection to the coder workspace it seems like its an issue on their end that this only works when its running on the device you are launching the devin on from the workspace.
|
This is an issue with Both Cursor and Devin now as you need to be on the Editor screen for this to work. |
The Docker pull and container exec for the alpine-based MCP config test can exceed bun's 5000ms default test timeout on CI runners, matching the same override already used by the antigravity and vscode-desktop-core module tests.
|
@matifali Yes we are aware, this is not an issue from our side, here's the Cursor thread: https://forum.cursor.com/t/installed-extensions-onuri-handler-is-not-invoked-for-custom-uri/167316/5 I do not have one for Devin but I'm guessing it's the same issue :/ |
|
Yeah. Can we track that in coder/vscode-coder |
|
Created coder/vscode-coder#1087 |
Summary
Cognition rebranded the Windsurf Editor as Devin Desktop on June 2, 2026 (Cognition acquired Windsurf from Codeium in July 2025). This adds a
devin-desktopmodule using the current name, without breaking the existingwindsurfmodule.Backward compatibility approach
The Terraform module registry protocol has no rename/alias mechanism (
registry-server's own code comments confirm this: "the registry server has no alias mechanism for the old path"). Renamingwindsurf's directory/slug would break every template pinned toregistry.coder.com/coder/windsurf/coder, so this PR is purely additive:windsurfmodule: unchanged behavior. Only its README gets a[!IMPORTANT]notice pointing todevin-desktop. It stays published and fully functional for existing templates.devin-desktopmodule, matching the same pattern already used by every other desktop-IDE module in this registry (cursor,zed,windsurf, etc.): a thin wrapper around the sharedvscode-desktop-coremodule, so none of the actualcoder_app/deep-link logic is duplicated beyond what's already duplicated across that whole module family today.I considered having
devin-desktopdelegate directly to thewindsurfmodule (even less duplication), but that requires bumpingwindsurfto a new tagged version first, module registry composition resolves against already-published versions, and tags are only cut by a maintainer after merge (seeMAINTAINER.md). That would force two sequential PRs with a manual tagging step in between for no real benefit given how small thevscode-desktop-corewiring is, so I went with the direct wrapper instead.Icon
Added a dedicated
devin.svg(.icons/devin.svg), a monochrome vector of Cognition's Devin mark, adapted from the MIT-licensed@lobehub/icons-static-svgpackage (icons/devin.svg), recolored to#fffto match this registry's existing monochrome icon convention (e.g.windsurf.svg). Nameddevin, notdevin-desktop, matching how this registry already names icons/tags after the umbrella brand rather than the specific product surface (e.g.claude-codemodule usesclaude.svg/claudetag). The module id/slug staysdevin-desktopthough, kept specific because Cognition's Devin family also includes Devin Local/Cloud/Review, a baredevinmodule name would be ambiguous between the desktop IDE launcher (this module) and a future CLI-agent-style module.This module defaults to opening Devin Desktop via a
devin://deep link (placeholder, not independently verified against a live install). Openingdevin://links requires"devin:"to be registered in Coder'sALLOWED_EXTERNAL_APP_PROTOCOLS, see coder/coder#28214. Do not tag/release this module until #28214 ships in a released Coder version, otherwise the module's "Open" button is broken (unsubstituted session token) on any deployment running an older Coder. Theprotocolinput can be overridden (e.g. back to"windsurf") in the meantime if needed.Known gap (flagging for review)
Devin Desktop is documented by Cognition as backwards-compatible with Windsurf (same
~/.codeium/windsurf/config path), but I haven't verified this hands-on against the actual app.Validation
terraform init -upgradeandterraform validatepass against the live registry.bun test registry/coder/modules/devin-desktop/main.test.ts: 10/10 pass (mirrorswindsurf's test coverage, plus cases for overridingslug/display_name/protocol).terraform fmt -check,bun run fmt: clean for this module (repo-wideterraform fmt -recursivecurrently panics for unrelated pre-existing reasons; scopedterraform fmt -check -diffon this module's directory passes).go build ./cmd/readmevalidation && ./readmevalidation: passes (81 modules including the new one, all relative URLs and icon paths valid).Related: coder/coder#28205 (docs rebrand, now links to this module), coder/coder.com#1014 (redirect), coder/coder#28206 (Devin icon), coder/coder#28214 (URI scheme allowlist, blocking).