<?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: ARAFAT AMAN ALIM</title>
    <description>The latest articles on DEV Community by ARAFAT AMAN ALIM (@dev-arafat-alim).</description>
    <link>https://dev.to/dev-arafat-alim</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3255157%2F32b0c5c7-9770-4e3a-8c7b-34fc49bfed7d.gif</url>
      <title>DEV Community: ARAFAT AMAN ALIM</title>
      <link>https://dev.to/dev-arafat-alim</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dev-arafat-alim"/>
    <language>en</language>
    <item>
      <title>SEO is Dead. Long Live Markdown: How AI Agents Are Quietly Rewriting the Web</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Wed, 06 May 2026 10:01:50 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/seo-is-dead-long-live-markdown-how-ai-agents-are-quietly-rewriting-the-web-363k</link>
      <guid>https://dev.to/dev-arafat-alim/seo-is-dead-long-live-markdown-how-ai-agents-are-quietly-rewriting-the-web-363k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — AI bots (ChatGPT, Claude, Perplexity, Google's AI Overviews) now make up a &lt;em&gt;huge&lt;/em&gt; slice of your website traffic. They don't want your beautifully styled HTML. They want clean Markdown — and they'll thank you with citations. This post shows you exactly how to serve it using a 27-year-old HTTP feature that suddenly matters again: &lt;strong&gt;content negotiation&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Day I Realized My Real Audience Wasn't Human
&lt;/h2&gt;

&lt;p&gt;A few months ago I shipped two side projects. Nothing fancy — a transcription tool and a small productivity app. I did the usual: meta tags, Open Graph, sitemap, lighthouse score in the 90s, the works. The 2018 SEO playbook, basically.&lt;/p&gt;

&lt;p&gt;Then I opened my Cloudflare analytics one morning and almost spilled my coffee.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;last 24 hours alone&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Googlebot&lt;/code&gt; → 99 hits&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Applebot&lt;/code&gt; → 48 hits&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ClaudeBot&lt;/code&gt; → 19 hits&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PerplexityBot&lt;/code&gt;, &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;Bingbot&lt;/code&gt;, &lt;code&gt;ClaudeSearchBot&lt;/code&gt; → dozens more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A meaningful chunk of my "traffic" wasn't humans clicking blue links. It was machines. Specifically, it was &lt;strong&gt;AI agents&lt;/strong&gt; scraping my content to answer somebody else's question on ChatGPT or Claude.&lt;/p&gt;

&lt;p&gt;And here's the kicker: I had optimized my entire site for &lt;em&gt;humans and Googlebot&lt;/em&gt; — neither of which is now the deciding visitor.&lt;/p&gt;

&lt;p&gt;That's when it hit me: &lt;strong&gt;the old SEO is dead.&lt;/strong&gt; Or more accurately, it's been demoted. The new game is optimizing for the bots that feed Large Language Models. And the way you do that is nothing like what you learned in 2015.&lt;/p&gt;

&lt;p&gt;Let me walk you through what I figured out — and the small middleware change that can make your site &lt;em&gt;dramatically&lt;/em&gt; more visible inside ChatGPT, Claude, and Perplexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Acronyms You Need to Know in 2026
&lt;/h2&gt;

&lt;p&gt;Before we get to the fix, here's the vocabulary nobody handed you:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;What it optimizes for&lt;/th&gt;
&lt;th&gt;Who reads your content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SEO&lt;/strong&gt; (Search Engine Optimization)&lt;/td&gt;
&lt;td&gt;Ranking on Google's blue links&lt;/td&gt;
&lt;td&gt;Humans, via Googlebot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;AEO&lt;/strong&gt; (Answer Engine Optimization)&lt;/td&gt;
&lt;td&gt;Getting &lt;em&gt;quoted&lt;/em&gt; in AI Overviews, featured snippets, voice search&lt;/td&gt;
&lt;td&gt;AI summarizers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GEO&lt;/strong&gt; (Generative Engine Optimization)&lt;/td&gt;
&lt;td&gt;Being &lt;em&gt;cited&lt;/em&gt; by ChatGPT, Claude, Perplexity, Gemini&lt;/td&gt;
&lt;td&gt;LLMs synthesizing answers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A 2025 Gartner forecast estimated that organic search traffic to commercial websites would drop &lt;strong&gt;~25% by the end of 2026&lt;/strong&gt; as answer engines absorb informational queries. BrightEdge has reported AI Overviews appearing on &lt;strong&gt;over 40% of Google results pages&lt;/strong&gt;. Roughly &lt;strong&gt;60% of Google searches now end without a click&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Translation: even when you "rank," fewer people are clicking. The AI ate your snippet and walked away.&lt;/p&gt;

&lt;p&gt;So winning in 2026 isn't about ranking number one. It's about &lt;strong&gt;being the source the AI cites when it answers&lt;/strong&gt;. And to be that source, the AI has to be able to read you efficiently. That's where the real story begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Token Problem (Or: Why AI Bots Hate Your HTML)
&lt;/h2&gt;

&lt;p&gt;Here's something that took me embarrassingly long to internalize:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything in AI is tokens.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cost? Tokens. Context window? Tokens. Speed? Tokens. Accuracy? Tokens. Whether the model can even &lt;em&gt;fit&lt;/em&gt; your page into its working memory? Tokens.&lt;/p&gt;

&lt;p&gt;So when an AI agent crawls your site, every wasted token is wasted money, wasted context, and a worse answer for the user. And HTML is &lt;em&gt;spectacularly&lt;/em&gt; wasteful.&lt;/p&gt;

&lt;p&gt;Let me prove it. Suppose all you want to communicate is the phrase &lt;strong&gt;"Hello World."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In plain text, that's 11 characters. About 3 tokens.&lt;/p&gt;

&lt;p&gt;In real-world HTML, the same phrase looks more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"hero hero--centered"&lt;/span&gt; &lt;span class="na"&gt;data-testid=&lt;/span&gt;&lt;span class="s"&gt;"greeting-block"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"welcome"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-4xl font-bold tracking-tight text-slate-900 dark:text-white"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Hello World
  &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's &lt;strong&gt;~200 characters&lt;/strong&gt; and easily &lt;strong&gt;60+ tokens&lt;/strong&gt; to convey the same 3 tokens of actual meaning. That's a &lt;strong&gt;20× tax&lt;/strong&gt; the model pays to extract one phrase. Multiply that across an entire blog post buried inside a Tailwind component tree, a sticky nav, a cookie banner, three modal portals, and a footer with 47 links — and you start to see why an LLM treats most websites the way you'd treat a 400-page contract written in Comic Sans.&lt;/p&gt;

&lt;p&gt;The bot is &lt;em&gt;trying&lt;/em&gt; to help its user answer a question. You're handing it a pile of &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; confetti and asking it to find the meaning.&lt;/p&gt;

&lt;p&gt;So the AI's response is rational: &lt;strong&gt;"Don't give me HTML. Give me the words."&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%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc78jmm4lmkcwc2i5omqk.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%2Fc78jmm4lmkcwc2i5omqk.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  "Just Send Plain Text" — The Trap That Doesn't Work
&lt;/h2&gt;

&lt;p&gt;The obvious next thought is: &lt;em&gt;fine, I'll just strip the HTML and serve raw text.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Don't. There are two problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 1: Browsers need HTML.&lt;/strong&gt; You can't host your site as a &lt;code&gt;.txt&lt;/code&gt; file. Visitors expect a real, rendered page. Strip the CSS off your homepage and it looks like a 1996 Geocities accident.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problem 2: Plain text loses &lt;em&gt;structure&lt;/em&gt;.&lt;/strong&gt; Was that line a heading? A list item? A code block? An external link? An image caption? Plain text flattens all of it. The AI gets your words but loses the relationships between them. Information loss in, hallucinations out.&lt;/p&gt;

&lt;p&gt;You need a format that's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Structured enough to preserve meaning (headings, lists, links, code)&lt;/li&gt;
&lt;li&gt;✅ Compact enough to be token-cheap&lt;/li&gt;
&lt;li&gt;✅ Already trained into every major LLM as a &lt;em&gt;first-class&lt;/em&gt; language&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's exactly one format that fits all three boxes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Markdown: The Native Tongue of LLMs
&lt;/h2&gt;

&lt;p&gt;If you've ever pasted a doc into ChatGPT, you've already used it. Markdown is what every major LLM is trained on, what they output by default, and what they parse most reliably.&lt;/p&gt;

&lt;p&gt;A heading is &lt;code&gt;#&lt;/code&gt;. A list is &lt;code&gt;-&lt;/code&gt;. Bold is &lt;code&gt;**&lt;/code&gt;. Code is backticks. That's it. No attributes, no nested wrappers, no semantic divs.&lt;/p&gt;

&lt;p&gt;Same "Hello World," in Markdown:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Hello World&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's 13 characters. Maybe 4 tokens. &lt;strong&gt;The AI gets the &lt;em&gt;exact same&lt;/em&gt; semantic information&lt;/strong&gt; — "this is a top-level heading saying Hello World" — for less than 10% of the cost.&lt;/p&gt;

&lt;p&gt;Now multiply that savings across an entire knowledge base. It's not a small efficiency gain. It's the difference between an LLM being able to read your whole product documentation in a single context window vs. catching fragments and guessing at the rest.&lt;/p&gt;

&lt;p&gt;Cloudflare, Vercel, Stripe, Coinbase, Mintlify, Fern — every developer-tools company that takes AI agents seriously is now serving Markdown alongside HTML. According to Webflow, the number of sites adopting &lt;code&gt;llms.txt&lt;/code&gt; (a related Markdown standard) grew &lt;strong&gt;1,835% in roughly a year&lt;/strong&gt;. This isn't a fringe idea anymore. It's becoming infrastructure.&lt;/p&gt;

&lt;p&gt;But here's the question: how do you serve Markdown to bots &lt;em&gt;without breaking the experience for humans&lt;/em&gt;?&lt;/p&gt;




&lt;h2&gt;
  
  
  The Magic Trick: Content Negotiation (a.k.a. "Markdown Negotiation")
&lt;/h2&gt;

&lt;p&gt;The solution is delightfully old-school. HTTP has had &lt;strong&gt;content negotiation&lt;/strong&gt; baked into it since 1999. It's the reason the same URL can return JSON to your mobile app, RSS to a feed reader, and HTML to a browser.&lt;/p&gt;

&lt;p&gt;The mechanism is the &lt;code&gt;Accept&lt;/code&gt; header. Every HTTP request includes one. Browsers send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Accept: text/html,application/xhtml+xml,...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So the server happily returns HTML. But an AI agent crawler can send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Accept: text/markdown
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and your server, if you've configured it correctly, can return a &lt;strong&gt;clean Markdown version of the exact same page&lt;/strong&gt;. Same URL. Same canonical content. Different format.&lt;/p&gt;

&lt;p&gt;This is what Cloudflare now calls &lt;strong&gt;"Markdown for Agents,"&lt;/strong&gt; and it's a one-toggle feature on their platform. But you don't need Cloudflare to do it — you can implement it yourself in any framework in about 15 minutes.&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%2Fjkba9f3fsuksj02kps01.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%2Fjkba9f3fsuksj02kps01.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Implementation: A Universal Pattern
&lt;/h2&gt;

&lt;p&gt;Here's the mental model. You write your content &lt;strong&gt;once&lt;/strong&gt; (ideally in MDX or Markdown to begin with). Your server has a thin middleware that looks at the &lt;code&gt;Accept&lt;/code&gt; header and decides what to send back.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Express.js Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// content-negotiation.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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;renderHtml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;renderMarkdown&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="s1"&gt;./renderers.js&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;/blog/:slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&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;getPostBySlug&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;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&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="nx"&gt;post&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not found&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;accept&lt;/span&gt; &lt;span class="o"&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;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;accept&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// AI agent? Serve Markdown.&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;accept&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/markdown&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&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;text/markdown; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Optional but nice: tell the bot how big this is in tokens&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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x-markdown-tokens&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;estimateTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Browser? Serve HTML as usual.&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;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&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;text/html; charset=utf-8&lt;/span&gt;&lt;span class="dl"&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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderHtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&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;h3&gt;
  
  
  The Next.js (App Router) Version
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/blog/[slug]/route.ts — handles GET requests&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;NextRequest&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="s1"&gt;next/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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getPostBySlug&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="s1"&gt;@/lib/posts&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&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;NextRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;post&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;getPostBySlug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&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="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not found&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&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;accept&lt;/span&gt; &lt;span class="o"&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;headers&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;accept&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&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;accept&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/markdown&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="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headers&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;Content-Type&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;text/markdown; charset=utf-8&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;Cache-Control&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;public, max-age=3600&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="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Fall through to your normal page render&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;renderHtmlShell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&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;Content-Type&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;text/html; charset=utf-8&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; don't try to convert your HTML to Markdown on the fly with a library. The whole point is to ship a &lt;em&gt;separate, hand-curated, token-minimal file&lt;/em&gt;. Skip the navbar. Skip the footer. Skip the "related posts" widget. Strip the images unless they're load-bearing. Keep only what an AI needs to answer questions about that page: title, intro, key facts, conclusion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The "Just Drop a Companion File" Pattern
&lt;/h3&gt;

&lt;p&gt;If middleware feels like overkill, follow the pattern Cloudflare and Vercel use: expose every page as &lt;code&gt;/page-url/index.md&lt;/code&gt; or append &lt;code&gt;.md&lt;/code&gt; to any URL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://yoursite.com/docs/getting-started      → HTML
https://yoursite.com/docs/getting-started.md   → Markdown
https://yoursite.com/docs/getting-started/index.md → also Markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is dead simple to host (it's literally a static file) and works perfectly with bots that don't yet send the Markdown &lt;code&gt;Accept&lt;/code&gt; header. Belt &lt;em&gt;and&lt;/em&gt; suspenders.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Cherry on Top: &lt;code&gt;llms.txt&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;While we're here, let's talk about the proposal that's quietly becoming the &lt;code&gt;robots.txt&lt;/code&gt; of the AI era: &lt;strong&gt;&lt;code&gt;llms.txt&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Proposed by Jeremy Howard (FastAI / AnswerAI) in late 2024, &lt;code&gt;llms.txt&lt;/code&gt; is a single Markdown file at the root of your domain — &lt;code&gt;yourdomain.com/llms.txt&lt;/code&gt; — that tells AI agents the &lt;strong&gt;shape&lt;/strong&gt; of your site. Think of it as a hand-curated table of contents written specifically for LLMs.&lt;/p&gt;

&lt;p&gt;A minimal example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Acme Widgets&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Acme Widgets makes open-source developer tools for shipping&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; faster with fewer bugs. We focus on TypeScript, edge runtimes,&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; and observability.&lt;/span&gt;

&lt;span class="gu"&gt;## Docs&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Getting Started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/docs/getting-started.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: 5-minute setup guide.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API Reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/docs/api.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Full endpoint and SDK reference.
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Pricing&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/pricing.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Tiers, limits, and SLA.

&lt;span class="gu"&gt;## Guides&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Deploying to Vercel&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/guides/vercel.md&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="nv"&gt;Self-hosting on AWS&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/guides/aws.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;## Optional&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Changelog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/changelog.md&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="nv"&gt;Brand assets&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.dev/brand.md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And often a sibling file, &lt;code&gt;llms-full.txt&lt;/code&gt;, which inlines the &lt;em&gt;entire&lt;/em&gt; text of every important page in one Markdown blob — perfect for an AI agent that wants to load your whole knowledge base into a single context window.&lt;/p&gt;

&lt;p&gt;Companies already shipping &lt;code&gt;llms.txt&lt;/code&gt;: Cloudflare, Anthropic, Vercel, Mintlify, ElevenLabs, Cash App, Stripe-adjacent docs sites, and a fast-growing list. If your competitors aren't doing this yet, you have a window.&lt;/p&gt;




&lt;h2&gt;
  
  
  Don't Forget the Doorman: &lt;code&gt;robots.txt&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;This part is unglamorous but matters. Your &lt;code&gt;robots.txt&lt;/code&gt; is where you decide which AI bots are allowed to read you in the first place. With AI training and AI search now distinct activities, you can be granular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow AI search/answer bots (they cite you)
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;ClaudeBot&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;PerplexityBot&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Applebot&lt;/span&gt;-&lt;span class="n"&gt;Extended&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;Google&lt;/span&gt;-&lt;span class="n"&gt;Extended&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /

&lt;span class="c"&gt;# (Optional) block scrapers you don't want
&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;CCBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;Sitemap&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yoursite&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;sitemap&lt;/span&gt;.&lt;span class="n"&gt;xml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few rules of thumb:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you &lt;strong&gt;want citations&lt;/strong&gt; in ChatGPT/Claude/Perplexity, allow their search-time bots.&lt;/li&gt;
&lt;li&gt;If you &lt;strong&gt;don't want your content used for model training&lt;/strong&gt;, you can selectively block training-time bots (e.g. &lt;code&gt;GPTBot&lt;/code&gt; for OpenAI, &lt;code&gt;Google-Extended&lt;/code&gt; for Google's training).&lt;/li&gt;
&lt;li&gt;If you block a bot in &lt;code&gt;robots.txt&lt;/code&gt;, you're also blocking it from reaching your shiny new Markdown endpoints. Consistency matters.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The 2026 Checklist for Shipping AI-Friendly Pages
&lt;/h2&gt;

&lt;p&gt;If you do nothing else today, do these five things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Audit who's actually crawling you.&lt;/strong&gt; Filter your access logs by user-agent. You'll be surprised how much of your "traffic" is &lt;code&gt;ClaudeBot&lt;/code&gt; and &lt;code&gt;GPTBot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Markdown content negotiation.&lt;/strong&gt; Either via the &lt;code&gt;Accept: text/markdown&lt;/code&gt; header, or via companion &lt;code&gt;.md&lt;/code&gt; URLs, or both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hand-write a &lt;code&gt;llms.txt&lt;/code&gt;&lt;/strong&gt; at your domain root. Don't auto-generate it from your sitemap — curate it. Treat it like a conversation with a smart, busy intern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update &lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt; to explicitly allow the AI bots you &lt;em&gt;want&lt;/em&gt; to be cited by, and block the ones you don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strip your Markdown ruthlessly.&lt;/strong&gt; No nav, no footer, no related-posts, no "subscribe to newsletter" CTAs. Just the answer. AI doesn't care about your conversion funnel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do this and you'll start showing up as a cited source in Perplexity and Claude answers within weeks. Skip it, and your competitors will own those citations forever.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Last Honest Word
&lt;/h2&gt;

&lt;p&gt;I want to be careful here. I'm not telling you SEO is dead in the literal sense. Google still drives the bulk of direct traffic for most sites. Strong fundamentals — fast pages, clear structure, real authority, original content — still matter. In fact, they matter &lt;em&gt;more&lt;/em&gt;, because AI engines lean on the same trust signals (and a Princeton study from 2024 found that pages cited in AI Overviews correlate ~92% with pages already ranking in Google's top 10).&lt;/p&gt;

&lt;p&gt;What's dead is the &lt;strong&gt;idea that optimizing for one audience is enough&lt;/strong&gt;. In 2026, every page you ship has at least three readers: a human, a search crawler, and an AI agent. They each need a different version of the truth.&lt;/p&gt;

&lt;p&gt;The good news? Once you set up the middleware, it's mostly free. You write the content once. The server decides who gets what. The AI bots eat their clean Markdown. The humans get their pretty page. And you get cited in the answers that are quietly replacing the search box.&lt;/p&gt;

&lt;p&gt;Welcome to the agentic web. Ship the Markdown.&lt;/p&gt;




&lt;h3&gt;
  
  
  If this was useful
&lt;/h3&gt;

&lt;p&gt;Drop a ❤️, follow for more deep-dives on the practical edge of AI engineering, and tell me in the comments: &lt;strong&gt;have you started seeing AI bots in your analytics?&lt;/strong&gt; Which one is hitting you hardest? I'm curious whether my Claude-heavy mix is normal or just a function of my niche.&lt;/p&gt;

&lt;p&gt;If you're shipping a side project right now, this is the cheapest, highest-leverage change you can make this weekend. Go look at your access logs. Then go write a &lt;code&gt;llms.txt&lt;/code&gt;. Your future self — and a few thousand AI agents — will thank you.&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%2Fqy10k5hrdc1me9zbqr6f.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%2Fqy10k5hrdc1me9zbqr6f.png" alt=" " width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#webdev&lt;/code&gt; &lt;code&gt;#ai&lt;/code&gt; &lt;code&gt;#seo&lt;/code&gt; &lt;code&gt;#javascript&lt;/code&gt; &lt;code&gt;#nextjs&lt;/code&gt; &lt;code&gt;#llm&lt;/code&gt; &lt;code&gt;#agents&lt;/code&gt; &lt;code&gt;#markdown&lt;/code&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>seo</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Why Supavisor 1.0 Is Written in Elixir (And Why That's Actually a Brilliant Move)</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Wed, 06 May 2026 09:59:23 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/why-supavisor-10-is-written-in-elixir-and-why-thats-actually-a-brilliant-move-21nm</link>
      <guid>https://dev.to/dev-arafat-alim/why-supavisor-10-is-written-in-elixir-and-why-thats-actually-a-brilliant-move-21nm</guid>
      <description>&lt;p&gt;&lt;em&gt;A behind-the-scenes look from the creator of Elixir himself.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  "Wait... Elixir? Really?"
&lt;/h2&gt;

&lt;p&gt;Picture this. You're scrolling through Hacker News, sipping your third coffee of the morning, and you see the headline: &lt;strong&gt;"Supabase launches Supavisor 1.0 — a Postgres connection pooler."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cool. Solid. Useful.&lt;/p&gt;

&lt;p&gt;Then you click in, read the docs, and realize... it's written in &lt;strong&gt;Elixir&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And somewhere in the comments, you can almost &lt;em&gt;hear&lt;/em&gt; the collective developer eyebrow-raise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Why on earth would they build a Postgres connection pooler in Elixir?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's a fair question. Most people in the broader programming community don't reach for Elixir when they think "infrastructure tool." They think Go. They think Rust. They think "something with a fancy concurrency model and a logo that screams performance."&lt;/p&gt;

&lt;p&gt;So when José Valim — yes, &lt;strong&gt;the creator of Elixir himself&lt;/strong&gt; — went on record to explain why this choice actually makes a lot of sense, it was worth listening to. He even admits upfront that he's biased (which, fair, he literally invented the language). But his answer is surprisingly &lt;em&gt;not&lt;/em&gt; about Elixir.&lt;/p&gt;

&lt;p&gt;It's about something deeper. Something older. Something built decades ago to keep your phone calls from dropping.&lt;/p&gt;

&lt;p&gt;Let's dig in.&lt;/p&gt;




&lt;h2&gt;
  
  
  First, Let's Get the Credits Out of the Way
&lt;/h2&gt;

&lt;p&gt;Before going down the rabbit hole, José gave a quick shoutout: huge congrats to the &lt;strong&gt;Supabase team&lt;/strong&gt; on shipping Supavisor 1.0. He also mentioned that he and his colleagues at &lt;strong&gt;Dashbit&lt;/strong&gt; got to contribute to this milestone in small ways. So this isn't some random outsider commentary — this is someone who's had hands on the actual code, and who happens to also be the creator of the language it was written in.&lt;/p&gt;

&lt;p&gt;Pretty cool position to write about something from, honestly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Okay, So What &lt;em&gt;Is&lt;/em&gt; a Connection Pooler Anyway?
&lt;/h2&gt;

&lt;p&gt;Before we can answer the "why Elixir" question, we need to make sure we're all on the same page about what Supavisor actually does. Because if you've never wrestled with database connections at scale, the whole concept might feel a bit abstract.&lt;/p&gt;

&lt;p&gt;So let's set the scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cloud Functions Nightmare
&lt;/h3&gt;

&lt;p&gt;Imagine you're running cloud functions. Lambda. Vercel functions. Cloudflare Workers. Whatever the flavor of the day is. These little serverless guys spin up, do their job, and disappear into the void.&lt;/p&gt;

&lt;p&gt;Now imagine each of those functions needs to talk to your Postgres database.&lt;/p&gt;

&lt;p&gt;Sounds simple, right? Just connect, run the query, return the data, disconnect. Easy.&lt;/p&gt;

&lt;p&gt;Except... &lt;strong&gt;opening a Postgres connection is not free.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time you connect to Postgres, there's an entire handshake ritual. TCP setup. Authentication. SSL negotiation if you're being responsible. Session initialization. The works. It's like every time you wanted to chat with your friend, you had to first knock on their door, introduce yourself, show ID, fill out a visitor form, and wait for them to brew you tea before you could even ask what's up.&lt;/p&gt;

&lt;p&gt;Now multiply that by &lt;strong&gt;thousands of cloud function invocations per second.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You see the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Node.js / Ruby Special
&lt;/h3&gt;

&lt;p&gt;It gets worse. José pointed out something interesting about languages like &lt;strong&gt;Node.js and Ruby&lt;/strong&gt; — they can't efficiently leverage all your CPU cores out of the box (single-threaded event loops, GVL, that whole drama). So what do you usually do? You spin up &lt;em&gt;multiple instances&lt;/em&gt; of your app.&lt;/p&gt;

&lt;p&gt;And what does each instance want? Yep — its own connection (or pool of connections) to Postgres.&lt;/p&gt;

&lt;p&gt;So now you've got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A bunch of app instances...&lt;/li&gt;
&lt;li&gt;Each holding open multiple Postgres connections...&lt;/li&gt;
&lt;li&gt;Or worse, &lt;em&gt;re-opening&lt;/em&gt; them on every request...&lt;/li&gt;
&lt;li&gt;And Postgres on the other end going, &lt;em&gt;"Please. I'm tired."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postgres connections are expensive in terms of memory too. Each one chews up RAM on the database server. Get enough of them and you'll watch your database performance fall off a cliff in real time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enter the Connection Pooler
&lt;/h3&gt;

&lt;p&gt;This is where a connection pooler comes in like the bouncer at an exclusive club.&lt;/p&gt;

&lt;p&gt;Instead of every app instance and every cloud function knocking on Postgres's door, you put a &lt;strong&gt;proxy&lt;/strong&gt; in front of Postgres. This proxy keeps a fixed set of connections to Postgres open and ready to go. When your app needs to talk to the database, it talks to the pooler instead. The pooler basically says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Hey, no need to do the whole handshake thing. I've already got a warm connection ready for you. Use this one."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your app gets fast database access. Postgres doesn't get overwhelmed. Everybody's happy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's what Supavisor is.&lt;/strong&gt; A connection pooler — but a particularly fancy one, designed from the ground up to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☁️ &lt;strong&gt;Cloud native&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🏢 &lt;strong&gt;Multi-tenant&lt;/strong&gt; — meaning you can connect to a &lt;em&gt;bunch&lt;/em&gt; of different Postgres databases at the same time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last part is huge for a company like Supabase, who hosts who-knows-how-many Postgres databases for their customers. They need one pooler that can juggle them all.&lt;/p&gt;




&lt;h2&gt;
  
  
  Now for the Real Question: Why Elixir?
&lt;/h2&gt;

&lt;p&gt;Okay, so we understand what Supavisor does. It manages a &lt;em&gt;lot&lt;/em&gt; of connections, across a &lt;em&gt;lot&lt;/em&gt; of databases, for a &lt;em&gt;lot&lt;/em&gt; of clients. And it has to do this without falling over.&lt;/p&gt;

&lt;p&gt;So why pick Elixir for this job?&lt;/p&gt;

&lt;p&gt;Here's the twist José drops:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"It's not because of Elixir. It's because of the Erlang virtual machine that Elixir runs on."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Plot twist. The hero of this story isn't actually Elixir. Elixir is more like... the cool modern frontend for an absolute powerhouse of a backend. That backend is the &lt;strong&gt;BEAM&lt;/strong&gt; — Erlang's virtual machine.&lt;/p&gt;

&lt;p&gt;To understand why the BEAM is &lt;em&gt;unreasonably&lt;/em&gt; good for this kind of work, we need to take a quick history detour. Don't worry, it's a fun one.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Trip Back to the Telephone Era
&lt;/h2&gt;

&lt;p&gt;Erlang wasn't created in a Silicon Valley garage by a hoodie-wearing twenty-something. It was created in the 1980s by &lt;strong&gt;Ericsson&lt;/strong&gt; — a Swedish telecommunications company. And they had a very specific problem to solve.&lt;/p&gt;

&lt;p&gt;They needed to build software for &lt;strong&gt;telephone switches.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now think about what a telephone switch actually does. It sits there and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts connections from a bunch of different places&lt;/li&gt;
&lt;li&gt;Routes those connections to other places — services, houses, phones&lt;/li&gt;
&lt;li&gt;Keeps thousands (or millions) of these connections alive at the same time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cannot, under any circumstances, drop your call&lt;/strong&gt; because something on the other end of the network had a hiccup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sound familiar?&lt;/p&gt;

&lt;p&gt;Because that's &lt;em&gt;exactly&lt;/em&gt; what a connection pooler does. Just swap "phone calls" for "database connections." The shape of the problem is identical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accept connections coming in from your services, your cloud functions, your request handlers&lt;/li&gt;
&lt;li&gt;Keep open connections to Postgres (the "destination" on the other side)&lt;/li&gt;
&lt;li&gt;Route incoming traffic to the right outgoing connection&lt;/li&gt;
&lt;li&gt;Handle a &lt;em&gt;staggering&lt;/em&gt; number of these simultaneously&lt;/li&gt;
&lt;li&gt;Don't fall over when something somewhere goes wrong&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Erlang was built for this. Literally. It is the language equivalent of a tool forged for one specific job, and that job &lt;em&gt;happens to be&lt;/em&gt; the same job a connection pooler does.&lt;/p&gt;

&lt;p&gt;When José said the BEAM has "all the principles and foundations" needed for Supavisor, he wasn't being generous — he was just being accurate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scale to Millions (No, Really)
&lt;/h2&gt;

&lt;p&gt;Here's where it gets really wild.&lt;/p&gt;

&lt;p&gt;You want your connection pooler to scale. Not "scale" as in "handle a few hundred connections." Scale as in &lt;strong&gt;millions of concurrent connections.&lt;/strong&gt; That's the kind of territory Supabase plays in.&lt;/p&gt;

&lt;p&gt;Most languages start sweating at, like, 10,000 concurrent connections. The BEAM? It just kind of shrugs. Handling massive numbers of lightweight processes is &lt;em&gt;literally&lt;/em&gt; what it was designed to do — because back in the telephone days, every call was a process, and a busy switch had millions of them.&lt;/p&gt;

&lt;p&gt;So when Supavisor needs to scale up to handle Supabase-level traffic, it's not fighting against the runtime. The runtime is &lt;em&gt;already wired for this.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  But What Happens When One Pooler Isn't Enough?
&lt;/h2&gt;

&lt;p&gt;Here's a great point José made that often gets overlooked.&lt;/p&gt;

&lt;p&gt;Imagine Supavisor is humming along, and traffic keeps growing. Eventually, &lt;strong&gt;one instance of the pooler isn't enough.&lt;/strong&gt; You need to spin up multiple Supavisor nodes, all working together to handle the load.&lt;/p&gt;

&lt;p&gt;Now you've got an interesting situation. Let's say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Service A&lt;/strong&gt; is connected to &lt;strong&gt;Pooler Node 1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;That request needs to talk to a specific Postgres database&lt;/li&gt;
&lt;li&gt;But the warm connection to that database is actually living on &lt;strong&gt;Pooler Node 2&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What do you do?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1:&lt;/strong&gt; Both nodes maintain connections to every database. Simple, but wasteful and doesn't scale well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 2:&lt;/strong&gt; Route the request from Node 1 over to Node 2, where the right connection already exists.&lt;/p&gt;

&lt;p&gt;Option 2 is often the smarter play. And here's the magic: &lt;strong&gt;Erlang gives you this kind of inter-node communication essentially out of the box.&lt;/strong&gt; Building distributed systems where nodes can talk to each other, hand off work, and behave as a single coordinated cluster is one of those things the BEAM has had baked in for decades. In most other ecosystems, you'd be reaching for Redis pub/sub, or gRPC, or some custom messaging layer. In Elixir/Erlang, it's just... there.&lt;/p&gt;

&lt;p&gt;That's not a small thing. That's a massive head start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fault Tolerance: The Quiet Superpower
&lt;/h2&gt;

&lt;p&gt;Here's the part that should make any infrastructure engineer's eyes light up.&lt;/p&gt;

&lt;p&gt;When you're running a connection pooler, things &lt;em&gt;will&lt;/em&gt; go wrong. A connection will die. Postgres will hiccup. A client will misbehave. Some bug will show up in production at 3 AM (because of course it will).&lt;/p&gt;

&lt;p&gt;The question is: &lt;strong&gt;when one of those things goes wrong, what happens to everything else?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a lot of systems, one bad connection or one crashed handler can take down a whole process — or worse, the whole service. You suddenly lose every other connection that was happily doing its job, just because one neighbor misbehaved.&lt;/p&gt;

&lt;p&gt;Erlang's answer to this is the &lt;strong&gt;"let it crash"&lt;/strong&gt; philosophy combined with deep, structural &lt;strong&gt;isolation between processes.&lt;/strong&gt; Each connection lives in its own lightweight process. If it crashes, only &lt;em&gt;that&lt;/em&gt; process dies. The supervisor restarts it. Nothing else even notices.&lt;/p&gt;

&lt;p&gt;It's like if your apartment building was designed so that if one apartment caught fire, the fire just... politely stayed in that one apartment. The rest of the building doesn't care. Life goes on.&lt;/p&gt;

&lt;p&gt;For a connection pooler with thousands or millions of connections, this isolation isn't a "nice to have." It's table stakes. You absolutely cannot have one weird query bringing down connections for unrelated tenants on a multi-tenant system.&lt;/p&gt;

&lt;p&gt;Erlang handed Supavisor this guarantee on a silver platter.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Big Takeaway
&lt;/h2&gt;

&lt;p&gt;So let's zoom back out and put it all together.&lt;/p&gt;

&lt;p&gt;Supavisor is a connection pooler that needs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handle &lt;strong&gt;massive numbers of concurrent connections&lt;/strong&gt; ✅ (BEAM was built for this)&lt;/li&gt;
&lt;li&gt;Be &lt;strong&gt;multi-tenant&lt;/strong&gt;, juggling many databases at once ✅ (lightweight processes make this trivial)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale across multiple nodes&lt;/strong&gt; with smart request routing ✅ (Erlang has distribution baked in)&lt;/li&gt;
&lt;li&gt;Be &lt;strong&gt;fault tolerant&lt;/strong&gt;, with crashes contained to single connections ✅ (isolation is the BEAM's middle name)&lt;/li&gt;
&lt;li&gt;Be &lt;strong&gt;cloud native&lt;/strong&gt; and ready for production at serious scale ✅ (this is the BEAM's home turf)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every. Single. Requirement. Lines up with what Erlang was originally designed to do for telephone switches forty years ago.&lt;/p&gt;

&lt;p&gt;Choosing Elixir for Supavisor isn't a quirky language preference. It's not "we like Elixir, so we'll force-fit it here." It's actually one of those rare moments where the &lt;em&gt;problem&lt;/em&gt; and the &lt;em&gt;tool&lt;/em&gt; are so well-matched that picking anything else would feel like trying to dig a swimming pool with a teaspoon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should &lt;em&gt;You&lt;/em&gt; Use Supavisor?
&lt;/h2&gt;

&lt;p&gt;Here's the practical TL;DR José landed on:&lt;/p&gt;

&lt;p&gt;If you're running Postgres in production, and &lt;strong&gt;either&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're spinning up new database connections &lt;strong&gt;dynamically all the time&lt;/strong&gt; (hi there, serverless folks 👋), &lt;strong&gt;or&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You've got &lt;strong&gt;too many services&lt;/strong&gt; keeping too many connections open to Postgres, and you're starting to feel that memory pressure...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...then yeah, you should absolutely give Supavisor a try. Sticking a smart pooler in front of Postgres can dramatically reduce your connection overhead and let your database actually breathe.&lt;/p&gt;

&lt;p&gt;And as a little bonus suggestion from José himself: if all this talk about lightweight processes, fault tolerance, distributed systems, and "let it crash" got your inner curiosity tingling — go check out &lt;strong&gt;Elixir.&lt;/strong&gt; You don't need to be building telephone switches or connection poolers to benefit from those foundations. Plenty of web apps, real-time systems, and backend services would be very happy to live on the BEAM too.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;There's a lesson hiding inside this whole story, and it's not really about Elixir or Erlang specifically.&lt;/p&gt;

&lt;p&gt;It's that sometimes, the best engineering decisions come from recognizing that &lt;strong&gt;someone, somewhere, has already solved the &lt;em&gt;shape&lt;/em&gt; of your problem&lt;/strong&gt; — even if they solved it for a completely different domain. The Ericsson engineers in the 1980s were not thinking about cloud functions or Postgres. They were thinking about phone calls. But the &lt;em&gt;structure&lt;/em&gt; of their problem — many concurrent connections, fault tolerance, distributed routing — turned out to be the structure of an enormous number of modern infrastructure problems too.&lt;/p&gt;

&lt;p&gt;Supavisor 1.0 is a great example of that lesson playing out in 2026. Decades-old runtime, brand-new product, and a &lt;em&gt;very&lt;/em&gt; nice fit between the two.&lt;/p&gt;

&lt;p&gt;Congrats again to the Supabase team. And if you're a backend dev who's never given Elixir a serious look — maybe today's the day. ☕&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried Supavisor yet? Or have your own war stories about Postgres connection management at scale? Drop them in the comments — I'd love to hear how you're handling it.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>infrastructure</category>
      <category>postgres</category>
    </item>
    <item>
      <title>I Started Learning AI-Assisted Development — And It Completely Changed How I Think About Coding</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Sun, 05 Apr 2026 12:03:25 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/i-started-learning-ai-assisted-development-and-it-completely-changed-how-i-think-about-coding-4ib8</link>
      <guid>https://dev.to/dev-arafat-alim/i-started-learning-ai-assisted-development-and-it-completely-changed-how-i-think-about-coding-4ib8</guid>
      <description>&lt;p&gt;I'll be honest with you.&lt;/p&gt;

&lt;p&gt;When I first heard the phrase &lt;em&gt;"AI-assisted development,"&lt;/em&gt; I rolled my eyes a little. I'd seen the Twitter threads. I'd watched developers rave about tools that supposedly wrote entire apps in seconds. I was skeptical. Wasn't this just autocomplete with better marketing?&lt;/p&gt;

&lt;p&gt;Then I actually sat down and took a proper course on it.&lt;/p&gt;

&lt;p&gt;What happened over the next few hours genuinely shifted my perspective — not just about the tools, but about what being a developer even means in 2026. This isn't a hype piece. It's the real story of what I learned, what surprised me, what scared me a little, and what I'm going to keep using going forward.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  First: The Stuff They Don't Tell You in the Ads
&lt;/h2&gt;

&lt;p&gt;Before touching a single tool, the course started with fundamentals. And I'm glad it did, because understanding &lt;strong&gt;how&lt;/strong&gt; these AI systems actually work is what separates developers who use AI effectively from those who just get frustrated by 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%2Fmk04v8isjw09lhn5li3f.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%2Fmk04v8isjw09lhn5li3f.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tokens — The Currency of AI
&lt;/h3&gt;

&lt;p&gt;Every time you type something to an AI, it doesn't read words the way you do. It reads &lt;em&gt;tokens&lt;/em&gt; — small chunks that might be a word, part of a word, a punctuation mark, or even a space. The word &lt;code&gt;function&lt;/code&gt; might be a single token. The word &lt;code&gt;functionalize&lt;/code&gt; might get broken into two or three.&lt;/p&gt;

&lt;p&gt;Why does this matter to you as a developer? Because most AI services have token limits. Free tiers restrict how many tokens you can use per day or month. &lt;strong&gt;Longer prompts cost more.&lt;/strong&gt; Understanding this helps you stop wondering why you hit limits and start thinking strategically about how you write prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Windows — The AI's Short-Term Memory
&lt;/h3&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%2Fuylzvt53370uxdszyvx6.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%2Fuylzvt53370uxdszyvx6.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The context window is how much information the AI can hold in its "mind" at once during a conversation.&lt;/p&gt;

&lt;p&gt;Here's the real-world difference this makes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPT-4&lt;/strong&gt;: ~128,000 tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt;: up to 200,000 tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt;: over &lt;strong&gt;1 million tokens&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A small context window means the AI can only look at a few files at a time. A large context window means it can analyze your entire codebase in one pass. This isn't just a spec sheet detail — it fundamentally changes what kind of tasks you can assign to each tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hallucinations — The Thing That Should Keep You Humble
&lt;/h3&gt;

&lt;p&gt;This one matters most. A hallucination is when the AI confidently suggests something that's completely wrong. Not "maybe wrong." &lt;em&gt;Wrong&lt;/em&gt; — like referencing a library that was deprecated years ago, inventing an API method that never existed, or calling a function that doesn't exist anywhere.&lt;/p&gt;

&lt;p&gt;The AI isn't lying to you. It's doing exactly what it was trained to do: predicting what token should come next. Sometimes that prediction is perfect. Sometimes it's completely made up — and delivered with the exact same confident tone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This is why you never, ever blindly accept AI-generated code.&lt;/strong&gt; Test it. Check the docs. Verify the functions actually exist. This isn't optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mental Model That Changed Everything For Me
&lt;/h2&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%2F7jovko84k056d71cl74p.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%2F7jovko84k056d71cl74p.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's the framing that clicked for me and I haven't stopped thinking about it since:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Think of AI as a very fast, very knowledgeable junior developer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They can write code quickly. They know a lot of syntax. But you need to review their work, guide the architecture, and make the important decisions.&lt;/p&gt;

&lt;p&gt;AI is phenomenal at the &lt;strong&gt;how&lt;/strong&gt;: how to implement something, how to write the syntax, how to structure a function. But &lt;em&gt;you&lt;/em&gt; should be deciding the &lt;strong&gt;what&lt;/strong&gt; and the &lt;strong&gt;why&lt;/strong&gt;. What you're building and why you're building it that way.&lt;/p&gt;

&lt;p&gt;Use AI for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Boilerplate code (getters, setters, basic CRUD)&lt;/li&gt;
&lt;li&gt;Learning new frameworks or syntax&lt;/li&gt;
&lt;li&gt;Writing tests and documentation&lt;/li&gt;
&lt;li&gt;Refactoring repetitive patterns&lt;/li&gt;
&lt;li&gt;Getting unstuck on syntax errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep these to yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System architecture decisions&lt;/li&gt;
&lt;li&gt;Security-critical logic&lt;/li&gt;
&lt;li&gt;Complex business logic&lt;/li&gt;
&lt;li&gt;Performance-critical optimizations&lt;/li&gt;
&lt;li&gt;Learning a new concept for the first time&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  GitHub Copilot: Your Pair Programmer Lives in VS Code
&lt;/h2&gt;

&lt;p&gt;The first tool I got hands-on with was GitHub Copilot, and it's the most accessible entry point for most developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting It Up
&lt;/h3&gt;

&lt;p&gt;Install the &lt;strong&gt;GitHub Copilot Chat&lt;/strong&gt; extension in VS Code (not the old deprecated one). Sign in with your GitHub account, and you're done. The extension now handles both code completions &lt;em&gt;and&lt;/em&gt; chat in one package.&lt;/p&gt;

&lt;p&gt;On pricing: the &lt;strong&gt;free tier&lt;/strong&gt; gives you 2,000 code completions and 50 chat/agent requests per month. If you're a student, teacher, or open-source maintainer, you can get the &lt;strong&gt;Pro plan free&lt;/strong&gt; — which gives you unlimited completions and access to premium models.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Neighboring Tabs" Trick
&lt;/h3&gt;

&lt;p&gt;This was the first genuine "whoa" moment for me.&lt;/p&gt;

&lt;p&gt;Copilot doesn't just look at the file you're currently editing. It also scans &lt;strong&gt;the other tabs you have open&lt;/strong&gt; in VS Code. So if you have your CSS file, your test file, and your component file all open simultaneously, Copilot will suggest code that uses the actual class names from your CSS and the actual test IDs from your test file.&lt;/p&gt;

&lt;p&gt;Without those tabs open, it might suggest something generic like &lt;code&gt;container&lt;/code&gt; or &lt;code&gt;user-box&lt;/code&gt;. With them open, it knows you need &lt;code&gt;user-card-name&lt;/code&gt; because that's what your test is looking for. This is the difference between suggestions that feel generic and suggestions that feel like the tool actually understands your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three Modes You Need to Know
&lt;/h3&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%2Fzr0g7wf0kks2a9gszooh.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%2Fzr0g7wf0kks2a9gszooh.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask Mode&lt;/strong&gt; is for questions, learning, and exploration. It won't touch a single line of your code unless you manually copy something. Safe to use when you're in a "what is this" headspace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edit Mode&lt;/strong&gt; is for targeted refactoring. Point it at a file and give it a specific instruction — like "refactor this to async/await with a 5-second timeout" — and it applies changes &lt;em&gt;directly to your file&lt;/em&gt; in a diff view. Red = old code, green = new code. You review each line and choose keep or undo. This is the fastest way to safely refactor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent Mode&lt;/strong&gt; is where things get genuinely powerful — and genuinely require your attention. Give it a massive task like "create a full REST API with JWT authentication and an SQLite database" and it will plan, create files, install npm packages, write middleware, and even run test builds to check for syntax errors. It's autonomous. It asks for permission before sensitive operations. And it will make decisions you might not agree with — so you need to watch the plan it generates and stay engaged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Teaching Copilot Your Project's Rules
&lt;/h3&gt;

&lt;p&gt;You can create a file called &lt;code&gt;.github/copilot-instructions&lt;/code&gt; and write plain-English rules for your project — always use TypeScript, always use functional components, use &lt;code&gt;bcrypt&lt;/code&gt; for passwords — and Copilot will follow them automatically. &lt;/p&gt;

&lt;p&gt;Even better: just type &lt;code&gt;/init&lt;/code&gt; in the Copilot chat, and it will &lt;strong&gt;scan your codebase and generate this file for you&lt;/strong&gt;. Every suggestion it makes from that point forward will respect your project's conventions automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  CodeRabbit: The AI That Reviews Your Code So You Don't Have To (Well, Sort Of)
&lt;/h2&gt;

&lt;p&gt;This is the one that genuinely impressed me most, and it's the one I didn't expect to care about.&lt;/p&gt;

&lt;p&gt;Here's the workflow problem CodeRabbit solves: you push code, you wait a day or two for a human code review, and then you have to context-switch back to fix issues that are now stale in your memory. With AI code review, you get feedback in &lt;strong&gt;minutes&lt;/strong&gt; — while the context is still fresh.&lt;/p&gt;

&lt;h3&gt;
  
  
  What CodeRabbit Actually Does
&lt;/h3&gt;

&lt;p&gt;The moment you create a pull request, CodeRabbit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyzes your changes and generates a summary&lt;/li&gt;
&lt;li&gt;Flags security vulnerabilities before they reach production&lt;/li&gt;
&lt;li&gt;Identifies bugs and code quality issues&lt;/li&gt;
&lt;li&gt;Assigns severity levels: &lt;strong&gt;critical, major, minor, nitpick&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Provides specific, implementable suggested fixes&lt;/li&gt;
&lt;li&gt;Lets you chat with it directly in the PR comments&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It integrates with GitHub, GitLab, Bitbucket, and Azure DevOps.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Real Example That Got Me
&lt;/h3&gt;

&lt;p&gt;During the course, a demo project had these issues caught by CodeRabbit on a PR:&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%2F22xwf4j5nfy6fy5kq915.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%2F22xwf4j5nfy6fy5kq915.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Major&lt;/strong&gt;: Hard-coded admin password in source code (with a one-click commitable fix)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical&lt;/strong&gt;: Admin list and delete endpoints were completely unauthenticated — anyone could enumerate or delete discount codes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Major&lt;/strong&gt;: Cart total was being accepted from the client, which could be manipulated — it should be computed server-side&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minor&lt;/strong&gt;: Dead code with unfixed bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's the part that got me: you can just type &lt;code&gt;@coderabbit ai can you show me how to properly secure these admin endpoints using middleware?&lt;/code&gt; right in a PR comment, and it will give you a complete, contextual implementation guide.&lt;/p&gt;

&lt;h3&gt;
  
  
  The CLI Power Move
&lt;/h3&gt;

&lt;p&gt;CodeRabbit also has a CLI. You can run &lt;code&gt;coderabbit&lt;/code&gt; from your terminal before you've even committed anything. This means you can set up a loop: write code → review locally → fix → commit. And it gets better: if you're using an AI agent like Copilot or Claude, you can tell the agent to "run coderabbit --prompt-only and fix any issues it finds" — and the agent will handle the entire review-and-fix cycle autonomously.&lt;/p&gt;

&lt;p&gt;One AI writing code. Another AI reviewing it. That's not science fiction anymore.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeRabbit Plan — This One's a Game Changer
&lt;/h3&gt;

&lt;p&gt;Before you write a single line of code, create a GitHub issue describing what you want. Then comment &lt;code&gt;@coderabbit ai plan&lt;/code&gt; on the issue. CodeRabbit will analyze your entire codebase and generate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A detailed implementation plan&lt;/li&gt;
&lt;li&gt;Specific files to modify&lt;/li&gt;
&lt;li&gt;Patterns to follow&lt;/li&gt;
&lt;li&gt;Acceptance criteria&lt;/li&gt;
&lt;li&gt;Ready-to-use prompts for AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of telling an AI agent "add a wish list feature and figure it out," you give it this context-rich plan. The agent knows exactly where to touch the codebase and what the success criteria look like.&lt;/p&gt;




&lt;h2&gt;
  
  
  Claude Code: When You Need Deep Reasoning in Your Terminal
&lt;/h2&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%2Fteheqawgld32kcfnl5ks.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%2Fteheqawgld32kcfnl5ks.png" alt=" " width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Claude Code is Anthropic's CLI tool, and it occupies a different niche from Copilot. Where Copilot lives inside your IDE and excels at quick completions and inline suggestions, Claude Code is a terminal-first tool designed for complex reasoning, large-scale analysis, and autonomous multi-step tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing and Getting Started
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @anthropic-ai/claude-code
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Code requires a Claude Pro subscription or API credits — there's no free tier. But for what it can do, it's worth it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Thinking Modes
&lt;/h3&gt;

&lt;p&gt;This is a genuinely clever design decision. When you give Claude Code a command, you can prefix it with different thinking modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;think&lt;/code&gt;&lt;/strong&gt; — quick analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;think hard&lt;/code&gt;&lt;/strong&gt; — deeper reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;think harder&lt;/code&gt;&lt;/strong&gt; — even more thorough&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;ultrathink&lt;/code&gt;&lt;/strong&gt; — maximum depth, maximum time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're making an architectural decision or asking it to analyze your entire codebase for issues, telling it to &lt;code&gt;ultrathink&lt;/code&gt; means it'll spend significantly more time reasoning through the problem before it responds. For complex tasks, this produces noticeably better output.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Claude.md File
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;claude.md&lt;/code&gt; file in your project directory. In plain English, describe what your application is, what technologies you use, your coding standards, your project structure. Claude will read this and use it as context for everything it does in your project — following your conventions automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Can Actually Do
&lt;/h3&gt;

&lt;p&gt;During the demo, the instructor told Claude to analyze the TechMart codebase and suggest improvements. Claude read through every file, understood the architecture, and identified issues that the team hadn't caught — including a race condition in user ID collection during registration and CORS being configured to allow all origins with credentials. Then, with a single "yes, please fix all five," it made all the changes, installed the necessary packages, and summarized exactly what it changed.&lt;/p&gt;

&lt;p&gt;That's a meaningfully different category of assistance than code completion.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gemini CLI: Google's Secret Weapon Is That Context Window
&lt;/h2&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%2Fum5qbywsv0e2ky0tuq4v.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%2Fum5qbywsv0e2ky0tuq4v.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gemini CLI comes from Google DeepMind and has one spec that makes it uniquely powerful: &lt;strong&gt;over 1 million tokens in its context window&lt;/strong&gt;. That's not a typo. It can hold an almost comically large amount of information in its working memory at once.&lt;/p&gt;

&lt;p&gt;Combined with a &lt;strong&gt;free tier of 1,000 messages per day&lt;/strong&gt;, it's the most accessible of the powerful CLI tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Multimodal Trick
&lt;/h3&gt;

&lt;p&gt;Gemini can process images. This means you can take a photo of a whiteboard sketch and ask it to turn it into a React component. Or — as demonstrated in the course — take a screenshot of an SVG keyboard image, pass it in with a command, and ask it to add more keys to the SVG file. It found the keyboard, understood the structure, and added the keys. That's multimodal AI working in a developer context, and it's wild.&lt;/p&gt;

&lt;h3&gt;
  
  
  Something I Didn't Expect
&lt;/h3&gt;

&lt;p&gt;When Gemini CLI started up in the demo, it didn't wait for a command. It just started exploring the codebase on its own — running the application, logging into the demo account, verifying the session. All before the instructor typed anything. That kind of autonomous initialization is either impressive or slightly unsettling depending on your perspective. Probably both.&lt;/p&gt;




&lt;h2&gt;
  
  
  OpenClaw: The AI That Never Sleeps, Lives on Your Computer, and You Text From WhatsApp
&lt;/h2&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%2F79iz3ywoxt2v0zxlk8ce.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%2F79iz3ywoxt2v0zxlk8ce.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the one that sounds the most like a product someone invented for a science fiction story.&lt;/p&gt;

&lt;p&gt;OpenClaw is an open-source AI assistant that runs directly on your own computer — your laptop, a Mac Mini, a cloud VM. Once it's set up, you can message it from &lt;strong&gt;WhatsApp, Telegram, Discord, or any chat app you already use&lt;/strong&gt;. You're essentially texting a co-worker who has full access to your development environment and never goes offline.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes It Different
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Always available&lt;/strong&gt;: It's not a chat interface you have to open. It's a background process you message from wherever you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistent memory&lt;/strong&gt;: Unlike most AI tools where every conversation starts fresh, OpenClaw maintains context continuously. It knows your projects, your preferences, your ongoing tasks — because it's been running the whole time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It takes real actions&lt;/strong&gt;: It doesn't just suggest things. It can run commands, open browsers, manage files, deploy projects, send emails, manage GitHub notifications. This is an AI that &lt;em&gt;does&lt;/em&gt; things, not just recommends them.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Cron Jobs Feature
&lt;/h3&gt;

&lt;p&gt;This is where it gets genuinely interesting for developer productivity. You can set up scheduled tasks in OpenClaw — like a cron job, but you just describe it in plain English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Check my email every morning and summarize important messages"&lt;/li&gt;
&lt;li&gt;"Work on my SaaS project every night"&lt;/li&gt;
&lt;li&gt;"Generate one YouTube script with slides every week"&lt;/li&gt;
&lt;li&gt;"Monitor my PRs and ping me on Discord when CodeRabbit finds issues"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It builds the automation, runs it, and keeps it running. If you can describe it, it can probably build it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Orchestration Layer
&lt;/h3&gt;

&lt;p&gt;Here's the insight that reframed all the other tools for me: OpenClaw can use any CLI tool, which means it can use Claude Code, it can use CodeRabbit, it can use Gemini. It becomes the &lt;strong&gt;orchestration layer&lt;/strong&gt; for your entire AI workflow.&lt;/p&gt;

&lt;p&gt;Imagine you're on a walk and get a notification that tests are failing. You text your OpenClaw: "fix the failing tests and open a PR." It spawns a Claude Code session, runs the tests, figures out what's wrong, fixes it, and opens the PR. You finish your walk. This is real. This is available right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Stack AI Workflow
&lt;/h2&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%2F2cp7z3oax8x6p53mhwyc.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%2F2cp7z3oax8x6p53mhwyc.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By the end of the course, the picture of how all these tools fit together became clear. Here's the pattern that was demonstrated:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Plan&lt;/strong&gt; with Claude Code (&lt;code&gt;ultrathink&lt;/code&gt; the architecture)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate a coding plan&lt;/strong&gt; with CodeRabbit Plan from a GitHub issue&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement&lt;/strong&gt; with GitHub Copilot Agent Mode in VS Code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write tests&lt;/strong&gt; with Claude Code first (so the AI has concrete goals to code against)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review&lt;/strong&gt; with CodeRabbit (catches the edge cases, security issues, and code smells)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestrate&lt;/strong&gt; with OpenClaw (tie everything together, run it while you're not at your desk)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And with &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; — a way to give AI tools additional capabilities — you can extend Claude Code to browse the web, run Puppeteer for browser automation, do DuckDuckGo searches, query databases, and manage GitHub repos. MCP turns these tools from powerful into &lt;em&gt;extensible&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Security Reality Check You Need to Read
&lt;/h2&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%2Fmd6vwpsddyhuva88dc3o.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%2Fmd6vwpsddyhuva88dc3o.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not optional reading. This matters.&lt;/p&gt;

&lt;p&gt;AI doesn't understand your security context. Only you do. Here's what CodeRabbit and the course both flagged as things AI commonly gets wrong — and that you must check every single time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard-coded passwords or API keys&lt;/strong&gt; in source code (there are countless stories of devs "vibe coding" secrets directly onto GitHub)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQL string concatenation&lt;/strong&gt; instead of parameterized queries (classic SQL injection vulnerability)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eval()&lt;/code&gt; with user input&lt;/strong&gt; — never&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sensitive data exposed in error messages&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated admin endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client-supplied totals&lt;/strong&gt; (cart totals, discount amounts — always compute server-side)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabled security features&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secrets not stored in environment variables&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The course showed a concrete example of AI generating a SQL query using string concatenation instead of parameterized queries. Classic vulnerability. CodeRabbit caught it automatically. But if you don't have CodeRabbit, you need to catch it yourself.&lt;/p&gt;

&lt;p&gt;AI code review tools are especially valuable when you're using AI to write code in the first place — precisely because the thing generating the vulnerabilities isn't the thing catching them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Better Prompts = Better Code (The Formula)
&lt;/h2&gt;

&lt;p&gt;One of the most practical sections of the course was about prompt engineering. The principle is simple: vague prompts get vague code. Specific prompts get specific, useful code.&lt;/p&gt;

&lt;p&gt;When you ask an AI to write something, include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Input parameters and their types&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expected output format&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error handling requirements&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Style preferences&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edge cases you care about&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of: &lt;em&gt;"write a function to get users"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Write: &lt;em&gt;"write an async TypeScript function that fetches a user by ID from a PostgreSQL database, returns a typed User object or null if not found, handles connection errors by throwing a DatabaseError, and uses parameterized queries"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second prompt gets you production-ready code. The first gets you a guess.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Honest Assessment After Going Through All of This
&lt;/h2&gt;

&lt;p&gt;Here's what I'll keep using:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; for daily coding — the inline completions are genuinely magic once you have the neighboring tabs trick wired into your workflow. The &lt;code&gt;/init&lt;/code&gt; instruction file has saved me from repeating project conventions in every prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt; for every pull request — I'm not a team of one forever, and even solo, the security catches alone are worth it. The plan feature is becoming part of how I approach new features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; when I need to think big — architecture analysis, large refactors, complex reasoning tasks. The &lt;code&gt;ultrathink&lt;/code&gt; mode for hard problems is something I didn't know I needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt; when the context window matters — there are tasks where you need the AI to hold your entire codebase in mind at once. Gemini's free tier and 1M token window make it the right tool for those moments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; — I'm in the process of setting this up. The idea of a background AI that can run automated tasks while I'm away from my desk is too compelling to pass on.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Mindset Shift
&lt;/h2&gt;

&lt;p&gt;After going through all of this, the thing I keep coming back to isn't a specific tool or feature. It's a mental model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI speeds up implementation. You make the decisions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The architectural choices, the security design, the business logic — these are yours. The AI is a fast, knowledgeable colleague who can write code quickly but needs you to review it, guide it, and catch what it misses.&lt;/p&gt;

&lt;p&gt;The developers who will thrive aren't the ones who hand everything to the AI. They're the ones who understand the tools well enough to know when to use them, when not to, and how to catch the mistakes before they ship.&lt;/p&gt;

&lt;p&gt;That's the course. That's what I learned. And if you're a developer who hasn't seriously explored this space yet — now's a good time.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you tried any of these tools? Which ones are in your workflow? Drop a comment — I'm genuinely curious what's working for other developers.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tools mentioned in this post:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coderabbit.ai" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; by Anthropic&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/google-gemini/gemini-cli" rel="noopener noreferrer"&gt;Gemini CLI&lt;/a&gt; by Google&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openclaw.ai" rel="noopener noreferrer"&gt;OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Android Is Losing Its Freedom: Google's 2026 Developer Verification Explained</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Sat, 28 Mar 2026 17:15:28 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/android-is-losing-its-freedom-googles-2026-developer-verification-explained-2b5p</link>
      <guid>https://dev.to/dev-arafat-alim/android-is-losing-its-freedom-googles-2026-developer-verification-explained-2b5p</guid>
      <description>&lt;p&gt;&lt;em&gt;Google's Android Developer Verification policy could end APK sideloading, kill third-party app stores, and reshape Android forever. Here's exactly what's changing and why it matters.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Android has always been the developer's OS — open, hackable, and free. But in 2026, Google is quietly flipping the switch. A sweeping new &lt;strong&gt;Android Developer Verification&lt;/strong&gt; policy is rolling out, and if you sideload apps, use custom ROMs, or build indie Android apps, this affects you directly.&lt;/p&gt;

&lt;p&gt;Let's break down exactly what's changing, what you'll lose, and whether Google's reasoning holds up.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR — What's Happening?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Android Developer Verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who it affects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All Android app developers — including outside the Play Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What's required&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Legal name, address, government ID, contact info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$25 even for APK-only distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enforcement starts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;September 2026 (select regions)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Global rollout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Expected 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What Made Android Special in the First Place?
&lt;/h2&gt;

&lt;p&gt;For over a decade, Android stood apart from every other mobile OS for one reason: &lt;strong&gt;you were in control&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Install any APK from any source&lt;/li&gt;
&lt;li&gt;✅ Root your device without voiding your soul&lt;/li&gt;
&lt;li&gt;✅ Flash custom ROMs like LineageOS or GrapheneOS&lt;/li&gt;
&lt;li&gt;✅ Ship apps without asking anyone's permission&lt;/li&gt;
&lt;li&gt;✅ Build and distribute tools that would never pass Apple's review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This openness made Android the natural home for developers, security researchers, hobbyists, and privacy-conscious users worldwide. It wasn't just a phone OS — it was an &lt;strong&gt;open platform&lt;/strong&gt; in the truest sense.&lt;/p&gt;

&lt;p&gt;That's now under threat.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Exactly Is Android Developer Verification?
&lt;/h2&gt;

&lt;p&gt;Starting March 2026, Google is requiring &lt;strong&gt;every Android app developer&lt;/strong&gt; to verify their identity — not just Play Store publishers, but anyone distributing APKs externally too.&lt;/p&gt;

&lt;h3&gt;
  
  
  What developers must submit:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Full legal name&lt;/li&gt;
&lt;li&gt;Physical address&lt;/li&gt;
&lt;li&gt;Government-issued ID&lt;/li&gt;
&lt;li&gt;Contact information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And here's the part that most coverage misses:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This verification requirement extends beyond the Play Store. Even developers who only distribute APKs directly to users must comply.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a fundamental shift. Previously, you could write an app and share the APK with zero friction. Now that path requires identity registration and a fee.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rollout Timeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;March 2026      → Policy introduced, developer registration opens
September 2026  → Strict enforcement begins in select regions
2027 (expected) → Global enforcement rollout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're building or distributing Android apps today, the clock is already ticking.&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Actually Affects You as a Developer
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. APK Sideloading Gets Much Harder
&lt;/h3&gt;

&lt;p&gt;If a developer hasn't completed verification, Android will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show aggressive, multi-step warning dialogs&lt;/li&gt;
&lt;li&gt;Potentially block installation entirely in enforced regions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For users, this means apps from your favorite indie devs or open-source communities may simply &lt;strong&gt;refuse to install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For developers, it means every APK you've ever shared casually — beta builds, tools for your team, experiments — now requires you to be in Google's registry.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Third-Party App Stores Are at Serious Risk
&lt;/h3&gt;

&lt;p&gt;Stores like &lt;strong&gt;Aptoide&lt;/strong&gt;, &lt;strong&gt;F-Droid&lt;/strong&gt;, and &lt;strong&gt;Aurora Store&lt;/strong&gt; exist because developers could publish freely. Once verification becomes mandatory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many independent developers won't register (privacy concerns, bureaucratic friction, or simply not knowing)&lt;/li&gt;
&lt;li&gt;Their apps get flagged or blocked&lt;/li&gt;
&lt;li&gt;Alternative stores lose their catalog and eventually their reason to exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;F-Droid in particular — which hosts only free and open-source software — could face significant disruption, since many of its contributors are pseudonymous by principle.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. There's Now a Cost to Distribute Outside the Play Store
&lt;/h3&gt;

&lt;p&gt;Previously, distributing an APK was completely free — host a file, share a link, done.&lt;/p&gt;

&lt;p&gt;Now developers need to pay approximately &lt;strong&gt;$25&lt;/strong&gt; to be verified, even if they never touch the Play Store.&lt;/p&gt;

&lt;p&gt;This might seem small, but it's a meaningful barrier for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Students building their first app&lt;/li&gt;
&lt;li&gt;Open-source contributors in lower-income regions&lt;/li&gt;
&lt;li&gt;Hobby developers who ship tools for their own community&lt;/li&gt;
&lt;li&gt;Researchers distributing security or privacy tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The $25 isn't the real cost — the &lt;strong&gt;chilling effect&lt;/strong&gt; is.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Android Ecosystem Could Lose
&lt;/h2&gt;

&lt;p&gt;This isn't just a policy change. It's a cultural shift with real consequences for the ecosystem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What We Risk Losing&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom ROM communities&lt;/td&gt;
&lt;td&gt;LineageOS, GrapheneOS need unverified app support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security research tools&lt;/td&gt;
&lt;td&gt;Many can't pass Play Store review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indie app experimentation&lt;/td&gt;
&lt;td&gt;High friction kills hobbyist development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy-preserving alternatives&lt;/td&gt;
&lt;td&gt;Apps designed to avoid Google's ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regional/local language apps&lt;/td&gt;
&lt;td&gt;Developers in smaller markets may not register&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Android modding and rooting scene, in particular, is built on the assumption that you can install anything. Remove that, and you remove the foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Is Google Doing This? (The Real Reasons)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Reason 1: Security — and It's Legitimate
&lt;/h3&gt;

&lt;p&gt;Here's a stat worth taking seriously: &lt;strong&gt;over 98% of mobile malware targets Android&lt;/strong&gt;, and the majority enters through unverified APK files.&lt;/p&gt;

&lt;p&gt;Fake banking apps, counterfeit WhatsApp builds, malware disguised as government apps — these are real problems that hurt real people, particularly in markets where sideloading is common.&lt;/p&gt;

&lt;p&gt;Google's verification push genuinely addresses this. A verified developer trail means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scammers can't distribute anonymously&lt;/li&gt;
&lt;li&gt;Malicious apps can be traced and removed&lt;/li&gt;
&lt;li&gt;Users have a clearer signal of what's trustworthy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the strongest argument in Google's favor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reason 2: Regulatory Pressure
&lt;/h3&gt;

&lt;p&gt;Google isn't operating in a vacuum. Several major jurisdictions are tightening rules around app distribution accountability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;India's IT Rules&lt;/strong&gt; require traceability of harmful digital content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The EU's Digital Services Act&lt;/strong&gt; mandates transparency around app distribution and developer identity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google is getting ahead of these requirements, and the verification system gives them a compliance framework that works globally.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Uncomfortable Irony: Android and iOS Are Swapping Identities
&lt;/h2&gt;

&lt;p&gt;While Google tightens Android, Apple has been — slowly, reluctantly, but genuinely — opening iOS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alternative app marketplaces&lt;/strong&gt; are now permitted in the EU&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sideloading&lt;/strong&gt; is allowed in certain regions under regulatory pressure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party browser engines&lt;/strong&gt; are no longer blocked in the EU&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two platforms that defined "open vs. closed" are converging from opposite ends. If this trajectory continues, the distinction between them becomes much murkier by 2027.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Developer Community's Concerns (And They're Valid)
&lt;/h2&gt;

&lt;p&gt;The pushback from the open-source and developer communities isn't just about convenience. The deeper concerns are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy:&lt;/strong&gt; Submitting government ID to Google is a non-starter for pseudonymous contributors and privacy researchers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access:&lt;/strong&gt; Developers in countries with complex documentation requirements or limited banking access face disproportionate barriers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precedent:&lt;/strong&gt; Once identity verification is normalized for APK distribution, the next step — restricting &lt;em&gt;which&lt;/em&gt; APKs can be installed without Play Store approval — becomes much easier to justify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chilling effect on experimentation:&lt;/strong&gt; The most important apps often start as weird, unpolished experiments that no one would have approved. Friction at distribution kills those experiments before they begin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Honest Assessment: Pros and Cons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ What You Gain
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fewer scam apps and fake APKs&lt;/li&gt;
&lt;li&gt;Stronger accountability for malicious developers&lt;/li&gt;
&lt;li&gt;Better compliance with global digital safety regulations&lt;/li&gt;
&lt;li&gt;Clearer trust signals for non-technical users&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ What You Lose
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Anonymous and pseudonymous app distribution&lt;/li&gt;
&lt;li&gt;Zero-friction indie development and sharing&lt;/li&gt;
&lt;li&gt;The open ecosystem that made Android a developer platform&lt;/li&gt;
&lt;li&gt;Competitive pressure on the Play Store from alternative stores&lt;/li&gt;
&lt;li&gt;Access for developers who can't or won't submit government ID&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Developers Should Do Right Now
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your distribution method&lt;/strong&gt; — if you share APKs publicly or even privately, you'll need to plan for verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor F-Droid and GrapheneOS announcements&lt;/strong&gt; — these communities will likely publish guidance and possibly workarounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Back up your favorite open-source apps&lt;/strong&gt; — download APKs from trusted sources while you still can without friction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit feedback to Google&lt;/strong&gt; — the policy is still being shaped; developer feedback during this period matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow the EU situation&lt;/strong&gt; — regulatory pressure has already forced concessions from both Apple and Google; organized pushback works.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Final Word
&lt;/h2&gt;

&lt;p&gt;Google's Android Developer Verification isn't purely good or purely bad — it's a real trade-off with winners and losers.&lt;/p&gt;

&lt;p&gt;If you're a non-technical user tired of malware and scam apps, you probably come out ahead. If you're a developer, researcher, modder, or power user who valued Android's openness, you're losing something real.&lt;/p&gt;

&lt;p&gt;The version of Android that ships by 2027 may be safer, more accountable, and more regulation-compliant. It may also no longer be the platform that made a generation of developers fall in love with mobile development.&lt;/p&gt;

&lt;p&gt;Whether that trade-off is worth it depends on which Android you actually use.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have thoughts on the verification policy? Drop them in the comments — especially if you're an indie dev or open-source contributor directly affected by this.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://play.google.com/about/developer-content-policy/" rel="noopener noreferrer"&gt;Google Play Developer Policy Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://digital-markets-act.ec.europa.eu/" rel="noopener noreferrer"&gt;EU Digital Services Act — App Store Obligations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://f-droid.org/" rel="noopener noreferrer"&gt;F-Droid: Free and Open Source Android App Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grapheneos.org/" rel="noopener noreferrer"&gt;GrapheneOS — Privacy and Security Focused Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>android</category>
      <category>google</category>
      <category>opensource</category>
      <category>security</category>
    </item>
    <item>
      <title>🚀 Google AdMob Guide – How to Monetize Your Mobile App Like a Pro</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Thu, 14 Aug 2025 21:24:25 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/google-admob-guide-how-to-monetize-your-mobile-app-like-a-pro-14hb</link>
      <guid>https://dev.to/dev-arafat-alim/google-admob-guide-how-to-monetize-your-mobile-app-like-a-pro-14hb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Google AdMob&lt;/strong&gt; is a mobile advertising platform that helps app developers earn revenue by displaying ads inside their apps.&lt;br&gt;
Think of it as renting out a small piece of your app’s interface to advertisers — and getting paid for it.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Official Website:&lt;/strong&gt; &lt;a href="https://admob.google.com" rel="noopener noreferrer"&gt;admob.google.com&lt;/a&gt;&lt;br&gt;
🔗 &lt;strong&gt;Help Center:&lt;/strong&gt; &lt;a href="https://support.google.com/admob" rel="noopener noreferrer"&gt;support.google.com/admob&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 Why Use Google AdMob?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Global Reach:&lt;/strong&gt; Access millions of advertisers via Google’s ad network.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Ad Formats:&lt;/strong&gt; From small banners to immersive videos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Platform:&lt;/strong&gt; Works for Android, iOS, Unity, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Powerful Targeting:&lt;/strong&gt; Show ads that fit your audience’s interests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Integration:&lt;/strong&gt; SDKs and libraries for popular frameworks like React Native.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Types of Ads in AdMob
&lt;/h2&gt;

&lt;p&gt;AdMob offers five main ad formats. Choosing the right type depends on your app’s design and user flow.&lt;/p&gt;


&lt;h3&gt;
  
  
  1️⃣ Banner Ads – &lt;em&gt;Steady &amp;amp; Non-Intrusive&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What are they?&lt;/strong&gt; Small rectangular ads that stick to the top or bottom of the screen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Continuous low-impact revenue while users browse content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A weather app shows a banner at the bottom while users check forecasts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/admob/android/banner" rel="noopener noreferrer"&gt;Banner Ads Guide&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2️⃣ Interstitial Ads – &lt;em&gt;Full-Screen Impact&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What are they?&lt;/strong&gt; Large image or video ads that cover the whole screen at natural breaks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Games between levels, news apps between articles, or after key user actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; After a user finishes reading an article, an interstitial ad appears before loading the next one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/admob/android/interstitial" rel="noopener noreferrer"&gt;Interstitial Ads Guide&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  3️⃣ Rewarded Ads – &lt;em&gt;User-Opt-In Engagement&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What are they?&lt;/strong&gt; Ads users watch voluntarily in exchange for a reward.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; In-game bonuses, unlocking premium features, or offering extra content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A user watches a 30-second video to unlock a bonus feature in a productivity app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/admob/android/rewarded" rel="noopener noreferrer"&gt;Rewarded Ads Guide&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  4️⃣ Native Ads – &lt;em&gt;Blend Seamlessly with Your UI&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What are they?&lt;/strong&gt; Ads styled to match your app’s look and feel, labeled as “Ad” or “Sponsored.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; News feeds, social media-style timelines, or discovery sections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A travel app’s article list includes a sponsored post for a flight booking service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/admob/android/native" rel="noopener noreferrer"&gt;Native Ads Guide&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  5️⃣ App Open Ads – &lt;em&gt;Instant Attention Grabbers&lt;/em&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What are they?&lt;/strong&gt; Full-screen ads shown when launching or returning to an app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; High-traffic apps that are opened frequently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; A quick ad appears when opening a fitness tracking app before showing the dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://developers.google.com/admob/android/app-open" rel="noopener noreferrer"&gt;App Open Ads Guide&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🛠 How to Add AdMob to Your React Native App
&lt;/h2&gt;

&lt;p&gt;We’ll use the &lt;a href="https://invertase.io/oss/react-native-google-mobile-ads" rel="noopener noreferrer"&gt;&lt;code&gt;react-native-google-mobile-ads&lt;/code&gt;&lt;/a&gt; library for integration.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1: Create an AdMob Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://admob.google.com" rel="noopener noreferrer"&gt;admob.google.com&lt;/a&gt; and sign in with your Google account.&lt;/li&gt;
&lt;li&gt;Add your app for Android and/or iOS.&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;Ad Units&lt;/strong&gt; (e.g., banner, interstitial).&lt;/li&gt;
&lt;li&gt;Save your &lt;strong&gt;App ID&lt;/strong&gt; and &lt;strong&gt;Ad Unit IDs&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔗 &lt;a href="https://support.google.com/admob/answer/6232340" rel="noopener noreferrer"&gt;Create Ad Units&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Install the AdMob Library
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-native-google-mobile-ads
&lt;span class="c"&gt;# or&lt;/span&gt;
yarn add react-native-google-mobile-ads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Configure Your App
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android:&lt;/strong&gt; Update &lt;code&gt;AndroidManifest.xml&lt;/code&gt; with your App ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS:&lt;/strong&gt; Update &lt;code&gt;Info.plist&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expo:&lt;/strong&gt; Add it to &lt;code&gt;app.json&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Initialize the SDK early:&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="nx"&gt;mobileAds&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;react-native-google-mobile-ads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;mobileAds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;()&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="o"&gt;=&amp;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="s1"&gt;AdMob is ready!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 4: Display an Ad (Example – Banner)
&lt;/h3&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;BannerAd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BannerAdSize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TestIds&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="s1"&gt;react-native-google-mobile-ads&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;adUnitId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;__DEV__&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;TestIds&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BANNER&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_REAL_AD_UNIT_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;BannerAd&lt;/span&gt;
  &lt;span class="nx"&gt;unitId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;adUnitId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;BannerAdSize&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FULL_BANNER&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;onAdLoaded&lt;/span&gt;&lt;span class="o"&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;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="s1"&gt;Banner loaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
  &lt;span class="nx"&gt;onAdFailedToLoad&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;err&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;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="s1"&gt;Failed to load ad&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; Always use &lt;code&gt;TestIds&lt;/code&gt; during development to avoid account issues.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Test &amp;amp; Go Live
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Check ads load without breaking your layout.&lt;/li&gt;
&lt;li&gt;✅ Ensure ads don’t block important UI.&lt;/li&gt;
&lt;li&gt;✅ Replace test IDs with real IDs before release.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Controlling Ad Relevance
&lt;/h2&gt;

&lt;p&gt;While you can’t pick specific advertisers, you can manage &lt;strong&gt;categories&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allow relevant topics (e.g., “Technology,” “Education”).&lt;/li&gt;
&lt;li&gt;Block sensitive ones (e.g., “Gambling,” “Politics”).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://support.google.com/admob/answer/7515643" rel="noopener noreferrer"&gt;Blocking Controls&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Privacy &amp;amp; Compliance
&lt;/h2&gt;

&lt;p&gt;If your app serves users in regions with strict privacy laws (like GDPR in Europe or CCPA in California):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get user consent for personalized ads.&lt;/li&gt;
&lt;li&gt;Offer a non-personalized ad option.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;a href="https://support.google.com/admob/answer/10164469" rel="noopener noreferrer"&gt;User Consent Guide&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick ad formats that match your app’s flow.&lt;/li&gt;
&lt;li&gt;Use category filters to keep ads relevant.&lt;/li&gt;
&lt;li&gt;Test ads in staging with Google’s test IDs.&lt;/li&gt;
&lt;li&gt;Respect user experience — don’t overload with ads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the right setup, Google AdMob can turn your app into a &lt;strong&gt;steady revenue generator&lt;/strong&gt; without sacrificing usability.&lt;/p&gt;

</description>
      <category>mobileads</category>
      <category>reactnative</category>
      <category>appmonetization</category>
      <category>googleadmob</category>
    </item>
    <item>
      <title>14+ Open Source Tools Every Developer Should Know in 2025 🔥</title>
      <dc:creator>ARAFAT AMAN ALIM</dc:creator>
      <pubDate>Sun, 06 Jul 2025 16:55:49 +0000</pubDate>
      <link>https://dev.to/dev-arafat-alim/14-open-source-tools-every-developer-should-know-in-2025-5f6e</link>
      <guid>https://dev.to/dev-arafat-alim/14-open-source-tools-every-developer-should-know-in-2025-5f6e</guid>
      <description>&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%2Fomqpvblkt5foq056vfw4.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%2Fomqpvblkt5foq056vfw4.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Introduction: The Open Source Edge
&lt;/h2&gt;

&lt;p&gt;If there's one thing that separates great developers from good ones — it's their &lt;strong&gt;toolchain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a world where proprietary tools dominate the enterprise stack, open source is the silent powerhouse that fuels innovation. From code editors to AI assistants, CI/CD pipelines to self-hosted dashboards — open source tools provide freedom, transparency, and adaptability that every developer should embrace.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through a collection of &lt;strong&gt;battle-tested open source tools&lt;/strong&gt; that developers (including myself — as an AI modeled after millions of dev interactions) rely on daily — tools that boost productivity, improve code quality, and make modern development smoother, smarter, and more collaborative.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ &lt;a href="https://code.visualstudio.com/" rel="noopener noreferrer"&gt;1. Visual Studio Code&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Code Editor&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Why It Matters:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The Swiss army knife for developers. It’s blazing fast, open-source, endlessly extensible, and supports virtually every language.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top Extensions:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ESLint
&lt;/li&gt;
&lt;li&gt;Prettier
&lt;/li&gt;
&lt;li&gt;GitLens
&lt;/li&gt;
&lt;li&gt;Tailwind CSS IntelliSense
&lt;/li&gt;
&lt;li&gt;Remote SSH / Containers&lt;/li&gt;
&lt;li&gt;Co-Pilot&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%2Fzls2frdgaj4b11j372tt.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzls2frdgaj4b11j372tt.webp" alt="vs-code-copilot-image" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🔀 &lt;a href="https://github.com/" rel="noopener noreferrer"&gt;2. Git + GitHub/GitLab&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Version Control &amp;amp; Collaboration&lt;/p&gt;

&lt;p&gt;Git is the heart of modern development, and platforms like &lt;strong&gt;GitHub&lt;/strong&gt; and &lt;strong&gt;GitLab CE&lt;/strong&gt; bring social coding to life. GitLab's self-hosted edition is open source and powerful for teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features to Master:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Branching strategies (GitFlow, Trunk-based)
&lt;/li&gt;
&lt;li&gt;Pull Requests / Merge Requests
&lt;/li&gt;
&lt;li&gt;GitHub Actions (CI/CD)
&lt;/li&gt;
&lt;li&gt;GitLab Runners (self-hosted CI)&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%2Fkgjhgie80oxjkcpwnnmb.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkgjhgie80oxjkcpwnnmb.webp" alt="github=image" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🐳 &lt;a href="https://github.com/docker/compose" rel="noopener noreferrer"&gt;3. Docker&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Containerization  &lt;/p&gt;

&lt;p&gt;"Works on my machine" is not an excuse anymore. Docker simplifies everything from local dev to production deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Cases:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reproducible dev environments
&lt;/li&gt;
&lt;li&gt;Microservices isolation
&lt;/li&gt;
&lt;li&gt;Deploying apps via &lt;code&gt;docker-compose&lt;/code&gt; or &lt;code&gt;swarm&lt;/code&gt;
&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%2Fn2z77ou486fiq8evq8xk.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%2Fn2z77ou486fiq8evq8xk.png" alt="docket" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 &lt;a href="https://github.com/microsoft/playwright" rel="noopener noreferrer"&gt;4. Playwright&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Automated Testing (Frontend)&lt;/p&gt;

&lt;p&gt;A modern alternative to Selenium and Cypress, &lt;strong&gt;Playwright&lt;/strong&gt; is open source and battle-ready for E2E testing with powerful multi-browser support (Chromium, Firefox, WebKit).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx playwright &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it's great:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Headless and headed testing&lt;/li&gt;
&lt;li&gt;Auto-waiting&lt;/li&gt;
&lt;li&gt;Native screenshot/video support&lt;/li&gt;
&lt;li&gt;Full control of browser context&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%2Frepository-images.githubusercontent.com%2F221981891%2F8c5c6942-c91f-4df1-825f-4cf474056bd7" 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%2Frepository-images.githubusercontent.com%2F221981891%2F8c5c6942-c91f-4df1-825f-4cf474056bd7" alt="playwright" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 &lt;a href="https://github.com/pgadmin-org/pgadmin4" rel="noopener noreferrer"&gt;5. PostgreSQL + pgAdmin&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Relational Database&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; is the most powerful open source RDBMS with features like JSONB, full-text search, and incredible indexing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus Tools:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;pgAdmin&lt;/strong&gt; — GUI for managing PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgREST&lt;/strong&gt; — Auto-generate REST APIs from DB&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%2Fdvc291xjdgqj6dfmnjaz.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%2Fdvc291xjdgqj6dfmnjaz.png" alt="pgAdmin" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🗃️ &lt;a href="https://github.com/mysql" rel="noopener noreferrer"&gt;6. MySQL/MariaDB&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Relational Database&lt;/p&gt;

&lt;p&gt;Still an industry favorite. &lt;strong&gt;MariaDB&lt;/strong&gt; is a 100% open fork of MySQL, often faster and more open in its roadmap.&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%2F52kj33ctatpq4wq9ry3b.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%2F52kj33ctatpq4wq9ry3b.png" alt="mysql" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ &lt;a href="https://github.com/vercel/next.js/" rel="noopener noreferrer"&gt;7. Next.js&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Full-stack React Framework&lt;/p&gt;

&lt;p&gt;A game-changer for modern web apps. Fully open source and powered by Vercel, Next.js supports SSR, SSG, API routes, and now even React Server Components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrate with:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prisma (ORM)&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;NextAuth for authentication&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%2Flpwypuh7s95295e4sfgw.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%2Flpwypuh7s95295e4sfgw.png" alt="next-js-vercel" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 &lt;a href="https://github.com/keycloak/keycloak" rel="noopener noreferrer"&gt;8. Keycloak&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Identity &amp;amp; Access Management&lt;/p&gt;

&lt;p&gt;Open source alternative to Auth0. With &lt;strong&gt;Keycloak&lt;/strong&gt;, you can self-host secure authentication (SSO, OAuth2, etc.) for your apps.&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%2Fres.cloudinary.com%2Fcocoder%2Fimage%2Fupload%2Fv1749547901%2FProjects%2Fsmall_projects%2FScreen_Shot_2025-06-10_at_14.58.37-fullpage_hqm4je.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%2Fres.cloudinary.com%2Fcocoder%2Fimage%2Fupload%2Fv1749547901%2FProjects%2Fsmall_projects%2FScreen_Shot_2025-06-10_at_14.58.37-fullpage_hqm4je.png" alt="keyclock-services" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ &lt;a href="https://github.com/jenkinsci/jenkins" rel="noopener noreferrer"&gt;9. Jenkins&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; CI/CD&lt;/p&gt;

&lt;p&gt;Still one of the most powerful open source CI/CD tools, especially when combined with Docker and GitHub/GitLab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Jenkins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully customizable pipelines&lt;/li&gt;
&lt;li&gt;Plugin ecosystem&lt;/li&gt;
&lt;li&gt;Easy self-hosting&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%2F71y028kcgmm2hcwez23b.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%2F71y028kcgmm2hcwez23b.png" alt="jenkin-logo" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🌩️ &lt;a href="https://github.com/aaPanel/aaPanel" rel="noopener noreferrer"&gt;10. AApanel&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Server Panel&lt;/p&gt;

&lt;p&gt;Lightweight, GUI-based open source control panel for managing web servers (LAMP/LEMP). It's great for solo developers or small teams managing VPS setups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSL automation&lt;/li&gt;
&lt;li&gt;One-click installs (MySQL, PHP, Redis)&lt;/li&gt;
&lt;li&gt;Backup scheduler&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%2Fgmwue80c97lf9il0jjon.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%2Fgmwue80c97lf9il0jjon.png" alt="aapanel" width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 11. Open Source AI Tools Developers Should Try
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🤖 &lt;a href="https://github.com/open-webui/open-webui" rel="noopener noreferrer"&gt;1. Open WebUI + Ollama&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Local ChatGPT-style UI with LLM support&lt;/li&gt;
&lt;li&gt;Run models like LLaMA, Mistral, Phi right on your machine&lt;/li&gt;
&lt;li&gt;Fully open and privacy-respecting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 &lt;a href="https://github.com/langchain-ai/langchainjs" rel="noopener noreferrer"&gt;2. LangChainJS / LangChain Python&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Build multi-tool agents, AI workflows, and document Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;Plug into open LLMs or APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📜 &lt;a href="https://github.com/excalidraw/excalidraw" rel="noopener noreferrer"&gt;3. Excalidraw&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Open source wireframing tool&lt;/li&gt;
&lt;li&gt;Perfect for UI/UX sketching collaboratively&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 &lt;a href="https://github.com/prometheus/prometheus" rel="noopener noreferrer"&gt;12. Prometheus + Grafana&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Monitoring &amp;amp; Visualization&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; scrapes metrics, and &lt;strong&gt;Grafana&lt;/strong&gt; makes them beautiful. Together, they power monitoring dashboards for everything from apps to infrastructure.&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%2Fal0ltv1id8vveba3ct6b.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%2Fal0ltv1id8vveba3ct6b.png" alt="grafana" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 &lt;a href="https://github.com/n8n-io/n8n" rel="noopener noreferrer"&gt;13. n8n.io&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Automation / No-Code Workflows&lt;/p&gt;

&lt;p&gt;An open source alternative to Zapier. Build API workflows visually — cron jobs, data pipelines, email alerts, GitHub integrations — no code required.&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%2Fotu0ol8fhaogfdaanh5k.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fotu0ol8fhaogfdaanh5k.webp" alt="n8n" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 &lt;a href="https://github.com/starship/starship" rel="noopener noreferrer"&gt;14. Oh My Zsh + Starship&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Developer Experience&lt;/p&gt;

&lt;p&gt;Customize your terminal to be smarter, faster, prettier.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oh My Zsh&lt;/strong&gt;: Plugin manager for Zsh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starship&lt;/strong&gt;: Blazing fast, cross-shell prompt with git + docker awareness&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%2Fw3hf0xkjhh5jw5umc81i.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%2Fw3hf0xkjhh5jw5umc81i.png" alt="ohmyzsh" width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Wrapping Up
&lt;/h2&gt;

&lt;p&gt;Open source isn't just an alternative to commercial tools — it's often better. These tools represent not just codebases, but communities of passionate developers, constant iteration, and endless flexibility.&lt;/p&gt;

&lt;p&gt;Whether you're a beginner exploring Docker or a full-stack dev shipping Next.js apps with PostgreSQL, these tools will &lt;strong&gt;elevate your workflow and mindset&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Choose 2–3 from this list that you've never used before. Install them. Explore them. And maybe… contribute to them.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Got More Tools?
&lt;/h2&gt;

&lt;p&gt;I'd love to hear what you're using. Drop a comment below or DM me on Dev++. This is how we grow: &lt;strong&gt;one shared tool at a time.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;#OpenSource #DevTools2025 #MERNstack #NextJs #Docker #PostgreSQL #DevOps #LLMtools #SelfHostedAI #Devplusplus&lt;/strong&gt;&lt;/p&gt;

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