MIT licensed · zero dependencies · one file

The captcha people
actually enjoy solving.

Park the old car past moving traffic, rotate it to the exit, stop it on the line, pick every car in the grid — or just draw a perfect circle. Canvas-rendered, keyboard friendly, and locked to domains you own.

Tip: hover the widget (or click it) and steer with the arrow keys or WASD.

Verification token

— solve a challenge —

Zero dependencies

One ES module, no cookies, no tracking, no network calls in the widget.

Arrow-key playable

Every driving puzzle accepts arrow keys or WASD, plus pointer and touch.

Live NPC traffic

Animated cars cruise the lanes, so the scene reads as a real street.

DNS-locked keys

Site keys only work on domains you proved you own with a TXT record.

Five challenges

Toggle any of them — the live widget above updates instantly.

Ship it in five minutes

  1. 1. Add your domain in the dashboard and publish the _carcaptcha TXT record.
  2. 2. Drop in the widget with your public site key.
  3. 3. Verify the token server-side with your secret key before trusting a submission.
Full integration guide
import { CarCaptcha } from "/carcaptcha.js";

CarCaptcha.render("#captcha", {
  sitekey: "cc_site_xxx",
  puzzles: ["parking", "select", "circle", "rotate", "slide"],
  attempts: 3,
  onVerified: (token) => submitForm(token),
});