{"id":50363650,"url":"https://github.com/cryptiklemur/rimworld-observability-collector","last_synced_at":"2026-05-30T03:00:41.445Z","repository":{"id":360717310,"uuid":"1245104123","full_name":"cryptiklemur/rimworld-observability-collector","owner":"cryptiklemur","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-27T14:55:23.000Z","size":854,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-27T16:26:14.341Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cryptiklemur.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-20T23:11:46.000Z","updated_at":"2026-05-27T15:05:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cryptiklemur/rimworld-observability-collector","commit_stats":null,"previous_names":["cryptiklemur/rimworld-observability-collector"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/cryptiklemur/rimworld-observability-collector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptiklemur%2Frimworld-observability-collector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptiklemur%2Frimworld-observability-collector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptiklemur%2Frimworld-observability-collector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptiklemur%2Frimworld-observability-collector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cryptiklemur","download_url":"https://codeload.github.com/cryptiklemur/rimworld-observability-collector/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptiklemur%2Frimworld-observability-collector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33678271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-30T03:00:22.218Z","updated_at":"2026-05-30T03:00:41.434Z","avatar_url":"https://github.com/cryptiklemur.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RimWorld Observability Collector\n\n[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=cryptiklemur_rimworld-observability-collector\u0026metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=cryptiklemur_rimworld-observability-collector)\n[![Reliability Rating](https://sonarcloud.io/api/project_badges/measure?project=cryptiklemur_rimworld-observability-collector\u0026metric=reliability_rating)](https://sonarcloud.io/summary/new_code?id=cryptiklemur_rimworld-observability-collector)\n\nA telemetry framework for RimWorld mods. Mod authors register named sections\nand metrics; an out-of-process collector aggregates the data, serves a\ndashboard, and can export diagnostic bundles.\n\n[**Full documentation --\u003e**](https://github.com/cryptiklemur/rimworld-observability-collector/wiki)\n\n## For mod authors\n\nAdd the library:\n\n```bash\ndotnet add package CryptikLemur.RimObs.Library\n```\n\nInstrument a tick:\n\n```csharp\nusing Cryptiklemur.RimObs.Api;\n\nprivate static readonly SectionHandle Tick =\n    Obs.Profile.RegisterSection(\"tick\");\n\npublic void Tick() {\n    using (Obs.Profile.Measure(Tick)) {\n        // ... your work ...\n    }\n}\n```\n\nSection names are auto-prefixed with your mod's `packageId`. See the\n[Quickstart](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Mod-Author-Quickstart)\nfor the full path from zero to dashboard.\n\n## For players\n\nSubscribe to the Workshop item your other mods declare as a dependency. The\ncollector launches automatically with the game and opens the dashboard in your\nbrowser. See [Installation](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Installation).\n\n## Documentation\n\n- [Mod-author quickstart](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Mod-Author-Quickstart)\n- [Profile API](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Profile-API) and [Metrics API](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Metrics-API)\n- [Declarative `profiling.xml`](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Profiling-XML)\n- [Hot-path discipline](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Hot-Path-Discipline)\n- [Wire protocol](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Wire-Protocol) and [Local HTTP API](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Local-HTTP-API)\n- [Architecture](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Architecture)\n\n## For contributors\n\nThe repo deliberately spans three .NET targets because each piece runs in a\ndifferent host.\n\n| Project              | Target          | Where it runs                                                       |\n| -------------------- | --------------- | ------------------------------------------------------------------- |\n| `RimObs.Library/`    | net48           | Inside RimWorld's Unity Mono. Patches game code via Harmony.        |\n| `RimObs.Wire/`       | netstandard2.0  | Shared MessagePack types. Linked from both Library and Collector.   |\n| `RimObs.Collector/`  | net10.0         | Standalone daemon + CLI. Single self-contained binary per RID.      |\n| `RimObs.Dashboard/`  | Svelte 5 + Vite | Static SPA. Built once, embedded as resource in `Collector.exe`.    |\n\nTest projects (`RimObs.Library.Tests/`, `RimObs.Collector.Tests/`) are\n`net8.0` xUnit hosts; they exercise the library logic that is\nRimWorld-independent.\n\n### Root layout\n\nThe non-obvious neighbors at the repo root exist because this is both a\nRimWorld mod and a multi-project .NET solution:\n\n- `About/` -- RimWorld mod metadata (About.xml, Preview.png, loadFolders.xml).\n- `Assemblies/` -- RimWorld's deploy directory. `RimObs.Library` builds straight here.\n- `RimObs.sln` -- single solution so Rider/VS resolve `RimObs.Wire` from both net48 and net10.0 consumers.\n- `Makefile` + `make.ps1` -- see `make build`, `make test`, `make publish-collector`.\n- `docs/wiki/` -- source for [the wiki](https://github.com/cryptiklemur/rimworld-observability-collector/wiki). Edit here, not on the wiki site; CI mirrors on push to `main`.\n\n### Quick start\n\n```bash\nmake build              # SPA + full solution\nmake test               # xUnit suites\nmake watch              # collector hot-reload at :17654\nmake publish-collector  # self-contained binaries for win/linux/osx\n```\n\n### Conventions\n\n- Hot-path discipline for `RimObs.Library` is mandatory: zero allocation,\n  exception-safe, no locks, no `Task`/`async` on the steady path. See\n  [Hot-path discipline](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Hot-Path-Discipline)\n  for the full rules.\n- Wire protocol is MessagePack with per-batch `schema_version`. Default\n  port `17654` for HTTP and UDP in standalone mode; ephemeral when launched\n  from the game. See\n  [Wire protocol](https://github.com/cryptiklemur/rimworld-observability-collector/wiki/Wire-Protocol).\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptiklemur%2Frimworld-observability-collector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcryptiklemur%2Frimworld-observability-collector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptiklemur%2Frimworld-observability-collector/lists"}