<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Projects - Kevin Allioli</title>
    <link>https://kevinallioli.com/en/projects/</link>
    <description>What I publish as open source, and why.</description>
    <language>en</language>
    <managingEditor>kevin@stackops.ch (Kevin Allioli)</managingEditor>
    <webMaster>kevin@stackops.ch (Kevin Allioli)</webMaster>
    <copyright>CC BY 4.0, 2026 Kevin Allioli</copyright>
    <atom:link href="https://kevinallioli.com/en/projects/index.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Open Image Cloud</title>
      <link>https://kevinallioli.com/en/projects/open-image-cloud/</link>
      <guid isPermaLink="true">https://kevinallioli.com/en/projects/open-image-cloud/</guid>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <description>Cloud images for OpenStack and Proxmox: reproducible builds, keyless cosign signatures, provenance embedded in every image.</description>
      <content:encoded><![CDATA[<p>Open Image Cloud publishes ready-to-use cloud images for OpenStack and
Proxmox. Eight Linux distributions (Alpaquita, Alpine, Amazon Linux 2 and
2023, Gentoo, NixOS, Oracle Linux 9 and 10), plus Octavia amphorae pinned
to each OpenStack release.</p>
<p>What separates these images from a distribution&rsquo;s official ones is not
their contents. It is what you can say about them with certainty.</p>
<h2 id="the-problem">The problem</h2>
<p>You boot a cloud image. It came from a mirror, it has a filename and a
checksum. The checksum proves the file was not altered after publication.
It says nothing about what happened before: which repository, which
revision, which machine, which packages at which date, which changes
applied after the base install.</p>
<p>On one machine that is a detail. On a fleet it is the layer everything else
inherits from, and the only one nobody reads.</p>
<h2 id="what-is-in-place">What is in place</h2>
<p><strong>Reproducible builds.</strong> Every image is built by a GitHub Actions workflow
from pinned upstream sources and a tagged builder container. The commit,
the build run URL and the builder container digest are written into the
<code>MANIFEST.json</code> shipped next to the image.</p>
<p><strong>Keyless cosign signatures.</strong> Images are signed through GitHub Actions
OIDC. There is no private key to keep, so there is no private key to lose.
Verification runs against the identity of the workflow that produced the
image:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cosign verify-blob alpine-3.23.4-uefi-x86_64.qcow2 <span class="se">\
</span></span></span><span class="line"><span class="cl">  --bundle alpine-3.23.4-uefi-x86_64.qcow2.bundle --new-bundle-format <span class="se">\
</span></span></span><span class="line"><span class="cl">  --certificate-identity-regexp <span class="s1">&#39;https://github.com/open-img-cloud/&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --certificate-oidc-issuer https://token.actions.githubusercontent.com
</span></span></code></pre></div><p><strong>Immutable paths.</strong> The public registry serves images under
<code>images.openimages.cloud/&lt;os&gt;/&lt;version&gt;/&lt;filename&gt;</code>. A published path never
changes. A mutable <code>latest/</code> alias exists alongside it for those who want
one, but it is never the reference.</p>
<h2 id="architecture">Architecture</h2>
<p>The build pipeline lives in a shared <code>.github</code> repository as reusable
workflows and composite actions. Each image repository stays thin: a
<code>VERSION</code>, a customisation script (libguestfs or diskimage-builder
depending on the distribution), an upstream version watcher, and two
caller workflows.</p>
<p>For storage, the source of truth is a self-hosted
<a href="https://garagehq.deuxfleurs.fr">Garage</a> cluster, mirrored to Cloudflare R2
and served behind the CDN. A small Worker routes <code>/&lt;os&gt;/*</code> paths to the
matching buckets.</p>
<h2 id="why-it-matters">Why it matters</h2>
<p>The word sovereign is currently sold as a geographic property. But a
datacentre in Europe booting images whose lineage nobody can reconstruct
gives you no additional guarantee: it moves the trust, it does not remove
it.</p>
<p>The point of Open Image Cloud is to make that trust unnecessary. You can
verify what you boot without having to believe me.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
