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
翻譯準備中
A free daily puzzle site: more than 80 word, number and logic puzzles, crosswords, sudoku and chess, new every day. Plus 2207+ timed quizzes across films, music, geography, sports, and brands, from na
翻譯準備中
遊戲JavaScript · HTMLGitHub @consensusgurus上線中營運者未確認
試用過了嗎? 點一下就好,不需要登入。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證A free daily puzzle site: more than 80 word, number and logic puzzles, crosswords, sudoku and chess, new every day. Plus 2207+ timed quizzes across films, music, geography, sports, and brands, from name-them-all and matching to map and multiple-choice. Then browse consensus Top 10 Lists where 683 experts and aggregators agree.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Top ten lists from every angle. Consensus, named publications, and reader votes.
Next.js 14 + Supabase. Runs on Vercel's hobby tier and Supabase's free tier.
/adminnode --version. Install from nodejs.org if needed.cd source-of-truths
npm install
source-of-truths, set a strong database password (save it), pick a region, click Create new project. Wait about 2 minutes.supabase/schema.sql from this project, copy all of it, paste into the SQL editor, click Run. You should see "Success. No rows returned."Supabase reorganized their dashboard in 2025. The keys live in a different place than older tutorials describe. Here is the current path:
Step A: Get your Project URL
Click the Connect button at the top of your project page. A dialog opens showing your project URL (looks like https://abcxyz.supabase.co). Copy it.
You can also find it under Project Settings → Data API → "Project URL".
Step B: Get your two keys
In the left sidebar click Project Settings (the gear icon), then API Keys.
You will see two tabs. What you copy depends on which tab has keys for you:
sb_publishable_...). Then copy the Secret key (starts with sb_secret_...). You may need to click "Reveal" to see the Secret key.eyJ...). The service_role needs to be revealed.Either set of keys works with this project. Newer Supabase accounts get the publishable/secret system; older ones still have the legacy keys. They behave identically for our purposes.
In .env.local:
anon key) into NEXT_PUBLIC_SUPABASE_ANON_KEY.service_role key) into SUPABASE_SERVICE_ROLE_KEY.The env var names in our code don't change — only the values you paste in.
Copy the example file:
cp .env.local.example .env.local
Open .env.local and fill in:
NEXT_PUBLIC_SUPABASE_URL=https://abcxyz.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
SUPABASE_SERVICE_ROLE_KEY=eyJ...
ADMIN_PASSWORD=some-long-random-string
Generate a strong admin password with:
openssl rand -base64 32
npm run dev
Visit http://localhost:3000. Vote on something, refresh, see that it persists.
Visit http://localhost:3000/admin to see the editor's desk. Sign in with the ADMIN_PASSWORD you set.
/submit and create a test list./admin, sign in, and you'll see your submission in the Pending tab.That's the moderation loop. Use the Unpublish button to pull a list back, or Delete to remove it entirely.
source-of-truths. Don't initialize with a README.git init
git add .
git commit -m "initial commit"
git branch -M main
git remote add origin https://github.com/YOUR-USERNAME/source-of-truths.git
git push -u origin main
source-of-truths repo.NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSUPABASE_SERVICE_ROLE_KEYADMIN_PASSWORDcgurus-20 in lib/data.js with your real tracking ID if it differs (or leave it if Amazon kept the same ID).The affiliate disclosure footer and /disclosure page already contain the required Amazon language.
The privacy, terms, and disclosure pages have placeholders you should edit before going live:
app/privacy/page.js — replace [email protected] with your real contact emailapp/terms/page.js — replace [your state or country] with your jurisdiction, and update the contact emailapp/disclosure/page.js — update the contact emailThen commit and push. Vercel rebuilds automatically.
/admin/login with your ADMIN_PASSWORDThe admin URL is noindex,nofollow so it won't appear in search engines, but pick a strong password regardless.
source-of-truths/
├── app/
│ ├── layout.js # Root layout with fonts and meta
│ ├── globals.css # Base CSS
│ ├── Grain.jsx # Shared SVG grain texture
│ ├── Footer.jsx # Shared footer with affiliate disclosure + legal links
│ ├── LegalLayout.jsx # Shared layout for legal pages
│ ├── page.js # Home (server)
│ ├── HomeClient.jsx # Home interactivity
│ ├── list/[id]/
│ │ ├── page.js # Detail page server with metadata
│ │ └── DetailClient.jsx # Detail interactivity
│ ├── submit/
│ │ ├── page.js
│ │ ├── SubmitClient.jsx
│ │ └── thanks/page.js # "Submitted, awaiting review"
│ ├── admin/
│ │ ├── page.js # Admin dashboard (server, checks cookie)
│ │ ├── AdminClient.jsx
│ │ └── login/
│ │ ├── page.js
│ │ └── LoginClient.jsx
│ ├── privacy/page.js
│ ├── terms/page.js
│ ├── disclosure/page.js
│ └── api/
│ ├── bootstrap/route.js # Returns published data
│ ├── votes/route.js
│ ├── views/route.js
│ ├── extras/route.js
│ ├── lists/route.js # Inserts as published=false
│ └── admin/
│ ├── login/route.js
│ ├── logout/route.js
│ ├── approve/route.js
│ ├── unpublish/route.js
│ └── reject/route.js
├── lib/
│ ├── data.js # LISTS, TYPES, COLORS, affiliate config
│ ├── helpers.js # buildItemLink, getSources, voteKey
│ ├── supabase.js # Anon client (used everywhere)
│ ├── supabase-server.js # Service-role client (admin only)
│ ├── admin-auth.js # Cookie validation
│ └── api.js # Browser-side fetch wrappers
├── supabase/
│ ├── schema.sql # Fresh install schema (includes moderation)
│ └── migrations/
│ └── 01_add_moderation.sql # Run only if you deployed earlier without moderation
├── package.json
├── next.config.js
├── jsconfig.json
└── .env.local.example
In lib/data.js, copy an existing entry in the LISTS array and edit:
id — short slug, no spaces ('headphones-overear')publishedDate / publishedAt — use the actual current timestamp (e.g. date -u +"%Y-%m-%dT%H:%M:%SZ"), not a rounded or guessed time. The home page sorts newest-first by publishedAt, so a timestamp earlier than an existing list will make a brand-new list appear behind it.titlecategory — short tagtype — one of: food, stores, travel, entertainment, tech, product, otherlinkType — one of: amazon, imdb, mapsCity, maps, booking, tripadvisor, steam, goodreads, wiki, searchblurb — one-line descriptionsources — at least an ai source with itemsvote.items — starting order of the vote tabFor mode: 'scores' chain lists (e.g. Cava, McDonald's, Sweetgreen), the ai source is the composite ranking and the platform sources (google, yelp) appear as chips. Rule: when only ONE platform backs the composite (Google or Yelp, not both), the composite and that platform are identical data, so the UI shows a single chip instead of two redundant ones. Provide both google and yelp only when you actually have two distinct rankings to blend.
links (optional) — map of 'Item Name': 'https://url' for per-item overridesCommit and push. Vercel rebuilds automatically.
Admin login redirects in a loop: Your ADMIN_PASSWORD env var isn't set in Vercel. Add it under Settings → Environment Variables and redeploy.
Pending submissions don't appear in admin: Confirm SUPABASE_SERVICE_ROLE_KEY is set in Vercel (no NEXT_PUBLIC_ prefix). The dashboard uses this key to read all rows including unpublished ones.
Approved lists don't appear on home: Check the bootstrap response in DevTools Network tab. If userLists is empty, the published flag isn't being filtered correctly. Confirm the schema was applied (published column exists on user_lists).
Votes don't save: Open DevTools → Network, vote on something, look for POST /api/votes. 500 = Supabase project is down or the RPC isn't installed. 400 = validation error in the response body.
"Module not found" locally: Run npm install again.