/claim #1540

Description

This PR adds deeplink support for pause/resume recording and device switching, plus a Raycast extension to control Cap via these deeplinks.

Changes

Deeplinks Support

  • Added PauseRecording deeplink action
  • Added ResumeRecording deeplink action
  • Added SwitchMicrophone deeplink action with mic_label parameter
  • Added SwitchCamera deeplink action with camera_id parameter

All new actions follow the same pattern as existing StartRecording and StopRecording actions, using the existing Tauri commands.

Raycast Extension

  • Created new Raycast extension at apps/raycast-extension/
  • Added 6 commands: Start, Stop, Pause, Resume, Switch Microphone, Switch Camera
  • Each command uses the cap-desktop:// deeplink scheme to communicate with the app

Testing

Ready for testing. The implementation wires up existing functionality, so it should work with the current recording system.

Greptile Overview

Greptile Summary

This PR adds deeplink support for pause/resume recording and device switching, plus a new Raycast extension to control Cap via these deeplinks.

Key Changes:

  • Added 4 new DeepLinkAction variants (PauseRecording, ResumeRecording, SwitchMicrophone, SwitchCamera) that call existing Tauri commands
  • Created a Raycast extension with 6 commands for controlling Cap from the Raycast launcher
  • All deeplink actions follow the same pattern as existing StartRecording/StopRecording actions

Issues Found:

  • Missing icon.png file will cause the Raycast extension to fail loading
  • start-recording.ts hardcodes "Main Display" which will fail on systems with different display names
  • Camera/microphone switching commands have placeholder “not implemented” actions in the UI
  • switch-camera.tsx may pass incorrect format for DeviceOrModelID enum (needs {"device_id": "..."} or {"model_id": {...}} instead of plain string)

The Rust deeplink implementation is solid and correctly wires up existing functionality, but the Raycast extension needs polish before it’s production-ready.

Confidence Score: 3/5

  • Deeplink backend is safe to merge but Raycast extension has blocking issues
  • The Rust deeplink implementation is well-structured and correctly uses existing commands, but the Raycast extension has 4 critical issues: missing icon file, hardcoded display name that will fail, placeholder “not implemented” actions, and potentially incorrect enum serialization for camera IDs
  • Pay close attention to apps/raycast-extension/src/start-recording.ts (hardcoded display name) and apps/raycast-extension/src/switch-camera.tsx (incorrect enum format)

Important Files Changed

Filename Overview
apps/desktop/src-tauri/src/deeplink_actions.rs Added 4 new deeplink actions (pause, resume, switch mic/camera) following existing pattern
apps/raycast-extension/package.json Raycast extension manifest with 6 commands, missing icon.png file
apps/raycast-extension/src/start-recording.ts Start recording command with hardcoded screen name
apps/raycast-extension/src/switch-camera.tsx Camera switching UI with placeholder implementation, shows not implemented toast
apps/raycast-extension/src/switch-microphone.tsx Microphone switching UI with placeholder implementation, shows not implemented toast

Sequence Diagram

sequenceDiagram
participant User
participant Raycast
participant DeeplinkHandler as Cap Desktop<br/>Deeplink Handler
participant DeeplinkAction as DeepLinkAction<br/>Executor
participant RecordingModule as Recording Module<br/>(Rust)
User->>Raycast: Trigger command<br/>(e.g., Pause Recording)
Raycast->>Raycast: Build deeplink URL<br/>cap-desktop://action?value={...}
Raycast->>DeeplinkHandler: Open deeplink URL
DeeplinkHandler->>DeeplinkHandler: Parse URL to DeepLinkAction
DeeplinkHandler->>DeeplinkAction: execute()
alt PauseRecording
DeeplinkAction->>RecordingModule: pause_recording()
else ResumeRecording
DeeplinkAction->>RecordingModule: resume_recording()
else SwitchMicrophone
DeeplinkAction->>RecordingModule: set_mic_input(mic_label)
else SwitchCamera
DeeplinkAction->>RecordingModule: set_camera_input(camera_id)
end
RecordingModule-->>DeeplinkAction: Result<(), String>
DeeplinkAction-->>DeeplinkHandler: Result
DeeplinkHandler-->>Raycast: Success/Error
Raycast-->>User: Show toast notification

(2/5) Greptile learns from your feedback when you react with thumbs up/down!

Claim

Total prize pool $200.10
Total paid $0
Status Pending
Submitted January 31, 2026
Last updated January 31, 2026

Contributors

GY

Gyanu Mayank

@gyanu2507

100%

Sponsors

CA

Cap

@CapSoftware

$200
AB

Abhishek Verma

@w3Abhishek

$0.10