Draft for review by a licensed attorney before publication.
Report a deck: policy and runbook
Effective [EFFECTIVE DATE]. Part 1 is the public-facing policy for Names Trainer. Part 2 is the internal runbook and should be kept with it so the policy stays true.
---
Part 1: Public policy
Who can report
Anyone. You do not need an account to report by email, and you do not need to be the person affected. Typical reasons:
- My photo or my child's photo is in a deck without permission.
- A deck contains private individuals, students, or minors and is published or being passed around.
- A deck is being used to harass, stalk, or demean someone, including through its notes.
- A deck contains a photo that infringes my copyright.
- A deck contains sexual, hateful, or otherwise unlawful content.
How to report
- In the app: open the deck, tap the more menu, choose "Report this deck", pick a reason, and add a short note. Reports go straight to us; the deck owner does not see who reported.
- By email: [CONTACT EMAIL], subject "Report". Include the deck link or title, what is wrong, and, if you are asking for your own photo to be removed, enough to identify it. We may ask you to confirm you are the person pictured or their parent or guardian; we will not ask for ID documents.
- Copyright: send a notice to [CONTACT EMAIL] with the information required by the DMCA or your local equivalent (the work, its location in the app, your contact details, a good-faith statement, and a signature).
What happens next
- We acknowledge within [2] business days.
- While we review, we may unpublish a reported deck or suspend its share link so it cannot spread. This is not a finding against the owner.
- We decide within [5] business days for most reports, and sooner for anything involving minors, sexual content, or a safety risk (target: same day).
- If the report is upheld, we remove the photo or the deck, tell the owner what was removed and why, and tell you the outcome. Removal from the cloud also removes the photos from our storage. Copies other people already installed on their own devices are outside our control, but we ask the owner to tell members to delete them.
- If the report is not upheld, we tell you why. You can reply with more information.
A deck that was never uploaded lives only on the owner's device, so we can only pass your request on if we know who the owner is.
Repeat offenders and abuse of reports
- A first upheld report usually results in removal and a warning.
- A second upheld report within 12 months, or any upheld report involving minors, harassment, or publishing private individuals, may result in losing the ability to publish or share decks.
- A third upheld report, or any severe case, results in account closure, and we may refuse future accounts.
- Reports made in bad faith (for example to harass a deck owner) count against the reporter in the same way.
Appeals
Email [CONTACT EMAIL] within 14 days with "Appeal" in the subject. A different person reviews it where we have one.
---
Part 2: Internal runbook
Who: [ON-CALL / OPERATOR NAME]. Where: the Supabase dashboard, the reports table, and the support mailbox [CONTACT EMAIL]. Never use the service_role key outside the dashboard or an Edge Function.
1. Intake (same day)
- In-app reports land in
public.reports(deck_id,reporter_id,reason,created_at). Check it daily; set up a dashboard alert or scheduled query so a new row pings [CONTACT EMAIL]. - Email reports: open a ticket with date, reporter, deck id or title, reason, and urgency. Reply with the acknowledgement template.
- Triage: P0 minors, sexual content, harassment, safety risk, or a law-enforcement or regulator request. P1 private individuals published or shared without consent; copyright. P2 attribution errors, spam, everything else.
2. Look, do not touch the evidence
- In the SQL Editor, read the deck row, its cards (names, notes,
image_path), visibility, whether ashare_tokenis set, members, and the owner (sign-in email under Authentication in the dashboard). - Save a short record (deck id, owner id, visibility, the card ids at issue, a screenshot if needed) in the private tracker, never in the repo.
3. Contain (P0 within hours, P1 within 2 business days)
- Unpublish:
update public.decks set visibility = 'private' where id = '<deck_id>';This blocks new readers. Existing members keep access, so for P0 also: - Cut members and rotate the link:
delete from public.deck_members where deck_id = '<deck_id>';thenupdate public.decks set share_token = gen_random_uuid() where id = '<deck_id>'; - Until an admin unpublish flow exists in the app, these SQL steps are the only way to unpublish a deck the owner will not.
4. Decide and act (within 5 business days)
- Remove a photo: delete the storage object
deck-photos/<deck_id>/<card_id>.jpgin the Storage browser, thendelete from public.cards where id = '<card_id>';. Deleting the row does not remove the file, so do both and confirm the object is gone. - Remove a deck: delete the storage folder
deck-photos/<deck_id>/first, thendelete from public.decks where id = '<deck_id>';(cards, members, installs, and progress cascade; reports keep theirdeck_idfor the log). - Not upheld: restore visibility if we changed it, and tell the reporter.
- Owner's device: the next sync detaches a vanished deck and drops deleted cards. The local copy persists if they never sync again; say so in the outcome email.
5. Notify
- Owner: what was removed, the rule it broke, how to appeal, and any strike. Send from the support mailbox, never a personal address.
- Reporter: the outcome, in general terms. Do not reveal the owner's identity to the reporter or vice versa.
6. Log and close
- Update the ticket: dates of each step, actions taken, SQL run, decision, and the owner's strike count.
- Strikes: keep a private table keyed by
owner_id. Two upheld in 12 months removes sharing (set every deck they own toprivateand note the account); three, or any severe case, closes the account through the account-deletion path and records the email to refuse re-signup. - Retention: reports and ticket records are kept [12 months] after closure, then deleted.
Templates
- Acknowledge: "Thanks for the report about [deck]. We'll review it within 5 business days. If this involves a minor or a safety concern, reply URGENT and we'll move faster."
- Upheld, to owner: "We removed [photo/deck] from Names Trainer because it [reason, citing Terms section 4]. Please ask anyone you shared it with to delete their copy. This counts as a strike; repeated strikes lead to losing sharing or your account. To appeal, reply within 14 days."
- Outcome, to reporter: "We've reviewed your report about [deck]. The content has been removed [or: it does not break our rules because ...]. Thank you for helping keep Names Trainer safe."