---
title: m7kni.io Documentation Hub
description: Central hub for observability, Home Assistant, and monitoring tooling from rknightion — docs synced from source.
image: assets/social-card.png
hide:
  - navigation
  - toc
---

<section class="m7-hero" markdown>

<span class="m7-wash" aria-hidden="true"></span>

<div class="m7-hero-inner" markdown>

<div class="m7-swatch" aria-hidden="true"><i></i><i></i><i></i><i></i></div>

<h1 class="m7-headline">Small tools that do one job properly.</h1>

<p class="m7-lede">Documentation for a set of open-source <strong>observability</strong>, <strong>Home&nbsp;Assistant</strong> and <strong>monitoring</strong> tools. Each site is built from the repository that ships the code, so the docs and the software move together.</p>

<div class="m7-actions">
<a class="m7-btn m7-btn--primary" href="#observability">Browse the projects <svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></a>
<a class="m7-btn" href="https://github.com/rknightion">Read the source</a>
</div>

<!-- TOPICS:START -->
<nav class="m7-jump" aria-label="Jump to a topic"><a href="#observability">Observability</a><a href="#home-assistant">Home Assistant</a><a href="#tooling">Everything else</a></nav>
<!-- TOPICS:END -->

</div>

</section>

<!-- PROJECTS:START -->
<section class="m7-cat" id="observability" style="--m7-cat-accent:var(--m7-accent)"><div class="m7-cat-head"><p class="m7-eyebrow m7-cat-eyebrow">Observability</p><h2>Exporters, bridges and telemetry generators.</h2></div><div class="m7-grid"><a class="m7-card" href="./genai-otel-bridge/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>genai-otel-bridge</h3></div><p class="m7-blurb">Polls AI-platform APIs and emits vendor-neutral OTLP metrics + logs to Grafana Cloud. Leader-elected, content-free.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#00add8">Go</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./synthkit/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>synthkit</h3></div><p class="m7-blurb">Composable synthetic-telemetry generator — one YAML blueprint emits correct metrics, traces, logs & RUM.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#00add8">Go</span><span class="m7-updated">Updated 12m ago</span></div></a><a class="m7-card" href="./meraki-dashboard-exporter/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>meraki-dashboard-exporter</h3></div><p class="m7-blurb">Prometheus exporter for the Cisco Meraki Dashboard API with scrape-ready endpoints and dashboards.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#f2c14e">Python</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./opnsense2otel/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>opnsense2otel</h3></div><p class="m7-blurb">OpenTelemetry and Prometheus observability for OPNsense firewalls — 65 collectors, 994 metrics, native OTLP metrics and logs, syslog, NetFlow and Zenarmor receivers.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#00add8">Go</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./tailscale2otel/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>tailscale2otel</h3></div><p class="m7-blurb">Polls the Tailscale API and exports OpenTelemetry-native metrics + logs over OTLP for Grafana Cloud.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#00add8">Go</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./sf2loki/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>sf2loki</h3></div><p class="m7-blurb">Streams Salesforce Event Monitoring into Grafana Loki — Pub/Sub, SOQL, EventLogFile. Cardinality-disciplined.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#f2c14e">Python</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./graph2otel/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"/></svg></span><h3>graph2otel</h3></div><p class="m7-blurb">Exports OTLP metrics + logs from Entra ID, Intune, Defender, M365 and Purview via Microsoft Graph, Azure Storage blobs and O365 Management Activity.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#00add8">Go</span><span class="m7-updated">Updated 3h ago</span></div></a></div></section>
<section class="m7-cat" id="home-assistant" style="--m7-cat-accent:var(--m7-swatch-green)"><div class="m7-cat-head"><p class="m7-eyebrow m7-cat-eyebrow">Home Assistant</p><h2>Integrations for the smart home.</h2></div><div class="m7-grid"><a class="m7-card" href="./autopi-ha/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="7" height="9" x="3" y="3" rx="1"/><rect width="7" height="5" x="14" y="3" rx="1"/><rect width="7" height="9" x="14" y="12" rx="1"/><rect width="7" height="5" x="3" y="16" rx="1"/></svg></span><h3>autopi-ha</h3></div><p class="m7-blurb">Home Assistant integration for AutoPi devices — live vehicle data and automation-friendly entities.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#f2c14e">Python</span><span class="m7-updated">Updated 3h ago</span></div></a><a class="m7-card" href="./meraki-dashboard-ha/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="7" height="9" x="3" y="3" rx="1"/><rect width="7" height="5" x="14" y="3" rx="1"/><rect width="7" height="9" x="14" y="12" rx="1"/><rect width="7" height="5" x="3" y="16" rx="1"/></svg></span><h3>meraki-dashboard-ha</h3></div><p class="m7-blurb">Bring Cisco Meraki Dashboard data into Home Assistant for presence, uptime and security insights.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#f2c14e">Python</span><span class="m7-updated">Updated 3h ago</span></div></a></div></section>
<section class="m7-cat" id="tooling" style="--m7-cat-accent:var(--m7-swatch-teal)"><div class="m7-cat-head"><p class="m7-eyebrow m7-cat-eyebrow">Everything else</p><h2>Standalone tools and utilities.</h2></div><div class="m7-grid"><a class="m7-card" href="./paperless-ngx-dedupe/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"/><path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"/><path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"/></svg></span><h3>paperless-ngx-dedupe</h3></div><p class="m7-blurb">Deduplicate paperless-ngx libraries with MinHash/LSH matching and optional AI metadata suggestions.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#3178c6">TypeScript</span><span class="m7-updated">Updated 1h ago</span></div></a><a class="m7-card" href="./intune-assignments-manager/"><span class="m7-card-rule" aria-hidden="true"></span><div class="m7-card-head"><span class="m7-card-icon"><svg class="m7-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83z"/><path d="M2 12a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 12"/><path d="M2 17a1 1 0 0 0 .58.91l8.6 3.91a2 2 0 0 0 1.65 0l8.58-3.9A1 1 0 0 0 22 17"/></svg></span><h3>intune-assignments-manager</h3></div><p class="m7-blurb">Visualise and manage Microsoft Intune policy assignments across devices, users and groups.</p><div class="m7-card-foot"><span class="m7-lang" style="--lang:#ff3e00">Svelte</span><span class="m7-updated">Updated 45m ago</span></div></a></div></section>
<!-- PROJECTS:END -->
<!-- PROJECTS-JSONLD:START -->
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "ItemList", "itemListElement": [{"@type": "ListItem", "position": 1, "item": {"@type": "SoftwareSourceCode", "name": "genai-otel-bridge", "description": "Polls AI-platform APIs and emits vendor-neutral OTLP metrics + logs to Grafana Cloud. Leader-elected, content-free.", "codeRepository": "https://github.com/rknightion/genai-otel-bridge", "url": "https://github.com/rknightion/genai-otel-bridge", "programmingLanguage": "Go"}}, {"@type": "ListItem", "position": 2, "item": {"@type": "SoftwareSourceCode", "name": "synthkit", "description": "Composable synthetic-telemetry generator — one YAML blueprint emits correct metrics, traces, logs & RUM.", "codeRepository": "https://github.com/rknightion/synthkit", "url": "https://github.com/rknightion/synthkit", "programmingLanguage": "Go"}}, {"@type": "ListItem", "position": 3, "item": {"@type": "SoftwareSourceCode", "name": "meraki-dashboard-exporter", "description": "Prometheus exporter for the Cisco Meraki Dashboard API with scrape-ready endpoints and dashboards.", "codeRepository": "https://github.com/rknightion/meraki-dashboard-exporter", "url": "https://github.com/rknightion/meraki-dashboard-exporter", "programmingLanguage": "Python"}}, {"@type": "ListItem", "position": 4, "item": {"@type": "SoftwareSourceCode", "name": "meraki-dashboard-ha", "description": "Bring Cisco Meraki Dashboard data into Home Assistant for presence, uptime and security insights.", "codeRepository": "https://github.com/rknightion/meraki-dashboard-ha", "url": "https://github.com/rknightion/meraki-dashboard-ha", "programmingLanguage": "Python"}}, {"@type": "ListItem", "position": 5, "item": {"@type": "SoftwareSourceCode", "name": "autopi-ha", "description": "Home Assistant integration for AutoPi devices — live vehicle data and automation-friendly entities.", "codeRepository": "https://github.com/rknightion/autopi-ha", "url": "https://github.com/rknightion/autopi-ha", "programmingLanguage": "Python"}}, {"@type": "ListItem", "position": 6, "item": {"@type": "SoftwareSourceCode", "name": "paperless-ngx-dedupe", "description": "Deduplicate paperless-ngx libraries with MinHash/LSH matching and optional AI metadata suggestions.", "codeRepository": "https://github.com/rknightion/paperless-ngx-dedupe", "url": "https://github.com/rknightion/paperless-ngx-dedupe", "programmingLanguage": "TypeScript"}}, {"@type": "ListItem", "position": 7, "item": {"@type": "SoftwareSourceCode", "name": "intune-assignments-manager", "description": "Visualise and manage Microsoft Intune policy assignments across devices, users and groups.", "codeRepository": "https://github.com/rknightion/intune-assignments-manager", "url": "https://github.com/rknightion/intune-assignments-manager", "programmingLanguage": "Svelte"}}, {"@type": "ListItem", "position": 8, "item": {"@type": "SoftwareSourceCode", "name": "opnsense2otel", "description": "OpenTelemetry and Prometheus observability for OPNsense firewalls — 65 collectors, 994 metrics, native OTLP metrics and logs, syslog, NetFlow and Zenarmor receivers.", "codeRepository": "https://github.com/rknightion/opnsense2otel", "url": "https://github.com/rknightion/opnsense2otel", "programmingLanguage": "Go"}}, {"@type": "ListItem", "position": 9, "item": {"@type": "SoftwareSourceCode", "name": "tailscale2otel", "description": "Polls the Tailscale API and exports OpenTelemetry-native metrics + logs over OTLP for Grafana Cloud.", "codeRepository": "https://github.com/rknightion/tailscale2otel", "url": "https://github.com/rknightion/tailscale2otel", "programmingLanguage": "Go"}}, {"@type": "ListItem", "position": 10, "item": {"@type": "SoftwareSourceCode", "name": "sf2loki", "description": "Streams Salesforce Event Monitoring into Grafana Loki — Pub/Sub, SOQL, EventLogFile. Cardinality-disciplined.", "codeRepository": "https://github.com/rknightion/sf2loki", "url": "https://github.com/rknightion/sf2loki", "programmingLanguage": "Python"}}, {"@type": "ListItem", "position": 11, "item": {"@type": "SoftwareSourceCode", "name": "graph2otel", "description": "Exports OTLP metrics + logs from Entra ID, Intune, Defender, M365 and Purview via Microsoft Graph, Azure Storage blobs and O365 Management Activity.", "codeRepository": "https://github.com/rknightion/graph2otel", "url": "https://github.com/rknightion/graph2otel", "programmingLanguage": "Go"}}]}</script>
<!-- PROJECTS-JSONLD:END -->


## About

This portal hosts documentation for [rknightion's GitHub projects](https://github.com/rknightion). For personal updates beyond the docs, visit [m7kni.com](https://m7kni.com).
