BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
DM이 세션을 준비·운영하는 데 필요한 모든 요소—만남, 주사위, HP 추적, 파티 채팅—모두 플레이어 휴대폰과 동기화됩니다
Everything a DM needs to prep and run a session, ready for the table — encounters, dice, HP tracking, and party chat, synced to every player's phone.
게임TypeScript · CSSGitHub @EviePuffRoo온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A campaign engine for tabletop RPGs — generate content, build battle maps, and run live sessions with your table. Free to try at sparkdm.quest
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A campaign engine for tabletop RPGs — generate the content, build the maps, and run the
session live, in one place. Starting with D&D 5e.
Try it at sparkdm.quest — free for up to 3 worlds, no card required.
Spark covers the whole arc of a campaign rather than one slice of it:README 전문 보기 ↗A campaign engine for tabletop RPGs — generate the content, build the maps, and run the session live, in one place. Starting with D&D 5e.
Try it at sparkdm.quest — free for up to 3 worlds, no card required.
Spark covers the whole arc of a campaign rather than one slice of it:
Generation is meant to spark ideas, not cage them: once something's saved, every field is yours to rewrite from the Roster, and most entry types can also be written from a blank page with Create Your Own instead of generated. The Create tab covers NPCs & Monsters, Items, Locations, Quests, Factions, Encounter Tables, Dungeons, Regions, Settlements, Shops, and Adventures (multi-part quest chains) — each with its own "surprise me completely" fully-random mode, sampled from a curated SRD-based dataset so results vary run to run.
The Compendium tab is quick-reference material for the table: a Bestiary (SRD monster stat blocks by CR), a spell list, conditions, and core rules — searchable, no need to generate or save anything to look something up.
Everything generated can be saved to your Roster, tagged, annotated, linked to other entries (an NPC works for a Faction, is found at a Location, gives a Quest, carries an Item — bidirectional, cleaned up automatically when either side is deleted), and organized into Worlds (campaign containers). A world's owner can generate an invite code and hand it to players; anyone who joins gets read access to public content plus write access to the collaborative tools below (and none at all for DM-only planning content marked hidden).
The Combat tab is the at-the-table toolkit, and its panes work together in real time once a world is selected:
2d6+3), a personal
roll history, and in Party mode a shared party roll log with reactions everyone in the
world can see and post to. Any roll can be applied straight to combat.Every player gets a My Character page for a full character sheet (equipment, spellcasting resources, HP/rest state) that levels up with XP, and can be built through a guided Character Creation wizard or imported by pasting an existing sheet's text. A shared Party Ledger tracks gold and items with claimable loot drops from combat, and small activity badges across the World/Play tabs flag new rolls, notes, or live updates without needing a tab open.
The app is also an installable PWA with an offline app shell.
Billing runs on Stripe (server/src/routes/billing.ts), flipping each account's tier between
"free" and "paid" via webhook. Free tier is fully functional — paid removes a handful of
caps and unlocks table-wide DM tooling for whichever world a paying DM owns (one DM's
subscription covers the whole table). Current gates, defined in shared/src/billingLimits.ts
plus a few inline checks:
The Billing page's comparison table is the source of truth for exact current numbers.
There's no in-app way to grant admin access — it's controlled by a single environment
variable, ADMIN_USERNAMES (comma-separated usernames), the same way Stripe/R2 keys are
configured. server/src/routes/auth.ts checks that list on every signup/login/session check
and promotes or demotes the account's role to match automatically — add or remove a name and
it takes effect on that account's next request, no manual database edit either direction.
Admin role unlocks:
User at all, so this is the account-recovery path).Admin role is independent of subscription tier — promoting someone to admin does not give them paid-tier features, and vice versa.
tsx, no build step), structured logging via pinoshared workspace package with the SRD dataset, TypeScript types, Zod
validation schemas, and the generation/simulation engines, consumed directly by both client
and server (no separate build step)This is an npm-workspaces monorepo: shared/, server/, client/.
npm install
# one-time: create the SQLite database
cp server/.env.example server/.env
npm run --workspace server prisma:migrate
# run both in separate terminals
npm run dev:server # http://localhost:4000
npm run dev:client # http://localhost:5173 (proxies /api to the server)
Open http://localhost:5173.
Everything above works with zero configuration. A handful of things are optional and stay
fully functional without them — see server/.env.example and client/.env.example for the
full list, but briefly: Stripe keys (billing/checkout — routes just return 503 without
them), R2 credentials (automated database backups — no-ops without them), REDIS_URL
(only needed once you run more than one server instance), and Sentry DSNs (error
reporting — errors just stay in local logs without them).
npm test --workspace shared # unit tests
npm test --workspace server # integration tests (spins up a scratch SQLite test DB)
npm test --workspace client # component tests
npm run test:e2e --workspace client # Playwright, against a real running dev server
GitHub Actions runs the three npm test suites on every push/PR.
npm run build # builds the client to client/dist
npm run start:server # runs the API with tsx
In production the Express server serves the built client/dist itself (with an SPA
fallback for client-side routes) alongside /api/*, so a single running process is
enough — no separate static host or reverse proxy required.
render.yaml at the repo root is a Render Blueprint
that provisions this as one paid Starter web service with a 1GB persistent disk
(mounted at /var/data) holding the SQLite database, so everything you save survives
restarts and redeploys.
render.yaml and propose the spark service + disk.prisma migrate deploy before starting the
server, so the database schema is created automatically on the disk.sync: false env vars in Render's dashboard for whichever integrations
you want live: Stripe keys for billing, R2 credentials for backups, REDIS_URL if scaling
past one instance, SENTRY_DSN/VITE_SENTRY_DSN for error monitoring, and
ADMIN_USERNAMES for admin/moderation access — none of these are declared with a value in
render.yaml itself (secrets aren't committed), and the app runs fine with any or all of
them left unset. Note VITE_SENTRY_DSN is read at build time (Vite inlines it into the
client bundle), not runtime, so it needs to be set before a deploy, not just present at
startup.Want a free-tier deploy instead? Change plan: starter to plan: free and delete the
disk block in render.yaml — but note the SQLite file will then reset on every
redeploy and periodically on restart, so treat Roster/Worlds as non-persistent in that
configuration.
shared/ SRD dataset, types, Zod schemas, and the generation/simulation engines
(characters, items, locations, quests, factions, encounter tables, dungeons,
regions, settlements, vision/fog raycasting, grid movement, battle resolution,
encounter balance, house rules)
server/ Express API + Prisma/SQLite persistence: entity CRUD, cross-entity search &
links, world sharing, session notes, player characters & leveling, party
ledger/loot, live encounters & Battle Grid (incl. fog redaction), real-time
SSE + pub/sub, chat, Tavern/Home Base, Guild Board, the DM automation layer
(Trigger Rules, Doom Clock, Faction Relations, World Tick), Gallery publishing,
moderation/admin tooling, Stripe billing, R2 backups, structured logging
client/ React SPA, organized into four nav areas — Prep (Create, Compendium), World
(Overview, Worlds, Roster, Codex, Notes, Downtime, Tavern), Play (Combat incl.
Battle Grid, Map Builder, Shop), Account (Gallery, Profile, My Character,
Billing, Moderation, Users) — plus a mobile player-companion view and a
read-only Cast to Table presentation view
render.yaml Render Blueprint for a one-click paid deploy with a persistent disk
Stat blocks are derived from the D&D 5e System Reference Document (SRD), which is available for reuse. All other flavor text (names, personality/backstory tables, monster epithets, item/location/quest/faction/encounter flavor content) is original content written for this project.