<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Riskrancher on t0ul</title><link>https://t0ul.com/tags/riskrancher/</link><description>Recent content in Riskrancher on t0ul</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 09 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://t0ul.com/tags/riskrancher/index.xml" rel="self" type="application/rss+xml"/><item><title>A whole web app in one binary: the standard library and an embedded UI</title><link>https://t0ul.com/blog/riskrancher-self-contained-go-stdlib/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-self-contained-go-stdlib/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Across this series I&amp;rsquo;ve said RiskRancher is one binary a few times: &lt;a href="https://t0ul.com/blog/riskrancher-one-binary-one-sqlite/"&gt;one binary and SQLite&lt;/a&gt;, &lt;a href="https://t0ul.com/blog/riskrancher-pure-go-sqlite-no-cgo/"&gt;pure-Go so it builds everywhere&lt;/a&gt;, &lt;a href="https://t0ul.com/blog/riskrancher-air-gapped-by-design/"&gt;air-gapped because it carries everything&lt;/a&gt;. This post is the capstone: how the web app itself fits in that one file with no framework and no loose static assets. The short version is that modern Go&amp;rsquo;s standard library is enough, and &lt;code&gt;embed&lt;/code&gt; does the rest.&lt;/p&gt;</description></item><item><title>Showing what to fix first, without a black-box risk score</title><link>https://t0ul.com/blog/riskrancher-open-findings-dashboard/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-open-findings-dashboard/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;&amp;ldquo;Risk-based&amp;rdquo; has become a marketing word that usually means a vendor multiplies some numbers together and hands you a score you can&amp;rsquo;t question. I went the other way with &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;. Prioritization here is a handful of honest counts: how many open findings you have, broken down by severity and by source, combined with the SLA deadlines from the &lt;a href="https://t0ul.com/blog/riskrancher-tickets-slas-remediation/"&gt;last post&lt;/a&gt;. No black box. This post is about why transparent beats clever for deciding what to fix first.&lt;/p&gt;</description></item><item><title>From finding to fixed: tickets, SLAs, and a workflow that isn't a spreadsheet</title><link>https://t0ul.com/blog/riskrancher-tickets-slas-remediation/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-tickets-slas-remediation/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Ingesting and deduping findings gets you a clean list. But a clean list is still just a list, and the reason most teams&amp;rsquo; &amp;ldquo;system of record&amp;rdquo; is a spreadsheet is that nobody built the part where findings turn into tracked, deadlined work. That&amp;rsquo;s the part that actually reduces risk, so in &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt; every finding becomes a ticket with a lifecycle and an SLA. This post is about that workflow.&lt;/p&gt;</description></item><item><title>Deduping millions of findings with one content hash</title><link>https://t0ul.com/blog/riskrancher-deduping-findings-one-hash/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-deduping-findings-one-hash/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Scanners are repetitive by nature. You run Trivy on the same image every build, Nessus on the same hosts every week, and the overwhelming majority of what comes back is findings you already have. If you store every finding from every scan as a new row, you drown in duplicates fast, and the &amp;ldquo;system of record&amp;rdquo; becomes useless. So deduplication isn&amp;rsquo;t a nice-to-have in a vulnerability manager, it&amp;rsquo;s the thing that makes the data worth keeping. Here&amp;rsquo;s how &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt; does it with a single hash, and the interesting part is what I chose to leave out of that hash.&lt;/p&gt;</description></item><item><title>The no-code Adapter Builder: supporting any scanner without shipping a parser</title><link>https://t0ul.com/blog/riskrancher-no-code-adapter-builder/</link><pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-no-code-adapter-builder/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;In the &lt;a href="https://t0ul.com/blog/riskrancher-normalizing-scanner-chaos/"&gt;last post&lt;/a&gt; I said the trick to handling every scanner is to normalize findings into one model, and to keep the per-scanner mapping as configuration rather than code. This post is about that configuration: the Adapter Builder. It&amp;rsquo;s the feature I&amp;rsquo;m happiest with, because it means a user can teach RiskRancher a brand-new scanner in a couple of minutes, in the browser, and I never have to cut a release to support it.&lt;/p&gt;</description></item><item><title>Every scanner speaks a different language: normalizing findings into one model</title><link>https://t0ul.com/blog/riskrancher-normalizing-scanner-chaos/</link><pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-normalizing-scanner-chaos/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;The first hard problem in vulnerability management isn&amp;rsquo;t storing findings, it&amp;rsquo;s that every tool describes a finding differently. Trivy buries vulnerabilities under nested result arrays, Qualys hands you one giant CSV, Nessus has its own format, and Dependabot speaks yet another JSON dialect. One calls it &lt;code&gt;title&lt;/code&gt;, the next &lt;code&gt;name&lt;/code&gt;, the third &lt;code&gt;vuln_id&lt;/code&gt;. One says severity is &lt;code&gt;HIGH&lt;/code&gt;, another says &lt;code&gt;7.5&lt;/code&gt;, another says &lt;code&gt;Critical&lt;/code&gt;. If you want all of that in one place, you have to translate. This post is about how &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt; does that translation once, into a single model, so nothing downstream has to care where a finding came from.&lt;/p&gt;</description></item><item><title>Air-gapped by design: a vuln manager that doesn't phone home</title><link>https://t0ul.com/blog/riskrancher-air-gapped-by-design/</link><pubDate>Wed, 11 Mar 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-air-gapped-by-design/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;A vulnerability manager holds some of the most sensitive data an organization has: a map of exactly where it&amp;rsquo;s weak. So &amp;ldquo;where does this data go?&amp;rdquo; is a fair first question, and for a lot of teams, especially on isolated or classified networks, the only acceptable answer is &amp;ldquo;nowhere.&amp;rdquo; &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt; is built so that findings stay on the machine you run it on. In this post I want to be precise about what that means, including the one place it talks to the network, because I&amp;rsquo;d rather you trust a claim I can back up than a slogan.&lt;/p&gt;</description></item><item><title>Pure-Go SQLite: the no-CGO trick behind a single cross-platform binary</title><link>https://t0ul.com/blog/riskrancher-pure-go-sqlite-no-cgo/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-pure-go-sqlite-no-cgo/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;In the &lt;a href="https://t0ul.com/blog/riskrancher-one-binary-one-sqlite/"&gt;last post&lt;/a&gt; I said RiskRancher is one Go binary and a SQLite file. That sounds simple, but there&amp;rsquo;s a specific technical choice that makes it actually work: the SQLite driver is &lt;strong&gt;pure Go&lt;/strong&gt;, with no CGO. If I&amp;rsquo;d used the usual driver, the &amp;ldquo;download the binary for your OS and run it&amp;rdquo; story would have fallen apart. Let me explain why, because this is the kind of decision that quietly determines whether a project ships easily or painfully.&lt;/p&gt;</description></item><item><title>One Go binary and a SQLite file: vuln management without the Docker tax</title><link>https://t0ul.com/blog/riskrancher-one-binary-one-sqlite/</link><pubDate>Thu, 15 Jan 2026 00:00:00 +0000</pubDate><guid>https://t0ul.com/blog/riskrancher-one-binary-one-sqlite/</guid><description>&lt;p&gt;&lt;em&gt;Part of my series on &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt;, the open-source vulnerability manager I build. Source: &lt;a href="https://github.com/Kuebiko-LLC/risk-rancher-core"&gt;github.com/Kuebiko-LLC/risk-rancher-core&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;Most vulnerability-management platforms want a lot from you before they do anything useful. Stand up Postgres, add Redis, wire up a Docker Compose file, maybe a Kubernetes cluster if you&amp;rsquo;re feeling ambitious, and then you can start storing scanner output. I got tired of that, so I built &lt;a href="https://www.riskrancher.com"&gt;RiskRancher&lt;/a&gt; to be the opposite: one Go binary and a SQLite file. Download it, run it, open your browser. In this post I want to explain that choice, because &amp;ldquo;boring and self-contained&amp;rdquo; turned out to be the whole product.&lt;/p&gt;</description></item></channel></rss>