ESP32-S3 Bench Guide
ESP32-S3 N16R8 bench guide: live pinout, lessons, simulators and the bench log.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證True-size world map with a timeline from 1 BC to today. Drag countries and empires to see how big they really were.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Drag any country or empire across a world map and see its real size, travel through 4,000 years of borders (2000 BCE → today), click any land to see who ruled it in every era, and play a daily "which is bigger?" challenge with a public leaderboard.
Built with Next.js 16 (App Router), TypeScript and Tailwind CSS 4. No map tiles or API keys. Live at https://scale-shift.vercel.app.
Owners: Anthony and Evan. How we work (branches, pull requests, "ship it") is in CLAUDE.md; goals, decisions and setup status are in docs/PROJECT.md.
git clone https://github.com/AnthonyTFM/scale-shift.git
cd scale-shift
npm install
npm run dev, then open http://localhost:3000. Press Ctrl + C to stop.Before every change: git switch main && git pull. Windows notes (PowerShell, line endings) are in CLAUDE.md.
main deploys to https://scale-shift.vercel.app automatically on Vercel. Never push to main directly:
build: lint, typecheck, build, data check) and Vercel posts a preview link on the PR, so the other owner can click around before it's merged.Settings on Vercel (Project → Settings → Environment Variables; all are listed in .env.example):
NEXT_PUBLIC_SITE_URL: the live address (set).SUBMISSIONS_WEBHOOK_URL, or RESEND_API_KEY + NOTIFY_EMAIL_TO: also forward form messages. They're always kept in the Redis list fb:inbox when the Upstash settings are set (npm run leads prints them).NEXT_PUBLIC_GA4_ID: optional Google Analytics.All copy lives in src/content/, so no code knowledge is needed:
| File | What it controls |
|---|---|
site.ts | Brand name (rename the site here), tagline, menu, contact email, map panel copy |
events.ts | The 104 territorial events (taken vs. made official) |
disputes.ts | Present-day disputed territories |
presets.ts | The map's Comparisons tab (surprising and controversial) |
era-intros.ts | Intro paragraphs on era pages |
lineages.ts | Links one state's names over time (e.g. Muscovy → Russian Empire → USSR → Russia) |
data-corrections.json | Every name, ruler and shape fix to the source data (applied by npm run data, listed on /about) |
corrections.ts | Known limitations shown on /about |
Colours and fonts are design tokens at the top of src/app/globals.css.
Five "which is bigger?" questions a day, the same for everyone on the same date, changing at the player's local midnight.
scripts/build-daily.mjs builds a pool of 226 shapes (countries, large US states and 50 well-known empires). The list of empires is at the top of that script. The question rules are in src/lib/daily.ts.LAUNCH in src/lib/daily.ts. Change it to your launch date before going live.Players sign up with an email (kept private, one player per inbox) and a nickname after finishing the daily challenge. The server re-checks every answer, so scores can't be faked by editing the page, and only the first try each day counts.
data/leaderboard.json.KV_REST_API_URL and KV_REST_API_TOKEN for you.UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN in Vercel → Settings → Environment Variables.src/content/removed-players.json (hidden from every board on the next deploy). To delete it for good, open the Redis console and remove the player's ID from lb2:names, or edit data/leaderboard.json locally.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY + CLERK_SECRET_KEY set (Vercel → Marketplace → Clerk), players sign in with an email code or Google before their score posts, so only the owner of an email can play under it, with the same nickname on every device. Clerk only proves the email; players, nicknames and scores stay in our Redis (src/lib/account.ts). Without the keys the old email box is used.lb2:reminders; reminderRecipients() in src/lib/leaderboard.ts lists who agreed. Every email must include the one-click link /api/leaderboard/unsubscribe?p=<id>&t=<unsubscribeToken(id)>. Set UNSUBSCRIBE_SECRET in Vercel (any long random string) to sign those links. Sending isn't built yet: it needs a real domain and Resend.src/lib/name-filter.ts. It catches disguised spellings (n1gg3r, niqqer, f4g0t). The boards also hide any saved name that fails it, so adding a word there takes a bad name down on the next deploy.Processed map files ship in public/data/, so you don't need to do anything. To rebuild them (for example after adding a fix to src/content/data-corrections.json), run npm run data. It downloads the historical source files automatically.
public/data/LICENSE.txt) laid over it, and HistoGIS (CC BY 4.0) in Europe from 1815 to 1914. No historical-basemaps data. CC BY needs the credit kept: footer, /about and public/data/LICENSE.txt.docs/PROJECT.md).BEFORE_1800 in scripts/build-data.mjs), and on the 1783 map Rupert's Land, the Spanish viceroyalties of South America and the Guianas follow OpenHistoricalMap's. The GPL allows any use, commercial included. If we redistribute the data (and we do: the processed files in public/data/eras/ are downloaded by every visitor), those files must stay under GPL-3.0 with the credit kept, and their source must be available (it is: this public repo, the build scripts and public/data/LICENSE.txt).| Command | Does |
|---|---|
npm run dev | Start the dev server on port 3000 |
npm run build / npm start | Production build / serve |
npm run lint / npm run typecheck | Code checks |
npm run data | Rebuild the map data files and the daily challenge pool |
npm run data:stats | Rebuild only the era statistics from the era files (no downloads) |
npm run leads | Print feedback messages (from Redis if the Upstash settings are in .env.local, else data/submissions.json) |