<?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: MD. HABIBULLAH SHARIF</title>
    <description>The latest articles on DEV Community by MD. HABIBULLAH SHARIF (@md8_habibullah).</description>
    <link>https://dev.to/md8_habibullah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2612390%2Fbdbcad98-2e4d-43b0-98ff-0e6e2c728432.jpg</url>
      <title>DEV Community: MD. HABIBULLAH SHARIF</title>
      <link>https://dev.to/md8_habibullah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/md8_habibullah"/>
    <language>en</language>
    <item>
      <title>They Charge Me to Export My Own WhatsApp Contacts. I Shipped a Free Alternative in One Day 🔓</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Mon, 19 Oct 2026 18:12:03 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/they-charge-mr-to-export-my-own-whatsapp-contacts-i-shipped-a-free-alternative-in-one-day-4n9g</link>
      <guid>https://dev.to/md8_habibullah/they-charge-mr-to-export-my-own-whatsapp-contacts-i-shipped-a-free-alternative-in-one-day-4n9g</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;Md. Habibullah Sharif&lt;/a&gt; — Full-Stack Engineer | CSE, Northern University Bangladesh&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;633 contacts in my WhatsApp Business account.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The "free" exporters let me take 10.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The other 623 had a price tag.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My own contacts. From my own account. Already loaded in my own browser tab.&lt;/p&gt;

&lt;p&gt;And someone wanted a monthly subscription to hand them back to me.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Paywall
&lt;/h2&gt;

&lt;p&gt;My account had grown the way every long-lived WhatsApp account grows: years of phones, several synced devices, customers, suppliers, groups. 957 raw contact records for 633 actual people. I needed them in a spreadsheet.&lt;/p&gt;

&lt;p&gt;WhatsApp has no export button. That part is well known.&lt;/p&gt;

&lt;p&gt;So I checked the Chrome Web Store. Pages of exporters, polished icons, confident promises. I tried them one after another, and every one I tried followed the same script:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Free plan: 10 contacts.&lt;/strong&gt; &lt;em&gt;Some stretch it to 30.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Everything else: upgrade to Premium.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I build backends and data pipelines for a living. I know exactly what sits behind that "Premium" button: the data is already in the page's memory, and serialising it to CSV is a few dozen lines. There is no server cost to cover and no expensive API behind it. The paywall isn't covering a cost. It's a toll on your own data.&lt;/p&gt;

&lt;p&gt;That was the part I refused to accept.&lt;/p&gt;

&lt;p&gt;I closed the tab and started building. &lt;strong&gt;WAVault shipped the same day.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjyacq3fp16fdst846bq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsjyacq3fp16fdst846bq.gif" alt="WAVault demo: filtering contacts, loading group members, backing up chats, saving statuses" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Get, For Nothing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/md8-habibullah/wavault-whatsapp-web-backup" rel="noopener noreferrer"&gt;WAVault&lt;/a&gt;&lt;/strong&gt; is a free, open-source browser extension for WhatsApp Web and WhatsApp Business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No premium tier. No contact limit. No account. No server.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It adds a dashboard to WhatsApp Web with four sections.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Contacts, every one of them
&lt;/h3&gt;

&lt;p&gt;One row per real person, merged from the address book, chats and groups. 15 one-click lists:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saved · Unsaved · Invite list · Chatted · Unread · Read · With username · Without username · Business · Personal · Group members · Hidden number · Blocked&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Combine them with Any/Yes/No filters, WhatsApp Business labels and group membership. Search works across scripts (Bangla, Arabic, Hindi, emoji) and across number formats: &lt;code&gt;+44 7700 900123&lt;/code&gt;, &lt;code&gt;07700900123&lt;/code&gt; and &lt;code&gt;447700900123&lt;/code&gt; resolve to the same person.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05itqqijynopbagddjb3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F05itqqijynopbagddjb3.png" alt="Contacts filtered to Business, with filters open and rows selected" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Group members
&lt;/h3&gt;

&lt;p&gt;The member list of every group you belong to, with roles (Owner, Admin, Member). Excel output gives one sheet per group. This is the feature paid tools tend to lock hardest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwh8o7et7q2xytqg18xem.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwh8o7et7q2xytqg18xem.png" alt="WhatsApp groups with member counts and roles" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Full chat backup, with media
&lt;/h3&gt;

&lt;p&gt;Whole conversations, loaded page by page, with photos, videos, voice notes and documents decrypted locally. The output is a ZIP with a folder per chat, an index page, and an HTML viewer that reads like WhatsApp itself: bubbles, replies, inline media, search. It opens offline, in any browser, on any machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fucj6awmgbzqc096rpxru.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fucj6awmgbzqc096rpxru.png" alt="A backed-up chat in the offline HTML viewer" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Status downloader
&lt;/h3&gt;

&lt;p&gt;Every current status, grouped by contact. Save one, or select many and get a ZIP with a gallery page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Formats
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Built for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Excel (.xlsx)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Spreadsheets; numbers stored as text so &lt;code&gt;+&lt;/code&gt; survives&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CRMs and tools; UTF-8 with BOM so non-Latin names render in Excel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Contacts CSV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct import at contacts.google.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outlook CSV&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Outlook and Microsoft 365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;vCard 3.0 / 4.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;iPhone, Android, iCloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Numbers list / HTML / PDF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Quick lists, sharing, printing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;WhatsApp Web exposes no public API for any of this. It doesn't need to: the data is already in the tab. The engineering problem is reading it &lt;strong&gt;safely, read-only, and without a single byte leaving the machine.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Launcher tab / toolbar]
        │
        ▼
[Content script — React 19 dashboard inside a Shadow DOM]
        │   window.postMessage RPC (progress events, transferable ArrayBuffers)
        ▼
[Bridge script — injected into the page's main world]
        │   read-only calls
        ▼
[WhatsApp Web's internal modules: contacts, chats, groups, messages, media]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://wxt.dev" rel="noopener noreferrer"&gt;WXT&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One codebase, native builds for Chrome, Edge, Brave, Opera, Firefox and Safari&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shadow DOM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full style isolation in both directions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Main-world bridge&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Content scripts run in an isolated world and can't reach page objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;postMessage RPC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Typed requests, streamed progress, cancellation, binary-safe media&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom &lt;code&gt;.xlsx&lt;/code&gt; writer (~130 lines)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A spreadsheet library would outweigh the entire extension&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/101arrowz/fflate" rel="noopener noreferrer"&gt;fflate&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Streaming ZIP, so large chat backups don't need the whole archive in memory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Permissions: &lt;code&gt;web.whatsapp.com&lt;/code&gt; and &lt;code&gt;storage&lt;/code&gt;. Nothing else. No analytics, no telemetry, no remote code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five Problems the Paid Tools Don't Talk About
&lt;/h2&gt;

&lt;p&gt;Exporting ten rows is easy. Exporting &lt;em&gt;everything, correctly&lt;/em&gt; is where it gets interesting.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. One person, two identities
&lt;/h3&gt;

&lt;p&gt;WhatsApp now assigns every user a private &lt;strong&gt;LID&lt;/strong&gt; alongside their phone number. The same person can appear as &lt;code&gt;…@c.us&lt;/code&gt; and as &lt;code&gt;…@lid&lt;/code&gt;, and in many groups members appear &lt;em&gt;only&lt;/em&gt; as a LID with the number hidden.&lt;/p&gt;

&lt;p&gt;A naive exporter gives you duplicates and calls it a feature. WAVault first builds the full LID ↔ phone map, then folds the address book, chats, group participants and block list into a single record per person.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;957 raw records → 633 real people.&lt;/strong&gt; That number is the difference between a list and a &lt;em&gt;clean&lt;/em&gt; list.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. WhatsApp changes its internals without notice
&lt;/h3&gt;

&lt;p&gt;Mid-build, the function that pages through chat history changed its signature from &lt;code&gt;(chat)&lt;/code&gt; to &lt;code&gt;({ chat, msgCollection, ... })&lt;/code&gt;. Users update WhatsApp Web at different times, so both shapes have to work. The resolver tries each and caches the winner:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;loadEarlierStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 'object' | 'positional'&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadEarlier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;loadEarlierStyle&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loadEarlierStyle&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;positional&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;lastError&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;styles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadEarlierMsgs&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;msgCollection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msgs&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadEarlierMsgs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;loadEarlierStyle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;lastError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nx"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;loadEarlierStyle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&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="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;lastError&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;Every internal access goes through one module with fallbacks. When WhatsApp moves something, WAVault reports &lt;em&gt;which&lt;/em&gt; part is unavailable instead of failing silently. That design choice matters more than any single feature.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Media decryption expects instrumentation
&lt;/h3&gt;

&lt;p&gt;WhatsApp's media pipeline now requires a performance-logging object on every download. WAVault logs nothing, so it passes a self-returning no-op that satisfies any call chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;noopLogger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Proxy&lt;/span&gt;&lt;span class="p"&gt;({},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;then&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;noopLogger&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 &lt;code&gt;then&lt;/code&gt; guard keeps it from being treated as a thenable. Verified against a live account: decrypted size matches the declared size byte for byte, JPEG header &lt;code&gt;ff d8 ff e0&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Spreadsheets are hostile to phone numbers
&lt;/h3&gt;

&lt;p&gt;Open a naive CSV in Excel and &lt;code&gt;+447700900123&lt;/code&gt; becomes &lt;code&gt;4.477E+11&lt;/code&gt;. Names in Bangla turn into &lt;code&gt;à¦°à¦¹à¦¿à¦®&lt;/code&gt;. And a contact named &lt;code&gt;=HYPERLINK("http://…")&lt;/code&gt; becomes a live formula on someone else's machine.&lt;/p&gt;

&lt;p&gt;WAVault writes real &lt;code&gt;.xlsx&lt;/code&gt; with numbers as text, adds a UTF-8 BOM to CSV, and neutralises formula injection while leaving genuine phone numbers untouched. Contact data is user-controlled input; it gets treated that way.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Your build artifacts can leak what git never saw
&lt;/h3&gt;

&lt;p&gt;Firefox Add-ons requires a sources zip, and build tools zip the project folder by default, including local test output that &lt;code&gt;.gitignore&lt;/code&gt; keeps out of the repo. A release built on a developer machine can quietly ship screenshots and logs from real accounts.&lt;/p&gt;

&lt;p&gt;WAVault's build excludes every local artifact explicitly. Before release, every published file (git history and all four release zips) was scanned against the 1,111 real phone numbers in my own backup. &lt;strong&gt;Zero matches.&lt;/strong&gt; Every screenshot here uses fictional data from number ranges reserved for film and TV.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;For anyone shipping a data tool:&lt;/strong&gt; &lt;code&gt;.gitignore&lt;/code&gt; protects the repo, not the artifact. Run &lt;code&gt;unzip -l&lt;/code&gt; on every zip before it goes public.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Is It Safe?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only.&lt;/strong&gt; It never sends messages and never modifies chats, contacts or groups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local.&lt;/strong&gt; No server, no account, no network requests of its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No automation.&lt;/strong&gt; It reads what your tab has already loaded; it doesn't drive WhatsApp.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditable.&lt;/strong&gt; MIT licensed, every line on GitHub.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is an independent project, not affiliated with WhatsApp or Meta. Use it on your own account.&lt;/p&gt;




&lt;h2&gt;
  
  
  Install in Two Minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download the zip for your browser from the &lt;strong&gt;&lt;a href="https://github.com/md8-habibullah/wavault-whatsapp-web-backup/releases/latest" rel="noopener noreferrer"&gt;latest release&lt;/a&gt;&lt;/strong&gt; and unzip it.&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;chrome://extensions&lt;/code&gt; (or &lt;code&gt;edge://&lt;/code&gt;, &lt;code&gt;brave://&lt;/code&gt;), enable &lt;strong&gt;Developer mode&lt;/strong&gt;, click &lt;strong&gt;Load unpacked&lt;/strong&gt;, and select the folder. Firefox: &lt;code&gt;about:debugging&lt;/code&gt; → &lt;strong&gt;Load Temporary Add-on&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;a href="https://web.whatsapp.com" rel="noopener noreferrer"&gt;web.whatsapp.com&lt;/a&gt; and click the &lt;strong&gt;WAVault&lt;/strong&gt; tab on the right edge.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Guides for every feature, including importing into Google Contacts, iPhone, Android and Outlook, are in the &lt;strong&gt;&lt;a href="https://github.com/md8-habibullah/wavault-whatsapp-web-backup/tree/main/docs" rel="noopener noreferrer"&gt;docs&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To run it without logging in, there's a demo mode with generated data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/md8-habibullah/wavault-whatsapp-web-backup.git
&lt;span class="nb"&gt;cd &lt;/span&gt;wavault-whatsapp-web-backup
npm ci &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run preview   &lt;span class="c"&gt;# http://127.0.0.1:4789&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why It Stays Free
&lt;/h2&gt;

&lt;p&gt;Your contacts were never a premium feature. They're yours.&lt;/p&gt;

&lt;p&gt;Charging people to read data that already sits in their own browser is a business model built on the assumption that users can't see how simple the work behind the paywall is. Now there's a free, open alternative that does more than the paid ones, and anyone can verify every line of it.&lt;/p&gt;

&lt;p&gt;WAVault will not get a premium tier. That is the one roadmap item that never changes.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Coming next: Chrome Web Store, Edge and Firefox Add-ons listings, incremental backups, and a Bangla interface. Issues and pull requests are open on &lt;a href="https://github.com/md8-habibullah/wavault-whatsapp-web-backup" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If WAVault saved you a subscription, a ⭐ on the repo is how other people find it. And if you've hit the same 10-contact wall, tell me which tool in the comments.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was written with AI assistance and edited by me.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Cut the Noise: The 10 Web Frameworks That Actually Matter in 2026</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:14:40 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/stop-picking-the-wrong-framework-here-are-the-only-10-that-matter-in-2026-32gm</link>
      <guid>https://dev.to/md8_habibullah/stop-picking-the-wrong-framework-here-are-the-only-10-that-matter-in-2026-32gm</guid>
      <description>&lt;p&gt;Every six months, someone asks the same question.&lt;/p&gt;

&lt;p&gt;"Which framework should I learn?" And every six months, the internet gives them 50 conflicting opinions, outdated blog posts, and at least one person telling them to learn a framework with 200 GitHub stars and one contributor.&lt;/p&gt;

&lt;p&gt;This guide isn't that.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;practical breakdown&lt;/strong&gt; - what each framework actually does, who it's for, and which one you should pick today based on your situation. Backed by the &lt;a href="https://survey.stackoverflow.co/2025" rel="noopener noreferrer"&gt;Stack Overflow Developer Survey 2025&lt;/a&gt; and &lt;a href="https://www.statista.com/statistics/1124699/worldwide-developer-survey-most-used-frameworks-web/" rel="noopener noreferrer"&gt;Statista market research&lt;/a&gt;. No filler. No hype. Just honest picks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before You Pick Anything - Answer These Three
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform?&lt;/strong&gt; - Frontend web, backend API, mobile, or full-stack?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Language?&lt;/strong&gt; - What do you already know? Don't learn a new language and a new framework at the same time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale?&lt;/strong&gt; - Weekend project or enterprise system? Your answer changes everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Got it? Good. Let's get into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. React - The Undisputed King of Frontend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Frontend developers, anyone entering the job market, UI-heavy applications&lt;/p&gt;

&lt;p&gt;React is not the newest. It's not the most elegant. But it is the most employable. The job market for React developers is larger than the next three frontend frameworks combined - that's not an opinion, that's survey data.&lt;/p&gt;

&lt;p&gt;Facebook (Meta) built it to handle massive UI complexity at scale. The component model and unidirectional data flow changed how the entire industry thinks about frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Largest frontend ecosystem on the planet - UI libraries, state managers, testing tools&lt;/li&gt;
&lt;li&gt;React Native lets you take the same mental model to mobile&lt;/li&gt;
&lt;li&gt;Every major tech company uses it - Meta, Airbnb, Netflix, Uber&lt;/li&gt;
&lt;li&gt;The sheer volume of tutorials, courses, and StackOverflow answers is unmatched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; React is a &lt;em&gt;library&lt;/em&gt;, not a full framework. You'll still need to make decisions about routing, state, and data fetching. That flexibility is a feature - but it can overwhelm beginners.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Welcome&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick React if:&lt;/strong&gt; You're entering the job market, building a UI-heavy app, or want the widest possible career options.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Next.js - React's More Serious Sibling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Full-stack developers, production web apps, SEO-critical projects&lt;/p&gt;

&lt;p&gt;Next.js is what happens when you take React and give it a proper framework - routing, server-side rendering, API routes, image optimization, and edge deployment out of the box.&lt;/p&gt;

&lt;p&gt;In 2026, if you're building a real web product with React, you're probably building it with Next.js. Vercel (who maintains it) has made deployment a one-command experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSR and SSG solve React's SEO problem completely&lt;/li&gt;
&lt;li&gt;App Router makes full-stack feel natural - one project, frontend and backend&lt;/li&gt;
&lt;li&gt;Edge and serverless deployment with zero config&lt;/li&gt;
&lt;li&gt;Built-in image and font optimization - performance by default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; The App Router (new) vs Pages Router (old) divide still confuses developers. The mental model shift between server components and client components takes time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-next-app@latest my-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Next.js if:&lt;/strong&gt; You need SEO, you're building a production product on React, or you want full-stack without managing a separate backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Express.js - The Minimal Backend Standard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Backend APIs, Node.js developers, microservices, developers who want control&lt;/p&gt;

&lt;p&gt;Express is 15+ years old and still the most downloaded backend framework on npm. There's a reason - it stays out of your way.&lt;/p&gt;

&lt;p&gt;No opinions about your folder structure. No forced architecture. You define exactly what your server does and how.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Absurdly lightweight - the core is just request/response middleware&lt;/li&gt;
&lt;li&gt;Massive middleware ecosystem (Passport, Multer, Helmet, etc.)&lt;/li&gt;
&lt;li&gt;You already know JavaScript - no new language to learn&lt;/li&gt;
&lt;li&gt;Perfect for REST APIs, GraphQL servers, and microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Express gives you &lt;em&gt;nothing&lt;/em&gt; beyond routing and middleware. You'll write more boilerplate than opinionated frameworks. For large teams or complex apps, that freedom becomes a maintenance burden fast.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;users&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;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Express if:&lt;/strong&gt; You want full control over your Node.js backend, you're building a lightweight API, or you're learning server-side JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. ASP.NET Core - Enterprise's Favorite
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Enterprise backend, .NET developers, high-performance APIs, cloud-native systems&lt;/p&gt;

&lt;p&gt;Microsoft rebuilt .NET from scratch and made it cross-platform, open-source, and fast. ASP.NET Core now regularly benchmarks in the top 3 fastest web frameworks globally - above Node.js, above most Go frameworks.&lt;/p&gt;

&lt;p&gt;If your company runs on Azure or the Microsoft ecosystem, this is the default serious choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exceptional performance - handles massive concurrent load efficiently&lt;/li&gt;
&lt;li&gt;First-class Azure integration (App Service, Functions, Service Bus)&lt;/li&gt;
&lt;li&gt;Built-in dependency injection, middleware pipeline, and security features&lt;/li&gt;
&lt;li&gt;C# is a productive, strongly-typed language with excellent tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; The ecosystem and job market are concentrated in enterprise environments. If you're building a startup MVP or an indie project, this is heavier than you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick ASP.NET Core if:&lt;/strong&gt; You're working in enterprise, your team knows C#, or you're building high-traffic APIs on Azure.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Angular - Enterprise's Complete Toolkit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Large teams, complex enterprise frontends, developers who want every decision made for them&lt;/p&gt;

&lt;p&gt;Angular is not a library. It's a complete platform - routing, forms, HTTP, testing, and state management all included and all opinionated. Google builds it. Google uses it. The entire Google Workspace suite runs on Angular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is standardized - large teams don't argue about architecture&lt;/li&gt;
&lt;li&gt;TypeScript is mandatory (which is a feature, not a bug)&lt;/li&gt;
&lt;li&gt;CLI generates consistent code structure across the entire codebase&lt;/li&gt;
&lt;li&gt;Dependency injection system is genuinely powerful for complex apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; The learning curve is steep. The boilerplate is real. For small projects, Angular will feel like driving a semi-truck to get groceries. It earns its complexity at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Angular if:&lt;/strong&gt; You're on a large enterprise frontend, your team is 5+ developers, or you want a framework that makes all the architecture decisions for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Django - Python's Fastest Path to Production
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Python developers, data-adjacent apps, rapid MVP development, teams that want built-in security&lt;/p&gt;

&lt;p&gt;Django's tagline is "the web framework for perfectionists with deadlines." That's not marketing - it's accurate.&lt;/p&gt;

&lt;p&gt;Authentication system? Built in. Admin dashboard? Built in. ORM? Built in. CSRF protection? Built in. You can go from &lt;code&gt;django-admin startproject&lt;/code&gt; to a working CRUD app with login in under an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Batteries-included means less glue code and fewer decisions&lt;/li&gt;
&lt;li&gt;Built-in admin panel is genuinely useful for internal tools and data management&lt;/li&gt;
&lt;li&gt;Perfect for data science teams already working in Python&lt;/li&gt;
&lt;li&gt;Django REST Framework (DRF) makes API development fast and consistent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Django's ORM can generate inefficient SQL at scale. For high-performance, heavily async workloads, FastAPI is often the better Python choice in 2026.&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="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;Article&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;title&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;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;published&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;&lt;strong&gt;Pick Django if:&lt;/strong&gt; You're a Python developer, you're building a data-heavy app, or you need to ship an MVP fast without reinventing the wheel.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Laravel - PHP Done Right
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Full-stack PHP developers, startups, agencies, rapid product development&lt;/p&gt;

&lt;p&gt;PHP has a reputation. Laravel doesn't deserve to share it. It is, honestly, one of the most elegant and productive frameworks in any language.&lt;/p&gt;

&lt;p&gt;Eloquent ORM, built-in authentication scaffolding, job queues, broadcasting, file storage - and Livewire for reactive UI without writing JavaScript. The developer experience is exceptional.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eloquent ORM has the cleanest syntax of any major ORM&lt;/li&gt;
&lt;li&gt;Laravel ecosystem (Forge, Vapor, Cashier) covers nearly every app need&lt;/li&gt;
&lt;li&gt;Livewire lets you build reactive UIs without touching JavaScript&lt;/li&gt;
&lt;li&gt;Extremely cost-effective hosting - PHP runs everywhere, cheaply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; PHP's reputation keeps some developers away - their loss. Laravel is also not the right choice for high-concurrency real-time applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Laravel if:&lt;/strong&gt; You know PHP, you're building a web product for a client or startup, or you want maximum productivity with a polished full-stack ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Flutter - One Codebase, Native Everywhere
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Mobile developers, cross-platform apps (iOS + Android), teams that can't maintain two native codebases&lt;/p&gt;

&lt;p&gt;Flutter is Google's answer to "why are we writing this twice?" You write Dart, Flutter renders native-looking components on iOS, Android, web, and desktop from the same codebase.&lt;/p&gt;

&lt;p&gt;Unlike React Native, Flutter draws every pixel itself - making it fast and visually consistent across platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;True cross-platform from a single codebase - not a compromise&lt;/li&gt;
&lt;li&gt;Hot reload in development is one of the best DX experiences in mobile&lt;/li&gt;
&lt;li&gt;Used in production at Google, BMW, Alibaba&lt;/li&gt;
&lt;li&gt;Strong Material Design and Cupertino widget libraries included&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Dart is a language you'll need to learn. The web target isn't great for SEO-heavy sites. Deep platform-specific integrations still require native code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Flutter if:&lt;/strong&gt; You're building a mobile app and can't maintain two native codebases, or you want to ship iOS and Android fast without doubling your team.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Vue.js - React's Friendlier Competitor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers new to frontend frameworks, teams migrating from jQuery, projects that want progressive adoption&lt;/p&gt;

&lt;p&gt;Vue is the framework people reach for when React feels like too much. The learning curve is genuinely lower, the documentation is the best in the frontend world, and the single-file component format keeps your template, script, and styles clean in one file.&lt;/p&gt;

&lt;p&gt;Vue 3 with the Composition API is a different product from Vue 2 - faster, more TypeScript-friendly, more scalable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation is world-class - the best in any major frontend framework&lt;/li&gt;
&lt;li&gt;Progressive adoption - drop a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag into an existing project and you're already using Vue&lt;/li&gt;
&lt;li&gt;Nuxt.js (the Vue equivalent of Next.js) is mature and production-ready&lt;/li&gt;
&lt;li&gt;Less opinionated than Angular, more structured than raw React&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Vue's job market is smaller than React's in North America and Western Europe. In Asia - especially China - Vue is dominant. Know your target market.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Vue if:&lt;/strong&gt; You're learning your first frontend framework, you're coming from jQuery or plain HTML/JS, or you're building for a market where Vue is strong.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Spring Boot - The Java Enterprise Standard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Java developers, large enterprise systems, microservices architectures, financial and banking systems&lt;/p&gt;

&lt;p&gt;Spring Boot is what you use when the stakes are high, the team is large, and the system needs to run reliably for 10 years. Banks, insurance companies, large e-commerce platforms, and government systems run on Spring Boot worldwide.&lt;/p&gt;

&lt;p&gt;The auto-configuration system makes the sprawling Spring ecosystem approachable - add a dependency, Spring Boot wires it up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rock-solid, battle-tested, runs in production at massive scale&lt;/li&gt;
&lt;li&gt;First-class microservices support - service discovery, circuit breakers, API gateways&lt;/li&gt;
&lt;li&gt;Deep integration with cloud-native patterns (Spring Cloud, Kubernetes)&lt;/li&gt;
&lt;li&gt;Java salaries in enterprise backend are consistently high&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Watch out for:&lt;/strong&gt; Startup time and memory footprint are higher than modern alternatives. For serverless or rapid-scaling systems, look at Quarkus or Micronaut instead. Spring Boot is for when scale is a known quantity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Spring Boot if:&lt;/strong&gt; You're a Java developer, you're building an enterprise system, or you work in fintech, insurance, or large-scale e-commerce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Decision Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Framework&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Pick When&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;React&lt;/td&gt;
&lt;td&gt;JS / TS&lt;/td&gt;
&lt;td&gt;Frontend, job market, UI apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js&lt;/td&gt;
&lt;td&gt;JS / TS&lt;/td&gt;
&lt;td&gt;Full-stack, SEO matters, production web&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Express.js&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Lightweight APIs, full control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASP.NET Core&lt;/td&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;Enterprise backend, Azure, high performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Large teams, complex enterprise frontend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Django&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python stack, rapid development, data-heavy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Laravel&lt;/td&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;PHP stack, agencies, elegant full-stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter&lt;/td&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;Cross-platform mobile, single codebase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vue.js&lt;/td&gt;
&lt;td&gt;JS / TS&lt;/td&gt;
&lt;td&gt;Beginner-friendly frontend, Nuxt apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Enterprise, microservices, finance/banking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Honest Rule
&lt;/h2&gt;

&lt;p&gt;There is no "best" framework. There's only the best one for your specific situation.&lt;/p&gt;

&lt;p&gt;If you already know Python, pick Django. If you're chasing jobs, learn React. If you're building a mobile app alone, Flutter saves you months. If your employer runs Java, Spring Boot is your world.&lt;/p&gt;

&lt;p&gt;The mistake developers make is treating this as a philosophical debate. It's not. It's an engineering decision. Pick the one that matches your language, your platform, and your scale. Get good at it. Ship something.&lt;/p&gt;

&lt;p&gt;That's the whole answer.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What framework are you currently building with? Drop it in the comments - genuinely curious what the dev.to crowd is reaching for in 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;MD. HABIBULLAH SHARIF - Full-Stack &amp;amp; DevOps Engineer. More at &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;habibullah.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Code Never Runs First - The Lexer and Parser Do</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Wed, 27 May 2026 15:19:05 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/code-never-runs-first-the-lexer-and-parser-do-cg4</link>
      <guid>https://dev.to/md8_habibullah/code-never-runs-first-the-lexer-and-parser-do-cg4</guid>
      <description>&lt;h3&gt;
  
  
  Your code doesn't run the way you wrote it.
&lt;/h3&gt;

&lt;p&gt;Before the machine executes a single instruction, your source file passes through a pipeline. Two of the most important stages in that pipeline are things most developers never think about — the &lt;strong&gt;lexer&lt;/strong&gt; and the &lt;strong&gt;parser&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every syntax error you've ever seen was one of them catching something. Every IDE that highlights keywords differently from variable names is using one right now.&lt;/p&gt;

&lt;p&gt;Let's break down what they actually do.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Lexer?
&lt;/h2&gt;

&lt;p&gt;The lexer (also called a tokenizer or lexical analyzer) is stage one. It takes your raw source code — just a stream of characters — and breaks it into meaningful units called &lt;strong&gt;tokens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it like reading a sentence. Before you understand grammar, you first recognize individual words. The lexer does that for code.&lt;/p&gt;

&lt;p&gt;Take this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lexer scans it character by character and produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ID: "x"]  [ASSIGN: "="]  [NUM: "5"]  [PLUS: "+"]  [NUM: "10"]  [SEMICOLON: ";"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each token has a &lt;strong&gt;type&lt;/strong&gt; (what category it belongs to) and a &lt;strong&gt;value&lt;/strong&gt; (the actual text). Keywords, operators, identifiers, literals, punctuation — the lexer categorizes all of it.&lt;/p&gt;

&lt;p&gt;What it does NOT do: care whether those tokens make any sense together. That is the next stage's problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Parser?
&lt;/h2&gt;

&lt;p&gt;The parser is stage two. It takes the token stream from the lexer and tries to make structural sense of it. It checks whether those tokens follow the grammar rules of the language, and if they do, it builds an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt; — a hierarchical structure that represents what your code actually &lt;em&gt;means&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The analogy holds here too. The lexer identifies parts of speech. The parser checks if those parts form a valid sentence. "The cat sat on the mat" — valid. "Mat the sat cat" — same words, completely broken.&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;x = 5 + 10;&lt;/code&gt;, the AST looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    Assignment
    /        \
   x         Add
            /   \
           5    10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The assignment is the root. The addition is its right-hand side. &lt;code&gt;5&lt;/code&gt; and &lt;code&gt;10&lt;/code&gt; are leaf nodes.&lt;/p&gt;

&lt;p&gt;Now try &lt;code&gt;x = + 5 10&lt;/code&gt;. The lexer produces valid tokens. The parser rejects it — the structure doesn't match any grammar rule it knows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Are They Two Separate Things?
&lt;/h2&gt;

&lt;p&gt;This is a design decision that pays off.&lt;/p&gt;

&lt;p&gt;Splitting the work means you can change your language's syntax (parser rules) without touching how it recognizes basic tokens (lexer rules), and vice versa. Each component is smaller, testable, and easier to reason about on its own.&lt;/p&gt;

&lt;p&gt;Most production compilers and interpreters auto-generate these from tools like ANTLR, Lex/Flex, or Yacc/Bison — you define the rules, the tool writes the code.&lt;/p&gt;

&lt;p&gt;Here's a quick comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Lexer&lt;/th&gt;
&lt;th&gt;Parser&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Raw character stream&lt;/td&gt;
&lt;td&gt;Token stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;Tokens&lt;/td&gt;
&lt;td&gt;Abstract Syntax Tree (AST)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works at&lt;/td&gt;
&lt;td&gt;Word level&lt;/td&gt;
&lt;td&gt;Structure level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detects&lt;/td&gt;
&lt;td&gt;Unknown characters, bad tokens&lt;/td&gt;
&lt;td&gt;Syntax errors, broken grammar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where You've Already Seen This
&lt;/h2&gt;

&lt;p&gt;Every syntax error you've ever hit — the parser caught it. When your editor colors a keyword differently from a variable name — the lexer already ran.&lt;/p&gt;

&lt;p&gt;Linters, formatters, Prettier, ESLint, TypeScript's type checker — they all build on top of this same pipeline. Even AI code tools that "understand" your code are working with ASTs under the hood, not raw text.&lt;/p&gt;

&lt;p&gt;Understanding the lexer and parser doesn't just fill in a computer science gap. It explains why error messages look the way they do, why some tools can analyze your code without running it, and how the entire software toolchain that you use daily actually works.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Enjoyed this? I write about backend architecture, DevOps, Linux, and systems programming. Check out more at &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;habibullah.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>computerscience</category>
      <category>beginners</category>
    </item>
    <item>
      <title>6‑Hour Hackathon Rescue: Dying API, rm -rf, and a Last‑Minute Win 🏆</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Tue, 14 Apr 2026 03:57:41 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/we-had-6-hours-a-dying-api-and-im-ran-rm-rf-we-still-won-gdf</link>
      <guid>https://dev.to/md8_habibullah/we-had-6-hours-a-dying-api-and-im-ran-rm-rf-we-still-won-gdf</guid>
      <description>&lt;p&gt;&lt;em&gt;By &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;Md. Habibullah Sharif&lt;/a&gt; — CSE Student, Northern University Bangladesh | Assistant Robotics Secretary, NUBCC&lt;/em&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;1:47 AM. The terminal blinked.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The folder was gone.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;The demo was in 4 hours.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That was the moment I genuinely considered if this was how our hackathon story ended.&lt;/p&gt;

&lt;p&gt;It didn't.&lt;/p&gt;

&lt;p&gt;This is the real story of how our team — &lt;strong&gt;Dreams of X&lt;/strong&gt; — built &lt;strong&gt;NagrikAI&lt;/strong&gt;, survived three catastrophic failures back-to-back, and walked out of &lt;strong&gt;Impact Dhaka 2026&lt;/strong&gt; as &lt;strong&gt;2nd Runner-Up&lt;/strong&gt; among 57 competing teams at BUET.&lt;/p&gt;

&lt;p&gt;Not polished. Fully by Allah. &lt;strong&gt;Earned.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why This Matters Before I Even Start
&lt;/h2&gt;

&lt;p&gt;I need you to feel something before I tell you what we built.&lt;/p&gt;

&lt;p&gt;Picture a 50-year-old man sitting on a bamboo floor in a village in Sunamganj — one of the most flood-prone regions on Earth. Three days without electricity. The tube-well is broken. His grandchildren are drinking from a ditch.&lt;/p&gt;

&lt;p&gt;He has no smartphone. Can't type. Doesn't know what a "helpline" is. Doesn't speak the English that most tech solutions demand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But he has a voice. And he has words. And he is desperate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That man is my grandfather. That story is real.&lt;/p&gt;

&lt;p&gt;And the question that haunted me walking into that hackathon was simple and devastating:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;What if one spoken sentence in his mother tongue could save his family?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question became NagrikAI. And everything that follows is what we paid to answer it.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1s4p1j6mc81bb7uqzj5w.jpg" 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%2F1s4p1j6mc81bb7uqzj5w.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  👥 The Team That Shouldn't Have Won
&lt;/h2&gt;

&lt;p&gt;Three CSE students from &lt;strong&gt;Northern University Bangladesh&lt;/strong&gt;. No corporate sponsor. No senior mentor in the room. Just a group chat, a shared laptop charger, and a deadline that didn't care about any of that.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Role in Team&lt;/th&gt;
&lt;th&gt;Role in NUBCC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mahdin Islam Mukim&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Team Lead&lt;/td&gt;
&lt;td&gt;Vice President&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Md. Habibullah Sharif&lt;/strong&gt; &lt;em&gt;(me)&lt;/em&gt;
&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Asst. Robotics Secretary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Yusuf Abdullah&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Robotics Secretary&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We weren't the most experienced team in that room. I can say that with full confidence.&lt;/p&gt;

&lt;p&gt;But we were the most &lt;strong&gt;specific&lt;/strong&gt; about what we were trying to fix.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Hackathon tip that nobody tells you early enough:&lt;/strong&gt; Judges see twenty demos in a row. Specificity cuts through the noise faster than complexity. Don't build for "everyone." Build for &lt;em&gt;one exact person&lt;/em&gt; with &lt;em&gt;one exact problem&lt;/em&gt; — and name them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 What We Built: NagrikAI
&lt;/h2&gt;

&lt;p&gt;Not a chatbot. Not another dashboard. Not a demo that pretends a real problem doesn't exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NagrikAI is a civic voice assistant&lt;/strong&gt; — built specifically for Bangladesh — that converts spoken Bengali or English into structured, actionable data routed to the right government institution. Automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[User speaks] → [AI transcribes] → [NLP structures intent] → [Routes to authority]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Someone speaks this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"আমাদের গ্রামে গত তিনদিন ধরে বিদ্যুৎ নেই এবং কলের পানি নষ্ট।"&lt;/em&gt;&lt;br&gt;
&lt;em&gt;("Our village has had no electricity for three days and the water tap is broken.")&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NagrikAI doesn't ask a follow-up question. It doesn't open a form. It doesn't require the person to know what "department" handles electricity.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;acts&lt;/strong&gt;. It files a structured report — priority: high, category: infrastructure, location: extracted from speech — and routes it to the right institution.&lt;/p&gt;

&lt;p&gt;That's the whole idea. Remove the barrier. Restore the voice.&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%2F15wae8uj1quchilxy7ve.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%2F15wae8uj1quchilxy7ve.png" alt=" " width="800" height="625"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚙️ Tech Stack — And Why Each Choice Was a Hackathon Decision
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Why We Chose It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Next.js (App Router) + Tailwind CSS&lt;/td&gt;
&lt;td&gt;Fast to scaffold, zero config for routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Voice Capture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;MediaRecorder&lt;/code&gt; Web API&lt;/td&gt;
&lt;td&gt;Built into the browser — no third-party SDK, no install friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NLP Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OpenRouter AI API&lt;/td&gt;
&lt;td&gt;Flexible model routing; we switched providers mid-hackathon and it saved us&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQLite3&lt;/td&gt;
&lt;td&gt;No server to spin up, no credentials to manage, works offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI/UX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimalist glass-slate interface&lt;/td&gt;
&lt;td&gt;Accessibility-first — low-vision, low-literacy users are the target&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Hackathon architecture principle:&lt;/strong&gt; Every tool you choose adds setup time. Ask yourself — &lt;em&gt;can I get this working in under 20 minutes?&lt;/em&gt; If not, pick something simpler. Speed of iteration matters more than technical elegance at hour 3.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔥 The Three Disasters (In Brutal Order)
&lt;/h2&gt;

&lt;p&gt;This is the part people don't write about. They crop it out of the LinkedIn post, the Instagram story, the polished retrospective.&lt;/p&gt;

&lt;p&gt;I'm not going to do that. Because if you're reading this before your first hackathon, &lt;strong&gt;this is the most useful section in this entire post.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Disaster #1 — The API That Lied to Us
&lt;/h3&gt;

&lt;p&gt;We had our NLP backbone planned. Tested locally. Worked beautifully. Clean JSON outputs, fast response times. We were confident going in.&lt;/p&gt;

&lt;p&gt;Then the hackathon started.&lt;/p&gt;

&lt;p&gt;Real network. Real load. Real pressure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Error 429: Too Many Requests
Error 500: Internal Server Error
Error 503: Service Unavailable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over and over. For &lt;strong&gt;two hours&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We sat there watching our core feature collapse in real time while other teams were already building. Every minute we spent debugging the API was a minute not spent building the thing that would win us anything.&lt;/p&gt;

&lt;p&gt;We made the call at Hour 2: &lt;strong&gt;pivot to OpenRouter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ripped out the old integration. Rewrote the entire NLP layer. And prayed the new connection held for the remaining 4 hours.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(It did. Barely.)&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;What this taught us:&lt;/strong&gt; Always prepare two API providers before the hackathon starts. Not during. &lt;strong&gt;Before.&lt;/strong&gt; Have your &lt;code&gt;.env&lt;/code&gt; keys ready, have a test script that hits both, know your fallback before you ever need it. The 20 minutes you spend on this the night before saves you 2 hours of panic inside the event.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Disaster #2 — The &lt;code&gt;rm&lt;/code&gt; That Shouldn't Have Happened
&lt;/h3&gt;

&lt;p&gt;Hour 4. Tired. Hungry. Running a cleanup script to remove some temp build files.&lt;/p&gt;

&lt;p&gt;The command ran. The terminal returned. We moved on.&lt;/p&gt;

&lt;p&gt;Thirty seconds later: &lt;em&gt;"Hey... where did the components folder go?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It wasn't the temp folder. It was the wrong directory. And it was gone.&lt;/p&gt;

&lt;p&gt;I won't say who ran it. That's not the point. The point is that we &lt;em&gt;all&lt;/em&gt; felt it — that specific horror that only developers know. When your stomach drops before your brain fully processes what just happened.&lt;/p&gt;

&lt;p&gt;We had Git. We recovered most of it. We lost about &lt;strong&gt;45 minutes&lt;/strong&gt; of work reconstructed from memory and blind frustration.&lt;/p&gt;

&lt;p&gt;That left us with 2 hours.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;What this taught us:&lt;/strong&gt; At a hackathon, commit to Git obsessively — every 30 minutes, every feature, every small fix. Set a timer if you have to. And never run a cleanup or deletion command without doing &lt;code&gt;echo&lt;/code&gt; or &lt;code&gt;ls&lt;/code&gt; on the path first. Exhausted developers make expensive typos.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Disaster #3 — $18 Over Budget, Then &lt;code&gt;rm -rf&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Hour 5. The API bill landed.&lt;/p&gt;

&lt;p&gt;We'd crossed the free tier. &lt;strong&gt;$18 over&lt;/strong&gt;, before we'd even finished building. The budget we didn't have was now in the negative.&lt;/p&gt;

&lt;p&gt;We made a decision in that state — that specific state of exhaustion and low blood sugar and stress — and ran a &lt;code&gt;rm -rf&lt;/code&gt; command on what we &lt;em&gt;thought&lt;/em&gt; was a safe directory.&lt;/p&gt;

&lt;p&gt;It was not safe.&lt;/p&gt;

&lt;p&gt;Between the first &lt;code&gt;rm&lt;/code&gt; and this one, we had now stress-tested every developer nightmare in a single 6-hour window.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;API failure. Data loss. Budget overrun. More data loss.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And then we sat down, took a breath, and kept going.&lt;/p&gt;

&lt;p&gt;Because there was nothing else to do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;What this taught us:&lt;/strong&gt; Set hard API cost limits &lt;em&gt;before&lt;/em&gt; the event — most providers let you cap spend at $5 or $10. It takes 2 minutes to configure and removes an entire category of disaster. Also: never run &lt;code&gt;rm -rf&lt;/code&gt; when you're tired. Close the terminal. Walk away. Come back.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🎤 The Demo That Changed Everything
&lt;/h2&gt;

&lt;p&gt;When demo time came, NagrikAI worked.&lt;/p&gt;

&lt;p&gt;I want you to understand how significant that sentence is. After everything — &lt;strong&gt;it worked.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A team member spoke a sentence in Bengali. The audio hit the transcription layer. The NLP extracted the intent. The confirmation card appeared. The civic report was filed.&lt;/p&gt;

&lt;p&gt;Clean. Fast. Exactly as designed.&lt;/p&gt;

&lt;p&gt;The judges asked questions. We answered every single one. But I think what really moved them wasn't the code — it was the story behind the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why are you building this?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And we told them about the 50-year-old man on the bamboo floor who can't navigate a helpline but knows exactly what he needs. We told them about 170 million people in Bangladesh who deserve technology that speaks &lt;em&gt;their&lt;/em&gt; language, not the other way around.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We weren't building another chatbot. We were building a bridge between a voice and an action."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The judges saw it. And they rewarded it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;The demo lesson most teams miss:&lt;/strong&gt; Your demo should answer three questions without being asked. &lt;em&gt;Who is this for? What does their life look like before this? What does it look like after?&lt;/em&gt; If a judge has to imagine the impact, you've already lost half the room. Make them see it.&lt;/p&gt;
&lt;/blockquote&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%2Fkf93mts6gk92gab03sjr.jpg" 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%2Fkf93mts6gk92gab03sjr.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 The Result
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;2nd Runner-Up. 57 teams. Impact Dhaka 2026.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organized by &lt;strong&gt;Cognisor AI&lt;/strong&gt; at BUET ECE Building under the theme &lt;em&gt;"AI for Urban Transformation"&lt;/em&gt; — Bangladesh's first international AI hackathon.&lt;/p&gt;

&lt;p&gt;Beyond the trophy: the top 3 teams receive opportunities to engage with &lt;strong&gt;Japan's tech startup ecosystem&lt;/strong&gt;, including platforms like &lt;strong&gt;Sushi Tech Tokyo 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Three students from Northern University Bangladesh. On an international platform. Competing against teams from across the country.&lt;/p&gt;

&lt;p&gt;I still can't fully believe it.&lt;/p&gt;




&lt;h2&gt;
  
  
  📰 It Made the News
&lt;/h2&gt;

&lt;p&gt;This wasn't just a win for us — it was picked up nationally:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Coverage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🗞️ BD Pratidin&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.bd-pratidin.com/campus-online/2026/04/13/1238245" rel="noopener noreferrer"&gt;আন্তর্জাতিক এআই হ্যাকাথনে 'ড্রিমস অব এক্স' দল দ্বিতীয় রানার-আপ&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏛️ NUB Official Notice&lt;/td&gt;
&lt;td&gt;&lt;a href="https://nub.ac.bd/nub/notice/v9qsj7xz/nub-student-team-runner-up-in-international-ai-hackathon" rel="noopener noreferrer"&gt;NUB Student Team Runner-Up in International AI Hackathon&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📣 NUBCC Facebook&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.facebook.com/nubccofficial/posts/-proud-moment-for-nub-cse-at-impact-dhaka-2026-an-international-ai-hackathon-org/1362111089284344/" rel="noopener noreferrer"&gt;Official Community Announcement&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;Not the LinkedIn version. The real version — organized so it's actually useful to you.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Before the hackathon:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prepare two API providers.&lt;/strong&gt; Test both. Have both &lt;code&gt;.env&lt;/code&gt; keys ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set API spend limits&lt;/strong&gt; on every account. $5–$10 cap. Takes 2 minutes. Prevents disasters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agree on your Git commit rhythm&lt;/strong&gt; with your team before the clock starts. Every 30 minutes, minimum.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔧 During the hackathon:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQLite is criminally underrated for MVPs.&lt;/strong&gt; Zero config, offline-capable, fast. Stop overthinking the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;MediaRecorder&lt;/code&gt; Web API&lt;/strong&gt; gives you browser-native audio capture with no third-party SDK. Use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When something breaks badly at hour 3&lt;/strong&gt;, the pivot decision needs to be fast. Don't debug a sinking ship for more than 30 minutes. Cut and move.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎯 For your pitch and demo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name your user.&lt;/strong&gt; Not "users in rural areas." Give them a face, an age, a specific problem. Judges remember people, not demographics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show the before and after&lt;/strong&gt; — not just the product. What does your user's life look like without this? What changes with it?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Answer "why you?" before they ask it.&lt;/strong&gt; Your personal connection to the problem is not a soft detail. It is your strongest differentiator.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧭 On purpose:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Technology built &lt;strong&gt;for&lt;/strong&gt; marginalized communities — not just &lt;em&gt;about&lt;/em&gt; them — is where real impact lives.&lt;/li&gt;
&lt;li&gt;If your product requires the user to adapt to it, you've already failed the people who need it most.&lt;/li&gt;
&lt;li&gt;A clear "why" is not decoration on top of your idea. It &lt;strong&gt;is&lt;/strong&gt; the idea.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 The Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NagrikAI — Civic Voice Assistant for Bangladesh
Stack: Next.js · Tailwind · OpenRouter · SQLite3 · MediaRecorder API
Built in: 6 hours
Status: MVP (Competition Build)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/md8-habibullah/NagrikAI-Voice--Impact-Dhaka-2026" rel="noopener noreferrer"&gt;NagrikAI-Voice — Impact Dhaka 2026&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ This repository contains proprietary competition code. Shared for reference and learning. Cloning for commercial use without explicit permission is not permitted.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💬 A Note to Every Developer Who's Been in That Moment
&lt;/h2&gt;

&lt;p&gt;You know the moment I mean.&lt;/p&gt;

&lt;p&gt;The one where the terminal just... tells you something is gone. Where the API returns something that makes no sense. Where you look at the clock and the math doesn't add up anymore.&lt;/p&gt;

&lt;p&gt;Where a quiet, horrible voice in your head says: &lt;em&gt;"Maybe this isn't for you."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been there. We were all there that night.&lt;/p&gt;

&lt;p&gt;And I want to say something that I mean completely:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That moment is not the end of your story. It's the middle.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The best builders I know aren't the ones who never fail. They're the ones who've been humbled, panicked, and still showed up to the demo.&lt;/p&gt;

&lt;p&gt;Every &lt;code&gt;rm -rf&lt;/code&gt; that didn't kill you made you more careful.&lt;br&gt;
Every API that failed made you architect better.&lt;br&gt;
Every budget overrun made you wiser about cost.&lt;/p&gt;

&lt;p&gt;This stuff is the education. Not the degree.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Ship what matters. Build for real people. Keep going when it gets dark.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the whole lesson.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Connect With Me
&lt;/h2&gt;

&lt;p&gt;I write about AI, civic tech, and building things that matter for communities that are often invisible to the tech industry. If that resonates with you — let's talk.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🌐 Website&lt;/td&gt;
&lt;td&gt;&lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;habibullah.dev&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐙 GitHub&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/md8-habibullah" rel="noopener noreferrer"&gt;github.com/md8-habibullah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✍️ Dev.to&lt;/td&gt;
&lt;td&gt;&lt;a href="https://dev.to/md8_habibullah"&gt;dev.to/md8_habibullah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💼 LinkedIn&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.linkedin.com/in/md-habibullahs" rel="noopener noreferrer"&gt;linkedin.com/in/md-habibullahs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐦 Twitter / X&lt;/td&gt;
&lt;td&gt;&lt;a href="https://x.com/md8_habibullah" rel="noopener noreferrer"&gt;x.com/md8_habibullah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📘 Facebook&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.facebook.com/md8.habibullah/" rel="noopener noreferrer"&gt;facebook.com/md8.habibullah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📸 Instagram&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.instagram.com/md8.habibullah" rel="noopener noreferrer"&gt;instagram.com/md8.habibullah&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;Built with love and an unreasonable amount of pressure.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— &lt;a href="https://github.com/md8-habibullah" rel="noopener noreferrer"&gt;Habibullah 🇧🇩&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>bangladesh</category>
      <category>ai</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Brave Browser Is the King in 2025–2026. There Is No Second Option</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Sun, 29 Mar 2026 03:43:33 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/brave-browser-is-the-king-in-2025-2026-there-is-no-second-option-dk8</link>
      <guid>https://dev.to/md8_habibullah/brave-browser-is-the-king-in-2025-2026-there-is-no-second-option-dk8</guid>
      <description>&lt;p&gt;I don't usually say things this firmly.&lt;/p&gt;

&lt;p&gt;But after years of watching Chrome slowly tighten its grip on everything — your data, your extensions, your search results, your attention — and after trying basically every alternative, I'm saying it plainly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you're using Chrome in 2026, you are volunteering your private life to a trillion-dollar advertising machine. For free. Every day.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Brave is the exit. Not a compromise. Not a "good enough." The actual answer.&lt;/p&gt;




&lt;h2&gt;
  
  
  First — What Chrome Did and Why It Matters
&lt;/h2&gt;

&lt;p&gt;In 2024, Google finalized &lt;strong&gt;Manifest V3&lt;/strong&gt; — a change to Chrome's extension system that effectively crippled ad blockers. uBlock Origin, the most powerful privacy extension ever made, stopped working fully on Chrome. The reason Google gave was "security." The real reason was that effective ad blocking threatens their entire business model.&lt;/p&gt;

&lt;p&gt;Brave continues to support Manifest V2 extensions like uBlock Origin, NoScript, and uMatrix that Chrome has removed, making it the better choice for power users who rely on these privacy tools.&lt;/p&gt;

&lt;p&gt;Let that sit. Chrome took away your ability to block ads. Brave still gives it to you.&lt;/p&gt;

&lt;p&gt;And it gets better — you don't even &lt;em&gt;need&lt;/em&gt; uBlock Origin on Brave. It already has a better blocker built in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Brave Shields — The Built-In Blocker That Extensions Can't Match
&lt;/h2&gt;

&lt;p&gt;Every website you visit, Brave's &lt;strong&gt;Shields&lt;/strong&gt; is running before the page loads. It blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Third-party ads and trackers&lt;/li&gt;
&lt;li&gt;Cross-site cookies&lt;/li&gt;
&lt;li&gt;Fingerprinting scripts&lt;/li&gt;
&lt;li&gt;Social media buttons that track you even if you don't click them&lt;/li&gt;
&lt;li&gt;Cookie consent banners (via the built-in Cookiecrumbler system)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not an extension. It's not add-on software bolted on the side. Unlike adblocking in other browsers, Brave's adblocking engine is built into the browser and maintained by their privacy team — deep optimizations that are impossible for extension-based blockers, which are restricted by browser extension APIs and sandboxing. This native architecture is also why Brave's ad and tracker blocking is entirely unaffected by Manifest V3.&lt;/p&gt;

&lt;p&gt;And in January 2026, Brave overhauled its Rust-based adblock engine, reducing memory consumption by 75% — roughly 45 MB of memory savings by default, scaling even higher for users with additional blocking lists enabled.&lt;/p&gt;

&lt;p&gt;Your browser is faster and uses less battery &lt;em&gt;because&lt;/em&gt; it's blocking. That's the opposite of how Chrome works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Want uBlock Origin Anyway? Add It.
&lt;/h2&gt;

&lt;p&gt;If you're a power user who wants your own filter lists on top of Brave's built-in blocking — you can. Brave supports Chrome Web Store extensions. Install uBlock Origin, add your custom lists (EasyPrivacy, Fanboy's Annoyance, whatever), and stack it on top of Shields.&lt;/p&gt;

&lt;p&gt;Most users won't need it. But the option is there. Chrome took that option away. Brave kept it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Google Never Gave You — What Brave Does by Default
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Chrome&lt;/th&gt;
&lt;th&gt;Brave&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ad blocking&lt;/td&gt;
&lt;td&gt;❌ (MV3 killed it)&lt;/td&gt;
&lt;td&gt;✅ Built-in Shields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tracker blocking&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ On by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fingerprint protection&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ On by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party cookies&lt;/td&gt;
&lt;td&gt;✅ Enabled (they reversed their own plan)&lt;/td&gt;
&lt;td&gt;❌ Blocked by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS forced upgrade&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sell your data&lt;/td&gt;
&lt;td&gt;✅ That's the business&lt;/td&gt;
&lt;td&gt;❌ No data collected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;uBlock Origin support&lt;/td&gt;
&lt;td&gt;❌ Removed&lt;/td&gt;
&lt;td&gt;✅ Works fine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Google confirmed in April 2025 that third-party cookies will remain enabled by default in Chrome — reversing their own privacy plans. Brave has blocked third-party cookies by default since its launch in 2016.&lt;/p&gt;

&lt;p&gt;Nine years of blocking what Chrome just gave up trying to fix.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy That Goes Deeper Than Ad Blocking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  HTTPS Everywhere — By Default
&lt;/h3&gt;

&lt;p&gt;Every connection upgraded to HTTPS automatically. No extension needed. No thinking required. Brave just does it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fingerprint Protection
&lt;/h3&gt;

&lt;p&gt;Your browser has a unique "fingerprint" — screen size, fonts, GPU info, language settings — that trackers use to identify you even without cookies. Brave randomizes this fingerprint per session, making you look like a different user every time. PCMag and PrivacyTests rate Brave among the top-scoring private browsers on fingerprinting and tracking metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tor Private Windows
&lt;/h3&gt;

&lt;p&gt;Open a &lt;strong&gt;Private Window with Tor&lt;/strong&gt; and your traffic routes through three encrypted nodes before reaching the destination. Not a VPN — actual onion routing. Built in. No extension. No Tor Browser download.&lt;/p&gt;

&lt;h3&gt;
  
  
  Microsoft Recall — Blocked
&lt;/h3&gt;

&lt;p&gt;Starting in version 1.81 for Windows users, Brave browser blocks Microsoft Recall from automatically taking screenshots of your browsing activity. Microsoft built a feature that takes screenshots of everything you do on your PC. Brave blocks it in the browser. That's the kind of protection you don't know you needed until someone tells you it exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Features Others Don't Have
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Brave Search — Independent Index
&lt;/h3&gt;

&lt;p&gt;Brave Search features an independent index — it crawls the web and stores its own results instead of using Google or Bing. That differs from DuckDuckGo, which uses the Bing API to populate search results.&lt;/p&gt;

&lt;p&gt;When you search on Brave Search, no one is watching. Not Google. Not Bing. Not anyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leo AI — Private by Design
&lt;/h3&gt;

&lt;p&gt;Brave has a built-in AI assistant called &lt;strong&gt;Leo&lt;/strong&gt;. Unlike asking ChatGPT or using Google's Gemini sidebar in Chrome, Brave Leo offers zero server storage and BYOM (bring your own model) support — your conversations aren't stored, not linked to your identity, not used to train anything.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brave Wallet — Built-In, No Extension
&lt;/h3&gt;

&lt;p&gt;Brave Wallet is a built-in crypto wallet that's more secure than other browsers that require third-party extensions for similar features. If you use crypto or Web3, having the wallet inside the browser itself (not a third-party extension with its own permissions and attack surface) is meaningfully safer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Brave Rewards — Optional, Your Choice
&lt;/h3&gt;

&lt;p&gt;Brave has an optional program where you can choose to see privacy-respecting ads in exchange for &lt;strong&gt;BAT (Basic Attention Token)&lt;/strong&gt;. This is completely opt-in. Turn it on if you want a small passive income from browsing. Ignore it if you don't. It has zero effect on the core privacy protections.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;Brave has grown to over 97 million active monthly users, with an average of over 41 million daily active users as of September 2025.&lt;/p&gt;

&lt;p&gt;In real-world usage, Brave loads pages 21% faster on Android because it blocks ads and trackers before they load. This also results in 14% less data usage and 40% better battery life on mobile.&lt;/p&gt;

&lt;p&gt;Faster. Less data. Longer battery. Because it's not downloading the tracking infrastructure Chrome loads on every page.&lt;/p&gt;




&lt;h2&gt;
  
  
  "But My Extensions / Google Services..."
&lt;/h2&gt;

&lt;p&gt;Fair question. Brave is Chromium-based, so the UI, extension compatibility, and general feature set feel familiar to Chrome users. Your Chrome extensions install directly from the Chrome Web Store. Your bookmarks, passwords, and history import in one click from Settings → Import.&lt;/p&gt;

&lt;p&gt;The only thing you lose is Google's ability to watch you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Available Everywhere
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows, macOS, Linux&lt;/strong&gt; — desktop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android, iOS&lt;/strong&gt; — mobile&lt;/li&gt;
&lt;li&gt;On Linux: &lt;code&gt;sudo apt install brave-browser&lt;/code&gt; via the official repo. One command. No snap. No flatpak headaches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Honest Bit
&lt;/h2&gt;

&lt;p&gt;No browser is a magic shield. Your IP is still visible to websites and your ISP unless you use a VPN or Tor window. Fingerprinting can still be done at a level no browser fully defeats. Brave had some past trust issues (a 2020 affiliate link controversy, a 2021 Tor DNS leak — both fixed). They're more transparent now, with public privacy update posts and a SOC 2 Type II audit on Brave Search.&lt;/p&gt;

&lt;p&gt;But compared to the alternative — a browser built by an advertising company, whose entire revenue model depends on knowing what you're doing online — Brave isn't just better. It's a different philosophy entirely.&lt;/p&gt;

&lt;p&gt;Your browser is the window through which you access the entire internet. Who owns that window matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Switch. Today.
&lt;/h2&gt;

&lt;p&gt;Download: &lt;a href="https://brave.com" rel="noopener noreferrer"&gt;brave.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Import your Chrome data in 60 seconds. Use it for a week. You won't go back.&lt;/p&gt;

&lt;p&gt;The web loads faster. The ads are gone. Your data stays yours. And you can still run every Chrome extension you already use.&lt;/p&gt;

&lt;p&gt;There is no good reason to stay on Chrome in 2026. There's just habit. Break it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Using something else? Tell me why in the comments — genuinely curious what keeps people on Chrome after all this.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;by &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;md8-habibullah&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>security</category>
      <category>browsers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Run Oracle SQL on Any PC Without the Nightmare (Docker + Linux Way)</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Tue, 17 Mar 2026 18:53:06 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/run-oracle-sql-on-any-pc-without-the-nightmare-docker-linux-way-57nk</link>
      <guid>https://dev.to/md8_habibullah/run-oracle-sql-on-any-pc-without-the-nightmare-docker-linux-way-57nk</guid>
      <description>&lt;p&gt;Every semester, the same thing happens.&lt;/p&gt;

&lt;p&gt;The university assignment drops. It says: &lt;em&gt;"Use Oracle SQL. No PostgreSQL. No MySQL. Oracle specifically."&lt;/em&gt; And then half the class spends their first week not learning SQL — they spend it fighting a broken installer, corrupted Oracle setup files, missing Java dependencies, and a setup guide written in 2009.&lt;/p&gt;

&lt;p&gt;I've been there. I work with databases professionally and even I found the native Oracle installer on Windows annoying. For a first-year student touching SQL for the first time? It's a genuine nightmare.&lt;/p&gt;

&lt;p&gt;So here's what actually works: &lt;strong&gt;Docker&lt;/strong&gt;. You run Oracle in a container, connect with a proper GUI tool, and you're writing real SQL in 5 minutes. No broken installation. No corrupted registry. Nothing permanently burned into your PC.&lt;/p&gt;

&lt;p&gt;But before the setup — a small note.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Word About Your OS Choice
&lt;/h2&gt;

&lt;p&gt;I run Linux. Have been for years. And every time I help a classmate debug an Oracle installation failure at 2am, that failure is always on Windows.&lt;/p&gt;

&lt;p&gt;Linux just works differently. Package managers are open. The terminal is a first-class citizen. Docker runs natively without a translation layer. When something breaks, you understand it and fix it — you don't reinstall and pray.&lt;/p&gt;

&lt;p&gt;I'm not here to force you to switch today. But if you've been curious about Linux — Ubuntu, Fedora, Arch, whatever calls to you — this is exactly the kind of workflow where you'll feel the difference. Every Docker command in this guide runs cleaner on Linux. Every terminal shortcut. Every file path. It's a different experience.&lt;/p&gt;

&lt;p&gt;The tools we're using — Docker, DBeaver, Beekeeper Studio — are all open source or open core. They don't lock you in. They don't require a license. They don't phone home. They work on any OS. That's intentional. That's the value of building on open foundations.&lt;/p&gt;

&lt;p&gt;If this guide converts even one person to trying Linux alongside their studies — worth it.&lt;/p&gt;

&lt;p&gt;Now. Let's get Oracle running.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Docker&lt;/strong&gt; — &lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;docker.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Runs Oracle in an isolated container. Think of it as a lightweight virtual machine that starts in seconds.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Linux:&lt;/strong&gt; Install Docker Engine directly — no "Desktop" wrapper needed, runs natively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows / Mac:&lt;/strong&gt; Install Docker Desktop — handles everything for you&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;🐧 &lt;strong&gt;Linux one-liner:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ubuntu / Debian&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io

&lt;span class="c"&gt;# Fedora&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;No 1.5 GB installer. Just a package. That's the Linux flex right there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;2. A database GUI — pick one:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Beekeeper Studio&lt;/strong&gt; → &lt;a href="https://www.beekeeperstudio.io/" rel="noopener noreferrer"&gt;beekeeperstudio.io&lt;/a&gt; — Clean, fast, beginner-friendly. Free community edition. Recommended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBeaver&lt;/strong&gt; → &lt;a href="https://dbeaver.io/" rel="noopener noreferrer"&gt;dbeaver.io&lt;/a&gt; — Heavier but works on everything. If Beekeeper won't open on your machine (it happens on some PCs), use this.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are free and open source. No trial period. No "sign in to continue." Just install and go.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Launch Oracle with One Command
&lt;/h2&gt;

&lt;p&gt;Make sure Docker is running, then open your terminal and run:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linux / Mac&lt;/strong&gt; (multi-line, easier to read):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 1521:1521 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; oracle-volume:/opt/oracle/oradata &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; oracle-free &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  gvenzl/oracle-free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows CMD / PowerShell (Run with Administrator mode)&lt;/strong&gt; — paste as a single line (backslash continuation doesn't work on Windows):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 1521:1521 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password &lt;span class="nt"&gt;-v&lt;/span&gt; oracle-volume:/opt/oracle/oradata &lt;span class="nt"&gt;--name&lt;/span&gt; oracle-free &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped gvenzl/oracle-free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same command. Same result. Two formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What each part means:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker run                        → create and start a new container
  -d                              → detached: run in background, get terminal back
  -p 1521:1521                    → port mapping: your-machine:inside-container
  -e ORACLE_PASSWORD=password     → set the database password
  -v oracle-volume:/opt/...       → named volume: data survives container restarts
  --name oracle-free              → give it a name you can reference later
  --restart unless-stopped        → auto-start Oracle when your PC reboots
  gvenzl/oracle-free              → the Docker image (lean, well-maintained Oracle Free)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First run downloads the image (~1–2 GB depending on your internet). Go make tea. After that, future starts are instant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Wait for Oracle to Be Ready
&lt;/h2&gt;

&lt;p&gt;The container starts immediately, but Oracle itself needs 60–90 seconds to fully initialize inside.&lt;/p&gt;

&lt;p&gt;Watch the logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; oracle-free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see a wall of output. Wait for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#########################
DATABASE IS READY TO USE!
#########################
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you see it, Oracle is fully up. Press &lt;code&gt;Ctrl+C&lt;/code&gt; to exit the log view — Oracle keeps running in the background.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Enter Oracle Directly from the Terminal
&lt;/h2&gt;

&lt;p&gt;Before we open any GUI, let me show you the powerful way.&lt;/p&gt;

&lt;p&gt;You can open a live SQL session &lt;em&gt;inside the container&lt;/em&gt; with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; oracle-free sqlplus system/password@FREEPDB1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Breaking this down:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;docker exec          → run a command inside an already-running container
  -i                 → interactive: keep stdin open so you can type
  -t                 → tty: allocate a terminal so it feels like a real shell
  oracle-free        → name of the container to enter
  sqlplus            → Oracle's command-line SQL client (already inside the container)
  system/password    → username / password
  @FREEPDB1          → the Oracle service/pluggable database to connect to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your prompt changes to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're now inside Oracle. Type SQL directly and press Enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'Hello from inside Oracle!'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;MSG&lt;/span&gt;
&lt;span class="c1"&gt;-------------------------&lt;/span&gt;
&lt;span class="n"&gt;Hello&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;inside&lt;/span&gt; &lt;span class="n"&gt;Oracle&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;

&lt;span class="k"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;EXIT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;EXIT&lt;/code&gt; to leave. You're back to your normal terminal. Oracle is still running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can also drop into a full bash shell inside the container:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; oracle-free bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a Linux shell &lt;em&gt;inside&lt;/em&gt; the container — you can explore the Oracle file system, check configs, run any Linux command. Type &lt;code&gt;exit&lt;/code&gt; to come back out.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[oracle@abc123 ~]$&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;← you&lt;span class="s1"&gt;'re inside the container now
&lt;/span&gt;&lt;span class="gp"&gt;[oracle@abc123 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;exit
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt;                     &lt;/span&gt;&lt;span class="s1"&gt;← back to your machine
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is how real server administration works. You SSH (or exec) into a machine and run things. Docker gives you that same model locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4 — Connect with Beekeeper Studio or DBeaver
&lt;/h2&gt;

&lt;p&gt;For your assignment work — writing, testing, running SQL with a proper editor — the GUI is your home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connection details — use these exactly:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Oracle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;localhost&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Port&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1521&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Username&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SYSTEM&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Password&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;password&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Service Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FREEPDB1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Service Name must be &lt;code&gt;FREEPDB1&lt;/code&gt; — not blank, not &lt;code&gt;XE&lt;/code&gt;, not &lt;code&gt;FREE&lt;/code&gt;. Exactly &lt;code&gt;FREEPDB1&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Beekeeper Studio:&lt;/strong&gt; New Connection → Oracle → fill in the fields → Test → Save &amp;amp; Connect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DBeaver:&lt;/strong&gt; New Database Connection → search Oracle → fill in fields → Test Connection (it will auto-download the Oracle JDBC driver if needed — allow it) → Finish.&lt;/p&gt;

&lt;p&gt;You'll see the database tree on the left. You're in.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5 — Basic SQL for Your Assignment
&lt;/h2&gt;

&lt;p&gt;Here's the essential SQL you'll need. This covers 90% of university assignments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;       &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;GENERATED&lt;/span&gt; &lt;span class="n"&gt;ALWAYS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;     &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;roll_no&lt;/span&gt;  &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="k"&gt;UNIQUE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dept&lt;/span&gt;     &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;cgpa&lt;/span&gt;     &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;📝 Oracle uses &lt;code&gt;VARCHAR2&lt;/code&gt;, not &lt;code&gt;VARCHAR&lt;/code&gt;. &lt;code&gt;NUMBER&lt;/code&gt;, not &lt;code&gt;INT&lt;/code&gt;. Oracle-specific data types — this is exactly why assignments require Oracle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Insert data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Habibullah'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CSE-2201'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Motiur Rahman'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'CSE-2202'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Fatima Begum'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'EEE-2201'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Electrical Engineering'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;code&gt;COMMIT&lt;/code&gt; is required in Oracle to save your changes permanently. Without it, changes only exist in your current session.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  SELECT — retrieve data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- All rows, all columns&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Specific columns only&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Filter with WHERE&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Sort results&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Multiple conditions&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UPDATE and DELETE
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Update a specific row&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;cgpa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'CSE-2201'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Delete a row&lt;/span&gt;
&lt;span class="k"&gt;DELETE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;roll_no&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'EEE-2201'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a second table and JOIN
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;course_id&lt;/span&gt;   &lt;span class="n"&gt;NUMBER&lt;/span&gt; &lt;span class="k"&gt;GENERATED&lt;/span&gt; &lt;span class="n"&gt;ALWAYS&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;IDENTITY&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;course_name&lt;/span&gt; &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;dept&lt;/span&gt;        &lt;span class="n"&gt;VARCHAR2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;credits&lt;/span&gt;     &lt;span class="n"&gt;NUMBER&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Database Systems'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Data Structures'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Computer Science'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;course_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;credits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Circuit Analysis'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Electrical Engineering'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;COMMIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- JOIN students to their department's courses&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;roll_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;course_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;credits&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;courses&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dept&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dept&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Aggregates — GROUP BY, COUNT, AVG
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Count students per department&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;total_students&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Average CGPA per department, only show above 3.5&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ROUND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cgpa&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="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;avg_cgpa&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;dept&lt;/span&gt;
&lt;span class="k"&gt;HAVING&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cgpa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Oracle-specific utilities
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- DUAL: Oracle's special dummy table for single-row expressions&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;SYSDATE&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;            &lt;span class="c1"&gt;-- current date and time&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;UPPER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hello world'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;dual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- See what tables you've created&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;table_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;user_tables&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Describe a table's structure&lt;/span&gt;
&lt;span class="k"&gt;DESCRIBE&lt;/span&gt; &lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Complete Docker Command Reference
&lt;/h2&gt;

&lt;p&gt;Every Docker command you'll need for managing your Oracle container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                   CONTAINER LIFECYCLE                           │
├─────────────────────────────┬───────────────────────────────────┤
│ Create + start Oracle       │ docker run -d ... (Step 1 cmd)   │
│ Start an existing container │ docker start oracle-free          │
│ Stop Oracle                 │ docker stop oracle-free           │
│ Restart Oracle              │ docker restart oracle-free        │
│ Delete the container        │ docker rm oracle-free             │
│   (stop it first!)          │   → data in volume is kept safe  │
└─────────────────────────────┴───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                   STATUS &amp;amp; MONITORING                           │
├─────────────────────────────┬───────────────────────────────────┤
│ See running containers      │ docker ps                         │
│ See ALL containers          │ docker ps -a                      │
│ Live log stream             │ docker logs -f oracle-free        │
│ Last N lines of logs        │ docker logs --tail 50 oracle-free │
│ Full container info         │ docker inspect oracle-free        │
│ Resource usage              │ docker stats oracle-free          │
└─────────────────────────────┴───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                   TERMINAL ACCESS                               │
├─────────────────────────────┬───────────────────────────────────┤
│ SQL*Plus session            │ docker exec -it oracle-free \     │
│                             │   sqlplus system/password@FREEPDB1│
│                             │                                   │
│ Bash shell inside           │ docker exec -it oracle-free bash  │
│                             │                                   │
│ Quick one-off SQL           │ docker exec oracle-free sqlplus \ │
│ (non-interactive)           │   -S system/password@FREEPDB1 \   │
│                             │   &amp;lt;&amp;lt;&amp;lt; "SELECT SYSDATE FROM dual;" │
└─────────────────────────────┴───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                   DATA &amp;amp; VOLUMES                                │
├─────────────────────────────┬───────────────────────────────────┤
│ List all volumes            │ docker volume ls                  │
│ Inspect data volume         │ docker volume inspect oracle-volume│
│ Delete data volume          │ docker volume rm oracle-volume    │
│   ⛔ THIS DELETES ALL DATA  │   Only do this to fully reset     │
└─────────────────────────────┴───────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│                   IMAGES                                        │
├─────────────────────────────┬───────────────────────────────────┤
│ List downloaded images      │ docker images                     │
│ Pull latest Oracle image    │ docker pull gvenzl/oracle-free    │
│ Remove image from disk      │ docker rmi gvenzl/oracle-free     │
└─────────────────────────────┴───────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The full workflow, from zero to SQL:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌──────────────────────┐
                        │  docker pull          │   ← first time only
                        │  gvenzl/oracle-free   │     (~1-2 GB download)
                        └──────────┬───────────┘
                                   │
                                   ▼
                        ┌──────────────────────┐
                        │  docker run -d ...    │   ← creates + starts container
                        │  --name oracle-free   │
                        └──────────┬───────────┘
                                   │
                                   ▼
                        ┌──────────────────────┐
                        │  docker logs -f       │   ← wait for:
                        │  oracle-free          │     DATABASE IS READY TO USE!
                        └──────────┬───────────┘
                                   │
                    ┌──────────────┴──────────────┐
                    │                             │
                    ▼                             ▼
         ┌──────────────────┐         ┌──────────────────────┐
         │  docker exec -it │         │  Beekeeper Studio    │
         │  oracle-free     │         │      or              │
         │  sqlplus ...     │         │  DBeaver             │
         └────────┬─────────┘         └──────────┬───────────┘
                  │                              │
                  ▼                              ▼
              SQL&amp;gt;  prompt                  SQL editor tab
           (terminal / CLI)              (visual / GUI)
                  │                              │
                  └──────────────┬───────────────┘
                                 │
                                 ▼
                    ┌────────────────────────┐
                    │   Write and run SQL    │
                    │  CREATE TABLE ...      │
                    │  INSERT INTO ...       │
                    │  SELECT * FROM ...     │
                    └────────────────────────┘
                                 │
                     ┌───────────┴──────────┐
                     │   When done today:   │
                     ▼                      ▼
             docker stop           docker start
             oracle-free           oracle-free
                                   (next session)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Issues &amp;amp; Fixes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Port 1521 is already in use"&lt;/strong&gt;&lt;br&gt;
Something else is occupying that port. Change &lt;code&gt;-p 1521:1521&lt;/code&gt; to &lt;code&gt;-p 1522:1521&lt;/code&gt; in your run command, and update the port field to &lt;code&gt;1522&lt;/code&gt; in your GUI connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beekeeper Studio won't launch on my PC&lt;/strong&gt;&lt;br&gt;
Use DBeaver. It's heavier but runs on everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ORA-12514: listener does not know of service FREEPDB1&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Oracle isn't fully initialized yet. Run &lt;code&gt;docker logs -f oracle-free&lt;/code&gt; and wait until you see &lt;code&gt;DATABASE IS READY TO USE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ORA-01017: invalid username/password&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Username: &lt;code&gt;SYSTEM&lt;/code&gt; (all caps). Password: &lt;code&gt;password&lt;/code&gt;. Service: &lt;code&gt;FREEPDB1&lt;/code&gt;. Check for typos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker: command not found&lt;/code&gt; on Linux&lt;/strong&gt;&lt;br&gt;
Docker isn't installed or the service isn't running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker   &lt;span class="c"&gt;# auto-start on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;  &lt;span class="c"&gt;# run docker without sudo&lt;/span&gt;
&lt;span class="c"&gt;# → log out and back in for the group change to apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Container disappeared after PC restart&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;--restart unless-stopped&lt;/code&gt; flag handles auto-start. If you removed it manually, re-run the Step 1 command. Your data is safe in the &lt;code&gt;oracle-volume&lt;/code&gt; volume unless you explicitly deleted it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Docker Beats the Native Installer
&lt;/h2&gt;

&lt;p&gt;The official Oracle installer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4–8 GB download&lt;/li&gt;
&lt;li&gt;Requires specific Visual C++ redistributables on Windows&lt;/li&gt;
&lt;li&gt;Conflicts with existing Java installations sometimes&lt;/li&gt;
&lt;li&gt;Occasionally fails silently with no clear error&lt;/li&gt;
&lt;li&gt;Permanently modifies your system files&lt;/li&gt;
&lt;li&gt;Doesn't fully uninstall&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First download ~1–2 GB, then instant starts forever after&lt;/li&gt;
&lt;li&gt;Fully isolated — zero changes to your actual system&lt;/li&gt;
&lt;li&gt;Full wipe and reinstall takes 30 seconds&lt;/li&gt;
&lt;li&gt;Identical behavior on Windows, Mac, and Linux&lt;/li&gt;
&lt;li&gt;Cleanup: &lt;code&gt;docker rm oracle-free &amp;amp;&amp;amp; docker volume rm oracle-volume&lt;/code&gt; — completely gone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And on Linux? Docker runs natively. No Desktop app. No virtualization layer. Just a container running directly on the kernel. Faster. Cleaner. The way it's meant to run.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Last Thing
&lt;/h2&gt;

&lt;p&gt;You just set up Oracle using Docker — an open-source container runtime. Connected with Beekeeper Studio or DBeaver — open-source tools. On a workflow that runs best on a free, open-source operating system.&lt;/p&gt;

&lt;p&gt;You paid nothing. You need no Windows license to run a database. You waited 5 minutes, not 5 hours.&lt;/p&gt;

&lt;p&gt;That's the open-source stack. That's what Linux gives you daily. The tools that professional developers use aren't locked behind expensive licenses — they're free, community-maintained, and they run better on open systems.&lt;/p&gt;

&lt;p&gt;If this guide saved you an afternoon of installation frustration — share it with your classmates. Alhamdulillah, that's the whole point.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Got stuck at any step? Drop the exact error message in the comments — I'll help you through it.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;by &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;md8-habibullah&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>oracle</category>
      <category>sql</category>
      <category>docker</category>
    </item>
    <item>
      <title>Auth in 2026: From Drop-In to Full Control — Pick Your Poison</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Tue, 17 Mar 2026 16:57:21 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/auth-in-2026-from-drop-in-to-full-control-pick-your-poison-55k1</link>
      <guid>https://dev.to/md8_habibullah/auth-in-2026-from-drop-in-to-full-control-pick-your-poison-55k1</guid>
      <description>&lt;p&gt;I've touched a lot of auth solutions over the years. Clerk for a quick SaaS MVP, Auth0 when the enterprise client needed SSO, Supabase Auth when I was too deep into their ecosystem to care, and recently Better Auth when I finally decided I was tired of paying per monthly active user forever.&lt;/p&gt;

&lt;p&gt;Every time someone asks me "what auth should I use?", I end up explaining the &lt;em&gt;same spectrum&lt;/em&gt;. Because there isn't one best answer — there's a best answer &lt;strong&gt;for where you are right now&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This guide covers that spectrum: from plug-in-and-ship managed solutions all the way to fully self-hosted systems you own 100%. No hype, just honest picks.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Spectrum, Visualized
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Easiest                                                        Most Control
   |                                                                  |
Clerk → Firebase → Kinde → Auth0 → Supabase → Better Auth → NextAuth → Keycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step to the right means: more code, more responsibility, more ownership, less monthly bill at scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Clerk — Just Works, No Questions Asked
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; SaaS MVPs, early-stage products, teams who want auth done in a day&lt;/p&gt;

&lt;p&gt;Clerk is the most developer-friendly managed auth you can find right now. Pre-built &lt;code&gt;&amp;lt;SignIn /&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;SignUp /&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;UserButton /&amp;gt;&lt;/code&gt; components — you drop them in, it works. No designing login pages, no thinking about session handling.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// That's literally it for Next.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SignIn&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@clerk/nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Page&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SignIn&lt;/span&gt; &lt;span class="p"&gt;/&amp;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 tradeoff: you're paying per MAU (Monthly Active User). Fine at 0–10k users, but starts to sting when you scale. You also have zero control over the underlying infrastructure — your users live on Clerk's servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; Best DX in this list. Use it for your MVP. Watch the pricing as you grow.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free up to 10k MAUs, then per-user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ First-class&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Social login&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ All major providers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  2. Firebase Authentication — Where Most of Us Actually Started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Mobile apps, rapid prototyping, Google Cloud users, beginners who want auth without touching a backend&lt;/p&gt;

&lt;p&gt;Let me be honest — Firebase Auth is where I started. Most developers I know did too. You're building your first real app, you need users to log in, and Google hands you this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getAuth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signInWithPopup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GoogleAuthProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;firebase/auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getAuth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GoogleAuthProvider&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nf"&gt;signInWithPopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Logged in:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;displayName&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;That's literally it. Three lines and your users can sign in with Google. No server. No JWT handling. No sessions to manage. For a beginner building something real for the first time, that feeling is genuinely magic.&lt;/p&gt;

&lt;p&gt;Firebase Auth handles email/password, all major social providers, phone/SMS, anonymous auth (try-before-signup flows), and custom tokens. It's backed by Google's infrastructure and the free Spark plan covers most serious side projects comfortably.&lt;/p&gt;

&lt;p&gt;The reality check comes later. Firebase Auth is deeply coupled to the Firebase ecosystem — Firestore, Cloud Functions, security rules all talk to each other through the same auth token. Powerful inside Firebase, but the moment you want to move to Postgres or a different backend, untangling auth is painful work. The B2B feature ceiling is also real — no RBAC, no organizations, no multi-tenancy. Just users.&lt;/p&gt;

&lt;p&gt;But it taught a lot of us what auth actually &lt;em&gt;is&lt;/em&gt;. That counts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// The pattern you'll memorize&lt;/span&gt;
&lt;span class="nf"&gt;onAuthStateChanged&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* signed in */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* signed out */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; The best way to understand auth for the first time. The wrong choice if you outgrow Firebase. Use it to learn, then graduate.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free Spark plan, then Blaze pay-as-you-go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-built UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ FirebaseUI (basic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform lock-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Deep Google/Firebase coupling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Kinde — Clerk with Superpowers (and a Better Free Tier)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; SaaS products, B2B apps, teams that want auth + RBAC + billing in one place, anyone who hit Clerk's pricing wall&lt;/p&gt;

&lt;p&gt;Kinde is the option I wish I'd known about earlier. On the surface it looks like Clerk — managed cloud auth, great DX, quick setup. But it ships with things that would cost you extra (or custom-built time) elsewhere: organizations, RBAC, feature flags, and a billing engine — all in one platform.&lt;/p&gt;

&lt;p&gt;The free tier supports up to 10,500 monthly active users with no credit card required, and users on your paid subscription plans don't count toward that MAU allowance. That's a meaningfully better starting deal than Clerk.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Next.js — about as fast as Clerk to set up&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getKindeServerSession&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@kinde-oss/kinde-auth-nextjs/server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Dashboard&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getKindeServerSession&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;given_name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&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 SDK collection spans 21+ languages and frameworks, with particularly strong support for React, Next.js, Vue, and mobile platforms. The migration toolkit is genuinely practical too — it handles imports from Auth0, Firebase, and custom systems with password hash support, meaning your users don't have to reset passwords.&lt;/p&gt;

&lt;p&gt;The feature flags baked into the auth layer are something I haven't seen done as cleanly elsewhere. You can gate features by user role, organization, or plan — all without adding a separate service.&lt;/p&gt;

&lt;p&gt;Kinde is compliant with ISO 27001, SOC 2 Type 2, GDPR, HIPAA, and PCI-DSS — so it handles the compliance checklist without needing Auth0's price tag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; If Clerk is your default managed auth pick, give Kinde a serious look. More generous free tier, built-in multi-tenancy, and an integrated billing engine that can replace a whole extra service.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free up to 10,500 MAUs, transparent paid tiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RBAC + Organizations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Built-in, not an add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Feature Flags&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native, tied to auth context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ SOC2, HIPAA, GDPR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. Auth0 (by Okta) — The Enterprise Standard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Enterprise clients, teams needing SSO, apps with serious compliance requirements&lt;/p&gt;

&lt;p&gt;Auth0 has been around long enough that it's basically the expected choice when a large client says "we need SSO with our Azure AD." The SDK coverage is extensive — React, Next.js, Vue, Node, iOS, Android — and the documentation is the best in the managed auth space.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Express setup&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express-openid-connect&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;issuerBaseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ISSUER_BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BASE_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;clientID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CLIENT_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SECRET&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 problem: Auth0's free tier got a lot less generous after the Okta acquisition. Pricing can get painful fast for B2C apps with lots of users. And the dashboard, while powerful, can feel like navigating a small city.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; Gold standard for enterprise. Overkill and expensive for indie projects.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free to 7,500 MAUs, then per-user&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSO / SAML&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Full enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ SOC2, HIPAA, GDPR&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Supabase Auth — Auth That Comes With a Backend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers already on Supabase, full-stack apps that want auth + DB in one place&lt;/p&gt;

&lt;p&gt;If you're using Supabase for your database and storage, using their Auth makes complete sense. Everything integrates natively — row-level security policies, JWT auto-passed to your Postgres queries, real-time subscriptions scoped per user. It just fits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;supabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;signInWithPassword&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;password&lt;/span&gt;&lt;span class="dl"&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 catch is platform coupling. Supabase Auth and Supabase DB are deeply intertwined. Switching away later involves untangling a lot of wires. Also — no pre-built UI components, so you're building your own login forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; Perfect inside the Supabase ecosystem. A compromise if you're not already there.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free tier available, pay as you scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes (via Docker)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-built UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Build your own&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform lock-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Tight Supabase coupling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. Better Auth — The Modern Open-Source Contender ⭐
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; TypeScript stacks (Next.js, Nuxt, SvelteKit, Astro, Hono), teams who want full ownership without full complexity&lt;/p&gt;

&lt;p&gt;This is the one that caught my attention recently. Better Auth is a relatively new open-source auth framework — TypeScript-first, framework-agnostic, plugin-based. It recently got backed by YC and is already the recommended auth library by Next.js, Nuxt, and Astro. The creator is a self-taught Ethiopian dev building in public, which is a great story — and the GitHub stars agree.&lt;/p&gt;

&lt;p&gt;What makes it different: instead of a giant config file you fight with, you get a clean API where you turn on exactly what you need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/auth.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;betterAuth&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;better-auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Pool&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;betterAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_URL&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;emailAndPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;socialProviders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GITHUB_CLIENT_ID&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;clientSecret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GITHUB_CLIENT_SECRET&lt;/span&gt;&lt;span class="o"&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;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin system is genuinely impressive — 2FA, passkeys, magic links, multi-tenancy, organization management, RBAC, API keys — each as a plugin you opt into. No bloat you didn't ask for. Automatic database schema generation means no manual SQL for auth tables.&lt;/p&gt;

&lt;p&gt;The one caveat: it's newer, so the ecosystem is smaller. If you hit an edge case, you might be first to document it. But with 5K+ Discord members and active development, the community is catching up fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; The strongest open-source option I've used in a while. If you're building a TypeScript app and want to own your auth without building it from scratch, start here.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, MIT open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ You own everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugin system&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ 2FA, passkeys, multi-tenant, org roles&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Written in TS, fully typed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. NextAuth / Auth.js — The Community Classic
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Next.js apps, developers who want battle-tested open source&lt;/p&gt;

&lt;p&gt;NextAuth (now rebranded Auth.js) is what most developers reach for when they hear "open-source auth for Next.js." It's been around long enough to have Stack Overflow answers for almost every problem. The providers list is enormous, adapters exist for every database, and the v5 (Auth.js) rewrite made it framework-agnostic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// auth.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;NextAuth&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;GitHub&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next-auth/providers/github&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;handlers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;NextAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;GitHub&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 limitation is mostly around authorization. NextAuth does authentication well but expects you to build your own RBAC layer, permissions logic, and organization management. It's also config-heavy when you go beyond basic social login.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; Solid, widely understood, great for simpler use cases. Reaches its limits when your auth logic gets complex.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, MIT open source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authorization (RBAC)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Build it yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Huge, well-documented&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. Keycloak — Full Self-Managed, Full Control
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Enterprise, government, compliance-heavy apps, organizations that can't let user data leave their infrastructure&lt;/p&gt;

&lt;p&gt;Keycloak is the nuclear option. Full open-source identity server — you run it yourself, on your servers, behind your firewall. SSO, MFA, LDAP/Active Directory federation, fine-grained authorization, SAML, OIDC, user management admin UI, audit logs — the whole picture.&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="c1"&gt;# docker-compose.yml&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;keycloak&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;quay.io/keycloak/keycloak:latest&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;KEYCLOAK_ADMIN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
      &lt;span class="na"&gt;KEYCLOAK_ADMIN_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;start-dev&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tradeoff is real: Keycloak is complex. The admin console has depth that takes time to understand. Running it in production means maintaining a Java service, handling upgrades carefully, and knowing what you're doing with realms, clients, and flows. This is not a weekend project — it's infrastructure.&lt;/p&gt;

&lt;p&gt;But: zero licensing cost regardless of user count. If you have 10 million users, you pay the same $0. That changes the economics at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest verdict:&lt;/strong&gt; The right call for large enterprises, regulated industries, or anyone who cannot hand user data to a third party. For indie devs — probably overkill.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hostable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Fully&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Full SSO, LDAP, SAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ High — plan for it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Quick Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Managed?&lt;/th&gt;
&lt;th&gt;Price Model&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Clerk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Cloud&lt;/td&gt;
&lt;td&gt;Per MAU (free to 10k)&lt;/td&gt;
&lt;td&gt;MVP, SaaS&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firebase Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Cloud&lt;/td&gt;
&lt;td&gt;Free / pay-as-you-go&lt;/td&gt;
&lt;td&gt;Mobile, beginners&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kinde&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Cloud&lt;/td&gt;
&lt;td&gt;Free to 10.5k MAU&lt;/td&gt;
&lt;td&gt;SaaS, B2B, multi-tenant&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Cloud&lt;/td&gt;
&lt;td&gt;Per MAU&lt;/td&gt;
&lt;td&gt;Enterprise, SSO&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supabase Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;Platform tier&lt;/td&gt;
&lt;td&gt;Supabase apps&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Better Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Self-host&lt;/td&gt;
&lt;td&gt;Free / OSS&lt;/td&gt;
&lt;td&gt;TS apps, full ownership&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NextAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Self-host&lt;/td&gt;
&lt;td&gt;Free / OSS&lt;/td&gt;
&lt;td&gt;Next.js, simple flows&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Keycloak&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Self-host&lt;/td&gt;
&lt;td&gt;Free / OSS&lt;/td&gt;
&lt;td&gt;Enterprise, regulated&lt;/td&gt;
&lt;td&gt;🔴 High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How to Actually Choose
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Just starting out and want to understand auth?
└── Firebase Auth. Learn the basics. Graduate when you're ready.

Need auth done this week, MVP in progress?
├── Clerk — best DX, ships fast
└── Kinde — if you know you'll need orgs, RBAC, or billing later

Enterprise client requiring SSO with Azure/Okta/Google Workspace?
└── Auth0. It's what they expect and it handles it natively.

Already on Supabase?
└── Supabase Auth. Obvious choice inside that ecosystem.

Building a TypeScript app and want full ownership without starting from scratch?
└── Better Auth. Seriously — try it once.

Need open-source, well-documented, community-solved edge cases?
└── NextAuth / Auth.js. Especially for simpler flows.

Users can never leave your infrastructure (HIPAA, government, regulated data)?
└── Keycloak. Accept the complexity. It's worth it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Real Talk
&lt;/h2&gt;

&lt;p&gt;Authentication is one of those areas where picking the wrong abstraction level costs you later. Too managed = expensive at scale or missing features. Too low-level = you're now a security engineer who also writes features.&lt;/p&gt;

&lt;p&gt;My honest journey: Firebase to understand the basics → Clerk for my first real SaaS → Better Auth when I wanted ownership without the complexity tax. Kinde would have saved me a migration if I'd known about it earlier — that 10,500 MAU free tier plus built-in billing is a genuinely strong package.&lt;/p&gt;

&lt;p&gt;Better Auth is still what lives rent-free in my head for TypeScript projects. But Kinde is the managed option I'd reach for today over Clerk, and Firebase will always have a soft spot for being the first auth that clicked.&lt;/p&gt;

&lt;p&gt;Clerk wins on day-zero DX. Kinde wins when you need multi-tenancy day one. Keycloak wins when the lawyers are involved. Firebase wins when you're learning. That's just the honest map.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Which one are you currently using? Drop it in the comments — and tell me if you've switched away from something and regret it (or don't).&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;by &lt;a href="https://habibullah.dev" rel="noopener noreferrer"&gt;md8-habibullah&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Lost 2 Days to a Deployment Error That Had a 5-Line Fix</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Mon, 09 Mar 2026 05:15:42 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/i-lost-2-days-to-a-deployment-error-that-had-a-5-line-fix-4f3h</link>
      <guid>https://dev.to/md8_habibullah/i-lost-2-days-to-a-deployment-error-that-had-a-5-line-fix-4f3h</guid>
      <description>&lt;p&gt;&lt;em&gt;A full-stack developer's honest confession about TypeScript, Node.js, and the rabbit hole nobody warns you about.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;It was supposed to be a simple task.&lt;/p&gt;

&lt;p&gt;Deploy the backend. Maybe 30 minutes. Grab a coffee, call it done.&lt;/p&gt;

&lt;p&gt;That was Monday morning. By Tuesday night, I was debugging at midnight, staring at a &lt;code&gt;500: FUNCTION_INVOCATION_FAILED&lt;/code&gt; error on Vercel, wondering where my life went wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup (That Looked Totally Fine)
&lt;/h2&gt;

&lt;p&gt;I was finishing up &lt;strong&gt;MediStore&lt;/strong&gt; — a full-stack medicine management system. Express, TypeScript, Prisma, PostgreSQL. Modern stack, clean code, everything felt solid during development.&lt;/p&gt;

&lt;p&gt;For dev mode, I had a nice little setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tsx watch src/server.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hot reload, TypeScript support out of the box. Bliss. I was flying.&lt;/p&gt;

&lt;p&gt;Then came deployment day.&lt;/p&gt;




&lt;h2&gt;
  
  
  The First Wall: &lt;code&gt;tsc&lt;/code&gt; and Node Don't Get Along Like You Think
&lt;/h2&gt;

&lt;p&gt;My first instinct was obvious — compile with &lt;code&gt;tsc&lt;/code&gt;, then run with &lt;code&gt;node&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tsc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; node dist/server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple. Logical. &lt;strong&gt;Completely broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The error? Node couldn't find packages. Imports were failing. ESM vs CJS was exploding. I tried Node v24. Tried v25. Same thing, different error messages mocking me in different fonts.&lt;/p&gt;

&lt;p&gt;Here's the thing nobody puts in a bold warning box anywhere: &lt;strong&gt;Node.js cannot natively run TypeScript.&lt;/strong&gt; &lt;code&gt;tsc&lt;/code&gt; compiles it, sure — but the output can still fail spectacularly depending on your module system, how your imports are written, and what phase of the moon it is.&lt;/p&gt;

&lt;p&gt;My &lt;code&gt;tsconfig.json&lt;/code&gt; had &lt;code&gt;"module": "esnext"&lt;/code&gt; and &lt;code&gt;"type": "module"&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt;. Sounds right. Felt right. Was a nightmare.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Second Wall: Vercel Wanted Something Specific
&lt;/h2&gt;

&lt;p&gt;While fighting the local build, I pushed what I had to Vercel anyway. Optimism. You know how it is.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;500: INTERNAL_SERVER_ERROR
Code: FUNCTION_INVOCATION_FAILED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I tried a different deployment strategy. Different URL, same pain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;404: NOT_FOUND
Code: NOT_FOUND
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At some point I wasn't even reading the errors anymore. I was just refreshing and hoping.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Turning Point: My Instructor Said "Use tsup"
&lt;/h2&gt;

&lt;p&gt;I'd heard of &lt;code&gt;tsup&lt;/code&gt; before. Never used it. Didn't think I needed it.&lt;/p&gt;

&lt;p&gt;My instructor sent over a PDF with the fix. I almost didn't read it — I was convinced the problem was something deeper, something architectural, something that required a complete rethink.&lt;/p&gt;

&lt;p&gt;It wasn't. It was this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prisma generate &amp;amp;&amp;amp; tsup src/server.ts --format esm --platform node --target node20 --outDir api"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. That's the tweet.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tsup&lt;/code&gt; is a zero-config bundler built on top of esbuild. It bundles your TypeScript correctly, handles ESM output, tree-shakes, minifies — and critically, it &lt;strong&gt;actually works&lt;/strong&gt; when Node tries to run the output.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Was Actually Going Wrong
&lt;/h2&gt;

&lt;p&gt;Looking back, the chain of failures made sense:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;tsc&lt;/code&gt; output&lt;/strong&gt; preserves your import paths as-is. If you wrote &lt;code&gt;import { something } from './utils'&lt;/code&gt; without the &lt;code&gt;.js&lt;/code&gt; extension, the compiled output breaks in ESM mode — because Node expects explicit extensions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The &lt;code&gt;ERR_MODULE_NOT_FOUND: Cannot find package 'test'&lt;/code&gt;&lt;/strong&gt; error (visible in my terminal screenshot) was a ghost dependency issue — something in the build referencing a package that wasn't bundled correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vercel's serverless functions&lt;/strong&gt; need a specific entry point. My &lt;code&gt;vercel.json&lt;/code&gt; was pointing at &lt;code&gt;dist/server.js&lt;/code&gt; when my actual output was going to &lt;code&gt;api/server.js&lt;/code&gt;. A typo in a JSON file cost me hours.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Fix, All in One Place
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;package.json&lt;/code&gt; scripts:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsx watch src/server.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prisma generate &amp;amp;&amp;amp; tsup src/server.ts --format esm --clean --minify --outDir api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node api/server.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;vercel.json&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"builds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api/server.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@vercel/node"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"routes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/(.*)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"dest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api/server.js"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;server.ts&lt;/code&gt; entry point&lt;/strong&gt; — export your app as default:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run &lt;code&gt;pnpm build&lt;/code&gt; locally first. Watch the &lt;code&gt;/api&lt;/code&gt; folder appear. Check the filename. Put that exact filename in &lt;code&gt;vercel.json&lt;/code&gt;. Then deploy.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;tsx&lt;/code&gt; is for development. It's not a build tool.&lt;/strong&gt;&lt;br&gt;
It's magical for hot-reloading TypeScript, but it's not meant to produce deployable output. Reach for &lt;code&gt;tsup&lt;/code&gt; or &lt;code&gt;esbuild&lt;/code&gt; when you need to ship.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. ESM in Node.js is still a minefield.&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;"type": "module"&lt;/code&gt; in &lt;code&gt;package.json&lt;/code&gt; changes everything. Bundlers like &lt;code&gt;tsup&lt;/code&gt; handle the edge cases so you don't have to become an expert in Node module resolution at 1am.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Check your output directory before touching &lt;code&gt;vercel.json&lt;/code&gt;.&lt;/strong&gt;&lt;br&gt;
This sounds embarrassing to type. I'm typing it anyway. The file Vercel deploys has to actually exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Your instructor's boring PDF might be the answer.&lt;/strong&gt;&lt;br&gt;
Read it first. Then go exploring. Not the other way around.&lt;/p&gt;




&lt;h2&gt;
  
  
  In Hindsight
&lt;/h2&gt;

&lt;p&gt;Two days for a 5-line fix. Classic.&lt;/p&gt;

&lt;p&gt;But I came out the other side actually understanding &lt;em&gt;why&lt;/em&gt; it works now — not just copying config from Stack Overflow and hoping for the best. That's worth something.&lt;/p&gt;

&lt;p&gt;If you're building a TypeScript backend and thinking "I'll just use &lt;code&gt;tsc&lt;/code&gt;" — maybe reach for &lt;code&gt;tsup&lt;/code&gt; from the start. Future-you will be grateful. Future-you has a coffee to drink instead of an error log to read.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building MediStore as part of a full-stack development course. More posts on the way — probably also born from pain.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If this saved you a day, drop a clap. If you've been through something similar, I'd love to hear it in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deployment</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>vercel</category>
    </item>
    <item>
      <title>Distro Wars 2026: Which Linux Should You Actually Use?</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Sun, 22 Feb 2026 08:50:04 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/distro-wars-2026-which-linux-should-you-actually-use-51n</link>
      <guid>https://dev.to/md8_habibullah/distro-wars-2026-which-linux-should-you-actually-use-51n</guid>
      <description>&lt;p&gt;Everyone has an opinion about Linux distros. Ask on Reddit and you'll get 40 different answers, three flame wars, and someone telling you to use Arch BTW.&lt;/p&gt;

&lt;p&gt;This guide isn't that.&lt;/p&gt;

&lt;p&gt;This is a &lt;strong&gt;practical breakdown&lt;/strong&gt; — who each distro is actually for, what it's genuinely good at, and which one you should install &lt;em&gt;today&lt;/em&gt; based on what you're trying to do. No gatekeeping. No "real Linux users only use X." Just honest picks.&lt;/p&gt;




&lt;h2&gt;
  
  
  First: What Actually Separates Distros?
&lt;/h2&gt;

&lt;p&gt;Before picking, understand what actually differs between them — because it's not just the wallpaper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package Manager&lt;/strong&gt; — How you install software. &lt;code&gt;apt&lt;/code&gt; (Debian/Ubuntu), &lt;code&gt;dnf&lt;/code&gt; (Fedora), &lt;code&gt;pacman&lt;/code&gt; (Arch), &lt;code&gt;zypper&lt;/code&gt; (openSUSE). This affects what's available and how fresh the software is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release Model&lt;/strong&gt; — &lt;em&gt;Fixed release&lt;/em&gt; (Ubuntu, Fedora) ships stable versions on a schedule. &lt;em&gt;Rolling release&lt;/em&gt; (Arch, openSUSE Tumbleweed) continuously updates — you always have the latest, but occasionally something breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Desktop Environment&lt;/strong&gt; — GNOME, KDE Plasma, XFCE, Cinnamon, etc. Most distros let you choose, but each has a "flagship" DE that's most polished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Target Audience&lt;/strong&gt; — Some distros are built for beginners (Ubuntu, Mint), some for developers (Fedora, Arch), some for servers (Debian, RHEL), some for privacy (Tails, Whonix).&lt;/p&gt;

&lt;p&gt;Got it? Good. Let's get into the actual contenders.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Ubuntu — The Reliable Default
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Beginners, developers new to Linux, anyone who wants things to just work&lt;/p&gt;

&lt;p&gt;Ubuntu is the most documented Linux distro on the planet. Every tutorial, Stack Overflow answer, and blog post that says "on Linux, do this..." means Ubuntu. That's genuinely valuable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APT package manager with the largest software repository&lt;/li&gt;
&lt;li&gt;Snap packages for easy app installs (controversial but convenient)&lt;/li&gt;
&lt;li&gt;LTS releases supported for 5 years — stable, predictable&lt;/li&gt;
&lt;li&gt;Best driver support out of the box&lt;/li&gt;
&lt;li&gt;Ubuntu Server is &lt;em&gt;the&lt;/em&gt; default for cloud VMs (AWS, DigitalOcean, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Canonical (Ubuntu's maker) makes decisions that annoy power users — Snap being the main one. Some packages are aggressively Snapped and run noticeably slower. The GNOME implementation has historically been slightly behind upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package manager speed:&lt;/strong&gt; &lt;code&gt;apt install &amp;lt;package&amp;gt;&lt;/code&gt; — familiar, reliable, not the fastest&lt;br&gt;
&lt;strong&gt;Release:&lt;/strong&gt; LTS every 2 years (22.04, 24.04...) — predictable and safe&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The command Ubuntu users know by heart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Ubuntu if:&lt;/strong&gt; You're switching from Windows, you need maximum compatibility with tutorials and tools, or you're deploying servers.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Linux Mint — Ubuntu But Actually Pleasant
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Windows switchers, people who want a familiar desktop, anyone who hated Ubuntu's GNOME&lt;/p&gt;

&lt;p&gt;Mint is built on Ubuntu (same packages, same compatibility) but makes very different UI decisions. The Cinnamon desktop feels close to Windows — taskbar at the bottom, Start-menu-style app launcher, system tray. No learning curve for the layout.&lt;/p&gt;

&lt;p&gt;It also ships without Snap by default and blocks Canonical from installing it silently. Software installs from traditional APT repos instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cinnamon desktop is genuinely polished and intuitive&lt;/li&gt;
&lt;li&gt;Extremely stable — Mint doesn't rush updates&lt;/li&gt;
&lt;li&gt;Update Manager lets you choose how aggressively to update (brilliant for cautious users)&lt;/li&gt;
&lt;li&gt;Better multimedia support out of the box (codecs included)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Mint is &lt;em&gt;conservative&lt;/em&gt; — which is a feature for stability but means you might be waiting on newer software versions. Not ideal if you're chasing the latest everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Mint if:&lt;/strong&gt; You're migrating from Windows and want the least adjustment, or you want Ubuntu compatibility without Snap.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Zorin OS — Windows, But Linux
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Absolute beginners, Windows migrants who want the smoothest possible transition, non-technical users&lt;/p&gt;

&lt;p&gt;If Linux Mint is "familiar," Zorin OS is "identical." It's built specifically to look and feel like Windows — Start menu, taskbar, system tray, right-click behavior — to the point where you can hand it to someone who's never touched Linux and they'll find their way around in minutes.&lt;/p&gt;

&lt;p&gt;Zorin is Ubuntu-based, so it inherits full APT compatibility and Ubuntu's enormous software library. But where Mint stays neutral on looks, Zorin actively mimics Windows 11's design language. There's even a &lt;strong&gt;"Zorin Appearance"&lt;/strong&gt; panel where you can switch the desktop layout between Windows-style, macOS-style, or a traditional GNOME-style — without installing anything extra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The most Windows-like Linux experience available — bar none&lt;/li&gt;
&lt;li&gt;Zorin Appearance panel lets you switch desktop layouts in one click&lt;/li&gt;
&lt;li&gt;Ships with a good default app selection — LibreOffice, media players, browser — ready to use&lt;/li&gt;
&lt;li&gt;Zorin Connect (like KDE Connect) — sync your phone notifications, files, and clipboard with your PC&lt;/li&gt;
&lt;li&gt;Ubuntu base means maximum software compatibility and tutorial coverage&lt;/li&gt;
&lt;li&gt;Zorin OS Lite edition runs well on older hardware (4GB RAM, older CPUs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Zorin has a &lt;strong&gt;free Core edition&lt;/strong&gt; and a paid &lt;strong&gt;Pro edition&lt;/strong&gt; (~$47 one-time). The Pro version unlocks extra desktop layouts (macOS-style, touchscreen-optimized), professional app bundles, and priority support. The free version is genuinely complete — you're not missing core features, just cosmetic extras. Some users feel the Pro upsell is prominent for an open-source distro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Same Ubuntu/Debian commands — fully familiar&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Zorin if:&lt;/strong&gt; You're helping a family member switch from Windows, you want zero learning curve on the desktop, or you need a distro that works well on older hardware with a lightweight edition.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Fedora — The Developer's Daily Driver
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers, people who want cutting-edge without full rolling release chaos&lt;/p&gt;

&lt;p&gt;Fedora is Red Hat's "community upstream" — meaning new features land in Fedora first, get stabilized, then go into RHEL (the enterprise version). This makes Fedora consistently &lt;strong&gt;6-12 months ahead&lt;/strong&gt; of Ubuntu on kernel versions, toolchains, and desktop features.&lt;/p&gt;

&lt;p&gt;It ships pure upstream GNOME — no patches, no modifications. If GNOME released it, Fedora has it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNF package manager is fast and excellent&lt;/li&gt;
&lt;li&gt;Ships the newest stable kernel — better hardware support for recent machines&lt;/li&gt;
&lt;li&gt;Flatpak is the default extra-app format (better than Snap — sandboxed, fast, universal)&lt;/li&gt;
&lt;li&gt;Fedora Workstation, Silverblue (immutable), and Server editions each solve different needs&lt;/li&gt;
&lt;li&gt;If you learn Linux on Fedora, you understand RHEL/CentOS — hugely valuable professionally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Fedora releases every ~6 months and is only supported for ~13 months. You &lt;em&gt;will&lt;/em&gt; upgrade. Also, some proprietary drivers (Nvidia especially) require a third-party repo (RPM Fusion).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Fedora's DNF is genuinely great&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Fedora if:&lt;/strong&gt; You're a developer who wants modern tools, you care about GNOME being excellent, or you want skills transferable to enterprise Linux.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Arch Linux — Maximum Control, Maximum Effort
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want to understand every layer of their system, power users, people who want the absolute latest software&lt;/p&gt;

&lt;p&gt;Arch is a rolling release distro where &lt;em&gt;you build your own system&lt;/em&gt; from scratch. No graphical installer. No pre-installed desktop. You choose every component.&lt;/p&gt;

&lt;p&gt;This sounds painful. It kind of is the first time. But the result is a system with zero bloat — only exactly what you installed, configured exactly how you want it.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;AUR (Arch User Repository)&lt;/strong&gt; is the real killer feature — a community-maintained collection of basically every piece of Linux software ever. If it exists, it's probably in the AUR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always the absolute latest software (rolling release)&lt;/li&gt;
&lt;li&gt;The Arch Wiki is the best Linux documentation resource on the internet — useful even if you don't use Arch&lt;/li&gt;
&lt;li&gt;Pacman is fast and elegant&lt;/li&gt;
&lt;li&gt;AUR gives you access to almost any software imaginable&lt;/li&gt;
&lt;li&gt;Deep understanding of Linux comes naturally because you built it yourself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Rolling release means occasional breakage. This is manageable with care (&lt;code&gt;paru -Syu&lt;/code&gt; before a big presentation is not advised). Also: the install process is genuinely manual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Arch users install everything themselves&lt;/span&gt;
pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;package&amp;gt;       &lt;span class="c"&gt;# official repos&lt;/span&gt;
paru &lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;package&amp;gt;         &lt;span class="c"&gt;# AUR helper for community packages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Arch if:&lt;/strong&gt; You want to learn how Linux actually works, you need bleeding-edge software, or you want maximum customization.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Manjaro — Arch Without the Headache
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; People who want Arch's power with an actual installer, intermediate users ready to leave Ubuntu&lt;/p&gt;

&lt;p&gt;Manjaro is Arch underneath — same AUR access, same rolling release, same pacman — but ships with a polished graphical installer, pre-configured desktop environments (KDE, GNOME, XFCE), and hardware detection that just works out of the box.&lt;/p&gt;

&lt;p&gt;The key difference: Manjaro holds packages back from Arch's repos for &lt;strong&gt;2 extra weeks&lt;/strong&gt; of testing before pushing to users. You're still rolling, still fresh, but with a small safety buffer baked in. For most people stepping up from Ubuntu, this is exactly the right trade-off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full AUR access — same massive software library as Arch&lt;/li&gt;
&lt;li&gt;Graphical installer — no manual partitioning commands&lt;/li&gt;
&lt;li&gt;Excellent hardware detection, especially Nvidia and WiFi cards&lt;/li&gt;
&lt;li&gt;Multiple official desktop flavors — the KDE Plasma edition is particularly polished&lt;/li&gt;
&lt;li&gt;Skills transfer directly to Arch if you ever want to go deeper&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
The 2-week delay occasionally causes AUR package conflicts — some AUR packages assume you have the very latest Arch libs. Rare, but worth knowing. Manjaro also had some past community trust issues (expired SSL certs) though it's been solid since.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Same pacman as Arch — your skills transfer perfectly&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt;            &lt;span class="c"&gt;# update everything&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; &amp;lt;package&amp;gt;    &lt;span class="c"&gt;# install from repos&lt;/span&gt;
pamac &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package&amp;gt;     &lt;span class="c"&gt;# Manjaro's friendly package manager CLI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick Manjaro if:&lt;/strong&gt; You want AUR access and rolling release freshness but aren't ready to install an OS manually from scratch. It's the best Arch on-ramp available.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Debian — The Bedrock
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Servers, stability-critical systems, sysadmins, people who want software that never breaks&lt;/p&gt;

&lt;p&gt;Debian is what Ubuntu is built on. It prioritizes stability above everything — packages are tested exhaustively before entering the stable release, which means they can be 1-2 years behind the latest version.&lt;/p&gt;

&lt;p&gt;On a server, this is perfect. You don't &lt;em&gt;want&lt;/em&gt; your database server running experimental kernel builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exceptional stability — Debian Stable is battle-tested&lt;/li&gt;
&lt;li&gt;Huge package repository&lt;/li&gt;
&lt;li&gt;Runs on almost any hardware (x86, ARM, MIPS, RISC-V...)&lt;/li&gt;
&lt;li&gt;The standard base for containers and VPS images worldwide&lt;/li&gt;
&lt;li&gt;Free of corporate influence — community-driven&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What to watch out for:&lt;/strong&gt;&lt;br&gt;
Debian Stable is &lt;em&gt;old&lt;/em&gt; by design. Newer hardware sometimes needs backport packages. Not a great desktop experience out of the box — it's a server OS that also runs desktops.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pick Debian if:&lt;/strong&gt; You're running servers, you prioritize stability over new features, or you want the most principled free software distro.&lt;/p&gt;


&lt;h2&gt;
  
  
  8. openSUSE — The Underrated Gem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers wanting rolling release with safety nets, sysadmins, KDE fans&lt;/p&gt;

&lt;p&gt;openSUSE comes in two flavors: &lt;strong&gt;Leap&lt;/strong&gt; (stable, RHEL-based) and &lt;strong&gt;Tumbleweed&lt;/strong&gt; (rolling release). Tumbleweed is what makes it interesting — it's a rolling release but with an automated testing pipeline that means updates are validated before they land on your machine. You get freshness without the breakage risk of raw Arch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YaST&lt;/strong&gt; is openSUSE's control center — a graphical tool for configuring nearly everything (network, services, users, firewall, packages) that makes system administration approachable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tumbleweed keeps you rolling safely&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper refresh &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;zypper update    &lt;span class="c"&gt;# update everything&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;zypper &lt;span class="nb"&gt;install&lt;/span&gt; &amp;lt;package&amp;gt;               &lt;span class="c"&gt;# install software&lt;/span&gt;
yast2                                        &lt;span class="c"&gt;# launch the graphical control center&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pick openSUSE Tumbleweed if:&lt;/strong&gt; You want rolling release stability, KDE Plasma as a polished desktop, or you're a sysadmin who values good tooling.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Distro&lt;/th&gt;
&lt;th&gt;Stability&lt;/th&gt;
&lt;th&gt;Freshness&lt;/th&gt;
&lt;th&gt;Beginner-Friendly&lt;/th&gt;
&lt;th&gt;Best Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;General, servers, cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux Mint&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Windows migrants, beginners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zorin OS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Windows/Mac look-alikes, family PCs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fedora&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Developers, workstations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Arch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐&lt;/td&gt;
&lt;td&gt;Power users, learners&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Manjaro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Arch on-ramp, rolling + friendly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debian&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Servers, stability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;openSUSE TW&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐&lt;/td&gt;
&lt;td&gt;⭐⭐⭐&lt;/td&gt;
&lt;td&gt;Developers, KDE fans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Honest Decision Tree
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Are you new to Linux?
├── Yes → Coming from Windows?   → Zorin OS (closest to Windows)
│         Want familiar but free? → Linux Mint
│         Coming from Mac?        → Ubuntu or Fedora
└── No  → Keep going

Are you setting up a server or VPS?
├── Yes → Ubuntu LTS or Debian
└── No  → Keep going

Do you want the absolute latest software?
├── Yes → Want full control?  → Arch Linux
│         Want a safety net?  → Manjaro or openSUSE Tumbleweed
└── No  → Keep going

Are you a developer who wants modern tools without chaos?
└── Fedora (the sweet spot answer)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What About Niche Picks?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pop!_OS&lt;/strong&gt; — Ubuntu base, but with an excellent GNOME customization and best-in-class Nvidia driver support out of the box. Great for gaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kali Linux&lt;/strong&gt; — Security and penetration testing tooling pre-installed. Not a daily driver. Use it for its specific purpose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tails&lt;/strong&gt; — Runs entirely in RAM, leaves no trace, routes everything through Tor. For maximum privacy situations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NixOS&lt;/strong&gt; — Declarative configuration — your entire OS config lives in one file, reproducible anywhere. Steep learning curve but beloved by the people who get it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Answer
&lt;/h2&gt;

&lt;p&gt;There's no "best" distro. There's only the best distro &lt;strong&gt;for your situation right now&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you're just starting — &lt;strong&gt;Zorin OS or Mint&lt;/strong&gt;. Familiar desktop, no friction, same Ubuntu compatibility underneath.&lt;br&gt;
If you're developing daily — &lt;strong&gt;Fedora&lt;/strong&gt;. Fresh toolchains, excellent GNOME, professionally relevant.&lt;br&gt;
If you run servers — &lt;strong&gt;Ubuntu LTS or Debian&lt;/strong&gt;. Stable, documented, industry standard.&lt;br&gt;
If you want rolling release without the risk — &lt;strong&gt;Manjaro&lt;/strong&gt;. Arch underneath, sane updates, great hardware support.&lt;br&gt;
If you want to &lt;em&gt;understand&lt;/em&gt; Linux — &lt;strong&gt;Arch&lt;/strong&gt;. Do it once. Even if you go back to Fedora afterward, you'll understand everything you're running.&lt;/p&gt;

&lt;p&gt;The distro matters less than you think once you're past the basics. They're all Linux. The terminal commands are the same. The concepts are the same. Pick one and go deep.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What distro are you running? Drop it in the comments — and tell us why. This is always the most interesting thread.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;by &lt;a href="//habibullah.dev"&gt;md8-habibullah&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Tags: &lt;code&gt;linux&lt;/code&gt; &lt;code&gt;beginners&lt;/code&gt; &lt;code&gt;devops&lt;/code&gt; &lt;code&gt;webdev&lt;/code&gt; &lt;code&gt;opensource&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>linux</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Setting Up Servers. Start Shipping Code. (Supabase, Appwrite &amp; The BaaS Revolution)</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Sun, 22 Feb 2026 08:01:26 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/stop-setting-up-servers-start-shipping-code-supabase-appwrite-the-baas-revolution-3936</link>
      <guid>https://dev.to/md8_habibullah/stop-setting-up-servers-start-shipping-code-supabase-appwrite-the-baas-revolution-3936</guid>
      <description>&lt;p&gt;There's a version of backend development where you spend two days setting up authentication before writing a single line of business logic.&lt;/p&gt;

&lt;p&gt;You configure a database. You wire up JWT tokens. You write password reset flows. You manage file upload endpoints. You handle CORS. You set up email verification. You configure environment variables in three different places.&lt;/p&gt;

&lt;p&gt;And then — &lt;em&gt;finally&lt;/em&gt; — you start building the thing you actually wanted to build.&lt;/p&gt;

&lt;p&gt;This is the problem Backend-as-a-Service (BaaS) platforms exist to solve. And in 2024–2026, two names come up constantly: &lt;strong&gt;Supabase&lt;/strong&gt; and &lt;strong&gt;Appwrite&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a BaaS and Why Does It Change Everything?
&lt;/h2&gt;

&lt;p&gt;A Backend-as-a-Service gives you the infrastructure primitives every app needs — already built, already secured, already scalable — so you can skip straight to your actual product.&lt;/p&gt;

&lt;p&gt;Think of it like this: instead of building a kitchen from scratch every time you cook, someone hands you a fully equipped one. You just... cook.&lt;/p&gt;

&lt;p&gt;The core primitives every BaaS provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt; — store and query your data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication&lt;/strong&gt; — user sign-up, login, OAuth, sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt; — files, images, documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realtime&lt;/strong&gt; — live updates pushed to clients&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functions/API&lt;/strong&gt; — custom backend logic without managing servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the foundation. Now let's look at who does it best.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase — The Open-Source Firebase (But With Postgres)
&lt;/h2&gt;

&lt;p&gt;Supabase positions itself simply: &lt;em&gt;"Build in a weekend. Scale to millions."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The magic is that underneath everything, &lt;strong&gt;it's just Postgres&lt;/strong&gt; — the most trusted relational database in the world. Not a proprietary format. Not a document store with weird query limitations. Real SQL, real joins, real indexes. You're not locked in — your data is always yours.&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%2Fc90g4nvl8avs54ocakfw.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%2Fc90g4nvl8avs54ocakfw.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Supabase Gives You Out of the Box
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Database&lt;/strong&gt; — Full PostgreSQL. Use the visual table editor or write raw SQL. Includes views, materialized views, foreign tables, partitioned tables, stored procedures — the entire Postgres feature set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth&lt;/strong&gt; — Email/password, magic links, OAuth (Google, GitHub, Twitter, Apple, etc.), phone auth via SMS. Plugs directly into your app with pre-built components or their SDK.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row Level Security (RLS)&lt;/strong&gt; — This is Supabase's superpower and its biggest learning curve. You write Postgres policies that control &lt;em&gt;which rows&lt;/em&gt; each user can read or modify. Incredibly powerful. Takes a day to really understand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Only show users their own data&lt;/span&gt;
&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="nv"&gt;"Users can view own profile"&lt;/span&gt;
  &lt;span class="k"&gt;on&lt;/span&gt; &lt;span class="n"&gt;profiles&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;
  &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt; — File uploads with S3-compatible storage, image transformations, CDN delivery, and access policies that respect your auth rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Realtime&lt;/strong&gt; — Subscribe to database changes and push updates to connected clients live. Multiplayer features, live dashboards, chat — all without polling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge Functions&lt;/strong&gt; — Deploy TypeScript functions globally, close to your users. Deno-based runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instant APIs&lt;/strong&gt; — Every table gets auto-generated REST and GraphQL endpoints the moment you create it. No controller code required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Support&lt;/strong&gt; — Supabase now has MCP integration, meaning AI tools like Claude Code or Cursor can directly inspect your schema, suggest RLS policies, and write migrations. Genuinely changes the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Honest Trade-offs
&lt;/h3&gt;

&lt;p&gt;RLS policies are powerful but they're &lt;strong&gt;not beginner-friendly&lt;/strong&gt;. Getting auth + policies + storage all talking together correctly has a learning curve. The community is helpful, but expect to spend time on it.&lt;/p&gt;

&lt;p&gt;Edge Functions run on Deno, not Node — small adjustment if you're coming from a pure Node background.&lt;/p&gt;

&lt;p&gt;Self-hosting Supabase is possible but involves running many Docker containers together (Postgres, PostgREST, GoTrue, Realtime, Kong, etc.). It works, but it's a lot of moving pieces to manage yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appwrite — The "Bring Any Framework" BaaS
&lt;/h2&gt;

&lt;p&gt;Where Supabase is Postgres-first, &lt;strong&gt;Appwrite&lt;/strong&gt; is developer-experience-first. It's built for teams that work across platforms — web, mobile (React Native, Flutter, iOS, Android), and server-side — and want everything under one SDK.&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%2F4vcwv79dvubi1yodpj0a.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%2F4vcwv79dvubi1yodpj0a.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Appwrite Gives You
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Auth&lt;/strong&gt; — All the standard flows plus one nice extra: Anonymous users that convert to real accounts when they sign up. Phone/SMS auth. Teams and memberships built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Databases&lt;/strong&gt; — Document-model with collections and attributes. Not pure SQL, but it has relationships and indexing. The visual console is excellent for non-technical teammates managing data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt; — File buckets with permissions, image transformation (resize, crop, format), and virus scanning built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Functions&lt;/strong&gt; — 30+ runtimes across 13 languages: Node, Python, PHP, Ruby, Go, Dart, .NET, Kotlin, Java, Bun, and more. You're not limited to TypeScript/Deno.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messaging&lt;/strong&gt; — This is an Appwrite exclusive in this tier: built-in push notifications, email, and SMS under one API. You're not stitching together Twilio + SendGrid + FCM separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Realtime&lt;/strong&gt; — Subscribe to any Appwrite event — not just database changes but auth events, storage events, function completions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sites&lt;/strong&gt; — Appwrite can also host your frontend. Git-connected deployments, preview URLs per branch. The full-stack in one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security built-in&lt;/strong&gt; — DDoS protection, encryption at rest and in transit, GDPR compliance, SOC-2, HIPAA. Not bolt-ons — defaults.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Honest Trade-offs
&lt;/h3&gt;

&lt;p&gt;Appwrite's database is document-based (like a more structured MongoDB), not relational SQL. If you need complex joins, reporting queries, or a relational data model — Supabase's Postgres is the better fit.&lt;/p&gt;

&lt;p&gt;The self-hosted version requires Docker and some server management knowledge. Appwrite Cloud makes it seamless, but if budget matters, self-hosting is doable with some effort.&lt;/p&gt;




&lt;h2&gt;
  
  
  Supabase vs Appwrite — The Direct Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Supabase&lt;/th&gt;
&lt;th&gt;Appwrite&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL (full SQL)&lt;/td&gt;
&lt;td&gt;Document DB (NoSQL-ish)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Excellent&lt;/td&gt;
&lt;td&gt;✅ Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ S3-backed&lt;/td&gt;
&lt;td&gt;✅ Built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Realtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ DB change streams&lt;/td&gt;
&lt;td&gt;✅ All events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TypeScript/Deno&lt;/td&gt;
&lt;td&gt;13 languages, 30+ runtimes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Messaging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not included&lt;/td&gt;
&lt;td&gt;✅ Push, Email, SMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Frontend Hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not included&lt;/td&gt;
&lt;td&gt;✅ Sites included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-hosting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Complex (many containers)&lt;/td&gt;
&lt;td&gt;✅ Easier (Docker)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL lovers, complex queries, AI apps&lt;/td&gt;
&lt;td&gt;Multi-platform teams, mobile, polyglot stacks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Rule of thumb:&lt;/strong&gt; If your team thinks in SQL and relations — Supabase. If your team builds across multiple platforms or languages — Appwrite.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Alternatives Worth Knowing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Firebase — The Veteran
&lt;/h3&gt;

&lt;p&gt;Google's platform. Battle-tested, enormous SDK ecosystem, excellent offline support. But it's NoSQL (Firestore), vendor-locked to Google Cloud, and pricing can surprise you at scale. The "Firebase Data Connect" feature now adds Postgres + GraphQL, which narrows the gap with Supabase.&lt;/p&gt;

&lt;p&gt;Best for: Mobile-first apps, teams already in Google Cloud, real-time experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  PocketBase — The Minimalist's Dream
&lt;/h3&gt;

&lt;p&gt;A single Go binary. Drop it on a server, it runs. Includes database (SQLite), auth, file storage, real-time, and a REST API — with a built-in admin UI. MIT licensed. Completely free.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./pocketbase serve
&lt;span class="c"&gt;# That's it. Your backend is running.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The catch: SQLite means it's not for massive multi-tenant SaaS. But for side projects, internal tools, prototypes, or anything that doesn't need horizontal database scaling — it's extraordinary.&lt;/p&gt;

&lt;p&gt;Best for: Solo developers, prototypes, internal tools, small apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nhost — GraphQL-First
&lt;/h3&gt;

&lt;p&gt;Same idea as Supabase (Postgres under the hood) but everything goes through GraphQL via Hasura. If your team is GraphQL-native and wants real-time subscriptions in that workflow, Nhost feels very natural.&lt;/p&gt;

&lt;p&gt;Best for: GraphQL-first teams, JAMstack apps with real-time needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Convex — The TypeScript-Native Backend
&lt;/h3&gt;

&lt;p&gt;Convex is a different mental model. Your backend logic lives in TypeScript functions that react to data changes automatically. No SQL policies, no REST endpoints to design. Just reactive TypeScript functions. It's genuinely elegant if you're TypeScript-first.&lt;/p&gt;

&lt;p&gt;Best for: TypeScript-heavy teams who want reactive patterns without policy-based auth complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Neon — Just Postgres, Nothing Else
&lt;/h3&gt;

&lt;p&gt;Sometimes you just want serverless Postgres with branching, auto-suspend when idle, and scale-to-zero pricing. Neon does exactly that — nothing more, nothing less. You bring your own auth (Clerk, Auth.js, etc.) and storage.&lt;/p&gt;

&lt;p&gt;Best for: Teams who know what they need and want to assemble it themselves without a full BaaS bundle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick Decision Guide
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Do you need complex relational queries / SQL?
├── Yes → Supabase
└── No  → Keep going

Are you building for mobile + web + possibly other platforms?
├── Yes → Appwrite (best multi-platform SDK support)
└── No  → Keep going

Is this a small app, tool, or prototype?
├── Yes → PocketBase (zero cost, zero ops)
└── No  → Keep going

Is your team GraphQL-first?
├── Yes → Nhost
└── No  → Keep going

Is your team TypeScript-first and wants reactive patterns?
├── Yes → Convex
└── No  → Supabase or Appwrite — pick based on DB preference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What This Actually Means for Your Workflow
&lt;/h2&gt;

&lt;p&gt;Before BaaS: You write auth. You design token systems. You write password reset flows. You configure email. You set up file upload. You write access control middleware. You do all of this before building your actual product.&lt;/p&gt;

&lt;p&gt;After BaaS: You call &lt;code&gt;supabase.auth.signUp()&lt;/code&gt; or &lt;code&gt;account.create()&lt;/code&gt; and move on.&lt;/p&gt;

&lt;p&gt;The hours you save on infrastructure plumbing get redirected to the actual user-facing features that make your product good. That's the real argument for this category — not that it's easier (though it is), but that it radically changes &lt;strong&gt;what you spend your time on&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bottom Line
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt; if you want the power of Postgres with auth, storage, realtime, and edge functions bundled together — and you're comfortable with a bit of SQL policy writing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Appwrite&lt;/strong&gt; if you want the widest platform support (especially mobile), messaging included, frontend hosting, and a more flexible function runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PocketBase&lt;/strong&gt; if you want to move fast on a smaller project without any monthly bill.&lt;/p&gt;

&lt;p&gt;The best BaaS is the one that removes friction for &lt;em&gt;your&lt;/em&gt; specific stack and team. All three of these do it well — the differences are in the details.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;What are you currently using for your backend? Curious what the dev.to community has landed on — drop it in the comments.&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;by &lt;a href="//habibullah.dev"&gt;md8-habibullah&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Tags: &lt;code&gt;supabase&lt;/code&gt; &lt;code&gt;appwrite&lt;/code&gt; &lt;code&gt;webdev&lt;/code&gt; &lt;code&gt;backend&lt;/code&gt; &lt;code&gt;beginners&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>webdev</category>
      <category>beginners</category>
      <category>supabase</category>
    </item>
    <item>
      <title>You Just Bought a VPS — Now What? A Modern Developer's Setup Guide</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Sat, 21 Feb 2026 15:17:20 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/you-just-bought-a-vps-now-what-a-modern-developers-setup-guide-35il</link>
      <guid>https://dev.to/md8_habibullah/you-just-bought-a-vps-now-what-a-modern-developers-setup-guide-35il</guid>
      <description>&lt;p&gt;You bought the VPS. You got the IP address in your email. Now you're staring at an SSH prompt wondering what to do next — and whether you're about to do it wrong.&lt;/p&gt;

&lt;p&gt;This guide is the one I wish existed when I started. We'll go from zero to a production-ready server with proper security, a real CI/CD pipeline, monitoring, and a modern management interface — without it turning into a 3-day rabbit hole.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: First Login — Lock It Down Immediately
&lt;/h2&gt;

&lt;p&gt;The moment your VPS is live, bots are already trying to log in. Seriously — check &lt;code&gt;/var/log/auth.log&lt;/code&gt; after 10 minutes. You'll see hundreds of attempts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@YOUR_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do these five things before anything else:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Update everything&lt;/span&gt;
apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt; or dnf update

&lt;span class="c"&gt;# 2. Create a non-root user&lt;/span&gt;
adduser deploy
usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;deploy

&lt;span class="c"&gt;# 3. Copy your SSH key to the new user&lt;/span&gt;
rsync &lt;span class="nt"&gt;--archive&lt;/span&gt; &lt;span class="nt"&gt;--chown&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deploy:deploy ~/.ssh /home/deploy

&lt;span class="c"&gt;# 4. Disable root SSH login&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/PermitRootLogin yes/PermitRootLogin no/'&lt;/span&gt; /etc/ssh/sshd_config
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/#PasswordAuthentication yes/PasswordAuthentication no/'&lt;/span&gt; /etc/ssh/sshd_config
systemctl restart sshd

&lt;span class="c"&gt;# 5. Set up a basic firewall&lt;/span&gt;
ufw allow OpenSSH
ufw allow 80
ufw allow 443
ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ftzhhog51ptag3mno1thi.jpg" 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%2Ftzhhog51ptag3mno1thi.jpg" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now install &lt;strong&gt;Fail2ban&lt;/strong&gt; — it automatically bans IPs with repeated failed login attempts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;WARN : IPs will be ban &lt;span class="o"&gt;(&lt;/span&gt;automatically&lt;span class="o"&gt;)&lt;/span&gt; / can skip it
apt &lt;span class="nb"&gt;install &lt;/span&gt;fail2ban &lt;span class="nt"&gt;-y&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; fail2ban
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's your baseline. Your server is no longer an open door.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Cockpit — A Browser-Based Control Room for Your Server
&lt;/h2&gt;

&lt;p&gt;Most guides stop at the terminal and never look back. That's fine if you live in SSH, but for monitoring, managing services, updates, and getting a visual overview — &lt;strong&gt;Cockpit&lt;/strong&gt; is genuinely excellent and wildly underrated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;cockpit &lt;span class="nt"&gt;-y&lt;/span&gt;
systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; cockpit.socket
ufw allow 9090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now visit &lt;code&gt;https://YOUR_IP:9090&lt;/code&gt; — log in with your system user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Cockpit gives you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time CPU, RAM, disk, and network graphs&lt;/li&gt;
&lt;li&gt;Start/stop/restart any systemd service with a click&lt;/li&gt;
&lt;li&gt;Manage users and SSH keys through a UI&lt;/li&gt;
&lt;li&gt;View and filter system logs (journald) visually&lt;/li&gt;
&lt;li&gt;Terminal access right inside the browser — no separate SSH needed&lt;/li&gt;
&lt;li&gt;Container management via the &lt;strong&gt;Cockpit Podman&lt;/strong&gt; extension&lt;/li&gt;
&lt;li&gt;Storage and network interface management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffuq8qug0alms9pijool8.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%2Ffuq8qug0alms9pijool8.png" alt=" " width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cockpit vs alternatives:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;th&gt;UI Quality&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cockpit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux system management, services&lt;/td&gt;
&lt;td&gt;Clean, minimal&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webmin&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full server admin, legacy setups&lt;/td&gt;
&lt;td&gt;Dated but powerful&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Netdata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep metrics &amp;amp; alerting&lt;/td&gt;
&lt;td&gt;Beautiful&lt;/td&gt;
&lt;td&gt;Free/Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Portainer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker/container management&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Free/Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cockpit isn't trying to be a hosting panel — it's a system manager. That's exactly why it belongs on every VPS you run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Coolify — Your Self-Hosted Heroku
&lt;/h2&gt;

&lt;p&gt;This is where the fun starts. &lt;strong&gt;Coolify&lt;/strong&gt; handles everything above the OS layer — deployments, databases, SSL, environment variables, reverse proxy, and more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cdn.coollabs.io/coolify/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That single command installs Coolify along with Docker, Nginx/Caddy for the proxy, and everything it needs. Then visit &lt;code&gt;http://YOUR_IP:8000&lt;/code&gt; to set it up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Coolify manages for you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apps&lt;/strong&gt; — connect a GitHub/GitLab repo, pick a runtime (Node, PHP, Python, static, Docker), and it builds + deploys automatically on push&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Databases&lt;/strong&gt; — spin up PostgreSQL, MySQL, MariaDB, Redis, MongoDB with one click. Automatic backups to S3 or local&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services&lt;/strong&gt; — one-click deploys for Plausible, Ghost, Uptime Kuma, Meilisearch, n8n, and 60+ more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSL&lt;/strong&gt; — Let's Encrypt, automatic, zero config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview deployments&lt;/strong&gt; — auto-deploy every PR to its own URL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams&lt;/strong&gt; — multiple users, role-based access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo30m705rm2j0aqv494ro.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%2Fo30m705rm2j0aqv494ro.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhnphewvh03rf7o5kb690.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%2Fhnphewvh03rf7o5kb690.png" alt=" " width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coolify vs alternatives:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Strengths&lt;/th&gt;
&lt;th&gt;Weaknesses&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Coolify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Full-featured, free, open source&lt;/td&gt;
&lt;td&gt;Self-managed infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Render&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud SaaS&lt;/td&gt;
&lt;td&gt;Zero ops, great DX&lt;/td&gt;
&lt;td&gt;Gets expensive fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Railway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud SaaS&lt;/td&gt;
&lt;td&gt;Easiest for small projects&lt;/td&gt;
&lt;td&gt;Limited customization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dokku&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Heroku-compatible, lightweight&lt;/td&gt;
&lt;td&gt;CLI-only, steeper curve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Caprover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;App store, good UI&lt;/td&gt;
&lt;td&gt;Less active development&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Coolify hits the sweet spot: full control, modern UI, no monthly SaaS bill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: CI/CD — Push to Deploy Like a Professional
&lt;/h2&gt;

&lt;p&gt;Coolify handles the &lt;em&gt;deployment&lt;/em&gt; side. For CI/CD — running tests, linters, builds — you want a pipeline that triggers &lt;em&gt;before&lt;/em&gt; Coolify deploys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The simplest stack: GitHub Actions + Coolify webhook&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; in your repo:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test &amp;amp; Deploy&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm install&lt;/span&gt;
          &lt;span class="s"&gt;npm test&lt;/span&gt;

  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Trigger Coolify Deploy&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -X POST "${{ secrets.COOLIFY_WEBHOOK }}" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your &lt;code&gt;COOLIFY_WEBHOOK&lt;/code&gt; and &lt;code&gt;COOLIFY_TOKEN&lt;/code&gt; live in GitHub Secrets. That's it — push to &lt;code&gt;main&lt;/code&gt;, tests run, if they pass, Coolify deploys. Full lifecycle, zero babysitting.&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%2Fnhgxb1x9p6eg0k1k6y8n.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%2Fnhgxb1x9p6eg0k1k6y8n.png" alt=" " width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD tool options:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Hosting&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Most teams — free tier is generous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gitea + Woodpecker CI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Full self-hosted Git + CI stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitLab CI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud or Self-hosted&lt;/td&gt;
&lt;td&gt;Monorepos, enterprise pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Drone CI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Docker-native, YAML pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you want to go fully self-hosted, &lt;strong&gt;Gitea&lt;/strong&gt; (lightweight GitHub alternative) + &lt;strong&gt;Woodpecker CI&lt;/strong&gt; is a beautiful combo that runs comfortably on a small VPS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Monitoring — Know Before Users Tell You
&lt;/h2&gt;

&lt;p&gt;Your pipeline is live. Now make sure you know when something breaks before your users do.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uptime Kuma — Self-Hosted Status Page + Alerting
&lt;/h3&gt;

&lt;p&gt;Deploy it via Coolify in two clicks (it's in the service catalog). Uptime Kuma monitors your URLs, TCP ports, databases, and Docker containers, and alerts you via Telegram, Slack, email, Discord, and more.&lt;/p&gt;

&lt;p&gt;It also generates a public status page — the kind you'd pay $30/month for from a SaaS tool.&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%2F13019xr9r5wunkwko7zs.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%2F13019xr9r5wunkwko7zs.png" alt=" " width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Netdata — Real-Time System Metrics
&lt;/h3&gt;

&lt;p&gt;Where Cockpit gives you a system overview, Netdata goes deep. Per-process CPU and memory, disk I/O breakdowns, network packet analysis, and anomaly detection — all in real time, with a gorgeous UI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; /tmp/netdata-kickstart.sh https://get.netdata.cloud/kickstart.sh
sh /tmp/netdata-kickstart.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runs on port &lt;code&gt;19999&lt;/code&gt;. Keep it behind a firewall or add basic auth — don't expose it publicly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loki + Grafana — Logs That Actually Make Sense
&lt;/h3&gt;

&lt;p&gt;For production apps, structured log aggregation is worth it. &lt;strong&gt;Grafana Loki&lt;/strong&gt; collects logs, &lt;strong&gt;Grafana&lt;/strong&gt; visualizes them alongside metrics. Coolify can deploy the Grafana stack for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring quick-reference:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;What It Covers&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Uptime Kuma&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Uptime, SSL expiry, status page&lt;/td&gt;
&lt;td&gt;⭐ Very easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cockpit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System resources, services&lt;/td&gt;
&lt;td&gt;⭐ Very easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Netdata&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Deep system metrics, anomalies&lt;/td&gt;
&lt;td&gt;⭐⭐ Easy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grafana + Loki&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Logs, dashboards, alerting&lt;/td&gt;
&lt;td&gt;⭐⭐⭐ Moderate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prometheus + Grafana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full observability stack&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐ Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with Uptime Kuma and Cockpit. Add Netdata when you want more visibility. Add Grafana when you're running real production load.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Stack, Summarized
&lt;/h2&gt;

&lt;p&gt;Here's what your VPS looks like after following this guide:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OS Layer      → Ubuntu 24.04, hardened SSH, UFW, Fail2ban
System UI     → Cockpit (browser-based management + monitoring)
App Platform  → Coolify (deployments, databases, SSL, services)
CI/CD         → GitHub Actions (tests + webhook trigger)
Uptime        → Uptime Kuma (monitoring + status page)
Metrics       → Netdata (deep real-time system metrics)
Logs          → Grafana + Loki (when you're ready)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fh5v874v4lve480im9xk2.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%2Fh5v874v4lve480im9xk2.png" alt=" " width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You went from a blank VPS to a modern, self-hosted platform that handles deployments, rollbacks, SSL, monitoring, and alerting — with a UI for everything that doesn't &lt;em&gt;require&lt;/em&gt; you to live in the terminal.&lt;/p&gt;

&lt;p&gt;That's not DevOps complexity. That's just good infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What's your current VPS stack?&lt;/strong&gt; Drop your setup in the comments — always curious what people are running in production.&lt;/p&gt;




&lt;p&gt;by &lt;a href="//habibullah.dev"&gt;md8-habibullah&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>selfhosted</category>
      <category>webdev</category>
    </item>
    <item>
      <title>cPanel: The Server Control Panels Developers Actually Love</title>
      <dc:creator>MD. HABIBULLAH SHARIF</dc:creator>
      <pubDate>Sat, 21 Feb 2026 14:39:05 +0000</pubDate>
      <link>https://dev.to/md8_habibullah/cpanel-the-server-control-panels-developers-actually-love-f93</link>
      <guid>https://dev.to/md8_habibullah/cpanel-the-server-control-panels-developers-actually-love-f93</guid>
      <description>&lt;p&gt;cPanel is everywhere. If you've ever managed shared hosting, you've clicked through its slightly-dated-but-familiar interface. It works. But ever since they &lt;a href="https://cpanel.net/pricing/" rel="noopener noreferrer"&gt;revised their pricing model&lt;/a&gt; a few years back, a lot of developers — especially those running their own VPS or small business servers — started asking: &lt;em&gt;do I actually need this?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The answer, most of the time, is &lt;strong&gt;no&lt;/strong&gt;. And some of the alternatives are genuinely better for developers.&lt;/p&gt;

&lt;p&gt;Let's break this down practically — what 80% of people actually use cPanel for, what's available elsewhere, where cPanel is still pulling ahead (hello, PostgreSQL!), and which power tools most people sleep on.&lt;/p&gt;




&lt;h2&gt;
  
  
  What People Actually Use cPanel For (The 80%)
&lt;/h2&gt;

&lt;p&gt;Be honest — most people use cPanel for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email management&lt;/strong&gt; (creating mailboxes, forwarders, spam filters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File management&lt;/strong&gt; (the built-in file manager, FTP accounts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database creation&lt;/strong&gt; (MySQL/MariaDB via phpMyAdmin)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Domain &amp;amp; subdomain management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL certificate installation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click app installs&lt;/strong&gt; (WordPress, Joomla — via Softaculous)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cron jobs&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS zone editing&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's your list, you have &lt;em&gt;many&lt;/em&gt; solid alternatives.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Alternatives Worth Knowing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟦 Coolify — The One Getting All the Hype Right Now
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Self-hosted PaaS, modern app deployments&lt;/p&gt;

&lt;p&gt;Coolify is what you get if Heroku, Netlify, and cPanel had a baby and it grew up writing TypeScript. You connect your server, point it at a GitHub repo, and it handles builds, deployments, SSL, reverse proxy (Caddy under the hood), and environment variables.&lt;/p&gt;

&lt;p&gt;What it does &lt;em&gt;really&lt;/em&gt; well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-click deploy for Docker-based apps, Laravel, Node, static sites&lt;/li&gt;
&lt;li&gt;Automatic HTTPS via Let's Encrypt&lt;/li&gt;
&lt;li&gt;Preview deployments per branch&lt;/li&gt;
&lt;li&gt;Built-in database provisioning (MySQL, PostgreSQL, Redis, MongoDB)&lt;/li&gt;
&lt;li&gt;Teams &amp;amp; multi-server support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it doesn't do: traditional email hosting, cPanel-style file manager, or shared hosting management. It's a &lt;em&gt;developer&lt;/em&gt; tool, not a hosting tool.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free &amp;amp; open source. Self-hosted. &lt;a href="https://coolify.io" rel="noopener noreferrer"&gt;coolify.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🟩 Hestia CP — Closest to cPanel Without the Price Tag
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Web hosts, agencies, resellers managing multiple client sites&lt;/p&gt;

&lt;p&gt;Hestia is a fork of VestaCP, cleaned up and actively maintained. It covers the full traditional stack — email, DNS, FTP, databases, web server config (Nginx + Apache or just Nginx), Let's Encrypt SSL, cron jobs, and a clean two-panel UI.&lt;/p&gt;

&lt;p&gt;If someone asks "I just want cPanel but free," Hestia is usually the answer. It supports multiple users, has templates for WordPress, and even has a basic backup system.&lt;/p&gt;

&lt;p&gt;Caveats: No Softaculous equivalent. You install apps manually or via WP-CLI. That's fine for developers, less so for clients.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free &amp;amp; open source. &lt;a href="https://hestiacp.com" rel="noopener noreferrer"&gt;hestiacp.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🟥 Plesk — The Enterprise cPanel Alternative
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Agencies, managed hosting providers, Windows servers&lt;/p&gt;

&lt;p&gt;Plesk is the one tool that actually goes &lt;em&gt;toe to toe&lt;/em&gt; with cPanel feature-for-feature. It supports both Linux and Windows, has a proper extension marketplace, Docker integration, Git deployment, staging environments, and solid WordPress tooling (WP Toolkit is genuinely excellent).&lt;/p&gt;

&lt;p&gt;The licensing model is similar to cPanel — you pay per server or per domain tier. It's not cheap, but if you're managing client sites at scale and need something polished, Plesk earns its keep.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Commercial, with a free trial. &lt;a href="https://www.plesk.com" rel="noopener noreferrer"&gt;plesk.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🟨 CloudPanel — The Speed-Optimized Minimalist
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want lean, fast, Nginx-based setups&lt;/p&gt;

&lt;p&gt;CloudPanel is opinionated and fast. It's built around Nginx, PHP-FPM, and MySQL, and it ships with a clean UI that handles vhosts, SSL, databases, cron, user management, and basic file access. It's noticeably lighter than cPanel.&lt;/p&gt;

&lt;p&gt;It added AWS/GCP/DigitalOcean cloud integration so you can spin it up via marketplace images. Great for PHP apps, Laravel especially. Less suited for polyglot or containerized workflows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free. &lt;a href="https://www.cloudpanel.io" rel="noopener noreferrer"&gt;cloudpanel.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  ⬛ Webmin/Virtualmin — The Veteran
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Linux power users who want full control&lt;/p&gt;

&lt;p&gt;Webmin has been around since the late 90s. It's essentially a web UI for your entire Linux system — you can manage services, firewalls, users, packages, and everything in between. Virtualmin extends it for virtual hosting (multiple domains, email, databases).&lt;/p&gt;

&lt;p&gt;It's not pretty. The UI feels like it's from a different era (because parts of it are). But it's incredibly comprehensive, battle-tested, and free. If you know your way around Linux, Webmin exposes everything without hiding it behind abstraction.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Free &amp;amp; open source. &lt;a href="https://webmin.com" rel="noopener noreferrer"&gt;webmin.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  cPanel's Surprise Move: PostgreSQL Support
&lt;/h2&gt;

&lt;p&gt;For years, one of cPanel's most cited developer frustrations was: &lt;strong&gt;MySQL only&lt;/strong&gt;. phpMyAdmin, MySQL, MariaDB — that was the world.&lt;/p&gt;

&lt;p&gt;cPanel recently added native &lt;strong&gt;PostgreSQL database management&lt;/strong&gt;, including phpPgAdmin integration. You can now create and manage PostgreSQL databases directly from WHM/cPanel without SSH gymnastics.&lt;/p&gt;

&lt;p&gt;This matters because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apps built on PostgreSQL (Django, Rails, many Node stacks) no longer need workarounds on cPanel servers&lt;/li&gt;
&lt;li&gt;Shared hosting environments can now officially support Postgres tenants&lt;/li&gt;
&lt;li&gt;It closes a real gap that pushed developers toward VPS + custom setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's still newer than the MySQL support and not every host has enabled it, but it's a meaningful step. If your host runs cPanel and you need Postgres — ask them to enable it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tools Developers Skip (But Shouldn't)
&lt;/h2&gt;

&lt;p&gt;Regardless of which panel you use, these are the things most people ignore that will save you real time:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; — If you manage WordPress sites and you're not using WP-CLI, you're doing extra work. Update plugins, search-replace database URLs, manage users, run imports — all from the command line. Most panels give you SSH access; use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caddy as a reverse proxy&lt;/strong&gt; — Coolify uses it, but you can set it up yourself. Caddy auto-renews SSL, handles HTTP/2, and has a dead-simple config syntax. If you're hand-rolling a VPS setup, Caddy makes the "HTTPS with Let's Encrypt" step trivial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restic for backups&lt;/strong&gt; — Most panel backup systems are either basic or locked behind premium tiers. Restic is a modern backup tool that deduplicates, encrypts, and can push to S3, B2, or any rclone-compatible remote. Set up a cron, forget about it, sleep better.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail2ban&lt;/strong&gt; — Every server open to the internet is getting hit by bots. Fail2ban watches your logs and auto-bans IPs with repeated failed login attempts. Takes 10 minutes to configure, prevents a lot of headaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailpit (formerly MailHog)&lt;/strong&gt; — If you're testing transactional email locally, Mailpit gives you a fake SMTP server with a web UI that catches all outgoing mail. No more accidentally emailing real users from dev environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Actually Choose
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You want...&lt;/th&gt;
&lt;th&gt;Go with...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free cPanel replacement for client sites&lt;/td&gt;
&lt;td&gt;Hestia CP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modern app deployments (Docker, Git)&lt;/td&gt;
&lt;td&gt;Coolify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-featured commercial alternative&lt;/td&gt;
&lt;td&gt;Plesk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lightweight PHP/Laravel hosting&lt;/td&gt;
&lt;td&gt;CloudPanel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maximum Linux control, no polish required&lt;/td&gt;
&lt;td&gt;Webmin/Virtualmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staying on cPanel, but need Postgres&lt;/td&gt;
&lt;td&gt;Ask your host to enable it — it's there now&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;The hosting control panel space is more interesting than it's been in years. cPanel is no longer the obvious default, and for developers especially, tools like Coolify are genuinely changing how we think about self-hosting. The gap between "managed hosting" and "DIY VPS" is narrowing fast.&lt;/p&gt;

&lt;p&gt;What panel are you running in production right now? Drop it in the comments — curious to see what the dev.to crowd has landed on.&lt;/p&gt;




&lt;p&gt;by &lt;a href="//habibullah.dev"&gt;md8-habibullah&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>hosting</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
