Last updated: 2026-06-19.
This document explains how user-generated content (UGC) in NavTrail is moderated. It exists to document our published moderation policy and to give users a clear picture of what they can expect. A copy is hosted publicly at https://navtrail.app/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@navtrail.app.
Four feature areas accept content from users:
| Feature | Free-text fields | Lifetime |
|---|---|---|
| Community POIs (camping, springs, viewpoints, refuges, tyre-repair shops) | 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 |
| Username (public handle) | username (3–20 chars, letters/numbers/underscore; shown on your POIs, hazards, and SOS alerts in place of an anonymous ID) | Permanent until the account is deleted |
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.NavTrail uses three complementary moderation layers, backed by an account model that strengthened in v1.2: browsing and posting POIs/hazards are anonymous by default, but a user can create a permanent, email-verified account — and sending an SOS now requires one. Because a verified email is needed to send an SOS, account-level enforcement (including removing the account of anyone who sends false SOS alerts) is a real deterrent, alongside the server-side controls below.
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@navtrail.app) reserves the right to:
These actions are taken in response to email reports at contact@navtrail.app or to proactive observation by the operator. Operator actions are logged but not publicly visible.
You can:
contact@navtrail.app with your user ID (visible in Settings → About) and we'll purge it within 30 days.If you find abusive content that wasn't auto-hidden by the in-app report action:
contact@navtrail.app 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://navtrail.app/moderation.