ZipGuard data statement

Generated from schema.sql by pnpm data-statement. CI fails when this file is stale, so it cannot drift from what the code stores.

Never stored

IP addresses, browser or device fingerprints, email addresses, phone numbers, account connections, membership of other servers, message content.

Stored

guilds

settings for one server. Holds no member data.

ColumnTypePurposeIdentifies a member
guild_idTEXTDiscord server ID
log_channel_idTEXTchannel that receives verdict logs
verify_channel_idTEXTchannel that holds the challenge button
quarantine_role_idTEXTrole applied while a member is held
medium_thresholdINTEGERscore at or above this gets a challenge
high_thresholdINTEGERscore at or above this gets the high action
high_actionTEXTflag, timeout, kick or ban
shadow_untilINTEGERunix ms; verdicts are log-only until then
antinukeINTEGER1 = revert mass channel and role deletes and strip the actor, 0 = off
linksINTEGER1 = quarantine scam-link patterns from existing members, 0 = off
digest_atINTEGERunix ms of the last weekly digest posted to the log channel
pilot_channel_idTEXTchannel that receives pilot applications (the operator's server only)
created_atINTEGERunix ms when /setup first ran

pilot

servers that applied for the private pilot and whether they were let in. Applicant details stay on the website host.

ColumnTypePurposeIdentifies a member
guild_idTEXTDiscord server ID from the application
server_nameTEXTserver name as typed on the form
statusTEXTpending, approved or rejected
created_atINTEGERunix ms the application arrived
decided_atINTEGERunix ms of the decision
decided_byTEXTDiscord user ID of the moderator who decidedyes

joins

one row per join event, plus one per quarantine of an existing member. Deleted after 90 days.

ColumnTypePurposeIdentifies a member
idINTEGERrow id
guild_idTEXTserver joined
user_idTEXTDiscord user ID of the joineryes
joined_atINTEGERunix ms of the join event
account_created_atINTEGERunix ms, derived from the user ID
invite_codeTEXTinvite used, when the bot could tell
scoreINTEGERrisk score 0 to 100
reasonsTEXTJSON list of the rules that fired, with their text
bandTEXTlow, medium or high
actionTEXTnone, shadow, challenge, flag, timeout, kick, ban or quarantine
scored_msINTEGERms from join event to verdict
challenge_sent_atINTEGERunix ms the challenge was offered
challenge_answered_atINTEGERunix ms the member clicked the button
log_message_idTEXTmessage ID of the log entry, so it can be updated
verdictTEXTmod override: approve, kick or ban
verdict_byTEXTDiscord user ID of the mod who overrodeyes
verdict_atINTEGERunix ms of the override

appeals

what a held member wrote to the moderators. Deleted with its join row.

ColumnTypePurposeIdentifies a member
idINTEGERrow id
join_idINTEGERthe join being appealed
user_idTEXTDiscord user ID of the member appealingyes
textTEXTthe appeal, 500 characters at most
created_atINTEGERunix ms

Retention and deletion