Closes #1540
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:
StartDefaultRecording, PauseRecording, ResumeRecording, and StopRecording to deeplink_actions.rscap:// URL scheme in Tauri configuration alongside the existing cap-desktop:// schemecap:// scheme first before falling back to the existing action-based parsingRecordingEvent::Paused and RecordingEvent::Resumed events to update the UIImplementation 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.
| 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 |
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!
/claim #1540
I have implemented the deep link support and Raycast extension as requested.
Wayne Fourie
@d3vv3r
Cap
@CapSoftware
Abhishek Verma
@w3Abhishek