Problem
In the desktop client you cannot click links that exist inside a journal (or any page). External markdown links — [label](https://…) — render as styled text but are completely inert: clicking them does nothing. There is no way to follow a URL you wrote in a block.
To be precise about scope (verified in the code):
| Link type |
Desktop today |
[[page ref]] |
✅ navigates (onRefClick → openRef) |
#tag |
✅ navigates (same path) |
((block ref)) / !((embed)) |
✅ renders/expands |
[label](https://…) external link |
❌ not clickable — nothing happens |
So the gap is specifically external URLs. The renderer even admits it in a comment:
// MarkdownInline.tsx
// - `[label](url)` links (non-clickable for now, would need the Tauri opener plugin)
Why it's broken (root cause)
The token pipeline is fine — outl_md::inline tokenizes [text](url) into a Link { text, url } variant and it reaches the frontend with the href populated (InlineToken { kind: "link", value, href }). The break is everything after tokenization, on the desktop:
- No click handler. In
crates/outl-frontend-shared/src/markdown/MarkdownInline.tsx, the link case renders a plain <span> with no onClick (unlike ref and tag, which both call props.onRefClick / props.onTagClick). The href field is never read.
- No callback.
BlockCallbacks in crates/outl-desktop/src/components/BlockRow.tsx has onRefClick / onTagClick but no onLinkClick.
- No Tauri capability / plugin.
crates/outl-desktop/src-tauri/Cargo.toml has neither tauri-plugin-opener nor tauri-plugin-shell, and capabilities/default.json grants no opener:* / shell:* permission. So even with a handler there is no sanctioned way to open a URL in the system browser.
- No backend command. There is no Tauri command that opens an external URL.
Expected behavior
Clicking an external [label](url) link inside a journal/page on the desktop should open the URL in the user's default browser (modifier-click could open in background — nice-to-have, not required).
Suggested fix
- Add
tauri-plugin-opener (the modern replacement for the shell-open API) to src-tauri, register it, and grant opener:allow-open-url (scoped to http/https/mailto) in capabilities/default.json.
- Add an
onLinkClick(href) prop threaded from OutlineView → BlockRow → <MarkdownInline />, wired to a small wrapper that calls the opener.
- Wire the
link token in MarkdownInline.tsx to call it (with cursor-pointer + the existing link styling), guarding against non-http(s)/mailto schemes.
Notes / parity
The TUI also doesn't open external links today (ref_at_cursor has no Link variant), so this is a desktop-first feature — but it should be designed so the "open a URL" capability can be shared rather than reimplemented per client if the TUI/mobile later want it. The [[ref]] / #tag navigation already works on both and is out of scope here.
Problem
In the desktop client you cannot click links that exist inside a journal (or any page). External markdown links —
[label](https://…)— render as styled text but are completely inert: clicking them does nothing. There is no way to follow a URL you wrote in a block.To be precise about scope (verified in the code):
[[page ref]]onRefClick→openRef)#tag((block ref))/!((embed))[label](https://…)external linkSo the gap is specifically external URLs. The renderer even admits it in a comment:
Why it's broken (root cause)
The token pipeline is fine —
outl_md::inlinetokenizes[text](url)into aLink { text, url }variant and it reaches the frontend with thehrefpopulated (InlineToken { kind: "link", value, href }). The break is everything after tokenization, on the desktop:crates/outl-frontend-shared/src/markdown/MarkdownInline.tsx, thelinkcase renders a plain<span>with noonClick(unlikerefandtag, which both callprops.onRefClick/props.onTagClick). Thehreffield is never read.BlockCallbacksincrates/outl-desktop/src/components/BlockRow.tsxhasonRefClick/onTagClickbut noonLinkClick.crates/outl-desktop/src-tauri/Cargo.tomlhas neithertauri-plugin-openernortauri-plugin-shell, andcapabilities/default.jsongrants noopener:*/shell:*permission. So even with a handler there is no sanctioned way to open a URL in the system browser.Expected behavior
Clicking an external
[label](url)link inside a journal/page on the desktop should open the URL in the user's default browser (modifier-click could open in background — nice-to-have, not required).Suggested fix
tauri-plugin-opener(the modern replacement for the shell-open API) tosrc-tauri, register it, and grantopener:allow-open-url(scoped tohttp/https/mailto) incapabilities/default.json.onLinkClick(href)prop threaded fromOutlineView→BlockRow→<MarkdownInline />, wired to a small wrapper that calls the opener.linktoken inMarkdownInline.tsxto call it (withcursor-pointer+ the existing link styling), guarding against non-http(s)/mailtoschemes.Notes / parity
The TUI also doesn't open external links today (
ref_at_cursorhas noLinkvariant), so this is a desktop-first feature — but it should be designed so the "open a URL" capability can be shared rather than reimplemented per client if the TUI/mobile later want it. The[[ref]]/#tagnavigation already works on both and is out of scope here.