RimWorks.RimObs.Library
2.9.1
dotnet add package RimWorks.RimObs.Library --version 2.9.1
NuGet\Install-Package RimWorks.RimObs.Library -Version 2.9.1
<PackageReference Include="RimWorks.RimObs.Library" Version="2.9.1" />
<PackageVersion Include="RimWorks.RimObs.Library" Version="2.9.1" />
<PackageReference Include="RimWorks.RimObs.Library" />
paket add RimWorks.RimObs.Library --version 2.9.1
#r "nuget: RimWorks.RimObs.Library, 2.9.1"
#:package RimWorks.RimObs.Library@2.9.1
#addin nuget:?package=RimWorks.RimObs.Library&version=2.9.1
#tool nuget:?package=RimWorks.RimObs.Library&version=2.9.1
RimObs: RimWorld performance profiler and lag diagnostics
<img src="https://raw.githubusercontent.com/RimWorks/rimworld-observability-collector/main/About/ModIcon.png" alt="RimObs icon" width="96" align="right">
Find out which mod is eating your TPS. RimObs profiles a running RimWorld colony and records where every tick goes: timed sections, counters, gauges, histograms, GC events, allocation samples, and Harmony patch conflicts. An out-of-process collector aggregates the data, serves a dashboard, and exports diagnostic bundles.
Unlike Dubs Performance Analyzer, which shows a live readout for the session you are in, RimObs stores every session in a local database. Play once with a mod and once without, then diff the two hotspot tables and load orders to see what actually moved. Any session exports as a speedscope profile, and the collector exposes a Prometheus endpoint.
Mod authors register their own named sections and metrics, which land in the same dashboard as the game's.

For mod authors
Add the library:
dotnet add package RimWorks.RimObs.Library
Instrument a tick:
using RimWorks.RimObs.Api;
private static readonly SectionHandle Tick =
Obs.Profile.RegisterSection("tick");
public void Tick() {
using (Obs.Profile.Measure(Tick)) {
// ... your work ...
}
}
Section names are auto-prefixed with your mod's packageId. See the
Quickstart
for the full path from zero to dashboard.
For players
Subscribe to the Workshop item your other mods declare as a dependency. The collector launches automatically with the game and opens the dashboard in your browser. See Installation.
Documentation
- Mod-author quickstart
- Profile API and Metrics API
- Declarative
profiling.xml - Hot-path discipline
- Wire protocol and Local HTTP API
- Architecture
For contributors
The repo deliberately spans three .NET targets because each piece runs in a different host.
| Project | Target | Where it runs |
|---|---|---|
RimObs.Library/ |
net472 | Inside RimWorld's Unity Mono. Patches game code via Harmony. |
RimObs.Wire/ |
netstandard2.0 | Shared MessagePack types. Linked from both Library and Collector. |
RimObs.Collector/ |
net10.0 | Standalone daemon + CLI. Single self-contained binary per RID. |
RimObs.Dashboard/ |
Svelte 5 + Vite | Static SPA. Built once, embedded as resource in Collector.exe. |
Test projects (RimObs.Library.Tests/, RimObs.Collector.Tests/) are
net8.0 xUnit hosts; they exercise the library logic that is
RimWorld-independent.
Root layout
The non-obvious neighbors at the repo root exist because this is both a RimWorld mod and a multi-project .NET solution:
About/: RimWorld mod metadata (About.xml, Preview.png, loadFolders.xml).Assemblies/: RimWorld's deploy directory.RimObs.Librarybuilds straight here.RimObs.slnx: single solution so Rider/VS resolveRimObs.Wirefrom both net472 and net10.0 consumers.Makefile+make.ps1: seemake build,make test,make publish-collector.docs/wiki/: source for the wiki. Edit here, not on the wiki site; CI mirrors on push tomain.
Quick start
make build # SPA + full solution
make test # xUnit suites
make watch # collector hot-reload at :17654
make publish-collector # self-contained binaries for win/linux/osx
Conventions
- Hot-path discipline for
RimObs.Libraryis mandatory: zero allocation, exception-safe, no locks, noTask/asyncon the steady path. See Hot-path discipline for the full rules. - Wire protocol is MessagePack with per-batch
schema_version. Default port17654for HTTP and UDP in standalone mode; the first free port at or above25950when launched from the game. See Wire protocol.
More modding tools from RimWorks
| Tool | What it does |
|---|---|
| RimLogging | Structured logging, an in-game log viewer, and one-click bug report sharing |
| Pickle | Run Gherkin tests against a live RimWorld session, in the game |
| Quickstarts | Boot straight into a configured colony from the dev quicktest menu |
License
MIT. See LICENSE.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET Framework | net472 is compatible. net48 is compatible. net481 was computed. |
-
.NETFramework 4.7.2
- RimWorks.RimLogging (>= 2.27.1)
- RimWorks.RimObs.Wire (>= 2.9.1)
-
.NETFramework 4.8
- RimWorks.RimLogging (>= 2.27.1)
- RimWorks.RimObs.Wire (>= 2.9.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.9.1 | 96 | 9/10/2026 |
| 2.9.0 | 102 | 9/10/2026 |
| 2.8.0 | 107 | 9/8/2026 |
| 2.7.0 | 109 | 9/8/2026 |
| 2.6.2 | 113 | 9/7/2026 |
| 2.6.1 | 107 | 9/7/2026 |
| 2.6.0 | 102 | 9/7/2026 |
| 2.5.1 | 98 | 9/7/2026 |
| 2.5.0 | 100 | 9/7/2026 |
| 2.4.0 | 99 | 9/5/2026 |
| 2.3.4 | 107 | 9/5/2026 |
| 2.3.3 | 101 | 9/2/2026 |
| 2.3.2 | 103 | 9/2/2026 |
| 2.3.1 | 97 | 9/1/2026 |
| 2.3.0 | 95 | 9/1/2026 |
| 2.2.6 | 92 | 9/1/2026 |
| 2.2.5 | 105 | 9/1/2026 |
| 2.2.4 | 108 | 9/1/2026 |
| 2.2.3 | 99 | 9/1/2026 |
| 2.2.2 | 95 | 9/1/2026 |