<?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: Fatih Kurt</title>
    <description>The latest articles on DEV Community by Fatih Kurt (@fatihkurtl).</description>
    <link>https://dev.to/fatihkurtl</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%2F1183970%2F788c275f-051d-4433-93be-62e7a16bd3a6.jpeg</url>
      <title>DEV Community: Fatih Kurt</title>
      <link>https://dev.to/fatihkurtl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fatihkurtl"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Fatih Kurt</dc:creator>
      <pubDate>Tue, 26 May 2026 08:08:09 +0000</pubDate>
      <link>https://dev.to/fatihkurtl/-41ii</link>
      <guid>https://dev.to/fatihkurtl/-41ii</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32" class="crayons-story__hidden-navigation-link"&gt;I Built and Shipped TinyHab: an ADHD-Friendly Habit Tracker for iOS&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/fatihkurtl" class="crayons-avatar  crayons-avatar--l  "&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1183970%2F788c275f-051d-4433-93be-62e7a16bd3a6.jpeg" alt="fatihkurtl profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/fatihkurtl" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Fatih Kurt
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Fatih Kurt
                
              
              &lt;div id="story-author-preview-content-3719804" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/fatihkurtl" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1183970%2F788c275f-051d-4433-93be-62e7a16bd3a6.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Fatih Kurt&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32" id="article-link-3719804"&gt;
          I Built and Shipped TinyHab: an ADHD-Friendly Habit Tracker for iOS
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mobile"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mobile&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/flutter"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;flutter&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ios"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ios&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>I Built and Shipped TinyHab: an ADHD-Friendly Habit Tracker for iOS</title>
      <dc:creator>Fatih Kurt</dc:creator>
      <pubDate>Thu, 21 May 2026 19:13:43 +0000</pubDate>
      <link>https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32</link>
      <guid>https://dev.to/fatihkurtl/i-built-and-shipped-tinyhab-an-adhd-friendly-habit-tracker-for-ios-4l32</guid>
      <description>&lt;p&gt;I recently shipped &lt;strong&gt;TinyHab&lt;/strong&gt;, an ADHD-friendly habit tracker for iPhone.&lt;/p&gt;

&lt;p&gt;The idea was simple: most habit apps look clean on day one, but they become stressful the moment you miss a day. I wanted to build something calmer. Something focused on today, small wins, reminders that actually work, and a recovery path when routines fall apart.&lt;/p&gt;

&lt;p&gt;So I built the full product myself: the iOS app, backend, landing page, admin panel, push notifications, subscriptions, App Store setup, and the release process.&lt;/p&gt;

&lt;p&gt;App Store link: &lt;a href="https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917" rel="noopener noreferrer"&gt;https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;TinyHab is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flutter&lt;/strong&gt; for the iOS app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Django&lt;/strong&gt; for the backend API and admin panel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for the database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Auth / Cloud Messaging&lt;/strong&gt; for auth support and push notifications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apple Sign In and Google Sign In&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RevenueCat&lt;/strong&gt; for App Store subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dokploy + Docker&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Django Admin&lt;/strong&gt; for managing users, campaigns, tokens, and notification logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I like this stack because it lets me move fast without giving up structure. Flutter gave me a clean app surface, Django gave me a reliable backend and admin panel, and Firebase/RevenueCat handled the parts that are painful to rebuild from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Wanted the App to Feel Like
&lt;/h2&gt;

&lt;p&gt;TinyHab is not trying to be a loud productivity app.&lt;/p&gt;

&lt;p&gt;I wanted the app to feel quiet and practical. The core flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the app&lt;/li&gt;
&lt;li&gt;See what matters today&lt;/li&gt;
&lt;li&gt;Mark a habit done&lt;/li&gt;
&lt;li&gt;Move on&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No guilt-heavy streak system. No overwhelming dashboard. No complicated setup before the user gets value.&lt;/p&gt;

&lt;p&gt;The app includes habit scheduling, daily progress, reminders, insights, profile settings, App Store subscriptions, home screen widgets, and a small admin system behind the scenes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hardest Part Was Not the UI
&lt;/h2&gt;

&lt;p&gt;The hardest parts were the production details.&lt;/p&gt;

&lt;p&gt;Apple Sign In had to work from both login and registration. Push notification tokens had to be saved correctly after permission was granted. Firebase Cloud Messaging had to be connected to APNs correctly. App Store subscriptions had to sync with the backend. The backend needed enough logging so I could see what actually happened when something failed.&lt;/p&gt;

&lt;p&gt;One example: push notifications were not just "install Firebase and done." I had to handle APNs token timing on iOS, register the FCM token with the backend, store device tokens per user, connect Firebase to the correct APNs key, and test direct backend sends from production.&lt;/p&gt;

&lt;p&gt;When it finally worked, I could send a notification from the admin panel and see it arrive instantly on the device. That was a good moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  App Store Review Was a Real Test
&lt;/h2&gt;

&lt;p&gt;The first submission did not go through.&lt;/p&gt;

&lt;p&gt;Apple rejected the app because the &lt;strong&gt;Continue with Apple&lt;/strong&gt; button was unresponsive in one flow. The login screen was fine, but the registration screen had a button that looked ready and was not wired to the Apple auth flow yet.&lt;/p&gt;

&lt;p&gt;That was a useful reminder: App Review will test the product like a real user, and any visible control needs to work.&lt;/p&gt;

&lt;p&gt;I fixed the Apple Sign In flow, checked the release build again, fixed a few production issues around push token registration and profile plan display, rebuilt the IPA, uploaded a new build, and resubmitted.&lt;/p&gt;

&lt;p&gt;The next review passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Backend Handles
&lt;/h2&gt;

&lt;p&gt;The Django backend is not just a simple auth API.&lt;/p&gt;

&lt;p&gt;It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User accounts and auth sessions&lt;/li&gt;
&lt;li&gt;Habit CRUD&lt;/li&gt;
&lt;li&gt;Habit completions&lt;/li&gt;
&lt;li&gt;Reminder settings&lt;/li&gt;
&lt;li&gt;Device notification tokens&lt;/li&gt;
&lt;li&gt;Push notification campaigns&lt;/li&gt;
&lt;li&gt;Push notification logs&lt;/li&gt;
&lt;li&gt;Daily summaries&lt;/li&gt;
&lt;li&gt;Subscription state&lt;/li&gt;
&lt;li&gt;Legal documents&lt;/li&gt;
&lt;li&gt;Landing page content&lt;/li&gt;
&lt;li&gt;Admin workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also added admin tooling so I can inspect device tokens, see failed push messages, send campaigns, and debug real user issues without guessing.&lt;/p&gt;

&lt;p&gt;That saved a lot of time during launch.&lt;/p&gt;

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

&lt;p&gt;Shipping a real mobile app is mostly about the small details that do not show up in screenshots.&lt;/p&gt;

&lt;p&gt;The UI matters, but production readiness matters more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does Apple Sign In work in every auth flow?&lt;/li&gt;
&lt;li&gt;Does the app still work after a fresh install?&lt;/li&gt;
&lt;li&gt;Are push tokens saved after permission changes?&lt;/li&gt;
&lt;li&gt;Can the backend send to the latest device token?&lt;/li&gt;
&lt;li&gt;Can I see why a push failed?&lt;/li&gt;
&lt;li&gt;Does the App Store build match the version I think I uploaded?&lt;/li&gt;
&lt;li&gt;Does the landing page point to the live App Store URL?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are exciting individually, but together they decide whether the app feels real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built TinyHab
&lt;/h2&gt;

&lt;p&gt;I built TinyHab because I wanted a habit tracker that is easier to come back to after a bad day.&lt;/p&gt;

&lt;p&gt;Most habit apps are optimized for perfect consistency. TinyHab is designed for imperfect consistency: missed days, low energy, friction, and restarting without shame.&lt;/p&gt;

&lt;p&gt;That product direction shaped both the design and the engineering. The app needed to be simple on the surface, but reliable underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This was a full-stack mobile build from zero to App Store approval.&lt;/p&gt;

&lt;p&gt;I worked across Flutter, Django, Firebase, APNs, RevenueCat, Docker deployment, admin tooling, and App Store Connect. The result is now live on the App Store, and I am continuing to improve it based on real usage.&lt;/p&gt;

&lt;p&gt;If you are building a mobile app, my biggest advice is simple: test the boring production flows early. Login, registration, push notifications, subscriptions, release builds, and admin visibility are where most launch problems hide.&lt;/p&gt;

&lt;p&gt;TinyHab is live here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917" rel="noopener noreferrer"&gt;https://apps.apple.com/app/tinyhab-adhd-habit-tracker/id6770136917&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>flutter</category>
      <category>ios</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Most Framework Comparisons Ignore What Actually Matters in Production</title>
      <dc:creator>Fatih Kurt</dc:creator>
      <pubDate>Wed, 20 May 2026 13:20:25 +0000</pubDate>
      <link>https://dev.to/fatihkurtl/most-framework-comparisons-ignore-what-actually-matters-in-production-30l5</link>
      <guid>https://dev.to/fatihkurtl/most-framework-comparisons-ignore-what-actually-matters-in-production-30l5</guid>
      <description>&lt;p&gt;Every few weeks, developers compare frameworks again.&lt;/p&gt;

&lt;p&gt;Which one is faster?&lt;br&gt;
Which one has better syntax?&lt;br&gt;
Which one has the cleanest developer experience?&lt;br&gt;
Which one is more “modern”?&lt;/p&gt;

&lt;p&gt;I used to care about these comparisons a lot. As a full stack developer, I tried Go, FastAPI, Next.js, NestJS, Fiber, Elysia and several other tools because I thought choosing the newest stack would make my projects better.&lt;/p&gt;

&lt;p&gt;After building real projects, client work, internal tools, mobile backends and SaaS experiments, my opinion changed.&lt;/p&gt;

&lt;p&gt;Most framework comparisons focus on the wrong layer.&lt;/p&gt;

&lt;p&gt;They compare hello world performance, request throughput, routing syntax and startup time. Those things matter in some cases, but they are rarely the main reason a product succeeds or fails.&lt;/p&gt;

&lt;p&gt;In production, the problems are usually different.&lt;/p&gt;

&lt;p&gt;Can you deploy it safely?&lt;br&gt;
Can you debug it quickly?&lt;br&gt;
Can you onboard another developer?&lt;br&gt;
Can you find stable packages?&lt;br&gt;
Can you migrate the database without fear?&lt;br&gt;
Can you monitor errors?&lt;br&gt;
Can you maintain the project after six months?&lt;br&gt;
Can the business rely on it?&lt;/p&gt;

&lt;p&gt;That is where boring technology starts to win.&lt;/p&gt;

&lt;p&gt;A simple API endpoint looks similar in almost every framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# FastAPI
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/orders&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_orders&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pending&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same idea in Go Fiber is not fundamentally different.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Go Fiber&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/orders"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="n"&gt;fiber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"completed"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"status"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in .NET, the shape is still the same.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ASP.NET Core&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ApiController&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"api/orders"&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrdersController&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ControllerBase&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IActionResult&lt;/span&gt; &lt;span class="nf"&gt;GetOrders&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Completed"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Pending"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The syntax changes, but the business problem does not.&lt;/p&gt;

&lt;p&gt;Most of the time, the hard part is not writing the endpoint. The hard part is everything around it: authentication, permissions, database modeling, migrations, background jobs, caching, logging, file uploads, payments, admin workflows, SEO, analytics and deployment.&lt;/p&gt;

&lt;p&gt;That is why I stopped treating framework choice as the most important technical decision.&lt;/p&gt;

&lt;p&gt;For example, a boring Django model like this can create more business value than a week spent comparing backend frameworks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Django
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;django.db&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;company_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EmailField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;is_active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BooleanField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto_now_add&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is nothing exciting here. But you immediately get a stable ORM, migrations, validation patterns, admin integration and a mature ecosystem around it.&lt;/p&gt;

&lt;p&gt;That matters when you are building something that needs to survive beyond a weekend project.&lt;/p&gt;

&lt;p&gt;The same thing applies to .NET.&lt;/p&gt;

&lt;p&gt;A lot of people online treat enterprise stacks as boring, but boring is not always a weakness. In many projects, boring means predictable. It means other developers can understand the codebase. It means the deployment story is known. It means companies can maintain it for years.&lt;/p&gt;

&lt;p&gt;This is especially important when the project is not just an experiment.&lt;/p&gt;

&lt;p&gt;A client dashboard, a CMS, a restaurant ordering system, a SaaS backend, an internal CRM or a mobile app API does not need the most exciting stack. It needs a stack that can be maintained without constant drama.&lt;/p&gt;

&lt;p&gt;Deployment is another place where boring tools usually win.&lt;/p&gt;

&lt;p&gt;A simple Docker Compose setup like this is not impressive, but it is practical.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;

  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;postgres_data:/var/lib/postgresql/data&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;postgres_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of setup is boring, but it gives you repeatability. You can run it locally, move it to a server, add monitoring, add backups and understand what is happening when something breaks.&lt;/p&gt;

&lt;p&gt;That is more valuable than people admit.&lt;/p&gt;

&lt;p&gt;Modern tools often look better in demos because demos hide operational cost.&lt;/p&gt;

&lt;p&gt;A new framework can feel amazing when you are building the first endpoint. The routing is clean, the syntax is elegant, the benchmarks are impressive and the documentation looks fresh.&lt;/p&gt;

&lt;p&gt;But the real test comes later.&lt;/p&gt;

&lt;p&gt;What happens when a dependency is abandoned?&lt;br&gt;
What happens when the ORM has edge cases?&lt;br&gt;
What happens when the package you need is half-maintained?&lt;br&gt;
What happens when AI-generated tutorials teach bad practices?&lt;br&gt;
What happens when you need to hire someone?&lt;br&gt;
What happens when you need to debug a production issue at night?&lt;/p&gt;

&lt;p&gt;This is where mature ecosystems have an advantage.&lt;/p&gt;

&lt;p&gt;Not because they are perfect.&lt;/p&gt;

&lt;p&gt;Because their problems are already known.&lt;/p&gt;

&lt;p&gt;Known problems are easier to price, debug and plan around. Unknown problems are expensive because they appear when the project is already under pressure.&lt;/p&gt;

&lt;p&gt;That is the part many developers ignore when comparing frameworks.&lt;/p&gt;

&lt;p&gt;They compare speed, but not maintenance cost.&lt;/p&gt;

&lt;p&gt;They compare syntax, but not ecosystem risk.&lt;/p&gt;

&lt;p&gt;They compare benchmarks, but not hiring difficulty.&lt;/p&gt;

&lt;p&gt;They compare developer experience, but not operational complexity.&lt;/p&gt;

&lt;p&gt;For most business software, the bottleneck is usually not the framework. It is the database design, slow queries, bad caching, unclear requirements, weak deployment process, poor monitoring or missing product distribution.&lt;/p&gt;

&lt;p&gt;A faster router will not fix those problems.&lt;/p&gt;

&lt;p&gt;A newer runtime will not fix a bad data model.&lt;/p&gt;

&lt;p&gt;A cleaner syntax will not make users care about your product.&lt;/p&gt;

&lt;p&gt;That does not mean new technology is bad. I still like trying new tools, and sometimes a newer stack is the right choice. If it reduces complexity, improves performance where it actually matters or gives the product a real advantage, then it is worth considering.&lt;/p&gt;

&lt;p&gt;But “new” by itself is not a strategy.&lt;/p&gt;

&lt;p&gt;Before choosing a stack now, I ask more practical questions.&lt;/p&gt;

&lt;p&gt;Can I ship faster with this?&lt;br&gt;
Can I maintain it for three years?&lt;br&gt;
Can I deploy it without special tricks?&lt;br&gt;
Can I find help when something breaks?&lt;br&gt;
Can I reuse patterns from previous projects?&lt;br&gt;
Does it reduce complexity or just move it somewhere else?&lt;/p&gt;

&lt;p&gt;That is why I still use Django, .NET, Next.js, PostgreSQL, Flutter and Docker in many projects.&lt;/p&gt;

&lt;p&gt;They are not always the coolest choices.&lt;/p&gt;

&lt;p&gt;But they are stable, documented, widely used and good enough for a lot of real-world software.&lt;/p&gt;

&lt;p&gt;And “good enough” is underrated.&lt;/p&gt;

&lt;p&gt;Good enough lets you ship.&lt;br&gt;
Good enough lets you maintain.&lt;br&gt;
Good enough lets you focus on the product.&lt;br&gt;
Good enough lets you build systems instead of constantly rebuilding foundations.&lt;/p&gt;

&lt;p&gt;After spending enough time chasing frameworks, I started caring less about what looks impressive in a benchmark and more about what still works when the project becomes boring.&lt;/p&gt;

&lt;p&gt;Because that is usually when the real work begins.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Flutter vs React Native Is the Wrong Question for Solo Full-Stack Developers</title>
      <dc:creator>Fatih Kurt</dc:creator>
      <pubDate>Mon, 18 May 2026 09:28:24 +0000</pubDate>
      <link>https://dev.to/fatihkurtl/flutter-vs-react-native-is-the-wrong-question-for-solo-full-stack-developers-51bk</link>
      <guid>https://dev.to/fatihkurtl/flutter-vs-react-native-is-the-wrong-question-for-solo-full-stack-developers-51bk</guid>
      <description>&lt;p&gt;I see this debate everywhere:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Flutter or React Native?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But after building products as a full-stack developer, I think this is actually the wrong question.&lt;/p&gt;

&lt;p&gt;The better question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What helps a solo or small-team developer ship polished products faster with fewer long-term headaches?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And for me, the answer became Flutter.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Funny Part: I Already Use React
&lt;/h2&gt;

&lt;p&gt;This is what makes my decision look strange at first.&lt;/p&gt;

&lt;p&gt;Most of my stack is already JavaScript/TypeScript based:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Node.js sometimes&lt;/li&gt;
&lt;li&gt;Django / .NET on backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So logically, React Native should have been the obvious choice.&lt;/p&gt;

&lt;p&gt;Same ecosystem.&lt;br&gt;
Same language.&lt;br&gt;
Shared mental model.&lt;/p&gt;

&lt;p&gt;But after trying both approaches seriously, I realized something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mobile development is not just “React on a phone.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is an entirely different product experience.&lt;/p&gt;

&lt;p&gt;And that changed how I evaluate frameworks.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Flutter Worked Better &lt;em&gt;For Me&lt;/em&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. UI Consistency Matters More Than People Admit
&lt;/h2&gt;

&lt;p&gt;One of the biggest things I noticed with React Native was this constant feeling of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Almost the same… but not exactly.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Different behavior between iOS and Android.&lt;br&gt;
Different rendering quirks.&lt;br&gt;
Different native dependencies.&lt;br&gt;
Random styling inconsistencies.&lt;/p&gt;

&lt;p&gt;Sometimes small.&lt;br&gt;
Sometimes painful.&lt;/p&gt;

&lt;p&gt;Flutter felt different immediately.&lt;/p&gt;

&lt;p&gt;The UI layer is fully controlled by Flutter itself, so things behave much more consistently across platforms.&lt;/p&gt;

&lt;p&gt;As someone building products mostly alone, this matters a lot.&lt;/p&gt;

&lt;p&gt;I do not want to spend energy debugging platform-specific UI weirdness.&lt;/p&gt;

&lt;p&gt;I want predictable output.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Flutter Feels More Product-Oriented
&lt;/h2&gt;

&lt;p&gt;This is hard to explain until you build real apps.&lt;/p&gt;

&lt;p&gt;Flutter encourages polished interactions naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;smooth animations&lt;/li&gt;
&lt;li&gt;better transitions&lt;/li&gt;
&lt;li&gt;custom UI freedom&lt;/li&gt;
&lt;li&gt;more “designed” feeling interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React Native often feels like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“web development adapted to mobile.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Flutter feels like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“actual mobile product development.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That difference becomes very noticeable once you care about UX quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Separation Between Web and Mobile Is Actually Healthy
&lt;/h2&gt;

&lt;p&gt;At first, I thought sharing React knowledge everywhere was automatically a good thing.&lt;/p&gt;

&lt;p&gt;Now I think separating web and mobile stacks can actually improve architecture decisions.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;SSR&lt;/li&gt;
&lt;li&gt;fast iteration&lt;/li&gt;
&lt;li&gt;content-heavy systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mobile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;animations&lt;/li&gt;
&lt;li&gt;touch interactions&lt;/li&gt;
&lt;li&gt;native feeling UX&lt;/li&gt;
&lt;li&gt;smooth rendering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Flutter shines.&lt;/p&gt;

&lt;p&gt;Trying to force the exact same mindset onto both platforms sometimes creates worse products.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Developer Experience Was Surprisingly Calm
&lt;/h2&gt;

&lt;p&gt;This was unexpected.&lt;/p&gt;

&lt;p&gt;Flutter tooling felt extremely stable for me.&lt;/p&gt;

&lt;p&gt;Especially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hot reload&lt;/li&gt;
&lt;li&gt;layout system&lt;/li&gt;
&lt;li&gt;animation handling&lt;/li&gt;
&lt;li&gt;component consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything felt centralized and opinionated in a good way.&lt;/p&gt;

&lt;p&gt;With React Native, I often felt closer to the ecosystem chaos of JavaScript development.&lt;/p&gt;

&lt;p&gt;And honestly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a solo builder, reducing chaos is underrated.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  But React Native Still Makes Sense
&lt;/h1&gt;

&lt;p&gt;I am not saying React Native is bad.&lt;/p&gt;

&lt;p&gt;In fact, I think React Native is the correct choice in many situations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large React teams&lt;/li&gt;
&lt;li&gt;companies with existing JS infrastructure&lt;/li&gt;
&lt;li&gt;shared business logic requirements&lt;/li&gt;
&lt;li&gt;teams needing fast onboarding&lt;/li&gt;
&lt;li&gt;web-heavy organizations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If I joined a big React-based startup tomorrow, I would probably use React Native too.&lt;/p&gt;

&lt;p&gt;But for my own products?&lt;/p&gt;

&lt;p&gt;Flutter gives me more confidence.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Current View
&lt;/h1&gt;

&lt;p&gt;I use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js for web&lt;/li&gt;
&lt;li&gt;Flutter for mobile&lt;/li&gt;
&lt;li&gt;Django / .NET for backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly, this combination feels extremely balanced.&lt;/p&gt;

&lt;p&gt;Web and mobile stopped fighting each other technically.&lt;/p&gt;

&lt;p&gt;Each platform now uses the tool that feels strongest for its own environment.&lt;/p&gt;

&lt;p&gt;And that changed how I build products.&lt;/p&gt;




&lt;p&gt;Maybe the real question is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Which framework is better?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maybe it is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Which framework creates fewer long-term bottlenecks for the way YOU build products?”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>reactnative</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>developers</category>
    </item>
    <item>
      <title>Why I Built My Own Mobile SSH Client (And Why You Should Care About Your Keys)</title>
      <dc:creator>Fatih Kurt</dc:creator>
      <pubDate>Mon, 09 Mar 2026 06:46:23 +0000</pubDate>
      <link>https://dev.to/fatihkurtl/why-i-built-my-own-mobile-ssh-client-and-why-you-should-care-about-your-keys-4n0b</link>
      <guid>https://dev.to/fatihkurtl/why-i-built-my-own-mobile-ssh-client-and-why-you-should-care-about-your-keys-4n0b</guid>
      <description>&lt;p&gt;Let’s be real: managing a production VPS from a smartphone is usually a nightmare.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I had a runaway Docker container eat up all the RAM on a client’s server at 2 AM. By the time I got to my laptop, the damage was done. I tried using some of the "big" mobile SSH apps, but they all had the same problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They felt like they were designed in 2012.&lt;/li&gt;
&lt;li&gt;They were bloated with features I didn't need.&lt;/li&gt;
&lt;li&gt;The biggest red flag: They wanted to sync my private SSH keys and server IPs to their cloud.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a developer, handing over my "keys to the kingdom" to a third-party cloud never sat right with me. So, I decided to build ServerGlance.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "No-Cloud" Architecture
&lt;/h2&gt;

&lt;p&gt;My first rule was simple: No credentials ever leave the device. Period.&lt;br&gt;
I used flutter_secure_storage for local AES-256 encryption. When you connect to your server, the iPhone talks directly to the VPS via SSH. No middleman, no telemetry, no "syncing" to my servers.&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.amazonaws.com%2Fuploads%2Farticles%2Fs3071ij8aapex2h7ioiu.png" 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.amazonaws.com%2Fuploads%2Farticles%2Fs3071ij8aapex2h7ioiu.png" alt=" " width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Solving the Keyboard Agony
&lt;/h2&gt;

&lt;p&gt;Using a terminal on a touchscreen is painful because standard keyboards lack Esc, Tab, Ctrl, and arrow keys. I built a custom keyboard accessory row and "Quick Actions" so I could run htop or df -h with a single tap.&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.amazonaws.com%2Fuploads%2Farticles%2F8b3whrac4ggug6z7aj9o.png" 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.amazonaws.com%2Fuploads%2Farticles%2F8b3whrac4ggug6z7aj9o.png" alt=" " width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker Visibility at a Glance
&lt;/h2&gt;

&lt;p&gt;Instead of just being a terminal, I wanted to see my containers without needing a full SSH session. I implemented a view that surfaces your Docker containers directly on the dashboard. At a glance, I can see which containers are running, which have exited, and which image versions are live—all without typing a single command.&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.amazonaws.com%2Fuploads%2Farticles%2F0js0nkyjwdqwzirpsk2v.png" 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.amazonaws.com%2Fuploads%2Farticles%2F0js0nkyjwdqwzirpsk2v.png" alt=" " width="800" height="1739"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;If you manage a handful of VPS instances (Hetzner, DigitalOcean, AWS) and you actually care about where your private keys are stored, give it a look. It’s built by a developer who got paged one too many times.&lt;/p&gt;

&lt;p&gt;I’m looking for feedback from fellow SysAdmins and DevOps engineers. What’s the one feature that would make you actually leave your laptop closed during a minor server crisis?&lt;/p&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;App Store: &lt;a href="https://apps.apple.com/us/app/serverglance-ssh-monitor/id6758614736" rel="noopener noreferrer"&gt;https://apps.apple.com/us/app/serverglance-ssh-monitor/id6758614736&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Website: &lt;a href="https://serverglance.fktyazilim.com/" rel="noopener noreferrer"&gt;https://serverglance.fktyazilim.com/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>devops</category>
      <category>sysadmin</category>
      <category>ios</category>
    </item>
  </channel>
</rss>
