Client-side verification logic
// All logic runs in the browser — no API key or server call needed.
// 1. Pick a random target category (vehicles | animals | food).
// 2. Build 9 tiles: 3–5 from the target, rest from other categories.
// 3. User selects tiles; on submit check every target is selected
// and no distractor was included.
tiles.forEach((tile, i) => {
const isTarget = tile.category === target;
const isSelected = selected.has(i);
if (isTarget && isSelected) result[i] = "correct";
if (isTarget && !isSelected) result[i] = "missed"; // fail
if (!isTarget && isSelected) result[i] = "wrong"; // fail
});How it works
A 3x3 grid of emoji tiles is generated with a random target category. 3–5 tiles match the target; the rest are distractors from the other two categories. The user must select every matching tile. Verification happens entirely in the browser.
Resembles reCAPTCHA v2 image grids
This replicates the UX pattern of image-selection CAPTCHAs (vehicles, traffic lights, crosswalks) without loading any external scripts or sending tokens to a third-party server.