Skip to content

feat(app): offer to open links in their native desktop app - #5112

Open
yomgui wants to merge 2 commits into
devfrom
feat/link-open-in-native-app
Open

yomgui wants to merge 2 commits into
devfrom
feat/link-open-in-native-app

Conversation

@yomgui

@yomgui yomgui commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

This PR adds an explicit Open in <registered app> action to website-link context menus when a narrowly supported Notion, Linear, or Slack URL has a locally registered protocol handler. The existing browser and copy choices stay available, policy is checked against the original HTTPS URL, and missing or failing handlers simply omit the new item.

It does not change primary clicks, route arbitrary domains, add remembered preferences, or implement true OS/vendor integration. Real vendor-app authentication, target arrival, arbitrary-domain discovery, and real protocol registration on macOS and Windows remain out of scope.

The implementation uses a strict local mapping catalog and Electron protocol-handler lookup, with no network resolution. Slack and Linear forms are vendor documented; the narrow Notion form is third-party-supported rather than an official rewrite API. The research and implementation review records the source summary, rejected alternatives, exact mapping boundaries, and remaining platform limitations.

Screenshots

Before: no registered handler

Before — no handler: the native menu retains browser and copy choices without a native-app item.

After: synthetic registered app

After — synthetic registered app: the native popup shows the display name supplied by the in-memory protocol registry. This does not show a vendor app launching.

Verification

Gate Status Scope
Focused main-process unit tests Passed: 95/95 Mapper, menu ordering, policy, stale-source and missing-handler behavior
Electron typecheck Passed Desktop Electron sources
Focused native-menu E2E on Daytona Passed: 3/3 assertion artifacts One selected journey; seven intentionally unselected tests are not counted as passed
Focused native-menu E2E local Passed Same repaired selected journey; seven intentionally unselected tests are not counted as passed
Existing primary-click E2E Passed Existing website-link route remains unchanged
Revert control Expected failure Removing only the native item fails on the missing menu entry; restoration passes
Evals typecheck Baseline failure 12 existing progressbar role errors reproduce on clean dev; this command is not reported as passed

The final evidence is bound to head 21f5bc1d2. Earlier pre-repair runs are diagnostic only and are not claimed as head evidence. The revert run is an intentional negative control, not a passing product run.

The E2E witness uses a synthetic protocol registry and intercepts external dispatch. No vendor application was installed or tested, and real macOS/Windows protocol integration remains unverified. Skipped and unselected tests are not passed coverage.

Signed-off-by: Guillaume Loret <guillaume@openworklabs.com>
@vercel

vercel Bot commented Sep 17, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

4 Skipped Deployments
Project Deployment Actions Updated
openwork-app Ignored Ignored Preview Sep 17, 2026 4:20pm UTC
openwork-den Ignored Ignored Preview Sep 17, 2026 4:20pm UTC
openwork-diagnostics Ignored Ignored Preview Sep 17, 2026 4:20pm UTC
openwork-landing Ignored Ignored Preview Sep 17, 2026 4:20pm UTC

Signed-off-by: Guillaume Loret <guillaume@openworklabs.com>
@yomgui

yomgui commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

Selected evidence: Incomplete · 12/12 tests · 18/18 assertions · 8 images

Commit 21f5bc1d258cc9fb83ab2528a896819a9ed6a55e · selected evidence
Required verification is reported separately by the current-head Required verification check.

Open review report

Coverage gaps: Required verification: incomplete. Selected evidence does not satisfy all required specs. No authenticated current-head required plan is available.

} from "@openwork/browser-tabs";
import { runDetachedTask } from "./process-resilience.mjs";
import { listInstalledBrowsers } from "./installed-browsers.mjs";
import { registeredNativeAppLinkForHttps } from "./native-app-links.mjs";

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.

UI change without screenshot evidence

The browser link context menu gains a native-app action without a referenced screenshot or recording of the changed surface.

Evidence
  • browser-panel.mjs imports registeredNativeAppLinkForHttps, which is used to add the native-app item to the link context menu.
  • The provided PR body references implementation research but no PNG, JPG, GIF, or MP4 showing the changed menu.
  • The changed surface is the browser link context menu in browser-panel.mjs.

Identified by Warden · design-spec-review · MKX-BY6

@github-actions

Copy link
Copy Markdown
Contributor

Warden review summary — Clear

Native findings: 1. Blocking policy matches before consolidation: 0. Full finding text remains in Warden's native checks and review threads. This comment retains only native IDs, severity, skill attribution, and safe locations. Analysis run

Reported trigger coverage (not proof of complete repository or context coverage): diff-security-review (171772 ms), confidentiality-review (196833 ms), spec-provenance-review (134912 ms), desktop-den-sync-review (189756 ms), design-spec-review (204440 ms).

Blockers

  • None.

Advisories

  • MKX-BY6 · low · design-spec-review · apps/desktop/electron/browser-panel.mjs:16

Needs recheck

  • None.

Observed review-thread metrics

  • Unique observed run attempts in retained window: 1
  • Distinct heads in retained window: 1
  • Current unresolved Warden threads: 1 of 1 observed
  • Observed resolved/unresolved transitions in retained snapshots: 0 / 0
  • First observed resolved/unresolved (state at first collection, not event time): 0 / 1
  • Precision: unavailable (no adjudications; no TP/FP values are inferred)
  • Observation window: 1/20 run attempts retained; truncated: false
  • Transition snapshot: 1/1 current attributed threads retained (limit 500); truncated: false

Thread states are read-only collection snapshots. These metrics are neither lifetime totals nor exact resolution times, and this summary is not clearance authority.

@diff-warden diff-warden Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Warden security clearance: clear. No blocking findings (security or desktop↔den sync) in this diff (21f5bc1d258cc9fb83ab2528a896819a9ed6a55e). Automated clearance satisfies the required-review gate only — a human still reviews and merges. Analysis run

@github-actions

Copy link
Copy Markdown
Contributor

Required verification: waiting. Selected evidence is separate.

Missing required specs: app-smoke.e2e.test.ts, browser-tabs-owned-by-thread.e2e.test.ts, cross-server-handoff-atomic-commit.e2e.test.ts, desktop-policy-restricted-mode.e2e.test.ts, org-team-lifecycle-critical-path.e2e.test.ts.

Required journey jobs

Commit 21f5bc1d258cc9fb83ab2528a896819a9ed6a55e

Scope: critical and changed spec files; excluded and manual dispositions are not passing coverage.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant