← After Dark

Style guide

Judge this at minimum screen brightness. That is the room it ships into.

Luminance

Attention is luminance, not decoration. Exactly one module is lit at a time.

Lit

Act on this now.

Dim

Live, but not your job.

Closed

Resolved, or dead.

Motion

The console boots: 4px of settle, 60ms apart. Replay it: it only runs on mount.

Mafia

One

Arrives first. The state band answers where am I.

Two

Then the register answers who is here.

Three

Then everything else, in the order it is read.

A single Reveal can be placed by hand when a screen is not a stack of modules.

Glyphs

One frame, one mark. Every role is a row on the same register.

plain

strike

cross

lens

An unknown name falls back to the plain frame, so a role added later can never render nothing:

name="godfather-not-a-real-glyph"

Color

Three accents, each with exactly one job.

void

#08090A

panel

#101114

panel-lit

#191B1F

rule

#26282D

signal

#F2EFE9

signal-2

#8C9096

signal-3

#55585E

alarm

#E5484D

alarm-deep

#8E1F23

secret

#E8B33A

safe

#4BC28E

Type: one family, three widths

Width is a token. Narrow means a fact; wide means the world changed.

t-state

wdth 125 · wght 700 · 44px

Night 02

t-state-sm

wdth 125 · wght 700 · 26px

Town wins

t-title

wdth 112 · wght 600 · 20px

The village sleeps

t-data

wdth 75 · wght 500 · tabular

01 Arjun 02 Meera 03 Sam

t-code

wdth 75 · wght 700 · 34px

XKQ2

t-prose

wdth 100 · wght 400 · 16px

The Doctor may save the same person twice, but never themselves.

t-spoken

the app's voice, said out loud

Mafia, open your eyes. Choose someone to kill.

StateBand

The only element that shifts the console's accent.

Console state

Night 02

Everyone but the Mafia is asleep.

Roster

Dead players stay on the register, at closed luminance.

Register

3 / 4 standing

RosterRow variants

Directive

Normally the one lit module. The spoken line comes from the role registry.

Mafia awake

Mafia, open your eyes. Agree on someone, and point.


RoleModule

Faction is a bar, not a badge. Rendered from the real role registry.

Mafia

Wakes 1

Mafia

Wakes first each night and agrees on one victim. Knows the other Mafia. Wins when the Mafia equal or outnumber everyone else.

Doctor

Wakes 2

Town

Protects one person each night. A protected victim survives the Mafia's kill. May save the same person twice, but never themselves.

Detective

Wakes 3

Town

Each night, learns whether one player is Mafia. Knowing is the easy part; being believed is not.

Villager

Sleeps

Town

No night action. Argues, votes, and is usually wrong.

Sealed

Press and hold. A tap is too easy to trigger.

JoinModule

The one deliberate break from the void ground.

Join

AD

or enter code

XKQ2

Button

Four intents, two sizes.

RoleModule, selectable

onSelect makes a card tappable, so a reference screen can light one without breaking the one-lit rule.

Field

Two recipes. The label never leaves; a placeholder is not a label.

Everyone at the table sees this.

Four characters, printed under the QR.

Renders a textarea. Prose wraps.

Nothing to enter.

CommitButton

Two presses. The arming window drains visibly.

Rule





Engine: suggested setups

Straight from game-core. Mafia can never start at or above parity.

Balance table

Players

Setup

51 Mafia · 3 Villager · 1 Detective
62 Mafia · 2 Villager · 1 Doctor · 1 Detective
72 Mafia · 3 Villager · 1 Doctor · 1 Detective
93 Mafia · 4 Villager · 1 Doctor · 1 Detective
123 Mafia · 7 Villager · 1 Doctor · 1 Detective
165 Mafia · 9 Villager · 1 Doctor · 1 Detective

Night order

1Mafia

kill

2Doctor

protect

3Detective

investigate

CaseRecord

A closed record, filed.

Mafia wins12 Aug 2026

Players

9

Ended

Night 4

Ran

47 min

Where

Kevin's flat

Priya convinced the table to lynch the Doctor on day two. It never recovered.

CaseRecord, selectable

onSelect opens the dossier. Lit while chosen, so the archive list keeps one lit.

The top reports. The bottom acts.