Moderation Policy

Status: v1, September 2026, adopted. Written alongside the backend so the Report button has something real behind it from the start. The response times, staffing trigger, appeals handling, law-enforcement stance and retention periods below are settled policy, not proposals.

One thing this document does deliberately: it describes the process we actually run today with one reviewer, rather than the process we would like to advertise. Where a protection does not yet exist, it says so.


Why this exists before launch

KeepLuna asks women to meet strangers in person. That is the product. It means a moderation process is not a compliance checkbox to add later; it is part of the core offering, and the scope document is explicit that a real review process must be live before the app opens to the public.

This document covers what gets someone removed, who decides, how fast, and how a person who thinks we got it wrong can say so.


What is not allowed

Grouped by how fast we act, not by how bad they sound.

Immediate removal, no warning

Warning, then removal on repeat

Not a violation

To be explicit, because over-moderation of queer people is a real and documented pattern and this app is disproportionately exposed to it:


How enforcement works

1. A report is filed

Filing a report immediately blocks the reported member for the reporter. Nobody has to keep seeing someone while waiting on a decision. This is automatic (actions.reportactions.block).

The reasons offered map to a priority (src/actions.js): harassment, hate speech, unwanted sexual content, threats, under-18, and off-platform harm are urgent; fake profiles and solicitation are normal.

2. Automatic pause, if several people independently report

When three different members have open or upheld reports against the same account, it is automatically suspended pending review (moderation.autoSuspendIfNeeded, threshold AUTO_SUSPEND_DISTINCT_REPORTERS).

Deliberate limits on this:

3. Human review

A person works the queue (GET /admin/reports), urgent first, oldest first within a priority. The reviewer sees the report, the reported profile, and how many total reports exist against that account.

Every report gets a human look within 24–48 hours.

That is the commitment for all reports, urgent and normal alike. Urgent ones are still worked first inside that window, but the promise is one number rather than two, because one number is what a single reviewer can actually keep.

We do not promise same-day review. A same-day promise would be broken the first time a report arrived on a Friday evening, and a moderation commitment that quietly fails is worse than a slower one that holds.

When a second reviewer gets hired

At current scale that reviewer is Rachel. Staffing is revisited when either of these is true, whichever comes first:

Naming the trigger in advance is the point. The failure mode for a solo-run queue is not a sudden collapse; it is a slow slide where response times drift and the person running it is too close to it to notice.

4. The decision

Every decision writes an auditable row to moderation_actions: who acted, what they did, why. Outcomes: warn, suspend, ban, dismiss.

Data is not deleted at the moment of a decision. A suspension is reversible, so a suspended account keeps everything. A ban starts the clock described under How long we keep things below: the account's data is held through the 90-day appeal window and then purged down to a hashed identifier.

Either way the member keeps the right to export their own data while it exists, and a deletion request is honoured immediately rather than waiting out the window.


Appeals

Any member who is suspended or banned can appeal by emailing gokeepapps@gmail.com. That address appears in the message shown to a locked-out account, since they cannot reach an in-app form.

There is currently no independent appeals process

Stated plainly, because members deserve to know what they are getting: KeepLuna has one reviewer. An appeal is read by the same team that made the original decision. It is a second look, not an independent one, and we are not going to call it independent when it isn't.

We commit, in writing, to building a genuinely independent appeals process, one where the person reviewing an appeal is not the person who made the original call, as soon as there is more than one reviewer. That is tied to the same staffing trigger above, and it is the first thing a second reviewer is for.

How an appeal is handled


Identity verification and failure

Verification is via Didit. A failed check does not remove an account. The member simply does not get the verified badge, keeps their data, and can retry.

This is deliberate. Document and face matching misreads trans and gender non-conforming people more often than anyone else, and auto-removing on a provider's failure signal would land hardest on exactly the members this app exists for.


Law enforcement

We respond to valid legal process only. A real subpoena, court order, or warrant gets a response. An informal request does not: an officer emailing to ask who someone is, a request with no legal instrument behind it. This matters more than usual for an app whose membership is itself sensitive information: being a KeepLuna member says something about a person that they may not have told anyone else.

Separately, and without waiting to be asked: we may proactively report a credible, imminent threat to someone's physical safety to law enforcement. That exception is deliberately narrow. "Credible" and "imminent" both have to be true: a specific, believable threat to a specific person, not a general worry and not something that reads badly out of context.

There is no proactive monitoring beyond that. We do not read member content looking for things to report. We do not scan messages, bios, or activity for anything, by hand or automatically. What reaches a reviewer is what a member chose to report.


How long we keep things

Data attached to a report

Kept through the review, plus a 90-day appeal buffer after resolution, then deleted. The buffer exists so an appeal can be assessed against the evidence that produced the decision. An appeals process that has already deleted the record it is meant to reconsider is theatre.

Removed and banned accounts

A ban does not purge the account on the spot. The data is held through the same 90-day appeal window, because an appeal cannot be assessed against a record that has already been destroyed, and is then deleted down to a hashed identifier.

That identifier is enough to recognise the same person attempting to sign up again, and not enough to reconstruct who they were. Everything else goes: name, photo, bio, interests, location, saves and skips.

This is the narrowest thing that still does the job. A banned account exists in our records as an opaque fingerprint, not as a person.

Everything else

Active accounts keep their data until the member deletes it. Deletion is available in-app and removes the profile outright; the two exceptions above are the only things that survive it, and the privacy policy says so in the same terms.


What is deliberately not built

Named so nobody assumes otherwise:


Reviewing this policy

These decisions were made at a specific scale: one reviewer, pre-launch, no users yet. The staffing trigger above is the moment to re-read the whole document, not just the staffing line: response times, the auto-pause threshold, and the appeals commitment all assume a queue one person can hold in their head.

Two things worth a lawyer's eye before public launch, neither of which is an open product question: the retention periods against GDPR and CCPA obligations, and the law-enforcement section against the jurisdictions Keep Apps LLC operates in.