<?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: shi0318</title>
    <description>The latest articles on DEV Community by shi0318 (@shi0318).</description>
    <link>https://dev.to/shi0318</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4054105%2Fe884e65e-572c-49da-8c35-4bc310528a4b.png</url>
      <title>DEV Community: shi0318</title>
      <link>https://dev.to/shi0318</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shi0318"/>
    <language>en</language>
    <item>
      <title>How I Built a Source-Tracked Game Wiki Network with Astro 5</title>
      <dc:creator>shi0318</dc:creator>
      <pubDate>Fri, 31 Jul 2026 03:51:54 +0000</pubDate>
      <link>https://dev.to/shi0318/how-i-built-a-source-tracked-game-wiki-network-with-astro-5-27al</link>
      <guid>https://dev.to/shi0318/how-i-built-a-source-tracked-game-wiki-network-with-astro-5-27al</guid>
      <description>&lt;p&gt;Most early game wikis have a trust problem. Pages mix official facts, beta discoveries, trailer guesses, and community assumptions without telling readers what is actually confirmed. I wanted to fix that for the games I follow, so I built a small network of source-tracked game wikis with Astro 5.&lt;/p&gt;

&lt;p&gt;This post walks through the architecture, the content model, and the small tricks that make the whole network cheap to host and easy to update.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually built
&lt;/h2&gt;

&lt;p&gt;Six independent wikis, all on the same stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://mortalshell2.wiki" rel="noopener noreferrer"&gt;Mortal Shell II Wiki&lt;/a&gt; — verified guides for Mortal Shell II, Open Beta notes, Shells, weapons, bosses&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://valor-mortis.wiki" rel="noopener noreferrer"&gt;Valor Mortis Demo Guide&lt;/a&gt; — source-tracked demo guide for the One More Level soulslike&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://plaguetaleguide.com" rel="noopener noreferrer"&gt;Resonance: A Plague Tale Legacy Guide&lt;/a&gt; — A Plague Tale Legacy story, characters, combat, walkthrough planning&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://beastreincarnationwiki.com" rel="noopener noreferrer"&gt;Beast of Reincarnation Wiki&lt;/a&gt; — Game Freak's action RPG, Emma and Koo, bosses, builds&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://graveseasonsguide.com" rel="noopener noreferrer"&gt;Grave Seasons Guide&lt;/a&gt; — Ashenridge farming murder-mystery, romance, walkthrough&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://swgalacticracer.wiki" rel="noopener noreferrer"&gt;Star Wars Galactic Racer Wiki&lt;/a&gt; — pre-release Star Wars racing wiki with confidence labels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repos are open source, so you can read the code and reuse the pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/MortalShell2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/ValorMortis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/plaguetale&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/beastreincarnationwiki&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/graveseasons&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/shi0318/StarWarsGalacticRacer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Astro 5 for pre-release game wikis
&lt;/h2&gt;

&lt;p&gt;For pre-release content, the priorities are clear: fast first paint, tiny JS, automatic sitemaps, predictable deploys, and content that is easy to write without opening a CMS. Astro 5 fits every one of those.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
output: 'static',
trailingSlash: 'always',
integrations: [sitemap({ ... })],
vite: { plugins: [tailwindcss()] }
That's basically the whole config. No runtime, no Workers, no database. Pages render as plain HTML and ship straight from Cloudflare's edge.
The confidence-label content model
The thing that makes these wikis different from a static dump is a small content contract. Every guide file carries a status in its frontmatter:
status: official
status: beta
status: trailer
status: series
status: unconfirmed
A &amp;lt;StatusBadge&amp;gt; component renders that status as a visible label on every page. A &amp;lt;SourceTable&amp;gt; component lists the source URL, the date checked, and a note. So a reader can see at a glance whether a boss list is confirmed by Steam, inferred from a trailer, or a forum rumor.
In code that's just:
import { z } from 'astro:content';

const guideSchema = z.object({
  title: z.string().max(60),
  description: z.string().min(50).max(160),
  status: z.enum(['official', 'beta', 'trailer', 'series', 'unconfirmed']),
  sources: z.array(z.object({
    url: z.string().url(),
    date: z.date(),
    note: z.string(),
  })),
});
This buys two things. First, the site never silently publishes speculation as fact. Second, the same schema lets us gate pages out of the sitemap when the status is too weak to deserve a Google snippet.
Per-page sitemap lastmod from git
The neat trick I'm happiest with is per-page lastmod. Out of the box, Astro's sitemap integration defaults lastmod to build time. For a network of six wikis that re-deploys whenever any one page changes, that's a weak signal for Google.
So I override serialize to map each URL back to its source file, then ask git for that file's last commit:
import { execFileSync } from 'node:child_process';
import { existsSync } from 'node:fs';
import { fileURLToPath } from 'node:url';
import { dirname, join } from 'node:path';

function lastmodFor(url) {
  const slug = new URL(url).pathname.replace(/^\/+|\/+$/g, '');
  const candidates = slug === ''
    ? ['src/pages/index.astro']
    : [
        `src/pages/${slug}.astro`,
        `src/pages/${slug}/index.astro`,
        `src/content/guides/${slug}.md`,
        `src/content/guides/${slug}.mdx`,
      ];
  const file = candidates.find(rel =&amp;gt; existsSync(join(ROOT, rel)));
  if (!file) return BUILD_TIME;
  try {
    return execFileSync(
      'git',
      ['log', '-1', '--format=%cI', '--', file],
      { cwd: ROOT, encoding: 'utf8' }
    ).trim();
  } catch {
    return BUILD_TIME;
  }
}

sitemap({
  serialize(item) {
    return { ...item, lastmod: lastmodFor(item.url) };
  },
})
Result: only the page you actually edited moves forward in time. Everything else stays put. That gives Google a clean recency signal without any CMS.
Filtering weak pages out of the sitemap
Speculation pages are useful for in-page exploration but shouldn't waste crawl budget. I keep a small allow-list of NOINDEX_URLS and filter the sitemap the same way the page meta tags are filtered:
const NOINDEX_URLS = ['/gloom/'];

sitemap({
  filter: page =&amp;gt; !NOINDEX_URLS.includes(new URL(page).pathname),
})
So a page that's labeled trailer or unconfirmed can still exist for navigation, but only the verified pages compete for Google.
Why this network works for pre-release games
Three things make the pattern worth copying:
Status as a first-class concept. Pre-release content is moving. Modeling that explicitly in the content schema forces honest writing and lets you automate what's safe to publish.

Static everything. No DB, no API, no Workers. Cloudflare Pages handles the entire network for free.

Open source as a moat. Anyone can fork the repo, swap the data, and ship a wiki for their own niche game in a weekend. That's how a small network of six becomes a pattern.

If you want to try it on your own game, the simplest path is:
git clone https://github.com/shi0318/MortalShell2.git my-game-wiki
cd my-game-wiki
npm install
npm run dev
Then edit src/data/site.ts, drop your pages into src/content/guides/, and ship.
If you want to follow the network as it grows, the launch hub is Mortal Shell II Wiki. Feedback and PRs are welcome on any of the six repos.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>astro</category>
      <category>tailwindcss</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How I Built 6 Game Wiki Sites in 30 Days with Astro</title>
      <dc:creator>shi0318</dc:creator>
      <pubDate>Thu, 30 Jul 2026 02:43:47 +0000</pubDate>
      <link>https://dev.to/shi0318/how-i-built-6-game-wiki-sites-in-30-days-with-astro-5h19</link>
      <guid>https://dev.to/shi0318/how-i-built-6-game-wiki-sites-in-30-days-with-astro-5h19</guid>
      <description>&lt;p&gt;I love playing video games, but I kept running into the same problem: &lt;br&gt;
every time a new game drops, the existing wiki sites are slow, bloated &lt;br&gt;
with ads, or just missing key info.&lt;/p&gt;

&lt;p&gt;So I decided to fix it myself.&lt;/p&gt;

&lt;p&gt;Over the past month, I built 6 lightweight game guide sites using Astro.&lt;br&gt;
Each one focuses on a single game — no clutter, no ad spam, just the &lt;br&gt;
info you actually need when you're stuck on a boss or hunting for a &lt;br&gt;
hidden item.&lt;/p&gt;

&lt;p&gt;Here are the six:&lt;/p&gt;

&lt;p&gt;🎮 Star Wars Galactic Racer — Vehicle stats, track guides, cheat codes&lt;br&gt;
   &lt;a href="https://swgalacticracer.wiki" rel="noopener noreferrer"&gt;https://swgalacticracer.wiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🕹️ Mortal Shell 2 — Open beta breakdown, shell abilities, combat tips&lt;br&gt;
   &lt;a href="https://mortalshell2.wiki" rel="noopener noreferrer"&gt;https://mortalshell2.wiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 Beast of Reincarnation — Character profiles, story arcs, episode guide&lt;br&gt;
   &lt;a href="https://beastreincarnationwiki.com" rel="noopener noreferrer"&gt;https://beastreincarnationwiki.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💀 Valor Mortis — Demo walkthrough, endings, secrets&lt;br&gt;
   &lt;a href="https://valor-mortis.wiki" rel="noopener noreferrer"&gt;https://valor-mortis.wiki&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌾 Grave Seasons — Farming guide, villager schedules, seasonal events&lt;br&gt;
   &lt;a href="https://graveseasonsguide.com" rel="noopener noreferrer"&gt;https://graveseasonsguide.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🐀 Plague Tale Legacy — Story analysis, release date tracker, pre-order info&lt;br&gt;
   &lt;a href="https://plaguetaleguide.com" rel="noopener noreferrer"&gt;https://plaguetaleguide.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tech stack: Astro (static), Markdown content, Cloudflare Pages.&lt;br&gt;
Each site scores 93-96 on On Page SEO audits and loads in under 100ms.&lt;/p&gt;

&lt;p&gt;If you're thinking about building a niche content site, happy to &lt;br&gt;
answer questions about my process in the comments.&lt;/p&gt;

</description>
      <category>astro</category>
      <category>gaming</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
