feat: void:// deep-link navigation for canvas panels#18
Merged
Conversation
Enable URL-based navigation to any workspace, panel, or canvas position. Users can right-click a panel to "Copy Link" and share void:// URLs that navigate directly to that panel, even across app restarts. Key changes: - void:// URL scheme (open/<workspace_id>/<panel_id> or @x,y,zoom) - Single-instance IPC via TCP loopback so URLs reach the running app - Panel UUIDs now persist in layout.json for stable deep-link targets - "Copy Link" in terminal context menu copies void:// URL to clipboard - Toast notifications for navigation feedback - Windows void:// protocol handler in NSIS installer - Linux .desktop file with x-scheme-handler/void Closes #17
Right-clicking on the empty canvas now shows "Copy Link to Position" which copies a void:// URL with the exact canvas coordinates and current zoom level (e.g. void://open/<ws>/@500,300,0.75).
fdb1ec8 to
1f44f07
Compare
Add CFBundleURLTypes to both Info.plist templates (aarch64 + x86_64) so macOS recognizes void:// links and opens Void.app directly. Completes cross-platform protocol handler support (Windows, Linux, macOS).
The context menu was on the background area (Order::Background) but the content layer (Order::Middle) intercepted right-clicks first. Moved to the content layer's background rect with Sense::click() so right-click on empty canvas now correctly shows "Copy Link to Position".
…rl+Shift+L) - Ctrl+L opens a dialog to paste a void:// URL and navigate to it - Ctrl+Shift+L copies link to focused panel (or viewport position) - Both commands also available in the command palette (Ctrl+Shift+P) - Shortcuts filtered from terminal input to avoid PTY interference
The app now silently registers itself as the void:// URL handler each time it launches, so updates and dev builds work without manual setup. - Windows: writes HKCU registry keys via reg.exe (no admin needed) - Linux: writes .desktop file + runs xdg-mime default - macOS: runs lsregister on the .app bundle to refresh LaunchServices
Check for existing registration before writing anything: - Windows: query registry key first - Linux: check if .desktop file exists - macOS: check LaunchServices for existing handler
The /f flag was at the wrong position in the reg add args, causing the named value "URL Protocol" to never be created. Chrome/Brave require this value to recognize custom protocol handlers.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Resolves #17 — URL-based navigation to any part of the infinite canvas.
void://URL scheme:void://open/<workspace_id>/<panel_id>navigates to a panel,void://open/<ws>/@x,y,zoomnavigates to canvas coordinatesvoid.exe "void://open/..."sends the URL to the running instance via TCP loopback and exitsvoid://URL to clipboardvoid://in the registry; Linux.desktopfile withx-scheme-handler/voidURL format
New files
src/deeplink/mod.rssrc/deeplink/ipc.rssrc/deeplink/toast.rsassets/void.desktopTest plan
cargo check— compiles cleancargo test --locked— 28 tests pass (11 new deeplink parser tests)cargo clippy --locked --all-targets --all-features -- -D warnings— no warningscargo fmt --check— formattedcargo run -- "void://open/<ws-id>/<panel-id>"navigates on startupvoid://URL🤖 Generated with Claude Code