fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(mobile): report markdown link open failures - #5837

Closed
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures
Closed

fix(mobile): report markdown link open failures#5837
fe-franco wants to merge 1 commit into
pingdotgg:mainfrom
fe-franco:fix/markdown-link-open-failures

Conversation

@fe-franco

@fe-francofe-franco commented Aug 9, 2026

Copy link
Copy Markdown

Resolves#5839

What Changed

ThreadFeed.tsx routes all three markdown link presses through
tryOpenExternalUrl with the existing markdown-link target. The now unused
Linking import goes away. Four lines change, and no behavior changes on a
successful tap.

- void Linking.openURL(props.href);+ void tryOpenExternalUrl(props.href, "markdown-link");

Why

The three call sites called Linking.openURL directly:

// :274 MarkdownExternalLink, :604 link renderer, :1406 onMarkdownLinkPressvoidLinking.openURL(props.href);

Linking.openURL rejects when the device has no handler for the URL. The void
operator discards that rejection, so a failed tap produced no log line.

tryOpenExternalUrl exists for this case and already declares a
markdown-link target. FileMarkdownPreview.tsx uses it on lines 60 and 191.
The thread feed was the only markdown renderer that stayed silent, so this
makes the two agree.

UI Changes

None. The change only adds error reporting on the failure path.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Verification

  • vp run --filter @t3tools/mobile typecheck passes.
  • vp run --filter @t3tools/mobile test passes, 620 tests in 100 files.
  • vp lint --report-unused-disable-directives reports one pre-existing warning
    in apps/web/src/components/settings/ThemeEditorPanel.tsx, untouched here.
  • vp fmt --check passes.
  • Rebased onto 1a003e383.

Written by Claude Opus 5 in Claude Code.

ThreadFeed opened markdown links with three direct Linking.openURL calls.
That promise rejects when the device has no handler for the URL, and the
void operator discarded the rejection. The tap did nothing and the app
logged nothing.
Route all three call sites through tryOpenExternalUrl with the existing
markdown-link target, so the thread feed matches FileMarkdownPreview and
logs ExternalUrlOpenError.
Resolvespingdotgg#5834
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@coderabbitai

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 067fcf25-8658-429a-b7c1-39f1fc337963

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actionsgithub-actionsBot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 9, 2026
@macroscopeapp

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 2f8f5cd

This change wraps existing Linking.openURL calls with a helper that adds error handling and structured logging. The core behavior remains unchanged—failures that previously threw are now caught and reported. Low-risk error handling improvement.

You can customize Macroscope's approvability policy. Learn more.

@juliusmarminge

Copy link
Copy Markdown
Member

Closing as superseded by #5872, which has merged and covers this change on the current architecture. Thanks for the contribution.

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

Labels

size:XS0-9 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: thread markdown links discard openURL failures

2 participants

@fe-franco@juliusmarminge