Skip to content

feat: add devin-desktop module - #1050

Merged
matifali merged 13 commits into
mainfrom
feat/devin-desktop-module
Aug 19, 2026
Merged

feat: add devin-desktop module#1050
matifali merged 13 commits into
mainfrom
feat/devin-desktop-module

Conversation

@matifali

@matifali matifali commented Aug 17, 2026

Copy link
Copy Markdown
Member

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-desktop module using the current name, without breaking the existing windsurf module.

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"). Renaming windsurf's directory/slug would break every template pinned to registry.coder.com/coder/windsurf/coder, so this PR is purely additive:

  • windsurf module: unchanged behavior. Only its README gets a [!IMPORTANT] notice pointing to devin-desktop. It stays published and fully functional for existing templates.
  • New devin-desktop module, matching the same pattern already used by every other desktop-IDE module in this registry (cursor, zed, windsurf, etc.): a thin wrapper around the shared vscode-desktop-core module, so none of the actual coder_app/deep-link logic is duplicated beyond what's already duplicated across that whole module family today.

I considered having devin-desktop delegate directly to the windsurf module (even less duplication), but that requires bumping windsurf to a new tagged version first, module registry composition resolves against already-published versions, and tags are only cut by a maintainer after merge (see MAINTAINER.md). That would force two sequential PRs with a manual tagging step in between for no real benefit given how small the vscode-desktop-core wiring 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-svg package (icons/devin.svg), recolored to #fff to match this registry's existing monochrome icon convention (e.g. windsurf.svg). Named devin, not devin-desktop, matching how this registry already names icons/tags after the umbrella brand rather than the specific product surface (e.g. claude-code module uses claude.svg/claude tag). The module id/slug stays devin-desktop though, kept specific because Cognition's Devin family also includes Devin Local/Cloud/Review, a bare devin module name would be ambiguous between the desktop IDE launcher (this module) and a future CLI-agent-style module.

⚠️ Merge sequencing

This module defaults to opening Devin Desktop via a devin:// deep link (placeholder, not independently verified against a live install). Opening devin:// links requires "devin:" to be registered in Coder's ALLOWED_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. The protocol input 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 -upgrade and terraform validate pass against the live registry.
  • bun test registry/coder/modules/devin-desktop/main.test.ts: 10/10 pass (mirrors windsurf's test coverage, plus cases for overriding slug/display_name/protocol).
  • terraform fmt -check, bun run fmt: clean for this module (repo-wide terraform fmt -recursive currently panics for unrelated pre-existing reasons; scoped terraform fmt -check -diff on 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).

🤖 This PR was created with the help of Coder Agents, and needs a human review. 🧑💻

@linear-code

linear-code Bot commented Aug 17, 2026

Copy link
Copy Markdown

REG-77

bpmct pushed a commit to coder/coder that referenced this pull request Aug 18, 2026
…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. 🧑💻
@matifali matifali changed the title feat: add devin-desktop module (Windsurf's June 2026 rebrand) feat: add devin-desktop module Aug 18, 2026
@github-actions

github-actions Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Module Scorecard Check

coder/devin-desktop: first scorecard, 74 / 100

No existing scorecard discussion found for Devin Desktop; this is the initial score. A dedicated discussion is created after merge.

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 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

⚠️ Score regression: 78 → 73 (-5). Check the drilldown for which criteria dropped.

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.

matifali added a commit to coder/coder that referenced this pull request Aug 18, 2026
## 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. 🧑💻
@matifali
matifali force-pushed the feat/devin-desktop-module branch from 8bc9c06 to 01abcd9 Compare August 18, 2026 10:17
Comment thread registry/coder/modules/devin-desktop/main.tf Outdated
Comment thread registry/coder/modules/devin-desktop/README.md Outdated
Comment thread registry/coder/modules/devin-desktop/README.md Outdated
Comment thread registry/coder/modules/windsurf/README.md
- 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
@matifali matifali added the version:patch Add to PRs requiring a patch version upgrade label Aug 18, 2026 — with Coder
@coder coder deleted a comment from github-actions Bot Aug 18, 2026
@matifali matifali removed the version:patch Add to PRs requiring a patch version upgrade label Aug 18, 2026
@matifali matifali added the version:patch Add to PRs requiring a patch version upgrade label Aug 18, 2026 — with Coder
@matifali matifali removed the version:patch Add to PRs requiring a patch version upgrade label Aug 18, 2026
@coder coder deleted a comment from github-actions Bot Aug 18, 2026
Comment thread registry/coder/modules/devin-desktop/main.tf Outdated
Comment thread registry/coder/modules/devin-desktop/main.tf Outdated
- 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

Copy link
Copy Markdown
Member

will review this later because it seems mostly AI generated so it will take more time to review thouroughly :)

@DevelopmentCats DevelopmentCats left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Member Author

This is an issue with Both Cursor and Devin now as you need to be on the Editor screen for this to work.
@EhabY are we are of this limiation?

@matifali
matifali enabled auto-merge (squash) August 19, 2026 09:36
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
matifali merged commit 82f013b into main Aug 19, 2026
5 checks passed
@matifali
matifali deleted the feat/devin-desktop-module branch August 19, 2026 09:43
@EhabY

EhabY commented Aug 19, 2026

Copy link
Copy Markdown

@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 :/

Copy link
Copy Markdown
Member Author

Yeah. Can we track that in coder/vscode-coder

@EhabY

EhabY commented Aug 19, 2026

Copy link
Copy Markdown

Created coder/vscode-coder#1087

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants