A social deduction game for one table and no narrator. Everyone plays on their own phone. The app deals the roles, runs the clock, and shows each player only what they are allowed to see.
The interface is in Czech. The game is finished and playable end to end.
Šichta is Czech for a shift, the kind you work at a factory. It is a social deduction game for five to twelve people sitting around one table, each holding their own phone. Some of you are workers. A few of you are quietly wrecking the place. Nobody hosts, nobody reads from a card, nobody sits the game out to run it.
The app handles everything a human narrator would normally do. It deals the roles, picks who goes on shift, collects the secret votes, runs the countdown, and keeps every private thing private. What it deliberately does not do is play the game for you. The interesting part is still five people arguing across a table about who is lying.
Reality shows like The Traitors are gripping on screen and fall apart at a kitchen table. On television the murders happen off camera, between episodes, and the audience gets to watch. Around a real table there is no off camera. If the traitors simply pick someone to eliminate each night, the rest of the group has nothing to reason about. You are not deducing, you are guessing, and after two rounds everyone knows it.
The other direction has the opposite problem. Blood on the Clocktower solves deduction beautifully, but it needs a dedicated storyteller, a rulebook, and a group willing to learn dozens of roles before the first game. That is a great evening for the right crowd and a terrible first thirty minutes for everyone else.
Šichta aims at the gap between them. No narrator, no role encyclopedia, and still something real to argue about.
Every round a small crew is sent on a shift. Everyone on that crew privately chooses to work or to wreck it. The app reveals only how many chose to wreck it, never who.
That single number is the whole engine. A failed shift proves that at least one of those four specific people is a saboteur. It does not say which. The table now has a hard fact to reason from, and every future crew list is an argument about who deserves to be on it.
The twist is what a failed shift buys. It is not just evidence against the saboteurs, it is also their reward, and they get to choose which one: a murder that night, immunity granted to anyone at the table including an innocent they want to frame, or darkness over the next vote so nobody sees who voted for whom. Sabotage is therefore never free and never pointless. It hands the workers information and hands the saboteurs power in the same move.
People who already enjoy this genre and want a version that starts in under a minute, needs no host, and rewards talking rather than tracking. A full game runs roughly forty minutes.
Being eliminated does not send you to the kitchen. You become a shadow: you stay at the table, you keep talking, you keep accusing. What you lose is the ability to nominate, and you get exactly one vote for the entire rest of the game. Spend it well.
This exists for a blunt practical reason. In a game built on conversation, removing people from the conversation is the worst thing you can do to them, and a lopsided endgame with four silent spectators is a bad evening for four people.
The workers win by banishing the last saboteur. The saboteurs win when the shifts run out and at least one of them is still standing.
There is deliberately no parity rule, the usual "evil wins when they equal the good." Simulation showed it ended games in two rounds, long before anyone had enough to reason with. Removing it turned a coin flip into a conversation.
The player counts, crew sizes, saboteur ratios and round limits were not guessed. They came out of six thousand simulated games plus an exact Bayesian solver that plays the informational ceiling: a player who reasons perfectly from the published numbers and reads nobody's face. That solver sets the upper bound on how much the mechanics alone can tell you, which is exactly what you want to know when the goal is to leave room for the human part.
One saboteur never works at any table size. The ratio that holds up is roughly three in eight.
This one was argued on paper long before anything ran. The first version of the design had a cooldown on murders, which looked balanced on a spreadsheet and would have been miserable in practice, because it asks a table full of people drinking beer to track a timer. It got thrown out and replaced with the reward menu, which carries the same weight and needs no bookkeeping.
A second draft had the saboteurs only knowing how many of them there were. That was a mistake in a different direction. The entire appeal of this genre is an informed minority operating inside an uninformed majority. They know each other by name now.
The rules were written first as a pure function with no interface attached, and covered with tests that play whole games start to finish. Only then did any screen exist. It sounds like a detour and it was the opposite: three rule bugs turned up before a single pixel was drawn, at a point where fixing them was free.
The same discipline applies to secrecy. There is exactly one function through which game state can reach a phone, and it has its own tests asserting that a worker's payload does not contain the string "saboteur" anywhere. Not "we remembered to hide it", but "it structurally cannot leave."
Not in the game logic. The test suite kept that honest. The bugs were in the seams.
One screen was being skipped entirely because a side effect had been tucked inside a state updater, and React runs those twice in development, which advanced the game by two phases instead of one. No unit test could see it. Playing the game in a real browser found it in thirty seconds.
The best one: the room code generator on the server used a 32 character alphabet, while the keypad in the app only offered 17 of them. Every test passed. Every code was valid. And roughly half of all generated codes were physically impossible to type. Both now read from the same constant, with tests that fail if they ever drift apart again.
"Tests prove the parts work. Only playing it proves the game works."
Both roles must see the same screen. Not a similar screen, the same one. If the wreck button were greyed out for workers, anyone glancing across the table would learn a role for free. So the button is always there, always identical, and simply does nothing. The same rule governs the sound: every phase makes the same noise for everyone, and only one phone plays it out loud.
Each game room is a single Cloudflare Durable Object. It owns the state, advances the phases on its own timer, and pushes every phone its own tailored view of the world. Ten phones cannot disagree about which round it is, because none of them are counting.
The reason for choosing Durable Objects over a database was specific. The rules are a pure TypeScript function, so the server runs the exact same code as the browser, unchanged. A SQL backend would have meant writing the rules a second time and maintaining two truths that quietly diverge. This way there is only one.
Phones lock, browsers suspend tabs, someone walks into the kitchen. The client assumes the connection will drop and holds nothing of value: state lives on the server, and a token in local storage puts you back exactly where you were. The countdown pauses rather than running on without you, and the table can choose to wait or carry on.
Ten phones loading at once on someone else's wifi is the real world test. The whole app is 68 kB gzipped with no animation library and no image assets, since the logo and every icon are inline SVG and every sound is generated by oscillators rather than downloaded. If the first screen does not appear in two seconds, the group starts wondering whether it is worth it.
Finished, live and open source. The app and the API are served from the same Cloudflare Worker, which means one deploy, one origin, and no cross-origin machinery at all.
The balance was tuned in simulation, and the simulation assumes every player believes every claim and spots every lie perfectly. No table ever does, so real games will play out differently, and that is exactly where the arguing happens.
Got thoughts?
Reactions, questions, a different take — write to contactme@resonantlabs.online.