尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Enter the Gungeon run companion — track your run and reveal item synergies. Next.js + passkeys.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗A web app that tracks the items and guns in your current Enter the Gungeon run and tells you, as you search, which items synergize with what you already hold. Every item has an accurate description, and synergies show whether they're active or one item away.
| Layer | Choice |
|---|---|
| Framework | Next.js 16 (App Router, React 19) |
| Styling | Tailwind CSS v4 |
| Auth | Better Auth + passkey plugin (WebAuthn) |
| Database | Postgres via Drizzle ORM (node-postgres) |
| Hosting | Vercel (+ Vercel Postgres / Neon) |
| Tooling | Bun (package manager + scripts), tsx, uv (dataset ETL) |
Prerequisites: Bun and a local Postgres. This project uses Podman.
Start a local Postgres (Podman on macOS uses the applehv provider):
CONTAINERS_MACHINE_PROVIDER=applehv podman machine init # first time only
CONTAINERS_MACHINE_PROVIDER=applehv podman machine start
podman run -d --name gungeon-pg -e POSTGRES_PASSWORD=gungeon \
-e POSTGRES_DB=gungeon -p 5433:5432 postgres:16
Configure env — copy .env.example to .env.local and fill it in:
cp .env.example .env.local
openssl rand -base64 32 # use for BETTER_AUTH_SECRET
Install, migrate, run:
bun install
bun run db:push # create tables (auth, run state, rate limiting)
bun run dev # http://localhost:3000
| Command | Purpose |
|---|---|
bun run dev | Dev server |
bun run build / bun run start | Production build / serve |
bun run lint | ESLint |
bun run db:push | Push the Drizzle schema to the database |
bun run db:studio | Drizzle Studio |
bunx tsx --test scripts/*.test.ts | Unit tests (search + synergy engine) |
All API surfaces are rate limited, with counters stored in the Postgres
rate_limit table (in-memory counters would be per-instance and useless on
serverless):
X-Retry-After). Passkey registration is strictest (3/min) since it
creates user rows without a session; sign-in allows 10/min; everything else
60/min. Configured in src/lib/auth.ts./api/run/items, /api/run/reset) are limited per user
(60/min and 10/min) via src/lib/rate-limit.ts, returning 429 +
Retry-After.Deploy note: the
rate_limittable is part of the Drizzle schema, so existing databases need abun run db:push(ordrizzle-kit pushagainst prod) to create it — without it every auth request fails.
The dataset is bundled at src/lib/data/dataset.json. It is built by
scripts/build-dataset.py (run with uv run scripts/build-dataset.py) from the raw
datamined CSV/JSON in scripts/raw/. The app reads it directly (server and client);
the database stores only auth tables and per-run item ids. Rebuilding carries the
existing item icon URLs over (they come from scripts/resolve-images.mjs, which needs
network access), unescapes wiki HTML entities, and emits groupMinimums for synergy
groups that need more than one member at once (Chief Master: any two Master Rounds).
Guns also carry a stats block (fire mode, class, DPS, damage, fire rate, reload,
magazine, ammo, shot speed, range, force, spread) from the wiki's Guns table; values
are kept as display strings since many guns list per-form variants or ranges, and
src/lib/gun-stats.ts parses the leading figure to rank each gun against the rest of
the Ammonomicon on its item page.
Search (src/lib/search.ts) normalises text (folds accents, strips punctuation so
A.W.P. → awp) and scores every item across:
sr → Sniper Rifle),yes scope surfaces the items that complete it),with subsequence + banded-Levenshtein fallbacks for typos (snipr → Sniper Rifle).
Results are relevance-ranked. Single-character tokens are ignored in multi-word coverage so
a.w.p returns only A.W.P.
Push this repo to GitHub and Import it in Vercel.
Provision a database — Vercel Postgres or Neon — and copy its pooled connection string.
Set the project Environment Variables (Production):
| Name | Value |
|---|---|
DATABASE_URL | Postgres connection string (SSL auto-enabled for non-local hosts) |
BETTER_AUTH_SECRET | openssl rand -base64 32 |
BETTER_AUTH_URL | Deployed origin, e.g. https://your-app.vercel.app |
NEXT_PUBLIC_APP_URL | Same origin as above |
The passkey Relying Party ID is derived from
BETTER_AUTH_URL's hostname, so it must match the domain you actually visit.
Initialise the production database once (with DATABASE_URL pointing at the prod DB):
DATABASE_URL="<prod-url>" bunx drizzle-kit push --force
Deploy. Vercel auto-detects Next.js — no vercel.json needed.
bunx tsx --test scripts/*.test.ts
scripts/search.test.ts — punctuation, acronyms, typos, multi-word, quote/description/
synergy matching, and ranking.scripts/engine.test.ts — synergy evaluation (active / one-away / potential, OR-groups,
two-of, groups that need several members at once, activates-on-add).scripts/gun-stats.test.ts — gun stat parsing, unlimited-ammo flags, and per-stat
ranking on item pages.Fan-made companion. Item & synergy data from the Enter the Gungeon community wiki. Not affiliated with Dodge Roll or Devolver Digital.