<?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: Miura Acoustic</title>
    <description>The latest articles on DEV Community by Miura Acoustic (@miura_acoustic_s1pro).</description>
    <link>https://dev.to/miura_acoustic_s1pro</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%2F4233352%2F754d9076-d7f8-4060-9f62-d980bb72aa13.jpg</url>
      <title>DEV Community: Miura Acoustic</title>
      <link>https://dev.to/miura_acoustic_s1pro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/miura_acoustic_s1pro"/>
    <language>en</language>
    <item>
      <title>Neumorphism vs. Glassmorphism: I Had AI Build Both for My App, Then Picked Glass</title>
      <dc:creator>Miura Acoustic</dc:creator>
      <pubDate>Mon, 09 Nov 2026 13:51:40 +0000</pubDate>
      <link>https://dev.to/miura_acoustic_s1pro/neumorphism-vs-glassmorphism-i-had-ai-build-both-for-my-app-then-picked-glass-5dkj</link>
      <guid>https://dev.to/miura_acoustic_s1pro/neumorphism-vs-glassmorphism-i-had-ai-build-both-for-my-app-then-picked-glass-5dkj</guid>
      <description>&lt;p&gt;Hi, I'm Shu.&lt;/p&gt;

&lt;p&gt;I'm building &lt;strong&gt;Memotori&lt;/strong&gt;, an on-device transcription and summary app, for both Mac and Windows. Almost all of the code is written by AI (Claude).&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;1.1.1&lt;/strong&gt;, I gave the app a completely new look: frosted glass, with your desktop showing through, blurred, behind the window. In other words, &lt;strong&gt;glassmorphism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I didn't pick glass right away, though. I had the AI build prototypes of both &lt;strong&gt;neumorphism&lt;/strong&gt; and &lt;strong&gt;glassmorphism&lt;/strong&gt;, used them side by side, and only then decided. This post is about how that went.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why: the app looked "just like the default"
&lt;/h2&gt;

&lt;p&gt;Until now, Memotori mostly used the operating system's standard controls as they were. Nothing wrong with them for everyday use, but lined up as store screenshots, it looked plain.&lt;/p&gt;

&lt;p&gt;So I wanted a more modern look. Two styles came up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neumorphism&lt;/strong&gt;: controls in the same color as the background, with a light shadow on one side and a dark shadow on the other, so they look pressed out of clay. You read it by its shadows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glassmorphism&lt;/strong&gt;: translucent panels stacked on a blurred background, like frosted glass. You read it by its transparency, blur, and bright edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Glass was actually my first idea. But my first version was too timid: on Mac, the OS sidebar and toolbar already look like glass, so only a few hand-painted parts would change; on Windows, only the sidebar and the summary pane would become frosted glass. The AI made browser mock-ups for me, and next to the current app they &lt;strong&gt;barely looked different&lt;/strong&gt;. So I dropped it.&lt;/p&gt;

&lt;p&gt;Next I asked, "What about neumorphism?" The AI pushed back before building anything, for four reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is the same color as the background and lifted only by shadows, so the difference between what you can click and what you can't is small. Not great for an app where pressing the wrong thing (start/stop recording) matters.&lt;/li&gt;
&lt;li&gt;On a dark background the shadows nearly disappear, so dark mode loses the 3D effect.&lt;/li&gt;
&lt;li&gt;The app is built from the OS's standard controls, so buttons, inputs, and lists would all have to be redrawn. A lot of work.&lt;/li&gt;
&lt;li&gt;It tends to break with screen readers and high-contrast mode.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also suggested a middle ground: add a soft shadow to just the record button.&lt;/p&gt;

&lt;p&gt;I still liked the look, so I compared mock-ups of "everything" and "just the record button." To my surprise, &lt;strong&gt;the full version looked better&lt;/strong&gt;. Comparing in words wasn't going to settle it, so I decided to &lt;strong&gt;actually build it&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did: two prototypes of the Windows version
&lt;/h2&gt;

&lt;p&gt;The best part of building with AI, I think, is that prototypes are cheap. By hand, even one of these would take days. This time, two rounds of browser mock-ups plus two in-app prototypes, all the way to a decision, took one day (November 8).&lt;/p&gt;

&lt;p&gt;Both prototypes were built in the Windows version, each on its own branch. The one I didn't pick was never merged; I kept the branch as it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  The neumorphism prototype
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Made the background a single color, and built a control that casts a light shadow to the top left and a dark shadow to the bottom right. Buttons sink in while pressed.&lt;/li&gt;
&lt;li&gt;Inputs and checkboxes got a "pressed in" color; list rows became raised cards.&lt;/li&gt;
&lt;li&gt;Fixed glitches (shadows cut off at the edge of a list, small buttons in the corner looking puffy) by showing the AI screenshots.&lt;/li&gt;
&lt;/ol&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%2F9r4m0pv0kn5nwusomip0.jpeg" 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%2F9r4m0pv0kn5nwusomip0.jpeg" alt="The neumorphism prototype (light). Each row in the model list is a card raised from the background." width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The neumorphism prototype. Background, cards, and buttons are all the same color, lifted only by shadows.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Behind the scenes, this was harder than expected. Windows UI controls have no built-in way to cast a light shadow and a dark shadow at the same time, so the AI built its own control. First the shadows didn't show up at all, then they were offset, then only the dark one vanished. The cause was different every time: rounded corners clipping the content to their frame, padding shifting the shadows, the blur of the light shadow painting over the dark one. The AI kept taking screenshots and fixing things until it finally came together.&lt;/p&gt;

&lt;h3&gt;
  
  
  The glassmorphism prototype
&lt;/h3&gt;

&lt;p&gt;Once the neumorphism version was in shape, I built glass on a separate branch. This time, not the timid version: I asked for "not just a see-through background — make the buttons and everything translucent too, for a modern feel."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Changed the window background to show the desktop behind it, blurred. Cards, buttons, and inputs became translucent panels with bright edges.&lt;/li&gt;
&lt;li&gt;Edges catch the light at the top left and fade toward the bottom right; panels are slightly brighter at the top.&lt;/li&gt;
&lt;li&gt;Made the transparency adjustable in settings.&lt;/li&gt;
&lt;/ol&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%2Fqzbkcve2kpwdx5dxfwex.jpeg" 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%2Fqzbkcve2kpwdx5dxfwex.jpeg" alt="The glassmorphism prototype (light). The wallpaper behind the window shows through, blurred, across the whole window." width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The glass prototype. The colors of the wallpaper show through the whole window, blurred.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands-on: why glass won
&lt;/h2&gt;

&lt;p&gt;Side by side, neumorphism had real strengths.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's unusual.&lt;/strong&gt; A screen where everything is the same color and rises out of the background through shadows alone is something you rarely see in other apps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At a glance, buttons were easier to find than with glass.&lt;/strong&gt; They clearly stick out, so I knew where to click right away. The AI's worry that clickable controls would be hard to tell apart didn't hold up when I actually used it.&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%2Fdszygizvm0gz5ebacymq.jpeg" 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%2Fdszygizvm0gz5ebacymq.jpeg" alt="The neumorphism prototype (dark). Wide gaps are left around each row to make room for the shadows." width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Neumorphism in dark mode. Notice how much space the shadows take up between rows.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I still passed on it, for two reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shadows waste space.&lt;/strong&gt; To look raised, every control needs room around it for its shadow. Rows and buttons spread out, and less fits in the same window. During the prototype, I even had to widen the gaps further just to stop the shadows from being cut off at the edges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It felt a little clunky.&lt;/strong&gt; For all its novelty, the overall impression was slightly dated and heavy.&lt;/p&gt;

&lt;p&gt;Glass just puts translucent panels on the background, so it doesn't need any extra space. It looks clean and simple, and it goes the same direction operating systems and other apps are heading right now. So I went with glass.&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%2F1347gs36d1sx7h3xdaab.jpeg" 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%2F1347gs36d1sx7h3xdaab.jpeg" alt="The glassmorphism prototype (dark). Each row in the model list is a translucent panel with a bright edge." width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Glass in dark mode. Rows stay close together, and the light on their edges still shows their shapes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I wrote the decision into the spec (spec 0019), including why neumorphism was rejected. The neumorphism prototype stays on its own branch, unmerged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small decisions along the way
&lt;/h2&gt;

&lt;p&gt;The details I settled while trying things out went into the spec too.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corner radius: 12 for cards, 6 for buttons and inputs.&lt;/strong&gt; At 8 or more, checkboxes turned into circles and looked like radio buttons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In light mode, the bottom-right edge gets a faint shadow color.&lt;/strong&gt; On a bright background, a white edge alone made the panel's outline disappear.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transcript lines are not panels.&lt;/strong&gt; There are many of them, and a panel per line was too busy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Users choose the transparency.&lt;/strong&gt; Settings has a "Background transparency" slider (0–100, default 50), because the more you see through, the harder text can be to read over a bright wallpaper. Even at maximum, a little color is always laid on top so text stays readable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where to put the color overrides.&lt;/strong&gt; The neumorphism prototype taught us that color overrides placed in the app-wide settings didn't reach the controls. With glass, we loaded them in the window and in dialogs from the start. Building two prototypes paid off here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No blur-strength setting.&lt;/strong&gt; The prototype offered "strong / light" blur, but Windows doesn't let you set the blur radius, and switching between its two kinds barely changed anything. A setting that does nothing shouldn't exist, so I removed it.&lt;/li&gt;
&lt;/ul&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%2Fy2oi8ums5u65slb6d1wi.jpeg" 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%2Fy2oi8ums5u65slb6d1wi.jpeg" alt="The settings screen with background transparency at 0 (left) and 100 (right). At 100 the colors of the wallpaper clearly show through." width="800" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Background transparency: 0 (nearly opaque) on the left, 100 (most transparent) on the right. It changes the moment you move the slider.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The same look on Mac
&lt;/h2&gt;

&lt;p&gt;Based on that spec, the Mac version got the same look. Different OS, though, so not everything carries over as is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On Mac, toolbar buttons already sit inside the OS's own glass frame. Stacking another panel on top was too much, so they keep the OS look.&lt;/li&gt;
&lt;li&gt;Pickers and menus can't be restyled, so they stay standard.&lt;/li&gt;
&lt;li&gt;The record start/stop buttons became translucent red.&lt;/li&gt;
&lt;/ul&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%2Fftl5bl51mcjy78a4n5km.jpeg" 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%2Fftl5bl51mcjy78a4n5km.jpeg" alt="The Mac version with glass (dark): the transcript and summary panes are translucent." width="800" height="500"&gt;&lt;/a&gt;&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%2Ftb53w47l4u7duzs08ypg.jpeg" 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%2Ftb53w47l4u7duzs08ypg.jpeg" alt="The Mac version with glass (light)" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Store screenshots of the Mac version: dark on top, light below.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Writing these per-platform differences into the spec means that later, nobody has to wonder, "Windows does this differently — is that a bug or on purpose?" (I wrote about how the specs are organized in my previous dev log.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What went wrong
&lt;/h2&gt;

&lt;p&gt;To be honest, bugs showed up after release.&lt;/p&gt;

&lt;p&gt;On Windows, &lt;strong&gt;switching between light and dark could crash the whole app&lt;/strong&gt;. The custom glass background was calling the OS in the wrong order. On top of that, &lt;strong&gt;text stayed pale white in light mode&lt;/strong&gt; and was hard to read.&lt;/p&gt;

&lt;p&gt;Both happened because I polished the prototype in dark mode and didn't test switching to light enough. When changing how an app looks, I should have been much more deliberate about testing every combination of light/dark and bright/dark wallpapers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I took away
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;When in doubt, build both.&lt;/strong&gt; With AI, prototypes are cheap. Using them showed me things screenshots can't. I only noticed how much space the shadows take once they were in the real app. And the AI's worry about clickable controls turned out not to be a problem in practice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down why you said no.&lt;/strong&gt; If I ever want neumorphism again six months from now, the reason I dropped it is in the spec, and I won't have to build the same prototype twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern is fine, but keep it readable.&lt;/strong&gt; Glass shows what's behind it, so some wallpapers make text harder to read. That's why transparency is adjustable and why transcript lines aren't panels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Memotori 1.1.1
&lt;/h2&gt;

&lt;p&gt;Finally, let me introduce Memotori 1.1.1, which ships with this new look.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fresh, frosted-glass look. You can adjust the background transparency in settings.&lt;/li&gt;
&lt;li&gt;Choose your appearance: system, light, or dark.&lt;/li&gt;
&lt;li&gt;Silent stretches are no longer transcribed, so words that were never said are less likely to appear.&lt;/li&gt;
&lt;li&gt;Lines the app isn't sure it heard correctly are shown faded, so they're easy to check.&lt;/li&gt;
&lt;li&gt;Recording keeps going even if your microphone or earphones switch mid-recording.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transcription and summaries run entirely on your device. Your audio and transcripts never leave it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mac (App Store): &lt;a href="https://apps.apple.com/app/memotori/id6814051112?pt=359959&amp;amp;ct=devto-design-en&amp;amp;mt=8" rel="noopener noreferrer"&gt;https://apps.apple.com/app/memotori/id6814051112?pt=359959&amp;amp;ct=devto-design-en&amp;amp;mt=8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Windows (Microsoft Store): &lt;a href="https://apps.microsoft.com/detail/9N7KPTFRFX2M?cid=devto-design-en" rel="noopener noreferrer"&gt;https://apps.microsoft.com/detail/9N7KPTFRFX2M?cid=devto-design-en&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Questions, bug reports, and requests on Discord: &lt;a href="https://discord.gg/rrH2DnJJjr" rel="noopener noreferrer"&gt;https://discord.gg/rrH2DnJJjr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Previous dev logs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@miu.aco.software/i-built-an-on-device-transcription-app-for-mac-and-windows-with-ai-without-touching-the-code-9fe58001361a" rel="noopener noreferrer"&gt;I Built an On-Device Transcription App for Mac and Windows with AI — Without Touching the Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@miu.aco.software/one-week-of-promoting-my-indie-app-the-real-numbers-and-two-traps-i-fell-into-9c2d69c76926" rel="noopener noreferrer"&gt;One Week of Promoting My Indie App: The Real Numbers, and Two Traps I Fell Into&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@miu.aco.software/how-i-keep-the-mac-and-windows-versions-of-my-app-in-sync-when-ai-writes-the-code-one-home-for-the-eabfbe0a504f" rel="noopener noreferrer"&gt;How I Keep the Mac and Windows Versions of My App in Sync When AI Writes the Code: One Home for the Specs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on Medium (link added once the Medium story is live).&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ui</category>
      <category>design</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Keep the Mac and Windows Versions of My App in Sync When AI Writes the Code: One Home for the Specs</title>
      <dc:creator>Miura Acoustic</dc:creator>
      <pubDate>Sun, 08 Nov 2026 09:09:31 +0000</pubDate>
      <link>https://dev.to/miura_acoustic_s1pro/how-i-keep-the-mac-and-windows-versions-of-my-app-in-sync-when-ai-writes-the-code-one-home-for-the-541e</link>
      <guid>https://dev.to/miura_acoustic_s1pro/how-i-keep-the-mac-and-windows-versions-of-my-app-in-sync-when-ai-writes-the-code-one-home-for-the-541e</guid>
      <description>&lt;p&gt;Hi, I'm Shu.&lt;/p&gt;

&lt;p&gt;I'm building &lt;strong&gt;Memotori&lt;/strong&gt;, an on-device transcription and summary app, for both Mac and Windows. Almost all of the code is written by AI (Claude).&lt;/p&gt;

&lt;p&gt;I just shipped &lt;strong&gt;1.1.0&lt;/strong&gt; on both platforms. It's the first release where the Mac and Windows versions got the same features, with the same wording.&lt;/p&gt;

&lt;p&gt;What made that possible wasn't how the code was written. It was &lt;strong&gt;giving the specs a single home&lt;/strong&gt;. In this post I'll show how that works, with the real files. I hope it helps anyone building an app for more than one OS with AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: two versions slowly drifting apart
&lt;/h2&gt;

&lt;p&gt;The Mac version (Swift) and the Windows version (C#) live in separate repositories. At first, I asked the AI to "add this feature" in each repository separately.&lt;/p&gt;

&lt;p&gt;Little by little, they drifted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same feature had different button labels on each platform&lt;/li&gt;
&lt;li&gt;A bug fixed on one side was still there on the other&lt;/li&gt;
&lt;li&gt;I forgot that some features existed on only one side&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI only knows the repository it has open. Whatever we decided for the other version, it only knows if I explain it every time. And I forget to explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did: a spec folder that sits outside both versions
&lt;/h2&gt;

&lt;p&gt;I created a shared working folder above the two repositories, with a &lt;code&gt;spec/&lt;/code&gt; folder for specs that apply to both.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Memotori/
├── Memotori-mac/   ← Mac repository
├── Memotori-win/   ← Windows repository
├── spec/           ← specs shared by both versions
├── releases/       ← release notes shared by both
└── CLAUDE.md       ← working rules for the AI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI works in this folder, so it sees both codebases and the specs at once.&lt;/p&gt;

&lt;p&gt;Inside &lt;code&gt;spec/&lt;/code&gt; there are four parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;features/&lt;/strong&gt; — the current spec, one file per feature&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;changes/&lt;/strong&gt; — numbered change proposals (0001, 0002…), with the background and what changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;differences.md&lt;/strong&gt; — what we deliberately don't align, or haven't aligned yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ideas.md&lt;/strong&gt; — ideas that aren't specs yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is separating "the current spec" from "change proposals." I want to keep each proposal with the discussion behind it. But when I just want to know how things work today, rereading ten proposals is painful. So once a proposal ships on both platforms, I rewrite the current spec in &lt;code&gt;features/&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flow for adding a feature
&lt;/h2&gt;

&lt;p&gt;The working rules live in &lt;code&gt;CLAUDE.md&lt;/code&gt;, which the AI reads every time. Adding a feature goes like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the spec first.&lt;/strong&gt; Copy the template into &lt;code&gt;changes/&lt;/code&gt;, give it a number, and add a row to the status table.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ship it on both versions.&lt;/strong&gt; If we stop with only one side done, say so in the status table and the spec.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One PR per platform.&lt;/strong&gt; Each PR mentions the spec number (e.g. spec 0008).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After merging,&lt;/strong&gt; update the spec's status and the table, and rewrite the current spec in &lt;code&gt;features/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The spec template is just this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# NNNN Feature name&lt;/span&gt;

| Platform | Status | PR |
|---|---|---|
| macOS | Not started | — |
| Windows | Not started | — |

&lt;span class="gu"&gt;## Background       why we're adding it&lt;/span&gt;
&lt;span class="gu"&gt;## Spec             what it does, and how it behaves&lt;/span&gt;
&lt;span class="gu"&gt;## Wording          on-screen text in Japanese and English&lt;/span&gt;
&lt;span class="gu"&gt;## Settings         what each setting is called on Mac and on Windows&lt;/span&gt;
&lt;span class="gu"&gt;## Differences      what can't be aligned, and why&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What worked 1: write the UI text in the spec, in both languages
&lt;/h2&gt;

&lt;p&gt;This helped the most. Button labels and messages go into the spec's "Wording" table, &lt;strong&gt;in both Japanese and English&lt;/strong&gt;. The implementation uses that text as-is.&lt;/p&gt;

&lt;p&gt;That way, the AI doesn't invent wording on the spot, and the Mac and Windows button labels stopped drifting.&lt;/p&gt;

&lt;p&gt;Some words do change by OS, though. Where the Mac says "this Mac," Windows says "this PC." So I made &lt;strong&gt;one substitution table&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this PC → this Mac&lt;/li&gt;
&lt;li&gt;File Explorer → Finder&lt;/li&gt;
&lt;li&gt;Recycle Bin → Trash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Specs are written with the Windows words, and the Mac version substitutes them using this table.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worked 2: say clearly when something is one-sided
&lt;/h2&gt;

&lt;p&gt;The status table records, for every feature, whether it's "Not started / In progress / Done / Won't do" on Mac and on Windows.&lt;/p&gt;

&lt;p&gt;"Won't do" matters too. For example, one bug fix (spec 0016) was marked "Won't do (the check doesn't exist there)" for Windows, because Windows never had that check in the first place. Writing down the reason means that six months later, I won't wonder, "Did we forget this on Windows?"&lt;/p&gt;

&lt;p&gt;The same goes for bug fixes. When we fix something on one side, we check whether the other side has the same bug. That's also a rule in &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What worked 3: keep the release notes in the shared folder too
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;releases/1.1.0.md&lt;/code&gt; lists the specs included in the release, plus the "What's New" text for the stores in Japanese and English. Both stores use exactly the same text.&lt;/p&gt;

&lt;h2&gt;
  
  
  What didn't work
&lt;/h2&gt;

&lt;p&gt;To be honest, there are still holes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting to update the status.&lt;/strong&gt; The headline feature of 1.1.0, to-dos (spec 0008), is on both platforms and already shipped. But when I looked back while writing this post, the status table still said "Not started." Neither I nor the AI had done the "update the status" step after merging. Even with a system in place, that last rewrite is easy to miss. Now I cross-check the status table whenever I write the release notes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writing specs takes effort.&lt;/strong&gt; Writing a spec even for small changes felt like a chore at first. But when I talk it through with the AI at the spec stage, the "what happens in this case?" questions come up early. There's less rework after implementation, so overall I think it's faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memotori 1.1.0, built this way
&lt;/h2&gt;

&lt;p&gt;Finally, let me introduce Memotori 1.1.0, built with this process. Ten specs, 0004 through 0013, shipped on both Mac and Windows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can now pull to-dos out of your meetings and check them off as you go.&lt;/strong&gt; Suggested to-dos aren't added to your list automatically; you review them first.&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%2Fuypkqdqnylux9l7rsnj3.jpeg" 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%2Fuypkqdqnylux9l7rsnj3.jpeg" alt="Suggested to-dos extracted from a transcript, with due-date suggestions and the lines they came from" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Press "Extract To-dos" on a transcript and suggestions appear on the right. Phrases like "by next Friday" become suggested due dates. (The screenshot shows the Japanese UI.)&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%2Fv3b7nfknb80fd6ocpjme.jpeg" 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%2Fv3b7nfknb80fd6ocpjme.jpeg" alt="The to-do list across meetings" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Added to-dos go into one list across all your meetings, sorted by due date.&lt;/p&gt;

&lt;p&gt;Other changes in this release:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summaries and to-dos now live in a pane on the right, with copy, delete, and stop in its header.&lt;/li&gt;
&lt;li&gt;Rename recordings in your history, and keep the meeting date and time separately.&lt;/li&gt;
&lt;li&gt;Choose the microphone and language right on the recording screen. Speakers are now identified after you stop recording.&lt;/li&gt;
&lt;li&gt;If your selected microphone can't be found, you can pick another one and start recording.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transcription and summaries run entirely on your device. Your audio and transcripts never leave it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mac (App Store): &lt;a href="https://apps.apple.com/app/memotori/id6814051112?pt=359959&amp;amp;ct=devto-en&amp;amp;mt=8" rel="noopener noreferrer"&gt;https://apps.apple.com/app/memotori/id6814051112?pt=359959&amp;amp;ct=devto-en&amp;amp;mt=8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Windows (Microsoft Store): &lt;a href="https://apps.microsoft.com/detail/9N7KPTFRFX2M?cid=devto-en" rel="noopener noreferrer"&gt;https://apps.microsoft.com/detail/9N7KPTFRFX2M?cid=devto-en&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Questions, bug reports, and requests on Discord: &lt;a href="https://discord.gg/rrH2DnJJjr" rel="noopener noreferrer"&gt;https://discord.gg/rrH2DnJJjr&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Previous dev logs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@miu.aco.software/i-built-an-on-device-transcription-app-for-mac-and-windows-with-ai-without-touching-the-code-9fe58001361a" rel="noopener noreferrer"&gt;I Built an On-Device Transcription App for Mac and Windows with AI — Without Touching the Code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@miu.aco.software/one-week-of-promoting-my-indie-app-the-real-numbers-and-two-traps-i-fell-into-9c2d69c76926" rel="noopener noreferrer"&gt;One Week of Promoting My Indie App: The Real Numbers, and Two Traps I Fell Into&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://medium.com/@miu.aco.software/how-i-keep-the-mac-and-windows-versions-of-my-app-in-sync-when-ai-writes-the-code-one-home-for-the-eabfbe0a504f" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>crossplatform</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
