BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Track the guns and items of your current Enter the Gungeon run and discover synergies the moment you find them.
GamesTypeScript · PythonGitHub @falucianoOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Enter the Gungeon run companion — track your run and reveal item synergies. Next.js + passkeys.
Taken from the repository README
Loading the full README.
Read the full 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.