Inspiration

By 2027, 90% of images online will be synthetic or manipulated. Every day we scroll past photos we can't fully trust, and the tools meant to catch AI-generated images lag a generation behind the models that create them. Academic detectors are black boxes, fact-checking is manual, and the one resource we do have (millions of humans looking at images every day) has no incentive loop that actually builds something better.

That's the gap Nah, that's AI fills. What if the best AI-detecting tool wasn't another model, but the crowd itself? And what if playing a game was how we trained a public, open ground-truth dataset?

The Problem

The market for detecting AI-generated images is broken. Existing detectors are expensive, unreliable, and opaque, leaving consumers with no trustworthy way to know if an image is real.

This presents a chance to offer a straightforward, efficient, and genuinely valuable solution.

Black-Box Detectors Academic detectors are black boxes and lag a generation behind the models that create them. A score with no explanation, and always one step behind the latest image generator.

Slow Fact-Checking Fact-checking is slow, manual, and expensive. A single suspicious image can take hours to verify, by which point it has already spread.

Wasted Human Judgement Millions of humans already look at images every day, but there's no incentive loop that turns that into useful data. The best detector we have is sitting idle.

The Solution

What if the best AI detector wasn't another model, but the crowd?

Nah, that's AI is three things in one:

  1. The Arena - A fast streak game: look, zoom, vote "AI" or "real"
  2. The Reward Layer - Streaks unlock AI power-ups and real prizes via Sponspors (For e'g CodeCrafters VIP memberships)
  3. The Public Signal - Every image gets a permanent provenance page, exposed via a signed API and 12 RSS feeds

The output of the game is a public ground-truth dataset that can be used by any company requiring AI content detection.

Top Key Features

The Game & Quick Play Modes (Fast-Paced Detection Game)

  • Random image loading with hover-to-zoom magnifier for inspecting AI tells (hands, text, edges, textures)
  • One-click "AI" or "real" voting with instant reveal
  • Streak tracking that rewards consecutive correct guesses
  • Difficulty scaling that adapts as you get better

AI Power-Ups (Earned Via Streaks)

  • 💡 Hints - subtle nudges that point toward the answer without spoiling it
  • 🔍 AI Scans - gpt-4o-mini vision highlights artifact regions on the image
  • 🤖 AI Verdicts - the model states its own confidence so players can compare their gut vs. the machine

Leaderboards & Real Prizes

  • Live leaderboard ranked by accuracy, volume, and streaks
  • Weekly prize draws with CodeCrafters VIP memberships (2 years for 1st, 1 year for 2nd, 6 months for 3rd)
  • Minimum-participation thresholds keep rankings fair

Public API & RSS

  • Signed, rate-limited REST API with scoped per-user keys (nts_live_)
  • 12 RSS feeds with <link> autodiscovery: Latest, Trending, Featured, Tags, and every leaderboard
  • Permanent provenance pages for every image with crowd truth, votes, and metadata

One-Click Demo Mode

  • Drop straight into a demo admin or demo user account without signing up
  • Judges and visitors can try every role instantly

How It Works

For Users (Players)

  1. Jump in - Sign up for free or use one-click demo mode to try the Arena instantly.
  2. Inspect - Load a random image, hover to zoom the magnifier, and look for the classic AI tells: mangled hands, repeated textures, uncanny text, weird edges.
  3. Vote - Click "AI" or "real" and reveal the answer. Correct guesses build your streak.
  4. Earn - Streaks unlock power-ups: Hints, AI Scans, and AI Verdicts. Use them to learn the tells faster.
  5. Compete - Climb the leaderboard by accuracy, volume, and best streak. Top players win CodeCrafters VIP memberships.

For Developers (API Consumers)

  1. Get a key - Create an account and generate a scoped API key (nts_live_).
  2. Query the crowd - Use the REST API to fetch crowd opinions and provenance for any media item: percentage of votes for AI vs real, vote counts, and metadata.
  3. Subscribe - Use the 12 RSS feeds (Latest, Trending, Featured, Tags, and every leaderboard) with <link> autodiscovery to stream updates.
  4. Pay for volume - For high-volume crawler traffic, the x402 Payment Required gate accepts USDC micro-payments per request. Standard API access is billed via Lemon Squeezy.
  5. Build on it - Every image has a permanent provenance page you can link to, embed, or query programmatically.

For Admins

  1. Moderate - Review user submissions in the queue (SSRF-checked), approve or reject, and label each as AI or real.
  2. Manage users - Assign roles (user, moderator, admin), suspend accounts, and grant rewards (hints, AI scans, AI verdicts) to any user.
  3. Seed the pool - Run seed jobs from the dashboard: import Unsplash photos, generate AI variants in batches, and re-seed demo leaderboard data.
  4. Control AI spending - Toggle auto_generate_ai to pause or resume the media daemon's automatic OpenRouter/OpenAI calls. Manual generation still works anytime.
  5. Run the business - Manage prizes, draw weekly winners, create promo codes, send newsletters, and push notifications.

How image generation AI is used

We use image generation AI not as the detector, but as the training data that makes the game work.

  • Generating the AI class of the pool. A game where you distinguish AI from real only works if there's a steady supply of genuinely AI-generated images. We use gpt-image-1 (via OpenAI or OpenRouter) to generate photorealistic AI variants across categories like portraits, landscapes, architecture, and food. Each variant gets a neutral title and opaque storage path so the answer is never leaked by the URL.

  • Keeping the pool balanced. A continuously-running worker daemon monitors the AI-vs-real ratio of approved media. Whenever the AI class falls below roughly 50%, the daemon generates fresh AI variants to top it up. Admins can also trigger batch generation manually, and there's a toggle (auto_generate_ai) to pause automatic generation entirely.

  • Power-ups that use vision AI, not image gen. The in-game hints and scans use gpt-4o-mini vision to analyze an image and point out suspicious regions (mangled hands, repeated textures, uncanny text) without revealing the answer. This helps players learn the tells while still relying on their own judgement.

  • A thin provider layer. ai-provider.ts lets us switch between OpenAI and OpenRouter with two env vars, so we're never locked into one provider for either image generation or vision analysis.

How we built it

  • Next.js 15 App Router (RSC + "use client" only when needed), deployed on Railway via a custom Bun Docker image.
  • Custom auth from scratch: Argon2id password hashing, signed 30-day HTTP-only sessions, HMAC-SHA256 at rest for all tokens and API key records.
  • Dual-dialect DB: Drizzle for schema and types, 100% raw SQL for queries via .execute(). SQLite locally, Postgres on Railway. Frozen append-only migrations.
  • AI pipeline: Unsplash Access Key pulls real photos; gpt-image-1 generates photorealistic AI variants to keep the arena near a 50/50 split; Sharp resizes; R2 stores. A worker daemon tops up the AI class whenever it falls below target ratio.
  • AI power-ups use gpt-4o-mini vision to scan images and return clues. A thin provider layer (ai-provider.ts) lets us switch between OpenAI and OpenRouter with two env vars.
  • Streaks, difficulty, and leaderboard ranking all go through idempotent recalc functions that are cron-safe and resumable.
  • Zero external UI dependencies: pure vanilla CSS, Zinc-950 / solid-violet / emerald palette, hand-rolled responsive drawer, canvas-based GridPulse hero animation with procedural rAF loops. No Tailwind, no Radix, no component library.
  • Payments via Lemon Squeezy hosted checkout (cards, Apple Pay) for sponsorships and memberships, plus an x402 Payment Required gate (USDC) for crawler and automated API traffic.
  • 192/192 passing tests across 38 test files.

Accomplishments we're proud of

  • A working flywheel: players classify images, the crowd creates labels, API/RSS expose the dataset, API consumers pay into the prize pool, and top players win. The game is the dataset.
  • 12 RSS feeds with <link> autodiscovery out of the box. Anyone can subscribe to Latest, Trending, Featured, Tags, and every leaderboard.
  • A signed, rate-limited public API with scoped per-user keys (nts_live_) that expose crowd opinions and provenance for any image.
  • One-click demo mode to drop straight into a demo admin or demo user account without signing up, so judges and visitors can try every role instantly.

What we learned

  • The crowd is genuinely good at this. With enough votes, human consensus converges faster than we expected on obvious AI tells like mangled hands, repeated textures, and uncanny text. And the disagreement zone on borderline images is itself useful signal.
  • Raw SQL beats ORMs for a game like this. Leaderboard queries, streak recalculation, and re-scoring are far more transparent and debuggable when you write the SQL yourself. Drizzle gave us types; .execute() gave us control.
  • Idempotency is a feature. Every stat recalc, every seed job, and every payout is safe to run twice. That saved us repeatedly when deploys or API rate limits interrupted long-running jobs.
  • Image gen AI is a tool, not the answer. We initially thought the product needed a smarter detector. Instead, the real value is in using image gen AI to build a balanced dataset and then letting humans do the detecting. The machine generates; the crowd judges.

Built for Banana Hacks 2026 · Team: Homesh Peter Paul & Sun Xiaochi

Built With

  • argon2id
  • bun
  • canvas-api
  • cloudflare-r2
  • docker
  • drizzle-orm
  • gpt-4o-mini
  • gpt-image-1
  • hmac
  • lemon-squeezy
  • next.js
  • openai
  • openrouter
  • postgresql
  • railway
  • react
  • rest
  • rss
  • sharp
  • sqlite
  • turborepo
  • typescript
  • unsplash-api
  • vanilla-css
  • web-push
Share this project:

Updates

Submission history