Tabani is a real-time online hidden-information card game built around bluffing, voting, ambushes, and score-driven gold collection.
Players join a room, choose characters, lock vision targets, exchange secret signals, vote to eliminate opponents, and duel for center gold bags. The match continues until one player exceeds the win threshold and becomes the final winner.
- Real-time multiplayer rooms powered by Socket.IO
- Secret signal system with wink, whisper, and point actions
- Vision lock mechanic for observing hidden interactions
- Voting phase with ambush counter play
- Duel phase with changeable last-second choices
- Center gold bags with hidden values
- Private gold totals for each player
- End-of-game screen with automatic return to the lobby
- Ghost spectator mode for eliminated players
- Vue 3
- Vite
- Socket.IO Client
- lucide-vue-next
- Node.js
- Express
- Socket.IO
- CORS
- nodemon
tabani/
backend/
config/
handlers/
index.js
package.json
frontend/
src/
components/
App.vue
main.js
style.css
package.json
README.md
Tabani is a social deduction card game with hidden information and round-based decision making.
Core flow:
- Vision Focus
- Signal Phase
- Discussion
- Voting
- Ambush Resolution
- Duel Resolution
- Gold payout and round progression
The game ends as soon as a player exceeds 40 gold.
When that happens:
- the final winner is shown on screen
- the match enters a game-over state
- all players return to the same room lobby after 10 seconds
- players can change characters and start a new match
- Each round starts with 4 center gold bags
- Each bag has a hidden value of 3, 4, or 5 coins
- If one player remains, that player takes all 4 bags
- If nobody remains, the center gold stays for the next round
- If 2 players remain, they enter a duel
- Thief vs Partner: Thief takes all 4 bags
- Thief vs Content: Thief takes 3 bags, Content takes 1 bag
- Partner vs Partner: Each player takes 2 bags
- Partner vs Content: Partner takes 3 bags, Content takes 1 bag
- Thief vs Thief: nobody takes anything, and the center gold stays for the next round
- Content vs Content: each player takes 1 bag, and 2 bags stay for the next round
- Node.js 18+ recommended
- npm
Install backend dependencies:
cd backend
npm installInstall frontend dependencies:
cd frontend
npm installcd backend
npm run devThe backend runs on:
http://localhost:3000
cd frontend
npm run devThe frontend runs on:
http://localhost:5173
- The game state is currently stored in memory on the server.
- Restarting the backend resets active rooms and match state.
- The backend is configured to accept the local Vite origin at
http://localhost:5173.
- Add persistent storage for rooms, matches, and player history
- Add a proper scoreboard and match archive
- Improve mobile UX for smaller screens
- Add sound and animation polish for important game events
- Expand the game rules reference inside the app
- Add automated tests for voting, ambush, and duel resolution
Tabani is currently maintained in a single-repo workflow, and contributions are welcome from anyone who wants to help improve the game.
If you contribute, feel free to add your name here in your pull request once the project adopts a formal contributor list.
Contributions are welcome. If you want to help improve Tabani:
- Fork the repository
- Create a feature branch
- Make your changes
- Run the frontend build and backend syntax checks
- Open a pull request
- UI and UX improvements
- Game rule validation
- Multiplayer synchronization
- Balance tuning
- Accessibility improvements
- Documentation and tutorials
Before opening a pull request, it is a good idea to run:
cd backend
node --check index.js
node --check handlers/gameHandler.js
node --check handlers/roomHandler.jscd frontend
npm run buildNo license has been added yet. If you plan to publish or accept outside contributions, consider adding one.