<?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: Domenico Tenace</title>
    <description>The latest articles on DEV Community by Domenico Tenace (@dvalin99).</description>
    <link>https://dev.to/dvalin99</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%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png</url>
      <title>DEV Community: Domenico Tenace</title>
      <link>https://dev.to/dvalin99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dvalin99"/>
    <language>en</language>
    <item>
      <title>Why I Switched to pnpm and Never Looked Back 🚀</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Thu, 19 Mar 2026 09:03:03 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/why-i-switched-to-pnpm-and-never-looked-back-56b3</link>
      <guid>https://dev.to/playfulprogramming/why-i-switched-to-pnpm-and-never-looked-back-56b3</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;For years, I used npm without questioning it. It's the default, it comes with Node.js, everyone uses it, why change? But after switching to pnpm a few months ago, I genuinely can't imagine going back.&lt;/p&gt;

&lt;p&gt;This isn't about being trendy or jumping on the latest bandwagon. pnpm solves real problems I didn't even realize I had with npm. Let me explain why making the switch was one of the best development decisions I've made this year.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  What's the Actual Difference? 🤔
&lt;/h2&gt;

&lt;p&gt;Before we get into why pnpm is better, let's understand what makes it fundamentally different from npm.&lt;/p&gt;

&lt;h3&gt;
  
  
  npm's Approach: Flat and Duplicated
&lt;/h3&gt;

&lt;p&gt;When you run &lt;code&gt;npm install&lt;/code&gt;, npm creates a flat &lt;code&gt;node_modules&lt;/code&gt; structure. This means all your dependencies and their dependencies end up in the same folder, flattened out. While this solved some earlier problems with nested dependencies, it created new ones:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phantom Dependencies:&lt;/strong&gt;&lt;br&gt;
You can import packages that aren't listed in your &lt;code&gt;package.json&lt;/code&gt; because they happen to be installed as someone else's dependency. This works until that dependency changes, and suddenly your code breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disk Space Waste:&lt;/strong&gt;&lt;br&gt;
If you have 10 projects on your machine and they all use Express, npm downloads and stores Express 10 times. Same for React, Lodash, or any other common package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slow Installations:&lt;/strong&gt;&lt;br&gt;
Every project needs its own copy of everything, which means longer install times and more network usage.&lt;/p&gt;
&lt;h3&gt;
  
  
  pnpm's Approach: Smart and Efficient
&lt;/h3&gt;

&lt;p&gt;pnpm takes a completely different approach using something called a &lt;strong&gt;content-addressable storage&lt;/strong&gt; system. Here's how it works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Global Store:&lt;/strong&gt;&lt;br&gt;
pnpm keeps one copy of each package version in a global store (usually &lt;code&gt;~/.pnpm-store&lt;/code&gt;). When you install a package, pnpm creates hard links from this store to your project's &lt;code&gt;node_modules&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strict Dependency Tree:&lt;/strong&gt;&lt;br&gt;
Instead of flattening everything, pnpm maintains a proper nested structure using symlinks. You can only import packages that are explicitly listed in your &lt;code&gt;package.json&lt;/code&gt; or their dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Across Projects:&lt;/strong&gt;&lt;br&gt;
If 10 projects use Express version 4.18.0, pnpm stores it once and creates 10 hard links. No duplication, massive disk space savings.&lt;/p&gt;

&lt;p&gt;This isn't just a minor optimization, it's a fundamentally better architecture.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why pnpm Wins: The Real Benefits 🏆
&lt;/h2&gt;

&lt;p&gt;Let me share the concrete improvements I've experienced since switching.&lt;/p&gt;
&lt;h3&gt;
  
  
  Speed That Actually Matters
&lt;/h3&gt;

&lt;p&gt;pnpm is noticeably faster than npm. We're not talking marginal gains, we're talking "wait, it's already done?" levels of speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cold Installs:&lt;/strong&gt;&lt;br&gt;
When installing a package for the first time, pnpm downloads it once to the global store. Every subsequent project that uses it just creates a hard link, which is nearly instantaneous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warm Installs:&lt;/strong&gt;&lt;br&gt;
If you've already got the packages in your global store (which you probably do if you work on multiple projects), installations are blazingly fast. What took npm 2-3 minutes might take pnpm 10-20 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Practice:&lt;/strong&gt;&lt;br&gt;
Running &lt;code&gt;pnpm install&lt;/code&gt; on a fresh clone of a project feels almost magical. The speed difference is real and noticeable every single day.&lt;/p&gt;
&lt;h3&gt;
  
  
  Disk Space Savings Are Huge
&lt;/h3&gt;

&lt;p&gt;This one surprised me the most. After switching my entire workspace to pnpm, I freed up over 15GB of disk space. That's not a typo, &lt;strong&gt;15 gigabytes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's why: with npm, if you have 20 projects and 15 of them use React, you have 15 copies of React sitting on your disk. With pnpm, you have one copy with 15 hard links pointing to it.&lt;/p&gt;

&lt;p&gt;For common dependencies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;React and React DOM&lt;/li&gt;
&lt;li&gt;Lodash&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;ESLint and Prettier&lt;/li&gt;
&lt;li&gt;Testing libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The savings add up fast. And this isn't just about disk space, it's about principle. Why should my machine store the same exact files hundreds of times?&lt;/p&gt;
&lt;h3&gt;
  
  
  Strict Dependencies Prevent Bugs
&lt;/h3&gt;

&lt;p&gt;This is the feature I didn't know I needed until I had it.&lt;/p&gt;

&lt;p&gt;With npm, you can accidentally import packages that aren't in your &lt;code&gt;package.json&lt;/code&gt; because they're installed as transitive dependencies. This creates hidden coupling that breaks when those dependencies update.&lt;/p&gt;

&lt;p&gt;pnpm's strict mode prevents this entirely. If it's not in your &lt;code&gt;package.json&lt;/code&gt;, you can't import it. Period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real Example:&lt;/strong&gt;&lt;br&gt;
I had a project using a utility function from Lodash, but Lodash wasn't in my &lt;code&gt;package.json&lt;/code&gt;. It worked because another package happened to depend on Lodash. When that package updated and removed Lodash, my build broke.&lt;/p&gt;

&lt;p&gt;With pnpm, this would have failed immediately, forcing me to add Lodash explicitly. The error is caught early instead of in production.&lt;/p&gt;
&lt;h3&gt;
  
  
  Monorepo Support Is First-Class
&lt;/h3&gt;

&lt;p&gt;If you work with monorepos (and increasingly, who doesn't?), pnpm's workspace support is excellent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built-in Workspaces:&lt;/strong&gt;&lt;br&gt;
Define your workspace structure in &lt;code&gt;pnpm-workspace.yaml&lt;/code&gt;, and pnpm handles linking between packages automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Efficient Sharing:&lt;/strong&gt;&lt;br&gt;
Shared dependencies across workspace packages are stored once and linked everywhere they're needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better Than Alternatives:&lt;/strong&gt;&lt;br&gt;
I've used npm workspaces and Yarn workspaces. pnpm's implementation feels cleaner and more efficient in practice.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Lock File Is Better
&lt;/h3&gt;

&lt;p&gt;pnpm's &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; is more deterministic than npm's &lt;code&gt;package-lock.json&lt;/code&gt;. It stores more information about dependency relationships and produces more consistent results across different environments.&lt;/p&gt;

&lt;p&gt;I've had fewer "works on my machine" issues since switching to pnpm. The lock file format just seems more robust.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Migration: Easier Than You Think 🔄
&lt;/h2&gt;

&lt;p&gt;I was worried about migrating, but it turned out to be trivial.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Switch
&lt;/h3&gt;

&lt;p&gt;For an existing project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install pnpm globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; pnpm

&lt;span class="c"&gt;# Navigate to your project&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;my-project

&lt;span class="c"&gt;# Import your package-lock.json&lt;/span&gt;
pnpm import

&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That's it. pnpm even converts your &lt;code&gt;package-lock.json&lt;/code&gt; to &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  Commands Are Nearly Identical
&lt;/h3&gt;

&lt;p&gt;If you know npm, you already know pnpm:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npm commands&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;package-name
npm uninstall package-name
npm run build
npm &lt;span class="nb"&gt;test&lt;/span&gt;

&lt;span class="c"&gt;# pnpm equivalents&lt;/span&gt;
pnpm add package-name
pnpm remove package-name
pnpm run build
pnpm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The only real difference is &lt;code&gt;add&lt;/code&gt; instead of &lt;code&gt;install&lt;/code&gt; and &lt;code&gt;remove&lt;/code&gt; instead of &lt;code&gt;uninstall&lt;/code&gt;. Everything else is identical.&lt;/p&gt;
&lt;h3&gt;
  
  
  Create Aliases If Needed
&lt;/h3&gt;

&lt;p&gt;If you want even less friction:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;&lt;span class="nv"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;pnpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Though honestly, once you start using pnpm, you'll appreciate the distinct commands.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Gotchas (Yes, There Are Some) 😬
&lt;/h2&gt;

&lt;p&gt;Let's be honest, pnpm isn't perfect. Here are the issues I've encountered:&lt;/p&gt;
&lt;h3&gt;
  
  
  Some Packages Don't Play Nice
&lt;/h3&gt;

&lt;p&gt;Occasionally, you'll find a package that assumes npm's flat structure and breaks with pnpm's strict linking. This is rare, but it happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;br&gt;
pnpm has a &lt;code&gt;.pnpmfile.cjs&lt;/code&gt; where you can configure workarounds. Or you can use the &lt;code&gt;shamefully-hoist&lt;/code&gt; flag to flatten dependencies like npm does (though this defeats some of pnpm's benefits).&lt;/p&gt;

&lt;p&gt;In practice, I've only hit this issue twice in several months, and both times the package maintainers fixed it quickly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Smaller Community
&lt;/h3&gt;

&lt;p&gt;While pnpm's adoption is growing rapidly (Vue, Vite, Astro, and other major projects use it), it's still smaller than npm's massive ecosystem.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer Stack Overflow answers&lt;/li&gt;
&lt;li&gt;Less extensive documentation for edge cases&lt;/li&gt;
&lt;li&gt;Occasional confusion when following tutorials that assume npm&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, the community is active and helpful, and most npm knowledge transfers directly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Initial Learning Curve
&lt;/h3&gt;

&lt;p&gt;Understanding hard links, symlinks, and the global store takes a minute. The first time you look at &lt;code&gt;node_modules&lt;/code&gt; in a pnpm project, it looks weird.&lt;/p&gt;

&lt;p&gt;But once you understand the model, it makes perfect sense and you appreciate the elegance.&lt;/p&gt;


&lt;h2&gt;
  
  
  When npm Still Makes Sense 🎯
&lt;/h2&gt;

&lt;p&gt;To be fair, there are scenarios where sticking with npm is reasonable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're Brand New to JavaScript:&lt;/strong&gt;&lt;br&gt;
If you're just learning, start with npm. It's the default, and you'll find more beginner-friendly resources. Switch to pnpm once you're comfortable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Company Policy:&lt;/strong&gt;&lt;br&gt;
Some organizations have standardized on npm, and switching requires buy-in. Don't fight that battle unless the benefits are worth it for your specific situation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compatibility Concerns:&lt;/strong&gt;&lt;br&gt;
If you're working on legacy projects with lots of old dependencies that have quirks, npm's more permissive structure might save headaches.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You Don't Care About Disk Space or Speed:&lt;/strong&gt;&lt;br&gt;
If you have unlimited disk space and don't mind waiting for installations, npm works fine. Some people genuinely don't care about these optimizations.&lt;/p&gt;

&lt;p&gt;But for most modern development, pnpm is simply better.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real-World Impact 💪
&lt;/h2&gt;

&lt;p&gt;Let me share some concrete numbers from my own experience:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before pnpm (npm):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt; on a typical Next.js project: ~90 seconds&lt;/li&gt;
&lt;li&gt;Disk space for 20 active projects: ~42GB in node_modules&lt;/li&gt;
&lt;li&gt;Frequent phantom dependency issues&lt;/li&gt;
&lt;li&gt;Occasional lock file conflicts between team members&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After pnpm:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pnpm install&lt;/code&gt; on the same projects: ~15-20 seconds&lt;/li&gt;
&lt;li&gt;Disk space for the same 20 projects: ~27GB total&lt;/li&gt;
&lt;li&gt;Zero phantom dependency issues&lt;/li&gt;
&lt;li&gt;More consistent installations across the team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The time savings alone add up. If you run &lt;code&gt;install&lt;/code&gt; 20 times a day (between switching branches, pulling updates, etc.), pnpm saves you about 20-25 minutes daily. That's over 2 hours per week.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Broader Ecosystem Is Adopting It 🌍
&lt;/h2&gt;

&lt;p&gt;pnpm isn't just a niche tool anymore. Major projects have switched:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projects Using pnpm:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vue 3 and the entire Vue ecosystem&lt;/li&gt;
&lt;li&gt;Vite (one of the fastest build tools)&lt;/li&gt;
&lt;li&gt;Astro (my personal site's framework)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When tools and frameworks this significant adopt pnpm, it's a strong signal that it's production-ready and worth considering.&lt;/p&gt;


&lt;h2&gt;
  
  
  My Recommendation 💡
&lt;/h2&gt;

&lt;p&gt;If you're still using npm and any of these apply to you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You work on multiple projects&lt;/li&gt;
&lt;li&gt;You care about build speed&lt;/li&gt;
&lt;li&gt;Disk space is a concern&lt;/li&gt;
&lt;li&gt;You work with monorepos&lt;/li&gt;
&lt;li&gt;You want stricter dependency management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Switch to pnpm.&lt;/strong&gt; The migration takes 5 minutes, and the benefits are immediate and ongoing.&lt;/p&gt;

&lt;p&gt;Will you encounter the occasional quirk? Probably. Is it worth it? Absolutely.&lt;/p&gt;

&lt;p&gt;The JavaScript ecosystem moves fast, and package managers are evolving. npm was great for its time, but pnpm represents a better approach to dependency management. It's faster, more efficient, and more correct.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion 🚀
&lt;/h2&gt;

&lt;p&gt;Here's my challenge: pick one project and try pnpm for a week. Just one week.&lt;br&gt;
&lt;/p&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; pnpm
&lt;span class="nb"&gt;cd &lt;/span&gt;your-project
pnpm import
pnpm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Use it like you'd use npm. Notice the speed. Check your disk space savings. Experience the strict dependency resolution.&lt;/p&gt;

&lt;p&gt;After a week, if you genuinely prefer npm, switch back. But I'd bet that like me, you won't want to.&lt;/p&gt;

&lt;p&gt;Sometimes the best tools are the ones that just work better in ways you didn't realize you needed. For me, pnpm is one of those tools.&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;



&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>npm</category>
      <category>programming</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Rebuilding domenicotenace.dev: How Pure Astro and CSS Reminded Me That Simple Is Better 🌟</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Thu, 12 Mar 2026 16:52:57 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/rebuilding-domenicotenacedev-how-pure-astro-and-css-reminded-me-that-simple-is-better-2gpe</link>
      <guid>https://dev.to/playfulprogramming/rebuilding-domenicotenacedev-how-pure-astro-and-css-reminded-me-that-simple-is-better-2gpe</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;I recently did something that felt almost rebellious in today's web development landscape: I completely refactored my personal website using &lt;strong&gt;only Astro and vanilla CSS&lt;/strong&gt;. No React, no Vue, no Tailwind, no animation libraries, no component frameworks. Just HTML, CSS, and a bit of JavaScript where absolutely necessary.&lt;/p&gt;

&lt;p&gt;And you know what? It was the most refreshing development experience I've had in years.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  The Decision: Back to Basics ✨
&lt;/h2&gt;

&lt;p&gt;The turning point came when I was helping a friend debug their website. They'd built it with pure HTML and CSS, no build step, no dependencies. When they made a change, they just refreshed the browser. No waiting for compilation, no hot module replacement issues, no dependency conflicts.&lt;/p&gt;

&lt;p&gt;It was &lt;em&gt;fast&lt;/em&gt;. Not just the website itself, but the entire development experience.&lt;/p&gt;

&lt;p&gt;That's when I decided: my personal website doesn't need all this complexity. It's time to simplify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Astro? 🚀
&lt;/h2&gt;

&lt;p&gt;I chose Astro for one simple reason: it lets you write components and modern syntax while outputting pure static HTML. No JavaScript runtime, no virtual DOM, no hydration overhead. Just good old HTML, CSS, and minimal JS where needed.&lt;/p&gt;

&lt;p&gt;Astro's philosophy aligned perfectly with what I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero JavaScript by default&lt;/strong&gt;: Pages are pure HTML unless you explicitly opt-in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component-based&lt;/strong&gt;: I can still organize my code cleanly without shipping React&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast builds&lt;/strong&gt;: Seriously fast, we're talking seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No lock-in&lt;/strong&gt;: If I want to switch frameworks later, I can easily migrate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best part? Astro doesn't force you into any particular way of doing things. Want to use vanilla CSS? Great. Want to sprinkle in some JavaScript? Cool. Want to stay 100% static? Perfect.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Refactoring Process 🔧
&lt;/h2&gt;

&lt;p&gt;The migration was surprisingly straightforward. Here's what I did:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Stripped Everything Down
&lt;/h3&gt;

&lt;p&gt;First, I removed all the dependencies. Every single one. The &lt;code&gt;package.json&lt;/code&gt; went from 40+ dependencies to just Astro itself. It felt liberating, like decluttering a messy room.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Rebuilt the Structure
&lt;/h3&gt;

&lt;p&gt;I created a simple Astro project structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── components/
│   ├── Header.astro
│   ├── Footer.astro
│   └── ProjectCard.astro
├── layouts/
│   └── BaseLayout.astro
└── pages/
    ├── index.astro
    ├── blog/
    └── projects/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Clean, minimal, easy to understand.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Pure CSS, No Frameworks
&lt;/h3&gt;

&lt;p&gt;This is where it got interesting. Instead of reaching for Tailwind, I wrote vanilla CSS. And honestly? It was &lt;em&gt;fun&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I created a simple &lt;code&gt;global.css&lt;/code&gt; file for handle all CSS.&lt;/p&gt;

&lt;p&gt;No build tools, no purging, no configuration. Just CSS that works.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Animations in Pure CSS
&lt;/h3&gt;

&lt;p&gt;Here's where I had the most fun. Instead of importing animation libraries, I wrote CSS animations from scratch:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@keyframes&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;from&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;to&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.fade-in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;animation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fadeIn&lt;/span&gt; &lt;span class="m"&gt;0.6s&lt;/span&gt; &lt;span class="n"&gt;ease-out&lt;/span&gt; &lt;span class="n"&gt;forwards&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Simple, performant, and I have complete control over every detail.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: JavaScript Only Where Needed
&lt;/h3&gt;

&lt;p&gt;I added minimal JavaScript for interactive features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Theme toggle (dark/light mode)&lt;/li&gt;
&lt;li&gt;Mobile menu toggle&lt;/li&gt;
&lt;li&gt;Smooth scroll behavior&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total JavaScript: less than 100 lines. No frameworks, no bundlers, just plain vanilla JS.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Rediscovered 💡
&lt;/h2&gt;

&lt;p&gt;This process taught me (or reminded me) of several important lessons:&lt;/p&gt;
&lt;h3&gt;
  
  
  CSS Is Actually Powerful
&lt;/h3&gt;

&lt;p&gt;Modern CSS is &lt;em&gt;incredibly&lt;/em&gt; powerful. Grid, flexbox, custom properties, container queries, scroll-driven animations, we have everything we need to build beautiful, responsive websites without frameworks.&lt;/p&gt;

&lt;p&gt;I'd forgotten that. Years of using Bulma, Tailwind, ecc made me think I needed utility classes for everything, but honestly? Writing semantic CSS felt more natural and resulted in cleaner markup.&lt;/p&gt;
&lt;h3&gt;
  
  
  Less Is Genuinely More
&lt;/h3&gt;

&lt;p&gt;The final bundle size? &lt;strong&gt;Tiny&lt;/strong&gt;. We're talking kilobytes, not megabytes. The Lighthouse score? 100 across the board. The build time? Under 3 seconds.&lt;/p&gt;

&lt;p&gt;None of this would be possible with my previous stack. All that complexity was weighing the site down, literally and metaphorically.&lt;/p&gt;
&lt;h3&gt;
  
  
  Development Can Be Simple
&lt;/h3&gt;

&lt;p&gt;There's something deeply satisfying about opening a file, changing some CSS, refreshing the browser, and seeing the change instantly. No build process, no hot module replacement quirks, no "hmm, why isn't this updating?"&lt;/p&gt;

&lt;p&gt;The tight feedback loop made development &lt;em&gt;enjoyable&lt;/em&gt; again.&lt;/p&gt;
&lt;h3&gt;
  
  
  You Don't Need a Framework for Everything
&lt;/h3&gt;

&lt;p&gt;This is the big one. I'd internalized the idea that "professional" websites require modern frameworks. But that's not true. Frameworks solve specific problems, and if you don't have those problems, you don't need the framework.&lt;/p&gt;

&lt;p&gt;My personal website doesn't need client-side routing, state management, or component reactivity. It's content, presented nicely. HTML and CSS do that perfectly well on their own.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Results 📊
&lt;/h2&gt;

&lt;p&gt;Let me share some concrete improvements:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Initial load time: 0.3s (down from 1.8s)&lt;/li&gt;
&lt;li&gt;Total bundle size: 45KB (down from 380KB)&lt;/li&gt;
&lt;li&gt;Lighthouse score: 100 across all metrics&lt;/li&gt;
&lt;li&gt;Time to Interactive: instant&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Build time: 2.4s (down from 28s)&lt;/li&gt;
&lt;li&gt;Hot reload: instant&lt;/li&gt;
&lt;li&gt;Dependency updates: basically none&lt;/li&gt;
&lt;li&gt;Mental overhead: significantly reduced&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Breaking changes: none (it's just HTML/CSS)&lt;/li&gt;
&lt;li&gt;Security vulnerabilities: none (no dependencies to patch)&lt;/li&gt;
&lt;li&gt;Complexity: minimal&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What About the Trade-offs? 🤔
&lt;/h2&gt;

&lt;p&gt;Let's be honest, there are some trade-offs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No Component Reactivity:&lt;/strong&gt;&lt;br&gt;
Astro components are static by default. If I need interactivity, I have to add it manually. But for a content site, this is rarely an issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Less Tooling:&lt;/strong&gt;&lt;br&gt;
No automatic CSS optimization, no tree-shaking, no hot module replacement for styles. But honestly? I don't miss it. The simplicity makes up for the lack of bells and whistles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manual Responsive Design:&lt;/strong&gt;&lt;br&gt;
Without Tailwind's responsive utilities, I write media queries by hand. It takes slightly longer, but the CSS is more maintainable and semantic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;More CSS to Write:&lt;/strong&gt;&lt;br&gt;
No utility classes means writing more CSS. But the total amount of CSS is actually &lt;em&gt;less&lt;/em&gt; than my Tailwind config generated, and it's more readable.&lt;/p&gt;

&lt;p&gt;These trade-offs are worth it for me. Your mileage may vary.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who Should Consider This Approach? 🎯
&lt;/h2&gt;

&lt;p&gt;Pure Astro and CSS isn't for everyone, but it's perfect if:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're building content sites:&lt;/strong&gt;&lt;br&gt;
Blogs, portfolios, documentation, marketing pages, anything that's primarily content benefits from this approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You value simplicity:&lt;/strong&gt;&lt;br&gt;
If you're tired of complex build processes and dependency management, going minimal is refreshing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want to learn the fundamentals:&lt;/strong&gt;&lt;br&gt;
Writing vanilla CSS makes you a better developer. You understand what your tools are doing under the hood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance matters:&lt;/strong&gt;&lt;br&gt;
If you need the absolute fastest site possible, less code wins every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't need heavy interactivity:&lt;/strong&gt;&lt;br&gt;
If your site is mostly static content with occasional interactive elements, you don't need a full framework.&lt;/p&gt;


&lt;h2&gt;
  
  
  When You Still Need Frameworks 🔄
&lt;/h2&gt;

&lt;p&gt;To be clear, I'm not saying frameworks are bad. They're excellent tools for the right jobs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complex web apps:&lt;/strong&gt;&lt;br&gt;
If you're building a dashboard, SaaS platform, or interactive application, React/Vue/etc. make total sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teams with existing expertise:&lt;/strong&gt;&lt;br&gt;
If your team knows React and you're building something quickly, use React. Don't reinvent the wheel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lots of client-side state:&lt;/strong&gt;&lt;br&gt;
When you need to manage complex client-side state, frameworks provide the structure to do it well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid prototyping:&lt;/strong&gt;&lt;br&gt;
Component libraries and frameworks can speed up initial development significantly.&lt;/p&gt;

&lt;p&gt;The key is choosing the right tool for the job, not defaulting to the most popular stack.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Bigger Picture 🌍
&lt;/h2&gt;

&lt;p&gt;This refactoring taught me something important about modern web development: we've collectively become a bit obsessed with complexity.&lt;/p&gt;

&lt;p&gt;We reach for frameworks by default, even when they're overkill. We add dependencies without thinking. We over-engineer simple problems because that's what "professional" developers do.&lt;/p&gt;

&lt;p&gt;But sometimes, the best solution is the simplest one.&lt;/p&gt;

&lt;p&gt;HTML and CSS have been around for decades because they're &lt;em&gt;good&lt;/em&gt;. They're stable, they're fast, they're simple. Modern CSS is powerful enough to build beautiful interfaces without frameworks.&lt;/p&gt;

&lt;p&gt;Astro lets us use modern development practices (components, TypeScript, etc.) while outputting pure, simple code. It's the best of both worlds.&lt;/p&gt;


&lt;h2&gt;
  
  
  My Challenge to You 💪
&lt;/h2&gt;

&lt;p&gt;If you're reading this and thinking "hmm, maybe I've over-engineered my site too," I challenge you:&lt;/p&gt;

&lt;p&gt;Try building something with pure HTML and CSS. No frameworks, no libraries, just the fundamentals. See how it feels.&lt;/p&gt;

&lt;p&gt;You might be surprised at how freeing it is.&lt;/p&gt;

&lt;p&gt;And if you need a static site generator, give Astro a shot. It's genuinely excellent at letting you write simple code that performs beautifully.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion 🌟
&lt;/h2&gt;

&lt;p&gt;Rebuilding domenicotenace.dev with pure Astro and CSS reminded me why I fell in love with web development in the first place: the joy of creating something that works, that's fast, that's simple.&lt;/p&gt;

&lt;p&gt;We don't always need the latest framework or the trendiest library. Sometimes, the best code is the code we don't write.&lt;/p&gt;

&lt;p&gt;If you take one thing from this article, let it be this: question your stack. Ask yourself if you really need all those dependencies. Challenge the assumption that complexity equals professionalism.&lt;/p&gt;

&lt;p&gt;Often, the simplest solution is the best one.&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;



&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>astro</category>
      <category>css</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Adding Capacitor to Glif with Antigravity: The Good, The Bad, and The Reality Check 📱</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Thu, 26 Feb 2026 17:46:28 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/adding-capacitor-to-glif-with-antigravity-the-good-the-bad-and-the-reality-check-4pm8</link>
      <guid>https://dev.to/playfulprogramming/adding-capacitor-to-glif-with-antigravity-the-good-the-bad-and-the-reality-check-4pm8</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;I recently decided to take &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/glif" rel="noopener noreferrer"&gt;Glif&lt;/a&gt;, my minimalist QR code generator web app, and turn it into a proper mobile app using Capacitor. For those who don't know, Glif is a simple Nuxt app that lets you create and download customizable QR codes, nothing fancy, just clean and functional.&lt;/p&gt;

&lt;p&gt;Since I've been using Google Antigravity for various projects, I figured: why not let it handle the Capacitor integration? It's supposed to be great for frontend work, and mobile development is definitely frontend territory, right?&lt;/p&gt;

&lt;p&gt;Well... let me tell you about that experience. Spoiler alert: Antigravity helped, but it wasn't the smooth ride I expected.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Capacitor and Why Add It to Glif? 🤔
&lt;/h2&gt;

&lt;p&gt;First, a quick explainer for anyone unfamiliar. &lt;strong&gt;Capacitor&lt;/strong&gt; is Ionic's cross-platform runtime that lets you turn web apps into native mobile apps for iOS and Android. Think of it as a bridge: your web code (HTML, CSS, JavaScript) runs inside a native container, and Capacitor provides APIs to access device features like the camera, filesystem, notifications, etc.&lt;/p&gt;

&lt;p&gt;For a tool like Glif, going mobile made perfect sense:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Glif Needs Mobile:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QR codes are inherently mobile-first (people scan them with phones)&lt;/li&gt;
&lt;li&gt;Users might want to generate QR codes on the go&lt;/li&gt;
&lt;li&gt;Having a native app feels more legitimate than "just a website"&lt;/li&gt;
&lt;li&gt;Access to device features like sharing, saving to photos, etc.&lt;/li&gt;
&lt;li&gt;Potential for offline functionality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The web version works fine, but a native mobile app would be the natural evolution. Capacitor seemed like the obvious choice, it's well-maintained, works great with Vue/Nuxt, and doesn't require rewriting the entire app.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Plan: Let Antigravity Handle It ⚡
&lt;/h2&gt;

&lt;p&gt;I've had good experiences using Antigravity for frontend work (&lt;a href="https://dev.to/playfulprogramming/building-plus-ultra-how-antigravity-helped-me-bring-material-design-to-bulma-css-30m6"&gt;I literally built an entire Material Design CSS library with it&lt;/a&gt;), so I was optimistic. My thinking was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capacitor integration is well-documented&lt;/li&gt;
&lt;li&gt;It's mostly configuration and boilerplate&lt;/li&gt;
&lt;li&gt;Antigravity should be able to follow the Capacitor docs&lt;/li&gt;
&lt;li&gt;The agent can test the mobile build in the browser&lt;/li&gt;
&lt;li&gt;This should be straightforward&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I fired up Antigravity in Planning mode and gave it the task:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Integrate Capacitor into this Nuxt 4 project to create iOS and Android builds. Configure all necessary plugins for a QR code app including Filesystem."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent created a plan, I reviewed it, and we were off to the races.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Went Well ✅
&lt;/h2&gt;

&lt;p&gt;Let me start with the positives, because Antigravity did help in several areas:&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial Setup Was Smooth
&lt;/h3&gt;

&lt;p&gt;The agent handled the initial Capacitor installation perfectly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Installed &lt;code&gt;@capacitor/core&lt;/code&gt; and &lt;code&gt;@capacitor/cli&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ran &lt;code&gt;npx cap init&lt;/code&gt; with correct project details&lt;/li&gt;
&lt;li&gt;Added Android platforms&lt;/li&gt;
&lt;li&gt;Created the &lt;code&gt;capacitor.config.ts&lt;/code&gt; file with proper configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the boilerplate stuff that's tedious but straightforward worked flawlessly. This is exactly what AI assistants should excel at.&lt;/p&gt;

&lt;h3&gt;
  
  
  Plugin Installation
&lt;/h3&gt;

&lt;p&gt;Antigravity correctly identified and installed the necessary plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@capacitor/filesystem&lt;/code&gt; for saving QR codes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@capacitor/splash-screen&lt;/code&gt; for native app experience&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@capacitor/status-bar&lt;/code&gt; for handle status bar&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@capacitor-community/media&lt;/code&gt; for handle media files (like images)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It even configured them properly in the Capacitor config, which saved me from reading documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Configuration
&lt;/h3&gt;

&lt;p&gt;The agent modified the Nuxt config to work with Capacitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up the correct output directory&lt;/li&gt;
&lt;li&gt;Configured SSR settings (disabled, since Capacitor needs SPA)&lt;/li&gt;
&lt;li&gt;Adjusted router settings for mobile&lt;/li&gt;
&lt;li&gt;Created proper build scripts in package.json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was actually helpful because the Nuxt + Capacitor combo has some quirks that the agent navigated correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Antigravity Struggled 😬
&lt;/h2&gt;

&lt;p&gt;Now for the part where things got messy. Antigravity wasn't terrible, but it definitely wasn't at 100% performance:&lt;/p&gt;

&lt;h3&gt;
  
  
  Native Platform Specifics
&lt;/h3&gt;

&lt;p&gt;The agent struggled with Android-specific configurations. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AndroidManifest.xml&lt;/code&gt; permissions were incomplete&lt;/li&gt;
&lt;li&gt;Didn't configure proper app theming&lt;/li&gt;
&lt;li&gt;Missed some required Gradle configuration&lt;/li&gt;
&lt;li&gt;Icons and splash screens needed manual adjustment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Again, the agent knew what needed to be done but couldn't execute it properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build Errors and Debugging
&lt;/h3&gt;

&lt;p&gt;This is where Antigravity really fell short. When builds failed, the agent struggled to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diagnose Real Errors:&lt;/strong&gt;&lt;br&gt;
The first Android build threw a Gradle error. I asked Antigravity to fix it, and it suggested changes that didn't address the actual issue. After three attempts, I just Googled the error myself and fixed it in 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understand Native Tooling:&lt;/strong&gt;&lt;br&gt;
Antigravity doesn't actually run Android Studio, so when I pasted error messages from those tools, its suggestions were hit-or-miss. It could recognize &lt;em&gt;common&lt;/em&gt; errors but anything specific required me to debug manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handle Version Conflicts:&lt;/strong&gt;&lt;br&gt;
Dependency conflicts between Capacitor plugins and Nuxt modules were a pain. The agent suggested version combinations that didn't work, and I ended up trial-and-error fixing them myself.&lt;/p&gt;
&lt;h3&gt;
  
  
  Performance Optimization
&lt;/h3&gt;

&lt;p&gt;The agent successfully integrated Capacitor, but the resulting app wasn't optimized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bundle size was larger than necessary&lt;/li&gt;
&lt;li&gt;Some Nuxt modules loaded unnecessarily in mobile context&lt;/li&gt;
&lt;li&gt;Animation performance on lower-end devices was choppy&lt;/li&gt;
&lt;li&gt;Initial load time was slower than it should be&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When I asked Antigravity to optimize, it made generic suggestions (tree-shaking, lazy loading, etc.) but couldn't implement them effectively for the Capacitor + Nuxt combo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mobile-Specific UI Issues
&lt;/h3&gt;

&lt;p&gt;The web version of Glif looked fine, but mobile had problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Touch targets were too small in some places&lt;/li&gt;
&lt;li&gt;Bottom navigation issues with Android gesture navigation&lt;/li&gt;
&lt;li&gt;Keyboard behavior wasn't optimized for mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity suggested CSS fixes, but many required understanding native mobile behavior that it just didn't grasp well enough.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Reality: Manual Work Was Necessary 🔧
&lt;/h2&gt;

&lt;p&gt;Here's what I ended up doing manually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fix AndroidManifest.xml completely&lt;/li&gt;
&lt;li&gt;Configure proper app theming and colors&lt;/li&gt;
&lt;li&gt;Set up icons and splash screens correctly&lt;/li&gt;
&lt;li&gt;Adjust Gradle dependencies to resolve conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code Optimization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually remove unnecessary Nuxt modules for mobile&lt;/li&gt;
&lt;li&gt;Optimize bundle size by tree-shaking unused code&lt;/li&gt;
&lt;li&gt;Improve touch interactions with mobile-specific CSS&lt;/li&gt;
&lt;li&gt;Fix status bar and safe area issues with custom code&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Test on actual devices (simulator isn't enough)&lt;/li&gt;
&lt;li&gt;Fix device-specific bugs Antigravity couldn't predict&lt;/li&gt;
&lt;li&gt;Optimize performance on lower-end hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I'd estimate Antigravity handled about 60% of the work. The other 40% required manual intervention, native tooling knowledge, and debugging skills.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Antigravity Wasn't at 100% 🧠
&lt;/h2&gt;

&lt;p&gt;After reflecting on the experience, I think I understand why Antigravity underperformed:&lt;/p&gt;
&lt;h3&gt;
  
  
  It Can't Actually Run Native Tooling
&lt;/h3&gt;

&lt;p&gt;Antigravity's browser integration is great for web testing, but it can't Android Studio. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can't validate native builds&lt;/li&gt;
&lt;li&gt;It can't see build errors in native IDEs&lt;/li&gt;
&lt;li&gt;It can't test on actual devices or simulators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For truly mobile-native work, this is a significant limitation.&lt;/p&gt;
&lt;h3&gt;
  
  
  Capacitor Is a Bridging Technology
&lt;/h3&gt;

&lt;p&gt;Capacitor sits at the intersection of web and native, which means you need knowledge of both worlds. Antigravity is strong on the web side but weak on the native side. When problems arise in the native layer, the agent struggles.&lt;/p&gt;
&lt;h3&gt;
  
  
  Documentation Isn't Enough
&lt;/h3&gt;

&lt;p&gt;The agent can read Capacitor docs, but implementing best practices requires experience. Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper safe area handling&lt;/li&gt;
&lt;li&gt;Performance optimization for mobile devices&lt;/li&gt;
&lt;li&gt;Platform-specific UI patterns&lt;/li&gt;
&lt;li&gt;Native permission flows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These require &lt;em&gt;knowing&lt;/em&gt; mobile development, not just reading about it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Nuxt + Capacitor Is a Niche Combo
&lt;/h3&gt;

&lt;p&gt;Most Capacitor tutorials focus on React, Angular, or vanilla JS. The Nuxt integration has specific quirks and gotchas that aren't as well-documented. Antigravity didn't have enough training data on this specific stack.&lt;/p&gt;


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

&lt;p&gt;This experience taught me some valuable lessons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity Is Still Best for Pure Web:&lt;/strong&gt;&lt;br&gt;
When the work is 100% web-based (HTML, CSS, JavaScript, Vue components), Antigravity excels. The moment you cross into native territory, its effectiveness drops significantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Frameworks Need Hybrid Knowledge:&lt;/strong&gt;&lt;br&gt;
Using Capacitor effectively requires understanding both web and native development. An AI that's strong in one but weak in the other will struggle with the integration layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boilerplate vs. Implementation:&lt;/strong&gt;&lt;br&gt;
Antigravity is excellent at boilerplate and initial setup. But when things go wrong or need optimization, you still need traditional debugging skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing Matters:&lt;/strong&gt;&lt;br&gt;
The agent can't test on actual devices, which is critical for mobile development. Until AI can actually run apps on phones and see visual/performance issues, it'll miss important problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation Has Limits:&lt;/strong&gt;&lt;br&gt;
Reading docs doesn't replace experience. Mobile development has countless edge cases and platform quirks that you only learn by doing.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Current State of Glif Mobile 📱
&lt;/h2&gt;

&lt;p&gt;Despite the struggles, Glif now has working Android builds! The apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate QR codes with custom colors and sizes&lt;/li&gt;
&lt;li&gt;Save QR codes to the device photo library&lt;/li&gt;
&lt;li&gt;Work offline (since it's all client-side)&lt;/li&gt;
&lt;li&gt;Have proper icons, splash screens, and native feel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not perfect, there are still optimizations I want to make, but it's functional and feels like a real mobile app.&lt;/p&gt;

&lt;p&gt;Antigravity got me maybe 60-70% of the way there, which isn't nothing. But the final 30-40% required rolling up my sleeves and getting my hands dirty with Android Studio.&lt;/p&gt;


&lt;h2&gt;
  
  
  Should You Use Antigravity for Capacitor Integration? 🎯
&lt;/h2&gt;

&lt;p&gt;Based on my experience, here's my take:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Antigravity if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need help with initial setup and boilerplate&lt;/li&gt;
&lt;li&gt;You're already comfortable with mobile development and just want to speed up configuration&lt;/li&gt;
&lt;li&gt;You're okay handling native tooling yourself when things go wrong&lt;/li&gt;
&lt;li&gt;Your app is relatively simple without complex native integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't rely solely on Antigravity if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is your first time with Capacitor or mobile development&lt;/li&gt;
&lt;li&gt;Your app needs complex native features or optimizations&lt;/li&gt;
&lt;li&gt;You need production-ready, fully optimized mobile apps without manual work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt;&lt;br&gt;
Antigravity is a helpful assistant for Capacitor integration, but it's not a replacement for mobile development knowledge. Think of it as a junior developer who can handle setup tasks but needs supervision for the complex stuff.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I'd Do Differently Next Time 🔄
&lt;/h2&gt;

&lt;p&gt;If I were to integrate Capacitor into another project with Antigravity, I'd:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set Realistic Expectations:&lt;/strong&gt;&lt;br&gt;
Go in knowing I'll need to manually handle native configuration and optimization. Don't expect the agent to deliver a production-ready mobile app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use It for What It's Good At:&lt;/strong&gt;&lt;br&gt;
Let Antigravity handle installation, basic config, and documentation. Handle native-specific work myself from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Earlier:&lt;/strong&gt;&lt;br&gt;
Don't wait for the agent to "finish" before testing on actual devices. Test incrementally and catch issues early.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Have Native Tools Ready:&lt;/strong&gt;&lt;br&gt;
Have Android Studio open from the beginning. Don't expect to complete mobile development purely through the Antigravity interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combine with Traditional Resources:&lt;/strong&gt;&lt;br&gt;
Use Antigravity alongside Stack Overflow, Capacitor docs, and community forums. Don't rely on it exclusively.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion 🌟
&lt;/h2&gt;

&lt;p&gt;Adding Capacitor to Glif was a learning experience. Antigravity helped significantly with setup and boilerplate, but mobile development's native aspects required traditional hands-on work.&lt;/p&gt;

&lt;p&gt;The 60-70% of work the agent handled was genuinely useful and saved me time. But that final 30-40% reminded me that AI coding tools, as impressive as they are, still have clear limitations when you cross platform boundaries.&lt;/p&gt;

&lt;p&gt;Mobile development is complex, spanning web tech and Android. Until AI tools can truly understand and test across all these layers, they'll remain helpful assistants rather than complete solutions.&lt;/p&gt;

&lt;p&gt;That said, would I use Antigravity again for Capacitor integration? Probably yes, but with realistic expectations and my native IDEs ready to go from day one.&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Have you tried using AI coding tools for mobile development?&lt;/strong&gt; Drop a comment with your experiences, I'm curious if others have hit similar roadblocks or found better workflows!&lt;/p&gt;

&lt;p&gt;Check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Domenico-Tenace-Open-Labs/glif" rel="noopener noreferrer"&gt;Glif on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://glif.netlify.app/" rel="noopener noreferrer"&gt;Live web version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;Domenico Tenace Open Labs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>antigravity</category>
      <category>mobile</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building Plus Ultra: How Antigravity Helped Me Bring Material Design to Bulma CSS 🎨</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Thu, 12 Feb 2026 11:32:17 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/building-plus-ultra-how-antigravity-helped-me-bring-material-design-to-bulma-css-30m6</link>
      <guid>https://dev.to/playfulprogramming/building-plus-ultra-how-antigravity-helped-me-bring-material-design-to-bulma-css-30m6</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;Today I want to share something I've been working on that combines two things I love: clean CSS frameworks and Material Design aesthetics. I just launched &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/plus-ultra" rel="noopener noreferrer"&gt;&lt;strong&gt;Plus Ultra&lt;/strong&gt;&lt;/a&gt;, an open-source CSS library that brings Material Design components to &lt;a href="https://bulma.io/" rel="noopener noreferrer"&gt;Bulma CSS&lt;/a&gt; while keeping all the flexbox goodness that makes Bulma so powerful.&lt;/p&gt;

&lt;p&gt;And here's the kicker: I built most of it using Google Antigravity, which turned out to be an absolute beast for frontend work. If you're wondering whether Antigravity is any good for UI development, let me tell you, it's incredible.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Plus Ultra? 🚀
&lt;/h2&gt;

&lt;p&gt;First, let me explain what Plus Ultra actually is and why I built it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Concept
&lt;/h3&gt;

&lt;p&gt;Bulma is one of my favorite CSS frameworks. It's lightweight, pure CSS (no JavaScript), based on flexbox, and incredibly easy to use. The problem? Its default aesthetic is pretty basic. The components work great, but they look... well, vanilla.&lt;/p&gt;

&lt;p&gt;Material Design, on the other hand, is gorgeous. Google's design system is polished, modern, and has that clean "premium" feel. But most Material Design implementations (like Material-UI) are tied to specific JavaScript frameworks, which defeats the purpose of Bulma's simplicity.&lt;/p&gt;

&lt;p&gt;So I thought: what if we could have the best of both worlds? Bulma's flexbox power and simplicity, but with Material Design's visual polish?&lt;/p&gt;

&lt;p&gt;That's Plus Ultra.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Does
&lt;/h3&gt;

&lt;p&gt;Plus Ultra takes Bulma's components and transforms them into Material Design equivalents using pure CSS/Sass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Material buttons&lt;/strong&gt; with proper elevation, ripple effects (CSS-only), and Material color schemes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material cards&lt;/strong&gt; with the signature shadow system and hover states&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material form inputs&lt;/strong&gt; with floating labels and Material-style validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material navigation&lt;/strong&gt; components following Material guidelines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Material modals and dialogs&lt;/strong&gt; with proper transitions and backdrops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is that it's built &lt;strong&gt;on top of&lt;/strong&gt; Bulma, not instead of it. You still get all of Bulma's flexbox utilities, grid system, and helper classes. Plus Ultra just makes everything look like Material Design.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why "Plus Ultra"?
&lt;/h3&gt;

&lt;p&gt;The name comes from one of my all-time favorite anime series: &lt;a href="https://en.wikipedia.org/wiki/My_Hero_Academia" rel="noopener noreferrer"&gt;&lt;em&gt;My Hero Academia&lt;/em&gt;&lt;/a&gt; 😄&lt;br&gt;
"Plus Ultra" is actually a Latin Phrase. It translates to "Further Beyond." In My Hero Academia, it has been adopted as the school motto of U.A. High.&lt;/p&gt;


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

&lt;p&gt;Let me break down what Plus Ultra is built with:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulma CSS&lt;/strong&gt; as the foundation (obviously)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sass/SCSS&lt;/strong&gt; for all the Material Design styling&lt;/li&gt;
&lt;li&gt;Pure CSS for animations and transitions&lt;/li&gt;
&lt;li&gt;No JavaScript dependencies (keeping Bulma's philosophy)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;pnpm for package management&lt;/li&gt;
&lt;li&gt;Sass compiler for building the final CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Material Design System:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Following Google's Material Design 3 guidelines&lt;/li&gt;
&lt;li&gt;Custom color system matching Material palettes&lt;/li&gt;
&lt;li&gt;Elevation system with proper shadows&lt;/li&gt;
&lt;li&gt;Material motion and transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The beauty is that it's just CSS. No complicated build process, no JavaScript runtime, no framework lock-in. Install it, import it, and your Bulma components instantly look like Material Design.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Antigravity Changed Everything ⚡
&lt;/h2&gt;

&lt;p&gt;Now here's where it gets interesting. I could have built Plus Ultra the old-fashioned way, manually writing Sass, testing in the browser, iterating on designs. But I decided to use Google Antigravity, and honestly, it transformed the entire development process.&lt;/p&gt;
&lt;h3&gt;
  
  
  Frontend Is Antigravity's Sweet Spot
&lt;/h3&gt;

&lt;p&gt;I've used Antigravity for various projects, but it absolutely shines for frontend work. Here's why:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual Feedback Loop:&lt;/strong&gt;&lt;br&gt;
Antigravity's integrated browser means the agent can actually see the components it's building. It's not just writing CSS blindly, it's rendering the results, evaluating the visual output, and iterating based on what it sees.&lt;/p&gt;

&lt;p&gt;When I asked the agent to create a Material Design button, it would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write the initial Sass&lt;/li&gt;
&lt;li&gt;Compile and render it in the browser&lt;/li&gt;
&lt;li&gt;Visually compare it to Material Design specs&lt;/li&gt;
&lt;li&gt;Adjust colors, shadows, and spacing until it matched&lt;/li&gt;
&lt;li&gt;Show me the final result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This visual validation is huge for UI work. The agent isn't guessing, it's verifying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Material Design Knowledge:&lt;/strong&gt;&lt;br&gt;
Gemini (which powers Antigravity) has deep knowledge of Material Design principles. When I asked for "Material Design elevation level 2," it knew exactly what shadow values to use. When I requested "Material ripple effect," it understood the animation timing and easing functions.&lt;/p&gt;

&lt;p&gt;This saved me countless hours of referencing Material Design documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid Iteration:&lt;/strong&gt;&lt;br&gt;
Frontend work is all about iteration. Try a color, see how it looks, adjust. Try a shadow, see if it feels right, tweak. Antigravity excels at this:&lt;/p&gt;

&lt;p&gt;Me: "Make the button shadow more subtle"&lt;br&gt;
Agent: &lt;em&gt;adjusts shadow values, shows result&lt;/em&gt;&lt;br&gt;
Me: "Actually, go back to the original but reduce opacity"&lt;br&gt;
Agent: &lt;em&gt;reverts and modifies, shows result&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This back-and-forth happened in seconds, not minutes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Specific Examples from Building Plus Ultra
&lt;/h3&gt;

&lt;p&gt;Let me share some concrete examples of how Antigravity helped:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1: Material Cards&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Task: "Create a Material Design card component that works with Bulma's .card class"&lt;/p&gt;

&lt;p&gt;What Antigravity did:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyzed Bulma's existing card structure&lt;/li&gt;
&lt;li&gt;Added Material Design elevation (box-shadow) with proper values&lt;/li&gt;
&lt;li&gt;Implemented hover state with elevation increase&lt;/li&gt;
&lt;li&gt;Added proper border-radius matching Material specs&lt;/li&gt;
&lt;li&gt;Created transition animations for smooth hover effects&lt;/li&gt;
&lt;li&gt;Ensured responsive behavior on mobile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent created the entire component in one go, tested it visually, and the result was production-ready. I made minor tweaks to spacing, but 95% was perfect on first attempt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 2: Floating Label Inputs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Task: "Implement Material Design floating labels for Bulma form inputs"&lt;/p&gt;

&lt;p&gt;This is actually complex because floating labels require specific CSS logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Label starts inside the input&lt;/li&gt;
&lt;li&gt;When focused or filled, label floats up and shrinks&lt;/li&gt;
&lt;li&gt;Smooth transitions between states&lt;/li&gt;
&lt;li&gt;Proper color changes&lt;/li&gt;
&lt;li&gt;Accessible implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antigravity not only wrote the CSS but also created test cases showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empty input (label inside)&lt;/li&gt;
&lt;li&gt;Focused input (label floating)&lt;/li&gt;
&lt;li&gt;Filled input (label stays floating)&lt;/li&gt;
&lt;li&gt;Error state (red accent)&lt;/li&gt;
&lt;li&gt;Success state (green accent)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent validated each state visually before showing me the final component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 3: Material Color System&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Task: "Implement Material Design color palette with Sass variables compatible with Bulma's color system"&lt;/p&gt;

&lt;p&gt;Antigravity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created Sass maps for Material color palettes (primary, secondary, error, etc.)&lt;/li&gt;
&lt;li&gt;Integrated them with Bulma's existing color variables&lt;/li&gt;
&lt;li&gt;Generated utility classes (&lt;code&gt;.has-background-primary&lt;/code&gt;, &lt;code&gt;.has-text-secondary&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;Ensured proper contrast ratios for accessibility&lt;/li&gt;
&lt;li&gt;Created documentation showing all available colors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This would have taken me hours manually. The agent did it in minutes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Planning Mode Was Perfect for This
&lt;/h3&gt;

&lt;p&gt;I used Planning mode extensively for Plus Ultra, and it was ideal for a project like this.&lt;/p&gt;

&lt;p&gt;Before implementing each component, the agent would create a plan showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which Material Design specs it would follow&lt;/li&gt;
&lt;li&gt;How it would integrate with existing Bulma classes&lt;/li&gt;
&lt;li&gt;What Sass variables and mixins it would create&lt;/li&gt;
&lt;li&gt;What the final output would look like&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I could review the plan, suggest adjustments (like "use Bulma's existing spacing variables instead of creating new ones"), and then approve. This ensured consistency across all components.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Learned About Antigravity for Frontend 🧠
&lt;/h2&gt;

&lt;p&gt;After building Plus Ultra with Antigravity, here are my takeaways:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity is exceptionally strong for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Component-based UI development&lt;/li&gt;
&lt;li&gt;Design system implementation&lt;/li&gt;
&lt;li&gt;CSS/Sass architecture&lt;/li&gt;
&lt;li&gt;Responsive design work&lt;/li&gt;
&lt;li&gt;Visual consistency across components&lt;/li&gt;
&lt;li&gt;Rapid prototyping and iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The visual feedback loop is critical.&lt;/strong&gt;&lt;br&gt;
For UI work, being able to see results immediately and iterate visually makes Antigravity far more effective than text-based coding assistants.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Material Design knowledge is built-in.&lt;/strong&gt;&lt;br&gt;
Having an AI that deeply understands design systems means less time reading specs and more time building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Planning mode prevents inconsistency.&lt;/strong&gt;&lt;br&gt;
For a library like Plus Ultra where consistency is crucial, Planning mode's upfront architecture decisions were invaluable.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Current State and What's Next 🌟
&lt;/h2&gt;

&lt;p&gt;Plus Ultra is currently in early development. The foundation is there, core Material components working on top of Bulma, but there's still work to do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's working now:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Material buttons with elevation and states&lt;/li&gt;
&lt;li&gt;Material cards with proper shadows&lt;/li&gt;
&lt;li&gt;Basic floating label inputs&lt;/li&gt;
&lt;li&gt;Material color palette integration&lt;/li&gt;
&lt;li&gt;Foundation Sass architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's coming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete form component library&lt;/li&gt;
&lt;li&gt;Material navigation components&lt;/li&gt;
&lt;li&gt;Modal and dialog components&lt;/li&gt;
&lt;li&gt;Material tables and lists&lt;/li&gt;
&lt;li&gt;Comprehensive documentation&lt;/li&gt;
&lt;li&gt;Live demo site&lt;/li&gt;
&lt;li&gt;npm package for easy installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm building this in the open under &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;Domenico Tenace Open Labs&lt;/a&gt;, so anyone can follow along, contribute, or use what's already there.&lt;/p&gt;

&lt;p&gt;And yes, I'll be continuing to use Antigravity for development. It's been too effective not to.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Open Source? 🌍
&lt;/h2&gt;

&lt;p&gt;You might wonder why I'm building this as an open-source project instead of keeping it proprietary.&lt;/p&gt;

&lt;p&gt;Simple: the best tools I use every day are open source. Bulma is open source. Material Design specs are open. The entire web is built on open technologies.&lt;/p&gt;

&lt;p&gt;Plus Ultra stands on the shoulders of giants. The least I can do is contribute back to the ecosystem that's given me so much.&lt;/p&gt;

&lt;p&gt;If other developers find it useful, awesome. If someone wants to contribute improvements, even better. And if it helps people build better-looking websites with Bulma, that's the whole point.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Want to Hear From You 💬
&lt;/h2&gt;

&lt;p&gt;Alright, your turn! I have questions for the community:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you use Bulma:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Would a Material Design version interest you?&lt;/li&gt;
&lt;li&gt;What components would be most valuable?&lt;/li&gt;
&lt;li&gt;What design systems would you like to see integrated with Bulma?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you use Material Design:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you prefer React-based Material UI or pure CSS solutions?&lt;/li&gt;
&lt;li&gt;What features are non-negotiable in a Material Design implementation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you've used Antigravity for frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How has your experience been with UI development?&lt;/li&gt;
&lt;li&gt;Did you find the browser integration as useful as I did?&lt;/li&gt;
&lt;li&gt;What tricks or workflows have you discovered?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you're considering trying Antigravity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What questions do you have about using it for frontend work?&lt;/li&gt;
&lt;li&gt;What kinds of projects are you thinking about building?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drop a comment below!&lt;/strong&gt; I'm genuinely curious to hear if others are using Antigravity for frontend work and what your experiences have been. The tool is still new, and community knowledge sharing helps everyone.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion 🎯
&lt;/h2&gt;

&lt;p&gt;Building Plus Ultra has been a blast, and Antigravity made the process significantly faster and more enjoyable than traditional development would have been.&lt;/p&gt;

&lt;p&gt;The combination of Bulma's simplicity and Material Design's aesthetics feels like a natural fit, and having an AI assistant that understands both design systems, can write clean Sass, and can visually validate the results is incredibly powerful.&lt;/p&gt;

&lt;p&gt;If you're doing frontend work and haven't tried Antigravity yet, I highly recommend giving it a shot. The browser integration alone makes it worth exploring. And if you're a Bulma user looking for a Material Design aesthetic, keep an eye on Plus Ultra, we're just getting started.&lt;/p&gt;

&lt;p&gt;Check out the repo, star it if you're interested, and feel free to contribute or provide feedback. This is a community project, and the more input we get, the better it becomes.&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;



&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>google</category>
      <category>antigravity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Planning vs Fast Mode in Google Antigravity: When and How to Use Each ⚡</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Tue, 03 Feb 2026 09:09:36 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/planning-vs-fast-mode-in-google-antigravity-when-and-how-to-use-each-36n5</link>
      <guid>https://dev.to/playfulprogramming/planning-vs-fast-mode-in-google-antigravity-when-and-how-to-use-each-36n5</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;If you've started exploring Google Antigravity, you've probably noticed those two options sitting right there in the agent panel: &lt;strong&gt;Planning&lt;/strong&gt; and &lt;strong&gt;Fast&lt;/strong&gt; modes. At first glance, they might seem like just different speeds for getting stuff done, but trust me understanding when to use each one is the difference between feeling like a productivity wizard and wondering why the agent just did something completely unexpected.&lt;/p&gt;

&lt;p&gt;After spending significant time with Antigravity across various projects (from quick bug fixes to complex refactoring), I've learned that these modes represent fundamentally different approaches to problem solving. Choosing the right one can make or break your workflow.&lt;/p&gt;

&lt;p&gt;Today I want to dive deep into both modes: what makes them different, when to use each, how to get the most out of them, and the gotchas you need to watch out for. By the end, you'll know exactly which mode to reach for in any situation.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Philosophy: Two Ways to Think 🤔
&lt;/h2&gt;

&lt;p&gt;Before we get into the technical details, let's understand the philosophical difference between these modes, because it affects everything about how they work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planning Mode: The Architect's Approach
&lt;/h3&gt;

&lt;p&gt;Planning mode is all about &lt;strong&gt;thinking before doing&lt;/strong&gt;. When you give the agent a task in Planning mode, it doesn't immediately start writing code. Instead, it takes a step back and asks itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly are we trying to achieve?&lt;/li&gt;
&lt;li&gt;What are the different components involved?&lt;/li&gt;
&lt;li&gt;What's the best approach to solve this?&lt;/li&gt;
&lt;li&gt;What files will need to be created or modified?&lt;/li&gt;
&lt;li&gt;What dependencies or technologies should we use?&lt;/li&gt;
&lt;li&gt;What are the potential challenges or edge cases?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after answering these questions does it create a detailed implementation plan. This plan is a tangible artifact a document you can read, review, comment on, and approve before any code is written.&lt;/p&gt;

&lt;p&gt;Think of it like an architect creating blueprints before construction begins. You get to see the entire vision, suggest changes, and ensure everyone's on the same page before the first line of code is touched.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fast Mode: The Builder's Approach
&lt;/h3&gt;

&lt;p&gt;Fast mode is the opposite philosophy: &lt;strong&gt;just do it&lt;/strong&gt;. When you give the agent a task in Fast mode, it immediately starts executing. No plans, no artifacts, no waiting for approval. It interprets your request and takes action right away.&lt;/p&gt;

&lt;p&gt;This isn't carelessness, it's confidence. Fast mode assumes the task is straightforward enough that the agent can handle it without needing to draft a comprehensive plan first. It's like asking a skilled carpenter to fix a wobbly table leg, they don't need to draw blueprints; they just grab their tools and fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key insight&lt;/strong&gt;: Planning mode prioritizes clarity and control. Fast mode prioritizes speed and efficiency. Neither is "better", they solve different problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Planning Mode Deep Dive 📋
&lt;/h2&gt;

&lt;p&gt;Let's start with Planning mode since it's the more complex (and often more powerful) of the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Planning Mode Works
&lt;/h3&gt;

&lt;p&gt;When you initiate a task in Planning mode, here's what happens behind the scenes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Initial Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent reads your prompt and analyzes the scope. It examines your current workspace, identifies relevant files, and understands the context of what you're asking for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Plan Creation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent generates an &lt;strong&gt;Implementation Plan&lt;/strong&gt; artifact. This document typically includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Goal&lt;/strong&gt;: A clear statement of what the task aims to achieve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech Stack&lt;/strong&gt;: The technologies, frameworks, and libraries it plans to use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Level Approach&lt;/strong&gt;: The overall strategy for solving the problem&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed Steps&lt;/strong&gt;: A breakdown of specific actions it will take&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File Changes&lt;/strong&gt;: Which files will be created, modified, or deleted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing Strategy&lt;/strong&gt;: How it will verify the implementation works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This plan appears as an artifact in your workspace that you can read, comment on, and interact with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Your Review and Feedback&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's where the magic happens: you can provide feedback directly on the plan. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlight specific sections and add comments&lt;/li&gt;
&lt;li&gt;Suggest alternative approaches&lt;/li&gt;
&lt;li&gt;Ask clarifying questions&lt;/li&gt;
&lt;li&gt;Request changes before any code is written&lt;/li&gt;
&lt;li&gt;Approve the plan as-is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent reads your feedback and incorporates it into its understanding before proceeding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you approve (explicitly or implicitly by letting it proceed), the agent executes the plan step by step. It follows the roadmap it created, implementing each component methodically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Walkthrough Generation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After completing the task, the agent generates a &lt;strong&gt;Walkthrough&lt;/strong&gt; artifact documenting what it did, what files changed, what features were added, and recommended next steps.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use Planning Mode
&lt;/h3&gt;

&lt;p&gt;Planning mode shines in specific scenarios. Here's when you should reach for it:&lt;/p&gt;

&lt;h4&gt;
  
  
  Complex, Multi-Step Tasks
&lt;/h4&gt;

&lt;p&gt;If the task requires multiple components working together, Planning mode is your friend. Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Build a todo list app with user authentication, database storage, and responsive design"&lt;/li&gt;
&lt;li&gt;"Refactor the entire authentication system to use OAuth 2.0"&lt;/li&gt;
&lt;li&gt;"Create a CI/CD pipeline with automated testing and deployment"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tasks have many moving parts. The planning phase ensures everything is coordinated correctly.&lt;/p&gt;

&lt;h4&gt;
  
  
  When You Need Oversight
&lt;/h4&gt;

&lt;p&gt;If you want to understand the agent's approach before it starts making changes, Planning mode gives you that visibility. This is crucial when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working on production code&lt;/li&gt;
&lt;li&gt;Making changes to critical systems&lt;/li&gt;
&lt;li&gt;Learning how the agent solves problems&lt;/li&gt;
&lt;li&gt;Ensuring the solution aligns with your architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Unfamiliar Domains
&lt;/h4&gt;

&lt;p&gt;When you're asking the agent to work with technologies or frameworks you're less familiar with, Planning mode lets you review the approach and learn from the plan before implementation.&lt;/p&gt;

&lt;p&gt;For example, if you're new to React and ask the agent to build a component, the plan will show you the React patterns and best practices it intends to use. You can learn from this before any code is written.&lt;/p&gt;

&lt;h4&gt;
  
  
  Large-Scale Refactoring
&lt;/h4&gt;

&lt;p&gt;Refactoring across many files is risky without a plan. Planning mode ensures the agent has thought through all the implications and will make consistent changes throughout the codebase.&lt;/p&gt;

&lt;p&gt;I used this extensively &lt;a href="https://dev.to/this-is-learning/my-experience-with-google-antigravity-how-i-refactored-easy-kit-utils-with-ai-agents-2e54"&gt;when refactoring Easy Kit Utils&lt;/a&gt;, the planning phase showed exactly which files would be touched and how the changes would maintain consistency.&lt;/p&gt;

&lt;h4&gt;
  
  
  Collaborative Development
&lt;/h4&gt;

&lt;p&gt;If you're working on a team project or pair programming with the agent, Planning mode enables better collaboration. Your teammates can review the plan, provide input, and ensure the implementation aligns with team standards.&lt;/p&gt;

&lt;h4&gt;
  
  
  When You're Not Sure What You Want
&lt;/h4&gt;

&lt;p&gt;Sometimes you have a vague idea but haven't fully crystallized the requirements. Planning mode can help you think through the problem by generating a plan you can then refine.&lt;/p&gt;

&lt;p&gt;For example: "I need some kind of data visualization for user analytics" → the agent creates a plan proposing a specific approach → you review and say "actually, I want interactive charts, not static ones" → the plan updates before any coding happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use Planning Mode Effectively
&lt;/h3&gt;

&lt;p&gt;To get the most out of Planning mode, follow these practices:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Clear About the Goal, Not the Implementation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Good prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a user authentication system with email/password login, password reset functionality, and session management."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Less effective prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use bcrypt to hash passwords in the users table and create a sessions table with JWT tokens and..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Planning mode works best when you describe &lt;em&gt;WHAT&lt;/em&gt; you want, not &lt;em&gt;HOW&lt;/em&gt; to build it. Let the agent figure out the implementation details—that's what the planning phase is for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the Plan Thoroughly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't just skim and approve. Actually read the implementation plan. Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the tech stack make sense?&lt;/li&gt;
&lt;li&gt;Are there parts of the problem the agent missed?&lt;/li&gt;
&lt;li&gt;Are there simpler approaches?&lt;/li&gt;
&lt;li&gt;Does this align with your project's architecture?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Inline Comments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antigravity supports Google Docs-style commenting directly on plan artifacts. Highlight a section of the plan and add a comment like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Instead of using PostgreSQL, can we use SQLite for this prototype?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Don't forget to handle the edge case where the user's email isn't verified."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent reads these comments and adjusts its approach accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Iterate on the Plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't feel pressured to approve immediately. It's okay to go back and forth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent creates initial plan&lt;/li&gt;
&lt;li&gt;You comment with changes&lt;/li&gt;
&lt;li&gt;Agent updates the plan&lt;/li&gt;
&lt;li&gt;You review again&lt;/li&gt;
&lt;li&gt;Approve when satisfied&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This iteration happens &lt;em&gt;before&lt;/em&gt; any code is written, which is much more efficient than fixing issues after implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approve Explicitly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're satisfied with the plan, explicitly approve it by saying something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Looks good, proceed with implementation"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Approved, let's build this"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This signals to the agent that it should move from planning to execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Planning Mode Pitfalls
&lt;/h3&gt;

&lt;p&gt;Even with the best intentions, there are traps to avoid:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Over-Planning Small Tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Planning mode has overhead. For tiny tasks like "fix the typo in line 42," the planning phase is overkill. Use Fast mode instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analysis Paralysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't get stuck endlessly iterating on the plan. At some point, you need to commit and see the implementation. Perfect plans rarely survive contact with reality anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring the Plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some developers approve plans without reading them, defeating the whole purpose of Planning mode. If you're going to skip the plan review, just use Fast mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming the Plan Is Perfect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The plan is a guide, not gospel. As the agent executes, it might discover issues or better approaches. Be flexible and let it adapt if needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fast Mode Deep Dive ⚡
&lt;/h2&gt;

&lt;p&gt;Now let's talk about Fast mode—the quick-and-dirty, get-it-done-now approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Fast Mode Works
&lt;/h3&gt;

&lt;p&gt;Fast mode is beautifully simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Interpret the Request&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent reads your prompt and immediately understands what action to take.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Execute&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It performs the task right away. No plans, no artifacts, no waiting. It makes the changes or writes the code directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Report Back&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent confirms what it did and shows you the results.&lt;/p&gt;

&lt;p&gt;That's it. Three steps, minimal overhead, maximum speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use Fast Mode
&lt;/h3&gt;

&lt;p&gt;Fast mode is perfect for specific scenarios:&lt;/p&gt;

&lt;h4&gt;
  
  
  Quick Edits and Fixes
&lt;/h4&gt;

&lt;p&gt;Simple, localized changes are Fast mode's bread and butter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Fix the typo on line 23"&lt;/li&gt;
&lt;li&gt;"Rename this variable to be more descriptive"&lt;/li&gt;
&lt;li&gt;"Add a console.log statement to debug this function"&lt;/li&gt;
&lt;li&gt;"Change the button color to blue"&lt;/li&gt;
&lt;li&gt;"Update the heading text to 'Welcome to Our App'"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tasks are so straightforward that planning would just slow things down.&lt;/p&gt;

&lt;h4&gt;
  
  
  Obvious Solutions
&lt;/h4&gt;

&lt;p&gt;When there's only one reasonable way to solve a problem, Fast mode is efficient:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Center this div horizontally"&lt;/li&gt;
&lt;li&gt;"Add error handling to this API call"&lt;/li&gt;
&lt;li&gt;"Convert this callback to async/await"&lt;/li&gt;
&lt;li&gt;"Sort this array alphabetically"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation is obvious, so just do it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Iterative Development
&lt;/h4&gt;

&lt;p&gt;When you're rapidly prototyping and trying things out, Fast mode keeps you in flow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Try making the sidebar wider"&lt;/li&gt;
&lt;li&gt;"Add another field to this form"&lt;/li&gt;
&lt;li&gt;"Change the API endpoint to /v2/users"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can make quick changes, see the results, and iterate without the overhead of planning each tiny adjustment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Familiar Patterns
&lt;/h4&gt;

&lt;p&gt;If you're working with code patterns you know well and you're confident in the approach, Fast mode gets you there faster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Add a new route for /profile"&lt;/li&gt;
&lt;li&gt;"Create a simple React component for displaying user info"&lt;/li&gt;
&lt;li&gt;"Write a unit test for this function"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You know what good looks like, so you don't need to review a plan first.&lt;/p&gt;

&lt;h4&gt;
  
  
  Following Up on Existing Work
&lt;/h4&gt;

&lt;p&gt;When the agent has already done the heavy lifting and you just need small adjustments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Make the font slightly larger"&lt;/li&gt;
&lt;li&gt;"Add a bit more padding"&lt;/li&gt;
&lt;li&gt;"Fix that bug we just discovered"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These follow-up tasks build on existing context and don't need new plans.&lt;/p&gt;

&lt;h4&gt;
  
  
  Exploratory Tasks
&lt;/h4&gt;

&lt;p&gt;When you're just trying something to see if it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Can you add syntax highlighting to this code block?"&lt;/li&gt;
&lt;li&gt;"Try implementing this feature and let's see how it looks"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it doesn't work, you'll ask for something different. No need for upfront planning.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Use Fast Mode Effectively
&lt;/h3&gt;

&lt;p&gt;Fast mode is simple, but there are still best practices:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Specific and Clear&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since there's no planning phase to clarify ambiguity, your prompt needs to be precise:&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Change the primary button background color from blue to green"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Less effective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make the button look better"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second prompt might work, but you're leaving too much to interpretation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Task at a Time&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast mode works best with single, focused requests:&lt;/p&gt;

&lt;p&gt;Good:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add input validation for the email field"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Less effective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add input validation, fix the layout issues, and update the error messages"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have multiple tasks, either make separate requests in Fast mode or switch to Planning mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay Engaged&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since Fast mode executes immediately, watch what the agent does. If it goes in the wrong direction, you can course-correct quickly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Wait, I meant center it vertically, not horizontally"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fast feedback loop is part of Fast mode's advantage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use It for Learning the Codebase&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast mode is great for quick explorations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me all the places where this function is called"&lt;/p&gt;

&lt;p&gt;"Add comments explaining what this code does"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These quick tasks help you understand the code without major changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Common Fast Mode Pitfalls
&lt;/h3&gt;

&lt;p&gt;Fast mode's simplicity can also create problems:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using It for Complex Tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest mistake is using Fast mode for tasks that actually need planning:&lt;/p&gt;

&lt;p&gt;Bad idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Rebuild the entire user authentication system to use OAuth"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent will try to do it, but without planning, it might make inconsistent changes, miss edge cases, or choose a suboptimal approach.&lt;/p&gt;

&lt;p&gt;If the task touches multiple files or has significant complexity, use Planning mode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vague Instructions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Planning mode, vague instructions get clarified during the planning phase. In Fast mode, vague instructions lead to unexpected results:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Make this component better"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Better is subjective. The agent might optimize for performance when you wanted visual improvements, or vice versa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chaining Too Many Fast Requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Making dozens of sequential Fast mode requests can lead to inconsistency:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add field A"&lt;br&gt;
"Add field B"&lt;br&gt;&lt;br&gt;
"Add field C"&lt;br&gt;
"Now style them all"&lt;br&gt;
"Actually, use a different layout"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At this point, you've essentially created a complex task piecemeal. Would've been better to use Planning mode from the start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming It'll Get Everything Right&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast mode trades thoroughness for speed. Always review the results, especially for code that'll go to production.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Practical Comparison: Side by Side 🔄
&lt;/h2&gt;

&lt;p&gt;Let's look at how the same task would play out in each mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Task: "Create a Contact Form"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Planning Mode Approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You submit: "Create a contact form with name, email, message fields, and submit functionality"&lt;/li&gt;
&lt;li&gt;Agent creates an implementation plan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   Goal: Build a functional contact form

   Tech Stack:
   - HTML5 for structure
   - CSS3 for styling
   - Vanilla JavaScript for validation
   - FormSubmit.co for backend handling

   Steps:
   1. Create contact.html with semantic form structure
   2. Implement validation for required fields and email format
   3. Add CSS for responsive design
   4. Include client-side validation with clear error messages
   5. Set up form submission handling
   6. Test across different screen sizes

   Files to create:
   - contact.html
   - contact.css
   - contact.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;You review the plan, notice it's using an external service, comment: "Actually, let's handle the form submission ourselves with a simple PHP backend"&lt;/li&gt;
&lt;li&gt;Agent updates the plan to include a PHP handler&lt;/li&gt;
&lt;li&gt;You approve&lt;/li&gt;
&lt;li&gt;Agent implements everything according to the revised plan&lt;/li&gt;
&lt;li&gt;Agent generates a walkthrough showing what was built and how to test it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total time: ~5-10 minutes, most of which is execution&lt;br&gt;
Your involvement: Reading plan, commenting, approving&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fast Mode Approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You submit: "Create a contact form with name, email, message fields, and submit functionality"&lt;/li&gt;
&lt;li&gt;Agent immediately creates the form with sensible defaults&lt;/li&gt;
&lt;li&gt;You see the result, realize you wanted it styled differently&lt;/li&gt;
&lt;li&gt;You request: "Make it look more modern with better spacing"&lt;/li&gt;
&lt;li&gt;Agent updates the CSS&lt;/li&gt;
&lt;li&gt;You notice validation is missing&lt;/li&gt;
&lt;li&gt;You request: "Add form validation"&lt;/li&gt;
&lt;li&gt;Agent adds validation&lt;/li&gt;
&lt;li&gt;You realize you need a backend&lt;/li&gt;
&lt;li&gt;You request: "Add a PHP handler for form submission"&lt;/li&gt;
&lt;li&gt;Agent creates the handler&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Total time: Similar overall, but broken into many small requests&lt;br&gt;
Your involvement: Constant back-and-forth adjustments&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Difference:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Planning mode gave you visibility and control upfront, leading to a more coherent result in one go. Fast mode required iteration to arrive at the same place.&lt;/p&gt;

&lt;p&gt;For a task like this, Planning mode is better. But if you just wanted to add one field to an existing form? Fast mode wins every time.&lt;/p&gt;


&lt;h2&gt;
  
  
  Switching Between Modes: When to Change Your Approach 🔀
&lt;/h2&gt;

&lt;p&gt;Here's something important: you're not locked into one mode for your entire session. You can (and should) switch based on the task at hand.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Switch Modes
&lt;/h3&gt;

&lt;p&gt;It's simple. In the agent panel, you'll see a toggle between "Planning" and "Fast" modes. Click the one you want, or use the keyboard shortcut &lt;strong&gt;Cmd/Ctrl + .&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The current mode is always displayed in the chat interface, usually in the lower left of the input box.&lt;/p&gt;
&lt;h3&gt;
  
  
  Strategic Mode Switching
&lt;/h3&gt;

&lt;p&gt;Here's how experienced Antigravity users flow between modes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start Big, Then Get Small&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use Planning mode to build the initial feature or system, then switch to Fast mode for tweaks and refinements:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Planning: "Build a blog system with posts, comments, and user authentication"&lt;/li&gt;
&lt;li&gt;[Implementation happens]&lt;/li&gt;
&lt;li&gt;Fast: "Make the comment form slightly wider"&lt;/li&gt;
&lt;li&gt;Fast: "Add a character count to the comment field"&lt;/li&gt;
&lt;li&gt;Fast: "Change the submit button text to 'Post Comment'"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Use Planning for Unknowns, Fast for Knowns&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you're unsure of the best approach, use Planning to get the agent's thoughts. Once the pattern is established, use Fast for similar tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Planning: "Create a reusable card component with image, title, and description"&lt;/li&gt;
&lt;li&gt;[Review plan, approve, implementation happens]&lt;/li&gt;
&lt;li&gt;Fast: "Create another card component for product listings using the same pattern"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Complex Then Simple&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After completing a complex task in Planning mode, use Fast mode to handle the inevitable small issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Planning: "Refactor the API layer to use async/await throughout"&lt;/li&gt;
&lt;li&gt;[Implementation happens]&lt;/li&gt;
&lt;li&gt;Fast: "Fix the error handling in the /users endpoint we just refactored"&lt;/li&gt;
&lt;li&gt;Fast: "Add a TODO comment about the deprecated method we're still using"&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  When Work in Progress, Mode Sticks
&lt;/h3&gt;

&lt;p&gt;Important note: if you switch modes while a task is running, the current task continues in its original mode. The mode switch only affects &lt;em&gt;new&lt;/em&gt; tasks.&lt;/p&gt;

&lt;p&gt;So if you start a complex task in Planning mode, then realize you want to make a quick fix and switch to Fast mode, the Planning task will continue with its plan-based approach while new requests use Fast mode.&lt;/p&gt;


&lt;h2&gt;
  
  
  Advanced Tips: Getting More from Both Modes 🚀
&lt;/h2&gt;

&lt;p&gt;Now that you understand the basics, here are some advanced techniques:&lt;/p&gt;
&lt;h3&gt;
  
  
  For Planning Mode:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use Sub-Plans for Massive Projects&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For truly large projects, break them into phases and use Planning mode for each phase:&lt;/p&gt;

&lt;p&gt;Phase 1 Planning: "Plan the database schema and authentication system"&lt;br&gt;
Phase 2 Planning: "Plan the API endpoints based on the schema we just created"&lt;br&gt;
Phase 3 Planning: "Plan the frontend components consuming the API"&lt;/p&gt;

&lt;p&gt;This keeps plans focused and manageable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combine with Knowledge Items&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antigravity's Knowledge Items system captures important patterns and decisions. In Planning mode, reference these:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a new API endpoint following the patterns in Knowledge Item #12"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The plan will incorporate your established patterns automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask for Multiple Approaches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can request the agent to propose different strategies:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a plan for the image upload feature, but give me two different approaches: one optimized for performance, one optimized for simplicity"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then pick the approach you prefer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use Plans as Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Save the implementation plans as project documentation. They serve as a record of architectural decisions and can help future contributors understand why things were built a certain way.&lt;/p&gt;
&lt;h3&gt;
  
  
  For Fast Mode:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Chain Simple Tasks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While I said not to chain too many, you &lt;em&gt;can&lt;/em&gt; chain a few simple, related tasks efficiently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add a loading spinner" → [done] → "Make it blue" → [done] → "Position it in the center"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three Fast mode requests in quick succession can be faster than one Planning mode task for these micro-adjustments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use It for Code Exploration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fast mode excels at helping you understand code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Add console.log statements showing the data flow through this function"&lt;/p&gt;

&lt;p&gt;"Add comments explaining each regex group in this pattern"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These exploratory tasks don't need planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid Prototyping Loop&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When experimenting with UI/UX:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Try a card-based layout" → [see result] → "Actually, try a list layout" → [see result] → "Go back to cards but make them smaller"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fast mode's immediacy supports this exploratory workflow.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Mental Model: Choosing Between Modes 🧠
&lt;/h2&gt;

&lt;p&gt;After all this information, you might still wonder: "How do I actually decide in the moment?"&lt;/p&gt;

&lt;p&gt;Here's the mental model I use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ask yourself:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;"If this goes wrong, how bad is it?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High stakes → Planning mode&lt;/li&gt;
&lt;li&gt;Low stakes → Fast mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;"Do I know exactly what I want?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes → Fast mode&lt;/li&gt;
&lt;li&gt;No, I need to see options → Planning mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;"How many files will this touch?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1-2 files → Fast mode&lt;/li&gt;
&lt;li&gt;3+ files → Planning mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;"Will I learn something from seeing the plan?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes → Planning mode&lt;/li&gt;
&lt;li&gt;No → Fast mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;"Is this part of a bigger workflow?"&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, it's the foundation → Planning mode&lt;/li&gt;
&lt;li&gt;No, it's a quick fix → Fast mode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you answer "Planning mode" to 2 or more of these questions, use Planning mode. Otherwise, Fast mode is probably fine.&lt;/p&gt;


&lt;h2&gt;
  
  
  Real-World Examples from My Experience 💼
&lt;/h2&gt;

&lt;p&gt;Let me share some concrete examples from my own Antigravity usage:&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 1: Refactoring Easy Kit Utils (Planning Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Modernize the entire utility library&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Planning:&lt;/strong&gt; Multi-file changes, needed consistency, wanted to review approach first&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; The agent created a comprehensive plan showing how it would refactor each utility category, update tests, and maintain backward compatibility. I reviewed it, suggested using specific ES6 features, and the execution was smooth.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 2: Fixing a Typo in Documentation (Fast Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Correct a misspelling in README&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Fast:&lt;/strong&gt; Trivial change, obvious solution, not worth planning&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Done in 5 seconds. No overhead needed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 3: Adding a New Feature (Planning Mode → Fast Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Add user profile functionality&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Planning first:&lt;/strong&gt; Complex feature with multiple components&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Used Planning for the initial implementation (profile page, data storage, API endpoints). Then used Fast mode for tweaks like "add a character limit to the bio field" and "make the avatar circular instead of square."&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 4: Debugging (Fast Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Figure out why a function isn't working&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Fast:&lt;/strong&gt; Exploratory, trying different things quickly&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; "Add logging to this function" → "Add error handling" → "Try calling it with different parameters",  Fast mode's immediacy helped iterate quickly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example 5: Learning a New Framework (Planning Mode)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt; Build a component in a framework I'm not familiar with&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Planning:&lt;/strong&gt; Wanted to see best practices before code was written&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; The plan showed me the framework patterns and conventions. I learned from the plan, made suggestions to align with project structure, then approved and watched the implementation to learn more.&lt;/p&gt;


&lt;h2&gt;
  
  
  Common Questions and Misconceptions 🤷
&lt;/h2&gt;

&lt;p&gt;Let me address some frequent confusion I've seen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "Is Planning mode slower?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Yes and no. The planning phase adds time upfront, but often saves time overall by avoiding missteps and rework. For complex tasks, Planning mode can be faster end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "Can I edit the plan before execution?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Yes! Use inline comments to request changes. The agent will update the plan based on your feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "Does Fast mode mean lower quality?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Not necessarily. It means less deliberation, but for simple tasks, the quality is identical. For complex tasks, yes, Planning mode tends to produce better results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "What if I start in the wrong mode?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: You can cancel the current task and restart in a different mode, or just let it finish and switch modes for the next task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "Does the agent 'remember' between modes?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Yes, the conversation context persists. You can use Planning for one task, Fast for the next, and the agent knows what happened previously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q: "Why would I ever use Planning mode if Fast is quicker?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A: Because "quick" isn't always "best." Complex tasks need deliberation, oversight, and structured thinking, exactly what Planning provides.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Want to Hear From You 💬
&lt;/h2&gt;

&lt;p&gt;Alright, now it's your turn! I've shared my experiences and understanding of Planning vs Fast modes, but I know I'm not the only one experimenting with Antigravity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you've used either or both modes, I want to hear from you:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which mode do you find yourself using more often?&lt;/li&gt;
&lt;li&gt;Have you discovered use cases where one mode clearly outperforms the other?&lt;/li&gt;
&lt;li&gt;What's your decision-making process for choosing between modes?&lt;/li&gt;
&lt;li&gt;Have you found any gotchas or unexpected behaviors?&lt;/li&gt;
&lt;li&gt;Do you have tips or workflows that leverage both modes effectively?&lt;/li&gt;
&lt;li&gt;How do these modes compare to other AI IDEs you've used?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you're new to Antigravity and considering trying it:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What questions do you have about these modes?&lt;/li&gt;
&lt;li&gt;What kinds of tasks are you hoping to use it for?&lt;/li&gt;
&lt;li&gt;Does the Planning vs Fast distinction make sense, or is it confusing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drop a comment below!&lt;/strong&gt; Your experiences help everyone learn faster. Plus, I'm genuinely curious if my mental models align with how others use these tools, or if I'm missing something.&lt;/p&gt;

&lt;p&gt;The community's collective wisdom is how we all get better at this new paradigm of development.&lt;/p&gt;


&lt;h2&gt;
  
  
  Conclusion 🌟
&lt;/h2&gt;

&lt;p&gt;Google Antigravity's dual-mode approach, Planning and Fast, represents a thoughtful design decision. Rather than forcing everyone into a single workflow, it acknowledges that different tasks require different levels of deliberation.&lt;/p&gt;

&lt;p&gt;Planning mode is for when you want to understand the plan before execution, when complexity demands structure, when you're learning, or when stakes are high. It's the architect mode.&lt;/p&gt;

&lt;p&gt;Fast mode is for when you know what you want, when the solution is obvious, when you're iterating rapidly, or when overhead would be counterproductive. It's the builder mode.&lt;/p&gt;

&lt;p&gt;Neither mode is inherently superior. The skill is knowing which to use when.&lt;/p&gt;

&lt;p&gt;As I've worked with Antigravity, I've found that my mode selection has become more intuitive. I don't consciously run through a checklist anymore, I just &lt;em&gt;feel&lt;/em&gt; which mode fits the task. That comes with practice.&lt;/p&gt;

&lt;p&gt;My advice? Start with Planning mode for most things as you learn Antigravity. The plans teach you how the agent thinks. As you get comfortable, you'll naturally start using Fast mode more for the simple stuff.&lt;/p&gt;

&lt;p&gt;And remember: you can always switch modes mid-session. If you realize you chose wrong, just switch and move on. It's a tool, not a commitment.&lt;/p&gt;

&lt;p&gt;The future of development is agentic, and interfaces like Planning vs Fast modes are how we'll navigate this new paradigm. Learning to use them effectively is an investment in your future productivity.&lt;/p&gt;

&lt;p&gt;So experiment, break things, try both modes extensively, and find the workflow that fits your style.&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;



&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>antigravity</category>
      <category>google</category>
    </item>
    <item>
      <title>Why I Switched to Mullvad VPN: The Open Source VPN 🔒</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Sun, 01 Feb 2026 17:15:21 +0000</pubDate>
      <link>https://dev.to/dvalin99/why-i-switched-to-mullvad-vpn-the-open-source-vpn-4f1e</link>
      <guid>https://dev.to/dvalin99/why-i-switched-to-mullvad-vpn-the-open-source-vpn-4f1e</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;Today I want to talk about something that's been on my mind lately: online privacy. More specifically, I want to share why I recently switched to &lt;strong&gt;Mullvad VPN&lt;/strong&gt; and why I think it's one of the most important decisions I've made for my digital security this year.&lt;/p&gt;

&lt;p&gt;In a world where every click, every search, every website visit is tracked, logged, and sold to the highest bidder, taking control of your privacy isn't just smart, it's necessary. And after doing my research and testing several VPN services, I landed on Mullvad. Spoiler alert: I'm really happy with this choice.&lt;/p&gt;

&lt;p&gt;So let's dive into what makes Mullvad special, why VPNs matter in the first place, and what you should know before making the switch yourself.&lt;/p&gt;

&lt;p&gt;Let's get started! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  First Things First: Why Do You Even Need a VPN? 🤔
&lt;/h2&gt;

&lt;p&gt;Before we get into Mullvad specifically, let's talk about why VPNs are important. If you're already privacy-conscious, feel free to skip ahead, but for everyone else, here's the deal.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your ISP Is Watching Everything
&lt;/h3&gt;

&lt;p&gt;Every time you connect to the internet, your Internet Service Provider (ISP) can see everything you do. Every website you visit, every video you watch, every file you download, it's all visible to them. And in many countries, ISPs are legally required to log this data and keep it for months or even years.&lt;/p&gt;

&lt;p&gt;Worse yet? In some places, ISPs sell this browsing data to advertisers and data brokers. Your online behavior becomes a commodity, bought and sold without your explicit consent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your IP Address Is Your Digital Fingerprint
&lt;/h3&gt;

&lt;p&gt;Your IP address is like your home address for the internet. It identifies you, tracks you across websites, and can be used to build a detailed profile of your online life. Websites, advertisers, and even malicious actors can use your IP to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Track your location&lt;/li&gt;
&lt;li&gt;Build behavioral profiles&lt;/li&gt;
&lt;li&gt;Target you with ads&lt;/li&gt;
&lt;li&gt;Potentially identify you personally&lt;/li&gt;
&lt;li&gt;Launch targeted attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Public Wi-Fi Is a Security Nightmare
&lt;/h3&gt;

&lt;p&gt;Coffee shops, airports, hotels, public Wi-Fi networks are convenient but incredibly insecure. Without encryption, anyone on the same network can potentially intercept your traffic, steal passwords, or inject malware. A VPN encrypts your connection, making it much harder for attackers to compromise your data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Censorship and Geo-Restrictions
&lt;/h3&gt;

&lt;p&gt;In many countries, governments block access to certain websites and services. Even in free countries, streaming services and websites restrict content based on your location. A VPN can help you access the free and open internet regardless of where you are.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;: if you care about privacy, security, and internet freedom, a VPN isn't optional anymore, it's essential.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enter Mullvad: The Privacy-First VPN 🛡️
&lt;/h2&gt;

&lt;p&gt;So why Mullvad specifically? There are dozens of VPN providers out there, many with flashy marketing and promises of "military-grade encryption" (whatever that means). What makes Mullvad different?&lt;/p&gt;

&lt;h3&gt;
  
  
  The Philosophy Behind Mullvad
&lt;/h3&gt;

&lt;p&gt;Mullvad is a Swedish company that's been around since 2009, and their entire philosophy can be summed up in one sentence: &lt;strong&gt;privacy is a universal right&lt;/strong&gt;. This isn't just marketing speak, it's reflected in every design decision they make.&lt;/p&gt;

&lt;p&gt;From the moment you sign up, it's clear Mullvad operates differently from other VPN providers. No name required. No phone number. You get a randomly generated 16-digit account number, and that's it. That number is your username, your password, your entire identity with Mullvad.&lt;/p&gt;

&lt;p&gt;This isn't just convenient, it's fundamentally more private. If Mullvad doesn't have your personal information, they can't leak it, lose it, or be forced to hand it over to authorities.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Famous Police Raid Incident
&lt;/h3&gt;

&lt;p&gt;Speaking of authorities, here's a story that perfectly illustrates Mullvad's commitment to privacy: in April 2023, Swedish police showed up at Mullvad's office in Gothenburg with a search warrant. They were looking to seize computers containing customer data.&lt;/p&gt;

&lt;p&gt;The result? The police left empty-handed. Why? Because Mullvad literally doesn't store any customer data to seize. There were no logs to hand over, no user information to provide, nothing. This wasn't just Mullvad claiming to have a no-logs policy, this was real-world proof that they actually practice what they preach.&lt;/p&gt;

&lt;p&gt;Think about that for a second. When push came to shove and authorities demanded data, Mullvad had nothing to give them. That's the kind of privacy guarantee you want in a VPN.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Features That Make Mullvad Stand Out ✨
&lt;/h2&gt;

&lt;p&gt;Let's get into the technical stuff. What exactly do you get with Mullvad?&lt;/p&gt;

&lt;h3&gt;
  
  
  Anonymous Account System
&lt;/h3&gt;

&lt;p&gt;As I mentioned, you sign up with just an account number. No email, no personal info, nothing that can tie the account back to you. You can even pay with cash if you want, Mullvad will give you a mailing address, you send cash in an envelope, and they credit your account. They also accept cryptocurrency (Bitcoin and Monero) for additional anonymity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audited No-Logs Policy
&lt;/h3&gt;

&lt;p&gt;Mullvad's no-logs policy isn't just words on a website, it's been independently audited by cybersecurity firm Cure53. They don't log your IP address, browsing activity, DNS requests, bandwidth usage, connection timestamps, or session duration. The only data they keep is aggregate network statistics like total bandwidth across all servers.&lt;/p&gt;

&lt;p&gt;This means that even if someone broke into Mullvad's servers, there would be no individual user data to steal. And as the 2023 police raid proved, even legal authorities can't get data that doesn't exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  RAM-Only Servers
&lt;/h3&gt;

&lt;p&gt;All of Mullvad's servers run on RAM (diskless servers). This means that when a server reboots, all data is wiped. Nothing is written to permanent storage, so there's no way for data to persist after shutdown. This is standard practice for top-tier VPNs now, but Mullvad was an early adopter of this approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  DAITA: Defense Against AI-Guided Traffic Analysis
&lt;/h3&gt;

&lt;p&gt;This is where things get really interesting. Even with VPN encryption, sophisticated AI-powered systems can potentially analyze patterns in your traffic, things like packet timing, size, and frequency, to identify your activities.&lt;/p&gt;

&lt;p&gt;Mullvad developed DAITA (Defense Against AI-guided Traffic Analysis) to counter this. It works by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Padding all packets to uniform sizes to eliminate identifying patterns&lt;/li&gt;
&lt;li&gt;Injecting fake "dummy" traffic to mask real activity&lt;/li&gt;
&lt;li&gt;Using randomized, dynamic configurations that change with each connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very few VPNs offer this level of protection. It's cutting-edge stuff that addresses threats most people don't even know exist yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quantum-Resistant Encryption
&lt;/h3&gt;

&lt;p&gt;Here's something wild: Mullvad uses quantum-resistant encryption on all WireGuard connections. Why does this matter? Because quantum computers, once they become powerful enough, could theoretically break today's encryption standards.&lt;/p&gt;

&lt;p&gt;Is this a threat right now? No. But Mullvad is preparing for the future. When quantum computers do become a real threat, Mullvad users will already be protected. It's the kind of forward-thinking approach that gives me confidence in the service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multihop (Double VPN)
&lt;/h3&gt;

&lt;p&gt;Mullvad's Multihop feature routes your traffic through two VPN servers in different locations and jurisdictions instead of just one. This adds an extra layer of encryption and makes it even harder to track your traffic. Even if one server were somehow compromised, your data would still be protected by the second hop.&lt;/p&gt;

&lt;h3&gt;
  
  
  DNS Content Filtering
&lt;/h3&gt;

&lt;p&gt;Mullvad includes DNS-level blocking for ads, trackers, malware, gambling sites, and adult content. You can toggle these categories on or off depending on what you want to block. It's not as comprehensive as a dedicated ad blocker, but it's a nice built-in feature that improves your browsing experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kill Switch and Lockdown Mode
&lt;/h3&gt;

&lt;p&gt;The kill switch is standard VPN fare, if your VPN connection drops, all internet traffic is automatically blocked until the connection is reestablished. This prevents accidental data leaks.&lt;/p&gt;

&lt;p&gt;But Mullvad takes it further with "Lockdown Mode". When enabled, your device can only connect to the internet when connected to a Mullvad server. Period. It's an extreme measure, but if you need maximum security, it's there.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source and Audited
&lt;/h3&gt;

&lt;p&gt;All of Mullvad's apps are open source (licensed under GPLv3). This means anyone can inspect the code, verify what it does, and ensure there are no backdoors or vulnerabilities. The apps have been independently audited multiple times, most recently in 2023.&lt;/p&gt;

&lt;p&gt;Open source isn't just about transparency, it's about accountability. When code is public, the entire security community can review it and report issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  WireGuard and OpenVPN Protocols
&lt;/h3&gt;

&lt;p&gt;Mullvad supports both WireGuard and OpenVPN, the two most secure and widely trusted VPN protocols. WireGuard is newer, faster, and more efficient, while OpenVPN is battle-tested and reliable. You can choose based on your needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mullvad Browser
&lt;/h3&gt;

&lt;p&gt;Mullvad even developed their own browser in partnership with the Tor Project. Mullvad Browser is based on Firefox and includes privacy-focused settings similar to Tor Browser, but designed to work with VPNs instead of the Tor network. It's free and open source, and you don't even need to be a Mullvad VPN customer to use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Pricing: Simple and Fair 💰
&lt;/h2&gt;

&lt;p&gt;Here's where Mullvad really stands out: &lt;strong&gt;€5 per month, flat rate&lt;/strong&gt;. That's it. No yearly discounts, no special promotions, no complicated pricing tiers. One price for everyone, always.&lt;/p&gt;

&lt;p&gt;At current exchange rates, that's about $5.50 USD per month. Compared to other premium VPNs that can cost $10-15 per month, Mullvad is incredibly affordable.&lt;/p&gt;

&lt;p&gt;And here's the crazy part: Mullvad has never raised their price since launching in 2009. While other companies keep increasing their rates, Mullvad has kept the same €5 price point for over 15 years.&lt;/p&gt;

&lt;p&gt;You can pay month-to-month, or prepay for multiple months if you want (though the per-month price stays the same). They also offer a 14-day money-back guarantee if you pay with regular payment methods, though cash and crypto payments are naturally non-refundable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Payment Options&lt;/strong&gt;: credit card, PayPal, bank wire, Swish (Swedish mobile payments), cash by mail, Bitcoin, and Monero. The variety of anonymous payment options is unmatched in the VPN industry.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Downsides: Let's Be Honest 😬
&lt;/h2&gt;

&lt;p&gt;No service is perfect, and Mullvad has some legitimate weaknesses you should know about:&lt;/p&gt;

&lt;h3&gt;
  
  
  Not Great for Streaming
&lt;/h3&gt;

&lt;p&gt;If your main reason for wanting a VPN is to access Netflix, Disney+, or other streaming services from different regions, Mullvad probably isn't for you. The company explicitly doesn't prioritize unblocking streaming services, their focus is privacy, not entertainment.&lt;/p&gt;

&lt;p&gt;Sometimes it works with streaming sites, sometimes it doesn't. But it's not reliable for this purpose. If streaming is your priority, services like NordVPN or ExpressVPN are better choices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smaller Server Network
&lt;/h3&gt;

&lt;p&gt;Mullvad has around 700+ servers in 49 countries. That's decent, but it pales in comparison to services like NordVPN (6000+ servers in 100+ countries) or Proton VPN (thousands of servers in 120+ countries).&lt;/p&gt;

&lt;p&gt;That said, I haven't had any issues connecting to Mullvad's servers, even during peak times. Quality matters more than quantity, and Mullvad's servers are well-maintained and fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  No Live Chat Support
&lt;/h3&gt;

&lt;p&gt;Mullvad doesn't offer 24/7 live chat support like many competitors. Support is handled via email and their website. Response times are reasonable, but if you're the type who needs instant help, this could be frustrating.&lt;/p&gt;

&lt;p&gt;However, their documentation is excellent, and most common issues are well-covered in their help articles.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Interface Is Minimalist
&lt;/h3&gt;

&lt;p&gt;Some people find Mullvad's apps too simple or "boring." There aren't flashy features, animated maps showing your connection, or hand-holding wizards. The interface is clean and functional, prioritizing usability over aesthetics.&lt;/p&gt;

&lt;p&gt;Personally, I appreciate the minimalism, it means there's less bloat and the app focuses on what matters. But if you prefer polished, feature-rich interfaces, this might feel spartan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limited to 5 Devices
&lt;/h3&gt;

&lt;p&gt;You can connect up to 5 devices simultaneously with one Mullvad account. This is pretty standard for VPNs, but some competitors allow more (or even unlimited) connections. For most individuals or small families, 5 is plenty, but larger households might find it limiting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed Can Vary
&lt;/h3&gt;

&lt;p&gt;VPNs inherently slow down your connection because of the encryption overhead and the extra distance your traffic travels. Mullvad is generally fast, but your experience will vary based on server location, distance, and network conditions.&lt;/p&gt;

&lt;p&gt;In my testing, I've seen anywhere from a 10-30% speed decrease depending on which server I connect to. That's actually pretty good for a VPN, but it's still something to be aware of.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Personal Experience: Why I Made the Switch 💪
&lt;/h2&gt;

&lt;p&gt;So here's my story. I've used various VPNs over the years, some free (terrible idea, by the way), some paid. I was previously using a popular commercial VPN that shall remain nameless, and while it worked fine, I started questioning their logging practices and business model.&lt;/p&gt;

&lt;p&gt;The more I learned about digital privacy and the surveillance economy, the more uncomfortable I became with my VPN provider. When their parent company got acquired by a data analytics firm, that was the final straw. I needed to find a service I could actually trust.&lt;/p&gt;

&lt;p&gt;Enter Mullvad. After researching privacy-focused VPNs, Mullvad kept coming up as the gold standard. The no-logs policy, the anonymous account system, the 2023 police raid incident, everything pointed to a company that genuinely walks the walk on privacy.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Switch Was Surprisingly Easy
&lt;/h3&gt;

&lt;p&gt;Setting up Mullvad was dead simple. I went to their website, clicked "Get Mullvad VPN," and received my 16-digit account number instantly. No forms to fill out, no email verification, nothing. I downloaded the app, entered my account number, and I was connected in under two minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The App Experience
&lt;/h3&gt;

&lt;p&gt;The Mullvad app is clean and straightforward. When you open it, you see a map with server locations and a big connect button. That's basically it. You can select specific servers or let Mullvad choose automatically based on speed and distance.&lt;/p&gt;

&lt;p&gt;The settings menu is where the magic happens, this is where you enable features like DAITA, Multihop, DNS filtering, and obfuscation. There's a lot of power under the hood for advanced users, but casual users can just hit connect and go.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance in Real-World Use
&lt;/h3&gt;

&lt;p&gt;For my day-to-day use, web browsing, development work, using SSH, watching YouTube, downloading files, Mullvad has been great. The connection is stable, speeds are good, and I haven't experienced any frustrating disconnects or timeouts.&lt;/p&gt;

&lt;p&gt;I work with remote servers constantly, and having a reliable VPN that doesn't interfere with SSH connections or add excessive latency is crucial. Mullvad handles this perfectly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Privacy Peace of Mind
&lt;/h3&gt;

&lt;p&gt;The biggest benefit isn't technical, it's psychological. Knowing that my ISP can't see what I'm doing, that my traffic is encrypted end-to-end, that no one is logging my activity, it's genuinely freeing. I no longer worry about being tracked or having my browsing data sold.&lt;/p&gt;

&lt;p&gt;And when I'm working on sensitive open source projects or communicating about security issues, having that extra layer of protection is invaluable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traveling with Mullvad
&lt;/h3&gt;

&lt;p&gt;I recently traveled to a country with more restrictive internet policies, and Mullvad's obfuscation features worked perfectly to bypass the censorship. I was able to access all the websites and services I normally use without any issues. This is exactly why VPNs are so important, they preserve internet freedom regardless of where you are.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Mullvad Aligns with My Values 🌍
&lt;/h2&gt;

&lt;p&gt;Beyond the technical features, Mullvad represents something important: a company that prioritizes user rights over profits.&lt;/p&gt;

&lt;h3&gt;
  
  
  They Could Make More Money
&lt;/h3&gt;

&lt;p&gt;Let's be real, Mullvad could easily charge $10/month and most people would pay it. They could offer tiered pricing with "premium" features. They could bundle in unnecessary services and upsell constantly. But they don't.&lt;/p&gt;

&lt;p&gt;They charge a fair price and treat all users equally. There are no "elite" plans or artificial limitations designed to push you toward more expensive tiers.&lt;/p&gt;

&lt;h3&gt;
  
  
  They're Transparent
&lt;/h3&gt;

&lt;p&gt;Mullvad doesn't hide behind vague marketing claims. Their privacy policy is clear and detailed. Their technology is open source. Their infrastructure is documented. When Swedish police showed up, they published a blog post about it.&lt;/p&gt;

&lt;p&gt;This level of transparency is rare in the VPN industry, where many providers make big claims about privacy while operating under murky business structures.&lt;/p&gt;

&lt;h3&gt;
  
  
  They Contribute to the Ecosystem
&lt;/h3&gt;

&lt;p&gt;Mullvad was an early adopter and financial supporter of WireGuard, helping to develop and promote what's now the gold standard VPN protocol. They developed DAITA and made it available to users at no extra cost. They partnered with the Tor Project to create Mullvad Browser.&lt;/p&gt;

&lt;p&gt;They're not just selling a service, they're actively improving the privacy ecosystem for everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  They Practice What They Preach
&lt;/h3&gt;

&lt;p&gt;The 2023 police raid wasn't just good PR, it was validation that Mullvad actually follows their own policies. When authorities came knocking, there was nothing to give them. That's the difference between marketing talk and operational reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Should Use Mullvad? 🎯
&lt;/h2&gt;

&lt;p&gt;Mullvad isn't for everyone, and that's okay. Here's who will love it:&lt;/p&gt;

&lt;h3&gt;
  
  
  Privacy-Conscious Users
&lt;/h3&gt;

&lt;p&gt;If protecting your privacy is your top priority, Mullvad is probably your best option. The anonymous account system, proven no-logs policy, and advanced privacy features like DAITA make it the gold standard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tech-Savvy Users
&lt;/h3&gt;

&lt;p&gt;Mullvad's minimalist interface and advanced features appeal to users who understand VPN technology and want granular control. If terms like "WireGuard," "split tunneling," and "obfuscation" make sense to you, you'll appreciate Mullvad.&lt;/p&gt;

&lt;h3&gt;
  
  
  Journalists and Activists
&lt;/h3&gt;

&lt;p&gt;If you work with sensitive information or in regions with internet censorship, Mullvad's strong encryption, obfuscation features, and proven resistance to legal pressure make it an excellent choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developers and Open-Source Enthusiasts
&lt;/h3&gt;

&lt;p&gt;As someone who maintains open-source projects, I appreciate that Mullvad's entire software stack is open source. You can audit the code, verify security claims, and contribute improvements if you want.&lt;/p&gt;

&lt;h3&gt;
  
  
  Budget-Conscious Users
&lt;/h3&gt;

&lt;p&gt;At €5/month with no long-term commitment required, Mullvad is one of the most affordable premium VPNs. You're not locked into a yearly plan, and the price never increases.&lt;/p&gt;

&lt;h3&gt;
  
  
  Who Shouldn't Use Mullvad?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streaming enthusiasts&lt;/strong&gt;: If your main goal is accessing geo-restricted content, look elsewhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-technical users wanting hand-holding&lt;/strong&gt;: Mullvad assumes you know what you're doing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People needing lots of simultaneous connections&lt;/strong&gt;: The 5-device limit might be restrictive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Users requiring instant customer support&lt;/strong&gt;: No live chat means waiting for email responses&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts: Privacy Matters 🌟
&lt;/h2&gt;

&lt;p&gt;Switching to Mullvad VPN has been one of the best decisions I've made for my digital privacy this year. It's not perfect, no VPN is but it represents a rare thing in today's internet: a company that genuinely prioritizes user privacy over everything else.&lt;/p&gt;

&lt;p&gt;In an age where every company wants to track you, profile you, and monetize your data, Mullvad stands as a refreshing alternative. They don't need to know who you are. They don't want to collect your data. They just want to provide a secure, private internet connection, and they do it exceptionally well.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Bigger Picture
&lt;/h3&gt;

&lt;p&gt;Using a VPN isn't just about hiding your browsing history from your ISP, it's about taking a stand for digital rights. It's about saying that your online life belongs to you, not to corporations or governments. It's about preserving the open, free internet that many of us grew up with.&lt;/p&gt;

&lt;p&gt;Every time you connect to Mullvad, you're voting with your wallet for a privacy-first internet. You're supporting a company that refuses to compromise on user rights, even when it would be more profitable to do so.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is It Worth It?
&lt;/h3&gt;

&lt;p&gt;For me, absolutely. The peace of mind alone is worth €5 per month. Knowing that my ISP can't build a profile of my online activities, that my traffic is encrypted, that there are no logs to leak or hand over to authorities, it's invaluable.&lt;/p&gt;

&lt;p&gt;If you care about privacy, if you're tired of being tracked and monitored, if you want to support a company that actually practices what it preaches, give Mullvad a try. The switch is easy, the price is fair, and the privacy benefits are real.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion 🚀
&lt;/h2&gt;

&lt;p&gt;If this article has convinced you to take your privacy seriously, here's what you can do:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Go to mullvad.net&lt;/strong&gt; and sign up, it takes less than a minute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose your payment method&lt;/strong&gt;, cryptocurrency for maximum privacy, or regular payment for convenience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download the app&lt;/strong&gt; for your platform&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect and start browsing privately&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It really is that simple. No complicated setup, no technical knowledge required, just instant privacy protection.&lt;/p&gt;

&lt;p&gt;And remember: a VPN is just one part of a privacy-focused approach to the internet. Combine it with privacy-respecting browsers, encrypted messaging apps, and good security practices for maximum protection.&lt;/p&gt;

&lt;p&gt;Privacy is a right, not a privilege. Tools like Mullvad help us exercise that right in an increasingly surveilled world.&lt;/p&gt;

&lt;p&gt;Happy browsing! ✨&lt;/p&gt;




&lt;p&gt;Hi 👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my links and to check out Domenico Tenace Open Labs for my open-source projects! 🫰🏻&lt;/p&gt;

&lt;p&gt;🌲 Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;br&gt;
🐙 Domenico Tenace Open Labs: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;https://github.com/Domenico-Tenace-Open-Labs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for more articles 👇&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work, you can support me with a small donation. I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&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%2Fb5vrzbmybu3q0sb5bzs1.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>opensource</category>
      <category>browser</category>
      <category>networking</category>
    </item>
    <item>
      <title>Google Antigravity vs GitHub Copilot: Why I'm Team Antigravity Now 💡</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Fri, 23 Jan 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/google-antigravity-vs-github-copilot-why-im-team-antigravity-now-fco</link>
      <guid>https://dev.to/playfulprogramming/google-antigravity-vs-github-copilot-why-im-team-antigravity-now-fco</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone 👋&lt;/p&gt;

&lt;p&gt;If you've been following the AI coding tools space lately, you've probably noticed things are getting wild. We went from "whoa, AI can autocomplete my code!" to "wait, AI can literally build entire features while I grab coffee?" in what feels like about five minutes.&lt;/p&gt;

&lt;p&gt;Today I want to talk about two tools that represent this evolution: &lt;strong&gt;GitHub Copilot&lt;/strong&gt; and &lt;strong&gt;Google Antigravity&lt;/strong&gt;. I've used both extensively, and after recently completing a major refactoring project with Antigravity (which I wrote about &lt;a href="https://dev.to/this-is-learning/my-experience-with-google-antigravity-how-i-refactored-easy-kit-utils-with-ai-agents-2e54"&gt;here&lt;/a&gt;), I have some thoughts on how they compare and why one has completely changed how I work.&lt;/p&gt;

&lt;p&gt;Spoiler alert: I'm firmly in Team Antigravity now, but it's not because Copilot is bad, it's because they're solving fundamentally different problems. Let me break it down.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fundamental Difference: Assistant vs. Agent 🤔
&lt;/h2&gt;

&lt;p&gt;Before we get into features and comparisons, let's establish what we're actually talking about here, because calling both of these "AI coding tools" is like calling a bicycle and a self-driving car both "transportation."&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Copilot: Your Smart Coding Assistant
&lt;/h3&gt;

&lt;p&gt;Think of Copilot as the world's most capable autocomplete system. It's like having a really talented developer sitting next to you who can predict what you're about to type and suggest completions. It watches what you're doing, understands the context of your code, and offers suggestions in real-time.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You start typing a function&lt;/li&gt;
&lt;li&gt;Copilot suggests how to complete it&lt;/li&gt;
&lt;li&gt;You press Tab to accept (or keep typing to ignore)&lt;/li&gt;
&lt;li&gt;Repeat&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It's reactive, it's fast, and it's incredibly good at what it does. Copilot accelerates your existing workflow without fundamentally changing it. You're still the one driving, Copilot just makes the driving smoother and faster.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Antigravity: Your Autonomous Development Partner
&lt;/h3&gt;

&lt;p&gt;Antigravity is completely different. It's not trying to predict your next line of code, it's trying to handle entire tasks for you. You don't give it hints about what to write; you give it goals about what to achieve.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You describe a task: "Refactor all string utilities to use modern ES6 syntax"&lt;/li&gt;
&lt;li&gt;The agent creates a plan breaking down the task into steps&lt;/li&gt;
&lt;li&gt;You review and approve the plan&lt;/li&gt;
&lt;li&gt;The agent executes: editing multiple files, updating tests, running validations&lt;/li&gt;
&lt;li&gt;You review the results and provide feedback&lt;/li&gt;
&lt;li&gt;The agent iterates until the task is complete&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is proactive autonomy. You're not coding line-by-line anymore, you're architecting solutions and delegating implementation to AI agents. It's less "pair programming" and more "managing a really fast junior developer."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key insight&lt;/strong&gt;: Copilot makes you code faster. Antigravity makes you code less. These are fundamentally different value propositions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Breaking Down the Key Differences 💡
&lt;/h2&gt;

&lt;p&gt;Let's get into the specifics of how these tools differ across various dimensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Autonomy Level
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: reactive autonomy. It suggests code based on what you're actively working on, but you make all the decisions. Every suggestion requires your approval (via Tab). It never makes changes without explicit confirmation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: proactive autonomy. Agents can work independently on tasks, making decisions about file edits, command execution, and implementation approach. You set the goal; the agent figures out how to achieve it. You can configure different autonomy levels (review-driven, agent-assisted, agent-driven), but even in the most conservative mode, it's doing more than Copilot ever attempts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: for simple coding tasks where you know exactly what you want, Copilot's reactive approach is faster. For complex refactoring or feature implementation where the "how" is tedious but the "what" is clear, Antigravity's autonomy is game-changing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Multi-File Operations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: works primarily on the file you have open. It can reference other files in your workspace for context, but it doesn't autonomously edit multiple files at once. If you need to refactor something across 20 files, you're opening each one and letting Copilot help with each individually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: designed for multi-file operations. An agent can read your entire codebase, identify all the files that need changes, and propose modifications across all of them in a single workflow. It maintains consistency and applies patterns across your entire project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: this is where Antigravity absolutely crushes Copilot. When I refactored Easy Kit Utils, the agent touched dozens of files, utility functions, tests, documentation, type definitions, maintaining consistency throughout. Doing this with Copilot would have meant manually opening each file and repeating similar instructions. With Antigravity, I described the goal once and reviewed the results.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Planning and Context
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: understands the immediate context of what you're writing. It's excellent at learning patterns and suggesting code that fits your style. But it doesn't "plan" in the traditional sense, it predicts the next logical tokens based on what came before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: actually creates plans. Before making changes, agents break down complex tasks into steps, show you the approach, and let you approve or adjust. This planning phase is huge, it means you can course correct before any code is written.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: the planning capability makes Antigravity feel less like a tool and more like a collaborator. When the agent proposed its refactoring plan for Easy Kit Utils, I could immediately see it had understood the scope and could suggest adjustments before any work began. This saves tons of time compared to discovering implementation issues after the fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Browser Integration and Testing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: doesn't interact with browsers or test your code's visual output. It's purely code-focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: includes an integrated browser where agents can actually test web applications, interact with DOM elements, and verify functionality. The agent doesn't just write code, it validates that the code works correctly by actually running it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: this is wild and something I didn't appreciate until I used it. The agent can spin up a test environment, interact with UI elements, catch bugs visually, and iterate on fixes. It's like having a QA engineer and a developer in one.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Multi-Agent Workflows
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: single-threaded. One suggestion at a time, one task at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: multi-agent orchestration. You can have multiple agents working on different parts of your codebase simultaneously. One agent refactors utilities while another updates documentation and a third improves test coverage all in parallel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: I haven't fully explored this yet, but the potential is obvious. For large projects, being able to parallelize different work streams with AI agents is powerful. It's like having a team instead of a single assistant.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Integration and Ecosystem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: deep integration with GitHub's ecosystem. Pull request summaries, issue analysis, commit message generation if you live in GitHub, Copilot fits seamlessly. Also works with VS Code, JetBrains, Vim, Neovim, and more. Massive extension ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: built on VS Code's foundation, so the interface is familiar, but it's a standalone IDE rather than an extension. This means you lose access to some VS Code extensions, but you gain Antigravity's agent-first architecture. Works with any Git repository, not just GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: if you're heavily invested in the VS Code extension ecosystem or need specific IDE features, losing that might hurt. But Antigravity's agent capabilities more than compensate for me. The trade-off is worth it for the kinds of tasks I'm tackling.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Learning Curve
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: almost zero learning curve. Install it, and it just starts working. The ghost text appears, you press Tab, done. You're productive immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: steeper learning curve. You need to understand different autonomy modes, how to structure prompts for agents, how the Agent Manager works, and how to effectively review multi-file changes. There's more to learn before you're using it optimally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: this is Copilot's biggest advantage it's dead simple. Antigravity requires investment to master. But once you get over that initial hump, the productivity gains are substantial.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Speed and Latency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: extremely fast. Suggestions appear almost instantly. The inline experience feels native and responsive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: slower by nature. Agents need to plan, reason, execute, and validate. Even simple tasks take more time than Copilot's instant suggestions. You're trading immediacy for thoroughness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: for quick edits and rapid development, Copilot wins on speed. But for complex tasks that would take you an hour to do manually, waiting 5 minutes for an agent to handle it is a massive time savings. Different use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Enterprise Readiness
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Copilot&lt;/strong&gt;: SOC 2 certified, ISO 27001 compliant, IP indemnification, zero-data-retention guarantees, audit logs, admin controls. It's enterprise-ready with proper governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antigravity&lt;/strong&gt;: in public preview. Documentation on enterprise security controls, data handling, compliance certifications, and privacy policies is limited or incomplete. Not ready for enterprise procurement yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: if you work at a large company with strict compliance requirements, Copilot is currently the only viable option. Antigravity needs to mature in this area before enterprises can adopt it seriously.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Copilot Still Wins 🏆
&lt;/h2&gt;

&lt;p&gt;Let me be clear: GitHub Copilot is an incredible tool, and there are scenarios where it's still the better choice:&lt;/p&gt;

&lt;h3&gt;
  
  
  Everyday Coding Velocity
&lt;/h3&gt;

&lt;p&gt;For normal day-to-day development writing functions, adding features, fixing bugs Copilot is faster and more efficient. The inline suggestions are instant, the context is always right, and it doesn't interrupt your flow.&lt;/p&gt;

&lt;p&gt;If you're building a feature and you know exactly how to implement it, Copilot accelerates the mechanical work of typing without adding overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  IDE Flexibility
&lt;/h3&gt;

&lt;p&gt;Copilot works in VS Code, JetBrains IDEs, Vim, Neovim, Visual Studio, Xcode basically everywhere. If you're not willing to switch IDEs or you rely on specific tools, Copilot fits into your existing setup.&lt;/p&gt;

&lt;p&gt;Antigravity requires using Google's IDE, which might not be acceptable if you have a customized development environment you love.&lt;/p&gt;

&lt;h3&gt;
  
  
  Learning Resources and Community
&lt;/h3&gt;

&lt;p&gt;Copilot has been around longer and has a massive community. If you run into issues, there are tons of Stack Overflow answers, Reddit threads, and YouTube tutorials. The documentation is comprehensive.&lt;/p&gt;

&lt;p&gt;Antigravity is new, so the community is smaller and resources are limited. You're more likely to encounter undocumented behavior or hit edge cases that no one has solved yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enterprise Compliance
&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, if you need SOC 2 certification, audit trails, IP guarantees, and established data privacy policies, Copilot is the mature choice. Antigravity will get there eventually, but it's not there yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Specific GitHub Integration
&lt;/h3&gt;

&lt;p&gt;If you heavily use GitHub-specific features like having Copilot generate commit messages from GitHub's API, summarize pull requests, or analyze issues Copilot's tight integration is valuable.&lt;/p&gt;

&lt;p&gt;Antigravity works with Git but doesn't have these GitHub native features.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I Prefer Antigravity Now 💪
&lt;/h2&gt;

&lt;p&gt;So with all those advantages Copilot has, why did I switch to Antigravity? Here's my honest reasoning:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Nature of My Work Changed
&lt;/h3&gt;

&lt;p&gt;I spend a lot of time maintaining open source libraries like &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/easy-kit-utils" rel="noopener noreferrer"&gt;Easy Kit Utils&lt;/a&gt;. This involves large-scale refactoring, updating documentation across multiple files, modernizing syntax patterns, and ensuring consistency throughout the codebase.&lt;/p&gt;

&lt;p&gt;These tasks are perfect for Antigravity's agent-driven approach. I don't need suggestions for the next line of code I need entire sections of the codebase refactored according to modern best practices.&lt;/p&gt;

&lt;p&gt;With Copilot, I'd open file after file, manually applying similar changes and hoping I maintained consistency. With Antigravity, I describe the goal, review the plan, and let the agent handle the tedious execution across dozens of files.&lt;/p&gt;

&lt;h3&gt;
  
  
  I Value Thinking Over Typing
&lt;/h3&gt;

&lt;p&gt;Here's something I realized while using Antigravity: I don't enjoy typing code. I enjoy solving problems and architecting solutions. The actual mechanical work of writing syntax is the least interesting part of development for me.&lt;/p&gt;

&lt;p&gt;Antigravity lets me operate at a higher level of abstraction. I think about what the code should do, not how to type it out. This feels more aligned with how I want to work as a developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-File Consistency Is Crucial
&lt;/h3&gt;

&lt;p&gt;When you're maintaining libraries, consistency is everything. If you refactor one utility function to use modern syntax, you need to refactor all of them the same way. If you update one test file's structure, you should update all test files similarly.&lt;/p&gt;

&lt;p&gt;Antigravity's ability to understand patterns and apply them across an entire codebase is invaluable. It doesn't just make changes it makes consistent changes that follow the established patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Planning Phase Saves Massive Time
&lt;/h3&gt;

&lt;p&gt;I can't overstate how useful the planning phase is. When I asked Antigravity to refactor Easy Kit Utils, the agent created a detailed plan showing exactly what it would change and why. I could review this plan, suggest adjustments, and ensure we were aligned before any code was touched.&lt;/p&gt;

&lt;p&gt;This is so much better than discovering issues after the fact. It's like having code reviews before the code is even written.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser-Based Validation Is a Game Changer
&lt;/h3&gt;

&lt;p&gt;Being able to have the agent actually test changes in a browser environment is wild. For documentation examples and test cases, the agent would render the page, verify functionality, and catch issues I would have missed.&lt;/p&gt;

&lt;p&gt;This closed-loop development write code, test it, validate it, fix issues all happening autonomously is powerful. It means higher quality output with less manual QA.&lt;/p&gt;

&lt;h3&gt;
  
  
  I'm Willing to Trade Speed for Quality
&lt;/h3&gt;

&lt;p&gt;Yes, Antigravity is slower than Copilot for simple tasks. But the output quality is often higher because the agent is thinking through the problem, planning the approach, and validating the results.&lt;/p&gt;

&lt;p&gt;I'd rather wait 5 minutes for a thoroughly planned and tested solution than get instant suggestions that require significant manual cleanup and testing.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Future Is Agentic
&lt;/h3&gt;

&lt;p&gt;This is the big one: I believe agent-based development is the future. Right now, Antigravity is early and rough around the edges, but the paradigm it represents delegating complex tasks to autonomous AI agents is where we're heading.&lt;/p&gt;

&lt;p&gt;By investing time in learning Antigravity now, I'm positioning myself for the next era of development. Copilot represents the peak of the "AI assistant" paradigm, but agents are the next evolution.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Real-World Experience: The Easy Kit Utils Refactoring 🔧
&lt;/h2&gt;

&lt;p&gt;I detailed this extensively in &lt;a href="https://dev.to/this-is-learning/my-experience-with-google-antigravity-how-i-refactored-easy-kit-utils-with-ai-agents-2e54"&gt;my previous article&lt;/a&gt;, but here's the short version:&lt;/p&gt;

&lt;p&gt;I used Antigravity to completely refactor Easy Kit Utils, a JavaScript utility library. The project needed modernization: updating to ES6+ syntax, adding TypeScript definitions, improving test coverage, and cleaning up accumulated technical debt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Copilot&lt;/strong&gt;, this would have looked like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open each utility file individually&lt;/li&gt;
&lt;li&gt;Manually refactor each function while Copilot suggests completions&lt;/li&gt;
&lt;li&gt;Open each test file and update tests with Copilot's help&lt;/li&gt;
&lt;li&gt;Open documentation files and update examples&lt;/li&gt;
&lt;li&gt;Hope I maintained consistency across all changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estimated time: 1-2 weeks of focused work&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Antigravity&lt;/strong&gt;, it looked like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Describe the overall refactoring goals to the agent&lt;/li&gt;
&lt;li&gt;Review the comprehensive plan the agent created&lt;/li&gt;
&lt;li&gt;Approve execution and watch it refactor across dozens of files&lt;/li&gt;
&lt;li&gt;Review the changes, provide feedback, iterate as needed&lt;/li&gt;
&lt;li&gt;Verify the updated tests and documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actual time: 2-3 days, with most of that being review rather than coding&lt;/p&gt;

&lt;p&gt;The agent maintained consistency, learned the patterns I preferred, and applied them uniformly across the codebase. It handled the tedious mechanical work while I focused on architecture and validation.&lt;/p&gt;

&lt;p&gt;This isn't to say it was perfect I had to roll back some changes, fix edge cases the agent missed, and adjust implementations to match my style. But the overall productivity gain was massive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bottom line&lt;/strong&gt;: For this kind of large-scale refactoring work, Antigravity was transformative. Copilot would have made each individual file easier to update, but Antigravity handled the entire project coherently.&lt;/p&gt;




&lt;h2&gt;
  
  
  They're Not Really Competitors 🤝
&lt;/h2&gt;

&lt;p&gt;Here's the thing: framing this as "Antigravity vs. Copilot" is kind of misleading. They're not really competing for the same use case.&lt;/p&gt;

&lt;p&gt;It's more accurate to say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Copilot&lt;/strong&gt; is the best tool for daily coding, inline suggestions, and accelerating your normal workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity&lt;/strong&gt; is the best tool for complex multi-file tasks, large refactoring, and delegating entire features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could actually use both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use Copilot in VS Code for your everyday development&lt;/li&gt;
&lt;li&gt;Use Antigravity when you have a complex project that needs significant work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They complement each other rather than replace each other.&lt;/p&gt;

&lt;p&gt;That said, I've personally decided to go all-in on Antigravity because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Most of my work lately is the kind of complex tasks Antigravity excels at&lt;/li&gt;
&lt;li&gt;I want to get better at agent-driven development workflows&lt;/li&gt;
&lt;li&gt;The future is heading in this direction anyway&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But I totally understand developers who stick with Copilot, or who use both tools for different scenarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  What About the Other Players? 👀
&lt;/h2&gt;

&lt;p&gt;Copilot and Antigravity aren't the only AI coding tools out there. How do they fit into the broader ecosystem?&lt;/p&gt;

&lt;h3&gt;
  
  
  Cursor
&lt;/h3&gt;

&lt;p&gt;Cursor is probably the closest to Antigravity in terms of agent-like capabilities. It's also building an agent-first IDE with autonomous task execution. The main difference is Cursor is a commercial product with established pricing ($20/month), while Antigravity is currently free in preview.&lt;/p&gt;

&lt;p&gt;Many developers love Cursor, and it's a solid alternative to Antigravity. The choice between them often comes down to preference for Google's or Cursor's approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Windsurf
&lt;/h3&gt;

&lt;p&gt;Another emerging player in the agentic IDE space. Similar agent-driven development paradigm to Antigravity and Cursor. Still relatively new, so less proven in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cody (by Sourcegraph)
&lt;/h3&gt;

&lt;p&gt;Focuses heavily on codebase context and search. Great for understanding large codebases and navigating unfamiliar projects. Different value proposition from Antigravity's autonomous execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude Code
&lt;/h3&gt;

&lt;p&gt;Anthropic's command-line tool for agentic coding. Delegate tasks directly from the terminal. Interesting approach but more technical than GUI-based tools like Antigravity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: The agentic IDE space is heating up fast. Antigravity, Cursor, and Windsurf are all pushing toward similar visions of AI-native development. Competition is good it'll drive innovation and better tools for everyone.&lt;/p&gt;




&lt;h2&gt;
  
  
  Should You Make the Switch? 🎯
&lt;/h2&gt;

&lt;p&gt;Ultimately, the decision comes down to your specific needs and work style. Here's my guidance:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stick with Copilot if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're happy with your current development velocity&lt;/li&gt;
&lt;li&gt;You prefer tools that accelerate your existing workflow without changing it&lt;/li&gt;
&lt;li&gt;You need enterprise compliance and established security guarantees&lt;/li&gt;
&lt;li&gt;You rely heavily on GitHub specific integrations&lt;/li&gt;
&lt;li&gt;You want the lowest learning curve possible&lt;/li&gt;
&lt;li&gt;Your work is mostly straightforward feature development where you know the implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try Antigravity if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You spend a lot of time on refactoring and maintenance&lt;/li&gt;
&lt;li&gt;You're maintaining open source libraries or large codebases&lt;/li&gt;
&lt;li&gt;You want to experiment with agent-driven development&lt;/li&gt;
&lt;li&gt;You're comfortable with early-stage tools that might have rough edges&lt;/li&gt;
&lt;li&gt;You enjoy operating at a higher level of abstraction&lt;/li&gt;
&lt;li&gt;You're willing to invest time learning new workflows for long-term productivity gains&lt;/li&gt;
&lt;li&gt;Price is a concern (it's currently free)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use both if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want Copilot's speed for daily work AND Antigravity's power for complex tasks&lt;/li&gt;
&lt;li&gt;You're exploring different AI development paradigms&lt;/li&gt;
&lt;li&gt;You can afford the time investment to learn both tools&lt;/li&gt;
&lt;li&gt;You work on varied projects with different needs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Want to Hear From You 💬
&lt;/h2&gt;

&lt;p&gt;Here's where you come in! I've shared my experience and perspective, but the AI coding tools landscape is evolving so fast that every developer's experience matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you've used Copilot, Antigravity, or both&lt;/strong&gt;, I want to hear from you in the comments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which tool do you prefer and why?&lt;/li&gt;
&lt;li&gt;What kinds of tasks do you use each for?&lt;/li&gt;
&lt;li&gt;Have you found workflows or use cases I haven't mentioned?&lt;/li&gt;
&lt;li&gt;What are the biggest pain points with each tool?&lt;/li&gt;
&lt;li&gt;How has your productivity changed since adopting AI coding assistants?&lt;/li&gt;
&lt;li&gt;Are you using any other AI coding tools (Cursor, Windsurf, etc.) and how do they compare?&lt;/li&gt;
&lt;li&gt;Do you think agent-driven development is the future, or will assistant-style tools remain dominant?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you're new to AI coding tools and trying to decide which to try first, drop your questions below! The community here is great about sharing experiences and helping others navigate these decisions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seriously, drop a comment&lt;/strong&gt;. These tools are all evolving rapidly, and community feedback shapes where they go next. Plus, I genuinely want to know if my experience aligns with others or if I'm an outlier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The AI coding revolution is happening right now, in real-time. We're witnessing a shift from "AI helps you code" to "AI codes for you," and it's both exciting and a little unnerving.&lt;/p&gt;

&lt;p&gt;GitHub Copilot pioneered the first wave making developers more productive by augmenting their coding with intelligent suggestions. It's a mature, reliable, enterprise-ready tool that millions of developers use daily.&lt;/p&gt;

&lt;p&gt;Google Antigravity represents the next wave autonomous agents that can handle complex tasks end-to-end with minimal human intervention. It's early, rough, and experimental, but it hints at a future where developers spend more time architecting and less time implementing.&lt;/p&gt;

&lt;p&gt;Neither is "better" in an absolute sense. They excel at different things. But for the kind of work I'm doing maintaining open source projects, tackling large refactoring tasks, and building sustainable codebases Antigravity has become my go-to tool.&lt;/p&gt;

&lt;p&gt;That might change as the tools evolve. Copilot is getting more agentic features (Copilot Agents), and Antigravity will mature and improve. The competition between these platforms will benefit all of us as developers.&lt;/p&gt;

&lt;p&gt;For now, I'm Team Antigravity, but I'm keeping an eye on the whole ecosystem. This is an incredibly exciting time to be a developer. The tools we have access to today would have seemed like science fiction just a few years ago.&lt;/p&gt;

&lt;p&gt;So experiment, explore, and find what works for you. And let me know in the comments what you discover!&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;




&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>antigravity</category>
      <category>githubcopilot</category>
      <category>programming</category>
    </item>
    <item>
      <title>My Experience with Google Antigravity: How I Refactored Easy Kit Utils with AI Agents 🚀</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Tue, 06 Jan 2026 23:00:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/my-experience-with-google-antigravity-how-i-refactored-easy-kit-utils-with-ai-agents-2e54</link>
      <guid>https://dev.to/playfulprogramming/my-experience-with-google-antigravity-how-i-refactored-easy-kit-utils-with-ai-agents-2e54</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;So, Google just dropped something pretty wild into the dev tools arena: &lt;strong&gt;Google Antigravity&lt;/strong&gt;, their new AI-native IDE powered by Gemini 3. And honestly? It's been a game-changer for how I approach coding. I recently used it to completely refactor &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/easy-kit-utils" rel="noopener noreferrer"&gt;Easy Kit Utils&lt;/a&gt;, and I wanted to share my thoughts on this new tool that's got everyone talking.&lt;/p&gt;

&lt;p&gt;If you've been following the AI coding assistant space, you've probably heard the buzz around Cursor, Windsurf, and other tools. Well, Google decided to enter the chat with a different approach: instead of just assisting you while you code, Antigravity lets autonomous agents do the heavy lifting while you act more like an architect than a bricklayer. &lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Is Google Antigravity? 🤔
&lt;/h2&gt;

&lt;p&gt;First things first, let's clear up what we're dealing with here. Antigravity isn't just another VS Code fork with AI bolted on. It's built from the ground up as an "agent-first" development platform. What does that mean in practice?&lt;/p&gt;

&lt;p&gt;Instead of having an AI chatbot sitting in a sidebar suggesting code completions, Antigravity gives you autonomous agents that can work across three main surfaces: the code editor, the terminal, and an integrated browser. These agents don't just write code snippets,they plan entire workflows, execute complex tasks, and even validate their own work by testing in the browser.&lt;/p&gt;

&lt;p&gt;The core concept Google is pushing is what they call "vibe coding." The idea is simple but powerful: describe what you want in natural language, and the agent figures out the implementation details. No more wrestling with syntax or hunting through documentation for that one specific method you need. Just tell it what you're trying to achieve, and it handles the rest.&lt;/p&gt;

&lt;p&gt;When you launch Antigravity, you're not greeted with a file tree like traditional IDEs. Instead, you see the &lt;strong&gt;Agent Manager&lt;/strong&gt;, basically a mission control dashboard where you can spawn multiple agents working on different tasks simultaneously. It's like having a team of developers working in parallel, except they're all AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Strengths: Where Antigravity Really Shines ✨
&lt;/h2&gt;

&lt;p&gt;After spending significant time with Antigravity while refactoring Easy Kit Utils, here are the areas where it genuinely impressed me:&lt;/p&gt;

&lt;h3&gt;
  
  
  Autonomous Task Execution
&lt;/h3&gt;

&lt;p&gt;This is the big one. When I started the Easy Kit Utils refactoring, I could give Antigravity high-level objectives like "refactor the string utilities to use modern ES6+ syntax and add comprehensive type definitions." The agent would then break this down into subtasks, create an implementation plan, and execute it. I wasn't sitting there writing every line, I was reviewing and approving the agent's work.&lt;/p&gt;

&lt;p&gt;The agent would read through existing code, understand the patterns, make changes across multiple files, and even update related tests. It felt less like coding and more like managing a very capable junior developer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multimodal Understanding
&lt;/h3&gt;

&lt;p&gt;One thing that caught me off guard was how well it handles visual inputs. I could literally show it screenshots of design mockups or UI components and say "make it look like this" and it would understand the aesthetic and implement it. This isn't unique to Antigravity (Gemini 3 itself has strong multimodal capabilities), but having it integrated directly into the IDE workflow is surprisingly useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Browser Integration
&lt;/h3&gt;

&lt;p&gt;The built-in browser integration is clutch. The agent can actually test web applications it builds, interact with DOM elements, and verify that everything works as expected. During my refactoring work, when I was updating documentation examples, the agent could spin up a test page, verify the utilities worked correctly, and even catch edge cases I hadn't thought about.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planning and Reasoning
&lt;/h3&gt;

&lt;p&gt;Gemini 3's planning capabilities are legitimately good. When tackling complex refactoring tasks, the agent would create a step-by-step plan before making any changes. This meant I could review the approach first and make adjustments before any code was touched. It's like having a pair programming session where your partner thinks through the problem before diving in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-Agent Workflows
&lt;/h3&gt;

&lt;p&gt;The inbox system for managing multiple agents is actually pretty elegant. While one agent was working on refactoring utility functions, I could spawn another to update documentation, and a third to improve test coverage. They all work independently and ping you when they need input or approval.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Weaknesses: Where It Falls Short 🤷
&lt;/h2&gt;

&lt;p&gt;Nothing's perfect, and Antigravity definitely has its rough edges. Here's what frustrated me:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Learning Curve Is Real
&lt;/h3&gt;

&lt;p&gt;Despite Google's marketing about "natural language is the only syntax you need" there's still a learning curve. Understanding how to structure prompts for optimal results, knowing when to use agent-driven vs. review-driven modes, and managing the Agent Manager effectively all of this takes time to figure out.&lt;/p&gt;

&lt;p&gt;The interface is overwhelming at first. There's the Agent Manager, the editor, the browser panel, various settings for controlling agent autonomy... it's a lot to take in. I spent my first hour just trying to understand the basic workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Can Be Inconsistent
&lt;/h3&gt;

&lt;p&gt;Gemini 3 Pro is subject to rate limits and quotas, especially in the free preview period. I hit multiple "model provider overload" errors during peak usage times. When you're in flow state and the agent suddenly stops working because of API limits, it kills your momentum.&lt;/p&gt;

&lt;p&gt;There's also latency. Waiting for an agent to plan, execute, and validate can sometimes feel slower than just writing the code yourself, especially for simple tasks. The trade-off is only worth it for more complex operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Over-Automation Can Be Dangerous
&lt;/h3&gt;

&lt;p&gt;The agent-driven mode is powerful but also risky. If you're not careful, the agent can make changes you didn't intend. I had a few instances where it refactored code in ways that technically worked but didn't align with the patterns I wanted to maintain in Easy Kit Utils.&lt;/p&gt;

&lt;p&gt;The review-driven mode is safer but feels tedious, you're constantly clicking "approve" for every little action. Finding the right balance with agent-assisted mode took some trial and error.&lt;/p&gt;

&lt;h3&gt;
  
  
  Still Makes Mistakes
&lt;/h3&gt;

&lt;p&gt;Let's be honest: the agent isn't infallible. It still generates code with bugs, makes questionable architectural decisions, and sometimes misunderstands what you're asking for. You absolutely need to review everything it produces. It's like working with a capable junior dev who needs oversight, not a senior engineer you can fully trust.&lt;/p&gt;

&lt;p&gt;I found subtle issues in type definitions, incorrect error handling in edge cases, and occasionally methods that didn't follow the existing conventions of the codebase. These are all fixable, but it means you can't just set it and forget it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Limited Third-Party Integration
&lt;/h3&gt;

&lt;p&gt;Unlike Cursor which builds on VS Code's massive extension ecosystem, Antigravity is more of a walled garden. You can't just install your favorite VS Code extensions. The tooling is what Google provides, and while it's good, you might miss your preferred linters, formatters, or other productivity tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Real-World Experience: Refactoring Easy Kit Utils 💪
&lt;/h2&gt;

&lt;p&gt;Now for the practical stuff. I used Antigravity to refactor Easy Kit Utils, which is a JavaScript utility library I maintain under Domenico Tenace Open Labs. The library needed modernization, updating to newer JS syntax, adding TypeScript definitions, improving test coverage, and generally cleaning up accumulated technical debt.&lt;/p&gt;

&lt;p&gt;Here's how it went down:&lt;/p&gt;

&lt;p&gt;I started by giving the agent access to the repository and describing the overall goals. The agent read through all the files, understood the structure, and proposed a refactoring plan broken into logical phases. This alone was impressive, having an AI that could comprehend a full codebase and suggest a structured approach.&lt;/p&gt;

&lt;p&gt;For each utility function, I'd ask the agent to modernize it while maintaining backward compatibility. It would refactor the code, update the associated tests, regenerate documentation examples, and verify everything worked. I'd review the changes, provide feedback, and iterate until it matched what I wanted.&lt;/p&gt;

&lt;p&gt;The biggest win was the agent's ability to maintain consistency. When refactoring string utilities, it would apply the same patterns to array utilities without me having to repeat instructions. It learned the style and conventions I preferred.&lt;/p&gt;

&lt;p&gt;The multimodal aspect helped with documentation too. I could show it how I wanted code examples formatted, and it would apply that formatting across all the documentation files.&lt;/p&gt;

&lt;p&gt;Was it perfect? No. I had to roll back some changes that broke edge cases, fix type definitions that weren't quite right, and adjust implementations that were technically correct but stylistically different from the rest of the codebase. But overall, what would have taken me a week of tedious refactoring work was done in a couple of days, with much of that time spent on review rather than actual coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verdict: Should You Try It? 🎯
&lt;/h2&gt;

&lt;p&gt;Look, Google Antigravity is fascinating tech, and it represents a genuine shift in how we might code in the future. But is it ready to replace your current workflow? That depends.&lt;/p&gt;

&lt;h3&gt;
  
  
  You should definitely try Antigravity if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're working on projects that need significant refactoring or modernization&lt;/li&gt;
&lt;li&gt;You want to experiment with agent-first development workflows&lt;/li&gt;
&lt;li&gt;You're comfortable reviewing AI-generated code thoroughly&lt;/li&gt;
&lt;li&gt;You have the patience to learn a new development paradigm&lt;/li&gt;
&lt;li&gt;You're building web applications that benefit from browser-based testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Maybe stick with your current tools if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need rock-solid reliability without API rate limits&lt;/li&gt;
&lt;li&gt;You're deeply invested in a specific IDE's extension ecosystem&lt;/li&gt;
&lt;li&gt;You work on projects where every line needs to be hand-crafted&lt;/li&gt;
&lt;li&gt;You prefer traditional development workflows&lt;/li&gt;
&lt;li&gt;You need consistent performance without latency issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, Antigravity has earned a place in my toolkit, but it hasn't replaced everything else. It's incredible for large refactoring tasks, prototyping new features, and handling repetitive coding work. But for precision work, debugging complex issues, or when I need complete control, I still reach for my traditional IDE.&lt;/p&gt;




&lt;h2&gt;
  
  
  Some Positive Thoughts to Wrap Up 🌟
&lt;/h2&gt;

&lt;p&gt;Despite the criticisms, I genuinely think Google is onto something here. The agent-first paradigm feels like a natural evolution of AI coding assistants. Instead of treating AI as a fancy autocomplete, we're moving toward AI as collaborative team members that can handle entire workflows.&lt;/p&gt;

&lt;p&gt;The fact that I could refactor an entire library with significantly less manual effort is remarkable. Even with the rough edges, the productivity gains are real. As someone who maintains multiple open source projects, anything that helps me tackle technical debt faster is valuable.&lt;/p&gt;

&lt;p&gt;The multimodal capabilities open up interesting possibilities. Being able to communicate through code, text, and visuals makes the interaction feel more natural and expressive than pure text-based chatbots.&lt;/p&gt;

&lt;p&gt;And here's something often overlooked: the learning experience. Using Antigravity forced me to think more architecturally about my code. When you're describing goals to an AI agent rather than implementing them yourself, you naturally focus more on the "what" and "why" rather than the "how." This higher-level thinking has actually improved how I approach problems even when I'm not using the tool.&lt;/p&gt;

&lt;p&gt;Google's also iterating fast. The issues I mentioned rate limits, performance, rough edges, are all things that can improve over time. We're in the early preview phase, and if Google continues investing in this platform, it could become really powerful.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next for Me? 💫
&lt;/h2&gt;

&lt;p&gt;I'm planning to continue using Antigravity for appropriate tasks while keeping my traditional IDE for others. The key is understanding which tool fits which job.&lt;/p&gt;

&lt;p&gt;For &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/easy-kit-utils" rel="noopener noreferrer"&gt;Easy Kit Utils&lt;/a&gt;, the refactoring is now complete thanks to Antigravity's help, and the library is in much better shape. TypeScript definitions are solid, the code is modernized, and test coverage is improved. Now I can focus on adding new features rather than dealing with technical debt.&lt;/p&gt;

&lt;p&gt;I'm also curious to experiment more with the multi-agent workflows. The idea of having multiple AI agents working on different aspects of a project simultaneously is compelling, even if the execution is still rough around the edges.&lt;/p&gt;

&lt;p&gt;And honestly? I'm just excited to see where this technology goes. Whether Antigravity specifically becomes the dominant tool or not, the concept of agent-driven development is here to stay. We're watching the future of coding take shape in real-time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Google Antigravity is bold, ambitious, and imperfect. It's not a &lt;em&gt;"Cursor killer"&lt;/em&gt; or a revolutionary replacement for all your dev tools. But it is a genuinely interesting experiment in how AI can be integrated into the development workflow at a fundamental level.&lt;/p&gt;

&lt;p&gt;If you're a developer who likes exploring new tools and aren't afraid of some rough edges, absolutely give it a try. The experience of working with autonomous coding agents is both enlightening and occasionally frustrating, but definitely worth experiencing.&lt;/p&gt;

&lt;p&gt;For open source maintainers like me who need to juggle multiple projects, anything that helps tackle maintenance tasks more efficiently is worth exploring. Antigravity helped me ship a better version of Easy Kit Utils faster than I could have done manually.&lt;/p&gt;

&lt;p&gt;Is this the future of coding? Maybe. Parts of it, at least. We're still figuring out what works and what doesn't. But that's what makes it exciting.&lt;/p&gt;

&lt;p&gt;So yeah, go download it, try building something, break it, learn from it. And let me know what you think!&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;




&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

</description>
      <category>ai</category>
      <category>coding</category>
      <category>opensource</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>Firebase Studio: Google's Game-Changer for AI App Development 🔥</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Mon, 24 Nov 2025 09:00:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/firebase-studio-googles-game-changer-for-ai-app-development-1388</link>
      <guid>https://dev.to/playfulprogramming/firebase-studio-googles-game-changer-for-ai-app-development-1388</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hey everyone! 👋&lt;/p&gt;

&lt;p&gt;If you've been paying attention to the dev world lately, you probably noticed Google dropped something pretty wild: &lt;strong&gt;Firebase Studio&lt;/strong&gt;. And trust me, this isn't just another IDE with a fancy AI chatbot slapped on the side.&lt;/p&gt;

&lt;p&gt;This is a full-blown, cloud-based development environment that fuses Project IDX, Firebase services, and Gemini AI into something that feels genuinely different. Think of it as your complete AI app development lab, accessible from anywhere, with an AI assistant that doesn't just autocomplete, it &lt;em&gt;understands&lt;/em&gt; your codebase and can actually take action.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  What Exactly Is Firebase Studio? 🤔
&lt;/h2&gt;

&lt;p&gt;Firebase Studio is a cloud-based, agentic development environment powered by Gemini that includes everything developers need to create and publish production-quality AI apps quickly, all in one place. But what does "agentic" actually mean here?&lt;/p&gt;

&lt;p&gt;It means Gemini isn't just passively answering questions. It can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update your project files directly&lt;/li&gt;
&lt;li&gt;Run terminal commands for you&lt;/li&gt;
&lt;li&gt;Interpret command outputs&lt;/li&gt;
&lt;li&gt;Suggest next steps based on what's happening in your code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Firebase Studio unifies Project IDX with specialized AI agents and assistance from Gemini in Firebase to provide a collaborative workspace accessible from anywhere. Basically, Google took their Code OSS-based IDE (Project IDX), threw in Firebase integration, added powerful AI agents, and wrapped it all up in a browser-based package.&lt;/p&gt;

&lt;p&gt;No local setup. No configuration hell. Just open your browser and start building.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways to Work: Code or Prompt 💻
&lt;/h2&gt;

&lt;p&gt;Here's where things get interesting. Firebase Studio gives you two distinct modes:&lt;/p&gt;

&lt;h3&gt;
  
  
  Coding Mode (Full Control)
&lt;/h3&gt;

&lt;p&gt;This is your traditional IDE experience, but supercharged. You get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Code OSS-based editor (basically VS Code in the cloud)&lt;/li&gt;
&lt;li&gt;Access to extensions from Open VSX Registry&lt;/li&gt;
&lt;li&gt;Full Git integration (GitHub, GitLab, Bitbucket)&lt;/li&gt;
&lt;li&gt;Gemini assistance inline within your code editor, through the command line interface, and using chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's perfect when you know what you want to build and just need AI to speed things up.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prototyping Mode (No Code Required)
&lt;/h3&gt;

&lt;p&gt;Now this is where my mind was blown 🤯&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;App Prototyping agent&lt;/strong&gt; (they call it "Prototyper") lets you build full-stack apps using natural language, images, drawings, and screenshots. No code required.&lt;/p&gt;

&lt;p&gt;It assists you with designing your app, such as the UI, API schema, and AI flows, all using natural language, images, drawing tools, and screenshots.&lt;/p&gt;

&lt;p&gt;Want to pivot? Just keep prompting. When you're happy with it, deploy directly to Firebase App Hosting and share a URL with others. It's that simple.&lt;/p&gt;

&lt;p&gt;The best part? You can seamlessly transition between coding and prompting to harness the strengths of each. Start with a prototype to nail the structure and user flow, then switch to Code view to add custom logic and integrations. It's flexible as hell.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gemini Integration: Not Your Average AI Assistant 🧠
&lt;/h2&gt;

&lt;p&gt;Let's talk about what makes Gemini in Firebase Studio special, because this isn't just ChatGPT in a sidebar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chat That Actually Understands Your Code
&lt;/h3&gt;

&lt;p&gt;Gemini in Firebase can provide code suggestions, generate code, explain code concepts, update project files, run terminal commands, and interpret command output.&lt;/p&gt;

&lt;p&gt;The key word here is "workspace-aware." Gemini has indexed your entire codebase, so when you ask questions, it's not giving generic answers, it's giving answers &lt;em&gt;specific to your project&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inline Assistance
&lt;/h3&gt;

&lt;p&gt;As you type, you get intelligent code completion. But you can also select any piece of code and ask Gemini to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make it more readable&lt;/li&gt;
&lt;li&gt;Explain what it does&lt;/li&gt;
&lt;li&gt;Generate documentation&lt;/li&gt;
&lt;li&gt;Write tests for it&lt;/li&gt;
&lt;li&gt;Refactor it&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Terminal Integration
&lt;/h3&gt;

&lt;p&gt;This one's wild. Gemini can suggest terminal commands, and with one click, it'll run them for you. After execution, it interprets the results and suggests next steps.&lt;/p&gt;

&lt;p&gt;Running a dev server? There's a "Detach" button so the server keeps running while you continue chatting with Gemini. These small UX details make a huge difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complex Task Automation
&lt;/h3&gt;

&lt;p&gt;Gemini can automatically generate documentation in the appropriate format for your code when you ask it to "Write my docs," and can automatically update and generate unit tests.&lt;/p&gt;

&lt;p&gt;Imagine saying "write my tests" and Gemini finds your test files and adds missing test cases. Or "write my docs" and boom—proper documentation in the right format. That's huge for productivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Power: Gemini 2.5 💪
&lt;/h2&gt;

&lt;p&gt;Recently, Firebase Studio upgraded its App Prototyping agent to use Gemini 2.5, Google's most powerful AI model, which is particularly good at coding tasks.&lt;/p&gt;

&lt;p&gt;The results speak for themselves. Google shared some example apps built entirely through prompting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive Music Tutor&lt;/strong&gt;: built in under 10 minutes, complete with lesson catalog for beginner to advanced users. The AI automatically found the right JavaScript libraries to generate piano sounds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Task Scheduler&lt;/strong&gt;: created in 30 minutes, integrating Google Tasks and Calendar APIs. It schedules tasks around appointments, breaks large tasks into manageable pieces, and even provided OAuth setup instructions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantum Physics Simulator&lt;/strong&gt;: built with just three prompts, featuring detailed interactive tutorials on quantum phenomena like the Bell test, double-slit experiment, and quantum tunneling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't toy examples. These are real, functional apps that would normally take days or weeks to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Templates &amp;amp; Getting Started 🎯
&lt;/h2&gt;

&lt;p&gt;Firebase Studio comes with over 60 pre-built templates supporting most tech stacks. Whether you're building with React, Vue, Angular, Flutter, Python, or whatever—there's likely a template ready to go.&lt;/p&gt;

&lt;p&gt;Want to build with the Gemini API directly? There are dedicated templates for JavaScript (with Vite or Genkit) and Python (notebook or Flask app), with more coming soon.&lt;/p&gt;

&lt;p&gt;And here's the kicker: Firebase Studio is currently available with 3 workspaces at no cost during preview. Members of the Google Developer Program get up to 30 workspaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy &amp;amp; Data Usage 🔒
&lt;/h2&gt;

&lt;p&gt;Let's address the elephant in the room: AI and data privacy.&lt;/p&gt;

&lt;p&gt;Use of generative AI features within Firebase Studio is governed by the Generative AI Prohibited Use Policy and the Gemini API Additional Terms of Service.&lt;/p&gt;

&lt;p&gt;Here's what you need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Default behavior&lt;/strong&gt;: your prompts and responses may be used for model training&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Want privacy?&lt;/strong&gt; You have options:

&lt;ul&gt;
&lt;li&gt;Don't use the App Prototyping agent&lt;/li&gt;
&lt;li&gt;Don't use Gemini in Firebase within Firebase Studio&lt;/li&gt;
&lt;li&gt;Turn off code completion and indexing in settings&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If you're using Gemini Code Assist with a paid subscription, your data won't be used for training. But for the free tier, Google is transparent: your interactions help improve the models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customization &amp;amp; Control ⚙️
&lt;/h2&gt;

&lt;p&gt;Don't like being fully on rails? Firebase Studio has you covered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Rules Files&lt;/strong&gt;: customize how Gemini assists you with specific instructions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;.aiexclude Files&lt;/strong&gt;: like .gitignore, but for AI—exclude sensitive files from Gemini's context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Selection&lt;/strong&gt;: you can configure your Gemini API key and select different Gemini models from User Settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codebase Indexing&lt;/strong&gt;: toggle whether Gemini indexes your entire codebase&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You maintain control over how deeply AI integrates with your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Take: Top or Flop? 🎲
&lt;/h2&gt;

&lt;p&gt;Let me be real with you: this is pretty impressive.&lt;/p&gt;

&lt;p&gt;The seamless integration between prototyping and coding is genius. Starting with natural language to nail the structure, then dropping into code for fine-tuning—that workflow just makes sense.&lt;/p&gt;

&lt;p&gt;The terminal integration and workspace-aware assistance feels genuinely useful, not gimmicky. And the fact that Gemini can actually &lt;em&gt;do things&lt;/em&gt; (run commands, update files) rather than just suggesting, that's the future.&lt;/p&gt;

&lt;p&gt;But is it perfect? Nah. It's in preview for a reason. There are rough edges, and you still need to validate everything AI generates (Google is very clear about this). But the potential here is massive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next? 💫
&lt;/h2&gt;

&lt;p&gt;Google is rolling out early access to &lt;strong&gt;Gemini Code Assist agents&lt;/strong&gt; within Firebase Studio. These specialized agents can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Migrate code between framework versions&lt;/li&gt;
&lt;li&gt;Run adversarial AI testing&lt;/li&gt;
&lt;li&gt;Create wiki-style documentation for onboarding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They're also expanding &lt;strong&gt;Genkit&lt;/strong&gt; (their AI framework) with better Python and Go support, and adding more models through Vertex AI.&lt;/p&gt;

&lt;p&gt;The ecosystem is growing fast, and Firebase Studio sits at the center of it all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give It a Try 🌟
&lt;/h2&gt;

&lt;p&gt;If you're building AI-powered apps, or just curious about where development tools are heading, Firebase Studio is worth checking out. Three free workspaces during preview is a pretty generous offer.&lt;/p&gt;

&lt;p&gt;Is it going to replace your local dev environment tomorrow? Maybe not. But for prototyping, experimenting, and building AI apps quickly, it's a legit tool that deserves attention.&lt;/p&gt;

&lt;p&gt;And honestly? The idea of spinning up a full development environment in seconds, from any browser, with an AI assistant that actually understands your code, that's pretty damn cool.&lt;/p&gt;

&lt;p&gt;So go ahead, give it a shot at &lt;a href="https://firebase.studio" rel="noopener noreferrer"&gt;firebase.studio&lt;/a&gt;, and see what you can build.&lt;/p&gt;

&lt;p&gt;And now...&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;




&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>ai</category>
      <category>google</category>
      <category>coding</category>
    </item>
    <item>
      <title>Introducing Domenico Tenace Open Labs: A New Home for Open Source Innovation 🚀</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Wed, 19 Nov 2025 09:58:38 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/introducing-domenico-tenace-open-labs-a-new-home-for-open-source-innovation-8dg</link>
      <guid>https://dev.to/playfulprogramming/introducing-domenico-tenace-open-labs-a-new-home-for-open-source-innovation-8dg</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hello everyone 👋&lt;/p&gt;

&lt;p&gt;Today I'm excited to share something I've been working on that's pretty close to my heart: &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;&lt;strong&gt;Domenico Tenace Open Labs&lt;/strong&gt;&lt;/a&gt;, my new GitHub organization dedicated to open source projects.&lt;/p&gt;

&lt;p&gt;If you're wondering why I decided to create this, well, it's simple: I wanted a centralized space where all my open source work could live, breathe, and grow with the help of the community. No more scattered repos, no more confusion about where to find what. Just a clean, organized digital lab where developers can explore, use, contribute, and learn together.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  Why an Organization? 🤔
&lt;/h2&gt;

&lt;p&gt;You might be asking yourself: "Why not just keep everything in your personal GitHub account?"&lt;/p&gt;

&lt;p&gt;Fair question! Here's the thing: as my projects started to grow, I realized they needed a proper home. An organization gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better structure&lt;/strong&gt;: projects are categorized and easy to find&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Community focus&lt;/strong&gt;: it's not just "my" projects anymore, it's "our" workspace&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration made easy&lt;/strong&gt;: multiple contributors can work together seamlessly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professional presence&lt;/strong&gt;: it shows commitment to open source and community building&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, let's be honest, it looks pretty cool to have an official "lab" where ideas come to life 🧪&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Inside the Lab? 💻
&lt;/h2&gt;

&lt;p&gt;Domenico Tenace Open Labs isn't just one thing, it's a collection of different project types, each serving a specific purpose. Here's what you'll find:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Apps &amp;amp; Tools
&lt;/h3&gt;

&lt;p&gt;The practical stuff that solves real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App Repo&lt;/strong&gt;: a simple cloud-based app storage solution built with Nuxt. Think of it as your lightweight storage companion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glif&lt;/strong&gt;: a minimalist QR code generator and manager. Because sometimes you just need a clean, no-nonsense tool to create QR codes without all the bloat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Libraries &amp;amp; Components
&lt;/h3&gt;

&lt;p&gt;Reusable code that makes development faster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy Kit Component&lt;/strong&gt;: a simple component library for Vue 3. No overcomplicated API, just straightforward components you can drop into your projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy Kit Utils&lt;/strong&gt;: common JavaScript utilities we all end up writing anyway. Why reinvent the wheel? (spoiler: I reinvented the wheel 😬)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Experimental Projects
&lt;/h3&gt;

&lt;p&gt;Where I test new technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uno Counter App&lt;/strong&gt;: a demo app built with Uno Platform to explore their new Hot Design feature. It's a simple counter, but the real magic is in testing cutting-edge tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Templates &amp;amp; Starters
&lt;/h3&gt;

&lt;p&gt;Get your projects off the ground faster:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Astro Minimal&lt;/strong&gt;: an open source blog template combining Astro and Bulma. Clean, minimal, ready to customize.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Documentation &amp;amp; Resources
&lt;/h3&gt;

&lt;p&gt;Knowledge sharing is caring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Daily Prompt&lt;/strong&gt;: a curated collection of prompts for automating various processes. AI tools are powerful, but only if you know how to ask the right questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bash Scripts&lt;/strong&gt;: practical automation scripts for everyday tasks. Because who wants to do repetitive work manually?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Philosophy Behind It All 🌍
&lt;/h2&gt;

&lt;p&gt;Here's what drives this organization:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open by default&lt;/strong&gt;: every project is open source because I believe in transparency and collaborative development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Community-driven&lt;/strong&gt;: your ideas, feedback, and contributions shape these projects. Found a bug? Open an issue. Have a feature idea? Let's discuss it. Want to contribute? Fork it and submit a PR!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning-focused&lt;/strong&gt;: whether you're a beginner looking to contribute to your first open source project or an experienced dev wanting to share knowledge, there's a place for you here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality over quantity&lt;/strong&gt;: I'd rather maintain a handful of useful, well-documented projects than dozens of abandoned repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  How You Can Get Involved 🤝
&lt;/h2&gt;

&lt;p&gt;This is where it gets fun. Domenico Tenace Open Labs is only as good as the community around it. Here's how you can jump in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Use the projects&lt;/strong&gt;: the best feedback comes from real-world usage. Try them out, break them, let me know what works and what doesn't.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Contribute code&lt;/strong&gt;: see something that could be better? The contribution process is straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fork the repository&lt;/li&gt;
&lt;li&gt;Create your feature branch&lt;/li&gt;
&lt;li&gt;Submit a pull request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Share ideas&lt;/strong&gt;: have a suggestion for a new feature or an entirely new project? Open an issue and let's chat about it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Join the community&lt;/strong&gt;: you can actually request to join the organization! Just &lt;a href="https://github.com/Domenico-Tenace-Open-Labs/community/issues/new?template=join-request.yml" rel="noopener noreferrer"&gt;open an issue here&lt;/a&gt; and become part of the lab.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Spread the word&lt;/strong&gt;: if you find something useful, share it with others who might benefit.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's Next? 💫
&lt;/h2&gt;

&lt;p&gt;Looking ahead, I have some exciting plans:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More educational content&lt;/strong&gt;: I want to create more guides and learning materials, especially for developers who are new to certain technologies.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Expanded library ecosystem&lt;/strong&gt;: the Easy Kit projects are just the beginning. I'm planning more utility libraries that solve common problems elegantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Better documentation&lt;/strong&gt;: good docs can make or break a project. I'm committed to improving documentation across all repos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community projects&lt;/strong&gt;: I'd love to see projects initiated by community members under the organization's umbrella.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key is taking it one step at a time. I learned from 2024 that setting too many goals can be overwhelming. This year, it's all about focus and meaningful progress 🪐&lt;/p&gt;

&lt;h2&gt;
  
  
  Join the Journey 🌟
&lt;/h2&gt;

&lt;p&gt;Domenico Tenace Open Labs is more than just a GitHub organization, it's a growing space for collaboration, learning, and building cool stuff together.&lt;/p&gt;

&lt;p&gt;Whether you're here to use a tool, contribute to a project, or just explore what's possible with open source, you're welcome. Every contribution matters, whether it's code, documentation, bug reports, or just spreading the word.&lt;/p&gt;

&lt;p&gt;So go ahead, check out the &lt;a href="https://github.com/Domenico-Tenace-Open-Labs" rel="noopener noreferrer"&gt;organization&lt;/a&gt;, star some repos, fork what interests you, and let's build something awesome together!&lt;/p&gt;

&lt;p&gt;And now...&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;




&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>opensource</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Hacktoberfest 2025: Share Your Open Source Projects! 🎃</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Mon, 06 Oct 2025 12:35:15 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/hacktoberfest-2025-share-your-open-source-projects-1boi</link>
      <guid>https://dev.to/playfulprogramming/hacktoberfest-2025-share-your-open-source-projects-1boi</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hello everyone 👋&lt;/p&gt;

&lt;p&gt;October is here, and you know what that means, it's &lt;strong&gt;Hacktoberfest time&lt;/strong&gt;! 🎉&lt;/p&gt;

&lt;p&gt;In this article, I want to talk about this amazing annual celebration of open source and invite you all to share your projects with the community. Whether you're a maintainer looking for contributors or a developer searching for cool projects to contribute to, this is &lt;strong&gt;YOUR&lt;/strong&gt; moment to shine!&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Hacktoberfest?
&lt;/h2&gt;

&lt;p&gt;If you're new to this (welcome aboard! 🚀), Hacktoberfest is a month-long celebration of open source software run by DigitalOcean. It's basically the Super Bowl of open source contributions, but instead of touchdowns, we're making pull requests.&lt;/p&gt;

&lt;p&gt;The concept is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;For Contributors&lt;/strong&gt;: Make quality contributions to open source projects during October and get recognized for your work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For Maintainers&lt;/strong&gt;: Get help on your projects, grow your community, and discover passionate contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly? Everyone wins. The whole open source ecosystem gets a boost, developers level up their skills, and maintainers get fresh perspectives on their projects. Pretty cool, right? 😎&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;Look, I get it. You might be thinking: "Another developer event? Do I really need this?"&lt;/p&gt;

&lt;p&gt;Here's the thing – &lt;strong&gt;open source is where the magic happens&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some reasons why you should jump in:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Contributors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You'll learn by doing (there's no better way, trust me)&lt;/li&gt;
&lt;li&gt;Build your portfolio with real-world projects&lt;/li&gt;
&lt;li&gt;Connect with developers from all around the globe 🌍&lt;/li&gt;
&lt;li&gt;Get comfortable with Git and collaboration workflows&lt;/li&gt;
&lt;li&gt;Oh, and did I mention the swag? 👕&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Maintainers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fresh eyes on your codebase mean fresh ideas&lt;/li&gt;
&lt;li&gt;Documentation improvements (seriously, this is HUGE)&lt;/li&gt;
&lt;li&gt;Bug fixes you've been meaning to get to&lt;/li&gt;
&lt;li&gt;Growing your project's visibility and community&lt;/li&gt;
&lt;li&gt;Finding potential long-term contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let's Share Our Projects! 🚀
&lt;/h2&gt;

&lt;p&gt;Okay, here comes the fun part, &lt;strong&gt;I want YOU to share your open source projects in the comments below!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whether it's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A cool library you've been working on&lt;/li&gt;
&lt;li&gt;That side project you started last year&lt;/li&gt;
&lt;li&gt;A brand new tool you just released&lt;/li&gt;
&lt;li&gt;An established project looking for contributors&lt;/li&gt;
&lt;li&gt;Or even your first-ever open source project (we all start somewhere!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Drop them in the comments!&lt;/strong&gt; 👇&lt;/p&gt;

&lt;p&gt;Use this format to make it easy for everyone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔗 **Project Name**: [Your Project]
📝 **Description**: Brief description of what it does
🛠️ **Tech Stack**: Main technologies used
🤝 **Looking for**: What kind of contributions you need
⭐ **Repo**: Link to your repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Some Tips for Success
&lt;/h2&gt;

&lt;p&gt;Let me share some wisdom from past Hacktoberfests:&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Read the project's contribution guidelines FIRST (seriously)&lt;/li&gt;
&lt;li&gt;Start small: fix typos, improve docs, tackle good-first-issues&lt;/li&gt;
&lt;li&gt;Don't just spam PRs for the sake of it. Quality matters.&lt;/li&gt;
&lt;li&gt;Communicate with maintainers before starting large changes&lt;/li&gt;
&lt;li&gt;Be patient and respectful. Maintainers are human too! 🤗&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Prepare your repo before October (trust me on this one)&lt;/li&gt;
&lt;li&gt;Create clear, well-described issues&lt;/li&gt;
&lt;li&gt;Be welcoming to newcomers – we all started somewhere&lt;/li&gt;
&lt;li&gt;Review PRs promptly (contributors lose motivation when waiting too long)&lt;/li&gt;
&lt;li&gt;Say thank you! A little appreciation goes a long way 💙&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hacktoberfest is more than just an event, it's a celebration of what makes software development so incredible: &lt;strong&gt;collaboration, sharing, and building cool stuff together&lt;/strong&gt;. 🎊&lt;/p&gt;

&lt;p&gt;So what are you waiting for? Drop your projects in the comments, browse what others are sharing, and let's make this Hacktoberfest the best one yet!&lt;/p&gt;

&lt;p&gt;Don't be shy about sharing your projects, even if they're small or "works in progress". We all have to start somewhere, and the open source community is incredibly supportive. See you in the comments! 🚀&lt;/p&gt;

&lt;p&gt;Happy coding! ✨&lt;/p&gt;



&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Firebase Storage: Your File Upload Superhero 📁</title>
      <dc:creator>Domenico Tenace</dc:creator>
      <pubDate>Mon, 25 Aug 2025 09:55:00 +0000</pubDate>
      <link>https://dev.to/playfulprogramming/firebase-storage-your-file-upload-superhero-81o</link>
      <guid>https://dev.to/playfulprogramming/firebase-storage-your-file-upload-superhero-81o</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Hello everyone! 👋&lt;/p&gt;

&lt;p&gt;In this article, I'll walk you through Firebase Storage, Google's powerful file storage solution that makes handling uploads, downloads, and file management incredibly easy. Whether you're dealing with profile pictures, documents, videos, or any other files, Firebase Storage has got your back!&lt;/p&gt;

&lt;p&gt;Firebase Storage is built on Google Cloud Storage, so you get enterprise-level reliability and performance without the complexity. Plus, it integrates seamlessly with Firebase Authentication and works beautifully across web, mobile, and server environments.&lt;/p&gt;

&lt;p&gt;Let's start! 🤙&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Firebase Storage Rocks
&lt;/h2&gt;

&lt;p&gt;Before we jump into the code, let's understand what makes Firebase Storage so awesome:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Robust Upload/Download&lt;/strong&gt;: Handles network interruptions gracefully with resumable uploads&lt;br&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Built-in authentication and security rules&lt;br&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Automatically scales from KB to petabytes&lt;br&gt;
&lt;strong&gt;Global CDN&lt;/strong&gt;: Fast downloads from Google's global network&lt;br&gt;
&lt;strong&gt;Real-time Integration&lt;/strong&gt;: Works perfectly with Firestore and other Firebase services&lt;br&gt;
&lt;strong&gt;Multiple Formats&lt;/strong&gt;: Images, videos, documents, audio - you name it!&lt;/p&gt;

&lt;p&gt;The best part? You don't need to worry about server management, CDN configuration, or handling network failures. &lt;br&gt;
Firebase does all the heavy lifting! 💪&lt;/p&gt;
&lt;h2&gt;
  
  
  Choose Your File Types
&lt;/h2&gt;

&lt;p&gt;Firebase Storage can handle pretty much any file type you throw at it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images&lt;/strong&gt;: JPG, PNG, GIF, WebP, SVG&lt;br&gt;
&lt;strong&gt;Videos&lt;/strong&gt;: MP4, MOV, AVI, WebM&lt;br&gt;
&lt;strong&gt;Documents&lt;/strong&gt;: PDF, DOC, DOCX, TXT, CSV&lt;br&gt;
&lt;strong&gt;Audio&lt;/strong&gt;: MP3, WAV, AAC, OGG&lt;br&gt;
&lt;strong&gt;Archives&lt;/strong&gt;: ZIP, RAR, TAR&lt;br&gt;
&lt;strong&gt;Code&lt;/strong&gt;: JS, CSS, HTML, JSON&lt;/p&gt;

&lt;p&gt;You can even store custom file formats - Firebase Storage doesn't discriminate! 🎯&lt;/p&gt;
&lt;h2&gt;
  
  
  Setting Up Firebase Storage
&lt;/h2&gt;

&lt;p&gt;Let's get our hands dirty and set up Firebase Storage in your project.&lt;br&gt;
Before we dive into the code, let's set up our Firebase project.&lt;br&gt;
To setup the project, you can retrieve &lt;a href="https://dev.to/this-is-learning/firebase-project-setup-your-complete-getting-started-guide-3k23"&gt;this article&lt;/a&gt; where I talk about it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Enable Storage in Firebase Console
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to your Firebase project console&lt;/li&gt;
&lt;li&gt;Click on "Storage" in the left sidebar&lt;/li&gt;
&lt;li&gt;Click "Get started"&lt;/li&gt;
&lt;li&gt;Choose your security rules mode (we'll configure this properly later)&lt;/li&gt;
&lt;li&gt;Select a storage location close to your users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your storage bucket is now ready! 🚀&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Configure CORS (if needed)
&lt;/h3&gt;

&lt;p&gt;For web uploads, you might need to configure CORS. Create a &lt;code&gt;cors.json&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"origin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maxAgeSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then apply it:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gsutil cors &lt;span class="nb"&gt;set &lt;/span&gt;cors.json gs://your-bucket-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Basic File Operations
&lt;/h2&gt;

&lt;p&gt;Let's learn the fundamental operations: upload, download, and delete files.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Uploading Files
&lt;/h3&gt;

&lt;p&gt;Here's how to upload files to Firebase Storage:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;storage&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;./firebase&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;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uploadBytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uploadBytesResumable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getDownloadURL&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;firebase/storage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Simple file upload&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadFile&lt;/span&gt; &lt;span class="o"&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;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storageRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;snapshot&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;uploadBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Upload completed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Get download URL&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;downloadURL&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;getDownloadURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;downloadURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Upload failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;downloadURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;// Upload with progress tracking&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadFileWithProgress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onProgress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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;storageRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;uploadTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;uploadBytesResumable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;uploadTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;state_changed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// Progress callback&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&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;progress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bytesTransferred&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalBytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nf"&gt;onProgress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Upload is &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;progress&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;% done&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="c1"&gt;// Error callback&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="c1"&gt;// Success callback&lt;/span&gt;
      &lt;span class="k"&gt;async &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;downloadURL&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;getDownloadURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;uploadTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;downloadURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uploadTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snapshot&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="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Downloading Files
&lt;/h3&gt;

&lt;p&gt;Here's how to retrieve files from Firebase Storage:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getDownloadURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getBlob&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;firebase/storage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Get download URL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getFileURL&lt;/span&gt; &lt;span class="o"&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;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storageRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;url&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;getDownloadURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&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 get download URL:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;// Download file as blob&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;downloadFile&lt;/span&gt; &lt;span class="o"&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;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storageRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&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;blob&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;getBlob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Create download link&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&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;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;download&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Extract filename&lt;/span&gt;
    &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Cleanup&lt;/span&gt;
    &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;revokeObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Download failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;h3&gt;
  
  
  Step 3: Deleting Files
&lt;/h3&gt;

&lt;p&gt;Here's how to remove files from Firebase Storage:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deleteObject&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;firebase/storage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Delete a file&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deleteFile&lt;/span&gt; &lt;span class="o"&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;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;storageRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;deleteObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;storageRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;File deleted successfully&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Delete failed:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;h2&gt;
  
  
  Security Rules for Storage
&lt;/h2&gt;

&lt;p&gt;Let's set up proper security rules to protect your files! 🛡️&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Basic Security Rules
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;firebase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/o &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="c1"&gt;// Default: only authenticated users can upload/download&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;allPaths&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="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;h3&gt;
  
  
  Step 2: User-specific File Access
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;firebase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/o &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="c1"&gt;// Users can only access their own files&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/{allPaths=**} &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Public files - anyone can read, only auth users can write&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="kr"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;allPaths&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Profile pictures - readable by all, writable by owner&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;profiles&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/avatar.jpg &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3: File Type and Size Restrictions
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;firebase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;storage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/o &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="c1"&gt;// Helper functions&lt;/span&gt;
    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isImageFile&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;image/.*&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isUnder10MB&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&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;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isAuthenticated&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// User uploads with restrictions&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/{fileName} &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
                      &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
                      &lt;span class="nf"&gt;isImageFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
                      &lt;span class="nf"&gt;isUnder10MB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Document uploads&lt;/span&gt;
    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;documents&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/{fileName} &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isAuthenticated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; 
                            &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/pdf&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/msword&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="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;contentType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;matches&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/.*&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;amp;&amp;amp;&lt;/span&gt;
                            &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&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;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 50MB limit&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;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You now have a working Firebase Storage setup: upload files with progress, fetch download URLs, organize content, secure access with rules, and run it all locally with the emulator. &lt;/p&gt;

&lt;p&gt;Happy coding!✨&lt;/p&gt;



&lt;p&gt;Hi👋🏻&lt;br&gt;
My name is Domenico, software developer passionate of Open Source, I write article about it for share my knowledge and experience.&lt;br&gt;
Don't forget to visit my Linktree to discover my projects 🫰🏻&lt;/p&gt;

&lt;p&gt;Linktree: &lt;a href="https://linktr.ee/domenicotenace" rel="noopener noreferrer"&gt;https://linktr.ee/domenicotenace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow me on dev.to for other articles 👇🏻&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__985143"&gt;
    &lt;a href="/dvalin99" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F985143%2Fc4c372a7-0b38-4f9e-b206-7ed65597ea31.png" alt="dvalin99 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dvalin99"&gt;Domenico Tenace&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dvalin99"&gt;Passionate about the IT world and everything related to it ✌🏻
Open Source enthusiastic 🦠&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;If you like my content or want to support my work on GitHub, you can support me with a very small donation.&lt;br&gt;
I would be grateful 🥹&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.buymeacoffee.com/domenicotenace" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn.buymeacoffee.com%2Fbuttons%2Fv2%2Fdefault-yellow.png" alt="Buy Me A Coffee"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>firebase</category>
      <category>google</category>
      <category>googlecloud</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
