<?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: Hung Pham</title>
    <description>The latest articles on DEV Community by Hung Pham (@codeonholiday).</description>
    <link>https://dev.to/codeonholiday</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4081246%2F7302aaef-d5a7-4ffd-b2e9-bded9b7283ef.png</url>
      <title>DEV Community: Hung Pham</title>
      <link>https://dev.to/codeonholiday</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codeonholiday"/>
    <language>en</language>
    <item>
      <title>I Used AI to Build a Native macOS Meeting Reminder</title>
      <dc:creator>Hung Pham</dc:creator>
      <pubDate>Mon, 17 Aug 2026 09:07:05 +0000</pubDate>
      <link>https://dev.to/codeonholiday/i-used-ai-to-build-a-native-macos-meeting-reminder-3f4e</link>
      <guid>https://dev.to/codeonholiday/i-used-ai-to-build-a-native-macos-meeting-reminder-3f4e</guid>
      <description>&lt;p&gt;I used AI to build a native macOS app because I kept missing meetings.&lt;/p&gt;

&lt;p&gt;Not because I wanted to make an AI demo. I wanted a small tool that would interrupt me at the right moment, show me what was next, and let me join without opening three different apps.&lt;/p&gt;

&lt;p&gt;That tool became &lt;a href="https://codeonholiday.com/meetly/" rel="noopener noreferrer"&gt;Meetly&lt;/a&gt;: a macOS menu bar app with fullscreen meeting reminders, a Quick Panel, one-click joining, and no subscription.&lt;/p&gt;

&lt;p&gt;This is the developer story behind it: where AI accelerated the work, where it confidently made the wrong assumptions, and why the product still needed a human driving the decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the demo
&lt;/h2&gt;

&lt;p&gt;Here is the full workflow in action: staying focused in the terminal, seeing the fullscreen reminder, and joining the meeting without hunting through Calendar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/dOFuKFBh5Ds" rel="noopener noreferrer"&gt;Watch the Meetly demo on YouTube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the failure mode, not the feature list
&lt;/h2&gt;

&lt;p&gt;The initial specification was one sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I am deep in a coding session. My next meeting is about to start. Make it impossible to miss without distracting me for the rest of the day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That led to a deliberately small first version:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read events from macOS Calendar.&lt;/li&gt;
&lt;li&gt;Identify the next meeting.&lt;/li&gt;
&lt;li&gt;Show a fullscreen reminder shortly before it starts.&lt;/li&gt;
&lt;li&gt;Surface the meeting link.&lt;/li&gt;
&lt;li&gt;Let me join, snooze, or dismiss it.&lt;/li&gt;
&lt;li&gt;Stay in the menu bar instead of becoming another Dock window.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI is very good at expanding a vague idea into a list of features. That is also dangerous. If I had accepted every suggestion, Meetly would have become a calendar replacement before it had solved the reason I started it.&lt;/p&gt;

&lt;p&gt;The first product decision was therefore not technical: keep the core loop narrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI helped most
&lt;/h2&gt;

&lt;p&gt;I used AI as a fast pair programmer and reviewer throughout the build.&lt;/p&gt;

&lt;p&gt;It was particularly useful for:&lt;/p&gt;

&lt;h3&gt;
  
  
  Exploring macOS APIs
&lt;/h3&gt;

&lt;p&gt;Calendar access, notification timing, menu bar lifecycle, fullscreen windows, global shortcuts, permissions, and multi-display behavior all have details that are easy to miss.&lt;/p&gt;

&lt;p&gt;AI helped me create small experiments instead of guessing inside the main app. A focused question such as “show the next event from EventKit and handle an event with no meeting URL” produced a much faster starting point than searching through unrelated examples.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turning interaction ideas into state machines
&lt;/h3&gt;

&lt;p&gt;The reminder looks simple, but it has states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scheduled → approaching → visible → joined
                         ↘ snoozed
                         ↘ dismissed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI helped enumerate transitions and edge cases: an event gets deleted, the Mac wakes from sleep, the user changes time zones, a meeting has no link, or two displays reconnect while the reminder is visible.&lt;/p&gt;

&lt;p&gt;That kind of enumeration is one of the highest-leverage uses of AI in app development. It does not replace design, but it makes invisible states visible earlier.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generating repetitive UI and test scaffolding
&lt;/h3&gt;

&lt;p&gt;Once the behavior was clear, AI was useful for the boring parts: view structure, model transformations, previews, test data, error messages, and refactors.&lt;/p&gt;

&lt;p&gt;The important constraint was to ask for small changes. “Build Meetly” is a bad prompt. “Add a pure function that maps an event into a reminder state, then write tests for missing links and past events” is much easier to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI was confidently wrong
&lt;/h2&gt;

&lt;p&gt;AI-generated code often looked plausible before it was run.&lt;/p&gt;

&lt;p&gt;The most common problems were not syntax errors. They were product and platform assumptions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Treating a menu bar app like a normal Dock application.&lt;/li&gt;
&lt;li&gt;Assuming a notification behaves the same across focus modes and displays.&lt;/li&gt;
&lt;li&gt;Forgetting that Calendar access is permissioned and can be revoked.&lt;/li&gt;
&lt;li&gt;Using a convenient API without considering its behavior after sleep/wake.&lt;/li&gt;
&lt;li&gt;Adding a cloud-backed architecture to a feature that should stay local.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fix was a tight loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask AI for a small implementation or experiment.&lt;/li&gt;
&lt;li&gt;Run it on a real Mac.&lt;/li&gt;
&lt;li&gt;Test the uncomfortable cases.&lt;/li&gt;
&lt;li&gt;Read the generated code line by line.&lt;/li&gt;
&lt;li&gt;Keep, rewrite, or discard it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI reduced typing. It did not remove verification.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture stayed intentionally boring
&lt;/h2&gt;

&lt;p&gt;Meetly is a native macOS menu bar app. Its central data flow is intentionally small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;macOS Calendar / Reminders
              ↓
       local event model
              ↓
     reminder + Quick Panel
              ↓
       join / snooze / dismiss
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app does not need a cloud calendar database to solve its core problem. Calendar data stays on the Mac. Optional cross-Mac sync uses the user’s own iCloud container rather than a codeonholiday backend.&lt;/p&gt;

&lt;p&gt;That architecture was a product decision as much as a privacy decision. Fewer services mean fewer things to deploy, monitor, authenticate, and explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Quick Panel came from using the first version
&lt;/h2&gt;

&lt;p&gt;The fullscreen reminder solved the urgent problem: do not miss the call.&lt;/p&gt;

&lt;p&gt;Using it exposed a second problem: I also needed to plan the time between calls.&lt;/p&gt;

&lt;p&gt;That became the Quick Panel. It shows what is next, supports a live countdown, and can stay pinned above other windows without opening Calendar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faoqdxe3oy8ab80ltomzi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faoqdxe3oy8ab80ltomzi.webp" alt="Meetly Quick Panel showing upcoming meetings" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was a useful reminder that AI can help implement a roadmap, but usage creates the roadmap. The best next feature was not the one an assistant generated. It was the friction I encountered after the first version shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would do differently
&lt;/h2&gt;

&lt;p&gt;If I built Meetly again, I would add real-device testing earlier.&lt;/p&gt;

&lt;p&gt;Desktop apps have environment-dependent behavior that a clean development session hides: permission changes, multiple monitors, sleep and wake, Focus modes, calendar refresh delays, and links from different conferencing providers.&lt;/p&gt;

&lt;p&gt;I would also define the product boundaries earlier. AI naturally suggests integrations and features. Saying “not now” is an engineering skill when building with an always-available idea generator.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;Meetly now does one job well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let me focus until a meeting actually matters, then give me an interruption I cannot miss.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The free version includes fullscreen reminders, a menu bar view, one monitored calendar, quick join, snooze, and the Quick Panel. Pro adds unlimited calendars, Apple Reminders, quiet hours, screen-share privacy, and iCloud sync across Macs. It is a one-time purchase, not a subscription.&lt;/p&gt;

&lt;p&gt;If you want to see the finished app, &lt;a href="https://codeonholiday.com/meetly/" rel="noopener noreferrer"&gt;Meetly is free to download for macOS 14+&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The larger lesson for me is simple: AI made the build loop faster, but the product still came from choosing a real problem, rejecting unnecessary complexity, testing on real hardware, and taking responsibility for every behavior that ships.&lt;/p&gt;




&lt;p&gt;If you are using AI to build a native desktop app, I would love to hear what it gets wrong most often in your workflow.&lt;/p&gt;

</description>
      <category>swift</category>
      <category>productivity</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
