<?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: Sam Sullivan</title>
    <description>The latest articles on DEV Community by Sam Sullivan (@sam_sullivan_411184fbc70e).</description>
    <link>https://dev.to/sam_sullivan_411184fbc70e</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%2F3649739%2F5c1ba4df-e1d8-48f5-a119-8c6dafc0c704.png</url>
      <title>DEV Community: Sam Sullivan</title>
      <link>https://dev.to/sam_sullivan_411184fbc70e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sam_sullivan_411184fbc70e"/>
    <language>en</language>
    <item>
      <title>Building a Community Contribution System for VIN Decoding Patterns</title>
      <dc:creator>Sam Sullivan</dc:creator>
      <pubDate>Fri, 13 Mar 2026 00:25:12 +0000</pubDate>
      <link>https://dev.to/sam_sullivan_411184fbc70e/building-a-community-contribution-system-for-vin-decoding-patterns-417i</link>
      <guid>https://dev.to/sam_sullivan_411184fbc70e/building-a-community-contribution-system-for-vin-decoding-patterns-417i</guid>
      <description>&lt;p&gt;VIN decoding sounds straightforward until you realize every manufacturer implements it differently, and the authoritative database (NHTSA VPIC) only covers US-market vehicles.&lt;/p&gt;

&lt;p&gt;We maintain &lt;a href="https://github.com/cardog-ai/corgi" rel="noopener noreferrer"&gt;Corgi&lt;/a&gt;, an open-source offline VIN decoder. To handle international vehicles, we built a community contribution system. Here's how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A VIN (Vehicle Identification Number) is 17 characters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Positions 1-3: WMI (World Manufacturer Identifier)&lt;/li&gt;
&lt;li&gt;Positions 4-8: Vehicle attributes (model, engine, etc.)&lt;/li&gt;
&lt;li&gt;Position 9: Check digit&lt;/li&gt;
&lt;li&gt;Position 10: Model year&lt;/li&gt;
&lt;li&gt;Position 11: Plant code&lt;/li&gt;
&lt;li&gt;Positions 12-17: Serial number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NHTSA's VPIC database maps WMIs to manufacturers and defines how to interpret positions 4-8. But it only covers vehicles sold in the US.&lt;/p&gt;

&lt;p&gt;Tesla's Shanghai factory uses WMI &lt;code&gt;LRW&lt;/code&gt;. Tesla's Berlin factory uses &lt;code&gt;XP7&lt;/code&gt;. Neither exist in VPIC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Solution: YAML Patterns
&lt;/h2&gt;

&lt;p&gt;Contributors create a YAML file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;wmi&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LRW&lt;/span&gt;
&lt;span class="na"&gt;manufacturer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tesla&lt;/span&gt;
&lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tesla&lt;/span&gt;
&lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;China&lt;/span&gt;
&lt;span class="na"&gt;vehicle_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Passenger Car&lt;/span&gt;
&lt;span class="na"&gt;years&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;

&lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_manual&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tesla Model 3/Y VIN decoder&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://example.com/source&lt;/span&gt;

&lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3E****"&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Model&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Model &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YG****"&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Model&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Model Y&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*D****"&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Drive Type&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AWD&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;pattern&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*C****"&lt;/span&gt;
    &lt;span class="na"&gt;element&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Drive Type&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RWD&lt;/span&gt;

&lt;span class="na"&gt;test_vins&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;vin&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LRW3E7FA6NC433523&lt;/span&gt;
    &lt;span class="na"&gt;expected&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tesla&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Model &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;
      &lt;span class="na"&gt;drive_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RWD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validation Pipeline&lt;/p&gt;

&lt;p&gt;When a PR is opened, CI runs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Schema Validation (Zod)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wmiFileSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;wmi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[&lt;/span&gt;&lt;span class="sr"&gt;A-HJ-NPR-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{3}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;manufacturer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;make&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;vehicle_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;VALID_VEHICLE_TYPES&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;years&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;yearsSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;patternSchema&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;test_vins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testVinSchema&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Check Digit Verification&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every test VIN must have a valid check digit (position 9):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateCheckDigit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transliteration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;transliteration&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;vin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;vin&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Pattern Matching&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test VINs must decode to expected values using the defined patterns.&lt;/p&gt;

&lt;p&gt;Build Time Merge&lt;/p&gt;

&lt;p&gt;At release, a script:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reads all YAML files from community/wmi/&lt;/li&gt;
&lt;li&gt;Validates each file&lt;/li&gt;
&lt;li&gt;Resolves references (e.g., "Model 3" → Model table ID)&lt;/li&gt;
&lt;li&gt;Inserts into SQLite database&lt;/li&gt;
&lt;li&gt;Compresses database for distribution
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified apply logic&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;patterns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;elementId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolveElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;attributeId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resolveAttribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`
    INSERT INTO Pattern (VinSchemaId, Keys, ElementId, AttributeId)
    VALUES (?, ?, ?, ?)
  `&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vinSchemaId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;elementId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attributeId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why This Approach?&lt;/p&gt;

&lt;p&gt;YAML over SQL:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Readable diffs in PRs&lt;/li&gt;
&lt;li&gt;Contributors don't need database knowledge&lt;/li&gt;
&lt;li&gt;Easy to validate structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test VINs required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catches pattern errors before merge&lt;/li&gt;
&lt;li&gt;Documents expected behavior&lt;/li&gt;
&lt;li&gt;Enables regression testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build-time merge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Published package includes everything&lt;/li&gt;
&lt;li&gt;No runtime fetching of community data&lt;/li&gt;
&lt;li&gt;Single source of truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results&lt;/p&gt;

&lt;p&gt;First community patterns: Tesla Shanghai (LRW) and Berlin (XP7) with full trim and drivetrain detection.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx @cardog/corgi decode LRWYGCEK1PC550123&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Make: Tesla&lt;br&gt;
Model: Model Y&lt;br&gt;
Trim: Long Range&lt;br&gt;
Drive: AWD&lt;br&gt;
Country: CHINA&lt;br&gt;
City: SHANGHAI&lt;/p&gt;

&lt;p&gt;Contributing&lt;/p&gt;

&lt;p&gt;We're looking for patterns for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chinese EVs (BYD, NIO, XPeng)&lt;/li&gt;
&lt;li&gt;European market variants&lt;/li&gt;
&lt;li&gt;JDM vehicles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://github.com/cardog-ai/corgi/blob/master/community/CONTRIBUTING.md" rel="noopener noreferrer"&gt;https://github.com/cardog-ai/corgi/blob/master/community/CONTRIBUTING.md&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/cardog-ai/corgi" rel="noopener noreferrer"&gt;https://github.com/cardog-ai/corgi&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@cardog/corgi" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@cardog/corgi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>ai</category>
      <category>vehicles</category>
      <category>vin</category>
      <category>backend</category>
    </item>
    <item>
      <title>Optimizing a 40-Year-Old Government Database: From 3s to 30ms</title>
      <dc:creator>Sam Sullivan</dc:creator>
      <pubDate>Sun, 07 Dec 2025 01:29:30 +0000</pubDate>
      <link>https://dev.to/sam_sullivan_411184fbc70e/optimizing-a-40-year-old-government-database-from-3s-to-30ms-4lk3</link>
      <guid>https://dev.to/sam_sullivan_411184fbc70e/optimizing-a-40-year-old-government-database-from-3s-to-30ms-4lk3</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%2Fv9l66mkvil6inukluc6n.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%2Fv9l66mkvil6inukluc6n.png" alt="Corgi Logo" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The National Highway Traffic Safety Administration maintains the most comprehensive vehicle database in existence. Every car sold in America since 1981, complete technical specifications, all publicly available.&lt;/p&gt;

&lt;p&gt;There's just one problem: their API is painfully slow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;br&gt;
At Cardog, we process millions of vehicle listings daily. Each one needs VIN decoding—make, model, year, engine specs, manufacturing details. The NHTSA's official API? 3+ second response times on average.&lt;/p&gt;

&lt;p&gt;When you're handling millions of lookups, this isn't just inconvenient. It's impossible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inside the 40-Year-Old Database&lt;/strong&gt;&lt;br&gt;
We downloaded the VPIC (Vehicle Product Information Catalog) database to understand the bottleneck. What we found was fascinating: a 1.5GB SQL database that hasn't been meaningfully optimized since the 1990s.&lt;br&gt;
The structure tells the story:&lt;/p&gt;

&lt;p&gt;Textbook third normal form normalization (appropriate for 1995, overkill for 2025)&lt;/p&gt;

&lt;p&gt;Separate tables for makes, models, body styles, engine types, manufacturing plants, fuel systems&lt;/p&gt;

&lt;p&gt;Each VIN lookup requires 10-20 table joins&lt;br&gt;
Millions of rows for edge cases from decades past&lt;/p&gt;

&lt;p&gt;This wasn't incompetence—the NHTSA correctly prioritized data integrity over performance. They're regulators, not application developers. But it meant this incredible public dataset was performing far worse than it should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Standard Optimization, Dramatic Results&lt;/strong&gt;&lt;br&gt;
We applied basic database cleanup:&lt;/p&gt;

&lt;p&gt;Stripped regulatory metadata applications don't need&lt;br&gt;
Removed tables for obsolete vehicle types&lt;br&gt;
Applied modern SQLite optimization (proper indexes, query planning, compression)&lt;/p&gt;

&lt;p&gt;No machine learning. No revolutionary algorithms. Just maintenance that should have been routine for 40 years.&lt;br&gt;
The numbers:&lt;/p&gt;

&lt;p&gt;Database size: 1.5GB → 21MB compressed&lt;br&gt;
Response time: 3200ms → 30ms&lt;br&gt;
Network dependency: Required → Optional&lt;br&gt;
Rate limits: ~10/second → Unlimited&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This Matters&lt;/strong&gt;&lt;br&gt;
Every automotive application needs VIN decoding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Car marketplaces analyzing inventory&lt;/li&gt;
&lt;li&gt;Insurance companies assessing risk&lt;/li&gt;
&lt;li&gt;Lenders underwriting auto loans&lt;/li&gt;
&lt;li&gt;Parts suppliers matching components&lt;/li&gt;
&lt;li&gt;Fleet management tracking vehicles&lt;/li&gt;
&lt;li&gt;Mobile apps providing vehicle info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The government provided the data. We just made it usable.&lt;br&gt;
Making It Open Source&lt;br&gt;
We built this for Cardog's platform, but the problem isn't unique to us. Rather than keep a competitive advantage, we open-sourced it.&lt;br&gt;
Why? Because the government already did the hard work—40 years of comprehensive data collection. Making it performant should be table stakes for the industry.&lt;/p&gt;

&lt;p&gt;Try it yourself:&lt;br&gt;
&lt;code&gt;npm install @cardog/corgi&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The library auto-updates monthly with fresh NHTSA data, works universally (Node.js, browsers, edge workers), and requires zero configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Real Lesson&lt;/strong&gt;&lt;br&gt;
This isn't a story about brilliant engineering. It's about what happens when critical infrastructure goes unmaintained.&lt;/p&gt;

&lt;p&gt;The NHTSA VPIC database is an incredible public resource—detailed specifications for every vehicle sold in America for four decades. But packaged for government compliance systems, it performs far worse than necessary for everyday applications.&lt;/p&gt;

&lt;p&gt;Sometimes the best optimization is just deleting what you don't need and making what remains fast.&lt;/p&gt;

&lt;p&gt;The government built the foundation. The rest of us just need to maintain it.&lt;/p&gt;

</description>
      <category>performance</category>
      <category>database</category>
      <category>automotive</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
