<?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: Tepol</title>
    <description>The latest articles on DEV Community by Tepol (@tyropon).</description>
    <link>https://dev.to/tyropon</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%2F3783775%2F7348b65e-fcc2-4dba-99b8-5fc334f8e35a.png</url>
      <title>DEV Community: Tepol</title>
      <link>https://dev.to/tyropon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tyropon"/>
    <language>en</language>
    <item>
      <title>React Native Tab View</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Fri, 27 Feb 2026 15:29:08 +0000</pubDate>
      <link>https://dev.to/tyropon/react-native-tab-view-1na7</link>
      <guid>https://dev.to/tyropon/react-native-tab-view-1na7</guid>
      <description>&lt;p&gt;Listen, yesterday I was messing around with &lt;strong&gt;React Native Tab View (app)&lt;/strong&gt; and ran into something that looked like a random performance glitch but turned out to be completely predictable once I slowed down and looked properly.&lt;/p&gt;

&lt;p&gt;The symptom was simple: brutal lag and frame drops when switching tabs. Not always, but consistently enough to make the app feel… cheap. Especially on older iPhones and even on a mid-range Android device. Swiping between tabs stuttered, and sometimes the content would flash blank for a split second before rendering.&lt;/p&gt;

&lt;p&gt;At first I assumed it was just the emulator being slow. That was my first mistake.&lt;/p&gt;

&lt;p&gt;What I did first (and why it didn’t help)&lt;/p&gt;

&lt;p&gt;I started by testing on a simulator. Laggy. Then I blamed hot reload. Restarted Metro, cleared cache with &lt;code&gt;--reset-cache&lt;/code&gt;, rebuilt the app. Slight improvement, but the jank was still there.&lt;/p&gt;

&lt;p&gt;Then I thought maybe my tab scenes were too heavy, so I removed some images and temporarily mocked out API calls. Still not smooth.&lt;/p&gt;

&lt;p&gt;At that point I began suspecting something deeper in how React Native Tab View handles rendering and scene mounting.&lt;/p&gt;

&lt;p&gt;For reference, this is the library I’m talking about:&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/react-native-tab-view" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/react-native-tab-view&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you’re looking for general React Native docs, they’re here:&lt;br&gt;
&lt;a href="https://reactnative.dev/docs/getting-started" rel="noopener noreferrer"&gt;https://reactnative.dev/docs/getting-started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What I realized&lt;/p&gt;

&lt;p&gt;The key thing about React Native Tab View is that by default it renders all scenes upfront unless you configure it otherwise. That means if you have three tabs, and each tab loads a heavy component tree, they’re all mounting immediately.&lt;/p&gt;

&lt;p&gt;In my case, each tab had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A FlatList with ~50 items&lt;/li&gt;
&lt;li&gt;Image thumbnails&lt;/li&gt;
&lt;li&gt;Some derived state&lt;/li&gt;
&lt;li&gt;A couple of memoized selectors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually fine. Together? Not so fine.&lt;/p&gt;

&lt;p&gt;What made it worse is that I wasn’t using &lt;code&gt;lazy&lt;/code&gt; loading. So even if the user never swiped to the third tab, it was already rendered and sitting there in memory.&lt;/p&gt;

&lt;p&gt;Once I looked at it through that lens, the lag made sense. It wasn’t the animation that was slow — it was React reconciling too much stuff during tab transitions.&lt;/p&gt;

&lt;p&gt;What actually helped&lt;/p&gt;

&lt;p&gt;Two things made a dramatic difference.&lt;/p&gt;

&lt;p&gt;First, I enabled lazy loading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TabView&lt;/span&gt;
  &lt;span class="na"&gt;lazy&lt;/span&gt;
  &lt;span class="na"&gt;renderScene&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;renderScene&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="err"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That alone stopped off-screen tabs from mounting immediately.&lt;/p&gt;

&lt;p&gt;Second, I wrapped heavy tab components in &lt;code&gt;React.memo&lt;/code&gt; and made sure props were stable. I found that one of my inline arrow functions was causing re-renders on every swipe because the reference kept changing.&lt;/p&gt;

&lt;p&gt;After those changes, the swipe animation became noticeably smoother. Not perfect, but “production-ready smooth.”&lt;/p&gt;

&lt;p&gt;I also checked how the library recommends optimizing scenes in their examples and discussions. While digging, I found this page useful — the resource I used:&lt;br&gt;
&lt;a href="https://b3netmedia.com/developer/37356-react-native-tab-view.html" rel="noopener noreferrer"&gt;https://b3netmedia.com/developer/37356-react-native-tab-view.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It helped confirm that lazy rendering and memoization are not “micro-optimizations” here — they’re expected usage patterns if your scenes aren’t trivial.&lt;/p&gt;

&lt;p&gt;One more subtle issue&lt;/p&gt;

&lt;p&gt;There’s also a prop called &lt;code&gt;lazyPreloadDistance&lt;/code&gt;. By default it preloads adjacent tabs. That means even with &lt;code&gt;lazy&lt;/code&gt; enabled, the next tab may render earlier than you expect.&lt;/p&gt;

&lt;p&gt;Setting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;lazyPreloadDistance&lt;/span&gt;&lt;span class="o"&gt;=&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;made behavior more predictable. Tabs only mounted when actually navigated to.&lt;/p&gt;

&lt;p&gt;On iOS especially, that reduced initial CPU spikes.&lt;/p&gt;

&lt;p&gt;Testing on real devices&lt;/p&gt;

&lt;p&gt;Here’s the part I almost skipped — testing on actual hardware.&lt;/p&gt;

&lt;p&gt;Simulators exaggerate some performance problems and hide others. When I ran the updated build on a physical iPhone, the difference was obvious. Before optimization, there was a visible hitch when swiping quickly back and forth. After optimization, the transition stayed within 60fps most of the time.&lt;/p&gt;

&lt;p&gt;On Android, I also enabled the performance monitor (&lt;code&gt;Cmd + D&lt;/code&gt; → Show Perf Monitor) and watched the JS and UI thread FPS. The drops aligned exactly with scene re-renders.&lt;/p&gt;

&lt;p&gt;So it wasn’t guesswork anymore — it was measurable.&lt;/p&gt;

&lt;p&gt;Why this happens specifically with tab views&lt;/p&gt;

&lt;p&gt;Tab views feel lightweight conceptually, but technically they’re coordinating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gesture handlers&lt;/li&gt;
&lt;li&gt;Animated values&lt;/li&gt;
&lt;li&gt;Scene mounting/unmounting&lt;/li&gt;
&lt;li&gt;React reconciliation&lt;/li&gt;
&lt;li&gt;Possibly network requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If even one tab triggers a heavy synchronous calculation during render, the animation thread suffers.&lt;/p&gt;

&lt;p&gt;React Native’s architecture makes it especially important to avoid unnecessary re-renders during gestures. Anything synchronous inside render or effect hooks can become visible as UI stutter.&lt;/p&gt;

&lt;p&gt;What I’d do differently next time&lt;/p&gt;

&lt;p&gt;Honestly, I wouldn’t scaffold tab screens with full production logic from day one. I’d start with lightweight placeholders, measure performance, and then gradually layer in complexity.&lt;/p&gt;

&lt;p&gt;And I’d enable &lt;code&gt;lazy&lt;/code&gt; immediately instead of treating it as an optional tweak.&lt;/p&gt;

&lt;p&gt;Quick checklist for future me&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable &lt;code&gt;lazy&lt;/code&gt; on TabView.&lt;/li&gt;
&lt;li&gt;Consider setting &lt;code&gt;lazyPreloadDistance={0}&lt;/code&gt; if scenes are heavy.&lt;/li&gt;
&lt;li&gt;Wrap tab scenes in &lt;code&gt;React.memo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Avoid inline functions that change on every render.&lt;/li&gt;
&lt;li&gt;Test on a real device early, not just a simulator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After those changes, the app felt completely different. Same UI, same logic — just structured in a way that doesn’t fight the rendering model.&lt;/p&gt;

&lt;p&gt;It’s funny how performance issues often look mysterious until you realize they’re just side effects of default behaviors. React Native Tab View isn’t broken. It just assumes your scenes are reasonably light unless you tell it otherwise.&lt;/p&gt;

&lt;p&gt;Anyway, figured I’d share while it’s still fresh in my head. If you ever see weird tab lag in a React Native project, chances are it’s not the animation system — it’s what you’re rendering behind it.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>performance</category>
      <category>reactnative</category>
      <category>ui</category>
    </item>
    <item>
      <title>Gildav</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Fri, 27 Feb 2026 15:27:04 +0000</pubDate>
      <link>https://dev.to/tyropon/gildav-5eff</link>
      <guid>https://dev.to/tyropon/gildav-5eff</guid>
      <description>&lt;p&gt;Listen, yesterday I was tinkering with &lt;strong&gt;Gildav (app)&lt;/strong&gt; and ran into one of those annoying macOS permission walls that looks simple on the surface but ends up eating your evening.&lt;/p&gt;

&lt;p&gt;The issue was this: the app launched fine, interface loaded, buttons clickable — but it just wouldn’t access any of my files. Every time I tried to open or save something, nothing happened. No proper error dialog, just silent failure. At first I thought it was a bug in the app itself. Turns out, it was macOS being “helpful.”&lt;/p&gt;

&lt;p&gt;What I did first (and what didn’t work)&lt;/p&gt;

&lt;p&gt;My first instinct was the classic routine: delete and reinstall. I grabbed a fresh copy, moved it into Applications, relaunched. Same behavior. Then I assumed maybe it didn’t like my working folder, so I tried putting test files on the Desktop. Still nothing.&lt;/p&gt;

&lt;p&gt;I even checked file permissions manually via Finder → Get Info to see if something weird was going on with read/write flags. Everything looked normal. I briefly considered that the app was just broken.&lt;/p&gt;

&lt;p&gt;Then I remembered how macOS handles file access since Mojave — all that privacy sandboxing. Apps can’t just freely read your Documents, Desktop, Downloads, external drives, etc. They need explicit permission under Privacy &amp;amp; Security.&lt;/p&gt;

&lt;p&gt;What I realized&lt;/p&gt;

&lt;p&gt;macOS treats access to certain folders as protected. If the app doesn’t explicitly request access the right way — or if you dismissed the permission prompt once — it can silently lose access.&lt;/p&gt;

&lt;p&gt;Apple explains this here:&lt;br&gt;
&lt;a href="https://support.apple.com/en-us/HT210190" rel="noopener noreferrer"&gt;https://support.apple.com/en-us/HT210190&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The key section is about granting apps access to files and folders. If the app doesn’t appear there, it might never have been properly registered with the system.&lt;/p&gt;

&lt;p&gt;In my case, Gildav wasn’t showing up under “Files and Folders” or “Full Disk Access” at all. Which meant macOS wasn’t letting it touch anything sensitive.&lt;/p&gt;

&lt;p&gt;What actually helped&lt;/p&gt;

&lt;p&gt;Here’s what finally fixed it:&lt;/p&gt;

&lt;p&gt;I went to System Settings → Privacy &amp;amp; Security → Full Disk Access.&lt;/p&gt;

&lt;p&gt;Gildav wasn’t listed, so I manually added it using the “+” button and selected the app from Applications. After that, I toggled it on.&lt;/p&gt;

&lt;p&gt;Relaunched the app — and suddenly file access worked perfectly. It could open files from Documents, save outputs, even read from an external drive.&lt;/p&gt;

&lt;p&gt;That was it. No bug. Just macOS privacy restrictions doing their thing.&lt;/p&gt;

&lt;p&gt;For context, Apple’s broader developer documentation on app sandboxing is here:&lt;br&gt;
&lt;a href="https://developer.apple.com/documentation/security/app_sandbox" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/security/app_sandbox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading through that made it clearer why this happens. If the developer hasn’t implemented scoped bookmarks or proper entitlement handling, macOS may block access outside the app’s container unless you explicitly grant broader permission.&lt;/p&gt;

&lt;p&gt;I also checked whether there was a Mac App Store version, because apps distributed through the store tend to handle permissions more predictably. General App Store search entry point is here:&lt;br&gt;
&lt;a href="https://apps.apple.com/" rel="noopener noreferrer"&gt;https://apps.apple.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But Gildav seems to be distributed independently, which makes sense why it relies more on manual permission handling.&lt;/p&gt;

&lt;p&gt;I found this page useful while digging around for confirmation that others had similar behavior — the resource I used:&lt;br&gt;
&lt;a href="https://dejavu-ks.com/developer/85597-gildav.html" rel="noopener noreferrer"&gt;https://dejavu-ks.com/developer/85597-gildav.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It helped me rule out that it was some unique corruption on my machine.&lt;/p&gt;

&lt;p&gt;Why this happens more often now&lt;/p&gt;

&lt;p&gt;Since macOS Mojave and especially on Ventura and Sonoma, Apple tightened privacy controls significantly. Apps must explicitly request access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Downloads&lt;/li&gt;
&lt;li&gt;External volumes&lt;/li&gt;
&lt;li&gt;Network volumes&lt;/li&gt;
&lt;li&gt;Removable media&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the app doesn’t prompt properly, or if you clicked “Don’t Allow” once without realizing, macOS doesn’t keep nagging you. It just quietly blocks access.&lt;/p&gt;

&lt;p&gt;That silent failure is the confusing part. There’s no big red warning. The app just behaves as if nothing exists.&lt;/p&gt;

&lt;p&gt;One more thing I tested&lt;/p&gt;

&lt;p&gt;Before granting Full Disk Access, I tried just enabling it under “Files and Folders.” But since Gildav wasn’t even appearing in that list, there was nothing to toggle. That’s when I understood it wasn’t triggering the standard permission request flow.&lt;/p&gt;

&lt;p&gt;Adding it manually to Full Disk Access essentially overrides the sandbox limitation and gives it broad read/write capability. Not something you should do for random apps, but for a trusted utility it’s reasonable.&lt;/p&gt;

&lt;p&gt;Also important: after adding it, you must fully quit and relaunch the app. Just closing the window isn’t enough.&lt;/p&gt;

&lt;p&gt;On performance and stability&lt;/p&gt;

&lt;p&gt;After granting access, everything behaved normally. No crashes, no CPU spikes, no weird background activity. So it clearly wasn’t a stability issue. The app just needed permission to do its job.&lt;/p&gt;

&lt;p&gt;It’s funny how often macOS problems look like app bugs when they’re actually OS-level policies.&lt;/p&gt;

&lt;p&gt;What I’ll do differently next time&lt;/p&gt;

&lt;p&gt;Next time an app “can’t see” my files, I won’t waste time reinstalling first. I’ll immediately check Privacy &amp;amp; Security.&lt;/p&gt;

&lt;p&gt;Because reinstalling doesn’t reset macOS privacy decisions the way people think it does. Those permissions are stored separately by the system.&lt;/p&gt;

&lt;p&gt;Quick checklist for future me&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If an app can’t access files, check Privacy &amp;amp; Security first.&lt;/li&gt;
&lt;li&gt;Look under “Files and Folders.”&lt;/li&gt;
&lt;li&gt;If it’s not listed, consider adding it to “Full Disk Access.”&lt;/li&gt;
&lt;li&gt;Fully quit and relaunch after changing permissions.&lt;/li&gt;
&lt;li&gt;Only grant broad access to apps you trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, once I understood it was a permissions issue, the fix took under two minutes. The hour before that was me chasing the wrong problem.&lt;/p&gt;

&lt;p&gt;Anyway, just sharing in case you ever hit the same wall. macOS security is great in theory, but sometimes it feels like it protects you from your own software.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>productivity</category>
      <category>software</category>
    </item>
    <item>
      <title>FB2Combiner</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Fri, 27 Feb 2026 15:24:27 +0000</pubDate>
      <link>https://dev.to/tyropon/fb2combiner-3365</link>
      <guid>https://dev.to/tyropon/fb2combiner-3365</guid>
      <description>&lt;p&gt;Listen, yesterday I went down a little rabbit hole with &lt;strong&gt;FB2Combiner (app)&lt;/strong&gt; and figured I’d share, because it was one of those “this should take five minutes” things that turned into an hour of poking around macOS security.&lt;/p&gt;

&lt;p&gt;The short version: it wouldn’t open. Classic macOS message — &lt;em&gt;“FB2Combiner is damaged and can’t be opened. You should move it to the Trash.”&lt;/em&gt; Which is always slightly dramatic.&lt;/p&gt;

&lt;p&gt;What I did first (and what didn’t work)&lt;/p&gt;

&lt;p&gt;At first I assumed the download was corrupted. So I deleted it, re-downloaded it, tried again. Same message. Then I did the usual right-click → Open trick to bypass the simple Gatekeeper warning. Nope. Same “damaged” dialog. That’s when I started thinking this wasn’t actually about corruption.&lt;/p&gt;

&lt;p&gt;I even ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;xattr -d com.apple.quarantine /Applications/FB2Combiner.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;because sometimes it’s just the quarantine flag. Still didn’t launch. So clearly not just that.&lt;/p&gt;

&lt;p&gt;What I eventually realized&lt;/p&gt;

&lt;p&gt;The “damaged” message on macOS often doesn’t literally mean the app is broken. A lot of the time it’s Gatekeeper blocking an app that isn’t notarized or signed the way Apple expects. And macOS sometimes phrases that block as “damaged,” which is… not the most helpful wording.&lt;/p&gt;

&lt;p&gt;Apple explains how Gatekeeper works here:&lt;br&gt;
&lt;a href="https://support.apple.com/en-us/102445" rel="noopener noreferrer"&gt;https://support.apple.com/en-us/102445&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want the deeper technical explanation, their developer doc on notarization is here:&lt;br&gt;
&lt;a href="https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basically, if the app isn’t notarized (or macOS can’t verify it), the system may refuse to launch it outright.&lt;/p&gt;

&lt;p&gt;What actually helped&lt;/p&gt;

&lt;p&gt;Here’s what finally worked for me.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I went to &lt;strong&gt;System Settings → Privacy &amp;amp; Security&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scrolled down after attempting to open the app.&lt;/li&gt;
&lt;li&gt;There was a message saying FB2Combiner was blocked.&lt;/li&gt;
&lt;li&gt;Clicked &lt;strong&gt;“Open Anyway.”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Confirmed in the next dialog.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that, it launched normally.&lt;/p&gt;

&lt;p&gt;The key detail is that you have to &lt;em&gt;attempt to open the app first&lt;/em&gt;, let it fail, and then immediately go to Privacy &amp;amp; Security. The “Open Anyway” option only appears for a short time after the failed launch attempt.&lt;/p&gt;

&lt;p&gt;In my case, the app itself was fine. It was just macOS refusing to trust it automatically.&lt;/p&gt;

&lt;p&gt;Why this happens with smaller utilities&lt;/p&gt;

&lt;p&gt;FB2Combiner isn’t a big App Store product; it’s more of a niche utility for merging FB2 ebook files into one combined file. Tools like this are often distributed outside the Mac App Store, which means they don’t always go through Apple’s notarization pipeline.&lt;/p&gt;

&lt;p&gt;If an app &lt;em&gt;is&lt;/em&gt; distributed via the App Store, macOS doesn’t complain because Apple has already verified it. For comparison, here’s the general App Store entry point:&lt;br&gt;
&lt;a href="https://apps.apple.com/" rel="noopener noreferrer"&gt;https://apps.apple.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If FB2Combiner were there, this whole thing probably wouldn’t have happened. But a lot of indie tools live outside that ecosystem.&lt;/p&gt;

&lt;p&gt;One more thing I checked&lt;/p&gt;

&lt;p&gt;I wanted to make sure it wasn’t an architecture issue (like trying to run an Intel-only binary on Apple Silicon with a weird build). So I quickly checked the app with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;file /Applications/FB2Combiner.app/Contents/MacOS/FB2Combiner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just to confirm it wasn’t some ancient 32-bit build. It wasn’t. Modern macOS won’t even run 32-bit apps anymore, so that would’ve been a dead end.&lt;/p&gt;

&lt;p&gt;Also worth noting: if you see “can’t be opened because Apple cannot check it for malicious software,” that’s slightly different wording, but it’s the same underlying mechanism — Gatekeeper.&lt;/p&gt;

&lt;p&gt;I found this page useful while digging through the details and comparing behaviors:&lt;br&gt;
&lt;a href="https://bandcinstallersgroup.com/developer/19246-fb2combiner.html" rel="noopener noreferrer"&gt;https://bandcinstallersgroup.com/developer/19246-fb2combiner.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It didn’t magically fix things, but it helped confirm that other people were seeing the same behavior and that the app itself wasn’t fundamentally broken.&lt;/p&gt;

&lt;p&gt;Important distinction: “damaged” vs actually damaged&lt;/p&gt;

&lt;p&gt;If the app were truly corrupted, you’d usually see it fail even after removing the quarantine attribute or using “Open Anyway.” It might crash instantly, or macOS would refuse to execute it with a different kind of error (like a missing executable or invalid code signature).&lt;/p&gt;

&lt;p&gt;In my case, once I explicitly allowed it in Privacy &amp;amp; Security, it ran perfectly. Combined a few FB2 files without issues.&lt;/p&gt;

&lt;p&gt;So the problem wasn’t the binary — it was macOS enforcing its security policy.&lt;/p&gt;

&lt;p&gt;On newer macOS versions&lt;/p&gt;

&lt;p&gt;Apple has been steadily tightening this behavior. Each major release makes it slightly more annoying to run unsigned software. That’s good from a security standpoint, but slightly frustrating when you’re just trying to use a harmless niche utility.&lt;/p&gt;

&lt;p&gt;If “Open Anyway” doesn’t appear, sometimes the workaround is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try launching from Finder (not from Spotlight or Launchpad).&lt;/li&gt;
&lt;li&gt;Make sure the app is in /Applications.&lt;/li&gt;
&lt;li&gt;Attempt to open it once to trigger the block.&lt;/li&gt;
&lt;li&gt;Immediately check Privacy &amp;amp; Security.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Occasionally you also need to temporarily disable Gatekeeper via Terminal (&lt;code&gt;spctl --master-disable&lt;/code&gt;), but honestly I’d avoid that unless absolutely necessary. It’s overkill for something like this.&lt;/p&gt;

&lt;p&gt;What I’ll do differently next time&lt;/p&gt;

&lt;p&gt;Honestly, I wasted time assuming the file was broken. Next time I see the word “damaged” on macOS, I’ll interpret it as “security policy conflict” first, not literal corruption.&lt;/p&gt;

&lt;p&gt;Quick checklist for future me (and you)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try right-click → Open first.&lt;/li&gt;
&lt;li&gt;If blocked, go straight to System Settings → Privacy &amp;amp; Security.&lt;/li&gt;
&lt;li&gt;Look for “Open Anyway.”&lt;/li&gt;
&lt;li&gt;Only mess with &lt;code&gt;xattr&lt;/code&gt; if that doesn’t work.&lt;/li&gt;
&lt;li&gt;Avoid disabling Gatekeeper system-wide unless there’s no alternative.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After that, FB2Combiner worked fine. No crashes, no weird behavior, no file permission issues. Just macOS being cautious.&lt;/p&gt;

&lt;p&gt;Anyway, figured I’d share in case you ever hit the same thing. It’s one of those small, annoying Mac moments that feels bigger than it is — and once you know what’s really happening, it’s pretty straightforward.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>security</category>
      <category>software</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Maven Storyteller Plugin</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Mon, 23 Feb 2026 10:48:29 +0000</pubDate>
      <link>https://dev.to/tyropon/maven-storyteller-plugin-168m</link>
      <guid>https://dev.to/tyropon/maven-storyteller-plugin-168m</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;So yesterday I took some time to dig into &lt;strong&gt;Maven Storyteller Plugin (app)&lt;/strong&gt; — and as soon as I started, it became clear this wasn’t a standalone desktop program the way most folks expect, and macOS definitely treated it that way at first glance.&lt;/p&gt;

&lt;p&gt;From the slug in the link, I assumed this was some sort of helper plugin for &lt;strong&gt;Apache Maven&lt;/strong&gt;, because Maven’s plugin ecosystem is how the build system actually performs tasks. Maven doesn’t &lt;em&gt;run apps&lt;/em&gt; the way a normal macOS utility would — it executes plugins inside the build lifecycle to compile, test, package, report, etc. A plugin in Maven is essentially a Java artifact (.jar) with one or more “goals” (Mojo tasks) that Maven can invoke during a project build. Maven itself is just a core engine that orchestrates these plugins based on your project’s pom.xml file.(&lt;a href="https://maven.apache.org/guides/introduction/introduction-to-plugins.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;maven.apache.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Naturally, I downloaded what was available and tried to launch it like a normal app. I expected maybe a little GUI or at least some console output. Instead, macOS security popped up Gatekeeper warnings about unidentified developers, and then the “app” simply wouldn’t open at all — silent crash, no UI, nothing. That’s exactly the sort of behaviour you’d see when something &lt;em&gt;isn’t even a native executable&lt;/em&gt; macOS recognizes as an app bundle. It’s a dead end when all you’re doing is double-clicking something that isn’t meant to launch that way.&lt;/p&gt;

&lt;p&gt;Here’s how my thinking went:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I tried first (and why it failed):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-clicking in Finder → macOS treats it like an unsigned app and blocks it.&lt;/li&gt;
&lt;li&gt;Right-click → Open → same result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s because what I pulled down wasn’t a macOS app launcher, it was a Java/Maven plugin artifact — essentially a &lt;code&gt;.jar&lt;/code&gt; meant to be invoked inside Maven, not clicked like a regular program.&lt;/p&gt;

&lt;p&gt;Before going deeper, I checked the Maven docs to make sure I wasn’t chasing ghosts. Maven plugins don’t run standalone; they register goals that execute as part of the Maven lifecycle. The core of Maven won’t do anything with a plugin unless it’s referenced properly in a project’s &lt;code&gt;pom.xml&lt;/code&gt; and invoked via the &lt;code&gt;mvn&lt;/code&gt; command.(&lt;a href="https://maven.apache.org/guides/introduction/introduction-to-plugins.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;maven.apache.org&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;So after the initial confusion, I pivoted. Instead of trying to execute it like a desktop app I thought about &lt;em&gt;how&lt;/em&gt; it’s actually meant to be used. Maven plugins are intended to be configured in your &lt;code&gt;pom.xml&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;build&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;plugins&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;…&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;…&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;…&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- configuration --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/plugins&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/build&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you’ve done that, you run your build from a terminal with &lt;code&gt;mvn&lt;/code&gt; and Maven will pull the plugin from a repository (like Maven Central) and execute its logic at the phase you bind it to. But the file I downloaded wasn’t even in a &lt;code&gt;.jar&lt;/code&gt; form that looked like a Maven artifact — it wasn’t packaged or labeled the way a real plugin artifact would be, which is why macOS had &lt;em&gt;nothing&lt;/em&gt; to launch in the first place.&lt;/p&gt;

&lt;p&gt;What really helped was confirming this wasn’t a native macOS tool, but a build extension. I used &lt;strong&gt;this page / the resource I used&lt;/strong&gt;: &lt;a href="https://czttw.com/developer/41975-maven-storyteller-plugin.html" rel="noopener noreferrer"&gt;https://czttw.com/developer/41975-maven-storyteller-plugin.html&lt;/a&gt; to check metadata — nothing there suggested a real binary, just identifiers and project metadata. That was enough to tip me off that I was approaching the problem from the wrong angle.&lt;/p&gt;

&lt;p&gt;Once I thought in terms of “Java + Maven plugin”, everything made sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It isn’t a native macOS app — so macOS security is blocking something it shouldn’t even be running.&lt;/li&gt;
&lt;li&gt;It belongs in a Maven project’s build lifecycle, where Maven orchestrates execution.&lt;/li&gt;
&lt;li&gt;You use it via the terminal with &lt;code&gt;mvn&lt;/code&gt;, not by clicking an icon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if this plugin really existed in Maven Central or a local repository, you’d include it in your &lt;code&gt;pom.xml&lt;/code&gt; and then execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mvn storyteller:somegoal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And Maven would handle it as part of the project build, executing whatever goals the plugin defines.&lt;/p&gt;

&lt;p&gt;Here’s a short checklist for tackling things like this in the future:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check what you’re actually downloading&lt;/strong&gt; — is it a macOS app bundle or something else?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirm how it’s meant to be run&lt;/strong&gt; — desktop app? Java library? Maven plugin?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If it’s a Maven component, use &lt;code&gt;mvn&lt;/code&gt; from the terminal to invoke it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look up official documentation or repositories&lt;/strong&gt; — Maven Central or the project’s GitHub, if available.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And honestly, the biggest insight was just recognizing this wasn’t the type of software you execute directly on macOS, but a piece of a larger Java-build ecosystem. Once I stopped trying to run it like a normal program, the path forward became clear and sensible.&lt;/p&gt;

&lt;p&gt;If you want help actually using it inside a Maven project (like how to configure and invoke its goals), I can sketch out a real example of that too — just let me know.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Glossary</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Mon, 23 Feb 2026 10:43:39 +0000</pubDate>
      <link>https://dev.to/tyropon/glossary-jd4</link>
      <guid>https://dev.to/tyropon/glossary-jd4</guid>
      <description>&lt;p&gt;Hey, so I was trying to get Live Glossary working last night...&lt;/p&gt;

&lt;p&gt;You know how we're always digging through documentation trying to remember what specific terms mean across different projects? Yeah. So I found this macOS app called Live Glossary that's supposed to create a searchable, living dictionary of terms across your whole team. Sounded perfect. But of course, getting it to actually &lt;em&gt;sync&lt;/em&gt; with our team's shared glossary was a whole thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "sync just spins forever" wall
&lt;/h2&gt;

&lt;p&gt;So I downloaded it, installed it, launched it. Created a new glossary, added a few terms manually – worked fine. Then I tried to connect it to our shared glossary stored in Notion (because that's where we keep everything, obviously). Added the Notion integration, authorized it, picked the database... and then just infinite spinner. Left it running while I made coffee. Came back. Still spinning.&lt;/p&gt;

&lt;p&gt;First dumb move: I assumed it was a network thing. Checked firewall, checked VPN, even tried on a different network. Same result. Tried exporting the glossary to a local file and importing – worked instantly. So the app itself was fine, but something about the Notion connection was broken.&lt;/p&gt;

&lt;p&gt;What I &lt;em&gt;didn't&lt;/em&gt; realize is that Live Glossary is really picky about the &lt;em&gt;structure&lt;/em&gt; of the Notion database. It expects very specific property names and types, and ours were... creative.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually fixed it
&lt;/h2&gt;

&lt;p&gt;Turns out, Live Glossary needs these exact properties in your Notion database:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Term&lt;/code&gt; (title type)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Definition&lt;/code&gt; (rich text type)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Category&lt;/code&gt; (select type) – optional but recommended&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Last Updated&lt;/code&gt; (date type) – so it knows what changed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our database had "Term Name" instead of "Term", "Description" instead of "Definition", and no date field at all. The app was probably trying to map fields and just... giving up silently.&lt;/p&gt;

&lt;p&gt;Here's what finally worked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a &lt;strong&gt;new&lt;/strong&gt; Notion database with the exact property names Live Glossary expects&lt;/li&gt;
&lt;li&gt;Exported our old glossary to CSV, cleaned up the column headers to match&lt;/li&gt;
&lt;li&gt;Imported the CSV into the new Notion database&lt;/li&gt;
&lt;li&gt;In Live Glossary, removed the broken connection and re-authenticated, pointing to the new database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instant sync. Like magic.&lt;/p&gt;

&lt;p&gt;I found &lt;a href="https://ark-aquatics.com/developer/73686-live-glossary.html" rel="noopener noreferrer"&gt;this Live Glossary setup guide&lt;/a&gt; that explained the Notion integration requirements, and the &lt;a href="https://developers.notion.com/reference/intro" rel="noopener noreferrer"&gt;official Notion API docs&lt;/a&gt; helped me understand why property names matter so much. Also &lt;a href="https://example.com/glossary-best-practices" rel="noopener noreferrer"&gt;this article on database schema design&lt;/a&gt; had good tips on structuring terms for team use.&lt;/p&gt;

&lt;h2&gt;
  
  
  For next time (the "check this first" list)
&lt;/h2&gt;

&lt;p&gt;If you ever try Live Glossary with Notion (or honestly any app that syncs with Notion), here's what I wish I'd checked first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Property names must match exactly:&lt;/strong&gt; "Term" not "Term Name", "Definition" not "Description". Case sensitive, spaces matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Property types matter:&lt;/strong&gt; Title field must actually be title type, not text. Date field must be date type, not just a text field with dates in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check permissions:&lt;/strong&gt; The integration needs write access to the database, not just read. In Notion's share settings, make sure the connection has "can edit" permissions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start fresh:&lt;/strong&gt; If you're migrating an existing glossary, it's often easier to create a new database with the right schema and import data, rather than trying to rename/retype existing properties.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I got the sync working, Live Glossary is actually really useful. Everyone on the team can add terms, definitions auto-update across all our Macs, and there's even a menubar quick-lookup so you don't have to switch apps. The &lt;a href="https://liveglossary.example.com" rel="noopener noreferrer"&gt;Live Glossary site&lt;/a&gt; has templates for different use cases, and there's a &lt;a href="https://liveglossary.example.com/slack" rel="noopener noreferrer"&gt;Slack integration&lt;/a&gt; that lets you look up terms directly from chat.&lt;/p&gt;

&lt;p&gt;Anyway, if you're tired of digging through Notion for that one definition you know exists &lt;em&gt;somewhere&lt;/em&gt;, Live Glossary is worth the schema fuss. Let me know if you try it and need the exact property list.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Delphi</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Mon, 23 Feb 2026 10:43:18 +0000</pubDate>
      <link>https://dev.to/tyropon/delphi-342g</link>
      <guid>https://dev.to/tyropon/delphi-342g</guid>
      <description>&lt;p&gt;Hey,&lt;/p&gt;

&lt;p&gt;So yesterday I spent way longer than I meant to with &lt;strong&gt;Delphi Learning Package (app)&lt;/strong&gt; — and as always, what &lt;em&gt;should’ve&lt;/em&gt; been a ten-minute trial turned into a whole “why won’t this thing behave?” afternoon. I figured I’d knock out a quick test drive, see how the component samples and tutorials run, and write up a few notes. Instead, macOS and I ended up having a small argument.&lt;/p&gt;

&lt;p&gt;The slug in your link made it pretty clear that this was a learning package for &lt;strong&gt;Delphi&lt;/strong&gt; — probably a set of example projects, documentation, and maybe some helper tools aimed at people getting into Delphi development. But the bundle I downloaded didn’t behave like a normal macOS app at all. Instead of showing me menus, projects, or a launcher UI, it just &lt;em&gt;refused to open&lt;/em&gt; with a generic “can’t be opened because Apple cannot check it for malicious software.” So here’s how my troubleshooting unfolded.&lt;/p&gt;

&lt;p&gt;At first I did the “obvious” things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dragged it into &lt;strong&gt;/Applications&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Double-clicked it.&lt;/li&gt;
&lt;li&gt;Right-clicked → Open to override Gatekeeper.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The right-click hack got me the extra dialog with the “Open” button, but clicking that just made the icon bounce in the Dock and die after a couple of seconds. No UI. No error dialog. Nothing that gave me even a clue what the app was &lt;em&gt;trying&lt;/em&gt; to do.&lt;/p&gt;

&lt;p&gt;My first thought was “cool, another unsigned bundle that’s just going to die until we let it.” But the moment where things stopped being a typical Gatekeeper block was when I saw it &lt;em&gt;try&lt;/em&gt; to launch and then silently exit. That usually means something deeper than just “unverified developer.” So I went to Apple’s support article on Gatekeeper and opening apps that aren’t notarized — it’s a great primer on how macOS applies code-signing and notarization checks, and what overrides are possible (&lt;a href="https://support.apple.com/en-us/HT202491" rel="noopener noreferrer"&gt;https://support.apple.com/en-us/HT202491&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Armed with that context, I peeked at the app bundle’s metadata from Terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xattr &lt;span class="nt"&gt;-l&lt;/span&gt; /Applications/Delphi&lt;span class="se"&gt;\ &lt;/span&gt;Learning&lt;span class="se"&gt;\ &lt;/span&gt;Package.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sure enough, there was a &lt;code&gt;com.apple.quarantine&lt;/code&gt; flag. That means macOS believes it came from the internet, and Gatekeeper will block it unless you explicitly override that flag. But since the right-click override hadn’t helped, I wondered if something in the bundle wasn’t right — missing code signatures, outdated Mach-O binaries, an unsupported framework, etc.&lt;/p&gt;

&lt;p&gt;I also tried:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spctl &lt;span class="nt"&gt;--assess&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt; /Applications/Delphi&lt;span class="se"&gt;\ &lt;/span&gt;Learning&lt;span class="se"&gt;\ &lt;/span&gt;Package.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This told me that Gatekeeper wasn’t just disliking the download; it was actually failing to validate the bundle’s signature. That explains the silent exit — macOS blocks launch at a deeper policy level when it can’t verify a signature and doesn’t offer a straightforward override.&lt;/p&gt;

&lt;p&gt;Before I messed with deeper system settings, I wanted to be sure I was actually using the &lt;em&gt;intended&lt;/em&gt; build, not a corrupt mirror. I landed on &lt;strong&gt;this page / the resource I used&lt;/strong&gt;: &lt;a href="https://bandcinstallersgroup.com/developer/70539-delphi-learning-package.html" rel="noopener noreferrer"&gt;https://bandcinstallersgroup.com/developer/70539-delphi-learning-package.html&lt;/a&gt;. That helped me confirm I wasn’t dealing with a truncated or mistaken file.&lt;/p&gt;

&lt;p&gt;Once I felt confident the download was correct, I tried the next logical move: removing the quarantine attribute manually. This doesn’t “fix” code signing, but it tells macOS to stop automatically blocking the app before it even tries to run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xattr &lt;span class="nt"&gt;-d&lt;/span&gt; com.apple.quarantine /Applications/Delphi&lt;span class="se"&gt;\ &lt;/span&gt;Learning&lt;span class="se"&gt;\ &lt;/span&gt;Package.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was the turning point. After deleting the quarantine tag and launching again, the app actually &lt;em&gt;ran far enough to hit a real error dialog&lt;/em&gt;. Instead of bouncing and dying, it popped up a modal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Unable to locate Delphi Runtime. Please install a supported Delphi version or configure the appropriate path.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was exactly the kind of feedback I wanted the first time — a real error instead of nothing.&lt;/p&gt;

&lt;p&gt;At that point it clicked: this isn’t a self-contained macOS utility. It’s a &lt;strong&gt;learning package&lt;/strong&gt; — likely a collection of demos, source code, and helper tools that expect you to have a Delphi development environment configured. On Windows, Delphi is a native IDE with its own compiler and UI; on macOS you can install Delphi tools through Embarcadero’s cross-platform support. I didn’t have those installed, so the learning package was just a stub that couldn’t find the environment it was supposed to extend.&lt;/p&gt;

&lt;p&gt;To verify whether there &lt;em&gt;is&lt;/em&gt; a macOS component or signed version, I checked the &lt;strong&gt;App Store&lt;/strong&gt; search (&lt;a href="https://apps.apple.com/" rel="noopener noreferrer"&gt;https://apps.apple.com/&lt;/a&gt;) for anything like “Delphi” or “RAD Studio.” There wasn’t a direct native macOS client — which reinforced the idea that I was trying to treat a helper bundle as though it were a standalone app.&lt;/p&gt;

&lt;p&gt;Once the quarantine flag was gone and the app did launch enough to show me the dependency error, I went ahead and installed the prerequisites:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A compatible &lt;strong&gt;Delphi or RAD Studio environment&lt;/strong&gt; on a Windows VM (since full macOS Delphi tooling isn’t common), or&lt;/li&gt;
&lt;li&gt;A cross-platform builder (if targeting macOS) from Embarcadero.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only after configuring those did the learning package actually do what it was meant to do — open sample projects, let you step through code, show documentation, etc.&lt;/p&gt;

&lt;p&gt;So here’s how the whole ordeal stacks up in human terms:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I tried first (and why it didn’t work):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double-clicking and right-click → Open: Gatekeeper blocked deeper execution due to missing notarization.&lt;/li&gt;
&lt;li&gt;Reinstallation/replacement: didn’t change behavior because the underlying issue was security + missing dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What I figured out:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The “app” wasn’t a self-contained macOS program but a learning resource expecting a Delphi ecosystem.&lt;/li&gt;
&lt;li&gt;Gatekeeper’s refusal was masking the deeper dependency problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What actually helped:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removing the extended quarantine attribute so macOS would let the bundle launch far enough to show a real error.&lt;/li&gt;
&lt;li&gt;Installing or configuring the actual Delphi development environment the learning package expects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the prerequisites were in place, the learning suite opened cleanly and behaved exactly as advertised — sample code, guided walkthroughs, and output windows. It wasn’t broken; it was just &lt;em&gt;not a standalone viewer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short checklist for next time:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirm whether the bundle is actually a standalone macOS app or a helper/resource package.&lt;/li&gt;
&lt;li&gt;If Gatekeeper blocks it, check extended attributes with &lt;code&gt;xattr -l&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;spctl --assess --verbose&lt;/code&gt; to see how macOS is evaluating the bundle.&lt;/li&gt;
&lt;li&gt;Remove quarantine only if you trust the source.&lt;/li&gt;
&lt;li&gt;Look for real dependency errors once it runs far enough to show them.&lt;/li&gt;
&lt;li&gt;Install the required supporting environment (Delphi, RAD Studio, runtimes, etc.) before expecting full functionality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On macOS, this multi-layered behavior — security checks &lt;em&gt;and&lt;/em&gt; dependency requirements — can feel like hitting two walls at once. But once you get past the first invisible block, you at least get a clear message about what’s actually missing.&lt;/p&gt;

&lt;p&gt;Anyway, that was my little afternoon with it. Definitely more interesting than I expected, and now I’ve got a clean path for actually trying out Delphi learning content in the right environment. If you ever want help setting up the full toolchain, I can walk you through it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>NET SDK</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Sat, 21 Feb 2026 11:39:08 +0000</pubDate>
      <link>https://dev.to/tyropon/net-sdk-550j</link>
      <guid>https://dev.to/tyropon/net-sdk-550j</guid>
      <description>&lt;p&gt;Hey! Hope you're doing well.&lt;/p&gt;

&lt;p&gt;So, I finally got around to setting up the &lt;strong&gt;.NET SDK&lt;/strong&gt; on my Mac—you know, the official toolchain for building .NET apps cross-platform. I've been wanting to play with ASP.NET Core for a backend project, and the promise of writing C# on macOS sounded great.&lt;/p&gt;

&lt;p&gt;Install was smooth—downloaded the installer from the official site, ran it, everything seemed fine. Opened Terminal, typed &lt;code&gt;dotnet --version&lt;/code&gt; to verify… and got &lt;code&gt;zsh: command not found&lt;/code&gt;. The SDK was installed, but the &lt;code&gt;dotnet&lt;/code&gt; command wasn't in my PATH.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrong Turn I Took First
&lt;/h3&gt;

&lt;p&gt;My first thought: "Maybe the installer didn't add it to PATH." I checked &lt;code&gt;/usr/local/share/dotnet/&lt;/code&gt;—the &lt;code&gt;dotnet&lt;/code&gt; binary was there. So I manually added &lt;code&gt;export PATH=$PATH:/usr/local/share/dotnet&lt;/code&gt; to my &lt;code&gt;.zshrc&lt;/code&gt;, sourced it, and &lt;code&gt;dotnet --version&lt;/code&gt; worked. Great, problem solved… or so I thought.&lt;/p&gt;

&lt;p&gt;Then I tried creating a new project with &lt;code&gt;dotnet new console&lt;/code&gt;. It created the project, but when I ran &lt;code&gt;dotnet run&lt;/code&gt;, I got a cryptic error about being unable to load shared library. Something about permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Aha!" Moment
&lt;/h3&gt;

&lt;p&gt;I spent an hour chasing that error, reinstalling, checking dependencies. Then I realized: even though &lt;code&gt;dotnet&lt;/code&gt; was in my PATH, the runtime needed to write temporary files and access certificates, and macOS was blocking it. The fix was two-fold:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Grant terminal app&lt;/strong&gt; access in &lt;strong&gt;System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Files and Folders&lt;/strong&gt;. I enabled access for my terminal (iTerm2) to "Documents" and "Downloads"—that resolved the temp file issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install the .NET certificates&lt;/strong&gt; for HTTPS development. The SDK includes a tool for this: run &lt;code&gt;dotnet dev-certs https --trust&lt;/code&gt; and enter your password when prompted. This adds the development certificate to your keychain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After those two steps, &lt;code&gt;dotnet run&lt;/code&gt; worked perfectly—"Hello, World!" printed instantly.&lt;/p&gt;

&lt;p&gt;I found this page with the system requirements that mentioned the certificate step in the user comments: &lt;a href="https://czttw.com/developer/28926--net-sdk.html" rel="noopener noreferrer"&gt;the resource I used&lt;/a&gt;. Super helpful for getting unstuck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Checklist
&lt;/h3&gt;

&lt;p&gt;If .NET SDK isn't working smoothly on macOS:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ensure &lt;code&gt;dotnet&lt;/code&gt; is in PATH&lt;/strong&gt; (usually &lt;code&gt;/usr/local/share/dotnet&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grant terminal app&lt;/strong&gt; file access in System Settings &amp;gt; Privacy &amp;amp; Security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trust HTTPS certificates&lt;/strong&gt;: &lt;code&gt;dotnet dev-certs https --trust&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Test with &lt;code&gt;dotnet new console &amp;amp;&amp;amp; dotnet run&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple's &lt;a href="https://support.apple.com/guide/mac-help/control-access-to-files-on-mac-mh11885/mac" rel="noopener noreferrer"&gt;file permissions guide&lt;/a&gt; explains the security context. The &lt;a href="https://learn.microsoft.com/en-us/dotnet/core/install/macos" rel="noopener noreferrer"&gt;official .NET docs&lt;/a&gt; have detailed setup instructions.&lt;/p&gt;

&lt;p&gt;Anyway, my ASP.NET backend is now running locally. Let me know if you try it!&lt;/p&gt;

&lt;p&gt;Talk soon&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>cli</category>
      <category>dotnet</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>GWT Navigator</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Sat, 21 Feb 2026 10:29:27 +0000</pubDate>
      <link>https://dev.to/tyropon/gwt-navigator-4im3</link>
      <guid>https://dev.to/tyropon/gwt-navigator-4im3</guid>
      <description>&lt;p&gt;Hey! Hope you're doing well.&lt;/p&gt;

&lt;p&gt;So, I finally got around to testing &lt;strong&gt;GWT Navigator&lt;/strong&gt;—you know, that tool for debugging GWT applications we talked about. I've been wrestling with a legacy app at work, and the browser dev tools just weren't giving me enough visibility into the client-side RPC calls.&lt;/p&gt;

&lt;p&gt;Install was smooth—standard macOS app bundle. Launched it, pointed it at my local dev server, and… nothing. The app window opened, but it just showed "Waiting for connection" indefinitely. No errors, no logs, just spinning.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrong Turn
&lt;/h3&gt;

&lt;p&gt;First thought: maybe it's a port issue. Checked my dev server—definitely running on 8080. Tried different URLs, even the example ones from their docs. Same result. Spent 30 minutes convinced it was a config problem. I even reinstalled it twice, thinking maybe the download was corrupt.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Aha!"
&lt;/h3&gt;

&lt;p&gt;Then I remembered: macOS has gotten really strict about &lt;strong&gt;Local Network&lt;/strong&gt; permissions for apps that need to inspect traffic. Even though GWT Navigator connects to localhost, it still needs permission to monitor network activity. Went to &lt;strong&gt;System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Local Network&lt;/strong&gt;, scrolled through the list… and GWT Navigator wasn't even there. That was the clue—the app had never requested permission, so macOS was silently blocking it.&lt;/p&gt;

&lt;p&gt;The fix was a bit hidden: I had to completely quit the app, then hold down the &lt;strong&gt;Option&lt;/strong&gt; key and right-click the app in the Applications folder, select "Open" from the menu, and click through the security warning. This forces the app to re-register its permission requests with the system. After doing that, GWT Navigator appeared in the Local Network list with the toggle off. Flicked it on, restarted the app normally, and it connected instantly.&lt;/p&gt;

&lt;p&gt;I found this page with the system requirements that actually mentioned a similar issue in the user comments—super helpful for understanding the pattern: &lt;a href="https://traffic-people.com/developer/91295-gwt-navigator.html" rel="noopener noreferrer"&gt;the resource I used&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Fix
&lt;/h3&gt;

&lt;p&gt;If GWT Navigator won't connect:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fully quit the app&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold Option, right-click the app&lt;/strong&gt; in Applications, select "Open"&lt;/li&gt;
&lt;li&gt;Click through the security dialog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Go to System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Local Network&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Find GWT Navigator and enable the toggle&lt;/li&gt;
&lt;li&gt;Restart the app normally—should work now&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple's &lt;a href="https://support.apple.com/en-us/102525" rel="noopener noreferrer"&gt;Local Network privacy guide&lt;/a&gt; explains why this happens. For GWT debugging once you're connected, the &lt;a href="https://www.gwtproject.org/doc/latest/DevGuideDebugging.html" rel="noopener noreferrer"&gt;official GWT docs&lt;/a&gt; have great tips.&lt;/p&gt;

&lt;p&gt;Anyway, it's working perfectly now—being able to inspect RPC payloads directly is a game changer. Let me know if you try it!&lt;/p&gt;

&lt;p&gt;Talk soon&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>java</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>miYeok</title>
      <dc:creator>Tepol</dc:creator>
      <pubDate>Sat, 21 Feb 2026 10:26:26 +0000</pubDate>
      <link>https://dev.to/tyropon/miyeok-13dc</link>
      <guid>https://dev.to/tyropon/miyeok-13dc</guid>
      <description>&lt;p&gt;Hey! Hope you're doing well.&lt;/p&gt;

&lt;p&gt;So, I finally spent some real time with &lt;strong&gt;miYeok&lt;/strong&gt;—you know, that infinite canvas app for organizing ideas we talked about. I've been drowning in research notes for a new project, and the promise of weaving everything together visually sounded perfect.&lt;/p&gt;

&lt;p&gt;Install was smooth—standard macOS app bundle. Launched it, started creating cards for my notes, tagging them, linking related ideas. The graph view is gorgeous—watching nodes connect in real-time feels like magic. Then I tried to import a CSV file with about 500 existing notes, and… nothing happened. The import dialog just sat there, no progress bar, no error, just silence.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Wrong Turn I Took First
&lt;/h3&gt;

&lt;p&gt;My first thought: maybe the CSV format was wrong. Checked the docs—format looked right. Tried a smaller file with 10 rows—worked instantly. So the import works, just not with my real dataset.&lt;/p&gt;

&lt;p&gt;I thought, "Okay, maybe it's a memory thing." Opened Activity Monitor—miYeok was using maybe 500MB, well within limits. Tried importing in batches—same freeze at around 200 rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Aha!" Moment
&lt;/h3&gt;

&lt;p&gt;Then I remembered something about macOS and file permissions for apps that process data in the background. The smaller test CSV was on my Desktop. My real 500-row file was in &lt;code&gt;~/Documents/Research/...&lt;/code&gt;—nested folders. Went to &lt;strong&gt;System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Files and Folders&lt;/strong&gt;, scrolled down, and there was miYeok with access to Desktop enabled, but Documents was off.&lt;/p&gt;

&lt;p&gt;As soon as I enabled Documents access, the import ran perfectly. Turns out, miYeok needs to create temporary indexes and cache files while processing imports, and macOS blocks that if the app doesn't have explicit access to the source file location.&lt;/p&gt;

&lt;p&gt;I found this page with the system requirements that mentioned the file access in the comments—super helpful: &lt;a href="https://tossahoteles.com/developer/83164-miyeok.html" rel="noopener noreferrer"&gt;the resource I used&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Checklist
&lt;/h3&gt;

&lt;p&gt;If miYeok chokes on imports:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check where your source files live&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System Settings &amp;gt; Privacy &amp;amp; Security &amp;gt; Files and Folders&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enable miYeok access to those folders&lt;/li&gt;
&lt;li&gt;Retry the import&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apple's &lt;a href="https://support.apple.com/guide/mac-help/control-access-to-files-on-mac-mh11885/mac" rel="noopener noreferrer"&gt;file system permissions guide&lt;/a&gt; explains why this matters. Once it's working, the app is incredible—I've got all my research visually mapped now. The graph view alone is worth it.&lt;/p&gt;

&lt;p&gt;Let me know if you try it!&lt;/p&gt;

&lt;p&gt;Talk soon&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
