Closes #1540

Greptile Overview

Greptile Summary

This PR implements Cap deep link support and a Raycast extension for controlling recordings via keyboard shortcuts. The implementation adds a new cap:// URL scheme that enables external applications to control Cap’s recording functionality.

Key changes:

  • Added four new deep link actions: StartDefaultRecording, PauseRecording, ResumeRecording, and StopRecording to deeplink_actions.rs
  • Registered the cap:// URL scheme in Tauri configuration alongside the existing cap-desktop:// scheme
  • Created a Raycast extension with four commands that trigger these deep links
  • Deep link parsing now checks for cap:// scheme first before falling back to the existing action-based parsing
  • Pause and resume actions properly emit RecordingEvent::Paused and RecordingEvent::Resumed events to update the UI

Implementation quality: The Rust implementation follows repository conventions with proper error handling and async patterns. The pause/resume handlers correctly access the current recording state and emit the appropriate events. The StartDefaultRecording action provides a sensible default (first display, Studio mode, system audio enabled) for quick recording starts.

Confidence Score: 5/5

  • This PR is safe to merge with no blocking issues
  • The implementation is clean and follows existing patterns. The deep link handlers properly reuse existing recording methods, emit correct events, and handle errors appropriately. All TypeScript code is simple and follows Raycast conventions.
  • No files require special attention

Important Files Changed

Filename Overview
apps/desktop/src-tauri/src/deeplink_actions.rs Added deep link handlers for pause/resume/start-default recording actions with proper event emission
apps/desktop/src-tauri/tauri.conf.json Registered new cap:// URL scheme alongside existing cap-desktop:// scheme for deep links
extensions/raycast/package.json Created Raycast extension manifest with four commands for recording control
extensions/raycast/src/start-recording.ts Opens cap://record deep link to trigger default recording start
extensions/raycast/src/stop-recording.ts Opens cap://stop deep link to stop active recording
extensions/raycast/src/pause-recording.ts Opens cap://pause deep link to pause active recording
extensions/raycast/src/resume-recording.ts Opens cap://resume deep link to resume paused recording

Sequence Diagram

sequenceDiagram
participant Raycast as Raycast Extension
participant OS as Operating System
participant Tauri as Tauri Deep Link Handler
participant Parser as DeepLinkAction Parser
participant App as Cap Desktop App
participant Recording as Recording Module
participant Frontend as Desktop Frontend
Raycast->>OS: open("cap://record")
OS->>Tauri: Route cap:// URL
Tauri->>Parser: Parse URL to DeepLinkAction
Parser->>Parser: Match domain (record/stop/pause/resume)
Parser-->>Tauri: Return DeepLinkAction variant
Tauri->>App: execute(StartDefaultRecording)
App->>Recording: list_displays()
Recording-->>App: Display list
App->>App: Select first display
App->>Recording: start_recording(inputs)
Recording-->>App: Recording started
Note over Raycast,Frontend: Pause Flow
Raycast->>OS: open("cap://pause")
OS->>Tauri: Route cap:// URL
Tauri->>Parser: Parse URL
Parser-->>Tauri: DeepLinkAction::PauseRecording
Tauri->>App: execute(PauseRecording)
App->>Recording: recording.pause()
Recording-->>App: Ok()
App->>Frontend: RecordingEvent::Paused.emit()
Note over Raycast,Frontend: Resume Flow
Raycast->>OS: open("cap://resume")
OS->>Tauri: Route cap:// URL
Tauri->>Parser: Parse URL
Parser-->>Tauri: DeepLinkAction::ResumeRecording
Tauri->>App: execute(ResumeRecording)
App->>Recording: recording.resume()
Recording-->>App: Ok()
App->>Frontend: RecordingEvent::Resumed.emit()
Note over Raycast,Frontend: Stop Flow
Raycast->>OS: open("cap://stop")
OS->>Tauri: Route cap:// URL
Tauri->>Parser: Parse URL
Parser-->>Tauri: DeepLinkAction::StopRecording
Tauri->>App: execute(StopRecording)
App->>Recording: stop_recording()
Recording-->>App: Recording stopped

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

Bounty Claim

/claim #1540

Walkthrough

I have implemented the deep link support and Raycast extension as requested.

Claim

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

Contributors

WA

Wayne Fourie

@d3vv3r

100%

Sponsors

CA

Cap

@CapSoftware

$200
AB

Abhishek Verma

@w3Abhishek

$0.10