尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A daily tennis roll game inspired by RNGdle. Roll a random season (1990–2026) and a random year-end top-100 player from it. Their real stats earn badges, and the badges add up to your score: around 50k for a typical roll, and up to ~100 million for an all-time great season.
See SPEC.md for the product and technical spec, and docs/balance-report.md for the current score distribution.
npm install
npm run dev # http://localhost:3000 (daily roll) and /sandbox (unlimited)
npm test # unit + data regression tests
npm run balance # regenerate docs/balance-report.md after badge changes
The built season data (data/seasons/) is committed, so the app runs without
the raw CSVs. To rebuild it from source:
npm run data:fetch # sparse clone of the source CSVs into data/raw/, plus the live season
npm run data:build # writes data/seasons/*.json
The 2026 season is live: a GitHub Actions workflow
(.github/workflows/refresh-data.yml) runs those two commands every day and
commits the result, and the push redeploys the app. See "Live season" in
SPEC.md for how the sources are merged.
The daily roll, guests and sign-in need a Supabase project. /sandbox works
without one.
.env.example to .env.local and fill in the project URL and keys.supabase/migrations/, oldest file first. Either paste
each file into the dashboard's SQL Editor and run it, or use the CLI (stick
to one of the two, since the CLI keeps its own record of applied migrations):
npx supabase db push --db-url "$SUPABASE_DB_URL"
npm run data:build):
npm run db:seed
http://localhost:3000/auth/callback (and the production
https://<domain>/auth/callback) to the redirect URLs.Production branch. Vercel deploys the repository's default branch, and
GitHub only runs scheduled workflows there. Make the branch with the latest
code the default (or merge it into main and make that the default).
Import the project. In Vercel, go to Add New → Project and import the repository. The framework (Next.js) is detected automatically. Add these environment variables for Production and Preview:
NEXT_PUBLIC_SUPABASE_URLNEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEYSUPABASE_SERVICE_ROLE_KEY (the sb_secret_… key)NEXT_PUBLIC_SITE_URL (optional): your custom domain, for link previewsThen deploy.
Supabase URLs. In Authentication → URL Configuration, set the Site URL
to the production URL and add https://<domain>/auth/callback to the
redirect URLs. Add https://*-<team>.vercel.app/auth/callback too if you
want sign-in on preview deployments.
Guest cleanup. Apply supabase/migrations/20261025000000_guest_cleanup.sql
if you haven't already. Integrations → Cron should then list
acedle-delete-stale-guests.
Daily refresh. On GitHub, under Settings → Secrets and variables →
Actions, add NEXT_PUBLIC_SUPABASE_URL and SUPABASE_SERVICE_ROLE_KEY so the
workflow can reseed Supabase. These are optional: rolls add missing players
by themselves. Then run "Refresh live data" once from the Actions tab.
ATP match and ranking data was collected and compiled by Jeff Sackmann
(originally github.com/JeffSackmann/tennis_atp, now preserved at
Aneeshers/tennis-sackmann-archive).
It's licensed under CC BY-NC-SA 4.0,
and so is the derived data in data/seasons/. The live 2026 season adds
results from Tennis My Life
and the current ranking list from Tennis Abstract.
Acedle is a non-commercial fan project and isn't affiliated with the ATP Tour.
The link preview images (opengraph-image.tsx files, styled in src/lib/og.tsx)
use Alfa Slab One and Courier Prime from assets/fonts/, under the SIL Open
Font License (assets/fonts/OFL-*.txt).
Player photos come from Wikimedia Commons
(npm run data:photos, also run monthly by .github/workflows/photos.yml);
each card credits its photo's author and license. Players without one get
illustrated art in their country's colors. Signed-in players can suggest a
Commons photo for any card (/photos/suggest/<player>/<year>); suggestions
wait in /admin/photos until an admin approves them. Admins are the user ids
in the admins table (insert into public.admins (user_id) values ('…')).