<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[DQ7 Guide Tech Blog]]></title><description><![CDATA[DQ7 Guide Tech Blog]]></description><link>https://dq7-guide.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 12 Nov 2026 09:10:03 GMT</lastBuildDate><atom:link href="https://dq7-guide.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Goodbye Hydration Bloat: Why I Built My Latest Project with Astro (Instead of Next.js)]]></title><description><![CDATA[How I built an interactive Dragon Quest VII walkthrough with a 100 Lighthouse score. A deep dive into using Astro, Tailwind CSS, and LocalStorage to…]]></description><link>https://dq7-guide.hashnode.dev/goodbye-hydration-bloat-why-i-built-my-latest-project-with-astro-instead-of-nextjs</link><guid isPermaLink="true">https://dq7-guide.hashnode.dev/goodbye-hydration-bloat-why-i-built-my-latest-project-with-astro-instead-of-nextjs</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Astro]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[Zap Causal]]></dc:creator><pubDate>Fri, 09 Jan 2026 16:00:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1767943102386/fda2930a-92e1-4e0b-91f0-624f229f01f5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2 id="heading-the-problem-wiki-bloat">The Problem: "Wiki Bloat" 🐢</h2>
<p>I'm a huge JRPG fan. When the <strong>Dragon Quest VII Reimagined Demo</strong> dropped on Switch 2 recently, I rushed to find a guide.</p>
<p>But the state of modern game documentation is sad. Most wikis are Single Page Applications (SPAs) loaded with:</p>
<ol>
<li><p>Heavy JavaScript bundles for simple static text.</p>
</li>
<li><p>Third-party tracking scripts.</p>
</li>
<li><p>Autoplaying video ads that cause massive Cumulative Layout Shifts (CLS).</p>
</li>
</ol>
<p>Trying to browse these on a phone while playing a game is a nightmare. The battery drains, the page jumps, and the phone gets hot.</p>
<p>I decided to build my own solution: <strong>The Adventure Log</strong>. My goal was simple: <strong>Zero lag, instant load times, and rich interactivity.</strong></p>
<h2 id="heading-the-tech-stack-decision">The Tech Stack Decision 🤔</h2>
<p>My muscle memory wanted to reach for <strong>Next.js</strong>. It's what I use at work. It's powerful. But for a content-heavy site like a walkthrough, <strong>Next.js is overkill.</strong></p>
<p>Why send 200KB of JavaScript to the client just to render a static list of items? This is known as "Hydration Bloat."</p>
<h3 id="heading-enter-astro">Enter Astro 🚀</h3>
<p>I chose <a target="_blank" href="https://astro.build/">Astro</a> because of its <strong>"Island Architecture."</strong></p>
<p>In a traditional React app, the entire page is hydrated (made interactive) at once. In Astro, the page is static HTML by default. JavaScript is only loaded for the specific "Islands" that need it.</p>
<p>For my Dragon Quest guide:</p>
<ul>
<li><p><strong>The Header/Footer:</strong> 0kb JS (Static HTML)</p>
</li>
<li><p><strong>The Article Text:</strong> 0kb JS (Static HTML)</p>
</li>
<li><p><strong>The Shard Checklist:</strong> Interactive React Component (Hydrates on load)</p>
</li>
</ul>
<p>This granular control is a game-changer for performance.</p>
<h2 id="heading-implementation-details">Implementation Details 🛠️</h2>
<h3 id="heading-1-the-component-structure">1. The Component Structure</h3>
<p>I used Tailwind CSS for styling. It allowed me to rapidly prototype a "Game Menu" aesthetic without fighting with CSS specificity.</p>
<p>Here is how a typical Loot Card component looks in Astro. Notice how clean the syntax is:</p>
<p>Code snippet</p>
<pre><code class="lang-plaintext">---
// Src/components/LootCard.astro
const { title, image, difficulty } = Astro.props;
---

&lt;div class="relative aspect-video w-full overflow-hidden rounded-xl border border-gray-200"&gt;
  &lt;img 
    src={image} 
    alt={title} 
    class="object-cover w-full h-full hover:scale-105 transition-transform" 
    loading="lazy"
  /&gt;
  &lt;div class="absolute bottom-2 right-2 bg-black/80 text-white text-xs px-2 py-1 rounded"&gt;
    {difficulty}
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>It renders as pure HTML. No Virtual DOM overhead.</p>
<h3 id="heading-2-state-management-without-a-backend">2. State Management without a Backend</h3>
<p>I needed users to be able to "Check off" items they found. But I didn't want to spin up a database (PostgreSQL/Supabase) or force users to login.</p>
<p><strong>Privacy-first approach:</strong> I used <code>localStorage</code>.</p>
<p>I created a simple React hook that runs only in the browser (client-side) to sync the checkbox state.</p>
<p>JavaScript</p>
<pre><code class="lang-plaintext">// A simplified version of my hook
const useProgress = (key) =&gt; {
  const [checked, setChecked] = useState(() =&gt; {
    if (typeof window !== 'undefined') {
      return JSON.parse(localStorage.getItem(key) || 'false');
    }
    return false;
  });

  useEffect(() =&gt; {
    localStorage.setItem(key, JSON.stringify(checked));
  }, [checked, key]);

  return [checked, setChecked];
};
</code></pre>
<p>In Astro, I mount this interactive component like this:</p>
<p>Code snippet</p>
<pre><code class="lang-plaintext">&lt;ShardChecklist client:load /&gt;
</code></pre>
<p>The <code>client:load</code> directive tells Astro: "Send JavaScript for <em>this specific component</em>, but keep the rest of the site static."</p>
<h2 id="heading-the-results">The Results 📊</h2>
<p>The difference is night and day.</p>
<ul>
<li><p><strong>Lighthouse Score:</strong> 100/100 (Performance, Accessibility, SEO).</p>
</li>
<li><p><strong>First Contentful Paint (FCP):</strong> 0.4s.</p>
</li>
<li><p><strong>User Feedback:</strong> "It feels like a native app."</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>As developers, we often over-engineer things. We use heavy frameworks for simple problems. Building this project reminded me that sometimes, <strong>less is more.</strong></p>
<p>If you are building a content-focused site (blog, portfolio, documentation), give Astro a try. Your users' battery life will thank you.</p>
<p>And if you are playing DQ7, check out the live tool to see the performance in action!</p>
<p><strong>👉 Live Demo:</strong> [<a target="_blank" href="https://dq7reimagined.com/">https://dq7reimagined.com/</a>]</p>
]]></content:encoded></item></channel></rss>