ReportMe Documentation

Updated 2026-07-05

ReportMe
ReportMe $20.00

ReportMe turns Rust's native F7 report system into three things at once: a VIP perk (styled "you were reported" notifications), a player-retention signal (reporters get data-backed feedback instead of silence), and a working anti-cheat (F7 reports and BattleMetrics data feed automatic bans, with your established regulars protected).

Everything dangerous ships disabled or in shadow mode. This page covers installation, the report flow, the anti-cheat, and the full reference.

Requirements

  • A Rust server running Oxide (Carbon works via its Oxide compatibility layer; Oxide is the tested path)
  • No required dependencies. Optional: PlaytimeTracker for lifetime playtime that survives wipes; a free Steam Web API key; a BattleMetrics API token for enrichment and the anti-cheat

Installation

  1. Download ReportMe.cs from your delivery email, or any time from My Downloads in the top bar.
  2. Drop the file into oxide/plugins/. It compiles and loads automatically, and works immediately with zero configuration.
  3. Grant permissions to your groups:
oxide.grant group admin reportme.admin
oxide.grant group vip reportme.vip

The reporter-feedback permission (reportme.notify.reporter) is granted to the default group automatically on load (config: AutoGrantReporterPerm).

How the Report Flow Works

Players report through Rust's native F7 menu — there's nothing new for them to learn. When a report is filed:

  • The reporter gets an on-screen acknowledgment based on the target's trust data — "This player has 2,400 hours in Rust and their account is 8 years old. We take all reports seriously." Low-trust targets show as "flagged and under review." No data available still gets a thank-you.
  • The target, if they hold reportme.vip, sees a styled banner naming the reporter and reason — "PlayerName reported you for cheating — must be doing something right." Color-coded by report type (red cheating, orange rules, yellow abuse), with an optional sound.
  • Admins get escalation chat alerts as unique reporters accumulate: NOTIFY at 3, ESCALATION at 5, CRITICAL at 8 unique reporters in 24 hours (all configurable).

Duplicate reports (same reporter, same target) within 24 hours are silently dropped. Self-reports and NPC reports are ignored. Report history is capped at 100 entries per player and pruned after 90 days (both configurable).

Commands

Chat

Command Permission What it does
/reportme reportme.vip or admin Your own report history, trust score, and stats
/reportme <name or steamid> reportme.admin Full admin panel for any player

The command word is configurable — change it in the config or live from the panel's Settings tab.

Console (require reportme.admin or server console)

Command What it does
reportme list Top 20 most-reported players (24h count, then lifetime)
reportme player <steamid> Full report history for a player
reportme trust <steamid> Trust score breakdown with every factor and weight
reportme why <steamid> The full anti-cheat evidence bundle behind a ban — your go-to for appeals
reportme check <steamid> Run the connect-gate risk check on demand
reportme ban <steamid> [reason] Manual ban through the same pipeline as auto-bans (local + BattleMetrics + Discord alert)
reportme unban <steamid> Reverse the local ban and the BattleMetrics ban together
reportme clear <steamid> Clear all reports for a player
reportme selftest Validate your BattleMetrics token, API scope, and ban config — run this after setup

Permissions

Permission Grants
reportme.admin All console commands, any player's panel, admin tabs (Trust, Info, Settings), anti-cheat alerts. Admins are never subjected to the connect gate
reportme.vip Report notifications + /reportme for own history and trust score. Sell it as a VIP perk
reportme.notify.reporter Reporter acknowledgment banners. Auto-granted to everyone by default

The Admin Panel

/reportme <player> opens a tabbed CUI:

  • Overview — anti-cheat verdict front and center: risk status, report-ban threshold and immunity state, network + global BattleMetrics hours, KDR, and every linked banned account with ban recency
  • Reports — scrollable history (30 most recent), color-coded by type, with reporter, subject, and detail text
  • Trust (admin) — the full score breakdown: each positive and negative factor with its contribution
  • Info (admin) — command, permission, and setup reference in-game
  • Settings (admin) — live toggles for data sources, Discord options, and the chat command, plus API key and webhook status — no config file editing

Trust Scoring

Every player gets a 0.0–1.0 trust score from whatever data is available: server playtime (self-tracked, or PlaytimeTracker if installed), Steam Rust hours and account age (with a Steam key), BattleMetrics cross-server hours (with a BM token), report density over the last 30 days, and a small penalty for private profiles. The weights rebalance automatically based on which sources are configured — zero-config scoring uses playtime and report density alone.

The Anti-Cheat

Two independent enforcement paths share one ban pipeline, one evidence format, and one set of alerts. Both are off by default.

Connect gate

When an account connects, ReportMe resolves it against BattleMetrics and examines the accounts linked to it by shared residential IPs:

  • VPN, datacenter, Tor, and mobile-carrier (CGNAT) IPs are discarded before any linking happens — a built-in mobile-carrier ASN list plus BattleMetrics' own connection flags handle the false-link risk from phone hotspots and cloud gaming
  • A ban requires a cheater cluster: at least 2 banned linked accounts AND more than a third of the account's links banned. One old banned alt on a shared IP does not ban anyone
  • Accounts with real hours (500+ global or 100+ on your network) are softened to a watchlist flag instead of a ban
  • Results are cached for 12 hours; admins are exempt

The logic: a currently-banned account can't connect at all (EAC blocks it), so the tell for a cheater's fresh account is the ban history of its linked alts.

Report-path auto-ban

Sustained F7 pressure bans the target when unique 24-hour reporters reach a dynamic threshold (base 5, never below 3, capped at 6). The threshold drops for hot targets — high KDR (only counted after 25+ kills) and linked ban history — and rises for established players. Report immunity: 1,000+ global BattleMetrics hours or 100+ network hours makes a player immune to report bans entirely, pierced only by a recently banned linked alt. Report brigades don't take down your regulars.

Enforcement modes

Mode Behavior
Off Gate inert
Log (default) Shadow mode — logs and alerts exactly what it would ban, with full evidence, without touching anyone
Enforce Local ban + BattleMetrics ban, Discord alert, admin alert. The player sees only a generic message with your appeal URL — evidence stays in the ban record and Discord

Recommended rollout: configure, leave on Log for a few days, read the would-ban alerts, then flip to Enforce.

Anti-cheat setup

  1. Get a BattleMetrics API token and set it in the config (DataEnrichment.BattleMetricsAPIToken).
  2. Fill in Banning.BattleMetrics: your BM organization ID, ban list ID, and server ID. Add your BM server IDs to ConnectGate.OrgServerIds so network hours count.
  3. Set your appeal URL (shown to banned players) — e.g. https://discord.fragmod.com for our own servers; use your community's Discord.
  4. Run reportme selftest in console. It validates the token, its API scope, and the ban config, and fails loudly if anything is missing.
  5. Enable the connect gate in Log mode, watch for a few days, then switch EnforcementMode to Enforce.

Note on data: the alt graph comes from BattleMetrics' IP identifier records, which are collected from RCON-connected servers. Connect-time detection is strongest for organizations already running BattleMetrics RCON, and improves further with BM data-sharing agreements — the more organizations share, the more alt history the gate can see.

Discord Integration

Three webhook slots, each optional:

Webhook Receives
Report Every F7 report — reporter, target, reason, trust score, hours, account age
Escalation NOTIFY / WARNING / CRITICAL threshold alerts, with @here on the top tiers
Ban Anti-cheat verdicts and applied bans, with the full evidence bundle: linked-account ratio, hours, KDR, and each banned alt with recency

Unset webhooks fall back down the chain (Ban → Escalation → Report). Want bans only? Set only the Ban webhook and leave the other two empty. Player links in embeds point to BattleMetrics RCON profiles.

Key Config Settings

The config is created at oxide/config/ReportMe.json. The highlights (most of these are also editable live from the panel's Settings tab):

Setting Default What it does
General.ChatCommand reportme The chat command word
General.DuplicateWindowHours 24 Dedup window per reporter/target pair
Notifications.AdminEscalation thresholds 3 / 5 / 8 Unique 24h reporters for NOTIFY / ESCALATION / CRITICAL
DataEnrichment.SteamAPIKey empty Adds Rust hours + account age to trust and feedback
DataEnrichment.BattleMetricsAPIToken empty Adds cross-server hours; required for the anti-cheat
Banning.LocalBan true Local server ban on enforcement
Banning.BattleMetrics.Enabled false Also issue BattleMetrics bans (needs OrgId, BanListId, ServerId)
ConnectGate.Enabled false Master switch for the connect gate
ConnectGate.EnforcementMode Log Off / Log (shadow) / Enforce
ConnectGate.AltEvaluation.MinBannedLinksToBan 2 Banned linked accounts required for a cluster ban
ConnectGate.AltEvaluation.BannedRatioThreshold 0.3334 Fraction of links that must be banned
ReportBan.Enabled false Master switch for report-path auto-bans
HoursTrust.ReportImmunityGlobalHours 1000 Global BM hours for report-ban immunity
HoursTrust.ReportImmunityNetworkHours 100 Network hours for report-ban immunity

Report data lives in oxide/data/ReportMe/ReportMe.json — saved asynchronously with atomic writes every 5 minutes and on unload, so a crash loses at most 5 minutes of session data.

The Config We Run in Production

This is the configuration running on the Frag Mod US production server — the real file, with keys and IDs replaced by placeholders. It did not start on Enforce: the gate ran in Log (shadow) mode until its would-ban alerts matched our manual bans, then we flipped it and enabled ReportBan at the same time. Do the same on your server.

{
  "General": {
    "MaxReportHistory": 100,
    "PruneDaysOld": 90,
    "ShowTrustToPlayers": true,
    "DuplicateWindowHours": 24,
    "ChatCommand": "reportme",
    "AutoGrantReporterPerm": true
  },
  "Notifications": {
    "VIP": {
      "Enabled": true,
      "Duration": 10.0,
      "SoundEnabled": true,
      "SoundID": "assets/bundled/prefabs/fx/notice/loot.copy.fx.prefab"
    },
    "Reporter": {
      "Enabled": true,
      "Duration": 5.0,
      "SoundEnabled": true,
      "SoundID": "assets/bundled/prefabs/fx/notice/item.select.fx.prefab",
      "NotifyReporterOfVIP": false
    },
    "AdminEscalation": {
      "NotifyThreshold": 3,
      "EscalateThreshold": 5,
      "CriticalThreshold": 8,
      "SoundEnabled": true
    }
  },
  "TrustScoring": {
    "Enabled": true,
    "Baseline": 0.5,
    "ServerPlaytimeBaselineHours": 10.0,
    "RustHoursBaseline": 500.0,
    "AccountAgeMaxYears": 5.0,
    "BMHoursBaseline": 500.0,
    "ReportDecayDays": 30,
    "PrivateProfilePenalty": 0.05
  },
  "DataEnrichment": {
    "SteamAPIKey": "YOUR-STEAM-API-KEY",
    "BattleMetricsAPIToken": "YOUR-BATTLEMETRICS-API-TOKEN",
    "CacheRefreshHours": 24,
    "UseSteamHours": true,
    "UseSteamAccountAge": true,
    "UseBattleMetricsHours": true
  },
  "Discord": {
    "ReportWebhookURL": "",
    "EscalationWebhookURL": "",
    "BanWebhookURL": "YOUR-DISCORD-WEBHOOK-URL",
    "IncludeSteamProfileLink": true,
    "MentionOnEscalation": true
  },
  "Banning": {
    "LocalBan": true,
    "BroadcastOnBan": false,
    "BattleMetrics": {
      "Enabled": true,
      "OrgId": "YOUR-BM-ORG-ID",
      "BanListId": "YOUR-BM-BAN-LIST-ID",
      "ServerId": "",
      "DurationDays": 0,
      "AutoAddEnabled": true
    }
  },
  "ConnectGate": {
    "Enabled": true,
    "EnforcementMode": "Enforce",
    "RecheckAfterHours": 12,
    "MaxConcurrentChecks": 4,
    "KickDelaySeconds": 5.0,
    "AppealURL": "YOUR-DISCORD-INVITE",
    "OrgServerIds": [
      "YOUR-BM-SERVER-ID-1",
      "YOUR-BM-SERVER-ID-2"
    ],
    "AltEvaluation": {
      "RecentBanMonths": 6,
      "HeatBanMonths": 24,
      "BannedRatioThreshold": 0.3334,
      "MinBannedLinksToBan": 2,
      "RejectProxy": true,
      "RejectDatacenter": true,
      "RejectTor": true,
      "RejectBlockFlag": true,
      "RejectMobile": true,
      "ExtraMobileAsns": [],
      "MaxAltsToCheck": 15
    },
    "Actions": {
      "SingleAltSoftenGlobalHours": 500.0,
      "SingleAltSoftenNetworkHours": 100.0,
      "BroadcastOnBan": false,
      "AdminAlert": true,
      "DiscordAlert": true
    }
  },
  "HoursTrust": {
    "BmGlobalTier1Hours": 500.0,
    "BmGlobalTier1Bonus": 1,
    "BmGlobalTier2Hours": 1000.0,
    "BmGlobalTier2Bonus": 2,
    "NetworkTier1Hours": 50.0,
    "NetworkTier1Bonus": 1,
    "NetworkTier2Hours": 200.0,
    "NetworkTier2Bonus": 2,
    "VeteranAccountAgeYears": 3.0,
    "VeteranBonus": 1,
    "ReportImmunityGlobalHours": 1000.0,
    "ReportImmunityNetworkHours": 100.0
  },
  "ReportBan": {
    "Enabled": true,
    "BaseUniqueReporters": 5,
    "MinUniqueReporters": 3,
    "HighHeatFloor": 2,
    "HighHeatReductionMin": 3,
    "MaxThreshold": 6,
    "LinkedBanHeatReduction": 2
  },
  "KdrHeat": {
    "Enabled": true,
    "MinKillsForKdr": 25,
    "Tiers": [
      { "Kdr": 3.0, "Reduce": 1 },
      { "Kdr": 5.0, "Reduce": 2 },
      { "Kdr": 8.0, "Reduce": 3 }
    ]
  }
}

What's different from the defaults, and why:

Setting Default Production Why
ConnectGate.Enabled + EnforcementMode off / Log on / Enforce Graduated from shadow mode after it matched our manual bans
ReportBan.Enabled false true Report pressure bans work once immunity protects your regulars
Banning.BattleMetrics.Enabled false true One command reverses local + BM bans together on appeal (we leave ServerId empty and ban at the org level via the ban list)
Discord webhooks all empty ban webhook only Reports in Discord are noise on a busy server; the bans channel is the one you check
Notifications.Reporter.Duration 15 5.0 Five seconds is enough to read the acknowledgment

Everything else runs stock. The alt-evaluation thresholds, KDR tiers, and trust baselines are the calibrated defaults — change them only after shadow mode gives you a reason to.

Developer API

Other plugins can query ReportMe via plugins.Call():

Method Returns Description
API_GetTrustScore(ulong steamid) float Trust score 0.0–1.0 (0.5 baseline if unknown)
API_GetTrustLabel(ulong steamid) string "High", "Moderate", "Below Average", or "Low"
API_GetReportCount(ulong steamid) int Lifetime deduplicated report count
API_GetRecentReportCount(ulong steamid, int days) int Reports in the last N days
API_GetUniqueReporterCount24h(ulong steamid) int Unique reporters in the last 24 hours
API_GetPlaytimeSeconds(ulong steamid) double Tracked server playtime in seconds

Use cases: queue priority, VIP tiers, custom dashboards, Discord bots.

Support

Questions or issues: DM 1928tommygun on Discord — include your server version and any relevant error logs. See also the Payback documentation for the punishment side of the anti-cheat stack.