Last updated: 2026-05-19.
This document explains how user-generated content (UGC) in OverTrail RO is moderated. It exists to satisfy Google Play's UGC policy requirement for a published moderation policy and to give users a clear picture of what they can expect. A copy is hosted publicly at https://overtrail.ro/moderation (alongside the privacy policy).
If you have a question about a specific moderation decision or want to report content that the in-app flow doesn't cover, email contact@overtrail.ro.
Four feature areas accept content from users:
| Feature | Free-text fields | Lifetime |
|---|---|---|
| Community POIs (camping, springs, viewpoints, refuges, vulcanizări) | name (≤ 80 chars), description (≤ 800 chars) | Permanent until reported / deleted by creator |
| Hazard reports (fallen trees, landslides, etc.) | description (≤ 280 chars, optional) | 4 hours TTL, then auto-deleted |
| SOS alerts | description (≤ 280 chars, optional), contact_hint (≤ 80 chars, optional) | 24 hours TTL, then auto-resolved |
| Convoy nicknames | nickname (≤ 8 chars, visible only to fellow convoy members) | 12 hours after last activity |
Everything else (GPS tracks, downloaded map regions, tire-pressure calculator inputs, etc.) is stored only on the user's device.
contact_hint field on SOS alerts may contain the reporter's own contact info (e.g. their own phone number) but not anyone else's.OverTrail RO uses three complementary moderation layers. The user account model is anonymous (no email/password required); abusive users can therefore create new accounts, which is why server-side controls dominate over account-level enforcement.
Every POI name/description, hazard description, and SOS description/contact-hint passes through a server-side wordlist filter before insertion. The filter uses whole-word matching with Romanian diacritic folding (ă/â/î/ș/ț → a/a/i/s/t) to catch common bypass attempts. Content that matches the wordlist is rejected with the error content_blocked_profanity; the user sees a localized message asking them to rephrase.
Implementation: BEFORE INSERT triggers on pois, reports, sos_alerts in supabase/migrations/0010_ugc_moderation.sql.
The wordlist is intentionally narrow (severe slurs + common vulgarities, ~25 terms across Romanian and English). We err on the side of letting borderline content through; the report-and-auto-hide path below is the second line of defence.
Every UGC surface has a "🚩 Report content" action visible to all users except the creator:
Reports are immutable and visible only to the reporter (a user cannot see who else has reported a row). One report per user per row is enforced at the database layer.
When the count of distinct reporters for a given row reaches 3:
is_hidden flag flips to true; the POI disappears from the map for everyone except its creator. A 24-hour age safeguard prevents griefing of brand-new POIs.status flips to RESOLVED; the marker drops out of bbox queries and Realtime UPDATE removes it from open clients' maps.resolved_at is stamped with the current time; same removal effect.Triggers run as SECURITY DEFINER functions and stamp resolved_by_user_id = NULL so the audit log distinguishes system-resolution from human-resolution.
Implementation: poi_auto_hide_on_reports, report_auto_resolve_on_reports, sos_auto_resolve_on_reports.
Even content that nobody reports doesn't live forever:
Expired/resolved rows are purged by pg_cron jobs every 15 minutes to 1 hour, depending on the table.
For content that bypasses the automated layers (a single highly-toxic post that doesn't trip the wordlist and isn't seen by 3 other users), the operator (Constantin, contact@overtrail.ro) reserves the right to:
auth.users UUID (revoke its anonymous session and block re-creation from the same device by FCM token).These actions are taken in response to email reports at contact@overtrail.ro or to proactive observation by the operator. Operator actions are logged but not publicly visible.
You can:
contact@overtrail.ro with your anonymous user ID (visible in Settings → About) and we'll purge it within 30 days, along with any rows referencing it. An in-app delete-account flow is planned for a future release.If you find abusive content that wasn't auto-hidden by the in-app report action:
contact@overtrail.ro directly with a screenshot. We commit to first response within 48 hours and removal of clearly-violating content within 7 days.This policy may change as the app grows. Material changes will be announced in the app's release notes and reflected in the "last updated" date at the top of this document. The current version always lives at https://overtrail.ro/moderation.