Draw. Vote. Win.
100% Free & Open Source · No Account Required · One Command to Host
Play · Game Modes · Features · Quick Start · For Developers · Contributing
SpriteBox is a browser-based multiplayer pixel art game where creativity meets competition. Draw 8×8 pixel masterpieces, vote on others' creations, and climb the ranks with our chess-inspired Elo rating system.
Think Gartic Phone meets Pixel Art with a competitive twist.
╔═══════════════════════════════════════════════════════════════╗
║ ║
║ Prompt: "sleepy robot eating pizza" ║
║ ║
║ ┌────────────────┐ ║
║ │ ▓▓▓▓▓▓▓▓▓▓▓▓ │ You have 30 seconds ║
║ │ ▓░░░░░░░░░░▓ │ to draw this! ║
║ │ ▓░██░░░░██░▓ │ ║
║ │ ▓░░░░░░░░░░▓ │ 8×8 pixels ║
║ │ ▓░░░████░░░▓ │ 16 colors ║
║ │ ▓░░░░░░░░░░▓ │ Unlimited creativity ║
║ │ ▓▓▓▓▓▓▓▓▓▓▓▓ │ ║
║ └────────────────┘ ║
║ ║
╚═══════════════════════════════════════════════════════════════╝
| 100% Free & Open Source | No ads, no paywalls, no tracking, MIT licensed |
| No Account Required | Just open the link and play instantly |
| Works Everywhere | Desktop, mobile, tablet — any modern browser |
| Multilingual | Full English and German support |
| Self-Hostable | One command to run your own server |
| Privacy First | No persistent user data stored |
SpriteBox offers 4 unique game modes for every type of player:
⚔️ Pixel BattleThe Classic Experience
Perfect for: Party games, streams, large groups |
🎯 CopyCat1v1 Memory Duel
Perfect for: Quick duels, testing your memory |
🖼️ Pixel GuesserPictionary-Style Fun
Perfect for: Friends, family game nights |
🗡️ Pixel SurvivorSingle-Player Roguelike
Perfect for: Solo practice, roguelike fans |
┌─────────────────────────────────────────────────────────────────┐
│ 🔒 Zero Configuration No database, no API keys, no secrets │
│ 🛡️ Server-Authoritative All game logic runs on the server │
│ 🔐 Privacy First No persistent user data stored │
│ 📦 Fully Open Source Inspect, modify, self-host freely │
└─────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ │
│ LOBBY COUNTDOWN DRAWING VOTING │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ │ 5 sec │ │ 30 sec │ │ 5s×N │ │ │
│ │ 5+ │ ──────► │ GET │ ───────► │DRAW!│ ──────► │A vs │ │
│ │ │ │READY│ │ │ │ B │ │
│ └─────┘ └─────┘ └─────┘ └─────┘ │
│ │ │ │
│ │ ┌─────────────────────────────────┐ │ │
│ │ │ │ │ │
│ │ ▼ │ ▼ │
│ │ RESULTS FINALE ◄───┘ │
│ │ ┌─────┐ ┌─────┐ │
│ │ 15 sec │ │ 15 sec │TOP │ │
│ └──────── │ 🏆 │ ◄────── │10% │ │
│ │ │ │ │ │
│ └─────┘ └─────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
Instead of simple upvotes, SpriteBox uses chess-style Elo ratings:
| Concept | How It Works |
|---|---|
| Starting Rating | Every artwork begins at 1000 Elo |
| 1v1 Matchups | Each vote is a head-to-head comparison |
| Dynamic Gains | Beating a higher-rated artwork = more points |
| Fair Exposure | Algorithm ensures every submission is seen equally |
| Adaptive Rounds | More players = more voting rounds (2–7) |
| Phase | Duration | Description |
|---|---|---|
| Lobby | Until 5+ players | Waiting room |
| Countdown | 5 seconds | Prompt revealed |
| Drawing | 30 seconds | Create your masterpiece |
| Voting | 5s × 2–7 rounds | Pick your favorites |
| Finale | 15 seconds | Top 10% face off |
| Results | 15 seconds | Winners announced |
Just visit spritebox.de — no installation needed!
Want to run your own SpriteBox server? It's simple:
git clone https://github.com/ibimspumo/SpriteBox.git
cd SpriteBox
pnpm install
pnpm dev
Open http://localhost:5173 — done!
pnpm build
pnpm start
Server runs on port 3000, serving both API and frontend.
No environment variables. No secrets. No database.
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | Svelte 5 + Vite | Reactive UI with runes ($state, $derived) |
| Backend | Node.js + Express | HTTP server + static file serving |
| Real-time | Socket.io | WebSocket communication |
| Validation | Zod | Runtime type safety |
| Compression | LZ-String | Efficient large gallery transfer |
| Package Manager | pnpm | Fast monorepo management |
| i18n | Custom stores | English & German support |
SpriteBox/
├── apps/
│ ├── server/ # Node.js Backend
│ │ ├── src/
│ │ │ ├── index.ts # Entry + Express setup
│ │ │ ├── socket.ts # WebSocket handlers
│ │ │ ├── gameModes/ # Mode-specific logic
│ │ │ │ ├── modes/
│ │ │ │ │ ├── pixelBattle.ts
│ │ │ │ │ ├── copyCat.ts
│ │ │ │ │ ├── pixelGuesser.ts
│ │ │ │ │ └── pixelSurvivor.ts
│ │ │ │ └── registry.ts # Mode registration
│ │ │ ├── voting/ # Elo algorithm
│ │ │ ├── validation.ts # Zod schemas
│ │ │ └── rateLimit.ts # DoS protection
│ │ └── data/
│ │ ├── prompts.json # English prompts
│ │ └── prompts_de.json # German prompts
│ │
│ ├── web/ # Svelte 5 Frontend
│ │ ├── src/
│ │ │ ├── lib/
│ │ │ │ ├── components/ # Atomic Design (50 components)
│ │ │ │ │ ├── atoms/ # Button, Input, Badge
│ │ │ │ │ ├── molecules/ # PromptDisplay, ModeCard
│ │ │ │ │ ├── organisms/ # Modal, Card, GalleryGrid
│ │ │ │ │ ├── features/ # Lobby, Drawing, Voting, Results
│ │ │ │ │ │ ├── CopyCat/
│ │ │ │ │ │ ├── PixelGuesser/
│ │ │ │ │ │ └── PixelSurvivor/
│ │ │ │ │ └── utility/ # PixelCanvas, Timer
│ │ │ │ ├── i18n/ # Translation system
│ │ │ │ ├── stores.ts # Svelte stores
│ │ │ │ └── styles/
│ │ │ │ └── tokens.css # Design system
│ │ │ └── routes/
│ │ │ └── play/[mode]/ # Dynamic game routes
│ │ └── static/
│ │ ├── fonts/ # Pixelify Sans
│ │ └── audio/ # Sound effects
│ │
│ └── docs/ # Astro/Starlight documentation
│
├── package.json # Workspace scripts
├── pnpm-workspace.yaml # Monorepo config
└── CLAUDE.md # AI assistant context
All game logic runs on the server. Clients send inputs, receive state updates. This prevents cheating and ensures consistent gameplay.
No database. All game data lives in JavaScript Map objects. Games are intentionally ephemeral — when the server restarts, everything resets. This means:
Frontend follows strict component hierarchy:
pnpm install # Install all dependencies
pnpm dev # Start both servers with hot reload
pnpm build # Production build
pnpm start # Start production server
pnpm lint # Run ESLint
pnpm typecheck # Run TypeScript checks
| Protection | Limit |
|---|---|
| Global requests | 50/second |
| Drawing submissions | 5/minute |
| Votes | 3/second |
| Room creation | 3/minute |
| Connections per IP | 5 simultaneous |
| Max payload size | 1KB |
pnpm install && pnpm buildpnpm startNo environment variables. No secrets. No database.
| Players | RAM |
|---|---|
| 1,000 | ~100 MB |
| 5,000 | ~250 MB |
| 10,000 | ~500 MB |
GET /health
{
"status": "ok",
"memory": { "heapUsedMB": 45, "status": "ok" },
"players": { "current": 847, "max": 10000 },
"instances": { "active": 12, "public": 9, "private": 3 }
}
We welcome contributions! See CONTRIBUTING.md for detailed guidelines.
git clone https://github.com/ibimspumo/SpriteBox.git
cd SpriteBox
pnpm install
pnpm dev
Full documentation available at spritebox.de/docs
No! Just open the website and play. Your session is temporary and private.
Yes! The game is fully optimized for touch devices.
5 to 100 players per game (depending on mode).
You have 15 seconds to rejoin and keep your progress.
Simplicity. No setup, no maintenance, no data breaches. Games are ephemeral by design.
Yes! Clone the repo and run pnpm install && pnpm build && pnpm start.
Yes! It's designed with rate limiting, input validation, and DoS protection.
SpriteBox follows security best practices:
Report vulnerabilities to: security@spritebox.de
MIT License — Do whatever you want with it.
See LICENSE for details.
Play Now · Documentation · Report Bug · Request Feature
Made with pixels and ❤️
⭐ Star this repo if you like SpriteBox!