factoid-trivia
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in miliseconds.
index.ts
https://bmitchinson--9127face487a11f08b4576b3cceeab13.web.val.run
A realtime trivia game themed like a USPS post office, supporting up to 30 concurrent users.
https://www.val.town/x/bmitchinson/factoid-trivia
- USPS post office themed design
- Real-time user presence (see who's online)
- Name entry and user management
- Support for up to 30 concurrent players
- NEW: Complete trivia game functionality:
- Fact submission by each player
- Random fact selection for rounds
- Voting system where players guess whose fact it is
- Real-time vote tracking and display
- Answer reveal with vote results
- Scoring system and leaderboard
- Skip functionality for rounds
- Join the Game: Enter your name to join the post office
- Submit a Fact: Each player submits an interesting fact about themselves
- Wait for Others: Game can start when at least 2 players have submitted facts
- Vote on Facts: When a fact is displayed, guess which player it belongs to
- See Results: After voting, reveal answers to see who was correct
- Earn Points: Get 1 point for each correct guess
- Climb the Leaderboard: Track your score against other players
Join Game → All Players Submit Facts → Facts Get Queued →
Vote on Random Facts → See Results → Earn Points →
Next Round → Repeat Until All Facts Used
- Everyone Submits Facts: All players can and should submit facts
- Random Queue System: Facts are randomly selected from the queue for each round
- Flexible Start: Game can start with 2+ facts, or wait for everyone
- Real-time Progress: See who has/hasn't submitted facts yet
- Complete Fact Usage: All submitted facts will eventually be used in rounds
├── backend/
│ ├── index.ts # Main Hono server with game API endpoints
│ ├── database/
│ │ ├── migrations.ts # SQLite schema for users, facts, votes, rounds
│ │ └── queries.ts # Database query functions for game logic
│ └── routes/
│ └── websocket.ts # WebSocket connection handling (future)
├── frontend/
│ ├── index.html # Main HTML template
│ ├── index.tsx # React frontend entry point
│ ├── components/
│ │ ├── App.tsx # Main app component with game state management
│ │ ├── NameEntry.tsx # Name entry form
│ │ ├── FactEntry.tsx # Fact submission form
│ │ ├── GameLobby.tsx # Waiting area showing fact collection progress
│ │ ├── GameRound.tsx # Active round with voting interface
│ │ ├── Leaderboard.tsx # Score tracking display
│ │ └── UserList.tsx # Online users display
│ └── style.css # USPS-themed styles
└── shared/
└── types.ts # Shared TypeScript types for game objects
- The backend runs on Hono with WebSocket support for real-time features
- Frontend uses React with WebSocket client for real-time updates
- SQLite stores user sessions and game state
- USPS-themed styling with postal colors and typography
- ✅ User name entry and management
- ✅ Real-time user presence (up to 30 players)
- ✅ USPS theming and design
- ✅ Fact submission system
- ✅ Random fact selection for rounds
- ✅ Voting system with real-time updates
- ✅ Answer reveal and vote result display
- ✅ Scoring system and leaderboard
- ✅ Skip round functionality
- ✅ Complete game flow from start to finish
GET /api/game-state
- Get current game state including users, rounds, leaderboardPOST /api/join
- Join the game with a namePOST /api/leave
- Leave the gamePOST /api/submit-fact
- Submit a personal factPOST /api/start-round
- Start a new round with a random factPOST /api/vote
- Cast a vote for who you think the fact belongs toPOST /api/reveal
- Reveal the answer and award pointsPOST /api/skip
- Skip the current roundPOST /api/admin/kick-all
- [ADMIN] Clear all game data and kick all players
The game includes an admin panel accessible through a discrete "Admin" link at the bottom of the page. This provides:
- Kick All Players: Immediately disconnects all connected players and clears all game data including:
- All user sessions
- All submitted facts
- All votes and rounds
- All scores and leaderboard data
- Current game state
⚠️ Warning: The kick all function is irreversible and will completely reset the game to its initial state.