Clean's Automafia: the guide

My values from {insert column name here} aren't showing up in the preview

Check that your columns are correctly named according to the specifications - A can be anything, B can be anything, C must be "Sender", D must be "SenderCond", E must be "Action", F must be "Target", G must be "TargetCond", H must be "ApplyCond", I must be "Lore". Capitalisation doesn't actually matter, though.

A bunch of rows from the bottom of the sheet aren't showing up in the preview

Check that there's no completely blank row in the sheet. Google doesn't like giving me any rows beneath blank rows.

Some of my cells are displaying column names with colons and commas in weird places like ", sender:"

Try to avoid using colons in your sheet, that should fix it. If they're in the Lore, try replacing them with $COLON. If they're part of a status name or role name... change those names.

The font looks a bit blocky and jagged on Google Chrome

Go to chrome://flags, find DirectWrite, click Enable, then restart your browser.

This tool is bad and you should feel bad


I want to get in contact with you

You have a restraing order


Leave me alone or I'll call the police

Is any data stored on the server?

Nope, it's all client-side. Cookies are used to preserve your Setting between sessions, though.

Is this tool free?


So how are you profiting from this?

I'm not

Aren't you selling my information to some shady company?


Quick reference

Click SETUP WALKTHROUGH if this is your first time.


Each row of a Lore Sheet can be read like this:

When a player with the role "Sender" (who has the Condition "SenderCond") uses the action "Action" on a player with the role "Target" (who has the Condition "TargetCond"), the Sender gets the Condition "ApplyCond" and the message "Lore" is sent to the Sender.

The initiator of an action is the Sender.

The recipient of an action is the Target.

The name of the action itself is the Action.

When logging player's nightly actions, you will need to specify what players are using actions, what actions they use, and (if applicable) who they are targeting.

Senders and Targets, in the Lore Sheet, are always character names, not player names.


Each row contains 9 columns.

Columns A and B are the descriptive columns, they have no effect on this tool.

Columns C, D, E, F, and G are the conditional columns - they are compared to each of the actions in your Mafia. Each column returns TRUE or FALSE.

If all of the conditional columns in a row return TRUE, the row is considered to be "valid" and columns H and I are enacted - the effect columns. H adds and removes Condition and I sends a message.

For example - Amy_Player and Bob_Player are players in a game of mafia.

Amy_Player has the role "Mafioso", and she has the Conditions "mafia" and "immune".

Bob_Player has the role "Cop", and he has no Conditions.

The Lore Sheet for this example is as such:

Group Desc Sender SenderCond Action Target TargetCond ApplyCond Lore
player is dead % dead % %
Cop investigate Godfather mafia $tNAME is innocent.
Cop investigate % mafia $tNAME is mafia.
Cop investigate % $tNAME is innocent.
% ?investigate Cop beenInvestigated
% mafia kill % immune You tried to kill $tNAME but they were immune!
% mafia kill % You killed $tNAME!
% immune ?kill % mafia Someone tried to kill you, but you're immune!
% ?kill % mafia You have been killed!
% beenInvestigated @ -beenInvestigated

Amy_Player uses the action "kill Bob_Player".

Bob_player uses the action "investigate Amy_Player".

As the investigation options are above killing actions in the sheet, they are processed first, so Bob_Player's action goes first.

We'll skip the first row (the dead one) because it will obviously return false.

For the second row: Sender is "Cop". Bob_Player is a Cop, so this is TRUE.

SenderCond is blank, so this column is skipped and returns TRUE by default.

Action is "investigate". Bob_Player is indeed using the "investigate" ability so this returns TRUE.

Target is "Godfather". Bob_Player is targeting Amy_Player, who is a Mafioso (not a Godfather), so this returns FALSE.

TargetCond is "mafia". Amy_Player has the Condition "mafia" so this returns TRUE.

Because one of the conditions returned FALSE, the remaining two columns are not activated. Instead, the programme looks at the next row in the list.

In this row the only difference is Target, which is is "%". A target role is present (Mafioso) which matches "%", so this returns TRUE. This means that all of the conditions on this row are TRUE, and so the ApplyCond and Lore takes effect.

ApplyCond is blank, so nothing happens; and the message in Lore is sent to Bob_Player.

Before we move onto Amy_Player's action, the reverse action happens.

Amy_Player has been targeted with the "investigate" action by Bob_Player. Amy_Player has "used" the action ?investigate on Bob_Player.

We go down through the sheet until we find a


A Group Unused.
B Desc Unused.
C Sender For this row to be valid, the player who initiates this action must be playing as one of the roles listed here. Delimit multiple roles with a pipe ("|") or a new line (press Ctrl+Enter in the spreadsheet cell to make one). The symbol "%" means "any role", the same as writing down all of the roles in your mafia. Don't leave this column blank.
D SenderCond For this row to be valid, the sender must have all of the Conditions listed here. Delimit multiple Conditions with a pipe or a new line. Blank means "no Conditions needed". "%" cannot be used here.
E Action For this row to be valid, the player who initiates it must be using the action listed here. Each action must have its own row - eg "kills|eats" will count as one action, not two. "%" means "any action". Blank means "no action needed". "@" means this whole row will automatically occur for all players at the start of the next round. Prefixing with "?" inverts the sender and the target.
F Target For this row to be valid, the recipient of this action must have any of the roles listed here. Delimit multiple roles with a pipe or a newline. "%" means "any target". Blank means "no target needed".
G TargetCond For this row to be valid, the target must have all of the Conditions listed here. Delimit multiple Conditions with a pipe or a newline. Blank means "no Conditions needed". "%" cannot be used here.
H ApplyCond If this row is valid, the sender receives all of the Conditions listed here. Delimit with a pipe or a newline. Prefixing with "-" removes the Condition from the sender (if it is present) instead of adding it. Blank means "no Conditions added or removed".
I Lore If this row is valid, this string will be added to a message that the host should PM to the sender. Multiple pieces of lore generated in this way will be concatenated into a single message. "\n" will be replaced with a line break. As such, it is recommended to end all lore with "\n\n".
All of the sample Lore Sheets listed here are free to use, share and modify with or without credit.


ID: 1234567890123456789

Roles available

List the roles here


Brief description


Setup instructions

Super Simple

ID: 1AxTg5GPhvylhELHi60zzM3rrNrmiz1q3bUVWNwQ01Xw


A really simple mafia with only a few roles.


Godfather and Mafioso are the mafia - both have the action "kills" which kills a target.

A Doctor can prevent a kill using the "heals" action.

A Sheriff detects the alignment of a player with the "investigates" action but beware, a Godfather will appear innocent.

A Hooker distracts a player from their action with their roleblocking "distracts" action.


Do not assign any initial conditions.

Phase 0: Make all players do the action "initialise" with no target.