Snitch

v1.7.0·Updated 2026-09-06

A performance profiler - measure the cost + state of NPCs, trash, quests and your own mods, with a per-mod panel in the Hotline overlay, a live web dashboard, and a phone remote (scan a QR to drive it

About this mod Author’s original text

Snitch

A performance profiler for Schedule I - find out what's actually slow.

🛟 Need help or found a bug? Get support at support.doodesch.de/snitch.

Snitch measures the cost and state of NPCs, trash, quests, and - through a tiny no-op API - any other

mod's systems. Its in-game panel lives in the Hotline overlay (each mod gets its own panel), alongside a

combined log timeline and a live web dashboard so you can see frame times, section costs, and entity-state

distributions in real time, and make your mod (or vanilla gameplay) faster.

Live dashboard · Wiki / docs · Modder example · Support

Features

  • Frame time distribution + fps + GC pressure - the load-bearing, build-independent truth.
  • Section costs - time named code sections (yours, or vanilla hot paths like NPCMovement.Update).
  • Unattributed time - an (unattributed) row for the part of a frame that ran inside no section at all, and how much of your worst frames it cannot explain.
  • Harmony patch timing - snitch patches on times every other mod's prefixes, postfixes and finalizers under the mod that owns them.
  • State distributions - NPCs by movement/visibility, trash by physics state, quests by state, + your own.
  • Per-mod panels - each mod that reports data gets its own toggleable, movable, resizable panel (counters, state, text, buttons, toggles).
  • Log timeline - a combined, chronological view of every mod's log output, filterable per mod.
  • Ablation A/B - toggle a subsystem off and measure the real frame-time delta (causal "total cost").
  • Live web dashboard - opens straight to your local game over WebSocket; telemetry never leaves your PC.
  • Phone remote - scan a QR (dashboard or in-game panel) to drive the profiler from your phone: FPS, Start/Stop/Reset, and every mod's actions and toggles. Same Wi-Fi or across networks, end-to-end encrypted.
  • Honest - every number self-certifies; Snitch even reports its own overhead.
  • Modder API - a zero-overhead no-op when Snitch isn't installed; no hard dependency.

Requirements

| Requirement | Notes |

|---|---|

| MelonLoader | 0.7.x (IL2CPP) |

| S1API | ifBars-S1API_Forked |

| Hotline | The in-game overlay framework Snitch's panel renders in (auto-installed as a dependency). |

Use it

Install Hotline (pulled in as a dependency) and press F6 for its overlay; Snitch's panel is inside,

with Start/Stop/Reset and live stats. Then snitch start (or the Start button on the panel). Or open the web

dashboard at snitch.doodesch.de - it auto-connects and shows everything live.

Console verbs: `start, stop, status, frame, top, sections, states, counters, unattributed,

patches on|off|list, panels, act, toggle, log, vanilla on|off, ablate, levers, report`.

Reports go to Mods/Snitch/runs.

For modders

Your mod's OnUpdate etc. are auto-timed with zero code (.OnUpdate). For more, drop in Snitch.cs

(or reference Snitch.Api.dll) - a no-op when Snitch isn't installed:

using Snitch.Api; // Profiler, Panel, StateSnapshot

Panel p = Profiler.RegisterPanel("MyMod", "My Mod"); // your own panel in the overlay + dashboard

p.Counter("Queue", () => _q.Count, "items"); // a gauge

p.Action("Flush", () => Flush()); // a button (replaces a debug hotkey)

p.Toggle("Verbose", () => _v, x => _v = x); // an on/off control

using (Profiler.Sample("MyMod.Work")) {... } // hand-time a sub-section

Or just name a class SnitchProbe with a static Register() - Snitch discovers and calls it automatically.

Full example: ScheduleOne-SnitchExample.

Notes

ProfilerRecorder engine counters are inert in Schedule I's IL2CPP build, so Snitch relies on frame-time + GC

and self-measured section timing. Profiling is local and safe in multiplayer; state-mutating features run

host-only. Everything is idle until you snitch start.

Credits

Built by DooDesch on S1API.

Install & use Install: follow the bundled instructions

  1. Unzip the archive from playbuff and read the bundled readme / instructions first.
  2. Most mods rely on the game's mod loader — the usual route is a community mod manager (such as r2modman): pick this game, install, and it handles the loader and dependencies.
  3. For a manual install, put the mod files into the matching Mod / plugins folder inside the game directory.
  4. Launch the game to confirm it loaded; mods with listed dependencies need those installed as well.

Install locations vary a lot between mods — the bundled readme is the most reliable guide.

Dependencies

Install these first, or the mod will not work:

LavaGang-MelonLoaderifBars-S1API_ForkedDooDesch-Hotline

File & checksum

Filename
Snitch-1.7.0.zip
File size
223.6 KiB