BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
AI 위조를 눈으로 훈련하고, 내 사진에 미세 편집을 찾아 포렌식으로 변화를 보여준다
Train your eye for AI fakes. On your own photos. An AI agent forges one subtle edit, you hunt for it, and a forensic reveal shows exactly which pixels changed.
게임TypeScript · CSSGitHub @suhaan89온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Train your eye for AI fakes. On your own photos.
Built during Banana Hacks 2026 (Oct 10 to 11, 2026) by Suhan Nawaz. Theme: "image everything".
| Live URL | https://fake-dojo.vercel.app |
| Demo video | to be filled in by Suhan after the upload |
| Screenshot | to be added by Suhan as docs/screenshot.png once the deck is seeded |
When AI can image everything, seeing is no longer believing. Fake Dojo turns image AI against itself to train the human eye.
Anyone can edit any photo in seconds now. Media literacy is still taught with a handful of static examples that people memorize. Companies train their staff with simulated phishing mails, but nobody trains people with simulated image fakes, and certainly not with personal, adaptive ones.
An AI agent forges one subtle, realistic edit into a real photo: your own, or one from the built-in deck. You hunt for it. Then a forensic reveal shows exactly which pixels changed, how a careful eye could have caught it, and what forensic tools would have shown. The dojo tracks which kinds of manipulation fool you and makes the next forgery target them.
First real users: Suhan leads the AI club at his high school in Germany (students from grade 8, weekly sessions on using AI wisely and responsibly). Classroom mode is built for exactly that.
flowchart LR
A[Browser: prepare photo<br/>crop, resize, strip EXIF] --> B[Vision model:<br/>read scene, plan 3 candidates]
B --> C{Server: validate<br/>size, people, polygon}
C -- none valid --> B
C -- ok --> D[Image model:<br/>edit the photo]
D --> E[Server: register,<br/>tone match, feathered composite]
E --> F[Server: diff vs original<br/>= exact answer mask + heatmap]
F -- no change or misaligned --> D
F --> G[Vision model: verify<br/>applied, artifacts, people untouched]
G -- rejected --> D
G -- accepted --> H[Hunt, then forensic reveal]
The client runs the forge as three calls (/api/forge/plan, /render, /verify), so each request stays far below serverless limits and the UI shows real progress with measured durations.
src/lib/cv): resize to the original size, find the integer shift (up to 8 px, coarse then fine) that best registers the model output to the original in a 24 px ring around the region, match tone per channel from that ring, then blend only the planned region through a dilated, Gaussian-feathered mask.localStorage under fakedojo.profile.v1. The app keeps working when storage is blocked.All three are implemented from scratch on raw pixel arrays (src/lib/forensics) and run in a Web Worker, with a main-thread fallback. No image-processing library is used in the browser.
Forensics give clues, not proof. The app says so wherever a lens is shown.
A forgery trainer is net positive for the same reason phishing simulations are: people learn to resist a trick by meeting it in a safe place, and here the answer is always shown right after. The guardrails are enforced in code, not only in prompts:
people_altered flag discards a result.@google/genai (Gemini Interactions API) for the optional Gemini provider, zod 4, sharptsx for scripts| Role | Model | Notes |
|---|---|---|
| Reading, planning, verifying | Seed 2.0 Lite (seed-2-0-lite-260428) | JSON answers, checked by the same schemas and server-side validation |
| Image editing | Seedream 4.0 (seedream-4-0-250828) | requested at 1.5 times the working size, same aspect ratio as the input |
Both run through BytePlus ModelArk. All ids are configurable through environment variables and are read in exactly one place, src/lib/server/env.ts.
ARK_API_KEY=...
VISION_PROVIDER=ark
ARK_VISION_MODEL=seed-2-0-lite-260428
IMAGE_PROVIDER=seedream
SEEDREAM_MODEL=seedream-4-0-250828
With both switches set, the app runs on the Ark key alone.
Seedream needs a larger canvas than our 1024 px working size, so the edit is requested at 1.5 times the size and scaled back before registration and compositing.
Each step can run on Gemini instead. Without VISION_PROVIDER=ark the vision calls go to gemini-3.8-flash, and without IMAGE_PROVIDER=seedream the edit goes to gemini-nano-banana-2.1 (Nano Banana 2.1). Both need GEMINI_API_KEY. The Gemini models get the same prompts and schemas, and the guardrails are unchanged. Images made by the Gemini image model carry an invisible SynthID watermark.
One forge is one Seedream 4.0 image output (0.03 USD per image once the free quota is used up) plus two cheap vision calls on Seed 2.0 Lite (0.25 USD per million input tokens, 2 USD per million output tokens). A retry adds one more image output, with a hard limit of three per forge. Daily Dojo, Classroom and the landing page cost nothing: they run from the committed deck.
npm install && npm run dev
Without an API key the app runs in mock mode: a deterministic offline provider replaces the models, so the whole pipeline (compositing, measuring, scoring, reveal, lenses) can be tried for free. The UI shows a "Mock mode" label.
For live forging, copy .env.example to .env.local and set ARK_API_KEY, VISION_PROVIDER=ark and IMAGE_PROVIDER=seedream. No Gemini key is needed then. For the optional Gemini provider set GEMINI_API_KEY instead; the Gemini image model needs a key with billing enabled.
| Command | What it does |
|---|---|
npm run dev / build / start | Next.js |
npm run typecheck, npm test, npm run lint | quality gates |
npm run smoke -- <photo> [--difficulty 1..5] | plan, render and verify from Node; writes tmp/smoke/; prints timings and estimated cost |
npm run seed [-- --limit N] [-- --dry-run] | builds the deck from seed/photos/* |
seed/photos/ (scenes without recognizable faces, readable license plates or anything private).npm run seed -- --dry-run shows the plan and the estimated cost.npm run seed writes public/deck/<id>/original.jpg, forged.jpg, mask.png, heat.png and public/deck/deck.json. It is resumable and runs two photos at a time.public/deck.The seed run also writes dataset/manifest.jsonl (image, original, mask, type, difficulty): a pixel-exact labeled forgery-localization dataset as a research by-product. The manifest points at the deck files, so no second copy of the images is kept.
For a reproducible demo, /?demo=1 and /dojo?seed=demo use a fixed card order. Add an optional "demoOrder": ["card-id", ...] array to deck.json to curate it.
ARK_API_KEY, VISION_PROVIDER=ark, ARK_VISION_MODEL=seed-2-0-lite-260428 and IMAGE_PROVIDER=seedream, plus any other variables from .env.example you want to change./api/health: it should report "liveForge": true and "mock": false.LIVE_FORGE_ENABLED=false and redeploy. The deck modes keep working.Route handlers run on the Node.js runtime with maxDuration = 60.
src/app/ pages: / forge dojo classroom profile how-it-works
src/app/api/ health, forge/plan, forge/render, forge/verify
src/components/ ImageStage, BeforeAfterSlider, AgentTimeline, LensSwitcher, Hunt, Reveal, ...
src/lib/ai/ provider interface, ModelArk vision, Seedream, Gemini and mock providers, prompts, schemas, retry, output
src/lib/cv/ polygon, mask, blur, align, tone, composite, diff (pure TypeScript)
src/lib/forensics/ ELA, noise residual, Sobel, color ramp, worker client
src/lib/forge/ the agent loop (plan, render, verify, retries) and shared API types
src/lib/game/ scoring, belts, Beta skill model, difficulty, deck, seeded RNG, tells
src/lib/image/ crop math, browser and Node image preparation
src/lib/server/ env, rate limit, signed tickets, validation, codec, pipeline, errors
src/workers/ forensics worker
scripts/ smoke.ts, seed-deck.ts
docs/ BUILD_BRIEF.md, DECISIONS.md, QA.md
@google/genai (Apache-2.0)gemini-3.8-flash and gemini-nano-banana-2.1 (optional provider)photo-… are by Suhan Nawaz. Cards named web-… use photos from Wikimedia Commons that their authors released into the public domain (CC0):| Deck id | Photo | Author | License |
|---|---|---|---|
web-01 | Fixed bollard bicycle stand.jpg | Jeroen Hoek | CC0 |
web-02 | Bike Rack at Bandar Tropicana Aman.jpg | Wiki Farazi | CC0 |
web-03 | Improved stands bicycle parking.jpg | boototter.eu | CC0 |
web-04 | Three Style Of Bicycle Parking - Park Anička, Košica, SK.jpg | Wkmdjay | CC0 |
web-05 | Playground at William Henry Harrison Park.jpg | SnugPancake | CC0 |
web-06 | Playground Spring Jeep Soltau.jpg | RogerWiki | CC0 |
web-07 | Harrison Playground 2.jpg | Kurt Kaiser | CC0 |
web-08 | Bus stop sign with sky in the backround.jpg | C.M.B. | CC0 |
web-09 | CARTA bus stop - October 2025 - Sarah Stierch.jpg |
Claude Code wrote most of the code under Suhan's direction. At runtime Seed 2.0 Lite reads, plans and verifies and Seedream 4.0 performs the edits, both through BytePlus ModelArk. Gemini is an optional provider. All code was written and committed during the hacking window.
| Missvain |
| CC0 |
web-10 | Yangdong Village 05.jpg | Bernard Gagnon | CC0 |
web-11 | Valenica Mar Harbour Spain - Image with boats in line up.jpg | Yannick Sl | CC0 |
web-12 | Some Boats in harbour.jpg | Maneesh4242 | CC0 |