<?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: Alejandro</title>
    <description>The latest articles on DEV Community by Alejandro (@aagb).</description>
    <link>https://dev.to/aagb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4054283%2F67e023d0-e648-4522-9d0e-d04ddeae55e9.jpg</url>
      <title>DEV Community: Alejandro</title>
      <link>https://dev.to/aagb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aagb"/>
    <language>en</language>
    <item>
      <title>I Built a Zero-Knowledge Protocol to Prove a Human Typed This (Not a Bot) — Help Me Try to Break It</title>
      <dc:creator>Alejandro</dc:creator>
      <pubDate>Thu, 30 Jul 2026 05:55:12 +0000</pubDate>
      <link>https://dev.to/aagb/i-built-a-zero-knowledge-protocol-to-prove-a-human-typed-this-not-a-bot-help-me-try-to-break-it-5ah9</link>
      <guid>https://dev.to/aagb/i-built-a-zero-knowledge-protocol-to-prove-a-human-typed-this-not-a-bot-help-me-try-to-break-it-5ah9</guid>
      <description>&lt;p&gt;AI-generated text is no longer distinguishable from human text. That's not a hot&lt;br&gt;
take, it's a measurable fact at this point, and it quietly breaks a lot of the&lt;br&gt;
trust assumptions the internet runs on — messaging, marketplaces, escrow, forums.&lt;br&gt;
If you can no longer tell &lt;em&gt;what&lt;/em&gt; was written by a bot, the obvious next question&lt;br&gt;
is: can you tell &lt;em&gt;how&lt;/em&gt; it was written?&lt;/p&gt;

&lt;p&gt;That's the premise behind &lt;strong&gt;PoHI (Proof of Human Intent)&lt;/strong&gt;, a protocol I've been&lt;br&gt;
building on my own: instead of analyzing text content, it measures the physical&lt;br&gt;
rhythm of typing — dwell time, flight time between keys, the skew of your pauses,&lt;br&gt;
how you correct mistakes — and proves, via a zero-knowledge SNARK, that the&lt;br&gt;
resulting score clears a threshold, without ever revealing the raw keystroke data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack, briefly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@pohi-protocol/core-math&lt;/code&gt; — the reference math engine implementing the
behavioral equations (skewness, cognitive-latency ratio, error-recalibration
variance). 74 unit tests.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;circuits/&lt;/code&gt; — a Circom circuit compiling to Groth16 over BN254, ~12,500
constraints, with a real multi-party trusted-setup ceremony tool. 21 tests
checking it agrees numerically with the reference engine &lt;em&gt;and&lt;/em&gt; that the
constraint system actually binds every signal — regression tests for soundness
bugs I found and fixed in my own circuit.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;packages/sdk-web&lt;/code&gt; — the browser-side capture SDK.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;experiments/&lt;/code&gt; — an adversarial evaluation harness with six attacker models,
from "constant-delay macro" up to "an attacker with full knowledge of the
scoring function trying to fake the rhythm."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything is open: &lt;a href="https://github.com/ProjectOne2020/pohi-protocol-poc" rel="noopener noreferrer"&gt;https://github.com/ProjectOne2020/pohi-protocol-poc&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;I'm not here to tell you this is unbreakable. It probably isn't, at least not yet.&lt;br&gt;
A zk-SNARK proves you know a witness satisfying the relation — it does &lt;em&gt;not&lt;/em&gt;&lt;br&gt;
prove that witness came from an actual human hand. That's a real, documented gap&lt;br&gt;
(I wrote it up in the threat model instead of hiding it — see&lt;br&gt;
&lt;a href="https://github.com/ProjectOne2020/pohi-protocol-poc/blob/main/docs/THREAT_MODEL.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/THREAT_MODEL.md&lt;/code&gt; §5&lt;/a&gt;),&lt;br&gt;
and I pre-registered the exact condition that would falsify the whole approach&lt;br&gt;
&lt;em&gt;before&lt;/em&gt; collecting a single data point: if a cheap, offline-generated fake&lt;br&gt;
typing pattern gets accepted more than 50% of the time, software-only PoHI&lt;br&gt;
doesn't hold up, and hardware attestation becomes mandatory instead of optional.&lt;/p&gt;

&lt;p&gt;To test that, I need real human typing data — which is the actual ask here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you give me 5 minutes?
&lt;/h2&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://pohi-protocol-poc.vercel.app" rel="noopener noreferrer"&gt;https://pohi-protocol-poc.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You type a few short prompts, that's it. Available in English and Spanish. What&lt;br&gt;
gets recorded is &lt;em&gt;only&lt;/em&gt; keystroke press/release timestamps in milliseconds and&lt;br&gt;
whether a key was Backspace — never the text itself. That's not just a privacy&lt;br&gt;
promise: the database schema itself has a constraint that rejects any record&lt;br&gt;
containing character data, so it holds even if someone tampers with the client.&lt;br&gt;
You can check that directly in&lt;br&gt;
&lt;a href="https://github.com/ProjectOne2020/pohi-protocol-poc/blob/main/experiments/schema.sql" rel="noopener noreferrer"&gt;&lt;code&gt;experiments/schema.sql&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're more interested in poking at the code than typing, I'd take that too —&lt;br&gt;
issues, PRs, "your fixed-point division is still wrong here" comments, all&lt;br&gt;
welcome. Especially if you can break the scoring.&lt;/p&gt;




&lt;p&gt;Repo: &lt;a href="https://github.com/ProjectOne2020/pohi-protocol-poc" rel="noopener noreferrer"&gt;https://github.com/ProjectOne2020/pohi-protocol-poc&lt;/a&gt;&lt;br&gt;
LinkedIn: &lt;a href="https://www.linkedin.com/in/alejandro-guti%C3%A9rrez-9a0318107/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/alejandro-guti%C3%A9rrez-9a0318107/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>security</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
