The Munkeler is a fast-paced social deduction game where players try to uncover who among them is the Munkeler (imposter) — all on a single shared device.
Gather your friends and take turns passing the phone around. Everyone except one player receives a secret word from a chosen topic — but the Munkeler has no clue! Your goal: give hints, discuss, and vote out the impostor before they can figure out the word.
- Setup – Add 3+ players and pick a topic (Food, Animals, Movies, Countries, or create custom topics).
- Optional: Enable special roles (Jester & Sheriff) with 4+ players for added strategy!
- Role Reveal – Each player privately views their role (Civilian, Munkeler, Jester, or Sheriff).
- Discussion – Give subtle hints and try to expose the Munkeler.
- Sheriff Ability: The Sheriff can inspect one player's role once per game!
- Voting – Decide who to vote out each round.
- Munkeler Guess – The Munkeler has one chance to guess the secret word.
- Results – Either the Munkeler wins by guessing correctly, Civilians win by catching them, or the Jester wins by getting eliminated!
- Civilians Win:
- The Munkeler is correctly voted out.
- The Munkeler guesses the secret word incorrectly.
- Munkeler Wins:
- Correctly guesses the secret word.
- Survives until only 2 players remain.
- Jester Wins (NEW):
- Gets voted out during any voting round (wins alone!).
- Sheriff (NEW):
- Part of the Civilian team with a special ability to inspect one player's role.
- Pass-and-play multiplayer — one device for all players.
- Special roles system (NEW) — Jester and Sheriff add strategic depth (4+ players required).
- Role inspection ability (NEW) — Sheriff can reveal one player's true role.
- AI-powered topic generation — create custom topic lists with AI assistance.
- Multiple game modes — play with built-in topics or your own custom lists.
- Clean minimal UI optimized for quick social play.
- Haptic feedback for tactile interactions.
- Round timer with discrete controls (icon-only buttons inside timer circle).
- Persistent storage for player names, custom topics, and settings.
- Multi-round gameplay with elimination tracking.
- Smart voting system that handles ties, revotes, and Jester wins.
- Rewarded ads for additional AI generations.
- Privacy-first ad consent using Google UMP SDK.
- Tutorial mode for first-time players.
- React Native & Expo (SDK 54)
- Expo Router – File-based routing system.
- Zustand – Lightweight state management with persistence.
- AsyncStorage – Persistent data storage.
- Expo Haptics – Touch feedback.
- Google Mobile Ads (AdMob) – Banner and rewarded ads with UMP consent.
- Custom AI API – For generating topic lists.
app/
├── index.js # Main menu
├── setup.js # Player & topic selection (with special roles toggle)
├── role.js # Role reveal screen (supports 4 roles)
├── round.js # Discussion phase (with Sheriff inspection)
├── vote.js # Voting phase (handles Jester wins)
├── imposter-guess.js # Munkeler's final guess
├── results.js # Game result screen (all win conditions)
├── settings.js # App settings & preferences
├── ai-topics.js # AI topic generation
├── custom-topics.js # Custom topic management
├── tutorial.js # First-time tutorial
└── _layout.js # Root layout with consent provider
src/
├── components/
│ ├── ui/ # Reusable UI components
│ │ ├── Screen.js
│ │ ├── Button.js
│ │ ├── Input.js
│ │ ├── Card.js
│ │ ├── Pill.js
│ │ ├── CircularTimer.js # (Updated with built-in controls)
│ │ └── Title.js
│ ├── AdBanner.js # Banner ad component
│ └── LoadingScreen.js
├── contexts/
│ └── AdConsentContext.js # UMP consent management
├── store/
│ ├── gameStore.js # Game state (now includes special roles)
│ └── aiStore.js # AI generation tracking
├── lib/
│ ├── generateTopics.js # AI topic generation API
│ └── rewardedAds.js # Rewarded ad handling
├── config/
│ └── api.js # API configuration
├── data/
│ └── topics.json # Built-in topic lists
├── locales/ # Translations
│ └── en.json # (Updated with special role strings)
└── constants/
├── theme.js # Design tokens
└── icons.js # Icon mappings
Manages core game state with AsyncStorage persistence:
- Player list and elimination status
- Current Munkeler and secret word
- Role assignments (NEW) — Tracks Civilian, Munkeler, Jester, and Sheriff roles
- Special role states (NEW) — Jester/Sheriff enabled flags, Sheriff ability usage
- Round tracking and voting history
- Custom topic management
Tracks AI generation usage:
- Free generation count (1 per day)
- Rewarded ad views (up to 5 per day)
- Generated topic history
Handles Google UMP SDK consent flow:
- Auto-prompts on first launch (when required)
- Manages personalized vs non-personalized ads
- Privacy options accessible from settings
- Banner Ads – Non-intrusive bottom banners on main screens
- Rewarded Ads – Optional ads for additional AI generations
- Uses Google UMP SDK for GDPR/CCPA compliance
- Consent form shown on first launch when required
- Users can manage privacy settings anytime
- Non-personalized ads by default
The app includes an AI-powered feature to generate custom topic lists:
- Free Generation – 1 free generation per day
- Rewarded Generations – Watch up to 5 ads per day for more
- Customization – Specify topic count, difficulty, and description
- Persistence – Generated topics saved locally for reuse
API integration handled via src/lib/generateTopics.js with credentials from environment variables.
- All game data stored locally via AsyncStorage
- Player names, custom topics, and settings never leave device
- No cloud sync or external data collection
- Uses Google Mobile Ads SDK with UMP consent
- Advertising ID permission declared for Android 13+
- Users control ad personalization via settings
See the Privacy Policy for complete details.
- Add civilian elimination modal
- Correct and complete the languages locale, to be complete
- Restrucutre the main homepage
- Add view role feature during the round (based on my own feedback)
- Redesigned the structure of the AI Topics Generator Screen (based on reddit feedback)
- Improved the text inside buttons, depending on the language
- Improve homescreen (Add more information about the game)
- Restructure home screen -> add quick access to topic generator
- Clarify minimum number of players (based on reddit feedback)
- Add Italian & Spanish as languages
- NEW: Special Roles System - Added Jester and Sheriff roles (requires 4+ players)
- NEW: Jester Role - Win by getting voted out! Act suspicious and trick others into eliminating you
- NEW: Sheriff Role - Inspect one player's role during the round to help civilians find the Munkeler
- Redesigned role reveal screen with distinct colors and icons for all roles
- Improved round screen with discrete timer controls (icon-only buttons inside timer)
- Enhanced voting system to handle Jester win condition
- Added role-specific missions and objectives for better gameplay clarity
- Improved UI consistency across all game screens
- BUG: Fix homescreen topic information bar
- BUG: Fix Munkeler guess
- Update Tutorial
- First Production release
- Implement production ads
- Fixed swipe navigation - Back gestures now properly navigate between screens instead of triggering exit dialog
- Improved screen adaptation for OS buttons
- Removed orientation and resizeability restriction
- Correct version in settings
- Change Theme color to red
- Add rotating AI Topic examples
- Add AI generator Tutorial
- Add icons for jester and sherif in setup
- Collapsible topic section in setup screen - Reduces scrolling by hiding topic grid by default
- Vote confirmation dialog with player name - Prevents accidental eliminations
- Round information display in voting screen - Shows current round and players remaining
- Smooth animations on voting selection - Enhanced visual feedback with spring animations
- Rebranding from Imposter Hunt to The Munkeler
- Gameplay: Random speaking order each round - Speaking order now reshuffles every round for more variety.
- Balance update: Munkeler never speaks first - The Munkeler is explicitly prevented from being first in the speaking order.
- New comeback mechanic - If the Munkeler is voted out, they now get a final word guess attempt.
- Updated win condition after vote-out - Voted-out Munkeler wins if the guess is correct; Civilians win if the guess is wrong (or passed).
- Flow update - Voting now routes to the Munkeler guess screen when the eliminated player is the Munkeler.
- UX copy improvement - Munkeler guess screen supports contextual messaging for the voted-out scenario.
This is a personal project, but feedback and suggestions are welcome. Please open an issue for bugs or feature requests.
Copyright 2026 David Pereira — All rights reserved.
This software and associated documentation files may not be copied, modified, merged, published, distributed, sublicensed, or sold without express written permission from the author.
Built with Expo, React Native, and the React Native community ecosystem.