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, which writes to ~/.config/devin/mcp_config.json. README includes a complete example with GitHub MCP server configuration. |
| Configurable folder or workdir | 6 | 5 | The folder variable is documented and demonstrated in examples. However, the description "The folder to open in Devin Desktop" is brief and could be clearer about behavior when unset or how it interacts with open_recent. |
| Pre-installed extensions | 6 | 0 | N/A - Devin Desktop 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 example uses data.coder_external_auth.github.access_token which is a secure reference, not an inline secret. No sensitive inputs are defined in the module itself that would require marking. README examples avoid inline secrets. |
| Non-hardcoded auth path | 4 | 4 | README demonstrates OAuth via coder_external_auth for GitHub authentication in the MCP example, 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 downloads nothing; it relies on Devin Desktop already being installed on the client machine. No install to skip. |
| Egress transparency | 3 | N/A | Module makes no network calls itself; it only configures the IDE launch URL and writes local config. The MCP servers configured are user-provided URLs. |
| Runs without sudo | 2 | N/A | The coder_script writes to $HOME/.config/devin/mcp_config.json and uses chmod 600, both of which work without sudo. However, since this is the only script and it verifiably never invokes sudo, this would score full if applicable. Marking N/A as the module has minimal scripting and no download/install operations that would typically require privilege consideration. |
Engineering Quality — 8 / 10
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Input quality | 6 | 4 | Variables have descriptions and sensible defaults. The mcp variable description is clear. However, folder and open_recent descriptions are brief and lack detail about interaction behavior. No validation blocks are present where they could be useful (e.g., validating mcp is valid JSON if non-empty). |
| 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 → 74
| Theme | Before | After |
|---|---|---|
| Presentation & Onboarding | 17 / 25 | 13 / 25 |
| Integration | 17 / 25 | 18 / 25 |
| Credential Hygiene | 20 / 20 | 20 / 20 |
| Restricted-Environment | N/A | N/A |
| Engineering Quality | 8 / 10 | 8 / 10 |
| Overall | 78 / 100 | 74 / 100 |
Full scorecard for this PR
| 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 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 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 (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 with external auth. |
| Configurable folder or workdir | 6 | 5 | The folder variable is documented with an example showing "/home/coder/project". However, the variable description is minimal ("The folder to open in Windsurf Editor") and could be more detailed about behavior. Half point deducted for under-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 example uses data.coder_external_auth.github.access_token which is a proper external auth pattern. No inline secrets in examples. The module itself has no sensitive inputs (it doesn't handle credentials directly). |
| Non-hardcoded auth path | 4 | 4 | README example demonstrates OAuth via coder_external_auth resource for GitHub authentication in the MCP configuration, avoiding raw keys. |
Restricted-Environment Readiness — N/A
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Mirrorable artifact source | 10 | N/A | Module downloads nothing; it only creates a coder_app with a URL 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 writes to $HOME/.codeium/windsurf/ using standard shell commands (mkdir, echo, base64, chmod) with no sudo invocations. Runs as unprivileged user. |
Engineering Quality — 8 / 10
| Criterion | Max | Score | Notes |
|---|---|---|---|
| Input quality | 6 | 4 | Variables have descriptions and sensible defaults. However, some descriptions are minimal (e.g., "folder" could explain behavior more). No validation blocks present where they could be useful (e.g., validating mcp is valid JSON). |
| Test coverage | 4 | 4 | Comprehensive TypeScript tests in main.test.ts cover default output, folder parameter, open_recent combinations, 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
(Restricted-Environment Readiness excluded as N/A; all four criteria do not apply by construction)
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.
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).