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,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 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.