<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>OpenVet Blog</title>
    <subtitle>Notes from building OpenVet — a public registry for software supply-chain audits.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.openvet.org/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.openvet.org"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-05-17T00:00:00+00:00</updated>
    <id>https://blog.openvet.org/atom.xml</id>
    <entry xml:lang="en">
        <title>Hello, OpenVet</title>
        <published>2026-05-17T00:00:00+00:00</published>
        <updated>2026-05-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.openvet.org/posts/hello-openvet/"/>
        <id>https://blog.openvet.org/posts/hello-openvet/</id>
        
        <content type="html" xml:base="https://blog.openvet.org/posts/hello-openvet/">&lt;p&gt;This is the start of the OpenVet dev log.  I plan to write about what I am
working on, what I managed to break, and from time to time post about
supply-chain security related news.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-openvet-is&quot;&gt;What OpenVet is
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-openvet-is&quot; aria-label=&quot;Anchor link for: what-openvet-is&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;OpenVet is a project that gives you supply-chain security by requiring that
your dependencies are audited, and match requirements you set out. It has
two parts:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;openvet-org&#x2F;registry&quot;&gt;public registry&lt;&#x2F;a&gt; that hosts signed, machine-readable audits
of software dependencies. It lets you publish audits to your own
cryptographically-signed, append-only log. And it lets others see and consume
the audits you produce. It is hosted at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openvet.org&quot;&gt;https:&#x2F;&#x2F;openvet.org&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;openvet-org&#x2F;openvet&quot;&gt;command-line tool&lt;&#x2F;a&gt; that can ingest those audit logs, enforce
that your dependencies are audited, and match the requirements you have. It
doesn’t trust the registry, it trusts the key of the publisher of the log.
The tooling is also not tied to the registry: you could just as well host
your own logs on any static site host.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Both of these components are open-source. The command-line tool is &lt;code&gt;MIT&lt;&#x2F;code&gt; and
&lt;code&gt;Apache-2.0&lt;&#x2F;code&gt; licensed, giving you freedom to adapt and integrate it. The
registry is &lt;code&gt;AGPL-3.0&lt;&#x2F;code&gt; licensed, more restrictive in what you can do with the
code, requiring modifications to be released under the same license.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why
&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;As software engineers, we don’t build everything from scratch. We build on top
of what others before us have built, which means depending on software packages
hosted on public registries — and that is a net positive.&lt;&#x2F;p&gt;
&lt;p&gt;When the internet was initially built, there was a culture of trust: there was
no encryption, little authentication. That was possible because it had few
users and a lack of valuable targets. We have a similar culture of &lt;em&gt;implicit
trust&lt;&#x2F;em&gt; on anything published in public registries. But slowly, attackers have
found out that developers’ machines are high value targets, containing API keys,
cryptocurrency wallets, and access to company infrastructure. Times are
changing.&lt;&#x2F;p&gt;
&lt;p&gt;Supply-chain attacks have moved from hypothetical to routine, accelerated in
recent years by the availability of LLMs. Some attacks like the &lt;em&gt;Shai-Hulud&lt;&#x2F;em&gt;
worm or the xz-utils have become well-known, but a major supply-chain security
company has &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sonatype.com&#x2F;state-of-the-software-supply-chain&#x2F;introduction&quot;&gt;logged over 1.2 million malicious packages in total, with 454,600
added in 2025 alone&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The current defenses either don’t work, or don’t scale. Build and release
provenance doesn’t help when attackers hijack CI workflows that release
packages (they just prove where the release happened, not what’s in the package).
CVE scanners are reactionary: by the time the CVE lands, your API keys and
wallets have been exfiltrated, and attackers have already had access to your
infrastructure. Dependency freezes just shift the pain to whoever updates first,
and if we all implemented them, they just delay when attacks are discovered.&lt;&#x2F;p&gt;
&lt;p&gt;But malicious packages are not the only thing that OpenVet addresses: it is
also correctness. We are producing code at an ever-growing rate, with
ever-growing complexity. In my opinion, the only way to do this sustainably is
to have reviewed and well-tested primitives hosted at registries that can be
composed to build complex software.&lt;&#x2F;p&gt;
&lt;p&gt;One personal data point: my average pet project pulls in 400 dependencies
summing up to 3.5 million lines of code, as verified by &lt;code&gt;cargo vendor&lt;&#x2F;code&gt; and
&lt;code&gt;tokei&lt;&#x2F;code&gt;. You may want to check your projects, and think about: how many lines
of that have I actually reviewed? How do I know that my dependencies are
correct and safe to use?&lt;&#x2F;p&gt;
&lt;p&gt;The way out is to drop implicit trust and require external vetting (auditing)
of software dependencies. And when I say &lt;em&gt;auditing&lt;&#x2F;em&gt;, I don’t mean the multi-month
project that is auditing a cryptographic library. For most dependencies, there
are some simple questions you need to answer, like:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Does this have any build-time or install-time actions, and do these actions look safe?&lt;&#x2F;li&gt;
&lt;li&gt;Does this code make network requests, and if so, why and what is sent?&lt;&#x2F;li&gt;
&lt;li&gt;Does it read or write to the filesystem, and if so, what is read or written?&lt;&#x2F;li&gt;
&lt;li&gt;Does it read any environment variables, and if so, what does it do with them?&lt;&#x2F;li&gt;
&lt;li&gt;Does it have extensive test coverage, including randomized tests (fuzz tests, proptests)?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Any software engineer with some experience can answer that with a checklist.
Thorough audits may be required for &lt;em&gt;some&lt;&#x2F;em&gt; dependencies, but not for all.&lt;&#x2F;p&gt;
&lt;p&gt;The actually hard problems are elsewhere:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The time it takes to perform audits of all of your dependencies&lt;&#x2F;li&gt;
&lt;li&gt;The user experience for creating, publishing and discovering audits&lt;&#x2F;li&gt;
&lt;li&gt;The distribution of audits&lt;&#x2F;li&gt;
&lt;li&gt;The tooling for validating that your dependencies are audited&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;OpenVet is an approach to solving these four problems in a way that might
be able to scale beyond &lt;em&gt;niche&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-it-works-briefly&quot;&gt;How it works, briefly
&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-it-works-briefly&quot; aria-label=&quot;Anchor link for: how-it-works-briefly&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;OpenVet defines a data format for audits. They contain both machine-readable
claims (similar to what &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mozilla&#x2F;cargo-vet&quot;&gt;cargo-vet&lt;&#x2F;a&gt; does, in the future I will make a post
explaining the mental model of them), and human-readable findings, source
annotations, and a report. Audits are signed by the author, the signature is
required and verified.&lt;&#x2F;p&gt;
&lt;p&gt;OpenVet defines a way to distribute them. Audits are published in
cryptographically-signed append-only logs, so you do not need to trust the
platform, only the person holding the keys.  OpenVet has a registry for audits,
think about it like a &lt;em&gt;GitHub&lt;&#x2F;em&gt;, but it holds audits, not code.&lt;&#x2F;p&gt;
&lt;p&gt;It does not scale for us to audit every single dependency ourselves. The core
idea of OpenVet is that auditing is a collaborative process, just like
open-source development is. You publish your audits, others can trust you (and
with that, your audit-log). You can choose to trust an entity (a large company,
which has audited several dependencies, or a friend). With that, you only need
to audit dependencies that others you trust haven’t already audited, which is a
lot more manageable. It makes OpenVet’s adoption much cheaper, and thereby
scalable.&lt;&#x2F;p&gt;
&lt;p&gt;When you do need to audit software, OpenVet tries to make it easy. It has a
command-line driven workflow for auditing software that lets you create an
audit workspace. I try to build tooling that makes the process as simple as
possible. And this tooling also allows you to automate the auditing process for
low-risk dependencies, by getting an LLM to do it. I am not saying that
LLM-generated audits are the perfect solution, but in my opinion: LLM-audited
dependencies are better than unaudited dependencies, and it means you can spend
your time on higher-risk dependencies.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, OpenVet attempts to ship tooling that makes enforcing dependency
audits as painless as possible. The command-line tooling can scan all of your
lockfiles, and search through all of the audit-logs you trust for relevant
audits in parallel and with local caching. The audit log data structure is
designed for cacheability and efficient lookup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-to-expect-here&quot;&gt;What to expect here
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-to-expect-here&quot; aria-label=&quot;Anchor link for: what-to-expect-here&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Don’t expect a refined product here, or a sales team. It’s just me, and this is
not a commercial endeavour. I am building this because I want it to exist, and
because it is fun to do so. I am implementing features, and breaking things
along the way, as I figure out what works and what does not.&lt;&#x2F;p&gt;
&lt;p&gt;If you think this idea has merit, feel free to stay along for the ride. I try
to post updates on this blog as I am working on OpenVet, as I implement new
features. I would ask you to like, comment, and subscribe, but I don’t have
any social media buttons on here, nor do I have a mailing list, nor a comment
feature.&lt;&#x2F;p&gt;
&lt;p&gt;If you want to get in touch or help with this, you probably find a way to reach
me on my GitHub profile.&lt;&#x2F;p&gt;
&lt;p&gt;In the meantime, if you want the source, it’s on
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;openvet-org&#x2F;openvet&quot;&gt;GitLab&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
