<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: bada</title>
    <description>The latest articles on Forem by bada (@badaverse).</description>
    <link>https://forem.com/badaverse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3798530%2F533a27f0-9eea-4de9-ac92-185204efdb3f.png</url>
      <title>Forem: bada</title>
      <link>https://forem.com/badaverse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/badaverse"/>
    <language>en</language>
    <item>
      <title>I Built a macOS App to Stop Links From Opening in the Wrong Chrome Profile</title>
      <dc:creator>bada</dc:creator>
      <pubDate>Sun, 01 Mar 2026 00:24:24 +0000</pubDate>
      <link>https://forem.com/badaverse/i-built-a-macos-app-to-stop-links-from-opening-in-the-wrong-chrome-profile-3e1f</link>
      <guid>https://forem.com/badaverse/i-built-a-macos-app-to-stop-links-from-opening-in-the-wrong-chrome-profile-3e1f</guid>
      <description>&lt;p&gt;I use multiple Chrome profiles.&lt;/p&gt;

&lt;p&gt;Every morning I open Slack, click a Notion link, and watch it open in my personal profile. I copy the URL, switch to the work profile, paste, hit enter. Then I click a GitHub link in email — same thing, wrong profile. Copy, switch, paste.&lt;/p&gt;

&lt;p&gt;I've been doing this dozens of times a day for years. At some point I stopped counting and started building.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Wanted
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Route links from &lt;em&gt;outside&lt;/em&gt; Chrome (Slack, email) &lt;strong&gt;and&lt;/strong&gt; links clicked &lt;em&gt;inside&lt;/em&gt; Chrome&lt;/li&gt;
&lt;li&gt;Set a rule once and forget about it — no profile picker every time&lt;/li&gt;
&lt;li&gt;Support wildcards and regex, not just exact domains&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted something that covered the full loop. So I decided to build it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  So I Built It
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/badaverse/linkprism" rel="noopener noreferrer"&gt;LinkPrism&lt;/a&gt; is a macOS menu bar app. You set it as your default browser, add a few rules, and that's it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;notion.so        → Work
github.com       → Personal
*.atlassian.net  → Work
docs.google.com  → Ask every time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rules can be exact host matches, wildcards, or regex. For domains you use across profiles, there's an "Ask" mode — a profile picker pops up and you can check "Don't ask again for this URL."&lt;/p&gt;

&lt;p&gt;This handles links from Slack, email, Telegram — anything outside Chrome. But there's a catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Harder Part: Links Inside Chrome
&lt;/h2&gt;

&lt;p&gt;Links clicked &lt;em&gt;inside Chrome&lt;/em&gt; never hit the OS default browser handler. Chrome handles them internally. The app can't see them.&lt;/p&gt;

&lt;p&gt;So I built a companion Chrome extension (Manifest V3) that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Syncs rules from the macOS app via a local HTTP server on &lt;code&gt;127.0.0.1:19384&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Detects which Chrome profile it's running in using &lt;code&gt;chrome.identity&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Matches rules client-side on every navigation&lt;/li&gt;
&lt;li&gt;Reroutes only when the current profile is wrong — no unnecessary redirects&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now the full loop is closed. External links go through the app. In-browser links go through the extension. No gaps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Thing I Didn't Expect
&lt;/h2&gt;

&lt;p&gt;After using it for a while, I realized the annoyance wasn't just the extra clicks. It was the &lt;em&gt;context switching&lt;/em&gt;. Every wrong-profile link pulled me out of whatever I was focused on. Fixing this tiny friction removed a surprising amount of daily cognitive noise.&lt;/p&gt;

&lt;p&gt;If you juggle Chrome profiles, you might not even notice how much energy goes into this routine until it's gone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/badaverse/linkprism" rel="noopener noreferrer"&gt;badaverse/linkprism&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download (.dmg):&lt;/strong&gt; &lt;a href="https://github.com/badaverse/linkprism/releases/latest" rel="noopener noreferrer"&gt;Latest release&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt; macOS 14+&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Feedback, issues, and PRs are all welcome. If you have a different approach to this problem, I'd love to hear about it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>opensource</category>
      <category>automation</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
