<?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: Pokedex Oracle</title>
    <description>The latest articles on DEV Community by Pokedex Oracle (@pokedexoracle).</description>
    <link>https://dev.to/pokedexoracle</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%2F4006128%2Fc066130f-6e74-4d31-beae-95cc9e2f325f.png</url>
      <title>DEV Community: Pokedex Oracle</title>
      <link>https://dev.to/pokedexoracle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pokedexoracle"/>
    <language>en</language>
    <item>
      <title>Pokemon TCG card lookup starts with identity before price</title>
      <dc:creator>Pokedex Oracle</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:14:06 +0000</pubDate>
      <link>https://dev.to/pokedexoracle/pokemon-tcg-card-lookup-starts-with-identity-before-price-1k1m</link>
      <guid>https://dev.to/pokedexoracle/pokemon-tcg-card-lookup-starts-with-identity-before-price-1k1m</guid>
      <description>&lt;p&gt;Pokemon TCG data has a different failure mode from species data.&lt;/p&gt;

&lt;p&gt;A species lookup asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which Pokemon is this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A card lookup asks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which exact printed object is this?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That difference matters.&lt;/p&gt;

&lt;p&gt;The public notes for this part of the reference stack are here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg" rel="noopener noreferrer"&gt;Pokemon TCG research hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg-prices" rel="noopener noreferrer"&gt;TCG price and value notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg-sets" rel="noopener noreferrer"&gt;TCG set checklist notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg-checklist" rel="noopener noreferrer"&gt;Collector checklist workflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article builds on&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/building-a-pokemon-reference-stack-that-stays-auditable-5e63"&gt;the auditable Pokemon reference-stack note&lt;/a&gt;&lt;br&gt;
and applies the same separation-of-concerns idea to card data.&lt;br&gt;
For the game-data side of the model, see&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/modeling-pokemon-type-matchups-without-hard-coding-chart-mistakes-4cmk"&gt;the type matchup note&lt;/a&gt;&lt;br&gt;
and&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/designing-pokemon-evolution-route-data-that-does-not-lose-the-trigger-8i9"&gt;the evolution-route note&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmc1ft5nzl8a4g0gspvi.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjmc1ft5nzl8a4g0gspvi.png" alt="Charizard Base Set card" width="600" height="825"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  A card name is not enough
&lt;/h2&gt;

&lt;p&gt;"Charizard" is a Pokemon name.&lt;/p&gt;

&lt;p&gt;It is not a complete TCG card identity.&lt;/p&gt;

&lt;p&gt;To identify a card cleanly, I want at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;card name&lt;/li&gt;
&lt;li&gt;set id&lt;/li&gt;
&lt;li&gt;set name&lt;/li&gt;
&lt;li&gt;collector number&lt;/li&gt;
&lt;li&gt;rarity&lt;/li&gt;
&lt;li&gt;finish or variant&lt;/li&gt;
&lt;li&gt;language&lt;/li&gt;
&lt;li&gt;condition, if value is discussed&lt;/li&gt;
&lt;li&gt;reference URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without those fields, price notes and collection notes become easy to mix.&lt;/p&gt;
&lt;h2&gt;
  
  
  Identity and value should be separate
&lt;/h2&gt;

&lt;p&gt;One of the most common mistakes in TCG content is blending identity and price too early.&lt;/p&gt;

&lt;p&gt;These are different layers:&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="nl"&gt;"identity"&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;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Charizard"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"set"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Base Set"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rarity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rare Holo"&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;"marketContext"&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;span class="nl"&gt;"condition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"near-mint raw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"snapshotType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recent-market-signal"&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;The card identity should remain stable.&lt;/p&gt;

&lt;p&gt;The market context can change every day.&lt;/p&gt;

&lt;p&gt;That is why the &lt;a href="https://pokedexoracle.neocities.org/tcg-prices" rel="noopener noreferrer"&gt;price notes&lt;/a&gt; and &lt;a href="https://pokedexoracle.neocities.org/tcg-sets" rel="noopener noreferrer"&gt;set checklist notes&lt;/a&gt; are separate pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set checklists are a useful middle layer
&lt;/h2&gt;

&lt;p&gt;A set page helps connect individual cards to their printed context.&lt;/p&gt;

&lt;p&gt;For a collector, the set layer answers questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many cards are in this set?&lt;/li&gt;
&lt;li&gt;which collector numbers are missing?&lt;/li&gt;
&lt;li&gt;which cards are variants or chase cards?&lt;/li&gt;
&lt;li&gt;which sealed products belong to the era?&lt;/li&gt;
&lt;li&gt;which cards need condition notes?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is different from a species page and different from a price page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is useful for developer tools
&lt;/h2&gt;

&lt;p&gt;If you are building a widget, MCP tool, spreadsheet helper, or collector app, separating identity from value keeps the output safer.&lt;/p&gt;

&lt;p&gt;An assistant should not answer "what is this worth?" until it knows which exact card is being discussed.&lt;/p&gt;

&lt;p&gt;Likewise, a collection checklist should not link every Charizard card to one generic species note. It should preserve card identity first, then add species context when useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;For the canonical Pokemon reference layer, use &lt;a href="https://www.pokedex.me/" rel="noopener noreferrer"&gt;Pokedex.me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The local TCG cluster is a workflow layer. It explains how I separate card identity, set context, price signals, and collection notes before pushing the data into a larger Pokemon reference system.&lt;/p&gt;

</description>
      <category>data</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Designing Pokemon evolution-route data that does not lose the trigger</title>
      <dc:creator>Pokedex Oracle</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:11:39 +0000</pubDate>
      <link>https://dev.to/pokedexoracle/designing-pokemon-evolution-route-data-that-does-not-lose-the-trigger-8i9</link>
      <guid>https://dev.to/pokedexoracle/designing-pokemon-evolution-route-data-that-does-not-lose-the-trigger-8i9</guid>
      <description>&lt;p&gt;Evolution data is easy to oversimplify.&lt;/p&gt;

&lt;p&gt;If a note only says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Eevee evolves into Vaporeon.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it is missing the most useful part of the fact: the route.&lt;/p&gt;

&lt;p&gt;For apps, guides, AI tools, and collection notes, the trigger matters as much as the target species.&lt;/p&gt;

&lt;p&gt;I keep the public evolution workflow here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolutions" rel="noopener noreferrer"&gt;Pokemon evolution route hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolution-methods" rel="noopener noreferrer"&gt;Evolution method categories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolution-stones" rel="noopener noreferrer"&gt;Stone and item evolution notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/eevee-evolutions" rel="noopener noreferrer"&gt;Eevee evolution family notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is part of the same DEV series as&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/building-a-pokemon-reference-stack-that-stays-auditable-5e63"&gt;the auditable Pokemon reference-stack note&lt;/a&gt;.&lt;br&gt;
The companion type-modeling note is here:&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/modeling-pokemon-type-matchups-without-hard-coding-chart-mistakes-4cmk"&gt;Modeling Pokemon type matchups without hard-coding chart mistakes&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvm68lgo404oh3u77pkel.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvm68lgo404oh3u77pkel.png" alt="Eevee official artwork" width="475" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The route is the data
&lt;/h2&gt;

&lt;p&gt;The evolved species is only one field.&lt;/p&gt;

&lt;p&gt;The route can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;level&lt;/li&gt;
&lt;li&gt;item or stone&lt;/li&gt;
&lt;li&gt;trade&lt;/li&gt;
&lt;li&gt;trade plus held item&lt;/li&gt;
&lt;li&gt;friendship&lt;/li&gt;
&lt;li&gt;time of day&lt;/li&gt;
&lt;li&gt;known move&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;gender&lt;/li&gt;
&lt;li&gt;regional form&lt;/li&gt;
&lt;li&gt;game or generation context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When those are flattened into a sentence, the note becomes harder to test and easier to misquote.&lt;/p&gt;
&lt;h2&gt;
  
  
  A simple route object
&lt;/h2&gt;

&lt;p&gt;For most evolution notes, I want a shape like this:&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="nl"&gt;"baseSpecies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eevee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targetSpecies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vaporeon"&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="s2"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"item"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"water-stone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"context"&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;span class="nl"&gt;"routeFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"branching"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"notes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"One of several Eevee item or condition routes."&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;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://pokedexoracle.neocities.org/eevee-evolutions"&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;This lets a UI or article explain both the result and the condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why branching families need special care
&lt;/h2&gt;

&lt;p&gt;Eevee is a good stress test because one base species can lead to many outcomes.&lt;/p&gt;

&lt;p&gt;That makes a few bad content patterns obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storing only one "evolves_to" value&lt;/li&gt;
&lt;li&gt;treating every route as a level route&lt;/li&gt;
&lt;li&gt;dropping the item name&lt;/li&gt;
&lt;li&gt;ignoring type changes after evolution&lt;/li&gt;
&lt;li&gt;failing to distinguish a family page from an individual species page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://pokedexoracle.neocities.org/eevee-evolutions" rel="noopener noreferrer"&gt;Eevee evolution notes&lt;/a&gt; are designed as a small example of how to keep those branches readable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evolution data connects to type data
&lt;/h2&gt;

&lt;p&gt;Evolution is not isolated.&lt;/p&gt;

&lt;p&gt;When a species evolves, type context can change, collection context can change, and TCG notes may need to point at a different species page.&lt;/p&gt;

&lt;p&gt;That is why evolution notes should link sideways to type notes when relevant:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pokedexoracle.neocities.org/types" rel="noopener noreferrer"&gt;Pokemon type matchup notes&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A good route note can answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what is the base species?&lt;/li&gt;
&lt;li&gt;what is the target species?&lt;/li&gt;
&lt;li&gt;what triggers the change?&lt;/li&gt;
&lt;li&gt;does type context change?&lt;/li&gt;
&lt;li&gt;where can the reader verify the route?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;For the canonical Pokemon reference layer, use &lt;a href="https://www.pokedex.me/" rel="noopener noreferrer"&gt;Pokedex.me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The goal of the local evolution cluster is not to be exhaustive. It is to keep the structure of evolution facts visible enough that a developer or writer can reuse them without guessing.&lt;/p&gt;

</description>
      <category>data</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Modeling Pokemon type matchups without hard-coding chart mistakes</title>
      <dc:creator>Pokedex Oracle</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:03:13 +0000</pubDate>
      <link>https://dev.to/pokedexoracle/modeling-pokemon-type-matchups-without-hard-coding-chart-mistakes-4cmk</link>
      <guid>https://dev.to/pokedexoracle/modeling-pokemon-type-matchups-without-hard-coding-chart-mistakes-4cmk</guid>
      <description>&lt;p&gt;Type matchups look simple until a project needs to explain them.&lt;/p&gt;

&lt;p&gt;Most bugs come from treating a Pokemon type as a label instead of treating a matchup as a calculation.&lt;/p&gt;

&lt;p&gt;The cleaner way to think about it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;attacking type + defending type(s) = final modifier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That small distinction prevents a lot of bad guide text, especially for dual-type Pokemon.&lt;/p&gt;

&lt;p&gt;I keep a public version of the workflow here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/types" rel="noopener noreferrer"&gt;Pokemon type matchup hub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/type-chart" rel="noopener noreferrer"&gt;Type chart workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/type-weaknesses" rel="noopener noreferrer"&gt;Weakness and resistance notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/dual-types" rel="noopener noreferrer"&gt;Dual-type examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This follows the broader reference-stack idea from the first article:&lt;br&gt;
&lt;a href="https://dev.to/pokedexoracle/building-a-pokemon-reference-stack-that-stays-auditable-5e63"&gt;Building a Pokemon reference stack that stays auditable&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw97saebl5apn6y65aqe9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw97saebl5apn6y65aqe9.png" alt="Charizard official artwork" width="475" height="475"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The common mistake
&lt;/h2&gt;

&lt;p&gt;A lot of notes say things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Charizard is weak to Water.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That can be useful shorthand, but it is not the underlying model.&lt;/p&gt;

&lt;p&gt;A better note stores the inputs:&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="nl"&gt;"attackingType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"water"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"defendingTypes"&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;"fire"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flying"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"super-effective"&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;The note now says how the conclusion was reached.&lt;/p&gt;

&lt;p&gt;That matters because the same attacking type can interact differently when the second defensive type changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dual typing should be explicit
&lt;/h2&gt;

&lt;p&gt;Dual typing is where most matchup mistakes happen.&lt;/p&gt;

&lt;p&gt;A species can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one type weak and the other neutral&lt;/li&gt;
&lt;li&gt;one type weak and the other resistant&lt;/li&gt;
&lt;li&gt;both types weak&lt;/li&gt;
&lt;li&gt;both types resistant&lt;/li&gt;
&lt;li&gt;one type immune&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the code or content pipeline only stores one defensive answer, it will eventually produce bad output.&lt;/p&gt;

&lt;p&gt;A more useful model is:&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="nl"&gt;"attack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"electric"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"defense"&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;"water"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flying"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"components"&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"water"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"modifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"flying"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"modifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&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;span class="nl"&gt;"finalModifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&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;That structure lets the UI show both the result and the reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases outside battles
&lt;/h2&gt;

&lt;p&gt;Type data is not only for battle calculators.&lt;/p&gt;

&lt;p&gt;It also helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;write fan guides&lt;/li&gt;
&lt;li&gt;organize species pages&lt;/li&gt;
&lt;li&gt;group TCG collection notes by type theme&lt;/li&gt;
&lt;li&gt;explain evolution routes where typing changes&lt;/li&gt;
&lt;li&gt;power AI tools that need traceable answers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I link type notes back into the wider reference stack instead of leaving them as an isolated chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical content rule
&lt;/h2&gt;

&lt;p&gt;When writing a type note, I try to include three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The exact attack/defense context&lt;/li&gt;
&lt;li&gt;The final modifier or plain-language outcome&lt;/li&gt;
&lt;li&gt;A page where the reader can inspect the workflow&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;For dual-type examples like Fire/Flying or Dragon/Ground, see:
https://pokedexoracle.neocities.org/dual-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is more durable than a loose sentence copied from memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;For the canonical Pokemon reference layer, use &lt;a href="https://www.pokedex.me/" rel="noopener noreferrer"&gt;Pokedex.me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The local type notes are deliberately small and workflow-oriented. They are meant to explain how to think about the data before a larger Pokedex or app consumes it.&lt;/p&gt;

</description>
      <category>data</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Building a Pokemon reference stack that stays auditable</title>
      <dc:creator>Pokedex Oracle</dc:creator>
      <pubDate>Sun, 28 Jun 2026 08:01:02 +0000</pubDate>
      <link>https://dev.to/pokedexoracle/building-a-pokemon-reference-stack-that-stays-auditable-5e63</link>
      <guid>https://dev.to/pokedexoracle/building-a-pokemon-reference-stack-that-stays-auditable-5e63</guid>
      <description>&lt;p&gt;Most Pokemon projects start with a simple lookup.&lt;/p&gt;

&lt;p&gt;Then the questions multiply.&lt;/p&gt;

&lt;p&gt;Is this note about the game data, a type matchup, an evolution route, a TCG card, a sealed product, a market snapshot, or a collector checklist? Is the species name enough, or do we need the form, language, set, card number, condition, or generation context?&lt;/p&gt;

&lt;p&gt;That is the point where a "Pokedex" stops being a table of names and becomes a reference system.&lt;/p&gt;

&lt;p&gt;I have been building a small public support stack around those questions here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/" rel="noopener noreferrer"&gt;Pokedex Oracle overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/types" rel="noopener noreferrer"&gt;Pokemon type matchup notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolutions" rel="noopener noreferrer"&gt;Pokemon evolution route notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg" rel="noopener noreferrer"&gt;Pokemon TCG research notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace a full Pokedex. The goal is to document the mental model behind clean Pokemon reference data: what has to be normalized, what changes over time, and which links should be saved so a note remains auditable six months later.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9rub40q5erk49eta1fv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx9rub40q5erk49eta1fv.png" alt="Pikachu and Charizard reference artwork" width="475" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The four layers I keep separate
&lt;/h2&gt;

&lt;p&gt;When a project mixes all Pokemon data into one object, it becomes easy to write notes that sound correct but are not reusable.&lt;/p&gt;

&lt;p&gt;I prefer four layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Species identity
&lt;/h3&gt;

&lt;p&gt;Species identity is the stable base: name, slug, national dex number, form, language, and family. A Pikachu note, a Charizard note, and an Eevee note should not need to know about card prices or marketplace availability.&lt;/p&gt;

&lt;p&gt;Species pages become the anchor for everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Type logic
&lt;/h3&gt;

&lt;p&gt;Type data answers matchup questions.&lt;/p&gt;

&lt;p&gt;It should be modeled as an interaction, not just as labels on a Pokemon. Fire/Flying is not just two strings attached to Charizard. It changes weaknesses, resistances, and neutral outcomes.&lt;/p&gt;

&lt;p&gt;That is why the type cluster starts with a workflow page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pokedexoracle.neocities.org/type-chart" rel="noopener noreferrer"&gt;How to read a Pokemon type chart&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Evolution routes
&lt;/h3&gt;

&lt;p&gt;Evolution data answers a different question: what turns one species into another?&lt;/p&gt;

&lt;p&gt;That may be a level, item, trade, friendship condition, time of day, known move, location, or form-specific rule. If a note only says "Eevee evolves into Vaporeon", it has lost the useful part: the route.&lt;/p&gt;

&lt;p&gt;The local evolution notes split that out here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolution-methods" rel="noopener noreferrer"&gt;Evolution method categories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/evolution-stones" rel="noopener noreferrer"&gt;Stones and item evolution notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pokedexoracle.neocities.org/eevee-evolutions" rel="noopener noreferrer"&gt;Eevee evolution family notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. TCG and market context
&lt;/h3&gt;

&lt;p&gt;TCG research changes again because a card is not just a Pokemon.&lt;/p&gt;

&lt;p&gt;A card needs set id, set name, collector number, rarity, finish, language, condition, and sometimes sealed-product context. A Charizard card can be a species reference, a card identity, a price object, and a collection item at the same time. Those should not be collapsed into one field.&lt;/p&gt;

&lt;p&gt;The TCG cluster starts here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pokedexoracle.neocities.org/tcg" rel="noopener noreferrer"&gt;Pokemon TCG card research notes&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A small schema that keeps notes sane
&lt;/h2&gt;

&lt;p&gt;For internal notes, I like a shape like this:&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="nl"&gt;"entity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pokemon"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slug"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eevee"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"evolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"claim"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Eevee has branching evolution routes that depend on method context."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"context"&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;span class="nl"&gt;"methodFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"item-and-conditional"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"relatedPages"&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;span class="s2"&gt;"https://pokedexoracle.neocities.org/evolutions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="s2"&gt;"https://pokedexoracle.neocities.org/eevee-evolutions"&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;span class="nl"&gt;"canonicalReference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.pokedex.me/"&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;That is intentionally boring. Boring is good here.&lt;/p&gt;

&lt;p&gt;The claim is readable. The context says which layer it belongs to. The local pages explain the workflow. The canonical reference is kept visible and easy to inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for AI and developer tools
&lt;/h2&gt;

&lt;p&gt;Pokemon data is tempting to dump into prompts or autocomplete fields. But without structure, an AI assistant can blend game logic, TCG logic, and collection logic into the same answer.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"weak to Water" is a type-matchup claim&lt;/li&gt;
&lt;li&gt;"evolves with a stone" is an evolution-route claim&lt;/li&gt;
&lt;li&gt;"Base Set #4" is a TCG identity claim&lt;/li&gt;
&lt;li&gt;"near mint raw" is a condition claim&lt;/li&gt;
&lt;li&gt;"available in stock" is a market-availability claim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are different facts with different failure modes.&lt;/p&gt;

&lt;p&gt;Keeping them separate makes the output easier to test, easier to cite, and easier for readers to correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;p&gt;For the canonical Pokemon reference layer behind this stack, I use &lt;a href="https://www.pokedex.me/" rel="noopener noreferrer"&gt;Pokedex.me&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article is the first note in a DEV series about building Pokemon reference systems that are useful for apps, guides, AI tools, and collector workflows.&lt;/p&gt;

&lt;p&gt;Related DEV notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/pokedexoracle/modeling-pokemon-type-matchups-without-hard-coding-chart-mistakes-4cmk"&gt;Modeling Pokemon type matchups without hard-coding chart mistakes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/pokedexoracle/designing-pokemon-evolution-route-data-that-does-not-lose-the-trigger-8i9"&gt;Designing Pokemon evolution-route data that does not lose the trigger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/pokedexoracle/pokemon-tcg-card-lookup-starts-with-identity-before-price-1k1m"&gt;Pokemon TCG card lookup starts with identity before price&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>data</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
