<?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: Manuel Felipe Arias Pineda</title>
    <description>The latest articles on DEV Community by Manuel Felipe Arias Pineda (@manuel_felipeariaspined).</description>
    <link>https://dev.to/manuel_felipeariaspined</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%2F3788370%2F8a45a955-8584-4788-8d87-5571de35fd69.jpg</url>
      <title>DEV Community: Manuel Felipe Arias Pineda</title>
      <link>https://dev.to/manuel_felipeariaspined</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/manuel_felipeariaspined"/>
    <language>en</language>
    <item>
      <title>Soulprint v0.6.0: We Removed libp2p and the Network Got Better</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Sun, 01 Mar 2026 04:01:15 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/soulprint-v060-we-removed-libp2p-and-the-network-got-better-opn</link>
      <guid>https://dev.to/manuel_felipeariaspined/soulprint-v060-we-removed-libp2p-and-the-network-got-better-opn</guid>
      <description>&lt;h1&gt;
  
  
  Soulprint v0.6.0: We Removed libp2p and the Network Got Better
&lt;/h1&gt;

&lt;p&gt;Today we released &lt;strong&gt;soulprint-network v0.6.0&lt;/strong&gt;: we removed libp2p entirely. No DHT. No mDNS. Just the blockchain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Old Architecture (v0.5.x)
&lt;/h2&gt;

&lt;p&gt;13 libp2p packages. Two peer discovery systems. One extra TCP port. Docker builds taking 3-4 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Architecture (v0.6.0)
&lt;/h2&gt;

&lt;p&gt;Zero libp2p packages. One port. Docker build under 45 seconds.&lt;/p&gt;

&lt;p&gt;Every node registers its HTTP endpoint in PeerRegistry.sol on Base Sepolia. Any node calls getAllPeers() and gets the full network with no bootstrap, no DHT, no mDNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Blockchain Beats P2P for Peer Discovery
&lt;/h2&gt;

&lt;p&gt;libp2p is great for IPFS-style content-addressed networks. Soulprint is an &lt;strong&gt;identity network&lt;/strong&gt; with a small set of validators. A smart contract is a better peer directory than a DHT: immutable (no Sybil bootstrap attacks), globally accessible (works across NAT and firewalls), trustless (cryptographic proof of registration), and 13 packages lighter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&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;v0.5.1&lt;/th&gt;
&lt;th&gt;v0.6.0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;libp2p packages&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker build time&lt;/td&gt;
&lt;td&gt;~3-4 min&lt;/td&gt;
&lt;td&gt;~45 sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TCP ports&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;npm package size&lt;/td&gt;
&lt;td&gt;~180KB&lt;/td&gt;
&lt;td&gt;~72KB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What We Kept
&lt;/h2&gt;

&lt;p&gt;Everything that matters: ZK proof verification, anti-Sybil nullifiers, bot reputation attestations, HTTP gossip (AES-256-GCM), state sync, and all credential validators (email, phone, GitHub, Registraduria Colombia).&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install soulprint-network@0.6.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;https://github.com/manuelariasfz/soulprint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PeerRegistry on Base Sepolia: 0x452fb66159dFCfC13f2fD9627aA4c56886BfB15b&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
      <category>node</category>
    </item>
    <item>
      <title>Soulprint v0.5.0: 4-Node Validator Network, Registraduría Integration &amp; Stable Release</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Sun, 01 Mar 2026 03:37:23 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/soulprint-v050-4-node-validator-network-registraduria-integration-stable-release-51c5</link>
      <guid>https://dev.to/manuel_felipeariaspined/soulprint-v050-4-node-validator-network-registraduria-integration-stable-release-51c5</guid>
      <description>&lt;h1&gt;
  
  
  Soulprint v0.5.0 — Most Stable Release Yet 🛡️
&lt;/h1&gt;

&lt;p&gt;We're excited to announce &lt;strong&gt;Soulprint v0.5.0&lt;/strong&gt;, the most stable and reliable release of the decentralized identity verification protocol for Colombian citizens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's New
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🌐 4-Node Validator Network on Railway
&lt;/h3&gt;

&lt;p&gt;Soulprint now runs a &lt;strong&gt;4-node validator network&lt;/strong&gt; deployed on Railway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;soulprint-node-production.up.railway.app&lt;/code&gt; — Validator 0 (superAdmin)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;soulprint-validator-1-production.up.railway.app&lt;/code&gt; — Validator 1&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;soulprint-validator-2-production.up.railway.app&lt;/code&gt; — Validator 2&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;soulprint-validator-3-production.up.railway.app&lt;/code&gt; — Validator 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All nodes are registered in the &lt;strong&gt;PeerRegistry smart contract&lt;/strong&gt; on Base Sepolia, enabling automatic peer discovery and consensus.&lt;/p&gt;

&lt;h3&gt;
  
  
  🇨🇴 Registraduría Nacional Validation
&lt;/h3&gt;

&lt;p&gt;Critical security fix: Soulprint now validates Colombian cédulas against the &lt;strong&gt;Registraduría Nacional del Estado Civil&lt;/strong&gt; before issuing identity nullifiers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /verify/cedula?numero=XXXXXXXX&amp;amp;fechaNac=YYYY-MM-DD
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vigente"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VIGENTE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"numero"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345678"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fechaNac"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1990-01-15"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Registraduría is unreachable, the system gracefully degrades (logs a warning but does not block verification).&lt;/p&gt;

&lt;h3&gt;
  
  
  🔧 Fixed workspace:* Dependencies
&lt;/h3&gt;

&lt;p&gt;All &lt;code&gt;workspace:*&lt;/code&gt; protocol dependencies have been resolved to concrete npm versions, making &lt;code&gt;soulprint-network&lt;/code&gt; installable in any environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; soulprint-network@0.5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install &amp;amp; Run
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; soulprint-network@0.5.0
soulprint-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:22-slim&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; soulprint-network@0.5.0
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; SOULPRINT_PORT=4888&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 4888&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "/usr/local/lib/node_modules/soulprint-network/dist/server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;Soulprint uses a multi-layer architecture:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ZK Proofs&lt;/strong&gt; — Circom-based zero-knowledge proofs for biometric verification&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P2P Network&lt;/strong&gt; — libp2p with Kademlia DHT + GossipSub for peer discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-chain Registry&lt;/strong&gt; — PeerRegistry contract on Base Sepolia for node registration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Credential Verification&lt;/strong&gt; — Email, phone, GitHub, and now &lt;strong&gt;Registraduría&lt;/strong&gt; validation&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;https://github.com/manuelariasfz/soulprint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/soulprint-network" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/soulprint-network&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PeerRegistry: &lt;a href="https://sepolia.basescan.org/address/0x452fb66159dFCfC13f2fD9627aA4c56886BfB15b" rel="noopener noreferrer"&gt;https://sepolia.basescan.org/address/0x452fb66159dFCfC13f2fD9627aA4c56886BfB15b&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Built with ❤️ for Colombia's digital identity future.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>decentralized</category>
      <category>colombia</category>
      <category>identity</category>
    </item>
    <item>
      <title>Soulprint v0.4.2: On-Chain Peer Discovery — Every AI Agent Node Finds Its Network via Blockchain</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Sun, 01 Mar 2026 03:29:26 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/soulprint-v042-on-chain-peer-discovery-every-ai-agent-node-finds-its-network-via-blockchain-f1o</link>
      <guid>https://dev.to/manuel_felipeariaspined/soulprint-v042-on-chain-peer-discovery-every-ai-agent-node-finds-its-network-via-blockchain-f1o</guid>
      <description>&lt;p&gt;What if your AI agent node could discover its entire peer network without ever relying on a central server? That's exactly what Soulprint v0.4.2 delivers with &lt;strong&gt;PeerRegistry&lt;/strong&gt; — a smart contract on Base Sepolia that acts as a decentralized phonebook for validator nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is PeerRegistry?
&lt;/h2&gt;

&lt;p&gt;PeerRegistry is a Solidity smart contract deployed on Base Sepolia at &lt;code&gt;0x452fb66159dFCfC13f2fD9627aA4c56886BfB15b&lt;/code&gt;. It stores a mapping of AI agent nodes — their decentralized identifiers (DIDs), libp2p peer IDs, multiaddrs, and trust scores — fully on-chain and publicly readable by anyone.&lt;/p&gt;

&lt;p&gt;Think of it as a blockchain-native version of a DNS directory, but for a peer-to-peer network of AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Node starts&lt;/strong&gt; → reads &lt;code&gt;getAllPeers()&lt;/code&gt; from the PeerRegistry contract&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovers peers&lt;/strong&gt; → uses their multiaddrs as bootstrap points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Registers self&lt;/strong&gt; → calls &lt;code&gt;registerPeer()&lt;/code&gt; on-chain with its own DID + multiaddr&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stays discoverable&lt;/strong&gt; → any future node that joins will find it via the contract&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No central bootstrap server. No hardcoded IPs. Just Ethereum state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why It Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No central point of failure&lt;/strong&gt; — blockchain is the bootstrap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Censorship-resistant&lt;/strong&gt; — nobody can remove your node without your private key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifiable&lt;/strong&gt; — every registration is an on-chain transaction&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  See It in Action
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint-network
curl http://localhost:4888/network/peers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your node auto-registers on-chain within seconds of startup.&lt;/p&gt;

&lt;p&gt;Full source: &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;github.com/manuelariasfz/soulprint&lt;/a&gt; 🌐&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇲🇳 Mongolia devs: Add Иргэний үнэмлэх (National ID) to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 08:33:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/mongolia-devs-add-irghenii-unemlekh-national-id-to-the-ai-identity-standard-soulprint-open-20g8</link>
      <guid>https://dev.to/manuel_felipeariaspined/mongolia-devs-add-irghenii-unemlekh-national-id-to-the-ai-identity-standard-soulprint-open-20g8</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇲🇳 Mongolia's Иргэний үнэмлэх (National ID) is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇲🇳 Mongolia: Иргэний үнэмлэх (National ID)
&lt;/h2&gt;

&lt;p&gt;Mongolian ID: 2 Mongolian letters + 8 digits (Latin transcription). The letters encode birth year and gender.&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/MN.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;MN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Mongolia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;national_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Иргэний үнэмлэх (National ID) format: 2 letters + 8 digits&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&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-ZА-я&lt;/span&gt;&lt;span class="se"&gt;]{2}\d{8})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 2 letters + 8 digits&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;valid&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-Za-zА-я&lt;/span&gt;&lt;span class="se"&gt;]{2}\d{8}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;MN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MN&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/MN&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "MN": MN,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mongolia joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇰🇭 Cambodia devs: Add National ID Card to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 08:18:48 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/cambodia-devs-add-national-id-card-to-the-ai-identity-standard-soulprint-open-source-30-min-1di9</link>
      <guid>https://dev.to/manuel_felipeariaspined/cambodia-devs-add-national-id-card-to-the-ai-identity-standard-soulprint-open-source-30-min-1di9</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇰🇭 Cambodia's National ID Card is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇰🇭 Cambodia: National ID Card
&lt;/h2&gt;

&lt;p&gt;Cambodian national ID: 9 digits numeric. Passport: 1 letter + 7 digits.&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/KH.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;KH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Cambodia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;national_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// National ID Card format: 9 digits&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{9})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// exactly 9 digits&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\d{9}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;KH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;KH&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/KH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "KH": KH,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cambodia joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇱🇰 Sri Lanka devs: Add National Identity Card (NIC) to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 08:03:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/sri-lanka-devs-add-national-identity-card-nic-to-the-ai-identity-standard-soulprint-open-2oif</link>
      <guid>https://dev.to/manuel_felipeariaspined/sri-lanka-devs-add-national-identity-card-nic-to-the-ai-identity-standard-soulprint-open-2oif</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇱🇰 Sri Lanka's National Identity Card (NIC) is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇱🇰 Sri Lanka: National Identity Card (NIC)
&lt;/h2&gt;

&lt;p&gt;Old NIC: 9 digits + V or X (total 10 chars). New NIC: 12 digits. First 4 = birth year, next 3 = day of year (female +500).&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/LK.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;LK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LK&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sri Lanka&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// National Identity Card (NIC) format: Old: 9 digits + V/X; New: 12 digits&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{9}[&lt;/span&gt;&lt;span class="sr"&gt;VX&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\d{12})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;LK&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// old format 9+V/X or new 12 digits&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\d{9}[&lt;/span&gt;&lt;span class="sr"&gt;VX&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;|&lt;/span&gt;&lt;span class="se"&gt;\d{12})&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;LK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;LK&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/LK&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "LK": LK,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sri Lanka joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇳🇵 Nepal devs: Add National Identity Card to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 07:48:48 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/nepal-devs-add-national-identity-card-to-the-ai-identity-standard-soulprint-open-source-30-e1c</link>
      <guid>https://dev.to/manuel_felipeariaspined/nepal-devs-add-national-identity-card-to-the-ai-identity-standard-soulprint-open-source-30-e1c</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇳🇵 Nepal's National Identity Card is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇳🇵 Nepal: National Identity Card
&lt;/h2&gt;

&lt;p&gt;National ID (under rollout): 13 alphanumeric chars. Citizenship certificate: district code + issue year + sequence (variable).&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/NP.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;NP&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Nepal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;national_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;citizenship&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// National Identity Card format: NID 13 chars or citizenship variable&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{13})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;NP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 13 alphanumeric&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;valid&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{13}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;NP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;NP&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/NP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "NP": NP,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nepal joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇹🇿 Tanzania devs: Add NIDA National ID to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 07:33:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/tanzania-devs-add-nida-national-id-to-the-ai-identity-standard-soulprint-open-source-30-min-124l</link>
      <guid>https://dev.to/manuel_felipeariaspined/tanzania-devs-add-nida-national-id-to-the-ai-identity-standard-soulprint-open-source-30-min-124l</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇹🇿 Tanzania's NIDA National ID is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇹🇿 Tanzania: NIDA National ID
&lt;/h2&gt;

&lt;p&gt;NIDA: 20 alphanumeric characters (format: XXXXXXXX-XXXXX-XXXXX-XX). Birth certificate number also used.&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/TZ.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;TZ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tanzania&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nida&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// NIDA National ID format: 20 chars NIDA format&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{8}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{5}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{5}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{2})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// NIDA format 8-5-5-2&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;valid&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{8}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{5}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{5}&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-Z0-9&lt;/span&gt;&lt;span class="se"&gt;]{2}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TZ&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/TZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "TZ": TZ,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tanzania joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇪🇹 Ethiopia devs: Add National ID (Fayda) to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 07:18:48 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/ethiopia-devs-add-national-id-fayda-to-the-ai-identity-standard-soulprint-open-source-30-4cg</link>
      <guid>https://dev.to/manuel_felipeariaspined/ethiopia-devs-add-national-id-fayda-to-the-ai-identity-standard-soulprint-open-source-30-4cg</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇪🇹 Ethiopia's National ID (Fayda) is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇪🇹 Ethiopia: National ID (Fayda)
&lt;/h2&gt;

&lt;p&gt;Fayda ID (under rollout): 16-digit biometric national ID. Older system uses kebele ID (variable format).&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/ET.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;ET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ethiopia&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fayda_id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// National ID (Fayda) format: 16 digits Fayda ID&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{16})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 16 digits numeric&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\d{16}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ET&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/ET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "ET": ET,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ethiopia joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇺🇿 O'zbekiston devs: Add JSHSHIR (Personal ID Number) to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 07:03:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/ozbekiston-devs-add-jshshir-personal-id-number-to-the-ai-identity-standard-soulprint-open-258n</link>
      <guid>https://dev.to/manuel_felipeariaspined/ozbekiston-devs-add-jshshir-personal-id-number-to-the-ai-identity-standard-soulprint-open-258n</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇺🇿 O'zbekiston's JSHSHIR (Personal ID Number) is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇺🇿 O'zbekiston: JSHSHIR (Personal ID Number)
&lt;/h2&gt;

&lt;p&gt;JSHSHIR: 14 digits. Date of birth (DDMMYYYY) + gender digit + 5-digit sequence.&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/UZ.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;UZ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;O'zbekiston&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jshshir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// JSHSHIR (Personal ID Number) format: 14 digits DDMMYYYYGXXXXX&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{14})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 14 digits, valid date prefix&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\d{14}&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;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;UZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;UZ&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/UZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "UZ": UZ,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O'zbekiston joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇰🇿 Қазақстан devs: Add ИИН (Индивидуальный Идентификационный Номер) to the AI identity standard — Soulprint open source (30 min</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 06:48:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/kazakstan-devs-add-iin-individualnyi-idientifikatsionnyi-nomier-to-the-ai-identity-standard--2945</link>
      <guid>https://dev.to/manuel_felipeariaspined/kazakstan-devs-add-iin-individualnyi-idientifikatsionnyi-nomier-to-the-ai-identity-standard--2945</guid>
      <description>&lt;p&gt;ИИ-агенты принимают решения без проверки личности. &lt;strong&gt;Soulprint&lt;/strong&gt; — ZK доказательства, локально, MIT.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇰🇿 Казахстанский ИИН ещё не добавлен в Soulprint. Добавь за 30 минут.&lt;/strong&gt;&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;const&lt;/span&gt; &lt;span class="nx"&gt;KZ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Kazakhstan&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;iin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&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;iin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{12})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;iin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;iin&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KZ&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\d{12}&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;docNumber&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="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;KZ&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;em&gt;Один PR. Одна страна.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🇷🇸 Srbija devs: Add JMBG (Jedinstveni Matični Broj Građana) to the AI identity standard — Soulprint open source (30 min PR)</title>
      <dc:creator>Manuel Felipe Arias Pineda</dc:creator>
      <pubDate>Thu, 26 Feb 2026 06:33:47 +0000</pubDate>
      <link>https://dev.to/manuel_felipeariaspined/srbija-devs-add-jmbg-jedinstveni-maticni-broj-gradana-to-the-ai-identity-standard-soulprint-51ke</link>
      <guid>https://dev.to/manuel_felipeariaspined/srbija-devs-add-jmbg-jedinstveni-maticni-broj-gradana-to-the-ai-identity-standard-soulprint-51ke</guid>
      <description>&lt;p&gt;Every day, AI agents make decisions on our behalf — buying, sending emails, signing documents — and nobody verifies there's a real human behind them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Soulprint&lt;/strong&gt; solves this with Zero-Knowledge Proofs: 100% on-device, open source (MIT), free to run. &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;soulprint.digital&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🇷🇸 Srbija's JMBG (Jedinstveni Matični Broj Građana) is not in Soulprint yet. You can add it in ~30 minutes with one PR.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Soulprint does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx soulprint verify-me       &lt;span class="c"&gt;# scan ID + face match — all local&lt;/span&gt;
&lt;span class="c"&gt;# → SPT token (score 0-100)&lt;/span&gt;

&lt;span class="c"&gt;# AI agent includes token in every call&lt;/span&gt;
&lt;span class="c"&gt;# X-Soulprint: eyJ... (score: 84)&lt;/span&gt;

&lt;span class="c"&gt;# API verifies in 3 lines:&lt;/span&gt;
import &lt;span class="o"&gt;{&lt;/span&gt; requireSoulprint &lt;span class="o"&gt;}&lt;/span&gt; from &lt;span class="s2"&gt;"soulprint-mcp"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
server.tool&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"premium"&lt;/span&gt;, requireSoulprint&lt;span class="o"&gt;({&lt;/span&gt; minScore: 80 &lt;span class="o"&gt;})&lt;/span&gt;, handler&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ZK proof: Circom 2.1.8 · Groth16 · 844 constraints · 564ms prove · 25ms verify.&lt;/p&gt;




&lt;h2&gt;
  
  
  🇷🇸 Srbija: JMBG (Jedinstveni Matični Broj Građana)
&lt;/h2&gt;

&lt;p&gt;JMBG: 13 digits. DDMMYYYY + region + sequence + check. Mod-11 check digit (weights 7,6,5,4,3,2,7,6,5,4,3,2).&lt;/p&gt;




&lt;h2&gt;
  
  
  The code — fill in the blanks and open a PR
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// packages/verify-local/src/document/countries/RS.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DocumentResult&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../verifier.interface&lt;/span&gt;&lt;span class="dl"&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;RS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CountryVerifier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;countryCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;countryName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Srbija&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentTypes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jmbg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;ocrText&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;DocumentResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// JMBG (Jedinstveni Matični Broj Građana) format: 13 digits DDMMYYYYRRNNNC&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ocrText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(\d{13})&lt;/span&gt;&lt;span class="sr"&gt;/&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="o"&gt;??&lt;/span&gt; &lt;span class="dl"&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!!&lt;/span&gt;&lt;span class="nx"&gt;doc_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;doc_number&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;RS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="na"&gt;docNumber&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;NumberValidation&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// mod-11 weighted check&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;valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;validateJMBG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;docNumber&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="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;RS&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add one line in &lt;code&gt;registry.ts&lt;/code&gt;:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;RS&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./countries/RS&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// add to registry map: "RS": RS,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open a PR → your country joins the global AI identity standard. 🌍&lt;/p&gt;




&lt;h2&gt;
  
  
  Why contribute?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Srbija joins the AI age&lt;/strong&gt; — local developers can verify their AI agents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent git credit&lt;/strong&gt; — you're in the history forever&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decentralized identity&lt;/strong&gt; — no Big Tech as gatekeeper&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast&lt;/strong&gt; — 30 min partial, 2-3h full with MRZ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌀 &lt;a href="https://soulprint.digital" rel="noopener noreferrer"&gt;https://soulprint.digital&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/manuelariasfz/soulprint" rel="noopener noreferrer"&gt;GitHub — fork here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;a href="https://github.com/manuelariasfz/soulprint/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;One PR. One country. The future of AI identity is open source.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>identity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
