Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A daily photo guessing game. Every day there's one new photo, starting extremely zoomed in. Each wrong guess zooms out a step. Players get six zooms to name the object.
It's a plain static website (HTML, CSS and JavaScript, no build step), so it can be hosted for free.
| Path | What it is |
|---|---|
index.html | The game |
maker.html | Your private tool for turning photos into puzzles |
puzzles.json | The list of puzzles, one per day |
photos/ | The puzzle photos, named by date (2026-10-04.jpg) |
new-photos/ | Drop photos here to schedule them automatically |
js/config.js | Launch date and site address |
js/game.js | Game logic and animations |
js/maker.js | Puzzle maker logic |
js/core.js | Guess checking and zoom maths, shared by both pages |
css/style.css | All styling |
scripts/check-puzzles.mjs | Checks the puzzle list for mistakes and repeats |
scripts/schedule.mjs | Schedules everything in new-photos/ onto the next free days |
scripts/prepare-photos.ps1 | Shrinks photos and strips their GPS location (npm run photos) |
The three puzzles included (tennis ball, button, pencil) are drawn sample images so you can test everything. Replace them with your own photos before launch.
You need Node.js installed (the LTS version).
cd zoom-out
npm run dev
Then open http://localhost:3000. The game page needs this local server: opening index.html by double-clicking won't load the puzzle list.
The fastest way to build a backlog.
- for spaces and + between alternative answers:
tennis-ball+ball.jpg → answers "tennis ball" and "ball"sim-card.png → answer "sim card"new-photos/ folder.npm run photos. This turns each photo the right way up, shrinks it, and removes its hidden metadata, including the GPS location phones save. Photos that still have a location are refused by the next steps.near-words.json (see below).npm run schedule.Each photo gets the next free day (filling any gaps first), is moved into photos/ and renamed to its date, and gets an entry in puzzles.json. Add -- --shuffle to schedule them in random order instead of alphabetical, or -- --dry-run to see the plan without changing anything.
Empty new-photos/ before you upload the site by drag-and-drop, since the file names give away the answers. With GitHub it's ignored automatically.
It skips any photo that's already in the game, even under a different name, and warns you if an answer has been used before.
Scheduled photos start zoomed on the centre and have no close guesses. To fine-tune one, edit its focusX, focusY and near in puzzles.json. Use the puzzle maker to find good focus values: load the photo, tap the spot, and copy the numbers it shows.
Large phone photos load slowly. npm run check warns about anything over 2 MB. Running a photo through the puzzle maker shrinks it to about 0.5 MB.
A guess shows yellow when it's close but not right. There are two kinds:
near-words.json holds close words for each answer, like "biscuit" and "brownie" for cookie. The key is the puzzle's main answer, the first one in its file name.npm run schedule adds close words from that file to new photos automatically. If you edit the file later, apply the changes to puzzles already scheduled with:
node scripts/add-near.mjs
npm run check warns about any upcoming puzzle that has no close words yet.
npm run check stops you from showing the same photo twice:
It also warns, without blocking, when the same answer comes up again, for example two different tennis ball photos.
npm run dev and open http://localhost:3000/maker.htmlphotos/ folder.puzzles.json, inside the [ ] list. Put a comma between entries, but not after the last one.npm run check to make sure nothing is broken and see how many days you have scheduled.A puzzle entry looks like this:
{
"date": "2026-10-04",
"image": "photos/2026-10-04.jpg",
"answers": ["tennis ball", "ball"],
"near": ["golf ball", "lemon", "racket"],
"focusX": 0.43,
"focusY": 0.39,
"credit": "@nawar"
}
answers: the first one is shown as the solution. Small typos are accepted automatically.near: guesses that get an amber "Close" instead of red.focusX, focusY: where the zoom starts, from 0 to 1 (0.5, 0.5 is the centre).credit: optional, shown after the puzzle is solved.Photo tips: daylight near a window, sharp focus, highest resolution. Everyday objects with strange textures work best. Test each one on a friend: most people should get it around 4× or 2.4×.
date matches the player's local date, so it switches at each player's midnight.launchDate in js/config.js. Set it to your real launch day.Uses a free Supabase database. Until it's set up, the game simply doesn't show this section.
supabase/setup.sql, and click Run.js/config.js as supabaseUrl and supabaseKey, then commit and push.Both values are meant to be public. The database only lets players add one result per day and read a summary; nobody can read, change or delete individual results.
Free Supabase projects pause after a week with no activity. Once people play daily that won't happen; if it does, click Restore in the dashboard.
Cloudflare Web Analytics is free and needs no cookie banner.
zoomout.dev."token": "…". Copy just the token.js/config.js as cloudflareAnalyticsToken, then commit and push.Visits from the installed app are tagged ?source=app, so you can see how many people play from their home screen.
The site is installable (a "web app"): manifest.webmanifest, the icons in icons/, and sw.js for offline support. Players see an Install app card on the end screen. On Android and desktop Chrome it opens the install prompt; on iPhone it shows the two Safari steps. sw.js always loads fresh files when online and only uses saved copies offline, so new photos and deploys show up straight away.
og-image.jpg is the picture shown when someone shares zoomout.dev in WhatsApp, iMessage, Instagram, X or Discord. The tags are in the <head> of index.html. Some apps cache previews for days; to refresh one, use a preview debugger like https://www.opengraph.xyz.
npm run check warns you about any samples left.launchDate and siteUrl in js/config.js.Netlify, easiest: go to https://app.netlify.com/drop and drag the whole zoom-out folder onto the page. It's live in seconds. To update, drag it again.
Vercel or Netlify with GitHub, best long term:
Then buy a domain (around 10–15 CHF/EUR a year) and connect it in the Vercel or Netlify dashboard.
maker.html gets deployed too. That's harmless, because it only works in the browser and can't change the live site, but you can delete it from the deployed copy if you prefer.
puzzles.json, including future ones, to anyone who looks. Most players never will. A small backend that checks guesses on the server fixes this later.