RimWorks.RimObs.Wire
2.9.1
dotnet add package RimWorks.RimObs.Wire --version 2.9.1
NuGet\Install-Package RimWorks.RimObs.Wire -Version 2.9.1
<PackageReference Include="RimWorks.RimObs.Wire" Version="2.9.1" />
<PackageVersion Include="RimWorks.RimObs.Wire" Version="2.9.1" />
<PackageReference Include="RimWorks.RimObs.Wire" />
paket add RimWorks.RimObs.Wire --version 2.9.1
#r "nuget: RimWorks.RimObs.Wire, 2.9.1"
#:package RimWorks.RimObs.Wire@2.9.1
#addin nuget:?package=RimWorks.RimObs.Wire&version=2.9.1
#tool nuget:?package=RimWorks.RimObs.Wire&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 | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on RimWorks.RimObs.Wire:
| Package | Downloads |
|---|---|
|
RimWorks.RimObs.Library
RimObs mod-side library: performance profiling and telemetry for RimWorld mods. Register named sections and metrics; the out-of-process collector aggregates the data and serves a dashboard. Net472 / net48, RimWorld 1.6+. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.9.1 | 107 | 9/10/2026 |
| 2.9.0 | 106 | 9/10/2026 |
| 2.8.0 | 108 | 9/8/2026 |
| 2.7.0 | 114 | 9/8/2026 |
| 2.6.2 | 120 | 9/7/2026 |
| 2.6.1 | 110 | 9/7/2026 |
| 2.6.0 | 111 | 9/7/2026 |
| 2.5.1 | 108 | 9/7/2026 |
| 2.5.0 | 109 | 9/7/2026 |
| 2.4.0 | 107 | 9/5/2026 |
| 2.3.4 | 117 | 9/5/2026 |
| 2.3.3 | 107 | 9/2/2026 |
| 2.3.2 | 103 | 9/2/2026 |
| 2.3.1 | 94 | 9/1/2026 |
| 2.3.0 | 103 | 9/1/2026 |
| 2.2.6 | 94 | 9/1/2026 |
| 2.2.5 | 103 | 9/1/2026 |
| 2.2.4 | 111 | 9/1/2026 |
| 2.2.3 | 94 | 9/1/2026 |
| 2.2.2 | 99 | 9/1/2026 |