Not a captcha · nothing stored

verify a human.
store nothing.

Manav Human Check drops into the exact spot your captcha sits — the same 300px box. By default a press-&-hold proves a live person with zero saved to the device — no passkey, no images, no farm shortcut. Need hardware-grade proof? Opt into a one-tap passkey.

Nothing stored No images, ever Signed receipt Passkey optional
app.acme.com/signup

↑ this pane is live. press & hold it.

The same premise the industry is converging on
Cloudflare · CAP FIDO Alliance W3C WebAuthn Passkeys Touch ID · Windows Hello
How it works

Three steps. Nothing gets stored.

Captchas fail because any puzzle an AI can see, an AI can solve. So we don't use a puzzle — and by default we don't enroll anything either. We just prove a live person is here, right now.

Step 01

Press & hold the pane

The same box your users already recognise from reCAPTCHA or Turnstile. Press and hold for a moment — nothing to read, nothing to drag.

Step 02

Liveness — not storage

A sustained hold from genuine hardware input proves a live person. Synthetic bot events (isTrusted:false) are rejected. No passkey is created and nothing is saved to the device. Need hardware-grade proof? data-assurance="strong" swaps this step for a one-tap passkey.

Step 03

Your server gets a signed yes

A one-time, Ed25519-signed token rides the form submit. Verify it server-side — or offline against the published key — and keep it as proof.

Every theme & size

Looks like a captcha. In every theme.

Light, dark, normal, compact, flexible — match your form. The first three are the zero-storage default; the last opts into the strong passkey. Each pane is a single <div class="manav-check">.

Light · Normal~300×66 · like Turnstile/reCAPTCHA
Dark · Normaldata-theme="dark"
Compact150×140 · sidebars / mobile
Flexible · strong100% · data-assurance="strong"

The first three panes press-&-hold and store nothing. The last opts into a one-tap device passkey (data-assurance="strong"); a desktop without one gets a phone-QR hand-off.

Portable proof

Proof you can keep — and verify offline.

Every pass returns a compact, signed receipt. Check it on your server, or anywhere, against the public key we publish — no callback to Manav required.

  • Ed25519 signature (libsodium) — offline-verifiable
  • One-time-use token, replay-protected
  • Tamper-evident hash chain for multi-step sessions
  • The biometric never leaves the device — only a yes/no
// GET …/.well-known/  → the public key, by design
{ "alg": "ed25519", "offlineVerifiable": true, … }

// the signed receipt your form carries on submit
{
  "type":    "bind",
  "anchor":  "webauthn_uv",
  "human":   true,
  "alg":     "ed25519",
  "sig":     "NKmjr8qHOVxP7Iqfg1WO…"
}
Inclusive by default

Never locks a real person out.

A passkey is the strong path, but it degrades gracefully so no genuine user hits a wall — and you decide how strict to be.

  • No platform passkey? Scan a QR and finish on your phone
  • Still none? A press-and-hold soft gate measures live human entropy + trusted input
  • Accessible: a device PIN works — no vision required
  • You set the bar with data-attestation="required"
1

Platform passkey

Touch ID / Face ID / Windows Hello — the gold path.

2

Phone hand-off (QR)

No local authenticator? A QR pairs your phone to finish the check.

3

Press-and-hold soft gate

Behavioral entropy + isTrusted input, clearly labelled weaker.

Same shape, different proof

It fits exactly where a captcha sits.

The form factor matches the incumbents, so swapping is a markup change. What differs is the test underneath: a hardware passkey gesture instead of a solvable puzzle.

 reCAPTCHA v2hCaptchaTurnstileManav
Normal size304×78~303 wide300×65~300×66
Compact158×140yes150×140150×140
Themeslight/darklight/darkauto/light/darkauto/light/dark
The testimage puzzle / riskimage puzzleJS challengepasskey gesture
Solvable by AI visionyesyesn/ano
Proof you can keeptoken (server-checked)tokentokensigned, offline-verifiable

This is a recognised direction: Cloudflare shipped Cryptographic Attestation of Personhood — touch a hardware key instead of a captcha, validated against the FIDO Metadata Service — on the same premise. Manav packages it as a drop-in pane with a portable, offline-verifiable receipt and graceful fallbacks. Honest limit: a passkey gesture is strong evidence of a human, and the residual bypass (a virtual/automation authenticator) is what data-attestation="required" shuts out.

Under the hood

The test is physics, not a puzzle.

The browser runs the ceremony; the server owns the part the browser can't be trusted with — a tamper-evident, signed receipt.

Browser pane Secure enclave · user verification Signed receipt · Ed25519 Your server · /verify

The decisive step asks the device's secure enclave to assert presence with a real fingerprint, Face ID, or PIN — a prompt owned by the operating system, with no API to fake a fingerprint into a genuine authenticator. The server signs each receipt and chains it (head = sha256(receipt | sig)), so a bot that splices, drops, or replays a step breaks the chain and can't forge a new one. Rate limits are keyed on CF-Connecting-IP; every verify token is one-time-use.

~2s
to verify
0
images shown
Ed25519
signed receipt
0
stored by default
Drop-in

Two lines. Then verify on submit.

<!-- default: zero-storage press-&-hold, nothing saved on the device -->
<div class="manav-check" data-theme="auto" data-size="normal" data-endpoint="/labs/captcha/api/index.php"></div>

<!-- opt in to a hardware passkey (one tap; phones save a synced passkey) -->
<div class="manav-check" data-assurance="strong" data-endpoint="/labs/captcha/api/index.php"></div>
<script src="/labs/captcha/widget.js"></script>

// on submit, the form carries a hidden "manav-token" — check it server-side:
//   POST /labs/captcha/api/index.php?action=verify  { token }
//   → { human:true, anchor:"webauthn_uv", attested:false }   (one-time use)

Options: data-assurance="strong" (device passkey), data-attestation="required" (genuine devices only), data-ttl="300" (expire & re-arm), data-size="compact|flexible".

Plans

Start free. Scale when you ship.

Indicative tiers for this demo — the pane, the API, and the receipts are fully open here.

Hobby
$0
up to 1k checks / mo
  • All themes & sizes
  • Offline-verifiable receipts
  • QR + press-and-hold fallbacks
  • Community support
Get the snippet
Enterprise
Custom
volume · on-prem · SLA
  • Self-hosted / on-prem
  • SSO & audit logging
  • Attestation chain verification
  • Priority SLA
Talk to us
Questions

Honest answers.

Is this actually a captcha?
It occupies the same slot and form factor, but it isn't a puzzle. Instead of asking you to prove you're not a robot by solving something, it asks your device to assert a live person is present. Same box, different proof.
What if a user has no Touch ID / passkey?
It degrades gracefully: a QR hands off to the user's phone, and failing that a press-and-hold soft gate measures live human entropy and trusted input. A device PIN also satisfies user-verification, so no vision is required.
Can a bot or AI agent pass it?
Not the hardware path. The user-verification prompt is owned by the OS and bound to an enrolled device; there's no API to fake a fingerprint into a genuine authenticator. data-attestation="required" additionally shuts out virtual/automation authenticators.
Do you store biometrics?
Never. The fingerprint or face stays in the device's secure enclave. Only a signed yes/no presence proof leaves the device — there is no biometric vault to breach.
How does my server verify the token?
POST the token to the verify endpoint, or check the Ed25519 signature offline against the published public key.
POST api/index.php?action=verify { token } → { human:true, alg:"ed25519" }
Does it work on desktop and cross-device?
Yes. On a machine with a platform authenticator it's one tap. Without one, the QR phone hand-off lets the user verify on a device that does have a passkey, then the desktop flips to verified. Requires HTTPS (a secure context) everywhere but localhost.
Get started

Ready to retire your captcha?

Drop in two lines and verify a real human on the very next submit. No images, no friction, a receipt you can keep.