<?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: Pubudu Tharanga Abewarna</title>
    <description>The latest articles on DEV Community by Pubudu Tharanga Abewarna (@pubudutharanga).</description>
    <link>https://dev.to/pubudutharanga</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%2F3743353%2F38285f64-bd52-4425-ad5a-abac05eb27e6.jpg</url>
      <title>DEV Community: Pubudu Tharanga Abewarna</title>
      <link>https://dev.to/pubudutharanga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pubudutharanga"/>
    <language>en</language>
    <item>
      <title>Decoding Sri Lanka's NIC Numbers: Building NIC Info, a Zero-Dependency, Privacy-First Web App</title>
      <dc:creator>Pubudu Tharanga Abewarna</dc:creator>
      <pubDate>Mon, 17 Aug 2026 08:46:22 +0000</pubDate>
      <link>https://dev.to/pubudutharanga/decoding-sri-lankas-nic-numbers-building-nic-info-a-zero-dependency-privacy-first-web-app-8md</link>
      <guid>https://dev.to/pubudutharanga/decoding-sri-lankas-nic-numbers-building-nic-info-a-zero-dependency-privacy-first-web-app-8md</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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdskeg6nizxljk9cb45l1.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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdskeg6nizxljk9cb45l1.jpg" alt="NIC-Info webapp screenshot" width="800" height="446"&gt;&lt;/a&gt;&lt;br&gt;
Have you ever wondered how much personal data is quietly baked into the string of digits on your National Identity Card?&lt;/p&gt;

&lt;p&gt;In Sri Lanka, an Identity Card (NIC) number isn't an arbitrary sequence generated by a database — it's a &lt;strong&gt;deterministic, compact demographic hash&lt;/strong&gt; containing your exact birth year, day of birth, legal gender, and historical electoral eligibility.&lt;/p&gt;

&lt;p&gt;For decades, converting an NIC number to a date of birth — or just verifying an ID card — meant manual calendar arithmetic, or handing your sensitive personal data to an ad-filled site that shipped it straight to some remote server.&lt;/p&gt;

&lt;p&gt;I decided to fix that by building &lt;strong&gt;&lt;a href="https://nicinfo.vercel.app/" rel="noopener noreferrer"&gt;NIC Info&lt;/a&gt;&lt;/strong&gt;, a high-performance, air-gapped, zero-dependency NIC decoder and conversion suite, built entirely with modern web standards.&lt;/p&gt;

&lt;p&gt;Here's what I'll cover:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The math and engineering behind Sri Lanka's NIC formats (old vs. new)&lt;/li&gt;
&lt;li&gt;The female &lt;code&gt;+500&lt;/code&gt; day offset and leap-year calendar quirks&lt;/li&gt;
&lt;li&gt;Architecting an air-gapped, zero-knowledge client engine&lt;/li&gt;
&lt;li&gt;Designing a bespoke "Registry Office" editorial UI system&lt;/li&gt;
&lt;li&gt;Key takeaways for building high-performance web apps in 2026&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  🏛️ 1. The Anatomy of Sri Lankan Identity Numbers
&lt;/h2&gt;

&lt;p&gt;Sri Lanka has two distinct NIC numbering eras, administered by the Department for Registration of Persons (DRP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│ 1. Legacy Format (1972-2015): 9 Digits + Letter                │
│                                                                │
│    Example: 941234567V                                         │
│    [94]  [123]  [4567]  [V]                                    │
│    Birth Year | Day Code | Serial No. | Voter Status           │
├────────────────────────────────────────────────────────────────┤
│ 2. Modern Smart NIC (2016-present): 12 Digits                  │
│                                                                │
│    Example: 199412345678                                       │
│    [1994]  [123]  [4567]  [8]                                  │
│    Century Year | Day Code | Serial No. | Checksum             │
└────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Let's break down the individual segments.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Birth Year Encoding
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Legacy (9-character):&lt;/strong&gt; a 2-digit year prefix (&lt;code&gt;94&lt;/code&gt; → &lt;code&gt;1994&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern (12-digit):&lt;/strong&gt; the full 4-digit Gregorian year (&lt;code&gt;1994&lt;/code&gt; or &lt;code&gt;2003&lt;/code&gt;), which eliminates Y2K-style ambiguity entirely
### The 3-Digit Day Code and the Gender Offset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of storing month and day separately, the DRP packs both &lt;strong&gt;date of birth&lt;/strong&gt; and &lt;strong&gt;gender&lt;/strong&gt; into a single 3-digit ordinal day value, &lt;code&gt;001&lt;/code&gt; to &lt;code&gt;866&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Males:&lt;/strong&gt; ordinal day assigned directly — &lt;code&gt;001&lt;/code&gt; (Jan 1) through &lt;code&gt;366&lt;/code&gt; (Dec 31)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Females:&lt;/strong&gt; a constant offset of &lt;code&gt;500&lt;/code&gt; is added — &lt;code&gt;501&lt;/code&gt; (Jan 1) through &lt;code&gt;866&lt;/code&gt; (Dec 31)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FEMALE_OFFSET&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getGenderAndDay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDayCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rawDayCode&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;FEMALE_OFFSET&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Female&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dayOfYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rawDayCode&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;FEMALE_OFFSET&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;gender&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Male&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;dayOfYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rawDayCode&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;This single-field design was an elegant space optimization for 1970s mainframe databases — it recovers both gender and birth date without needing an extra database column.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Leap Year and "Day 60" Quirk
&lt;/h3&gt;

&lt;p&gt;This is where most hobbyist NIC decoders fall apart.&lt;/p&gt;

&lt;p&gt;The DRP's encoding is based on a uniform 366-day calendar baseline, so March 1st is always treated as day &lt;code&gt;061&lt;/code&gt;. In non-leap years:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Day 60 (February 29th) is simply skipped in issuance&lt;/li&gt;
&lt;li&gt;A day code of &lt;code&gt;061&lt;/code&gt; in a non-leap year still means March 1st&lt;/li&gt;
&lt;li&gt;Converting a non-leap day number back into a calendar date means any index &lt;code&gt;&amp;gt;= 60&lt;/code&gt; needs a &lt;code&gt;-1&lt;/code&gt; adjustment to line up with the real 365-day Gregorian calendar
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;nicDayToCalendarDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dayOfYear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;year&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;leap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&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="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;400&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="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;adjustedDay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;dayOfYear&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Handle the skipped Day 60 convention on non-leap years&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;leap&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;adjustedDay&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;adjustedDay&lt;/span&gt; &lt;span class="o"&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cumulativeDays&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;leap&lt;/span&gt;
    &lt;span class="p"&gt;?&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;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;152&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;182&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;213&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;274&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;305&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;335&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;366&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;212&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;243&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;273&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;304&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;334&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;365&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;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;adjustedDay&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;cumulativeDays&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;month&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;month&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;day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;adjustedDay&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;cumulativeDays&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;month&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;day&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;h2&gt;
  
  
  🔒 2. Privacy-First Architecture: Zero-Knowledge by Design
&lt;/h2&gt;

&lt;p&gt;National Identity Cards are sensitive PII under privacy frameworks like Sri Lanka's Personal Data Protection Act (PDPA) No. 9 of 2022, and the GDPR.&lt;/p&gt;

&lt;p&gt;Most "free" decoding utilities quietly send your input to &lt;code&gt;/api/decode&lt;/code&gt;, or log it in an analytics payload. For NIC Info, I built an air-gapped client runtime instead:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────┐
│ Browser process memory (100% client-side)                │
│                                                          │
│ [User input] --&amp;gt; [Regex validator] --&amp;gt; [Parser engine]   │
│                                              |           │
│ [Result card] &amp;lt;-- [Chronology diff] &amp;lt;-------+            │
└──────────────────────────────────────────────────────────┘
                            |
                    NO NETWORK TRANSMISSION
                            |
┌──────────────────────────────────────────────────────────┐
│ External edge (Vercel)                                   │
│   - Static HTML/CSS/JS delivery only                     │
│   - Zero logging, zero PII ingestion                     │
└──────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
🔒 &lt;strong&gt;Zero-knowledge guarantee&lt;/strong&gt; — nothing typed into NIC Info ever leaves the browser. There's no API endpoint to hit, no analytics event to fire, and no server-side log where a stray NIC number could end up.&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key security implementations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero external API calls&lt;/strong&gt; — the decoding engine runs entirely in synchronous browser memory&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero form submissions&lt;/strong&gt; — everything is wired to reactive DOM listeners (&lt;code&gt;input&lt;/code&gt;, &lt;code&gt;keydown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardened HTTP headers&lt;/strong&gt;, configured at the edge:
&lt;/li&gt;
&lt;/ul&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;"headers"&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;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Frame-Options"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DENY"&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;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"X-Content-Type-Options"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nosniff"&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;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Referrer-Policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"strict-origin-when-cross-origin"&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;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Permissions-Policy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"camera=(), microphone=(), geolocation=()"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ⚡ 3. The Pure Vanilla Stack: Zero Bundlers, Zero Frameworks
&lt;/h2&gt;

&lt;p&gt;It's tempting to reach for React, Next.js, or Vue even for a single-purpose utility. But for a tool people open on a patchy mobile connection, every kilobyte of JavaScript is a tax on load time.&lt;/p&gt;

&lt;p&gt;NIC Info is built with plain semantic HTML5, vanilla CSS3, and ES6+ — no bundler, no framework, no build step.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Framework app (e.g. Next.js)&lt;/th&gt;
&lt;th&gt;NIC Info (vanilla)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript payload&lt;/td&gt;
&lt;td&gt;~180 KB – 450 KB (gzipped)&lt;/td&gt;
&lt;td&gt;&amp;lt; 6 KB (unminified)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Contentful Paint (FCP)&lt;/td&gt;
&lt;td&gt;0.8s – 1.4s&lt;/td&gt;
&lt;td&gt;0.2s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interaction to Next Paint (INP)&lt;/td&gt;
&lt;td&gt;40ms – 120ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 8ms (instant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse score&lt;/td&gt;
&lt;td&gt;85 – 92&lt;/td&gt;
&lt;td&gt;100 / 100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Real-Time Chronological Age Calculation
&lt;/h3&gt;

&lt;p&gt;Alongside the date of birth, the tool computes a precise, human-readable age breakdown — years, months, and days — using proper month-borrowing arithmetic:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculatePreciseAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;birthYear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthMonth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;birthDay&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;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&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;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;birthYear&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;months&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;birthMonth&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;days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;birthDay&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;daysInMonth&lt;/span&gt; &lt;span class="o"&gt;=&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;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&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;isLeap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&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="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;400&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;days&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;months&lt;/span&gt;&lt;span class="o"&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;prevMonth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMonth&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// 0-indexed previous month&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;prevYear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFullYear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevMonth&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="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;prevMonth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nx"&gt;prevYear&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;daysInPrev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevMonth&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nf"&gt;isLeap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevYear&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;daysInMonth&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;prevMonth&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;days&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;daysInPrev&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;months&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;months&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;years&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;months&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;days&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;h2&gt;
  
  
  🎨 4. Editorial "Registry Office" Design System
&lt;/h2&gt;

&lt;p&gt;Utility apps don't have to look like a generic Bootstrap table. I wanted NIC Info to feel like an authentic archival registry ledger, filtered through a modern Cupertino-style aesthetic.&lt;/p&gt;
&lt;h3&gt;
  
  
  Typography &amp;amp; Colors
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Serif headings:&lt;/strong&gt; &lt;code&gt;Fraunces&lt;/code&gt;, a variable font, brings a warm, authoritative "government ledger" feel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monospace elements:&lt;/strong&gt; &lt;code&gt;IBM Plex Mono&lt;/code&gt; keeps numeric identification codes tabular and aligned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Palette:&lt;/strong&gt; deep archival navy (&lt;code&gt;#0B1118&lt;/code&gt;), warm parchment gold (&lt;code&gt;#C9A15C&lt;/code&gt;), and slate borders
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--bg-primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#0F172A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--surface-card&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1E293B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--accent-gold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#C9A15C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--accent-teal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#4F8B82&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--text-main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#F8FAFC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-serif&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'Fraunces'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Georgia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--font-mono&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;'IBM Plex Mono'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;monospace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.result-card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--surface-card&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;161&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt; &lt;span class="m"&gt;-15px&lt;/span&gt; &lt;span class="n"&gt;rgba&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="py"&gt;backdrop-filter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;blur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;12px&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&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;h3&gt;
  
  
  Micro-Interactions &amp;amp; Usability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-decoding as you type&lt;/strong&gt; — the input detects a completed 10-character (&lt;code&gt;941234567V&lt;/code&gt;) or 12-digit (&lt;code&gt;199412345678&lt;/code&gt;) string and decodes it instantly, no submit button required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive sample chips&lt;/strong&gt; for one-tap testing of edge cases (leap years, voter flags, female day offsets)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Share API&lt;/strong&gt; for one-tap sharing to WhatsApp, X, or the native OS share sheet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  - &lt;strong&gt;PWA-ready&lt;/strong&gt; via &lt;code&gt;manifest.json&lt;/code&gt;, installable on desktop and mobile
&lt;/h2&gt;
&lt;h2&gt;
  
  
  🚀 5. Try It Out &amp;amp; Contribute
&lt;/h2&gt;

&lt;p&gt;The full codebase is open-source under the MIT license:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Live app: &lt;a href="https://nicinfo.vercel.app/" rel="noopener noreferrer"&gt;nicinfo.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 Format guidelines &amp;amp; spec: &lt;a href="https://nicinfo.vercel.app/guidelines.html" rel="noopener noreferrer"&gt;nicinfo.vercel.app/guidelines.html&lt;/a&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/pubudutharanga" rel="noopener noreferrer"&gt;
        pubudutharanga
      &lt;/a&gt; / &lt;a href="https://github.com/pubudutharanga/NIC-Info" rel="noopener noreferrer"&gt;
        NIC-Info
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A free browser tool for decoding Sri Lankan National Identity Card numbers.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🇱🇰 NIC Info&lt;/h1&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;High-Performance, Privacy-First Sri Lankan National Identity Card Decoder&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://nicinfo.vercel.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0d3103145cd80365692d39e1e50760d396a15801fe58485749f5622a08af9a05/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c69766525323044656d6f2d6e6963696e666f2e76657263656c2e6170702d4339413135433f7374796c653d666f722d7468652d6261646765266c6f676f3d76657263656c266c6f676f436f6c6f723d7768697465" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://github.com/pubudutharanga/NIC-Info/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/96c94cfdb0e7ecd61b230eb4fd48062de8f6fa25d05934a37bc83edfeb3ac7d8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d3446384238323f7374796c653d666f722d7468652d6261646765" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://nicinfo.vercel.app/privacy.html" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f7c75d5aa14c72dcc4d99c2a61ffaf9f1581e6a82b4f8db8724601ef25e102eb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d313030253235253230436c69656e742d2d536964652d3131313731433f7374796c653d666f722d7468652d6261646765266c6f676f3d736869656c64266c6f676f436f6c6f723d433941313543" alt="Zero Knowledge"&gt;&lt;/a&gt;
&lt;a href="https://nicinfo.vercel.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/94b22e40475f88fb5e9f622ce484589fe09fffe67b97839aeef6f05f0306dd92/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5057412d496e7374616c6c61626c652d626c75653f7374796c653d666f722d7468652d6261646765266c6f676f3d707761266c6f676f436f6c6f723d7768697465" alt="PWA Ready"&gt;&lt;/a&gt;
&lt;a href="https://nicinfo.vercel.app/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/420cc6932d97bc60f1cbb2db5b9fbac60b05d72803fe60e567c5168462f4926a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656c656173652d3230323625323045646974696f6e2d7465616c3f7374796c653d666f722d7468652d6261646765" alt="Year"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
  &lt;b&gt;Instant demographic extraction, precise age breakdown, and dual-format conversion for Sri Lankan National Identity Cards.&lt;/b&gt;
  &lt;br&gt;
  Built with pure modern web standards, zero third-party dependencies, and an air-gapped zero-knowledge client architecture
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nicinfo.vercel.app/" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Explore Web App&lt;/strong&gt;&lt;/a&gt; • &lt;a href="https://nicinfo.vercel.app/guidelines.html" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Format Guidelines&lt;/strong&gt;&lt;/a&gt; • &lt;a href="https://nicinfo.vercel.app/privacy.html" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Privacy Notice&lt;/strong&gt;&lt;/a&gt; • &lt;a href="https://nicinfo.vercel.app/policy.html" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;Operating Policy&lt;/strong&gt;&lt;/a&gt; • &lt;a href="https://nicinfo.vercel.app/llms.txt" rel="nofollow noopener noreferrer"&gt;&lt;strong&gt;LLMs Specification&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;



&lt;br&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📖 Executive Summary&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;NIC Info&lt;/strong&gt; is a client-side utility engineered to decode, parse, and validate Sri Lankan National Identity Card (NIC) numbers in real time. Designed with a bespoke &lt;strong&gt;"Registry Office"&lt;/strong&gt; visual aesthetic, it provides instantaneous conversion of legacy (9-character) and modern (12-digit) identity card numbers into structured demographic profiles—extracting birth dates, exact age hierarchies, gender classifications, and administrative voter designations.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🌟 Why NIC Info?&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔒 Zero-Knowledge Privacy&lt;/strong&gt;: 100% of data processing occurs exclusively within the local browser runtime. No identity identifiers are ever transmitted across a network, logged, or cached externally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;⚡&lt;/strong&gt;…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/pubudutharanga/NIC-Info" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What's next on the roadmap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Multilingual localization (Sinhala සිංහල, Tamil தமிழ்)&lt;/li&gt;
&lt;li&gt;[ ] Educational CSV batch-verification mode for administrative workloads (still 100% client-side)&lt;/li&gt;
&lt;li&gt;[ ] Printable / downloadable demographic ID cards in vector SVG/PDF format&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Key Takeaway for Developers
&lt;/h2&gt;

&lt;p&gt;You don't need an 80MB &lt;code&gt;node_modules&lt;/code&gt; folder or a distributed backend cluster to build something valuable and fast.&lt;/p&gt;

&lt;p&gt;Understand your domain deeply, respect user privacy by default, and write clean, standards-compliant code — and you can ship something that boots in sub-milliseconds and never puts your users' data at risk.&lt;/p&gt;

&lt;p&gt;Did you find this breakdown helpful? I'd love to hear your own edge cases or decoding war stories in the comments below. 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Generative Engine Optimization (GEO): A Developer's Guide to Getting Cited by AI</title>
      <dc:creator>Pubudu Tharanga Abewarna</dc:creator>
      <pubDate>Mon, 17 Aug 2026 08:21:40 +0000</pubDate>
      <link>https://dev.to/pubudutharanga/generative-engine-optimization-geo-a-developers-guide-to-getting-cited-by-ai-n6d</link>
      <guid>https://dev.to/pubudutharanga/generative-engine-optimization-geo-a-developers-guide-to-getting-cited-by-ai-n6d</guid>
      <description>&lt;p&gt;Open Google today and the first thing on the page usually isn't a blue link — it's a paragraph the AI wrote, with a handful of small citations tucked underneath. Ask ChatGPT, Claude, or Perplexity the same question and there's no results page at all. You just get the answer.&lt;/p&gt;

&lt;p&gt;That shift has created a discipline sitting next to SEO, not replacing it: &lt;strong&gt;Generative Engine Optimization&lt;/strong&gt;, or &lt;strong&gt;GEO&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO competes for a spot among ~10 blue links. GEO competes for one of the ~2–7 sources an AI actually cites.&lt;/li&gt;
&lt;li&gt;AI systems usually lift a single paragraph or sentence from a page, not the whole thing — structure matters more than ever.&lt;/li&gt;
&lt;li&gt;Ranking #1 on Google no longer guarantees an AI will mention you.&lt;/li&gt;
&lt;li&gt;The fixes aren't exotic: answer-first writing, real numbers, less hype, extractable formatting, fresh dates, off-site reputation — plus a couple of developer-specific moves like fixing your &lt;code&gt;robots.txt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is GEO, Exactly? 🎯
&lt;/h2&gt;

&lt;p&gt;Generative Engine Optimization is the practice of structuring content so AI systems — ChatGPT, Claude, Gemini, Perplexity, Google's AI Overviews — can find it, trust it, and cite it while generating an answer. Princeton researchers coined the term in 2023, and the industry has spent the years since arguing about what to call it. You'll also see &lt;strong&gt;AEO&lt;/strong&gt; (Answer/AI Engine Optimization), &lt;strong&gt;AI SEO&lt;/strong&gt;, and &lt;strong&gt;LLMO&lt;/strong&gt; (large language model optimization) used more or less interchangeably. Nobody's fully settled on one name. Everyone's chasing the same goal: get cited by the system now standing between you and your reader.&lt;/p&gt;

&lt;p&gt;The mental model that matters: &lt;strong&gt;SEO optimizes for a click. GEO optimizes for a mention.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO vs. GEO: What Actually Changed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SEO&lt;/th&gt;
&lt;th&gt;GEO&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Competing for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A spot among ~10 blue links&lt;/td&gt;
&lt;td&gt;One of ~2–7 sources an AI cites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unit that gets judged&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The whole page&lt;/td&gt;
&lt;td&gt;A single paragraph or sentence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Success looks like&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A click to your site&lt;/td&gt;
&lt;td&gt;A citation — the click is optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What earns it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Keywords, backlinks, technical SEO, page experience&lt;/td&gt;
&lt;td&gt;Clear answers, real data, structure, off-site trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Being #1 guarantees&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong visibility&lt;/td&gt;
&lt;td&gt;Nothing. The model decides independently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why This Is Suddenly Everyone's Problem 📉
&lt;/h2&gt;

&lt;p&gt;The numbers back this up. Depending on whose research you trust, somewhere between 58% and 68% of Google searches in the US now end without a click to an outside site — and when an AI Overview shows up on the page, that number climbs past 80%. Pew Research found that people click through on a source cited &lt;em&gt;inside&lt;/em&gt; an AI Overview only about 1% of the time.&lt;/p&gt;

&lt;p&gt;That's not the whole story, though. Seer Interactive's research found that brands who do get cited inside AI Overviews still pull in roughly 35% more organic clicks than brands who don't appear at all. The traffic didn't vanish — it consolidated around whoever gets mentioned.&lt;/p&gt;

&lt;p&gt;This is spreading past consumer search, too. By some industry estimates, somewhere between a third and half of B2B research queries now start inside an LLM chat window instead of a search bar.&lt;/p&gt;

&lt;h2&gt;
  
  
  How AI Engines Actually Decide What to Cite 🔍
&lt;/h2&gt;

&lt;p&gt;Here's the part that trips up a lot of developers: an AI engine doesn't just paste your question into a search box. Ask "what's the best VPN for streaming in Europe" and the model quietly breaks that into several smaller searches — something like "best VPN 2026," "VPN streaming speed comparison," and "VPN server locations Europe" — runs each one separately, then synthesizes an answer from whatever comes back across all of them. This is often called &lt;strong&gt;query fan-out&lt;/strong&gt;, and if you've built a RAG (retrieval-augmented generation) pipeline yourself, it'll look familiar. It's the same pattern, just running one layer up, outside your control.&lt;/p&gt;

&lt;p&gt;The practical consequence: your page doesn't need to rank #1 for one target keyword anymore. It needs to be the best-structured answer to any of the sub-questions the model might generate along the way. Trackers that measure the overlap between classic top-10 rankings and the sources AI engines actually cite report that overlap shrinking fast — some analyses put it dropping from roughly three-quarters down to under 40% over the past couple of years. Ranking well still helps. It's just no longer sufficient on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The GEO Playbook: 8 Things You Can Do This Week 🛠️
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Answer first, explain second
&lt;/h3&gt;

&lt;p&gt;Put the actual answer in the first sentence or two, then back it up — classic inverted-pyramid structure, and exactly what a generative engine is trying to extract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buried:&lt;/strong&gt; "Choosing the right database is one of the most consequential decisions a team makes, with many trade-offs to weigh — scalability, consistency, ecosystem maturity, long-term cost. In this piece we'll walk through several options before landing on a recommendation."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Answer-first:&lt;/strong&gt; "For most new web apps, Postgres is the safest default — it covers relational and JSON workloads, has mature tooling, and scales further than most teams expect to need. Here's why, and when you'd reach for something else."&lt;/p&gt;

&lt;p&gt;Both say roughly the same thing. Only one of them is quotable as a standalone answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Trade adjectives for numbers
&lt;/h3&gt;

&lt;p&gt;"Extremely fast" gets filtered out. "40ms p95 latency across three regions" gets cited, because it's specific and checkable. Princeton's original GEO research found that adding concrete statistics, citing sources, and including direct quotes from credible people improved a page's odds of being cited by roughly 30–40% over unoptimized content. Specificity isn't just more persuasive to people — it's more retrievable by machines.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Kill the marketing voice
&lt;/h3&gt;

&lt;p&gt;"World-class," "industry-leading," "revolutionary" — language that reads as a claim rather than a fact tends to get quietly discounted. Write the way you'd explain something to a smart colleague who has no reason to trust your adjectives: plainly, specifically, trade-offs included. The more neutral the tone, the more it reads as information instead of an ad — which, counterintuitively, makes it more persuasive.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Format for extraction, not for scrolling
&lt;/h3&gt;

&lt;p&gt;AI systems typically lift one paragraph or one table row, not your whole page. Give them clean units to grab: short paragraphs, one idea per section, descriptive headers, comparison tables, and an FAQ block phrased the way people actually ask questions. If you wouldn't be comfortable pasting a single paragraph into a chat window as a standalone answer, it probably isn't extractable yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Timestamp everything
&lt;/h3&gt;

&lt;p&gt;Generative engines weight freshness heavily, especially for anything volatile — pricing, statistics, version numbers, "best of" lists. Add a visible "Last updated" date, and actually update the numbers when you touch the page. An honest range from last month usually beats a precise-looking stat from two years ago.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Build a reputation the AI can find off your site
&lt;/h3&gt;

&lt;p&gt;These systems don't only read your own copy — they weigh what Reddit threads, forums, review sites, and independent comparison articles say about you too. A page that claims "we're the best" carries little weight. A Reddit thread full of people independently agreeing carries a lot. Community reputation is now part of technical SEO, not a separate marketing workstream.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Check whether the bots can even reach you
&lt;/h3&gt;

&lt;p&gt;This is the one developers skip and shouldn't. Most AI providers now run &lt;strong&gt;at least two kinds of crawler&lt;/strong&gt;: one that harvests pages for model training, and one (sometimes two) that fetch pages live to answer a specific question and cite it. Blocking the wrong one quietly removes you from AI answers without you ever noticing.&lt;/p&gt;

&lt;p&gt;Anthropic's current documentation, for example, splits Claude's crawling into three named bots: &lt;code&gt;ClaudeBot&lt;/code&gt; (training data collection), &lt;code&gt;Claude-SearchBot&lt;/code&gt; (indexing for Claude's search features), and &lt;code&gt;Claude-User&lt;/code&gt; (fetching a page in real time because a person asked Claude a question that needed it). Anthropic states all three honor &lt;code&gt;robots.txt&lt;/code&gt; — including &lt;code&gt;Claude-User&lt;/code&gt;, which is a stronger commitment than some other providers make for their user-triggered fetchers. OpenAI runs a comparable split with &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;OAI-SearchBot&lt;/code&gt;, and &lt;code&gt;ChatGPT-User&lt;/code&gt;; Perplexity runs &lt;code&gt;PerplexityBot&lt;/code&gt; for indexing and &lt;code&gt;Perplexity-User&lt;/code&gt; for retrieval.&lt;/p&gt;

&lt;p&gt;A reasonable starting point — allow retrieval and citation, opt out of training only if that's a deliberate policy choice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Traditional search — leave these open
User-agent: Googlebot
Allow: /

User-agent: Bingbot
Allow: /

# Live retrieval + citation bots — these fetch a page to
# answer a specific question and cite it. Block these and
# you disappear from AI-generated answers.
User-agent: OAI-SearchBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: Claude-User
Allow: /

User-agent: Claude-SearchBot
Allow: /

User-agent: PerplexityBot
Allow: /

# Model-training bots — harvest content for future training
# runs. A data-policy decision, not a GEO one: blocking
# these doesn't affect today's citations.
User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: Google-Extended
Disallow: /

Sitemap: https://yoursite.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bot names change — Anthropic, OpenAI, and Perplexity have all deprecated or added user-agents in the past two years (&lt;code&gt;Claude-Web&lt;/code&gt; and &lt;code&gt;anthropic-ai&lt;/code&gt; are both retired). Verify the current strings in each provider's official docs before you ship this, and check your server logs afterward to confirm you got it right.&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Mark up the facts a machine can quote directly
&lt;/h3&gt;

&lt;p&gt;Structured data (schema.org via JSON-LD) turns your key facts into something a machine can parse without guessing at meaning. It won't guarantee a citation, but it removes ambiguity about what your page is actually claiming — especially useful for FAQs, specs, and how-tos:&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;"@context"&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://schema.org"&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;"FAQPage"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mainEntity"&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;"Question"&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;"What is Generative Engine Optimization?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"acceptedAnswer"&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;"Answer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GEO is the practice of structuring content so AI systems like ChatGPT, Claude, and Perplexity can find, trust, and cite it when generating an answer."&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="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;h2&gt;
  
  
  Where llms.txt Actually Fits 📄
&lt;/h2&gt;

&lt;p&gt;You've probably seen &lt;code&gt;/llms.txt&lt;/code&gt; described as "robots.txt, but for AI." It's a proposed convention — a markdown file at your site's root summarizing your most important pages in a format built for LLMs to skim instead of parsing full HTML.&lt;/p&gt;

&lt;p&gt;The honest state of it: it's a community convention, not a ratified standard, and no major AI lab has publicly committed to reading it for search citations. Google's webmaster team has said outright that it doesn't use llms.txt, comparing it to the old meta-keywords tag. Large studies of live sites put adoption around one in ten, and traffic analysis shows major AI crawlers overwhelmingly skip the file and crawl HTML directly anyway.&lt;/p&gt;

&lt;p&gt;So is it worth doing? Probably — for a different reason than "citations." It costs about an hour, and it's a genuinely useful entry point for AI coding agents and assistants that need to navigate documentation efficiently: a curated "here's what actually matters" map rather than a ranking lever. Treat it as cheap hygiene, not a growth strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring Whether Any of This Is Working 📊
&lt;/h2&gt;

&lt;p&gt;Traditional analytics mostly can't see this activity — a citation inside an AI answer often generates zero referrer traffic. A newer category of "AI visibility" tools has emerged to track how often a brand gets mentioned across ChatGPT, Claude, Perplexity, and AI Overviews for a set of target queries, similar to how rank trackers work for classic SEO.&lt;/p&gt;

&lt;p&gt;You don't need to buy one to start, though. Pick the 10–20 questions you most want to be the answer to, ask them yourself across a few AI assistants once a month, and note who gets cited. It's manual, but it's free — and for the first few months, it'll tell you more than a dashboard will.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line 🧭
&lt;/h2&gt;

&lt;p&gt;None of this replaces SEO. You still need a technically sound, well-linked, genuinely useful site, because AI engines still lean heavily on the same trust signals search engines always have. What's changed is the target. You're no longer optimizing a page to outrank nine competitors for a spot on a results page — you're optimizing an &lt;em&gt;answer&lt;/em&gt;, competing to be the source an AI trusts enough to quote when nobody's looking at a results page at all.&lt;/p&gt;

&lt;p&gt;Have you checked whether AI crawlers can actually reach your site? Point 7 is the highest-leverage five minutes on this whole list — I'd genuinely be curious what you find in your logs.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>marketing</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Coding is Dying? No, It’s Evolving into "Agentic Architecture" (2026 career shift)</title>
      <dc:creator>Pubudu Tharanga Abewarna</dc:creator>
      <pubDate>Sat, 31 Jan 2026 07:39:29 +0000</pubDate>
      <link>https://dev.to/pubudutharanga/coding-is-dying-no-its-evolving-into-agentic-architecture-2026-career-shift-c7m</link>
      <guid>https://dev.to/pubudutharanga/coding-is-dying-no-its-evolving-into-agentic-architecture-2026-career-shift-c7m</guid>
      <description>&lt;p&gt;&lt;strong&gt;Author's Note:&lt;/strong&gt; &lt;em&gt;I originally posted this analysis on &lt;a href="https://www.linkedin.com/posts/pubudutharanga_techtrends2026-futureofcoding-ai-activity-7421182602327322624-Jobj" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, where it sparked a massive debate (100k+ views in 4 days) about the future of Junior Devs. I’m sharing the technical breakdown here, but the real discussion with senior engineers is happening &lt;a href="https://www.linkedin.com/posts/pubudutharanga_techtrends2026-futureofcoding-ai-activity-7421182602327322624-Jobj" rel="noopener noreferrer"&gt;on the original thread&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;We are moving past the "GitHub Copilot era" (which just suggests the next line) into something much more disruptive: &lt;strong&gt;The Agentic Era.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As an Information Systems undergraduate, I've been analyzing tools like &lt;strong&gt;Google Antigravity&lt;/strong&gt; (Gemini 3) and &lt;strong&gt;Claude Opus 4.5&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%2Fqla5s69txxxoii3uwdjg.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%2Fqla5s69txxxoii3uwdjg.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/strong&gt; The pattern is clear: we are no longer just &lt;em&gt;writing&lt;/em&gt; code; we are &lt;em&gt;managing&lt;/em&gt; agents that write it for us.&lt;/p&gt;

&lt;p&gt;Here is why the "Junior Developer" role is about to change completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is "Antigravity"? (The Agentic Shift)
&lt;/h2&gt;

&lt;p&gt;Most of us are used to Autocomplete: you type &lt;code&gt;function sum&lt;/code&gt;, and it suggests &lt;code&gt;(a,b)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agentic Development&lt;/strong&gt; is different. You don't type code; you assign a ticket. You act as an Engineering Manager.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Workflow:&lt;/strong&gt; You tell the agent, &lt;em&gt;"Refactor the login auth to use NextAuth v5."&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Agent's Job:&lt;/strong&gt; It plans the steps, edits 10+ files across the repo, runs the terminal commands to install packages, and tests the output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your Job:&lt;/strong&gt; You spend 40% of your time &lt;strong&gt;reviewing&lt;/strong&gt; its work, not typing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. The New Skill Set: "Architects" vs. "Typists"
&lt;/h2&gt;

&lt;p&gt;If an AI agent can handle the syntax and the terminal, what is left for us?&lt;br&gt;
The barrier to entry has lowered, but the &lt;strong&gt;barrier to mastery has skyrocketed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To survive this shift by 2026, students and juniors need to pivot immediately:&lt;/p&gt;

&lt;h3&gt;
  
  
  🛑 Stop Memorizing Syntax
&lt;/h3&gt;

&lt;p&gt;Knowing how to write a generic &lt;code&gt;for loop&lt;/code&gt; from memory is becoming irrelevant.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Start Learning Architecture
&lt;/h3&gt;

&lt;p&gt;You need to decide &lt;em&gt;how&lt;/em&gt; the data flows.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why use a Relational DB here instead of NoSQL?&lt;/li&gt;
&lt;li&gt;Should this be a Server Component or Client Component?
The AI can build the house, but if you give it a bad blueprint, the house will collapse.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Master Security Auditing
&lt;/h3&gt;

&lt;p&gt;Agentic AI is powerful but prone to hallucinations. It might write working code that is completely insecure (e.g., leaving an SQL injection vulnerability).&lt;br&gt;
&lt;strong&gt;You must be the auditor.&lt;/strong&gt; If you don't understand the underlying security principles, you won't spot the invisible doors the AI left open.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The "10x Developer" Opportunity
&lt;/h2&gt;

&lt;p&gt;This isn't doom and gloom. This is leverage.&lt;br&gt;
A single developer can now act as a &lt;strong&gt;full team&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Handled by Agent A.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Scaffolded by Agent B.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; Managed by Agent C.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future belongs to &lt;strong&gt;AI Orchestrators&lt;/strong&gt;—developers who can chain these agents together to build massive systems that used to require a team of five.&lt;/p&gt;

&lt;h2&gt;
  
  
  💬 Join the Debate
&lt;/h2&gt;

&lt;p&gt;I'm seeing this shift start to happen in experimental workflows, but I'm curious about the industry reality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior Devs:&lt;/strong&gt; Are you trusting AI agents with "write access" to your repositories yet? Or are we still strictly in the "read-only" assistance phase?&lt;/p&gt;

&lt;p&gt;The comment section here is open, but the most active discussion is happening over on the LinkedIn thread.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://www.linkedin.com/posts/pubudutharanga_techtrends2026-futureofcoding-ai-activity-7421182602327322624-Jobj" rel="noopener noreferrer"&gt;Click here to read the Senior Dev comments on LinkedIn&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>webdev</category>
      <category>ai</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
