A 2D parking permit inspection game inspired by Papers, Please.
You are a parking permit officer. Vehicles pull up one by one and it's your job to verify their permits. Cross-reference the details — zone, expiration date, vehicle type, plate number — against the regulations, spot discrepancies, and decide: approve or deny.
Miss too many violations and you get a warning. Let legitimate vehicles through and residents will complain. Every shift gets harder.
- A vehicle approaches your booth with a displayed permit
- You receive the current rulebook and any active policy updates for the day
- Inspect the permit details against the rules
- Stamp APPROVED or DENIED
- Earn points for correct decisions, lose them for mistakes
- Survive the shift
- Multiple permit types (residential, commercial, visitor, handicapped)
- Time pressure per shift
- Rule changes between days (new zones, expired sticker formats, etc.)
- Story elements — residents who argue, supervisors who pressure you
- Escalating difficulty with forged or altered permits
- Scoring and end-of-day report card
Goal: a new player understands the loop within 5 minutes, without reading a manual.
Approach — teach by playing, one new rule per day:
- Day 1 — Expiry only. Supervisor delivers one line ("Check the expiry date — reject anything past today"), then 3–5 permits scroll through. Today's date is highlighted. Stamp APPROVED or DENIED.
- Day 2 — Add zones. New line of supervisor dialogue introduces zone matching. Previous rule still applies.
- Day 3 — Add license plate matching.
- Day 4 — Add vehicle type restrictions.
- Day 5+ — Edge cases: handicap permits, visitor passes, forged stickers.
First-turn experience:
- "Day 1, Monday" title card → booth view
- Supervisor line (one sentence, no walls of text)
- First permit arrives — relevant field highlighted on both the permit and the rulebook
- Big satisfying stamp animation + sound on decision
- End-of-day report card lists any mistakes — that's the only correction; no mid-shift interruptions
Design rules:
- Rulebook always one click/key away — never hidden
- Visual cues over text: color highlight mismatched fields, green/red on stamps
- No tutorial popups that block input
- Mistakes are revealed end-of-day, not in the moment (preserves flow)
- React 18 — UI and game screens
- Vite — dev server and build tool
- Zustand — lightweight game state management
- Framer Motion — stamp animations and screen transitions
- CSS Modules — scoped per-component styles, no framework
No game engine — the game is UI-driven enough that plain React handles it faster for a web dev team.
src/
├── main.jsx # entry point
├── App.jsx # screen router
├── styles/
│ └── global.css # CSS variables + reset
├── store/
│ └── gameStore.js # all game state (Zustand)
├── data/
│ ├── rules.js # validation logic + per-day rulebook
│ └── vehicles.js # procedural vehicle/permit generator
├── screens/
│ ├── TitleScreen # start screen
│ ├── DayBriefing # daily rule memo before shift
│ ├── GameScreen # main gameplay layout
│ ├── ShiftReport # end-of-day score card
│ └── GameOver # terminated screen
└── components/
├── HUD # score, day, error counter
├── PermitCard # the permit document (fields highlight on violations)
├── StampControls # APPROVE / DENY buttons with stamp animation
├── Rulebook # collapsible sidebar with active regulations
└── VehicleQueue # left panel showing upcoming vehicles
| Day | New rule added |
|---|---|
| 1 | Permit must not be expired |
| 2 | Zone on permit must match requested zone |
| 3 | Plate number on permit must match vehicle plate |
| 4+ | More to come |
- 8 vehicles per shift, ~50% have violations
- 3 mistakes = terminated
- Correct decision: +10 pts — Wrong decision: -5 pts
Add your team members here
npm install
npm run devOpen http://localhost:5173 in your browser.
Inspired by Papers, Please by Lucas Pope — a dystopian document thriller where you play an immigration officer in a fictional totalitarian state. Permits Please brings that same tension and moral weight to the world of parking enforcement.