尚未检测到更新。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.