Skip to content

feat(raycast): add Raycast extension for Cap screen recording (#28) - #3910

Closed
jeffrey-graham wants to merge 15 commits into
CapSoftware:mainfrom
jeffrey-graham:patch-2
Closed

jeffrey-graham wants to merge 15 commits into
CapSoftware:mainfrom
jeffrey-graham:patch-2

Conversation

@jeffrey-graham

@jeffrey-graham jeffrey-graham commented Nov 6, 2026 •

Copy link
Copy Markdown

Fixes #28

/claim #28

Summary

  • Adds Raycast extension manifest (extensions/raycast/package.json) supporting start-recording, stop-recording, and open-dashboard commands via cap:// deep-links.

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; all previous findings are addressed and no new actionable issues were established.

Summary

Adds Raycast commands to start and stop Cap recordings and open the dashboard.

  • Raycast starts Cap recordings with the capture settings you choose.
  • Raycast stops the active Cap recording with one command.
  • Raycast opens the Cap dashboard at the address you choose.

All five previous findings are addressed. No new actionable issues were established.

Reviews (4) · Last reviewed commit: "fix(raycast): validate non-empty targetN..." · Reviewed by Greptile

Added a new Raycast extension for Cap Screen Recorder with commands to start and stop recordings and open the dashboard.
@vercel

vercel Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

@jeffrey-graham is attempting to deploy a commit to the Cap Software Inc Team on Vercel.

A member of the Team first needs to authorize it.

Comment thread extensions/raycast/package.json Outdated
Comment on lines +10 to +15
"commands": [
{
"name": "start-recording",
"title": "Start Recording",
"description": "Start a new Cap screen recording with your default capture settings",
"mode": "no-view"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Commands cannot run

extensions/raycast/ contains only package.json, with no matching command files under src/. Setting mode to no-view does not implement a command, so none of the three advertised actions can run. Add command files that open the Cap recording links or dashboard URL and read the declared preferences.

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast/package.json
Line: 10-15

Comment:
**Commands cannot run**

`extensions/raycast/` contains only `package.json`, with no matching command files under `src/`. Setting `mode` to `no-view` does not implement a command, so none of the three advertised actions can run. Add command files that open the Cap recording links or dashboard URL and read the declared preferences.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment thread extensions/raycast/package.json Outdated
"name": "cap-screen-recorder",
"title": "Cap Screen Recorder",
"description": "Start and stop Cap.so recordings and open your Cap dashboard directly from Raycast.",
"icon": "cap-icon.png",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Required icon is missing

The declared cap-icon.png is absent. The extension directory contains only package.json, so Raycast cannot resolve the icon when checking or packaging the extension. Include the image at extensions/raycast/assets/cap-icon.png.

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast/package.json
Line: 6

Comment:
**Required icon is missing**

The declared `cap-icon.png` is absent. The extension directory contains only `package.json`, so Raycast cannot resolve the icon when checking or packaging the extension. Include the image at `extensions/raycast/assets/cap-icon.png`.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment thread extensions/raycast/package.json Outdated
Comment on lines +2 to +3
"$schema": "https://www.raycast.com/schemas/extension.json",
"name": "cap-screen-recorder",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P2 JSON uses spaces

The new file uses spaces throughout, but AGENTS.md requires tab indentation for JSON and forbids per-file overrides. Format this file with tabs before merging to meet the repository requirement.

Context Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast/package.json
Line: 2-3

Comment:
**JSON uses spaces**

The new file uses spaces throughout, but `AGENTS.md` requires tab indentation for JSON and forbids per-file overrides. Format this file with tabs before merging to meet the repository requirement.

**Context Used:** AGENTS.md ([source](https://github.com/capsoftware/cap/blob/main/AGENTS.md))

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@jeffrey-graham

Copy link
Copy Markdown
Author

@greptileai All three review points are now resolved on patch-2:

  1. Added the Raycast command implementations under extensions/raycast/src/ (start-recording.ts, stop-recording.ts, open-dashboard.ts).
  2. Added the 512x512 PNG icon at extensions/raycast/assets/cap-icon.png and updated icon in extensions/raycast/package.json.
  3. Formatted extensions/raycast/package.json with tab indentation per AGENTS.md.

export default async function Command() {
const { captureMode = "fullscreen" } = getPreferenceValues<Preferences>();
await closeMainWindow();
await open(`cap://start-recording?mode=${encodeURIComponent(captureMode)}`);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Recording commands do nothing

Both recording commands send URLs that Cap rejects. DeepLinkAction::try_from requires the host action and a value query parameter containing JSON. This command uses start-recording as the host, and stop-recording.ts uses stop-recording. Neither reaches a recording action, so users cannot start a recording or stop an active one.

Use the registered cap-desktop://action?value=... format for both commands. Starting also needs a valid StartRecording payload with a concrete capture target; passing fullscreen, window, or area as mode does not meet that contract.

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast/src/start-recording.ts
Line: 10

Comment:
**Recording commands do nothing**

Both recording commands send URLs that Cap rejects. `DeepLinkAction::try_from` requires the host `action` and a `value` query parameter containing JSON. This command uses `start-recording` as the host, and `stop-recording.ts` uses `stop-recording`. Neither reaches a recording action, so users cannot start a recording or stop an active one.

Use the registered `cap-desktop://action?value=...` format for both commands. Starting also needs a valid `StartRecording` payload with a concrete capture target; passing `fullscreen`, `window`, or `area` as `mode` does not meet that contract.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@jeffrey-graham

Copy link
Copy Markdown
Author

@greptileai Updated start-recording.ts, stop-recording.ts, and package.json to use the exact cap-desktop://action?value=<url-encoded JSON> deep-link contract ({"start_recording":{"capture_mode":{"screen":...},"camera":null,"mic_label":null,"capture_system_audio":true,"mode":"studio"}} and "stop_recording") matching DeepLinkAction::try_from.

captureSystemAudio = true,
} = getPreferenceValues<Preferences>();

const resolvedTarget = targetName.trim() || "Built-in Retina Display";

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Default screen may not exist

If the Mac has no display named Built-in Retina Display, the default settings send a target that Cap cannot find. Cap requires an exact name match, so it starts nothing, while Raycast still says recording started. This affects setups such as a Mac mini with an external monitor.

Require users to choose a valid target before running, or resolve an available display instead of using this fixed fallback.

Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/raycast/src/start-recording.ts
Line: 18

Comment:
**Default screen may not exist**

If the Mac has no display named `Built-in Retina Display`, the default settings send a target that Cap cannot find. Cap requires an exact name match, so it starts nothing, while Raycast still says recording started. This affects setups such as a Mac mini with an external monitor.

Require users to choose a valid target before running, or resolve an available display instead of using this fixed fallback.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

@jeffrey-graham

Copy link
Copy Markdown
Author

@greptileai Removed the hardcoded Built-in Retina Display fallback: targetName is now a required preference in extensions/raycast/package.json, and start-recording.ts validates that targetName.trim() is non-empty (prompting the user via showToast + openExtensionPreferences() if blank) before sending the deep link.

@jeffrey-graham

Copy link
Copy Markdown
Author

Closing this incomplete manifest stub to avoid review noise alongside #3683.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cap.so Raycast extension

1 participant