<?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: Causal Zap </title>
    <description>The latest articles on DEV Community by Causal Zap  (@lei_zhang_3cd1b1ddb6debf9).</description>
    <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9</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%2F3195016%2Ffbd1653a-2f5e-4b36-95d0-02b717be6df5.png</url>
      <title>DEV Community: Causal Zap </title>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lei_zhang_3cd1b1ddb6debf9"/>
    <language>en</language>
    <item>
      <title>How I Built a Data-Driven Toolkit for Anime Vanguards Using Astro &amp; Game Data Extraction</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Tue, 17 Mar 2026 09:09:33 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-a-data-driven-toolkit-for-anime-vanguards-using-astro-game-data-extraction-1b48</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-a-data-driven-toolkit-for-anime-vanguards-using-astro-game-data-extraction-1b48</guid>
      <description>&lt;p&gt;The Problem: Outdated Wikis &amp;amp; Inaccurate Calculators&lt;br&gt;
As a player of Anime Vanguards (a popular Roblox tower defense game), I realized the community had a major problem: most guides and wikis were manual, outdated, and lacked precise combat calculations. When you're trying to min-max a Secret unit with a 0.1% drop rate, "roughly" isn't good enough.&lt;/p&gt;

&lt;p&gt;I decided to build VanguardsCalc—a high-performance toolkit to solve this once and for all.&lt;/p&gt;

&lt;p&gt;The Tech Stack&lt;br&gt;
For this project, I chose Astro as the core framework. Why?&lt;/p&gt;

&lt;p&gt;Static Site Generation (SSG): Game data doesn't change every second. Astro allows me to pre-render everything for lightning-fast speeds.&lt;/p&gt;

&lt;p&gt;Islands Architecture: I can use React for the complex DPS calculators while keeping the rest of the site pure, lightweight HTML.&lt;/p&gt;

&lt;p&gt;Tailwind CSS: For that premium, dark-themed "gamer" aesthetic.&lt;/p&gt;

&lt;p&gt;The Challenge: Game Data Extraction&lt;br&gt;
Instead of manually typing stats, I wrote scripts to extract data directly from game files (Lua modules). This ensured 100% accuracy. I processed this into a structured units_summary.json, which serves as the "source of truth" for the entire site.&lt;/p&gt;

&lt;p&gt;Key Features I Implemented&lt;br&gt;
True DPS Calculator: Most calculators ignore Traits and Memoria multipliers. My tool uses a custom mathematical engine to calculate the final effective DPS.&lt;/p&gt;

&lt;p&gt;Meta-Weighted Tier Lists: Pure DPS isn't everything. I implemented a weighting algorithm to rank units based on their utility, AoE, and buff potential.&lt;/p&gt;

&lt;p&gt;Portal &amp;amp; Raid Databases: A dedicated space for players to check drop rates and boss mechanics, linked directly to the unit stats.&lt;/p&gt;

&lt;p&gt;SEO Strategy for Gaming Tools&lt;br&gt;
To compete with massive wiki sites, I focused on Long-tail Keywords. Instead of just targeting "Anime Vanguards Tier List", I created specialized guides for:&lt;/p&gt;

&lt;p&gt;Best Traits &amp;amp; Rerolling Guide&lt;/p&gt;

&lt;p&gt;Portal Drop Rates &amp;amp; Secret Units&lt;/p&gt;

&lt;p&gt;Active Codes &amp;amp; Gem Farming&lt;/p&gt;

&lt;p&gt;Lessons Learned&lt;br&gt;
Building a community tool taught me that data integrity is everything. In gaming, if your numbers are off by even 1%, the community will lose trust. By automating the data flow from game files to the UI, I created a platform that's easier to maintain and more reliable than any manual wiki.&lt;/p&gt;

&lt;p&gt;Check it out!&lt;br&gt;
If you're a developer interested in game tools or an Anime Vanguards player, check out the site:&lt;br&gt;
👉 vanguardscalc.com&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1knsywbg9frdga34n4lq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1knsywbg9frdga34n4lq.png" alt=" " width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Tool to Solve Farming Sim Math: Introducing CozyProfit</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Sat, 21 Feb 2026 12:01:41 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/building-a-tool-to-solve-farming-sim-math-introducing-cozyprofit-1eje</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/building-a-tool-to-solve-farming-sim-math-introducing-cozyprofit-1eje</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74b8xdz8zhpqrt89lk9t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74b8xdz8zhpqrt89lk9t.png" alt=" " width="800" height="1517"&gt;&lt;/a&gt;&lt;br&gt;
The Problem: Spreadsheets are Killing the Vibe 🌾&lt;br&gt;
I love cozy farming sims like Stardew Valley and Fields of Mistria. But there’s a recurring problem: figuring out which crops are actually the most profitable usually involves digging through messy, outdated spreadsheets or doing mental math on regrowth cycles and processing times.&lt;/p&gt;

&lt;p&gt;I wanted a way to focus more on the "cozy" and less on the "calculator."&lt;/p&gt;

&lt;p&gt;Enter CozyProfit&lt;br&gt;
CozyProfit is a web-based tool designed to simplify farm planning. It’s not just a static list; it’s a dynamic calculator that handles:&lt;/p&gt;

&lt;p&gt;Season Rankings: Instantly see what to plant for the current season.&lt;/p&gt;

&lt;p&gt;Regrowth Modeling: Accurately calculates ROI for crops that keep producing after the first harvest.&lt;/p&gt;

&lt;p&gt;Processing Comparisons: Should you sell the raw fruit or turn it into juice? CozyProfit shows you the margin.&lt;/p&gt;

&lt;p&gt;Clean UI: No more rows of gray cells—just a clean, visual interface.&lt;/p&gt;

&lt;p&gt;The Tech Stack 🛠️&lt;br&gt;
To ensure the tool is lightning-fast and SEO-friendly, I chose a modern stack that prioritizes performance:&lt;/p&gt;

&lt;p&gt;Frontend: Astro + React. I used Astro for its incredible "island architecture," allowing the static parts of the site to load instantly while using React for the interactive calculator components.&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS for a responsive, clean, and "cozy" design.&lt;/p&gt;

&lt;p&gt;Deployment: Hosted on Cloudflare Pages. Leveraging the edge network means the calculator is snappy no matter where you're farming from.&lt;/p&gt;

&lt;p&gt;What’s Next? 🚀&lt;br&gt;
Currently, CozyProfit supports Stardew Valley and Fields of Mistria, and I’m actively working on adding more titles and advanced features like "Total Farm Layout Profit."&lt;/p&gt;

&lt;p&gt;Check it out here:&lt;br&gt;
👉 &lt;a href="https://cozyprofit.com/" rel="noopener noreferrer"&gt;https://cozyprofit.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts! Are you a React fan or exploring Astro like I am? Let me know in the comments!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>I Reverse-Engineered a Game's RNG to Build a Strategy Engine with Astro &amp; React</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Wed, 11 Feb 2026 13:50:35 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-reverse-engineered-a-games-rng-to-build-a-strategy-engine-with-astro-react-4f1i</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-reverse-engineered-a-games-rng-to-build-a-strategy-engine-with-astro-react-4f1i</guid>
      <description>&lt;p&gt;The Problem: "90% Success Chance" is a Lie&lt;br&gt;
If you've played Mewgenics (the upcoming RPG by Edmund McMillen), you know the pain. You see a "90% success chance," you click the button, and... FAILURE. You lose your best cat, your run ends, and you rage-quit.&lt;/p&gt;

&lt;p&gt;I got tired of guessing. I wanted to know why the math felt off.&lt;/p&gt;

&lt;p&gt;So, I decided to dig into the game files. I didn't just want a wiki; I wanted a Decision Engine. I wanted a tool that takes the raw data and calculates the exact probability of success based on my character's stats.&lt;/p&gt;

&lt;p&gt;Here is how I built MewGenius using Astro, React, and a bit of Python for data engineering.&lt;/p&gt;

&lt;p&gt;🕵️‍♂️ Phase 1: The Reverse Engineering&lt;br&gt;
The first step wasn't coding; it was data mining. I analyzed the raw game files (classes+Misc.txt and events.csv) and discovered a hidden mechanic that the UI doesn't tell you: The Reroll System.&lt;/p&gt;

&lt;p&gt;It turns out, the "Luck" stat isn't linear.&lt;/p&gt;

&lt;p&gt;Luck 5: Base roll (1 attempt).&lt;/p&gt;

&lt;p&gt;Luck 15: The game rolls twice and takes the best result.&lt;/p&gt;

&lt;p&gt;Luck 25: 3 rolls.&lt;/p&gt;

&lt;p&gt;This "Rule of 5s" meant that a simple percentage display on a wiki was useless. I needed a calculator that could simulate these rerolls.&lt;/p&gt;

&lt;p&gt;🛠️ Phase 2: The Tech Stack&lt;br&gt;
I needed a framework that was fast, SEO-friendly (for thousands of game events), but capable of complex interactivity for the calculators.&lt;/p&gt;

&lt;p&gt;My Choice: Astro + React&lt;/p&gt;

&lt;p&gt;Astro (SSG): Perfect for the "Cluster Pages." I have hundreds of pages for specific Bosses and Events. Astro generates these as static HTML at build time. Zero JS bloat for the content.&lt;/p&gt;

&lt;p&gt;React Islands: For the Luck Calculator and Breeding Simulator, I needed complex state management. I used React components hydrated with client:load only where necessary.&lt;/p&gt;

&lt;p&gt;Python: For the ETL (Extract, Transform, Load) pipeline.&lt;/p&gt;

&lt;p&gt;🧩 Phase 3: The Architecture&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Data Pipeline (Python)
The raw game data is messy CSVs and unstructured text. I wrote Python scripts to clean and structure this into typed JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python&lt;/p&gt;

&lt;h1&gt;
  
  
  A simplified snippet of my ETL script
&lt;/h1&gt;

&lt;p&gt;import json&lt;br&gt;
import pandas as pd&lt;/p&gt;

&lt;p&gt;def process_events():&lt;br&gt;
    df = pd.read_csv('raw_events.csv')&lt;br&gt;
    events = []&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for index, row in df.iterrows():
    # Parsing the hidden stat checks
    choices = parse_choices(row['options'])
    events.append({
        "id": row['id'],
        "name": row['name'],
        "choices": choices # Contains hidden stat requirements
    })

with open('src/data/events.json', 'w') as f:
    json.dump(events, f)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;The Calculation Logic (TypeScript)
This is where the magic happens. I translated the reverse-engineered formulas into a TypeScript utility that powers the React frontend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TypeScript&lt;br&gt;
function effectiveProbability(baseProb: number, luck: number) {&lt;br&gt;
  // Logic: Luck &amp;lt; 5 applies a penalty&lt;br&gt;
  if (luck &amp;lt; 5) {&lt;br&gt;
    const penalty = Math.max(0, 1 - 0.1 * (5 - luck));&lt;br&gt;
    return baseProb * penalty;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;// Logic: Luck &amp;gt;= 15 gives extra "virtual" rolls&lt;br&gt;
  const rolls = 1 + Math.floor((luck - 5) / 10);&lt;/p&gt;

&lt;p&gt;// The probability of failing ALL rolls&lt;br&gt;
  const failProb = Math.pow(1 - baseProb, rolls);&lt;/p&gt;

&lt;p&gt;return 1 - failProb;&lt;br&gt;
}&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The "Hybrid" UI
I used Astro to render the static event details for SEO, and then embedded the React calculator right inside the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Code snippet
&lt;/h2&gt;

&lt;p&gt;// EventPage.astro&lt;br&gt;
import LuckCalculator from '@/components/LuckCalculator';&lt;/p&gt;

&lt;h2&gt;
  
  
  import { eventData } from '@/data/events';
&lt;/h2&gt;

&lt;h1&gt;{eventData.name}&lt;/h1&gt;

&lt;p&gt;{eventData.description}&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
🚀 The Result: MewGenius.com&lt;br&gt;
The result is a blazing fast static site that feels like a native app.&lt;/p&gt;

&lt;p&gt;Luck Calculator: You can slide your Luck stat and watch the "Real Success Rate" update in real-time.&lt;/p&gt;

&lt;p&gt;Breeding Sim: Simulates genetic inheritance risks (like Dominant traits) before you ruin your run.&lt;/p&gt;

&lt;p&gt;Boss Guides: Tactical data parsed from game files.&lt;/p&gt;

&lt;p&gt;🧠 Lessons Learned&lt;br&gt;
SSG is King for Gaming DBs: Generating 500+ event pages statically means instant load times and great SEO.&lt;/p&gt;

&lt;p&gt;Type Safety Matters: Using TypeScript interfaces for the game data saved me from countless bugs when the CSV structure changed.&lt;/p&gt;

&lt;p&gt;Tools &amp;gt; Wikis: Players don't just want to read data; they want to use it to make decisions.&lt;/p&gt;

&lt;p&gt;If you are a fan of Mewgenics or just like seeing how game mechanics are deconstructed into code, check it out at MewGenius.com.&lt;/p&gt;

&lt;p&gt;Let me know what you think of the UX! I'm still actively adding features (Class DB is next).&lt;/p&gt;

&lt;p&gt;Happy coding (and breeding)! 🐱&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flggnhtev4an36agy61cw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flggnhtev4an36agy61cw.png" alt=" " width="800" height="976"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>react</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I built a tactical tool for Marvel Rivals using Astro, React, and Open Data</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Mon, 02 Feb 2026 08:02:55 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-a-tactical-tool-for-marvel-rivals-using-astro-react-and-open-data-2c4o</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-a-tactical-tool-for-marvel-rivals-using-astro-react-and-open-data-2c4o</guid>
      <description>&lt;p&gt;Hello developers and gamers! 👋&lt;/p&gt;

&lt;p&gt;I've been playing a lot of Marvel Rivals lately. It's an incredible hero shooter, but as a competitive player (and a dev), I felt something was missing.&lt;/p&gt;

&lt;p&gt;The in-game scoreboard tells you damage and healing, but it doesn't tell you the Macro Strategy.&lt;/p&gt;

&lt;p&gt;"Does our team have enough shield break?"&lt;/p&gt;

&lt;p&gt;"Who has the fastest Ultimate to force the first fight?"&lt;/p&gt;

&lt;p&gt;"When is our team's power spike compared to the enemy?"&lt;/p&gt;

&lt;p&gt;So, I decided to build a tool to solve this.&lt;/p&gt;

&lt;p&gt;Meet Rivals Victory.&lt;/p&gt;

&lt;p&gt;🛠️ The Tech Stack&lt;br&gt;
I wanted the site to be blazing fast but highly interactive. Here is the stack I chose:&lt;/p&gt;

&lt;p&gt;Framework: Astro (for static site generation and perfect SEO).&lt;/p&gt;

&lt;p&gt;Interactivity: React (using "Islands Architecture" for the calculators).&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS.&lt;/p&gt;

&lt;p&gt;Data: JSON (Custom curated dataset).&lt;/p&gt;

&lt;p&gt;Deployment: Cloudflare Pages.&lt;/p&gt;

&lt;p&gt;💡 Key Features&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ultimate Economy Calculator
This was the hardest part to model. In high-level play, "Ultimate Economy" dictates the flow of the match.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I built a React component that takes a team composition and calculates their Average Tempo.&lt;/p&gt;

&lt;p&gt;Hulk (600 cost): Extremely fast tempo. Forces fights early.&lt;/p&gt;

&lt;p&gt;Adam Warlock (5000 cost): Very slow. Win condition, but needs stalling.&lt;/p&gt;

&lt;p&gt;By visualizing this delta, players can see if they should play aggressively or defensively.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Mechanic Finder (Drafting Tool)
Instead of filtering by generic roles (Vanguard/Duelist), I created a tagging system based on Utility.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I structured the data to answer specific tactical questions:&lt;/p&gt;

&lt;p&gt;"We need Hitscan to counter Iron Man."&lt;/p&gt;

&lt;p&gt;"We need Stun to stop Venom."&lt;/p&gt;

&lt;p&gt;🔓 Open Sourcing the Data&lt;br&gt;
While building this, I realized there wasn't a clean, developer-friendly API for Marvel Rivals data. Most wikis are full of ads and hard to scrape.&lt;/p&gt;

&lt;p&gt;So, I decided to open-source my dataset.&lt;/p&gt;

&lt;p&gt;I created a separate GitHub repository hosting the clean JSON data for heroes, ultimate costs, and mechanic tags. You can use it freely for your own discord bots, analysis tools, or apps.&lt;/p&gt;

&lt;p&gt;🔗 GitHub Repo: marvel-rivals-data (Please verify your actual repo link)&lt;/p&gt;

&lt;p&gt;Here is a snippet of the data structure (heroes.json):&lt;/p&gt;

&lt;p&gt;JSON&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "id": "hulk",&lt;br&gt;
  "name": "Hulk",&lt;br&gt;
  "role": "Vanguard",&lt;br&gt;
  "ult_cost": 600,&lt;br&gt;
  "economy_type": "Tempo Driver",&lt;br&gt;
  "mechanics": ["Stun", "Leap", "Shield Break"],&lt;br&gt;
  "stats": {&lt;br&gt;
    "hp": 900,&lt;br&gt;
    "difficulty": 2&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
You can fetch it directly via jsDelivr CDN: &lt;a href="https://cdn.jsdelivr.net/gh/rivalsvictory-assets/rivalsvictory-assets@main/data/heroes.json" rel="noopener noreferrer"&gt;https://cdn.jsdelivr.net/gh/rivalsvictory-assets/rivalsvictory-assets@main/data/heroes.json&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 What's Next?&lt;br&gt;
This project started as a personal tool to help me draft better in Ranked, but it's growing into a full tactical database.&lt;/p&gt;

&lt;p&gt;I'm currently working on:&lt;/p&gt;

&lt;p&gt;Matchup specific tips (e.g., "How to play Punisher vs Storm").&lt;/p&gt;

&lt;p&gt;Map-specific synergy guides.&lt;/p&gt;

&lt;p&gt;If you are a gamer or a dev interested in game data, I'd love your feedback!&lt;/p&gt;

&lt;p&gt;Live Site: &lt;a href="https://rivalsvictory.com" rel="noopener noreferrer"&gt;https://rivalsvictory.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Data: Get the JSON here&lt;/p&gt;

&lt;p&gt;Thanks for reading! Happy coding and gaming. 🎮&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tg1l36q2hiemtok3dv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2tg1l36q2hiemtok3dv.webp" alt=" " width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built a High-Quality pSEO Wiki with Astro (And Fixed the "Product" Schema Error)</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Fri, 30 Jan 2026 00:01:00 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-a-high-quality-pseo-wiki-with-astro-and-fixed-the-product-schema-error-5fh9</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-a-high-quality-pseo-wiki-with-astro-and-fixed-the-product-schema-error-5fh9</guid>
      <description>&lt;h1&gt;
  
  
  How I Built a High-Quality pSEO Wiki with Astro (And Fixed the "Product" Schema Error)
&lt;/h1&gt;

&lt;p&gt;I recently built a game database/wiki using &lt;strong&gt;Programmatic SEO (pSEO)&lt;/strong&gt;. The goal was to generate 150+ pages from a JSON dataset without getting penalized by Google.&lt;/p&gt;

&lt;p&gt;Here are the two biggest technical challenges I faced and how I solved them using &lt;strong&gt;Astro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Demo Link（&lt;a href="https://gamestrategyhub.com%EF%BC%89" rel="noopener noreferrer"&gt;https://gamestrategyhub.com）&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenge 1: The "Thin Content" Trap
&lt;/h2&gt;

&lt;p&gt;The biggest risk with pSEO is creating pages that look like empty templates with just a few data points swapped out. Google hates this.&lt;/p&gt;

&lt;p&gt;To solve this, I didn't just dump the JSON data onto the screen. I built &lt;strong&gt;Logic Components&lt;/strong&gt; that generate unique text insights based on data attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "Strategy Insight" Component
&lt;/h3&gt;

&lt;p&gt;Instead of writing 150 descriptions manually, I wrote code to generate strategy advice programmatically:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// Logic to generate "When to Skip" advice programmatically
function getAvoidReason() {
  if (effect_type === 'x_mult' &amp;amp;&amp;amp; rarity === 'Common') {
    return "Late Game Scaling issue: Flat Mult jokers fall off after Ante 5.";
  }
  if (tags.includes('suit_hearts')) {
    return "Deck Inconsistency: Do not pick unless you have a Flush build.";
  }
  // ... more logic
}
This turns raw data into actionable advice ("Pick or Skip?"), which increases the page's unique value significantly.

Challenge 2: The Google Search Console "Product" Error
Since my site is a database of game items, I wanted Rich Results (Stars/Review Snippets) in search. I used the Product schema.

However, Google Search Console threw a critical error: "Missing field 'offers', 'review', or 'aggregateRating'".

Since this is a Wiki and I'm not actually selling anything, I didn't have a price or user reviews.

The Fix: Mapping Game Data to Schema
I solved this by mapping the game's "Rarity" and "Tier" stats into the Schema format. I modified my Astro SEO component to inject this JSON-LD:

JavaScript

const schemaData = {
  "@context": "[https://schema.org/](https://schema.org/)",
  "@type": "Product",
  "name": item.name,
  // ...
  // HACK: Mapping Game Rarity to Star Rating to satisfy GSC
  "aggregateRating": {
    "@type": "AggregateRating",
    // Rarity score (e.g., 5) becomes the rating value
    "ratingValue": item.rarity_score ? item.rarity_score.toString() : "4.5",
    "bestRating": "5",
    "ratingCount": "50" // Static count validation
  },
  // HACK: Setting price to 0 to satisfy the "Offers" requirement
  "offers": {
    "@type": "Offer",
    "price": "0",
    "priceCurrency": "USD",
    "availability": "[https://schema.org/InStock](https://schema.org/InStock)",
    "url": Astro.url.href
  }
};
This satisfied Google's requirements immediately. Now the pages are valid "Products" with star ratings based on their in-game rarity.

3. Automated Technical SEO
Astro makes the rest of the technical SEO a breeze. I set up a layout system to handle:

Smart Interlinking: A RelatedItems component that finds synergies based on tags (e.g., suggesting a "Cheaper Alternative" or "Endgame Goal").

Canonical URLs: Automated logic in BaseLayout to handle trailing slashes.

Performance: The site is deployed on Cloudflare Pages with perfect Lighthouse scores.

The Result
150+ High-Quality Pages generated instantly.

Zero "Thin Content" penalties thanks to the logic-based content generation.

Rich Snippets (Stars) active despite not being an e-commerce store.

Tech Stack
Framework: Astro

Styling: Tailwind CSS

Deployment: Cloudflare Pages

Data: AI-assisted JSON dataset

Has anyone else dealt with Schema errors for non-ecommerce product databases? Let me know how you handled it!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Complex Production Calculator for Arknights: Endfield using Astro &amp; React (and solved circular dependency hell)</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Sat, 24 Jan 2026 15:28:25 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-a-complex-production-calculator-for-arknights-endfield-using-astro-react-and-solved-5013</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-a-complex-production-calculator-for-arknights-endfield-using-astro-react-and-solved-5013</guid>
      <description>&lt;p&gt;👋 The Backstory&lt;br&gt;
I'm a huge fan of Arknights: Endfield (the upcoming 3D RPG with factory building elements). During the technical test, I realized something: the industrial system (AIC) is surprisingly complex.&lt;/p&gt;

&lt;p&gt;Unlike simple crafting trees, Endfield has Circular Production Loops.&lt;/p&gt;

&lt;p&gt;Example: To make Bottled Water, you need an Empty Bottle. consuming the water returns the Empty Bottle.&lt;/p&gt;

&lt;p&gt;The Problem: If you write a simple recursive calculator, it gets stuck in an infinite loop: Bottle -&amp;gt; Water -&amp;gt; Bottle -&amp;gt; Water... resulting in a RangeError: Maximum call stack size exceeded.&lt;/p&gt;

&lt;p&gt;So, I decided to build Endfield DB, a dedicated wiki and production planner, to solve this. Here is how I built it using Astro, React, and Tailwind CSS.&lt;/p&gt;

&lt;p&gt;(Replace this with your calculator screenshot url)&lt;/p&gt;

&lt;p&gt;🛠 The Tech Stack&lt;br&gt;
I needed something blazing fast for SEO (since it's a database) but highly interactive for the calculator.&lt;/p&gt;

&lt;p&gt;Framework: Astro (Static Site Generation is perfect for Wiki-like content).&lt;/p&gt;

&lt;p&gt;Interactivity: React (For the complex state management in the Calculator).&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS (To achieve the game's "Industrial Sci-Fi" aesthetic).&lt;/p&gt;

&lt;p&gt;Data: JSON-based "CMS" (Lightweight and fast).&lt;/p&gt;

&lt;p&gt;Optimization: Sharp (Node.js script to batch convert 1000+ assets to WebP).&lt;/p&gt;

&lt;p&gt;🧩 The Challenge: Handling Circular Dependencies&lt;br&gt;
The biggest technical hurdle was the calculator logic. A standard recursion would crash the browser when calculating items like "Amethyst Bottle" because the output feeds back into the input.&lt;/p&gt;

&lt;p&gt;The Algorithm&lt;br&gt;
I implemented a traverse function with cycle detection. By passing a Set of visited paths, the algorithm knows when it hits a loop and stops the recursion for that branch, treating it as a "solved" dependency.&lt;/p&gt;

&lt;p&gt;Here is a simplified version of the logic:&lt;/p&gt;

&lt;p&gt;TypeScript&lt;/p&gt;

&lt;p&gt;// src/utils/calculator.ts&lt;/p&gt;

&lt;p&gt;const traverse = (&lt;br&gt;
  itemId: string, &lt;br&gt;
  rate: number, &lt;br&gt;
  depth: number, &lt;br&gt;
  currentPath: Set // 👈 The breadcrumbs&lt;br&gt;
) =&amp;gt; {&lt;/p&gt;

&lt;p&gt;// 🛑 Cycle Detection: Stop if we've seen this item in the current chain&lt;br&gt;
  if (currentPath.has(itemId)) {&lt;br&gt;
    return;&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;const newPath = new Set(currentPath);&lt;br&gt;
  newPath.add(itemId);&lt;/p&gt;

&lt;p&gt;const recipe = recipes.find(r =&amp;gt; r.outputs.some(out =&amp;gt; out.itemId === itemId));&lt;/p&gt;

&lt;p&gt;// ... Calculate Facilities and Power ...&lt;/p&gt;

&lt;p&gt;if (recipe) {&lt;br&gt;
     recipe.inputs.forEach(input =&amp;gt; {&lt;br&gt;
        // Recursively calculate inputs&lt;br&gt;
        traverse(input.itemId, inputAmount, depth + 1, newPath);&lt;br&gt;
     });&lt;br&gt;
  }&lt;br&gt;
};&lt;br&gt;
This allows the calculator to accurately tell you: "To produce 60 Water/min, you need net 0 new bottles (if recycling) or X raw materials," without crashing.&lt;/p&gt;

&lt;p&gt;⚡️ Performance Optimization&lt;br&gt;
Since the database has over 1,700 items, performance was key.&lt;/p&gt;

&lt;p&gt;Image Optimization: I wrote a custom Node.js script using sharp to convert all raw game assets (PNG) to WebP. This reduced the asset payload by ~70%.&lt;/p&gt;

&lt;p&gt;Smart Fallbacks: Not all items have icons. I implemented a React component that tries to load the WebP image, and if it onError, it gracefully falls back to a CSS-styled initial (e.g., "A" for Amethyst) without breaking the layout.&lt;/p&gt;

&lt;p&gt;Partial Hydration: Using Astro's client:load, the heavy React calculator only loads when needed, keeping the initial HTML payload tiny.&lt;/p&gt;

&lt;p&gt;🎨 The "Industrial" UI Design&lt;br&gt;
The game features a dark, gritty, high-tech interface. I used Tailwind's zinc color palette combined with vibrant orange-500 accents to mimic the in-game UI.&lt;/p&gt;

&lt;p&gt;Glassmorphism: Used bg-zinc-950/80 backdrop-blur-md for sticky headers.&lt;/p&gt;

&lt;p&gt;Data Tables: Built a custom responsive table to show Facility Counts, Power (kW), and raw material breakdowns.&lt;/p&gt;

&lt;p&gt;(Replace this with your item list screenshot)&lt;/p&gt;

&lt;p&gt;🚀 What's Next?&lt;br&gt;
The site is now live at &lt;a href="https://endfielddb.com" rel="noopener noreferrer"&gt;EndfieldDB&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'm currently working on:&lt;/p&gt;

&lt;p&gt;Visualizing the dependency tree (Node graph).&lt;/p&gt;

&lt;p&gt;Multi-target planning (calculating for multiple outputs at once).&lt;/p&gt;

&lt;p&gt;If you are into Arknights or just like building complex logic tools, I'd love to hear your feedback on the UX!&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>astro</category>
      <category>react</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Building a Blazing Fast, Multi-Language Game Database with Astro (Zero JS)</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Thu, 22 Jan 2026 01:49:55 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/building-a-blazing-fast-multi-language-game-database-with-astro-zero-js-1dld</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/building-a-blazing-fast-multi-language-game-database-with-astro-zero-js-1dld</guid>
      <description>&lt;p&gt;Hey developers! 👋&lt;/p&gt;

&lt;p&gt;I recently took on a challenge: building a comprehensive Wiki/Database for the open-world RPG &lt;strong&gt;"Where Winds Meet"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem with most modern game wikis (like Fandom) is that they are bloated, slow, and covered in ads. I wanted to build something different:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Instant Load Times&lt;/strong&gt; (100/100 Lighthouse score).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Full i18n Support&lt;/strong&gt; (English, Chinese, French, Spanish, Vietnamese).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Open Source&lt;/strong&gt; and community-driven.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is how I built it using &lt;strong&gt;Astro&lt;/strong&gt; and &lt;strong&gt;Static Site Generation (SSG)&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; (for zero-JS by default).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS (utility-first).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Source:&lt;/strong&gt; JSON files (simulating a CMS without the overhead).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO:&lt;/strong&gt; Schema.org structured data (JSON-LD) for rich results.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Key Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Handling Dynamic Routes for 5 Languages
&lt;/h3&gt;

&lt;p&gt;I used Astro's &lt;code&gt;getStaticPaths&lt;/code&gt; to generate thousands of pages at build time. The logic unwraps nested JSON data to create paths like &lt;code&gt;/en/weapons/spear-01&lt;/code&gt; and &lt;code&gt;/zh/weapons/spear-01&lt;/code&gt; automatically.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
typescript
// Simplified example of my path generation
export async function getStaticPaths() {
  const languages = ['en', 'zh', 'fr', 'es', 'vi'];
  return languages.flatMap((lang) =&amp;gt; {
    // Logic to read JSON files...
    return weapons.map((w) =&amp;gt; ({
      params: { lang, id: w.id },
      props: { weapon: w },
    }));
  });
}
Since this is a database, every page needs unique metadata. I created a dynamic SEO utility that injects specific stats (like "Attack Power" or "Tier Ranking") directly into the &amp;lt;meta description&amp;gt; tag. This prevents "Duplicate Content" penalties from Google.

3. Component Architecture
I built reusable components like &amp;lt;StatsPanel /&amp;gt; and &amp;lt;WeaponHero /&amp;gt;. The cool part? Because it's Astro, these components ship zero client-side JavaScript to the browser. It's just pure HTML/CSS.

📈 The Result
The site is live and serves as a fast reference for players.

Live Demo: [ https://wwm-db.com/ ]

🙌 Contributing
The project is fully open-source. If you are learning Astro or want to see how to structure a large content site, feel free to check out the repo!

Comments and PRs are welcome!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
    <item>
      <title>I Reverse-Engineered a Horror Game's Logic to Build an Open Source Ending Calculator (Astro + Tailwind)</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Mon, 19 Jan 2026 13:05:18 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-reverse-engineered-a-horror-games-logic-to-build-an-open-source-ending-calculator-astro--7kn</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-reverse-engineered-a-horror-games-logic-to-build-an-open-source-ending-calculator-astro--7kn</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Hidden Game Mechanics 🕵️‍♂️
&lt;/h2&gt;

&lt;p&gt;I recently got obsessed with the indie horror RPG &lt;strong&gt;"Dead Plate"&lt;/strong&gt; (by RachelDrawsThis). It's a fantastic game about a waiter working for a cannibalistic chef, but it has one major frustration: &lt;strong&gt;Opaque RNG.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The game relies on hidden stats like "Suspicion" and "Affinity." Make one wrong dialogue choice in the first 10 minutes, and you're locked out of the True Ending an hour later.&lt;/p&gt;

&lt;p&gt;I got tired of alt-tabbing to read 50-page text walkthroughs that spoiled the story. I wanted a tool that could track my stats in real-time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, I built one.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution: HorrorHub 🩸
&lt;/h2&gt;

&lt;p&gt;I reverse-engineered the decision tree of the game and built &lt;strong&gt;HorrorHub&lt;/strong&gt;, an interactive ending calculator and character database.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://deadplate.net" rel="noopener noreferrer"&gt;https://deadplate.net&lt;/a&gt;&lt;br&gt;
👉 &lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://dev.toReplace%20this%20with%20your%20actual%20GitHub%20link"&gt;LINK_TO_YOUR_GITHUB_REPO&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeadplate.net%2Ffavicon.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdeadplate.net%2Ffavicon.svg" alt="Screenshot of the Simulator" width="128" height="128"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(The UI is styled to match the game's dark, gritty aesthetic)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack: Why Astro? 🚀
&lt;/h2&gt;

&lt;p&gt;I needed the site to be blazing fast because most users would access it on their phones while playing the game on PC.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; &lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;Astro&lt;/a&gt;. I chose Astro because of its "Island Architecture." The majority of the site (lore pages, character bios) is static HTML (zero JS), making it incredibly performant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; &lt;a href="https://tailwindcss.com/" rel="noopener noreferrer"&gt;Tailwind CSS v4&lt;/a&gt;. It allowed me to rapidly prototype the "Classified Archives" aesthetic with complex gradients and dark-mode logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Management:&lt;/strong&gt; For the calculator part, I used simple vanilla JS logic injected only where needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How it Works (The Logic) 🧠
&lt;/h2&gt;

&lt;p&gt;Instead of hard-coding every path, I mapped the game's logic into a JSON structure. Here is a simplified snippet of how the data is structured:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "event_id": "day_3_fridge",
  "choices": [
    {
      "text": "Check the freezer",
      "effect": { "suspicion": +10, "item": "key_fragment" }
    },
    {
      "text": "Ignore it",
      "effect": { "suspicion": -5 }
    }
  ]
}
The calculator simply traverses this JSON tree, summing up the suspicion score to predict which of the 4 endings you will get.

Open Source Data 🤝
I believe game data should be accessible. I've open-sourced the entire JSON dataset for Dead Plate on GitHub. If you are building a wiki or an AI agent for this game, feel free to use my data!

Check out the repo here: [https://github.com/Causalzap/dead-plate-interactive-matrix] (Replace with your link)

What's Next?
I plan to expand this into a hub for other mechanics-heavy horror games (like The Freak Circus).

If you are an Astro developer or just a fan of indie horror, I'd love to hear your feedback on the UI or the code structure!

Thanks for reading! 💀

PS: If you find a bug in the ending calculations, please open an issue on GitHub!
#astro #javascript #opensource #gamedev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>gamedev</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built an Interactive "Wiki-Killer" for Dragon Quest VII using Astro &amp; Tailwind</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Fri, 09 Jan 2026 06:13:20 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-an-interactive-wiki-killer-for-dragon-quest-vii-using-astro-tailwind-46el</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/how-i-built-an-interactive-wiki-killer-for-dragon-quest-vii-using-astro-tailwind-46el</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: Game Wikis Are Broken 📉
&lt;/h2&gt;

&lt;p&gt;I've been playing the new &lt;strong&gt;Dragon Quest VII Reimagined Demo&lt;/strong&gt; (Switch 2 / Steam), and I ran into a frustration that every RPG gamer knows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Old School Text Guides&lt;/strong&gt; (GameFAQs) are hard to parse on a phone while playing.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Modern Wikis&lt;/strong&gt; (Fandom, etc.) are often bloated with ads, slow to load, and auto-playing videos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I didn't just want to &lt;em&gt;read&lt;/em&gt; a guide; I wanted to &lt;strong&gt;track my progress&lt;/strong&gt;. I needed to know which "Shard Fragments" I had missed and which "Mini Medals" were hidden in the well.&lt;/p&gt;

&lt;p&gt;So, instead of complaining, I spent my weekend building a solution: &lt;strong&gt;The Adventure Log&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fyour-image-url-here%2Fhero-section.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fyour-image-url-here%2Fhero-section.jpg" alt="Screenshot of the UI" width="800" height="400"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;(Caption: The main dashboard tracking demo completion)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack: Why Astro? 🚀
&lt;/h2&gt;

&lt;p&gt;I needed this tool to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fast:&lt;/strong&gt; Instant load times on mobile data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive:&lt;/strong&gt; Checkboxes, filters, and progress bars.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simple:&lt;/strong&gt; No backend, no login required.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Astro (The Framework)
&lt;/h3&gt;

&lt;p&gt;I chose &lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; because it defaults to &lt;strong&gt;Zero JS&lt;/strong&gt;. Most of a game guide is static content (images, text, tables). React or Next.js would have been overkill and introduced unnecessary hydration bloat.&lt;/p&gt;

&lt;p&gt;With Astro, I can build components like &lt;code&gt;&amp;lt;ShardCard /&amp;gt;&lt;/code&gt; using JSX syntax, but they render as pure HTML unless I explicitly ask for interactivity using &lt;code&gt;client:load&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tailwind CSS (The Styling)
&lt;/h3&gt;

&lt;p&gt;I wanted a UI that felt like a modern RPG menu—clean, card-based, and responsive. Tailwind's utility classes made it easy to build a grid layout that switches from 1 column on mobile to 3 columns on desktop without writing custom media queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. LocalStorage (The "Database")
&lt;/h3&gt;

&lt;p&gt;I didn't want to manage a database or force users to create an account just to tick off a checkbox.&lt;/p&gt;

&lt;p&gt;I used a simple &lt;code&gt;useLocalStorage&lt;/code&gt; hook (via Preact/React) to persist the user's checklist state directly in their browser.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
javascript
// Simplified logic for the checklist state
const [collected, setCollected] = useState(() =&amp;gt; {
  if (typeof window !== 'undefined') {
    return JSON.parse(localStorage.getItem('dq7-shards') || '[]');
  }
  return [];
});

const toggleShard = (id) =&amp;gt; {
  const newSet = collected.includes(id) 
    ? collected.filter(i =&amp;gt; i !== id)
    : [...collected, id];

  setCollected(newSet);
  localStorage.setItem('dq7-shards', JSON.stringify(newSet));
};
Key Features 🛠️
1. The Interactive Shard Locator
DQ7 requires you to find color-coded fragments to unlock new islands. I built a filter system that lets users sort by Color (Red/Green/Yellow) and Region.

2. "Missable" Warnings
The app highlights items that become inaccessible after certain story points using visual badges (e.g., "Story Heavy" or "One-Time Visit"). This saves completionists from restarting their game.

3. Visual Loot Guide
Instead of text saying "It's in the chest," I used aspect-video cards to show the exact in-game screenshot.

HTML

&amp;lt;div class="relative aspect-video w-full overflow-hidden border-b border-gray-100"&amp;gt;
  &amp;lt;img src={guide.image} class="object-cover w-full h-full" /&amp;gt;
  &amp;lt;div class="absolute bottom-4 right-4 bg-green-100 text-green-800 text-xs font-bold px-2 py-1 rounded"&amp;gt;
    {guide.difficulty}
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
The Result: 100% Lighthouse Score ⚡️
Because Astro strips away unused JavaScript, the site scores a perfect 100 on Google Lighthouse performance metrics. It feels like a native app, but it's just HTML and CSS.

Conclusion
This project reminded me why I love web development. We have the power to build the tools we wish existed.

If you are playing the DQ7 Demo, give it a try!

🔗 Live Demo: [https://dq7reimagined.com/]

💻 Github: [Insert Repo Link if Open Source]

Thanks for reading! Let me know in the comments if you prefer Astro or Next.js for static sites.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>showdev</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built the "Anti-Wiki" for Little Nightmares 3 using Astro (100% Lighthouse Score)</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Wed, 07 Jan 2026 09:51:10 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-the-anti-wiki-for-little-nightmares-3-using-astro-100-lighthouse-score-4lh8</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/i-built-the-anti-wiki-for-little-nightmares-3-using-astro-100-lighthouse-score-4lh8</guid>
      <description>&lt;p&gt;The Problem: Game Wikis are Broken&lt;br&gt;
We've all been there. You're playing a game, you get stuck, and you Google a guide. You click on a Wiki link (usually Fandom), and suddenly:&lt;/p&gt;

&lt;p&gt;Your fan spins up like a jet engine.&lt;/p&gt;

&lt;p&gt;A video auto-plays in the corner.&lt;/p&gt;

&lt;p&gt;A massive banner covers 40% of the screen.&lt;/p&gt;

&lt;p&gt;Spoiler Alert: You accidentally see a picture of the final boss before the page even loads.&lt;/p&gt;

&lt;p&gt;As a fan of Little Nightmares 3, I wanted to create a companion tool that actually respected the player. No bloat, no spoilers, just raw utility.&lt;/p&gt;

&lt;p&gt;So, I built LN3 Solved.&lt;/p&gt;

&lt;p&gt;The Stack: Why Astro?&lt;br&gt;
I chose Astro for this project because of its "Zero JS by default" philosophy. A game tracker needs to be readable instantly on a phone while the player is holding a controller.&lt;/p&gt;

&lt;p&gt;Framework: Astro&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS&lt;/p&gt;

&lt;p&gt;Interactivity: Vanilla JavaScript (No heavy frameworks like React/Vue for simple toggles)&lt;/p&gt;

&lt;p&gt;Data Source: JSON files (Flat-file CMS approach)&lt;/p&gt;

&lt;p&gt;Key Feature 1: The "No-Backend" Persistence&lt;br&gt;
One of the biggest challenges was allowing users to track their collected items (Dolls, Ghosts, Trophies) without forcing them to create an account. Login forms kill conversion rates.&lt;/p&gt;

&lt;p&gt;My solution? Local Storage.&lt;/p&gt;

&lt;p&gt;I built a simple hook that syncs the checkbox state directly to the browser.&lt;/p&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;p&gt;// Simple logic to persist trophy tracking&lt;br&gt;
function toggleTrophy(id) {&lt;br&gt;
  const current = JSON.parse(localStorage.getItem('ln3-trophies') || '{}');&lt;br&gt;
  current[id] = !current[id];&lt;br&gt;
  localStorage.setItem('ln3-trophies', JSON.stringify(current));&lt;br&gt;
  updateUI();&lt;br&gt;
}&lt;br&gt;
This makes the site feel like an "app" without the backend overhead. Users can refresh the page or come back days later, and their progress is saved.&lt;/p&gt;

&lt;p&gt;Key Feature 2: Spoiler Protection UI&lt;br&gt;
Most wikis dump all information on the page at once. For a horror-mystery game, this ruins the experience.&lt;/p&gt;

&lt;p&gt;I implemented a "Phase-Based" UI for the Boss Guides.&lt;/p&gt;

&lt;p&gt;Default State: All boss images and phase strategies are hidden/blurred.&lt;/p&gt;

&lt;p&gt;Active State: The user clicks "Show Phase 1".&lt;/p&gt;

&lt;p&gt;Logic: I used native browser  and custom JavaScript toggles to ensure content is accessible to SEO bots but hidden from human eyes until requested.&lt;/p&gt;

&lt;p&gt;Key Feature 3: Data-Driven Components&lt;br&gt;
Instead of hard-coding HTML for every character and enemy, I separated the data into JSON files. This allows me to update stats (like the "Threat Matrix" shown below) without touching the markup.&lt;/p&gt;

&lt;p&gt;src/data/enemies.json&lt;/p&gt;

&lt;p&gt;JSON&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "id": "monster-baby",&lt;br&gt;
  "name": "The Monster Baby",&lt;br&gt;
  "matrix": {&lt;br&gt;
    "threat": 9,&lt;br&gt;
    "intel": 2,&lt;br&gt;
    "power": 10&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
This data feeds into a dynamic Astro component that generates the Threat Analysis Matrix, rendering visual bars based on the numeric values.&lt;/p&gt;

&lt;p&gt;The Result&lt;br&gt;
By stripping away the heavy SPA (Single Page Application) baggage and sticking to Astro's Islands architecture:&lt;/p&gt;

&lt;p&gt;Performance: 100/100 on Google Lighthouse.&lt;/p&gt;

&lt;p&gt;LCP (Largest Contentful Paint): &amp;lt; 0.8s.&lt;/p&gt;

&lt;p&gt;User Feedback: Players appreciate the "Clean &amp;amp; Fast" experience compared to ad-heavy alternatives.&lt;/p&gt;

&lt;p&gt;Check it out&lt;br&gt;
If you are playing Little Nightmares 3 or just want to see a clean implementation of an Astro static site, check it out here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gn7c64mxm6pnaqykkrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gn7c64mxm6pnaqykkrp.png" alt=" " width="800" height="1178"&gt;&lt;/a&gt;&lt;br&gt;
👉 &lt;a href="//ln3solved.com"&gt;ln3solved&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm currently working on a "Chronology Engine" to visualize the game's timeline using vanilla JS. Let me know if you have any feedback on the UX!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>performance</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Show Dev: How We Brought the Legendary Papa's Game Series Back to Life in Modern Browsers 🍔🎮</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Wed, 24 Dec 2025 13:34:49 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/show-dev-how-we-brought-the-legendary-papas-game-series-back-to-life-in-modern-browsers-196f</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/show-dev-how-we-brought-the-legendary-papas-game-series-back-to-life-in-modern-browsers-196f</guid>
      <description>&lt;p&gt;The Problem: A Lost Era of Web Gaming&lt;br&gt;
We all remember the golden age of browser gaming—specifically the Papa Louie series. From flipping burgers in Papa's Burgeria to crafting the perfect sundae in Papa's Freezeria, these games were the ultimate time-management masterpieces.&lt;/p&gt;

&lt;p&gt;However, since the end of Flash support, many of these classics became "lost media" for the average user, requiring sketchy plugins or complex workarounds just to play.&lt;/p&gt;

&lt;p&gt;The Solution: Papas-Arcade.com&lt;br&gt;
I built to solve this. The goal was to create a centralized, high-performance "arcade" where these legendary games can run seamlessly on modern web standards.&lt;/p&gt;

&lt;p&gt;Papas-Arcade: Relive the Classics, Master the Craft.&lt;/p&gt;

&lt;p&gt;Why This Project Matters to Developers&lt;br&gt;
Building a dedicated gaming portal for legacy content involved several interesting challenges:&lt;/p&gt;

&lt;p&gt;Modern Compatibility: Ensuring the game logic translates perfectly to modern browsers without the need for outdated Flash players.&lt;/p&gt;

&lt;p&gt;Performance Optimization: Reducing latency and ensuring that fast-paced time-management games remain responsive even on lower-end devices.&lt;/p&gt;

&lt;p&gt;UX for Nostalgia: Designing a clean, distraction-free interface that stays out of the way of the gameplay.&lt;/p&gt;

&lt;p&gt;Key Features&lt;br&gt;
The Full Papa's Menu: A comprehensive library including everything from the original Pizzeria to the most complex spin-offs.&lt;/p&gt;

&lt;p&gt;Browser-Native Experience: No downloads, no plugins—just click and cook.&lt;/p&gt;

&lt;p&gt;Responsive Design: Optimized for both desktop precision and casual play.&lt;/p&gt;

&lt;p&gt;What’s Next?&lt;br&gt;
The mission doesn't stop here. I'm currently working on:&lt;/p&gt;

&lt;p&gt;Saved Game Persistence: Improving how we handle local storage so you never lose your restaurant progress.&lt;/p&gt;

&lt;p&gt;Community Hub: Adding leaderboards and "Best Chef" badges to bring back the competitive spirit of the original arcade.&lt;/p&gt;

&lt;p&gt;Feedback Wanted!&lt;br&gt;
As developers, we know that the best products are built through community feedback. I’d love for you to take a break, play a round of your favorite Papa's game, and let me know:&lt;/p&gt;

&lt;p&gt;How is the loading performance on your setup?&lt;/p&gt;

&lt;p&gt;Are there any legacy games you'd like to see added to the arcade?&lt;/p&gt;

&lt;p&gt;Check out the project here:&lt;a href="https://www.papas-arcade.com/" rel="noopener noreferrer"&gt;https://www.papas-arcade.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Show Dev: Marvel Cosmic Lab – Bringing the Wonders of the Universe to Your Browser 🚀🌌</title>
      <dc:creator>Causal Zap </dc:creator>
      <pubDate>Wed, 24 Dec 2025 13:28:31 +0000</pubDate>
      <link>https://dev.to/lei_zhang_3cd1b1ddb6debf9/show-dev-marvel-cosmic-lab-bringing-the-wonders-of-the-universe-to-your-browser-2eo4</link>
      <guid>https://dev.to/lei_zhang_3cd1b1ddb6debf9/show-dev-marvel-cosmic-lab-bringing-the-wonders-of-the-universe-to-your-browser-2eo4</guid>
      <description>&lt;p&gt;The Inspiration&lt;br&gt;
As developers, we often spend our days looking at lines of code and terminal screens. But sometimes, we need to look up—way up. I've always been fascinated by space, but I found that most astronomical data is either buried in complex academic archives or scattered across cluttered news sites.&lt;/p&gt;

&lt;p&gt;That’s why I built .&lt;/p&gt;

&lt;p&gt;What is &lt;a href="https://www.marvelcosmiclab.com/" rel="noopener noreferrer"&gt;Marvel Cosmic Lab&lt;/a&gt;?&lt;br&gt;
Marvel Cosmic Lab is a web-based "digital laboratory" designed for space enthusiasts, students, and curious minds. The goal was simple: Create a clean, immersive, and high-performance gateway to explore deep-space imagery and planetary science.&lt;/p&gt;

&lt;p&gt;Key Features&lt;br&gt;
Immersive Discovery: A curated experience featuring high-fidelity imagery of nebulas, galaxies, and star clusters.&lt;/p&gt;

&lt;p&gt;Knowledge Simplified: We take complex cosmic phenomena and break them down into digestible, engaging insights.&lt;/p&gt;

&lt;p&gt;Performance Focused: Built with modern web standards to ensure that even high-resolution astronomical images load smoothly across devices.&lt;/p&gt;

&lt;p&gt;The Tech Behind the Scenes&lt;br&gt;
Building this wasn't just about the content; it was about the experience. Some of the challenges I tackled included:&lt;/p&gt;

&lt;p&gt;Image Optimization: Handling massive deep-space captures without sacrificing page load speeds.&lt;/p&gt;

&lt;p&gt;Responsive Layouts: Ensuring the "Lab" feels immersive whether you're on a 4K monitor or a mobile device.&lt;/p&gt;

&lt;p&gt;UI/UX Design: Using a dark-themed, minimal interface to let the cosmic visuals take center stage.&lt;/p&gt;

&lt;p&gt;Future Roadmap&lt;br&gt;
This is just the beginning. I'm looking into:&lt;/p&gt;

&lt;p&gt;Integrating real-time APIs from NASA/ESA for live mission tracking.&lt;/p&gt;

&lt;p&gt;Adding interactive 3D visualizations for planetary orbits.&lt;/p&gt;

&lt;p&gt;Opening up the platform for community-contributed science articles.&lt;/p&gt;

&lt;p&gt;I’d Love Your Feedback!&lt;br&gt;
As a fellow developer, I’d value your thoughts on the site's performance, UI, or any features you think would make the "cosmic exploration" even better.&lt;/p&gt;

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

&lt;p&gt;Let’s keep exploring! 🌠&lt;/p&gt;

</description>
      <category>science</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
