<?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>DEV Community: Nic Luther</title>
    <description>The latest articles on DEV Community by Nic Luther (@nic_luther_e29bc02b683c55).</description>
    <link>https://dev.to/nic_luther_e29bc02b683c55</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%2F3817411%2F0be65f3d-cd71-400b-88df-ae63aeb6987b.png</url>
      <title>DEV Community: Nic Luther</title>
      <link>https://dev.to/nic_luther_e29bc02b683c55</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nic_luther_e29bc02b683c55"/>
    <language>en</language>
    <item>
      <title>How do you manage notification overload from email, Slack &amp; GitHub?</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Thu, 12 Mar 2026 11:46:15 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/how-do-you-manage-notification-overload-from-email-slack-github-4kei</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/how-do-you-manage-notification-overload-from-email-slack-github-4kei</guid>
      <description>&lt;p&gt;I have been obsessed with this problem. As developers, we constantly switch between email, Slack, and GitHub notifications. I tracked mine: 47 app switches per day, about 25 minutes wasted on context switching alone.&lt;/p&gt;

&lt;p&gt;I started building a solution called HeyRobyn — a native Mac app that puts all three in one window (SwiftUI, not Electron, all data on-device). But I am curious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do YOU manage notification overload?&lt;/li&gt;
&lt;li&gt;Do you use any unified inbox tools?&lt;/li&gt;
&lt;li&gt;Would you actually want email + Slack + GitHub in one app, or does separation help you focus?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Genuinely want to hear different perspectives.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>productivity</category>
      <category>macos</category>
      <category>developer</category>
    </item>
    <item>
      <title>Building a Native Mac Unified Inbox with SwiftUI: Email, Slack &amp; GitHub in One Window</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Thu, 12 Mar 2026 02:31:47 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/building-a-native-mac-unified-inbox-with-swiftui-email-slack-github-in-one-window-2gim</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/building-a-native-mac-unified-inbox-with-swiftui-email-slack-github-in-one-window-2gim</guid>
      <description>&lt;h1&gt;
  
  
  Why I Built a Unified Inbox for Mac
&lt;/h1&gt;

&lt;p&gt;I was context-switching 50+ times a day between Gmail, Slack, and GitHub. Each notification would pull me out of flow, and important messages got buried across multiple apps.&lt;/p&gt;

&lt;p&gt;After trying every productivity app on the market (Shift, Wavebox, Rambox), I realized they all had the same fundamental problem: &lt;strong&gt;they're Electron apps that just wrap web pages&lt;/strong&gt;. Heavy, slow, and not truly native to macOS.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;HeyRobyn&lt;/strong&gt; - a native SwiftUI unified inbox for Mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why SwiftUI Over Electron?
&lt;/h3&gt;

&lt;p&gt;The performance difference is night and day:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: 150MB vs 800MB+ for Electron competitors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery&lt;/strong&gt;: Native APIs mean better power efficiency
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: No web view overhead - instant UI updates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mac-native feel&lt;/strong&gt;: Proper keyboard shortcuts, Touch Bar support, macOS design patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architecture Overview
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐
│   SwiftUI Views     │  ← Native UI layer
├─────────────────────┤
│  Core Data Models   │  ← Local-first storage
├─────────────────────┤
│   API Integrations  │  ← Gmail, Slack, GitHub SDKs
│   (OAuth2 + PKCE)   │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything runs on-device. No cloud sync means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Your emails never touch our servers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: No network latency for UI operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offline&lt;/strong&gt;: Full functionality without internet&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Hardest Part: OAuth2 Flow
&lt;/h3&gt;

&lt;p&gt;Getting OAuth2 working natively in SwiftUI (without a web view) was surprisingly complex. Here's the key pattern I landed on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified OAuth2 PKCE flow&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kt"&gt;AuthManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;ObservableObject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;@Published&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;isAuthenticated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;throws&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 1. Generate PKCE challenge&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;codeVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateCodeVerifier&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;codeChallenge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generateChallenge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;codeVerifier&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// 2. Open system browser for consent&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;authURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;buildAuthURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;challenge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;codeChallenge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="kt"&gt;NSWorkspace&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// 3. Listen for callback via custom URL scheme&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;authCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;waitForCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;// 4. Exchange code for tokens&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;exchangeCodeForTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nv"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;authCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="nv"&gt;verifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;codeVerifier&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;// 5. Store securely in Keychain&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="kt"&gt;KeychainService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;isAuthenticated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern works for Gmail (Google OAuth), Slack, and GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Inbox Logic
&lt;/h3&gt;

&lt;p&gt;The core challenge: &lt;strong&gt;how do you merge 3 different message types into one chronological feed?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I created a protocol-oriented approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;protocol&lt;/span&gt; &lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Identifiable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Date&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;preview&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;MessageSource&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// .email, .slack, .github&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Priority&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Each integration implements this protocol&lt;/span&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;EmailMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;SlackMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="kt"&gt;GitHubNotification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Unified feed is just a sorted array&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;slackMessages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;githubNotifications&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flatMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
 &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sorted&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  AI Triage: The Secret Sauce
&lt;/h3&gt;

&lt;p&gt;I integrated local ML models (Core ML) to auto-categorize and prioritize messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Urgent&lt;/strong&gt;: Mentions from your manager, security alerts, build failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Important&lt;/strong&gt;: PR reviews, direct messages, project updates
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Low priority&lt;/strong&gt;: Marketing emails, automated notifications, FYIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This runs entirely on-device using Apple's Natural Language framework:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;import&lt;/span&gt; &lt;span class="kt"&gt;NaturalLanguage&lt;/span&gt;

&lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;categorizePriority&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UnifiedMessage&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Priority&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;tagger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;NLTagger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tagSchemes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sentimentScore&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;tagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;

    &lt;span class="c1"&gt;// Check for urgency keywords&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;containsUrgentKeywords&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urgent&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Analyze sender importance&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;importantContacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;important&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;low&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. SwiftUI is Amazing (But Has Sharp Edges)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List performance&lt;/strong&gt;: For 1000+ items, use &lt;code&gt;LazyVStack&lt;/code&gt; + custom diffing, not &lt;code&gt;List&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State management&lt;/strong&gt;: Combine's &lt;code&gt;@Published&lt;/code&gt; + &lt;code&gt;ObservableObject&lt;/code&gt; works great&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navigation&lt;/strong&gt;: SwiftUI's NavigationStack is still buggy - sometimes need UIKit bridges&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Privacy-First Is Hard But Worth It
&lt;/h3&gt;

&lt;p&gt;Users are &lt;strong&gt;extremely&lt;/strong&gt; sensitive about email privacy. Going 100% local-first was the right call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No backend to maintain or secure&lt;/li&gt;
&lt;li&gt;No GDPR compliance headaches
&lt;/li&gt;
&lt;li&gt;Users trust the app more (visible in feedback)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Distribution on Mac Is Unique
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Store&lt;/strong&gt;: 30% fee + sandboxing restrictions (can't access Mail.app data)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct distribution&lt;/strong&gt;: Code signing costs $99/year, notarization takes time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: Mac users expect either $10 one-time OR $5-15/mo subscription&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went with direct distribution + subscription ($12.50/mo early access).&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm launching HeyRobyn publicly on &lt;strong&gt;March 18, 2026&lt;/strong&gt;. Early access waitlist: &lt;a href="https://heyrobyn.ai" rel="noopener noreferrer"&gt;heyrobyn.ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Planning to add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linear integration&lt;/strong&gt; (project management)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt; (for open source communities)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom integrations&lt;/strong&gt; via plugin API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love feedback from the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What other integrations would you want?&lt;/li&gt;
&lt;li&gt;Any concerns about the privacy model?&lt;/li&gt;
&lt;li&gt;Mac developers: what's your unified inbox setup?&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt;: SwiftUI, Core Data, Combine, Core ML, OAuth2 PKCE&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Waitlist&lt;/strong&gt;: &lt;a href="https://heyrobyn.ai" rel="noopener noreferrer"&gt;https://heyrobyn.ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>swiftui</category>
      <category>macos</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How I Handle 200+ GitHub Notifications Without Losing My Mind</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Tue, 10 Mar 2026 20:49:49 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/how-i-handle-200-github-notifications-without-losing-my-mind-38mi</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/how-i-handle-200-github-notifications-without-losing-my-mind-38mi</guid>
      <description>&lt;p&gt;Last Tuesday, I opened GitHub and saw &lt;strong&gt;247 unread notifications&lt;/strong&gt;. PRs from 6 different repos, security alerts, code review requests, mentions in issues I commented on 3 months ago, Dependabot spam, and a release announcement for a library I starred once in 2019.&lt;/p&gt;

&lt;p&gt;I spent 2 hours triaging. By the time I finished, I had 89 new notifications waiting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Context-Switching Tax
&lt;/h2&gt;

&lt;p&gt;Here's what my workflow looked like before I fixed this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Email notification&lt;/strong&gt; → "John mentioned you in issue #4523"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to browser&lt;/strong&gt; → Open GitHub, find the issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read context&lt;/strong&gt; → 47 comments, scroll to find my mention&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack ping&lt;/strong&gt; → "Can you review my PR?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to Slack&lt;/strong&gt; → Click the link (opens another browser tab)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back to email&lt;/strong&gt; → Dependabot opened 12 PRs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeat forever&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every context switch costs ~23 minutes to regain focus (UC Irvine research). I was losing &lt;strong&gt;2+ hours daily&lt;/strong&gt; just switching between GitHub, Slack, and email.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried (And Why It Failed)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Attempt 1: Email Filters
&lt;/h3&gt;

&lt;p&gt;I set up Gmail filters to auto-label GitHub notifications by repo. Helped slightly, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still required opening each notification in a browser&lt;/li&gt;
&lt;li&gt;No way to prioritize PRs vs issue comments vs releases&lt;/li&gt;
&lt;li&gt;Slack and email remained separate&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Attempt 2: GitHub CLI + Terminal Workflow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gh &lt;span class="nb"&gt;pr &lt;/span&gt;list &lt;span class="nt"&gt;--assignee&lt;/span&gt; @me
gh issue list &lt;span class="nt"&gt;--mentions&lt;/span&gt; @me
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great for scripting, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Had to remember syntax for every query&lt;/li&gt;
&lt;li&gt;Couldn't see Slack threads or emails in the same view&lt;/li&gt;
&lt;li&gt;No visual diff preview without opening browser&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Attempt 3: Browser Extensions
&lt;/h3&gt;

&lt;p&gt;Tried Refined GitHub, Octotree, and 5 others. They made GitHub's UI better but didn't solve the &lt;strong&gt;core problem&lt;/strong&gt;: notifications were still scattered across 3 apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Unified Inbox Epiphany
&lt;/h2&gt;

&lt;p&gt;I realized I didn't need better GitHub notifications — I needed &lt;strong&gt;one place&lt;/strong&gt; to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub PRs awaiting my review&lt;/li&gt;
&lt;li&gt;Slack threads where I'm mentioned&lt;/li&gt;
&lt;li&gt;Emails that require action&lt;/li&gt;
&lt;li&gt;All sorted by urgency, not chronology&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built it. HeyRobyn is a native Mac app (SwiftUI, not Electron) that pulls GitHub, Slack, and email into a single unified inbox.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works (Technical Overview)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. GitHub API Integration&lt;/strong&gt;&lt;br&gt;
Uses GitHub's REST API + webhooks to fetch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PRs filtered by review status (&lt;code&gt;review_requested&lt;/code&gt;, &lt;code&gt;changes_requested&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Issues where I'm mentioned or assigned&lt;/li&gt;
&lt;li&gt;Release notifications (only for repos I've contributed to, not starred)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Intelligent Prioritization&lt;/strong&gt;&lt;br&gt;
Sort algorithm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;priority_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;base_urgency&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_blocking_others&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_requested_by_teammate&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;security_alert&lt;/span&gt; &lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age_in_hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. On-Device Data Storage&lt;/strong&gt;&lt;br&gt;
Everything cached locally in SQLite. No server middleman. Privacy-first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Native macOS Performance&lt;/strong&gt;&lt;br&gt;
SwiftUI means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;50MB RAM&lt;/strong&gt; (vs 1.2GB for Electron-based tools)&lt;/li&gt;
&lt;li&gt;Instant search across all messages (Core Spotlight integration)&lt;/li&gt;
&lt;li&gt;Keyboard-first navigation (Cmd+K to jump anywhere)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;247 GitHub notifications&lt;/li&gt;
&lt;li&gt;42 unread Slack threads&lt;/li&gt;
&lt;li&gt;89 emails&lt;/li&gt;
&lt;li&gt;7 browser tabs open&lt;/li&gt;
&lt;li&gt;2GB RAM consumed&lt;/li&gt;
&lt;li&gt;2+ hours/day triaging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 unified inbox&lt;/li&gt;
&lt;li&gt;12 items marked "urgent" (the rest auto-filtered)&lt;/li&gt;
&lt;li&gt;1 Mac window&lt;/li&gt;
&lt;li&gt;50MB RAM&lt;/li&gt;
&lt;li&gt;20 minutes/day triaging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Changed (Beyond the Time Saved)
&lt;/h2&gt;

&lt;p&gt;The real win isn't time — it's &lt;strong&gt;mental clarity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before: Every notification felt urgent because I couldn't see the full picture.&lt;/p&gt;

&lt;p&gt;After: I can see at a glance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"3 PRs are blocking teammates" → review now&lt;/li&gt;
&lt;li&gt;"14 Dependabot PRs" → batch-merge later&lt;/li&gt;
&lt;li&gt;"87 GitHub notifications" → muted repos I don't actively maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm no longer reactive. I decide what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;HeyRobyn launches &lt;strong&gt;March 18&lt;/strong&gt; with 50% off early access. We're at 47 waitlist signups — targeting 100 by launch.&lt;/p&gt;

&lt;p&gt;If you're drowning in GitHub notifications, Slack pings, and email chaos, check out &lt;a href="https://heyrobyn.ai" rel="noopener noreferrer"&gt;heyrobyn.ai&lt;/a&gt; or see &lt;a href="https://heyrobyn.ai/compare" rel="noopener noreferrer"&gt;how it compares&lt;/a&gt; to tools like Shift and Wavebox.&lt;/p&gt;

&lt;p&gt;Built with SwiftUI. Data stays on your Mac. No Electron bloat.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your GitHub notification strategy?&lt;/strong&gt; Do you triage daily, weekly, or just let them pile up? Drop a comment — genuinely curious how other devs handle this.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>github</category>
    </item>
    <item>
      <title>How I Handle 200+ GitHub Notifications Without Losing My Mind</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Tue, 10 Mar 2026 20:36:32 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/how-i-handle-200-github-notifications-without-losing-my-mind-p6i</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/how-i-handle-200-github-notifications-without-losing-my-mind-p6i</guid>
      <description>&lt;h1&gt;
  
  
  How I Handle 200+ GitHub Notifications Without Losing My Mind
&lt;/h1&gt;

&lt;p&gt;Last Tuesday, I had 247 unread GitHub notifications. By Wednesday afternoon, I'd missed a critical PR review that blocked my team for 6 hours. By Thursday, I'd decided enough was enough.&lt;/p&gt;

&lt;p&gt;If you're a developer working on multiple repos, you know the pain: GitHub notifications pile up faster than you can triage them. Mix in Slack pings, email threads, and calendar alerts, and you're spending 2+ hours a day just staying on top of communication.&lt;/p&gt;

&lt;p&gt;Here's how I went from drowning in notifications to processing 200+ GitHub items in under 30 minutes a day — and why I eventually built a unified inbox to solve this permanently.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Death by Context Switching
&lt;/h2&gt;

&lt;p&gt;My old workflow looked like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning routine (90 minutes):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Mail.app → check email (15 min)&lt;/li&gt;
&lt;li&gt;Open Slack → respond to DMs, scan channels (25 min)&lt;/li&gt;
&lt;li&gt;Open GitHub notifications page → triage issues/PRs (35 min)&lt;/li&gt;
&lt;li&gt;Check calendar in yet another app (5 min)&lt;/li&gt;
&lt;li&gt;Realize I missed a Slack thread → back to Slack (10 min)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; By 10 AM, I'd already context-switched 12+ times and hadn't written a single line of code.&lt;/p&gt;

&lt;p&gt;The real killer wasn't the volume of notifications — it was the &lt;strong&gt;cognitive overhead of switching between 3-4 apps&lt;/strong&gt; just to understand what needed my attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried First
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Attempt 1: GitHub email notifications
&lt;/h3&gt;

&lt;p&gt;GitHub lets you receive all notifications via email. Sounds great, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; My inbox became a graveyard of &lt;code&gt;[user/repo] Issue #1234&lt;/code&gt; emails. Threading broke constantly. Finding the original context meant opening GitHub anyway. Abandoned after 2 weeks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attempt 2: Slack integrations
&lt;/h3&gt;

&lt;p&gt;Connected GitHub to Slack via webhooks. Every PR, issue comment, and mention posted to a &lt;code&gt;#github&lt;/code&gt; channel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; The channel moved so fast I started muting it. Then I missed important mentions. Plus, I still had to check actual GitHub for the full thread. Abandoned after 1 week.&lt;/p&gt;

&lt;h3&gt;
  
  
  Attempt 3: Browser tabs + notifications
&lt;/h3&gt;

&lt;p&gt;Kept GitHub, Slack, and Gmail pinned in Chrome tabs. Enabled desktop notifications for everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reality:&lt;/strong&gt; Notification fatigue set in. I started ignoring &lt;em&gt;all&lt;/em&gt; notifications because most were noise. Battery life tanked (Chrome + Slack Desktop = 2-3 hours). Gave up after 3 weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Breaking Point
&lt;/h2&gt;

&lt;p&gt;The moment I knew I needed a real solution: I got pinged in Slack about a PR that was blocking a deploy. The PR had been ready for review for 6 hours, but it was buried under 40 other GitHub notifications I hadn't triaged yet.&lt;/p&gt;

&lt;p&gt;I'd spent the morning bouncing between email, Slack, and GitHub, yet somehow &lt;em&gt;missed the most important thing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;That's when I realized: &lt;strong&gt;the problem wasn't the tools. It was the fragmentation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Works: The Unified Inbox Approach
&lt;/h2&gt;

&lt;p&gt;I started sketching out what a solution would look like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core principle:&lt;/strong&gt; One window, one chronological feed, smart filtering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features needed:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pull GitHub notifications, Slack DMs, and email into a single stream&lt;/strong&gt; — no more app-hopping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filter by priority&lt;/strong&gt; — separate "needs review" from "FYI"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preserve context&lt;/strong&gt; — show the full thread without opening a browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Mac app&lt;/strong&gt; — no Electron memory hog (looking at you, Slack Desktop)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first&lt;/strong&gt; — all data stays on my machine&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why I Built It in SwiftUI
&lt;/h3&gt;

&lt;p&gt;I tried Electron first. It worked, but:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory usage: &lt;strong&gt;1.2 GB&lt;/strong&gt; for a basic prototype&lt;/li&gt;
&lt;li&gt;Battery drain: &lt;strong&gt;30-40% per day&lt;/strong&gt; just running in the background&lt;/li&gt;
&lt;li&gt;Startup time: &lt;strong&gt;3-4 seconds&lt;/strong&gt; cold launch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switched to SwiftUI (native macOS):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memory usage: &lt;strong&gt;50 MB&lt;/strong&gt; (24x improvement)&lt;/li&gt;
&lt;li&gt;Battery drain: &lt;strong&gt;negligible&lt;/strong&gt; (macOS optimizations for native apps)&lt;/li&gt;
&lt;li&gt;Startup time: &lt;strong&gt;instant&lt;/strong&gt; (app icon bounce = ready)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a tool I'd use 10+ hours a day, performance mattered.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Technical Stack
&lt;/h3&gt;

&lt;p&gt;Here's how I approached the GitHub notifications problem specifically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub API integration:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Fetch all unread notifications&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;notifications&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notifications&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Filter by reason (review_requested, mention, etc.)&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;prioritized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;notifications&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"review_requested"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"mention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"assign"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Group by repo for easy triage&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;grouped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;grouping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prioritized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Smart filtering rules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Priority 1:&lt;/strong&gt; PRs I'm requested to review, direct @mentions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority 2:&lt;/strong&gt; Issues I'm assigned to, team mentions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority 3:&lt;/strong&gt; Thread subscriptions, repo watching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; GitHub's API exposes a &lt;code&gt;reason&lt;/code&gt; field that tells you &lt;em&gt;why&lt;/em&gt; you got the notification. Most third-party tools ignore this. Using it to auto-prioritize cut my triage time by 60%.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;My current workflow (30 minutes):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;one app&lt;/strong&gt; in the morning&lt;/li&gt;
&lt;li&gt;See GitHub PRs needing review, Slack DMs, and urgent emails in one unified feed&lt;/li&gt;
&lt;li&gt;Filter by "needs action" vs "FYI"&lt;/li&gt;
&lt;li&gt;Process high-priority items first&lt;/li&gt;
&lt;li&gt;Archive or snooze the rest&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Time saved:&lt;/strong&gt; 60 minutes/day = 5 hours/week = 20 hours/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  The On-Device Privacy Win
&lt;/h2&gt;

&lt;p&gt;One requirement I refused to compromise on: &lt;strong&gt;no cloud server processing my data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most "unified inbox" tools (Shift, Wavebox, etc.) are just Chromium wrappers that load the web UIs. They don't actually unify anything — you're still using Gmail's web UI, Slack's web UI, GitHub's web UI in separate tabs.&lt;/p&gt;

&lt;p&gt;My approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; Pull notifications via API, store locally in SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack:&lt;/strong&gt; Use Slack API, decrypt messages on-device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email:&lt;/strong&gt; IMAP connection, emails stored locally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; My GitHub repos include proprietary code. Slack has customer conversations. Email has contracts. I'm not sending that to a third-party server just to get a unified feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;If I were starting over:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with MVP filtering logic&lt;/strong&gt; — I spent 2 weeks on UI polish before nailing the smart filters. Should've been reversed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test with 1000+ notifications immediately&lt;/strong&gt; — My initial prototype choked on large volumes. Real-world testing would've caught this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add keyboard shortcuts from day 1&lt;/strong&gt; — Power users (me) live in shortcuts. I bolted them on later; should've been core UX.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Should You Build Your Own?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Build it if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're drowning in cross-app notifications daily&lt;/li&gt;
&lt;li&gt;You care about data privacy (no cloud processing)&lt;/li&gt;
&lt;li&gt;You want native performance (not Electron)&lt;/li&gt;
&lt;li&gt;You enjoy solving your own problems with code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't build it if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're fine with browser tabs + discipline&lt;/li&gt;
&lt;li&gt;You don't mind Electron memory usage&lt;/li&gt;
&lt;li&gt;You need Windows/Linux support (SwiftUI = macOS only)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, this was a no-brainer. I'm a Mac developer who spends 10 hours/day in communication tools. Building a native unified inbox paid for itself in saved time within 2 weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Launch
&lt;/h2&gt;

&lt;p&gt;I'm opening up early access on &lt;strong&gt;March 18, 2026&lt;/strong&gt; (7 days from now). If you're curious how it compares to Shift, Wavebox, or Rambox, I wrote up a detailed comparison here: &lt;a href="https://heyrobyn.ai/compare" rel="noopener noreferrer"&gt;heyrobyn.ai/compare&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;50% off for the first 50 signups. I built this to solve my own problem — if it helps you too, that's a win.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub notifications + Slack + email = 2 hours/day lost to context switching&lt;/li&gt;
&lt;li&gt;Tried email routing, Slack integrations, browser tabs — all failed&lt;/li&gt;
&lt;li&gt;Built a native macOS unified inbox in SwiftUI (50 MB RAM vs 1.2 GB Electron)&lt;/li&gt;
&lt;li&gt;Used GitHub API's &lt;code&gt;reason&lt;/code&gt; field to auto-prioritize notifications&lt;/li&gt;
&lt;li&gt;All data stays on-device (no cloud server)&lt;/li&gt;
&lt;li&gt;Cut triage time from 90 min → 30 min/day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're handling 100+ GitHub notifications weekly, this might resonate. If not, stick with your current setup — no shame in browser tabs if they work for you.&lt;/p&gt;

&lt;p&gt;What's your notification triage workflow? Would love to hear what's working (or not working) for you.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>github</category>
      <category>devtools</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I Replaced 5 Mac Apps With One Unified Inbox — Here's What Happened</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Tue, 10 Mar 2026 20:10:23 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/i-replaced-5-mac-apps-with-one-unified-inbox-heres-what-happened-dcl</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/i-replaced-5-mac-apps-with-one-unified-inbox-heres-what-happened-dcl</guid>
      <description>&lt;h2&gt;
  
  
  The Breaking Point
&lt;/h2&gt;

&lt;p&gt;It was 2 PM on a Tuesday. I had 23 browser tabs open, 5 apps running, and I'd just missed a critical GitHub PR comment because it was buried in my Slack notifications while I was reading email in Mail.app.&lt;/p&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;Here's what my "productivity setup" looked like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mail.app&lt;/strong&gt; for email (3 accounts, endless tabs)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack desktop&lt;/strong&gt; for team communication (4 workspaces)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub notifications&lt;/strong&gt; in Chrome (always 20+ unread)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calendar.app&lt;/strong&gt; for meetings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes.app&lt;/strong&gt; for quick captures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each app had its own window, its own notifications, its own keyboard shortcuts. I was spending more time &lt;strong&gt;managing my tools&lt;/strong&gt; than actually working.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried First: The Electron Wrapper Route
&lt;/h2&gt;

&lt;p&gt;My first instinct was to find an "all-in-one" solution. I tried:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shift&lt;/strong&gt; — Beautiful UI, but it's essentially Chrome with tabs. RAM usage: 1.2GB for 3 email accounts + Slack. My 2020 MacBook Air was not happy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wavebox&lt;/strong&gt; — Same story. Electron wrapper around web apps. Battery life dropped from 8 hours to 4 hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rambox&lt;/strong&gt; — Open source, which I loved, but still Electron. My fans kicked in every time Slack refreshed.&lt;/p&gt;

&lt;p&gt;The pattern was clear: &lt;strong&gt;wrapping web apps in Electron doesn't solve the fundamental problem&lt;/strong&gt;. You're still running multiple full Chrome instances, just in one window.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lightbulb Moment: What If It Was Actually Native?
&lt;/h2&gt;

&lt;p&gt;I'm a developer. I've built SwiftUI apps before. And one day, frustrated with my 8th tab in Shift, I thought:&lt;/p&gt;

&lt;p&gt;"What if I just... built a real Mac app?"&lt;/p&gt;

&lt;p&gt;Not a wrapper. Not a web view container. A &lt;strong&gt;native macOS unified inbox&lt;/strong&gt; that treats email, Slack, and GitHub as first-class data sources — not embedded web pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building HeyRobyn: The Technical Approach
&lt;/h2&gt;

&lt;p&gt;Here's what I learned building a native unified inbox:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. SwiftUI Performance Is Real
&lt;/h3&gt;

&lt;p&gt;My first prototype replaced Shift entirely. Memory usage dropped from &lt;strong&gt;1.2GB to 50MB&lt;/strong&gt;. Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Chromium runtime&lt;/li&gt;
&lt;li&gt;No duplicate JavaScript engines&lt;/li&gt;
&lt;li&gt;Native macOS rendering (Metal-accelerated)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. macOS Gives You Superpowers
&lt;/h3&gt;

&lt;p&gt;Things that are hard in Electron are &lt;strong&gt;free&lt;/strong&gt; in SwiftUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Menubar integration&lt;/strong&gt; — One icon for everything, not 5 in the dock&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notification center&lt;/strong&gt; — Real macOS notifications, not web push hacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; — System-level bindings, not JavaScript listeners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iCloud sync&lt;/strong&gt; — Apple handles it, you just use CloudKit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Privacy-First Architecture
&lt;/h3&gt;

&lt;p&gt;Because it's native, I could design for &lt;strong&gt;on-device everything&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email parsed locally (no server)&lt;/li&gt;
&lt;li&gt;Slack messages cached in local SQLite&lt;/li&gt;
&lt;li&gt;GitHub data encrypted at rest&lt;/li&gt;
&lt;li&gt;Zero telemetry by default (Apple App Store rules enforce this)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. The Unified Inbox UX
&lt;/h3&gt;

&lt;p&gt;The magic isn't just performance — it's &lt;strong&gt;one mental model&lt;/strong&gt; for all your communication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inbox (Cmd+1)
├─ Email thread from Sarah
├─ Slack message from #engineering
├─ GitHub PR comment from @alex
└─ Calendar reminder: Standup in 10min
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything sorted by &lt;strong&gt;time&lt;/strong&gt;, not by &lt;strong&gt;tool&lt;/strong&gt;. You process your work chronologically, not by jumping between apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results: 4 Months In
&lt;/h2&gt;

&lt;p&gt;I've been using HeyRobyn (that's what I named it) as my daily driver since November. Here's what changed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;7 apps in my dock&lt;/li&gt;
&lt;li&gt;3 separate notification centers (macOS, Slack, browser)&lt;/li&gt;
&lt;li&gt;2GB RAM for communication tools&lt;/li&gt;
&lt;li&gt;4-5 hours battery life&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 menubar icon&lt;/li&gt;
&lt;li&gt;1 unified notification stream&lt;/li&gt;
&lt;li&gt;50MB RAM&lt;/li&gt;
&lt;li&gt;7-8 hours battery life&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The unexpected benefit:&lt;/strong&gt; I'm &lt;strong&gt;less distracted&lt;/strong&gt;. When everything's in one chronological feed, I process it in batches (like email) instead of reactively switching apps every 3 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm Launching It Publicly (March 18)
&lt;/h2&gt;

&lt;p&gt;For 4 months, this was my personal tool. But every time I screenshared in a Zoom call, someone asked: "What app is that?"&lt;/p&gt;

&lt;p&gt;So I'm launching &lt;strong&gt;HeyRobyn&lt;/strong&gt; publicly in 7 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native macOS app (SwiftUI, not Electron)&lt;/li&gt;
&lt;li&gt;Email + Slack + GitHub in one unified inbox&lt;/li&gt;
&lt;li&gt;Privacy-first (all data on-device)&lt;/li&gt;
&lt;li&gt;50% off early access (50 spots left)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're tired of juggling Mail.app, Slack, and GitHub notifications, join the waitlist: &lt;strong&gt;&lt;a href="https://heyrobyn.ai" rel="noopener noreferrer"&gt;heyrobyn.ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Learnings for Developers
&lt;/h2&gt;

&lt;p&gt;If you're building a Mac app, here are the key decisions that made this possible:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SwiftUI over AppKit&lt;/strong&gt; — Faster development, modern reactive model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CloudKit for sync&lt;/strong&gt; — Don't roll your own backend if you can avoid it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combine for state management&lt;/strong&gt; — Apple's reactive framework pairs perfectly with SwiftUI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MailKit for email&lt;/strong&gt; — Apple's official email framework (new in macOS 14)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket for Slack RTM&lt;/strong&gt; — Real-time messages without polling&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The One Thing I'd Do Differently
&lt;/h2&gt;

&lt;p&gt;I should have launched 2 months ago. Building in private is fun, but &lt;strong&gt;you learn 10x faster when real users are breaking your app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're building a Mac productivity tool, don't wait for perfection. Ship early, get feedback, iterate.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you're curious about the SwiftUI architecture or want to chat about Mac app development, I'm &lt;a href="https://twitter.com/heyrobyn" rel="noopener noreferrer"&gt;@heyrobyn&lt;/a&gt; on Twitter or you can reach me through the waitlist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.P.S.&lt;/strong&gt; Yes, I'm still using Electron apps for some things (VS Code, Slack when I need screen sharing). But for &lt;strong&gt;reading and processing&lt;/strong&gt; communication, native is the way.&lt;/p&gt;

</description>
      <category>mac</category>
      <category>productivity</category>
      <category>swiftui</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Why We Chose SwiftUI Over Electron for Our Mac App</title>
      <dc:creator>Nic Luther</dc:creator>
      <pubDate>Tue, 10 Mar 2026 19:08:42 +0000</pubDate>
      <link>https://dev.to/nic_luther_e29bc02b683c55/why-we-chose-swiftui-over-electron-for-our-mac-app-3gkj</link>
      <guid>https://dev.to/nic_luther_e29bc02b683c55/why-we-chose-swiftui-over-electron-for-our-mac-app-3gkj</guid>
      <description>&lt;h2&gt;
  
  
  The Performance Difference Is Staggering
&lt;/h2&gt;

&lt;p&gt;When we started building HeyRobyn, our native Mac unified inbox for email, Slack, and GitHub, we faced a critical architectural decision: should we build with Electron (like most modern desktop apps) or go native with SwiftUI?&lt;/p&gt;

&lt;p&gt;The performance numbers made the choice clear:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: 50MB (SwiftUI) vs 500MB+ (typical Electron app)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: Instant vs 3-5 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU usage&lt;/strong&gt;: Minimal vs constant background activity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery impact&lt;/strong&gt;: Native efficiency vs noticeable drain&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why SwiftUI Made Sense for HeyRobyn
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Native Scrolling and Gestures
&lt;/h3&gt;

&lt;p&gt;One of the first things users notice about HeyRobyn is how it &lt;em&gt;feels&lt;/em&gt; like a real Mac app. That's because it is. SwiftUI gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buttery-smooth scrolling powered by macOS's optimized rendering engine&lt;/li&gt;
&lt;li&gt;Native keyboard shortcuts that respect system preferences&lt;/li&gt;
&lt;li&gt;Proper support for trackpad gestures (pinch to zoom, swipe navigation)&lt;/li&gt;
&lt;li&gt;System-level integration (Touch Bar, notifications, Spotlight)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Privacy-First Architecture
&lt;/h3&gt;

&lt;p&gt;We built HeyRobyn with a core principle: all your data stays on your device. No cloud sync, no server-side processing. SwiftUI made this natural because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Direct access to macOS security features (Keychain, App Sandbox)&lt;/li&gt;
&lt;li&gt;No web server running in the background (unlike Electron's Chromium)&lt;/li&gt;
&lt;li&gt;Native file system access with proper permissions&lt;/li&gt;
&lt;li&gt;Encrypted storage using Apple's security frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Your MacBook's Fans Will Thank You
&lt;/h3&gt;

&lt;p&gt;Electron apps are notorious for spinning up fans and draining batteries. We've all had that meeting where your laptop sounds like a jet engine because Slack and VS Code are fighting for resources.&lt;/p&gt;

&lt;p&gt;With SwiftUI, HeyRobyn runs at 50MB RAM — less than a single Chrome tab. Your system monitor will barely register it's running.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenges We Faced
&lt;/h2&gt;

&lt;p&gt;Building native isn't all rainbows. Here's what we had to work through:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;: SwiftUI is relatively new (2019) compared to web technologies. Finding solutions to niche problems meant diving into Apple's documentation rather than Stack Overflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Platform-specific&lt;/strong&gt;: We can only support macOS. If we wanted to ship on Windows or Linux, we'd need to rebuild from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fewer third-party libraries&lt;/strong&gt;: The npm ecosystem dwarfs Swift Package Manager. We built more components from scratch than we would have with Electron.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It's Worth It
&lt;/h2&gt;

&lt;p&gt;Seven days until launch, and we're confident we made the right choice. When users try HeyRobyn, the first thing they notice isn't the features — it's how &lt;em&gt;fast&lt;/em&gt; and &lt;em&gt;native&lt;/em&gt; it feels.&lt;/p&gt;

&lt;p&gt;In 2026, most developers are wrapping websites in Electron and calling them desktop apps. We went the other direction. We built a real Mac app that respects your hardware, your privacy, and your time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HeyRobyn launches March 18, 2026.&lt;/strong&gt; First 50 waitlist signups get 50% off forever ($0.50/month). Join at &lt;a href="https://heyrobyn.ai" rel="noopener noreferrer"&gt;heyrobyn.ai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building in public, shipping fast. Follow our journey at &lt;a href="https://twitter.com/heyrobyn" rel="noopener noreferrer"&gt;@heyrobyn&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>swift</category>
      <category>electron</category>
    </item>
  </channel>
</rss>
