A multiplayer browser RPG inspired by classic text-based fighting games. Built with Svelte 5 + Node.js + SQLite.
Live: fc.fgsk.space
| Layer | Technology |
|---|---|
| Client | Svelte 5 + Vite + Tailwind CSS (TypeScript) |
| Server | Node.js + ws (WebSocket) (TypeScript) |
| Database | SQLite via better-sqlite3 (WAL mode) |
| Deployment | Docker (multi-stage build) + Caddy |
| Auth | bcryptjs |
server/
server.ts — Main WebSocket server
db.ts — SQLite layer (schema, CRUD, migrations)
logger.ts — Game activity logger (ring buffer + daily files)
data/
types.ts — Shared types (User, Item, NPC, etc.)
items.ts — Items + procedural generator (tiers 0-55)
npcs.ts — NPCs + procedural generator (levels 22-300)
classes.ts — 4 classes with skills
skills.ts — Skill trees + masteries
dungeons.ts — 8 dungeons
quests.ts — Quest templates
achievements.ts — Achievements
titles.ts — Titles with buffs
client/
src/
main.ts — Entry point
App.svelte — Auth gate
app.css — Global styles + responsive
lib/
audio.ts — Web Audio API sound effects
stores/
game.ts — Central game state (Svelte stores)
connection.ts — WebSocket manager
components/
Game.svelte — Main layout (sidebar, header, content)
CombatViewer.svelte — Animated combat playback
Avatar.svelte — SVG character avatar
tabs/ — 22 page components
# Server
cd server
npm install
npm run dev # tsx server.ts (needs DB_PATH env)
# Client
cd client
npm install
npm run dev # Vite dev server
# Type checking
cd server && npm run typecheck
cd client && npm run build
# Docker (production)
docker compose build fightclub
docker compose up -d fightclub
# Manual deploy
rsync -az client/dist/ server:/path/to/static/
rsync -az server/ server:/path/to/fightclub-server/
The server compiles TypeScript via tsc in a multi-stage Docker build. The runtime image uses plain node dist/server.js with no TypeScript dependency.
SQLite with WAL mode. Hybrid schema: scalar fields as real columns (queryable), complex nested data as JSON columns.
Tables: users (60+ columns), guilds, messages.
Auto-migrates from JSON files on first run. Schema migrations via ALTER TABLE at startup.
MIT