<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Arch Linux Dev Blog</title>
    <subtitle>A blog about Arch Linux projects</subtitle>
    <link rel="self" type="application/atom+xml" href="https://devblog.archlinux.page/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://devblog.archlinux.page"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-01-11T10:00:00+00:00</updated>
    <id>https://devblog.archlinux.page/atom.xml</id>
    <entry xml:lang="en">
        <title>Verify Arch Linux artifacts using VOA&#x2F;OpenPGP</title>
        <published>2026-01-11T10:00:00+00:00</published>
        <updated>2026-01-11T10:00:00+00:00</updated>
        
        <author>
          <name>
            
              archlinux-staff
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://devblog.archlinux.page/2026/verify-arch-linux-artifacts-using-voa-openpgp/"/>
        <id>https://devblog.archlinux.page/2026/verify-arch-linux-artifacts-using-voa-openpgp/</id>
        
        <content type="html" xml:base="https://devblog.archlinux.page/2026/verify-arch-linux-artifacts-using-voa-openpgp/">&lt;p&gt;In the &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2026&#x2F;a-year-of-work-on-the-alpm-project&#x2F;&quot;&gt;recent blog post&lt;&#x2F;a&gt; on the work funded by Sovereign Tech Fund (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;programs&#x2F;fund&quot;&gt;STF&lt;&#x2F;a&gt;), we provided an overview of the &lt;em&gt;&quot;File Hierarchy for the &lt;strong&gt;V&lt;&#x2F;strong&gt;erification of &lt;strong&gt;O&lt;&#x2F;strong&gt;S &lt;strong&gt;A&lt;&#x2F;strong&gt;rtifacts&quot;&lt;&#x2F;em&gt; (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt;) and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt; as its reference implementation.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; is a generic framework for verifying any kind of distribution artifacts (i.e. files) using arbitrary signature verification technologies.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-voa-cli-keyboard&quot;&gt;The &lt;code&gt;voa&lt;&#x2F;code&gt; CLI ⌨️&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt; offers the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.1&quot;&gt;&lt;code&gt;voa(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; command line interface (CLI) which makes use of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt; configuration file format for technology backends.
It is recommended to read the respective man pages to get an overview.&lt;&#x2F;p&gt;
&lt;p&gt;The following sections assume an Arch Linux system, with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;packages&#x2F;core&#x2F;any&#x2F;voa-verifiers-arch&#x2F;&quot;&gt;voa-verifiers-arch&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;packages&#x2F;extra&#x2F;x86_64&#x2F;voa&#x2F;&quot;&gt;voa&lt;&#x2F;a&gt; packages installed.&lt;&#x2F;p&gt;
&lt;p&gt;On other systems, it is possible to download the &quot;voa-verifiers-arch&quot; artifact of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;-&#x2F;releases&quot;&gt;latest release of archlinux-keyring&lt;&#x2F;a&gt; and to place its contents in one of the relevant &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;#load-paths&quot;&gt;VOA load paths&lt;&#x2F;a&gt;.
Afterwards, follow the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa&#x2F;#installation&quot;&gt;installation instructions&lt;&#x2F;a&gt; for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.1&quot;&gt;&lt;code&gt;voa(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; CLI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;using-voa-with-the-openpgp-technology-handshake&quot;&gt;Using VOA with the OpenPGP technology 🤝&lt;&#x2F;h2&gt;
&lt;p&gt;In this article we will focus on the use of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; with the OpenPGP technology backend for signature verification.
This backend is available as part of the reference implementation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The big picture concepts in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; are shared between all technology backends.
However, some capabilities and details differ depending on technology.&lt;&#x2F;p&gt;
&lt;p&gt;We will start by looking at some common interactions with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Verifying the signatures of an Arch Linux package and installation medium.&lt;&#x2F;li&gt;
&lt;li&gt;Inspecting the verification configuration.&lt;&#x2F;li&gt;
&lt;li&gt;Inspecting verifiers.&lt;&#x2F;li&gt;
&lt;li&gt;Importing additional verifiers.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;As an advanced usage example, we will look into setting up a custom &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; context for an unofficial package repository, with a separate policy configuration.&lt;&#x2F;p&gt;
&lt;p&gt;Additionally, we will take a brief glance at a way to verify all official Arch Linux package files for testing in a development environment.&lt;&#x2F;p&gt;
&lt;p&gt;Finally, we will provide a short overview of the state of other technology backends.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;verifying-signatures-lock-with-ink-pen&quot;&gt;Verifying signatures 🔏&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-verify.1&quot;&gt;&lt;code&gt;voa-verify(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; command can be used to verify an artifact against a signature.
Arch Linux relies on a configuration file for the OpenPGP technology backend (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;-&#x2F;blob&#x2F;f78a19f2b5b14472bbb99c7a29e7f0fd2873ab7d&#x2F;arch.yaml&quot;&gt;arch.yaml&lt;&#x2F;a&gt;) to enforce its own verification policy.&lt;&#x2F;p&gt;
&lt;p&gt;Based on this configuration, a single package file can be verified against the corresponding detached &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;signing_data.html&quot;&gt;OpenPGP data signature&lt;&#x2F;a&gt; using:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; openpgp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&#x2F;systemd-259-1-x86_64.pkg.tar.zst{,.sig}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&#x2F;systemd-259-1-x86_64.pkg.tar.zst.sig&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1766039593&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 02fd1c7a934e614545849f19a6234074498e9cee&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 0429897de5f3bdac537a30696d42bdd116e0068f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The output lists:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The detached signature file used for verification,&lt;&#x2F;li&gt;
&lt;li&gt;the signature&#x27;s creation time,&lt;&#x2F;li&gt;
&lt;li&gt;the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprint&lt;&#x2F;a&gt; of the primary key of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt;, and&lt;&#x2F;li&gt;
&lt;li&gt;the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprint&lt;&#x2F;a&gt; of the component key used for signing.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Similarly, the monthly installation medium can be verified, based on the designated verifiers:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; installation-medium&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; openpgp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; archlinux-2026.01.01-x86_64.iso{,.sig}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; archlinux-2026.01.01-x86_64.iso.sig&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1767267369&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3e80ca1a8b89f69cba57d98a76a5ef9054449a5c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3e80ca1a8b89f69cba57d98a76a5ef9054449a5c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;inspecting-the-configuration-of-voa-technology-backends-page-facing-up&quot;&gt;Inspecting the configuration of VOA technology backends 📄&lt;&#x2F;h2&gt;
&lt;p&gt;In the verification examples above, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-verify.1&quot;&gt;&lt;code&gt;voa-verify(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; command implicitly relied on two inputs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt; configuration file, which specifies which exact rules the OpenPGP technology is supposed to enforce in the context of the Arch Linux distribution.&lt;&#x2F;li&gt;
&lt;li&gt;A set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificates&lt;&#x2F;a&gt; that are used to determine if signatures are valid.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In this section we will look at the first point: The configuration that is active when verifying signatures with VOA in a given context.&lt;&#x2F;p&gt;
&lt;p&gt;As a uniform user-facing model for these settings, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt; includes the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt; configuration file format, which defines exactly how verification with technology backends is done.&lt;&#x2F;p&gt;
&lt;p&gt;A backend technology like OpenPGP can offer a range of different approaches to package verification, such as:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Are specific identities required on valid verifiers?&lt;&#x2F;li&gt;
&lt;li&gt;Are trust anchors expected to authenticate the artifact verifiers?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Arch Linux uses the following configuration file in &lt;code&gt;&#x2F;usr&#x2F;share&#x2F;voa&#x2F;arch.yaml&lt;&#x2F;code&gt;, which describes the policy VOA uses for signature verification of Arch Linux artifacts:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;efault_technology_settings&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;penpgp&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;um_data_signatures&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;erification_method&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;      t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rust_anchor&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;equired_certifications&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rtifact_verifier_identity_domain_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;rchlinux.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rust_anchor_fingerprint_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Levente Polyak (Arch Linux Master Key) &amp;lt;anthraxx@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8afdda07a5b6edfa7d8ccdad6d055f927843f1c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Leonidas Spyropoulos (Arch Linux Master Key) &amp;lt;artafinde@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;572fa2a1b067f22c58af155f8b821b42a6fdcd7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Johannes Löthberg (Arch Linux Master Key) &amp;lt;demize@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;9e6471e3ae065297529832e6ba0f5a2037f4f41&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; David Runge (Arch Linux Master Key) &amp;lt;dvzrv@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ac0a42efb0b5cbc7a0402ed4dc95b6d7be9892e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Florian Pritz (Arch Linux Master Key) &amp;lt;florian@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1ffe0700e80619ceb73235ca88e23e377514e00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-config.1&quot;&gt;&lt;code&gt;voa-config(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; command allows introspection of the configuration in a given context.
The command returns an explanation of the active policy:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; show&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🔏&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; requires&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; signature&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifiers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; successfully&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; using&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;trust anchor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verification&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; method.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📧&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; User&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ID&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; that&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; domains&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; and&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; has&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certification&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; individual&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; trust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; anchors&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifier:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; archlinux.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🐾&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fingerprints&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; trust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; anchor:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 2ac0a42efb0b5cbc7a0402ed4dc95b6d7be9892e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3572fa2a1b067f22c58af155f8b821b42a6fdcd7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 69e6471e3ae065297529832e6ba0f5a2037f4f41&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 91ffe0700e80619ceb73235ca88e23e377514e00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d8afdda07a5b6edfa7d8ccdad6d055f927843f1c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📝&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; The&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; sources&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; been&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; creation&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;share&#x2F;voa&#x2F;arch.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Built-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; defaults&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It can also be used to list the origins of all available configurations available to a user:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🖥&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;share&#x2F;voa&#x2F;arch.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Built-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; defaults&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🖥&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; example&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;home&#x2F;user&#x2F;.config&#x2F;voa&#x2F;example.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Built-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; defaults&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;listing-verifiers-eye-speech-left&quot;&gt;Listing verifiers 👁️‍🗨️&lt;&#x2F;h2&gt;
&lt;p&gt;VOA specifies a hierarchical directory structure.
For each type of artifact, a specific subset of this structure provides a set of &quot;verifiers&quot; that must be used for artifact verification.&lt;&#x2F;p&gt;
&lt;p&gt;Verifiers may reside in various &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;#load-paths&quot;&gt;load paths&lt;&#x2F;a&gt; on the system.
To view a list of verifiers in a particular context, use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-list.1&quot;&gt;&lt;code&gt;voa-list(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;E.g. to show the paths of all verifiers considered for package verification on an OS named &quot;test&quot;, use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To do the same for the Arch Linux distribution, use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To show the paths of all trust anchors considered for authenticating verifiers to use for signature verification of Arch Linux packages, use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; trust-anchor-package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;importing-certificates-as-verifiers&quot;&gt;Importing certificates as verifiers ↩️&lt;&#x2F;h2&gt;
&lt;p&gt;Using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-import.1&quot;&gt;&lt;code&gt;voa-import(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; it is possible to import an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; into the appropriate location in a VOA hierarchy, for use as a verifier.&lt;&#x2F;p&gt;
&lt;p&gt;Note, that based on the precedence of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;#load-paths&quot;&gt;VOA load paths&lt;&#x2F;a&gt;, it is possible to import versions of an existing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; into different file system locations.
The content of such variants will usually be merged at runtime by the VOA OpenPGP backend.&lt;&#x2F;p&gt;
&lt;p&gt;Here, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa-openpgp&#x2F;&quot;&gt;voa-openpgp&lt;&#x2F;a&gt; crate supports the import of certificates in different formats:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; in a single file.&lt;&#x2F;li&gt;
&lt;li&gt;A directory containing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;zoom&#x2F;certificates.html&quot;&gt;OpenPGP packets&lt;&#x2F;a&gt; of a single &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;The custom destructured directory structure for a single &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; as used in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;&quot;&gt;archlinux-keyring&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The following examples each import an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; as verifier for package files on an OS named &quot;test&quot; to the runtime load path of the current user.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;importing-a-single-certificate-closed-lock-with-key&quot;&gt;Importing a single certificate 🔐&lt;&#x2F;h3&gt;
&lt;p&gt;Assuming that &lt;code&gt;alice.cert&lt;&#x2F;code&gt; is a file that contains an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt;, we can import it e.g. as a verifier for package files in any repository:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-runtime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alice.cert&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;importing-a-split-certificate-closed-lock-with-key&quot;&gt;Importing a split certificate 🔐&lt;&#x2F;h3&gt;
&lt;p&gt;Certificates may be split up into individual files that contain &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;zoom&#x2F;certificates.html&quot;&gt;OpenPGP packets&lt;&#x2F;a&gt;, collectively stored in a directory.
Here, we assume that the directory &lt;code&gt;alice&#x2F;&lt;&#x2F;code&gt; contains the split files.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ls&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alice&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;alice.cert-000000-PublicKey&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alice.cert-000001-UserId&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  alice.cert-000002-Signature&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-runtime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alice&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;importing-a-certificate-from-the-archlinux-keyring-structure-closed-lock-with-key&quot;&gt;Importing a certificate from the archlinux-keyring structure 🔐&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;&quot;&gt;archlinux-keyring&lt;&#x2F;a&gt; project chose to arrange the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;zoom&#x2F;certificates.html&quot;&gt;OpenPGP packets&lt;&#x2F;a&gt; of each tracked &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; in a particular directory structure.&lt;&#x2F;p&gt;
&lt;p&gt;After cloning the repository, it is possible to directly import the packets of an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; from these directory structures, e.g.:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; archlinux-keyring&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-runtime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; keyring&#x2F;packager&#x2F;dvzrv&#x2F;991F6E3F0765CF6295888586139B09DA5BF0D338&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;setting-up-a-custom-verification-context-sparkles&quot;&gt;Setting up a custom verification context ✨️&lt;&#x2F;h2&gt;
&lt;p&gt;In the following example we will add an override &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt; configuration file and an additional &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; hierarchy.
These additions will define a working signature verification policy for an unofficial repository on Arch Linux.&lt;&#x2F;p&gt;
&lt;p&gt;Here, we will define a policy for a custom package repository named &quot;my-repo&quot;.
We specify a &quot;context&quot; for this repository, in which we override the default Arch Linux &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt; configuration.&lt;&#x2F;p&gt;
&lt;p&gt;By storing the following configuration as &lt;code&gt;&#x2F;etc&#x2F;voa&#x2F;arch.yaml.d&#x2F;10-my-repo.yaml&lt;&#x2F;code&gt; we provide a specific override for this unofficial package repository:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ontexts&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;urpose&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ackage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ontext&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;y-repo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;echnology_settings&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;      o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;penpgp&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;um_data_signatures&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;erification_method&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;          p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;lain&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;            i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;dentity_domain_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;xample.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;            f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;ingerprint_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1d2d2f924e986ac86fdf7b36c94bcdf32beec15&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We can inspect this policy with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa-config.1&quot;&gt;&lt;code&gt;voa-config(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and see how it differs from the one used by Arch Linux:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; show&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-purpose&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-context&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🔏&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; requires&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; signature&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifiers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; successfully&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; using&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;plain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verification&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; method.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📧&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; User&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ID&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; that&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; domains&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifier:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; example.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🐾&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fingerprints&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifier:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; f1d2d2f924e986ac86fdf7b36c94bcdf32beec15&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📝&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; The&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; sources&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; been&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; creation&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Drop-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;etc&#x2F;voa&#x2F;arch.yaml.d&#x2F;10-my-repo.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Built-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; defaults&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Assuming a valid &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificate&lt;&#x2F;a&gt; with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprint&lt;&#x2F;a&gt; &lt;code&gt;f1d2d2f924e986ac86fdf7b36c94bcdf32beec15&lt;&#x2F;code&gt; is present (e.g. in &lt;code&gt;&#x2F;etc&#x2F;voa&#x2F;arch&#x2F;package&#x2F;my-repo&#x2F;openpgp&#x2F;f1d2d2f924e986ac86fdf7b36c94bcdf32beec15.openpgp&lt;&#x2F;code&gt;), it is now possible to verify signatures for package files with it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; openpgp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-package-1.0.0-1-x86_64.pkg.tar.zst{,.sig}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-package-1.0.0-1-x86_64.pkg.tar.zst.sig&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1767267369&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; f1d2d2f924e986ac86fdf7b36c94bcdf32beec15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; f1d2d2f924e986ac86fdf7b36c94bcdf32beec15&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;dev-scripts-construction-worker&quot;&gt;dev-scripts 👷&lt;&#x2F;h2&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; includes the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;dev-scripts&#x2F;index.html&quot;&gt;dev-scripts&lt;&#x2F;a&gt; testing tool for developers.
It allows running tests against several targets, including the OpenPGP verification of all packages in the official repositories.&lt;&#x2F;p&gt;
&lt;p&gt;To try this out, clone the project&#x27;s repository and download all packages in the official repositories.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;&#x2F;strong&gt;: Be aware that this downloads around 100GB of data!
You can limit the download amount by only targeting a specific repository (e.g. &lt;code&gt;core&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; clone&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archliunx&#x2F;alpm&#x2F;alpm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alpm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-release&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-bin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dev-scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test-files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; download&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Once downloaded, it is possible to verify all package files with their corresponding detached &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;signing_data.html&quot;&gt;OpenPGP data signature&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-release&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-bin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dev-scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test-files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; signatures&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    Finished&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;release&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; profile&lt;&#x2F;span&gt;&lt;span&gt; [optimized&lt;&#x2F;span&gt;&lt;span&gt;] target(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;) in 0.36s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;home&#x2F;user&#x2F;Downloads&#x2F;alpm&#x2F;.cargo&#x2F;runner.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; target&#x2F;release&#x2F;dev-scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test-files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; signatures&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [&lt;&#x2F;span&gt;&lt;span&gt;00:00:41&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;████████████████████████████████████████&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;15037&#x2F;15037,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ETA&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 0s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Verification speed will vary depending on your available resources.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;further-technology-backends-rocket&quot;&gt;Further technology backends 🚀&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;VOA&lt;&#x2F;a&gt; is designed as a generic and extensible solution for the verification of OS artifacts.&lt;&#x2F;p&gt;
&lt;p&gt;Other OSes are encouraged to use it for their respective needs.&lt;&#x2F;p&gt;
&lt;p&gt;At the time of writing, only the OpenPGP technology backend is fully specified and implemented in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt;.
The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa-openpgp&#x2F;&quot;&gt;voa-openpgp&lt;&#x2F;a&gt; crate itself is currently still awaiting the integration of the &quot;Web of Trust&quot; verification method based on the novel &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;nukesor&#x2F;berblom&quot;&gt;&quot;Berblom&quot;&lt;&#x2F;a&gt; algorithm.&lt;&#x2F;p&gt;
&lt;p&gt;A &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;baloo&#x2F;cms-verifier&#x2F;&quot;&gt;proof of concept for an X.509 technology backend&lt;&#x2F;a&gt; exists and we hope to progress on its full specification and integration this year.&lt;&#x2F;p&gt;
&lt;p&gt;In addition, external contributors have shown interest in adding a technology backend for signify (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;voa&#x2F;-&#x2F;issues&#x2F;24&quot;&gt;voa#24&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;If you are an expert in a specific signature technology, and want to collaborate, be sure to reach out!
We would love to hear from you.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A year of work on the ALPM project</title>
        <published>2026-01-10T09:00:00+00:00</published>
        <updated>2026-01-11T08:35:00+00:00</updated>
        
        <author>
          <name>
            
              archlinux-staff
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://devblog.archlinux.page/2026/a-year-of-work-on-the-alpm-project/"/>
        <id>https://devblog.archlinux.page/2026/a-year-of-work-on-the-alpm-project/</id>
        
        <content type="html" xml:base="https://devblog.archlinux.page/2026/a-year-of-work-on-the-alpm-project/">&lt;p&gt;In 2024 the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;programs&#x2F;fund&quot;&gt;Sovereign Tech Fund&lt;&#x2F;a&gt; (STF) started &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;tech&#x2F;arch-linux-package-management&quot;&gt;funding&lt;&#x2F;a&gt; work on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;, which provides a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rust-lang.org&#x2F;&quot;&gt;Rust&lt;&#x2F;a&gt;-based framework for Arch Linux Package Management.
Refer to the project&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;faq.html&quot;&gt;FAQ&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;mission-statement.html&quot;&gt;mission statement&lt;&#x2F;a&gt; to learn more about the relation to the tooling currently in use on Arch Linux.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;tech&#x2F;arch-linux-package-management&quot;&gt;funding&lt;&#x2F;a&gt; has now concluded, but over the time of 15 months allowed us to create various tools and integrations that we will highlight in the following sections.&lt;&#x2F;p&gt;
&lt;p&gt;We have worked on six milestones with focus on various aspects of the package management ecosystem, ranging from formalizing, parsing and writing of file formats, over cryptographic verification of distribution artifacts, to package file and system package management handling:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;1&#x2F;&quot;&gt;&quot;Formal specifications for packaging data formats&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;2&quot;&gt;&quot;Basic OpenPGP verification of artifacts&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;4&quot;&gt;&quot;Rust library for handling of individual packages&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;6&quot;&gt;&quot;Python bindings for alpm-srcinfo&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;3&quot;&gt;&quot;Distribution-agnostic OpenPGP stack for the verification of distribution artifacts&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;5&quot;&gt;&quot;Rust library for system package management&quot;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;We are considering ourselves as part of a larger free software ecosystem.
We believe that it makes sense to create value not only for our own niche, but for the greater good.
As such, we focused on finding generic solutions to the technological problems we are facing as a distribution.&lt;&#x2F;p&gt;
&lt;p&gt;We are incredibly grateful for the support from STF without which this type of extensive ground work would not have been possible.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alpm-stats-bar-chart&quot;&gt;ALPM stats 📊&lt;&#x2F;h2&gt;
&lt;p&gt;A lot of work has been done over the time of the STF &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;tech&#x2F;arch-linux-package-management&quot;&gt;funding&lt;&#x2F;a&gt;.
Below are a few statistics about the work done on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;iframe title=&quot;Work on the ALPM project in 2024 and 2025&quot; width=&quot;736&quot; height=&quot;414&quot; src=&quot;https:&#x2F;&#x2F;clip.place&#x2F;videos&#x2F;embed&#x2F;7t8AZALDB3A1C6qyhPf4Sm&quot; style=&quot;border: 0px; max-width: 100%;margin-top: 2em; margin-bottom: 2em;&quot; allow=&quot;fullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups allow-forms&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; shortlog&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-after=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;2024-10-01&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-summary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-numbered&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;   467&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  David&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Runge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;   252&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Arne&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Beer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;   173&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Orhun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Parmaksız&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;   117&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Jagoda&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Ślązak&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    54&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  renovate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Laura&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Demkowicz-Duffy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    14&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  David&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Schaefer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Christian&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Heusel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Heiko&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Schaefer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Morgan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Adamiec&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Adam&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Perkowski&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Daniel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Maslowski&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Dominik&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Peteler&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Jakub&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Klinkovský&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Rafael&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Epplée&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tokei&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Language&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;          Files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;       Lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        Code&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    Comments&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;      Blanks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BASH&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          37&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                     2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;              1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; CSS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                   4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2310&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1704&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         175&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         431&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; FreeMarker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           22&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         922&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         557&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         365&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; JavaScript&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         952&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         728&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         104&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         120&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; JSON&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1108&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1108&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1444&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1072&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         153&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         219&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Meson&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Python&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               31&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        6041&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        4871&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          70&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Sass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          88&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          46&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          12&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; SVG&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Plain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         770&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         615&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         155&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TOML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                 32&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1309&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1089&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          81&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         139&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; XML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                   2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          27&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          27&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; YAML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1053&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         798&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         255&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;─────────────────────────────────────────────────────────────────────────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; HTML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                 35&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1544&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1459&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          34&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          51&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; CSS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; JavaScript&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          41&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          36&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                        1591&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1501&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          36&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          54&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;─────────────────────────────────────────────────────────────────────────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Markdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;             95&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       10253&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        7000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        3253&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; BASH&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;              20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1052&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         929&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          40&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          83&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; HTML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; INI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         348&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         335&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; JSON&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          34&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          34&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Rust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;              12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         769&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         655&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          41&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          73&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Shell&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;              2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; TOML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         423&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         197&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         166&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          60&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; YAML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          17&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          17&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                       12916&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2182&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        7255&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        3479&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;─────────────────────────────────────────────────────────────────────────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Rust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                271&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       46298&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       38583&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1700&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        6015&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Markdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         235&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       15360&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         142&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       11744&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        3474&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                       61658&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       38725&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       13444&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        9489&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Total&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               551&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       92267&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       54468&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       21973&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       15826&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;specifications&quot;&gt;Specifications 📝&lt;&#x2F;h2&gt;
&lt;p&gt;Already in July we reported on the &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;&quot;&gt;state of the specifications on the devblog&lt;&#x2F;a&gt; and how they enable a deeper, shared view onto our current package management stack in Arch Linux.&lt;&#x2F;p&gt;
&lt;p&gt;A lot of custom file formats are in use in our ecosystem. Understanding how to use them is key to maintaining existing and envisioning new technology.&lt;&#x2F;p&gt;
&lt;p&gt;Interested developers and package maintainers are encouraged to browse them by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;file-formats.html&quot;&gt;file formats&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;concepts.html&quot;&gt;concepts&lt;&#x2F;a&gt;.
Meanwhile, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm.7.html&quot;&gt;alpm(7)&lt;&#x2F;a&gt; specification provides a good high-level entry-point to the entire topic.&lt;&#x2F;p&gt;
&lt;p&gt;We hope this empowers a much larger group of contributors to participate in discussions about the concepts behind Arch Linux&#x27;s package management.
Additionally, we want to enable interested developers to participate in hacking both on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; itself, as well as make it much easier to experiment with new applications that are built on top of it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;foundational-libraries&quot;&gt;Foundational libraries 📚️&lt;&#x2F;h2&gt;
&lt;p&gt;In the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; we chose a bottom-up, library first approach, in which libraries for basic tasks have been created iteratively in a workspace.
As more libraries for specific use-cases emerge, it becomes possible to build more elaborate or special purpose tools with them.&lt;&#x2F;p&gt;
&lt;p&gt;We invite interested Rust developers to have a look at the dedicated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;api-docs&#x2F;&quot;&gt;API documentation&lt;&#x2F;a&gt; to gain a better understanding and overview of the available libraries and their dependencies.&lt;&#x2F;p&gt;
&lt;p&gt;The central &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-types&#x2F;&quot;&gt;alpm-types&lt;&#x2F;a&gt; library provides shared low-level types, which are used in some or all file formats used by the Arch Linux package management stack.
These common types make it easy to build other, interoperable libraries on top of it.&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-common&#x2F;&quot;&gt;alpm-common&lt;&#x2F;a&gt;, central traits and utility functionality are made available to other libraries in the workspace.&lt;&#x2F;p&gt;
&lt;p&gt;After some consideration and research, we chose the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;winnow&#x2F;latest&#x2F;winnow&#x2F;&quot;&gt;winnow&lt;&#x2F;a&gt; parser combinator library to create parsers for the various custom file formats.
Shared functionality for parsers is made available in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-parsers&#x2F;&quot;&gt;alpm-parsers&lt;&#x2F;a&gt; library.&lt;&#x2F;p&gt;
&lt;p&gt;Package management systems usually revolve around central dependency resolver functionality.
With &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;merge_requests&#x2F;470&quot;&gt;alpm-solve&lt;&#x2F;a&gt; we have created a new approach to this for Arch Linux, which is based on the generic &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;resolvo&quot;&gt;resolvo&lt;&#x2F;a&gt; library.&lt;&#x2F;p&gt;
&lt;p&gt;Compression is an integral part of the packaging workflow.
It ensures that an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; file can be transferred over the network as fast as possible by reducing its size.
With the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-compress&#x2F;&quot;&gt;alpm-compress&lt;&#x2F;a&gt; library we have implemented extensible (de)compression for these files.&lt;&#x2F;p&gt;
&lt;p&gt;To allow extraction of metadata and data files from an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; file, as well as (rudimentary) package creation, we have created the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-package&#x2F;&quot;&gt;alpm-package&lt;&#x2F;a&gt; crate.
With it, it is possible to create package files from prepared input directories (which already contain relevant metadata and data files).
In addition, it is possible to effortlessly iterate over the data files contained in a package file and to extract validated metadata.&lt;&#x2F;p&gt;
&lt;p&gt;The creation process of an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; file requires to add root-owned files to a directory (e.g. as part of the installation process of an upstream project&#x27;s build system).
However, one does not want to run the package build process as root, but as an unprivileged user.
For this purpose we have created the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;rootless-run&quot;&gt;rootless-run&lt;&#x2F;a&gt; library, which generically abstracts running commands &quot;as root&quot; with the help of different backends (e.g. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;fakeroot.1&quot;&gt;&lt;code&gt;fakeroot(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;code&gt;rootlesskit&lt;&#x2F;code&gt;).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;libraries-and-command-line-interfaces&quot;&gt;Libraries and command line interfaces 💻️&lt;&#x2F;h2&gt;
&lt;p&gt;Based on specifications of file formats currently used in Arch Linux, we have created libraries that allow their parsing, validation and writing.&lt;&#x2F;p&gt;
&lt;p&gt;Notably, we distinguish between:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;File formats used in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-source-repo.7.html&quot;&gt;alpm-source-repo(7)&lt;&#x2F;a&gt; (i.e. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD(5)&lt;&#x2F;a&gt;),&lt;&#x2F;li&gt;
&lt;li&gt;those in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; (i.e. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-desc.5.html&quot;&gt;alpm-repo-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-files.5.html&quot;&gt;alpm-repo-files(5)&lt;&#x2F;a&gt;),&lt;&#x2F;li&gt;
&lt;li&gt;those in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db.7.html&quot;&gt;alpm-db(7)&lt;&#x2F;a&gt; (i.e. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-desc.5.html&quot;&gt;alpm-db-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-files.5.html&quot;&gt;alpm-db-files(5)&lt;&#x2F;a&gt;) and&lt;&#x2F;li&gt;
&lt;li&gt;those in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; (i.e. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFO.5.html&quot;&gt;BUILDINFO(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFO.5.html&quot;&gt;PKGINFO(5)&lt;&#x2F;a&gt;).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-srcinfo&#x2F;&quot;&gt;alpm-srcinfo&lt;&#x2F;a&gt; crate provides a library and command line interface for the parsing, validation and creation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; files from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD(5)&lt;&#x2F;a&gt; scripts.
Due to the dynamic nature of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD(5)&lt;&#x2F;a&gt; scripts, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; format is surprisingly complex (both to create and to evaluate).
The creation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; files from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD(5)&lt;&#x2F;a&gt; scripts is enabled via the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm-pkgbuild-bridge&quot;&gt;alpm-pkgbuild-bridge&lt;&#x2F;a&gt; project, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-pkgbuild&#x2F;&quot;&gt;alpm-pkgbuild&lt;&#x2F;a&gt; crate and a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.rs&#x2F;alpm-srcinfo&#x2F;0.6.1&#x2F;alpm_srcinfo&#x2F;pkgbuild_bridge&#x2F;&quot;&gt;translation layer&lt;&#x2F;a&gt; in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-srcinfo&#x2F;&quot;&gt;alpm-srcinfo&lt;&#x2F;a&gt;.
We have created &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-srcinfo&#x2F;ARCHITECTURE.html&quot;&gt;dedicated documentation&lt;&#x2F;a&gt; for the aspects of parsing and providing its data from different contexts.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-buildinfo&#x2F;&quot;&gt;alpm-buildinfo&lt;&#x2F;a&gt; crate provides a library and command line interface for the parsing, validation and creation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFO.5.html&quot;&gt;BUILDINFO(5)&lt;&#x2F;a&gt; files.
This file format is contained in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; and describes its build environment.
In the context of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;reproducible-builds.org&quot;&gt;reproducible builds&lt;&#x2F;a&gt; it is used to recreate the build environment.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-mtree&#x2F;&quot;&gt;alpm-mtree&lt;&#x2F;a&gt; crate provides a library and command line interface that allows parsing, validation and creation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt; files.
This file format is a subset of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;mtree.5&quot;&gt;mtree(5)&lt;&#x2F;a&gt; file format, provided by libarchive.
As it can be considered more of a meta language than a data format, we rely on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;bsdtar.1&quot;&gt;&lt;code&gt;bsdtar(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to write that file format.
An &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt; file is contained in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt;, as well as an entry of an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db.7.html&quot;&gt;alpm-db(7)&lt;&#x2F;a&gt; and represents a record of all files contained in the package during package creation time.
After installing a package to a system, this file can be used to verify ownership and mode of files installed by the package and detect any missing files.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-pkginfo&#x2F;&quot;&gt;alpm-pkginfo&lt;&#x2F;a&gt; crate offers a library and command line interface for the parsing, validation and creation of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFO.5.html&quot;&gt;PKGINFO(5)&lt;&#x2F;a&gt; files.
This file format is contained in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; and describes all relevant metadata of a package (e.g. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-relation.7.html&quot;&gt;alpm-package-relation(7)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-name.7.html&quot;&gt;alpm-package-name(7)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-version.7.html&quot;&gt;alpm-package-version(7)&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;Each system based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm.7.html&quot;&gt;alpm(7)&lt;&#x2F;a&gt; maintains its state using an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db.7.html&quot;&gt;alpm-db(7)&lt;&#x2F;a&gt;.
This state encompasses information on each package:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;the contained files (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-files.5.html&quot;&gt;alpm-db-files(5)&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;general metadata (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-desc.5.html&quot;&gt;alpm-db-desc(5)&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;a record that can be used to validate files of a package (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-db&#x2F;&quot;&gt;alpm-db&lt;&#x2F;a&gt; crate, it is possible to parse, validate and create the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-desc.5.html&quot;&gt;alpm-db-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-files.5.html&quot;&gt;alpm-db-files(5)&lt;&#x2F;a&gt; file formats.
Additionally, we have worked on database access for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db.7.html&quot;&gt;alpm-db(7)&lt;&#x2F;a&gt; structure following the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;ACID&quot;&gt;ACID&lt;&#x2F;a&gt; characteristics.&lt;&#x2F;p&gt;
&lt;p&gt;Packages for compiled languages (e.g. C or C++) usually contain files in the &lt;em&gt;Executable and Linkable Format&lt;&#x2F;em&gt; (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Executable_and_Linkable_Format&quot;&gt;ELF&lt;&#x2F;a&gt;).
These files may expose &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Soname&quot;&gt;soname&lt;&#x2F;a&gt; information which may be used as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-relation.7.html&quot;&gt;alpm-package-relation(7)&lt;&#x2F;a&gt; (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-sonamev1.7.html&quot;&gt;alpm-sonamev1(7)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-sonamev2.7.html&quot;&gt;alpm-sonamev2(7)&lt;&#x2F;a&gt; for the two currently understood formats).
With the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-soname&#x2F;&quot;&gt;alpm-soname&lt;&#x2F;a&gt; crate we have focused on the handling and extraction of information for the more modern &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-sonamev2.7.html&quot;&gt;alpm-sonamev2(7)&lt;&#x2F;a&gt; format as well as plain soname information.
As a library and CLI, this crate offers easy access to this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Executable_and_Linkable_Format&quot;&gt;ELF&lt;&#x2F;a&gt; data, which plays an important role in figuring out the run-time dependencies of packages.&lt;&#x2F;p&gt;
&lt;p&gt;Each &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo.7.html&quot;&gt;alpm-repo(7)&lt;&#x2F;a&gt; contains a set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; files, digital signatures and a package repository database (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt;).
An &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; tracks information on particular, unique packages:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;the contained files (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-files.5.html&quot;&gt;alpm-repo-files(5)&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;li&gt;general metadata (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-desc.5.html&quot;&gt;alpm-repo-desc(5)&lt;&#x2F;a&gt;)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-repo-db&#x2F;&quot;&gt;alpm-repo-db&lt;&#x2F;a&gt; crate, it is possible to parse, validate and write &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-desc.5.html&quot;&gt;alpm-repo-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-files.5.html&quot;&gt;alpm-repo-files(5)&lt;&#x2F;a&gt; files.
This crate provides both a library and CLI tool. In the future, it will be extended to allow the creation, reading and writing of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; files.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;development-integration-construction-worker&quot;&gt;Development integration 👷&lt;&#x2F;h2&gt;
&lt;p&gt;To test integration of our libraries against real world data, we have created the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;dev-scripts&#x2F;&quot;&gt;dev-scripts&lt;&#x2F;a&gt; crate.
It lives in the context of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;, and is intended as development testbed for assumptions of the various libraries. As such, the crate does not get any releases.&lt;&#x2F;p&gt;
&lt;p&gt;The test integration makes it easy to download and prepare live data:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;package source repositories (official and all of the AUR)&lt;&#x2F;li&gt;
&lt;li&gt;official binary package repositories&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Currently, it is possible to verify&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; files in package source repositories of the official repositories and all of the AUR&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE(5)&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFO.5.html&quot;&gt;BUILDINFO(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFO.5.html&quot;&gt;PKGINFO(5)&lt;&#x2F;a&gt; files in binary packages in the official repositories&lt;&#x2F;li&gt;
&lt;li&gt;the OpenPGP signatures of all packages in the official repositories&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-desc.5.html&quot;&gt;alpm-db-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-files.5.html&quot;&gt;alpm-db-files(5)&lt;&#x2F;a&gt; files in the entries of a local &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-db&#x2F;&quot;&gt;alpm-db&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-desc.5.html&quot;&gt;alpm-repo-desc(5)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-files.5.html&quot;&gt;alpm-repo-files(5)&lt;&#x2F;a&gt; files in the entries of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; files of the official repositories&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;python-bindings-snake&quot;&gt;Python bindings 🐍&lt;&#x2F;h2&gt;
&lt;p&gt;We provide Python bindings to make our modern Rust-based parsers and verified types available for use in some other projects of the distribution.&lt;&#x2F;p&gt;
&lt;p&gt;Arch Linux&#x27;s largest Python-based project, with arguably also the largest user-base, is the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;aurweb&#x2F;&quot;&gt;AURweb&lt;&#x2F;a&gt;, which powers the Arch User Repository (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;&quot;&gt;AUR&lt;&#x2F;a&gt;).
The web application deals with user input, e.g. via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; files and currently relies on the native Python library &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;kyrias&#x2F;python-srcinfo&quot;&gt;python-srcinfo&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;(As a sidenote: If you are a Python developer and interested in helping maintain a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fastapi.tiangolo.com&#x2F;&quot;&gt;FastAPI&lt;&#x2F;a&gt; based web application, please reach out to the project! We are always looking for further contributors and maintainers!)&lt;&#x2F;p&gt;
&lt;p&gt;The Python bindings for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; are available on PyPI as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;python-alpm&#x2F;&quot;&gt;python-alpm&lt;&#x2F;a&gt;.
With them, we have focused on providing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO(5)&lt;&#x2F;a&gt; support by relying on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-srcinfo&#x2F;&quot;&gt;alpm-srcinfo&lt;&#x2F;a&gt; library and by proxy expose a lot of types from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-types&#x2F;&quot;&gt;alpm-types&lt;&#x2F;a&gt; library as well.&lt;&#x2F;p&gt;
&lt;p&gt;The integration of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;python-alpm&#x2F;&quot;&gt;python-alpm&lt;&#x2F;a&gt; library into the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;aurweb&#x2F;&quot;&gt;AURweb&lt;&#x2F;a&gt; application is currently prepared (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;aurweb&#x2F;-&#x2F;merge_requests&#x2F;876&quot;&gt;aurweb!876&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;If you are a Python developer and have specific needs for the integration of other libraries of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;, we would &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;community.html&quot;&gt;love to hear from you&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;linting-yarn&quot;&gt;Linting 🧶&lt;&#x2F;h2&gt;
&lt;p&gt;Linters are tools that shift some tedious responsibilities (e.g. quality control) from humans to automation.
They are used to automatically detect common mistakes and deviations from established best practices.
The goal of linting is to support humans in performing a task well, keeping them on a level with changes in best practices, and empowering them to produce better quality results with less manual effort.&lt;&#x2F;p&gt;
&lt;p&gt;The usability and robustness of a distribution like Arch Linux currently relies heavily on the diligence of its package maintainers.
Only if package maintainers make an effort to stay up to date with recent developments in packaging (e.g. best practices for languages or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD(5)&lt;&#x2F;a&gt; scripts) can the resulting package files maintain a high quality standard.&lt;&#x2F;p&gt;
&lt;p&gt;Relying on the written &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2026&#x2F;a-year-of-work-on-the-alpm-project&#x2F;#specifications&quot;&gt;specifications&lt;&#x2F;a&gt;, &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2026&#x2F;a-year-of-work-on-the-alpm-project&#x2F;#foundational-libraries&quot;&gt;foundational libraries&lt;&#x2F;a&gt;, as well as &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2026&#x2F;a-year-of-work-on-the-alpm-project&#x2F;#libraries-and-command-line-interfaces&quot;&gt;libraries and command line interfaces&lt;&#x2F;a&gt; we decided to create a framework for lints, that centrally exposes its knowledge database and allows to flexibly create new rules for various purposes.
As such, another central goal of this framework is to provide a single, &lt;strong&gt;central&lt;&#x2F;strong&gt; tool that covers all aspects of Arch Linux package management.&lt;&#x2F;p&gt;
&lt;p&gt;With the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-lint&#x2F;&quot;&gt;alpm-lint&lt;&#x2F;a&gt; crate, a central library and command line interface has been created, that thoroughly documents its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-lint&#x2F;ARCHITECTURE.html&quot;&gt;architecture&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-lint&#x2F;CONTRIBUTING.html&quot;&gt;how to add new lint rules&lt;&#x2F;a&gt;.
A custom, central website provides details about all currently existing lints, derived from the code documentation of the lint rules:
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;lints&#x2F;&quot;&gt;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;lints&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;img title=&quot;Screenshot of the ALPM lint website&quot; alt=&quot;A screenshot of the ALPM lint website, showing several collapsed lint rules in a searchable overview.&quot; src=&quot;screenshot-alpm-lint-website.png&quot; &#x2F;&gt;
&lt;img title=&quot;Screenshot of the ALPM lint website with an expanded lint rule&quot; alt=&quot;A screenshot of the ALPM lint website, showing one collapsed and one expanded lint rule.&quot; src=&quot;screenshot-alpm-lint-website-expanded.png&quot; &#x2F;&gt;
&lt;p&gt;Using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;alpm-lint.1&quot;&gt;&lt;code&gt;alpm-lint(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; CLI, package maintainers are enabled to validate various &lt;em&gt;scopes&lt;&#x2F;em&gt; relevant to packaging (e.g. contents of an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-source-repo.7.html&quot;&gt;alpm-source-repo(7)&lt;&#x2F;a&gt; or an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; file).&lt;&#x2F;p&gt;
&lt;p&gt;The crate currently only offers a small set of lints and we encourage interested package maintainers with a background in Rust to write further lints.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;translations-globe-with-meridians&quot;&gt;Translations 🌐&lt;&#x2F;h2&gt;
&lt;p&gt;We are targeting the English language as first language for the project, but many people that are exposed to its error handling and command line interfaces are not native English speakers, or do not speak the language at all.
While writing libraries and command line interfaces for various purposes in the context of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; we realized that we needed to improve the translation (aka. internationalization or &lt;em&gt;i18n&lt;&#x2F;em&gt;) story of the project.&lt;&#x2F;p&gt;
&lt;p&gt;After some research on current technologies used for software translation, we have settled on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;projectfluent.org&#x2F;&quot;&gt;fluent&lt;&#x2F;a&gt; framework and created a convenient integration for our purposes with the custom &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;orhun&#x2F;fluent-i18n&quot;&gt;fluent-i18n&lt;&#x2F;a&gt; crate.&lt;&#x2F;p&gt;
&lt;p&gt;Interested users can now start translating the project on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;weblate.org&#x2F;&quot;&gt;weblate&lt;&#x2F;a&gt;, following our dedicated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;CONTRIBUTING.html#localization-and-translations&quot;&gt;contributing guidelines on localizations and translations&lt;&#x2F;a&gt;: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hosted.weblate.org&#x2F;projects&#x2F;alpm&#x2F;&quot;&gt;https:&#x2F;&#x2F;hosted.weblate.org&#x2F;projects&#x2F;alpm&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;voa-lock-with-ink-pen&quot;&gt;VOA 🔏&lt;&#x2F;h2&gt;
&lt;p&gt;Arch Linux uses OpenPGP for the verification of its packages.&lt;&#x2F;p&gt;
&lt;p&gt;The current OpenPGP integration hinges on a central GnuPG-based keyring.
This solution suffers from several shortcomings:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The keyring is context-independent.
It is not possible to represent different verification contexts with it, e.g. package repository metadata that is signed with a different set of keys than those used for signing packages, or packages in unofficial repositories are signed by a different set of keys than those used for the official repositories.&lt;&#x2F;li&gt;
&lt;li&gt;The keyring and its behavior is specific to the GnuPG tool, and in part unspecified. The setup cannot be reliably used with other OpenPGP implementations.&lt;&#x2F;li&gt;
&lt;li&gt;The keyring is stateful, and while its contents are populated by data from the package for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&quot;&gt;archlinux-keyring&lt;&#x2F;a&gt;, the entire mechanism requires a root-run agent service.&lt;&#x2F;li&gt;
&lt;li&gt;The GnuPG upstream has denounced the IETF-driven OpenPGP standardization process and has subsequently been removed from other major package management software such as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;apt.8&quot;&gt;&lt;code&gt;apt(8)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;rpm.8&quot;&gt;&lt;code&gt;rpm(8)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; over the last three years.
Compatibility with other OpenPGP implementations is no longer guaranteed (see e.g. the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;GnuPG#OpenPGP_compatibility&quot;&gt;ArchWiki article on GnuPG&lt;&#x2F;a&gt; for details)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Already before 2024, the idea emerged to verify digital signatures not with a stateful keyring mechanism, but to instead use a stateless directory structure containing verifiers (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;keyringctl&#x2F;-&#x2F;issues&#x2F;3&quot;&gt;keyringctl#3&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;This idea was discussed with a set of cross-distribution developers during &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lwn.net&#x2F;Articles&#x2F;994704&#x2F;&quot;&gt;Image-based Linux Summit 2024&lt;&#x2F;a&gt; and extended from the initial idea of a lookup directory only for OpenPGP to a more general, technology-agnostic mechanism.&lt;&#x2F;p&gt;
&lt;p&gt;In a nutshell, we set out to create a directory structure containing e.g. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificates&lt;&#x2F;a&gt;, SSH pubkeys or X.509 certificates, which clearly describes in what context such verifiers are used when verifying artifacts of a distribution.
A more in-depth discussion and rundown of the topic can be found in the talk &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;media.html#2025-verification-of-os-artifacts-without-stateful-keyrings-all-systems-go&quot;&gt;&quot;Verification of OS artifacts without stateful keyrings&quot;&lt;&#x2F;a&gt; from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;all-systems-go.io&#x2F;&quot;&gt;All Systems Go!&lt;&#x2F;a&gt; 2025.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;uapi-specification-writing-hand&quot;&gt;UAPI specification ✍️&lt;&#x2F;h3&gt;
&lt;p&gt;In late 2024 we started &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;uapi-group&#x2F;specifications&#x2F;pull&#x2F;134&quot;&gt;work on a specification&lt;&#x2F;a&gt; to describe this new, technology-agnostic signature verification mechanism and to collect input from relevant stakeholders in several of the more complex technologies that we wanted to cover.&lt;&#x2F;p&gt;
&lt;p&gt;The initial version of the specification &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uapi-group.org&#x2F;specifications&#x2F;specs&#x2F;file_hierarchy_for_the_verification_of_os_artifacts&#x2F;&quot;&gt;&quot;File Hierarchy for the Verification of OS Artifacts (VOA)&quot;&lt;&#x2F;a&gt; has been made available in June 2025 and covers the integration of OpenPGP as a first technology backend.&lt;&#x2F;p&gt;
&lt;p&gt;Further technology backend specifications are available as drafts, but need more work to iron out open questions.
If you have expertise with the use of SSH, X.509, minisign or signify for the signing of artifacts and have an interest in working on a Rust codebase, please reach out and help stabilize these additional backends!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;voa-reference-implementation-keyboard&quot;&gt;VOA reference implementation ⌨️&lt;&#x2F;h3&gt;
&lt;p&gt;In July 2025 we started work on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;VOA project&lt;&#x2F;a&gt;, as a reference implementation of the UAPI specification.&lt;&#x2F;p&gt;
&lt;p&gt;Here are some statistics about the project:&lt;&#x2F;p&gt;
&lt;iframe title=&quot;Work on the VOA project in 2025&quot; width=&quot;736&quot; height=&quot;414&quot; src=&quot;https:&#x2F;&#x2F;clip.place&#x2F;videos&#x2F;embed&#x2F;8mvGkekuycBW4o7k1absNH&quot; style=&quot;border: 0px; max-width: 100%;margin-top: 2em; margin-bottom: 2em;&quot; allow=&quot;fullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups allow-forms&quot;&gt;&lt;&#x2F;iframe&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; shortlog&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-summary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-numbered&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;   190&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  David&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Runge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    17&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  Heiko&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Schaefer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  renovate&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  David&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Schaefer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tokei&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Language&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;          Files&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;       Lines&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        Code&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    Comments&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;      Blanks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; JSON&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Just&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         849&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         580&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         109&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         160&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Plain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;            4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         770&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         615&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         155&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; TOML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         364&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         309&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          14&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          41&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; YAML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                  5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         110&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         110&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;─────────────────────────────────────────────────────────────────────────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Markdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;             15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1340&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         847&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         493&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; BASH&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         133&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         101&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Rust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         200&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         156&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          18&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          26&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Shell&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;              1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; YAML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          94&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          94&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;           0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                        1770&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         283&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         966&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         521&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;─────────────────────────────────────────────────────────────────────────&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Rust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;                 70&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       13685&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       11301&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         478&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        1906&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Markdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          69&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2832&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;          29&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2229&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;         574&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Total&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                       16517&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       11330&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2707&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        2480&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Total&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;               108&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       20396&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;       12628&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        4411&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        3357&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Central handling of the VOA hierarchy is implemented in the technology-independent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa-core&#x2F;&quot;&gt;voa-core&lt;&#x2F;a&gt; library.
It serves as an abstraction to access verifiers from the filesystem.&lt;&#x2F;p&gt;
&lt;p&gt;The use of OpenPGP-specific verifiers has been implemented in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa-openpgp&#x2F;&quot;&gt;voa-openpgp&lt;&#x2F;a&gt; library. It handles artifact verification based on several different methods:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;plain&quot;: Artifacts are verified directly with artifact verifiers, without additional trust anchors.
Artifact verifiers can be filtered using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprints&lt;&#x2F;a&gt; or domain name matches for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#user-ids&quot;&gt;OpenPGP User ID&lt;&#x2F;a&gt;s.&lt;&#x2F;li&gt;
&lt;li&gt;simple &quot;trust anchor&quot;: Artifacts are verified using artifact verifiers, which in turn must be certified by trust anchors.
Artifact verifiers can be filtered using domain name matches for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#user-ids&quot;&gt;OpenPGP User ID&lt;&#x2F;a&gt;s and trust anchors can be filtered using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprints&lt;&#x2F;a&gt;.
Additionally, the number of required individual certifications for User IDs on each artifact verifier can be specified.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt;: Artifacts are verified using artifact verifiers, which must reach a sufficient level of trust according to an OpenPGP &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; implementation.
Artifact verifiers can be filtered using domain name matches for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#user-ids&quot;&gt;OpenPGP User ID&lt;&#x2F;a&gt;s and trust anchors can be filtered using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#fingerprint&quot;&gt;OpenPGP fingerprints&lt;&#x2F;a&gt;.
Additionally, the target trust amount, the trust amount of trusted introducers and the trust amount of filtered trust anchors can be set to a custom value.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Orthogonal to the trust models outlined above, it is possible to specify the required number of independent and valid OpenPGP data signatures per artifact.&lt;&#x2F;p&gt;
&lt;p&gt;On Arch Linux we are currently using the Web of Trust implementation that GnuPG offers, on the basis of a GnuPG-specific keyring.
However, for all intents and purposes, we are not making use of the features that the full &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; model provides.
Apart from basic temporal OpenPGP semantics and cryptographic validity, the following rules apply in archlinux-keyring:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;There is a set of three or more certificates that serve as trust anchors.&lt;&#x2F;li&gt;
&lt;li&gt;There is a set of packager certificates that each must have an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html#user-ids&quot;&gt;OpenPGP User ID&lt;&#x2F;a&gt; with an email that uses the &lt;em&gt;&quot;archlinux.org&quot;&lt;&#x2F;em&gt; domain and has three or more third-party certifications from trust anchors.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;So in practice, Arch Linux relies on a &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; with exactly one level of indirection, and manually curated sets of trust anchors and artifact verifiers. With voa-openpgp, Arch&#x27;s verification requirements are best modeled with the simple “trust anchor” model.&lt;&#x2F;p&gt;
&lt;p&gt;As an additional feature, we have implemented the import of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificates&lt;&#x2F;a&gt; as verifiers into VOA hierarchies from different sources.
The import supports &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificates&lt;&#x2F;a&gt; split into OpenPGP packets and the custom directory structure used by archlinux-keyring.&lt;&#x2F;p&gt;
&lt;p&gt;With the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa-config&#x2F;&quot;&gt;voa-config&lt;&#x2F;a&gt; library we have added support for a central configuration file format with which settings for VOA technology backends can be supplied.
The file format (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.5&quot;&gt;voa(5)&lt;&#x2F;a&gt;) allows flexible overrides that specify custom rules for any type of context in an OS.&lt;&#x2F;p&gt;
&lt;p&gt;The following configuration describes the current policy for the Arch Linux distribution (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;archlinux-keyring&#x2F;-&#x2F;blob&#x2F;10890ed75b546c28aa9ab55bb5d232cd25298a97&#x2F;arch.yaml&quot;&gt;arch.yaml&lt;&#x2F;a&gt;):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;efault_technology_settings&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;  o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;penpgp&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;um_data_signatures&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;    v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;erification_method&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;      t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rust_anchor&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;equired_certifications&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rtifact_verifier_identity_domain_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;rchlinux.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;        t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;rust_anchor_fingerprint_matches&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Levente Polyak (Arch Linux Master Key) &amp;lt;anthraxx@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;8afdda07a5b6edfa7d8ccdad6d055f927843f1c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Leonidas Spyropoulos (Arch Linux Master Key) &amp;lt;artafinde@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;572fa2a1b067f22c58af155f8b821b42a6fdcd7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Johannes Löthberg (Arch Linux Master Key) &amp;lt;demize@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;9e6471e3ae065297529832e6ba0f5a2037f4f41&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; David Runge (Arch Linux Master Key) &amp;lt;dvzrv@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ac0a42efb0b5cbc7a0402ed4dc95b6d7be9892e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;          #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Florian Pritz (Arch Linux Master Key) &amp;lt;florian@master-key.archlinux.org&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1ffe0700e80619ceb73235ca88e23e377514e00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;voa-high-level-api-and-cli-desktop&quot;&gt;VOA high-level API and CLI 🖥️&lt;&#x2F;h3&gt;
&lt;p&gt;In the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&#x2F;voa&#x2F;&quot;&gt;voa&lt;&#x2F;a&gt; crate we provide a high-level API for consumers of VOA and a command line interface.&lt;&#x2F;p&gt;
&lt;p&gt;With &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.1&quot;&gt;&lt;code&gt;voa(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, it is possible to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Inspect technology backend configuration settings.&lt;&#x2F;li&gt;
&lt;li&gt;Import &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;openpgp.dev&#x2F;book&#x2F;certificates.html&quot;&gt;OpenPGP certificates&lt;&#x2F;a&gt; as VOA verifiers.&lt;&#x2F;li&gt;
&lt;li&gt;List all VOA verifiers (by OS or specific context).&lt;&#x2F;li&gt;
&lt;li&gt;Verify a file using a detached OpenPGP signature and suitable VOA verifiers.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;All subcommands support JSON output.&lt;&#x2F;p&gt;
&lt;p&gt;The following example illustrates the semantics of the default VOA technology backend settings for Arch Linux as shown in the previous section:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; show&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🔏&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; requires&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; data&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; signature&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifiers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; successfully&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Each&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; is&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verified&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; using&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;trust anchor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verification&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; method.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📧&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; User&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ID&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; that&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; uses&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; domains&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; and&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; has&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certification&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; individual&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; trust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; anchors&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; it&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verifier:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; archlinux.org&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;🐾&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; valid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; certificate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; must&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; one&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OpenPGP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fingerprints&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; be&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; trust&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; anchor:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 2ac0a42efb0b5cbc7a0402ed4dc95b6d7be9892e&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3572fa2a1b067f22c58af155f8b821b42a6fdcd7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 69e6471e3ae065297529832e6ba0f5a2037f4f41&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 91ffe0700e80619ceb73235ca88e23e377514e00&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; d8afdda07a5b6edfa7d8ccdad6d055f927843f1c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;📝&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; The&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; following&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; sources&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; have&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; been&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; considered&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; creation&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; the&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; settings:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; file:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;share&#x2F;voa&#x2F;arch.yaml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;⤷&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Built-in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; defaults&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After installing the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;packages&#x2F;core&#x2F;any&#x2F;voa-verifiers-arch&#x2F;&quot;&gt;voa-verifiers-arch&lt;&#x2F;a&gt; package, which provides the VOA verifiers used by Arch Linux, it is possible to verify Arch Linux artifacts (e.g. package files) using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;voa.1&quot;&gt;&lt;code&gt;voa(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; voa&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; arch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; package&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; openpgp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&#x2F;shadow-4.18.0-1-x86_64.pkg.tar.zst{,.sig}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;✅&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;var&#x2F;cache&#x2F;pacman&#x2F;pkg&#x2F;shadow-4.18.0-1-x86_64.pkg.tar.zst.sig&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1751009927&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 991f6e3f0765cf6295888586139b09da5bf0d338&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 62cc73f884e52957b2fdd8839b7a287d9a2ec608&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;web-of-trust-and-the-berblom-algorithm-spider-web&quot;&gt;Web of Trust and the Berblom algorithm 🕸️&lt;&#x2F;h3&gt;
&lt;p&gt;The generalized &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; model remains an interesting option in the OpenPGP domain. The &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; enables more complex and more nuanced setups than the basic &quot;trust anchor&quot; mode. It also allows for fully decentralized management of trust, without relying on any single authority.&lt;&#x2F;p&gt;
&lt;p&gt;Over the course of 2024 and 2025, research has gone into comparing different &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; implementations (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;heiko&#x2F;wot-observatory&quot;&gt;wot-observatory&lt;&#x2F;a&gt;).
The existing (legacy) implementations have surprising limitations and&#x2F;or defects when it comes to the calculation of trust.
This research led us to the conclusion that instead of relying on existing implementations and designs, a new approach was warranted to overcome the limitations of existing &lt;em&gt;&quot;Web of Trust&quot;&lt;&#x2F;em&gt; subsystems.&lt;&#x2F;p&gt;
&lt;p&gt;Our design is highly modular and centers around a pathfinding algorithm named &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;Nukesor&#x2F;berblom&#x2F;&quot;&gt;&quot;Berblom&quot;&lt;&#x2F;a&gt;.
Berblom is a novel and well-documented approach, which serves as a robust, general and efficient way of calculating the trust amount for an artifact verifier.&lt;&#x2F;p&gt;
&lt;p&gt;We are excited to integrate Berblom into the VOA reference implementation in 2026.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future-work-rocket&quot;&gt;Future work 🚀&lt;&#x2F;h2&gt;
&lt;p&gt;We believe the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; succeeded in the goals it set for itself in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;tech&#x2F;arch-linux-package-management&quot;&gt;funding&lt;&#x2F;a&gt; period with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.sovereign.tech&#x2F;programs&#x2F;fund&quot;&gt;Sovereign Tech Fund&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;While a lot of foundational documentation and central libraries have been written, there is still more work ahead.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;more-lints-yarn-yarn&quot;&gt;More lints 🧶🧶&lt;&#x2F;h3&gt;
&lt;p&gt;The new lint framework provided by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-lint&#x2F;&quot;&gt;alpm-lint&lt;&#x2F;a&gt; currently only features few lints.&lt;&#x2F;p&gt;
&lt;p&gt;Going forward, we want to extend this list in the dedicated &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;alpm&#x2F;-&#x2F;milestones&#x2F;10&quot;&gt;&quot;Lints&quot; milestone&lt;&#x2F;a&gt; and encourage anyone with Rust experience and an interest in packaging to help with this.&lt;&#x2F;p&gt;
&lt;p&gt;In addition to implementing lint rules, we want to explore the inclusion of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;alpm-lint.1&quot;&gt;&lt;code&gt;alpm-lint(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; CLI in the canonical package build tooling for Arch Linux.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;c-api-c&quot;&gt;C-API 🇨&lt;&#x2F;h3&gt;
&lt;p&gt;Our original project plan included potentially emulating the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;libalpm.3&quot;&gt;libalpm&lt;&#x2F;a&gt; C-API in the scope of the contracting work.
However, during the last months we realized, that for many consumers it would be more useful to rely on the finer grained libraries of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; directly instead.
In addition, not all relevant database handling features are fully implemented yet, which would limit the usefulness of a C wrapper library.&lt;&#x2F;p&gt;
&lt;p&gt;In the medium term, it is certainly possible for interested developers to create an emulation of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;libalpm.3&quot;&gt;libalpm&lt;&#x2F;a&gt; C library based on ALPM.
Reach out in case you are interested in something like this!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;repository-database-handling-package&quot;&gt;Repository database handling 📦️&lt;&#x2F;h3&gt;
&lt;p&gt;In the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-repo-db&#x2F;&quot;&gt;alpm-repo-db&lt;&#x2F;a&gt; crate we have added support for the data files in use in an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Going forward, we want to add full handling of the database format: Creation, reading and compression of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; files and the addition, update and removal of entries.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;add-libkrun-support-to-rootless-run-runner-arrow-right&quot;&gt;Add libkrun support to rootless-run 🏃‍➡️&lt;&#x2F;h3&gt;
&lt;p&gt;Both &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;fakeroot.1&quot;&gt;&lt;code&gt;fakeroot(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;code&gt;rootlesskit&lt;&#x2F;code&gt; have their place in certain contexts, but they each also have their weaknesses (e.g. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;fakeroot.1&quot;&gt;&lt;code&gt;fakeroot(1)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; does not provide isolation, &lt;code&gt;rootlesskit&lt;&#x2F;code&gt; does not work &lt;em&gt;in&lt;&#x2F;em&gt; a containerized context).&lt;&#x2F;p&gt;
&lt;p&gt;Going forward, we want to explore adding &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;containers&#x2F;libkrun&quot;&gt;libkrun&lt;&#x2F;a&gt; support to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;rootless-run&quot;&gt;rootless-run&lt;&#x2F;a&gt; to accommodate stronger isolation on the basis of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Kernel-based_Virtual_Machine&quot;&gt;KVM&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;downloading-of-artifacts-arrow-double-down&quot;&gt;Downloading of artifacts ⏬️&lt;&#x2F;h3&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-package&#x2F;&quot;&gt;alpm-package&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;alpm-repo-db&#x2F;&quot;&gt;alpm-repo-db&lt;&#x2F;a&gt; crates provide integration for handling local package and repository database files.&lt;&#x2F;p&gt;
&lt;p&gt;In a package management workflow these are usually downloaded from an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo.7.html&quot;&gt;alpm-repo(7)&lt;&#x2F;a&gt;. We want to provide support for securely downloading these artifacts over the network.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;verification-of-artifacts-lock-with-ink-pen&quot;&gt;Verification of artifacts 🔏&lt;&#x2F;h3&gt;
&lt;p&gt;VOA provides a distribution- and technology-agnostic specification for artifact verification.&lt;&#x2F;p&gt;
&lt;p&gt;Using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;voa.archlinux.page&quot;&gt;voa project&lt;&#x2F;a&gt; reference implementation, we want to add OpenPGP based verification for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package(7)&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-db.7.html&quot;&gt;alpm-repo-db(7)&lt;&#x2F;a&gt; files.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;more-voa-technology-backends-closed-lock-with-key&quot;&gt;More VOA technology backends 🔐&lt;&#x2F;h3&gt;
&lt;p&gt;With the technology backend for OpenPGP in place, we have ironed out the generic handling of verifiers in the voa reference implementation.&lt;&#x2F;p&gt;
&lt;p&gt;Interested parties have already worked on a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;baloo&#x2F;cms-verifier&#x2F;&quot;&gt;proof of concept for an x.509 technology backend&lt;&#x2F;a&gt; and provided a ticket for the inclusion of signify as technology backend (see &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;alpm&#x2F;voa&#x2F;-&#x2F;issues&#x2F;24&quot;&gt;voa#24&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;If you are interested in helping with the specification and implementation of more technology backends, please reach out!&lt;&#x2F;p&gt;
&lt;h3 id=&quot;extend-python-bindings-snake-snake&quot;&gt;Extend Python bindings 🐍🐍&lt;&#x2F;h3&gt;
&lt;p&gt;We are very happy with the current feature set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;python-alpm&#x2F;&quot;&gt;python-alpm&lt;&#x2F;a&gt;.
Going forward, we want to extend the API for the Python bindings further to cover even more use-cases of interested projects, such as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;archlinux&#x2F;archinstall&quot;&gt;archinstall&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;If you enjoy hacking on the intersection of Rust and Python, feel free to reach out!
We would be excited to collaborate with any interested contributors.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;more-applications-keyboard&quot;&gt;More applications ⌨️&lt;&#x2F;h3&gt;
&lt;p&gt;The new set of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; libraries enables building robust tools.
Users of the libraries can rely on a strongly typed, memory safe language 🦀&lt;&#x2F;p&gt;
&lt;p&gt;This empowers developers to build new special purpose package management applications with much greater ease.
We look forward to building such applications ourselves, as well as seeing other parties building them.&lt;&#x2F;p&gt;
&lt;p&gt;Ultimately, user-facing improvements are our goal, and we think the foundation that we laid over the past year is fertile ground for innovation.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing pkgctl license</title>
        <published>2025-08-02T00:00:00+00:00</published>
        <updated>2025-08-02T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              archlinux-staff
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://devblog.archlinux.page/2025/pkgctl-license/"/>
        <id>https://devblog.archlinux.page/2025/pkgctl-license/</id>
        
        <content type="html" xml:base="https://devblog.archlinux.page/2025/pkgctl-license/">&lt;p&gt;In Arch Linux, as part of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfc.archlinux.page&#x2F;0040-license-package-sources&#x2F;&quot;&gt;RFC40&lt;&#x2F;a&gt;, we have recently decided to license all Arch Linux package sources as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;spdx.org&#x2F;licenses&#x2F;0BSD.html&quot;&gt;0BSD&lt;&#x2F;a&gt;.
Our package sources didn&#x27;t have any license previously.
RFC40 only specified &lt;em&gt;that&lt;&#x2F;em&gt; we do want to license our package sources but it didn&#x27;t specify &lt;em&gt;how&lt;&#x2F;em&gt; to ensure this.
As such, in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfc.archlinux.page&#x2F;0052-reuse&#x2F;&quot;&gt;RFC52&lt;&#x2F;a&gt; we decided we want to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;reuse.software&#x2F;&quot;&gt;REUSE&lt;&#x2F;a&gt; to achieve that.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;&#x2F;strong&gt; It might be a bit confusing that our &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD&lt;&#x2F;a&gt; files also have a &lt;code&gt;license&lt;&#x2F;code&gt; field.
However, this field specifies the upstream license, i.e. the license of the software that we package.
It does &lt;em&gt;not&lt;&#x2F;em&gt; specify the license of the package sources.
This blog post is about tooling to manage the licenses for our package sources.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reuse&quot;&gt;REUSE&lt;&#x2F;h2&gt;
&lt;p&gt;REUSE is a tool that checks whether all files in your project are legally accounted for.
Without it, it wouldn&#x27;t be quite so clear which files fall under what license exactly.
REUSE requires either per-file &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;spdx.org&#x2F;licenses&#x2F;&quot;&gt;&lt;code&gt;SPDX-License-Identifier&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; annotations or a central &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We decided we wanted a central place per repository for all licenses and went with having a &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; file.
That file has a fairly simple format and usually looks something like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;annotations&lt;&#x2F;span&gt;&lt;span&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;foo.c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-FileCopyrightText&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;John Doe&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-License-Identifier&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;GPL-3.0-only&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So, that&#x27;s our fundamental building block.
The licenses should always be in the format specified by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;spdx.org&#x2F;licenses&#x2F;&quot;&gt;SPDX&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Before checking the licenses of a project that we have setup with a
&lt;code&gt;REUSE.toml&lt;&#x2F;code&gt;, we have to download the respective license files. This is
achieved using &lt;code&gt;reuse download --all&lt;&#x2F;code&gt;, which will download the specified
licenses to the &lt;code&gt;LICENSES&#x2F;&lt;&#x2F;code&gt; directory. Afterwards we can run &lt;code&gt;reuse lint&lt;&#x2F;code&gt; to
check the project for license compliance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;integrating-into-devtools&quot;&gt;Integrating into devtools&lt;&#x2F;h2&gt;
&lt;p&gt;Most of our package maintainer tooling lives in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;devtools&#x2F;&quot;&gt;devtools&lt;&#x2F;a&gt; repository.&lt;&#x2F;p&gt;
&lt;p&gt;The idea now was to integrate REUSE with our existing tooling to ease the pain with initial setup and to ensure that it&#x27;s always run before our package maintainers push new packages.&lt;&#x2F;p&gt;
&lt;p&gt;We have roughly 12000 packages and we wanted to save everyone&#x27;s time as much as possible.
Having our folks write 12000 &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt;s by hand wasn&#x27;t going to cut it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;integrating-into-pkgctl&quot;&gt;Integrating into pkgctl&lt;&#x2F;h3&gt;
&lt;p&gt;We use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;pkgctl.1&quot;&gt;&lt;code&gt;pkgctl&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as our universal swiss-army-knife for all kinds of packaging related tasks.
It offers commands to conveniently interact with many relevant aspects of Arch Linux.
As such, it only made sense to integrate the &lt;code&gt;reuse&lt;&#x2F;code&gt; command with &lt;code&gt;pkgctl&lt;&#x2F;code&gt; somehow.&lt;&#x2F;p&gt;
&lt;p&gt;For this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;devtools&#x2F;pkgctl-license.1.en&quot;&gt;&lt;code&gt;pkgctl license&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; was created with its two subcommands &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;devtools&#x2F;pkgctl-license-setup.1.en&quot;&gt;&lt;code&gt;pkgctl license setup&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;devtools&#x2F;pkgctl-license-check.1.en&quot;&gt;&lt;code&gt;pkgctl license check&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s now also an integration in our &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;devtools&#x2F;-&#x2F;blob&#x2F;01757e690458ef69708e6261a901bf5b303b6a3c&#x2F;src&#x2F;commitpkg.in#L125&quot;&gt;package commit process&lt;&#x2F;a&gt; ensuring that new package sources are committed with a valid REUSE setup from the start.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pkgctl-license-setup&quot;&gt;pkgctl license setup&lt;&#x2F;h3&gt;
&lt;p&gt;This subcommand will try to generate a valid &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; for the given package.&lt;&#x2F;p&gt;
&lt;p&gt;At the time of writing, our default base &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;version&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;annotations&lt;&#x2F;span&gt;&lt;span&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;PKGBUILD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;README.md&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;keys&#x2F;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.SRCINFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.nvchecker.toml&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.install&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.sysusers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*sysusers.conf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.tmpfiles&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*tmpfiles.conf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.logrotate&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.pam&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.service&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.socket&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.timer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.desktop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-FileCopyrightText&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Arch Linux contributors&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-License-Identifier&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0BSD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It will always work fine if the package has no patches.&lt;&#x2F;p&gt;
&lt;p&gt;In case &lt;code&gt;.patch&lt;&#x2F;code&gt; files were found, we assume they have the same license as the upstream software itself and we&#x27;ll then generate something that looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;annotations&lt;&#x2F;span&gt;&lt;span&gt;]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;fix-something.patch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-FileCopyrightText&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;upstream contributors&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SPDX-License-Identifier&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;MIT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This automatic generation will fail in case the package sources have &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;pkgctl-license&#x2F;#multiple-licenses-and-patches&quot;&gt;multiple licenses and patches&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pkgctl-license-check&quot;&gt;pkgctl license check&lt;&#x2F;h3&gt;
&lt;p&gt;This command checks whether we have a top-level &lt;code&gt;LICENSE&lt;&#x2F;code&gt; file with our expected Arch Linux-specific 0BSD license and then runs &lt;code&gt;reuse lint&lt;&#x2F;code&gt;.
If this command is happy, we&#x27;re happy.
Simple enough.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;common-problems&quot;&gt;Common problems&lt;&#x2F;h2&gt;
&lt;p&gt;Automatic &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; generation fails in some known cases.
The most common cases are these:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;non-standard-arch-specific-package-source-files-are-included-in-the-repo&quot;&gt;Non-standard Arch-specific package source files are included in the repo&lt;&#x2F;h3&gt;
&lt;p&gt;Sometimes, we have some auxiliary files that are not part of the default &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; that we generate.
This could be, for instance, some shell scripts that help with packaging.
In this case, they should usually just be added in the annotations array for
&lt;code&gt;0BSD&lt;&#x2F;code&gt; as they are most certainly created by package maintainers.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;multiple-licenses-and-patches&quot;&gt;Multiple licenses and patches&lt;&#x2F;h3&gt;
&lt;p&gt;In case the package has multiple licenses and there are patches in the
repo, &lt;code&gt;pkgctl license setup&lt;&#x2F;code&gt; can&#x27;t automatically decide &lt;em&gt;which&lt;&#x2F;em&gt; of the licenses
should be assigned to the patches.&lt;&#x2F;p&gt;
&lt;p&gt;In that case, it will generate a dummy license annotation for the patches.
This approach, as opposed to failing outright and refusing to generate &lt;em&gt;any&lt;&#x2F;em&gt;
&lt;code&gt;REUSE.toml&lt;&#x2F;code&gt;, was chosen so that our package maintainers would be able to just
figure out the right license and put it in the &lt;code&gt;SPDX-License-Identifier&lt;&#x2F;code&gt;
line.
This is less annoying than also having to write all the annotations by hand.&lt;&#x2F;p&gt;
&lt;p&gt;In case there are problems with the &lt;code&gt;REUSE.toml&lt;&#x2F;code&gt; or any of the files in the
repository, running &lt;code&gt;pkgctl license check&lt;&#x2F;code&gt; will fail and inform the package
maintainer of any necessary manual intervention.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pkgbuild-doesn-t-specify-the-license-in-spdx-compliant-format&quot;&gt;PKGBUILD doesn&#x27;t specify the license in SPDX compliant format&lt;&#x2F;h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfc.archlinux.page&#x2F;0016-spdx-license-identifiers&#x2F;&quot;&gt;RFC16&lt;&#x2F;a&gt; we decided to use valid &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;spdx.org&#x2F;licenses&#x2F;&quot;&gt;SPDX license identifiers&lt;&#x2F;a&gt; in the &lt;code&gt;license&lt;&#x2F;code&gt; field of our package build scripts.
However, to this day, many of our packages still specify the upstream license in a non-compliant format (e.g &lt;code&gt;BSD&lt;&#x2F;code&gt; instead of &lt;code&gt;BSD-3-Clause&lt;&#x2F;code&gt;).
In that case, package maintainers need to figure out what the correct license identifier is, provide it in the &lt;code&gt;license&lt;&#x2F;code&gt; field and then run &lt;code&gt;pkgctl license setup -f&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Specifications</title>
        <published>2025-07-23T17:00:00+00:00</published>
        <updated>2026-01-06T18:00:00+00:00</updated>
        
        <author>
          <name>
            
              archlinux-staff
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://devblog.archlinux.page/2025/specifications/"/>
        <id>https://devblog.archlinux.page/2025/specifications/</id>
        
        <content type="html" xml:base="https://devblog.archlinux.page/2025/specifications/">&lt;p&gt;In October 2024 a team of dedicated developers has started work on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;.
Since then it has been focusing on writing new documentation on many aspects of Arch Linux Package Management that were not thoroughly documented in the past.
This article provides an overview of the specifications written by this project and attempts to contextualize them for the reader.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-existing-stack&quot;&gt;The existing stack 📚&lt;&#x2F;h2&gt;
&lt;p&gt;With its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;bash.1.html&quot;&gt;&lt;code&gt;bash&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; based &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;makepkg.8&quot;&gt;&lt;code&gt;makepkg&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; tool for package creation, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;libalpm.3&quot;&gt;libalpm&lt;&#x2F;a&gt; C library for interfacing with system state and the central &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;pacman.8&quot;&gt;&lt;code&gt;pacman&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; &lt;em&gt;pac&lt;&#x2F;em&gt;kage &lt;em&gt;man&lt;&#x2F;em&gt;agement tool, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pacman.archlinux.page&quot;&gt;pacman project&lt;&#x2F;a&gt; has defined the foundation of package management on Arch Linux for the past 20 years.
Over the years, several adjacent projects emerged, that provide functionality beyond the scope of the pacman project:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;makepkg.8&quot;&gt;&lt;code&gt;namcap&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD&lt;&#x2F;a&gt; and package file linting.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;dbscripts&quot;&gt;dbscripts&lt;&#x2F;a&gt;: Binary package repository management used by Arch Linux to manage the official repositories.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.archlinux.org&#x2F;archlinux&#x2F;devtools&quot;&gt;devtools&lt;&#x2F;a&gt;: A set of scripts and configuration files that also encompass Arch Linux&#x27;s canonical package build tool &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;pkgctl.1&quot;&gt;&lt;code&gt;pkgctl&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; which wraps &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;makepkg.8&quot;&gt;&lt;code&gt;makepkg&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; and performs builds in clean chroot environments with the help of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;systemd-nspawn.1&quot;&gt;&lt;code&gt;systemd-nspawn&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each Linux distribution has a similar stack of tools, that allows for the creation of package files from some form of input, the management of binary package repositories and the installation and management of those packages on end-user systems.
However, many of these tools are not used by end-users, unless they themselves maintain their own package build scripts and binary package repositories.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;on-distribution-documentation-mag&quot;&gt;On distribution documentation 🔍&lt;&#x2F;h2&gt;
&lt;p&gt;The documentation of a distribution is key to its success, as it provides its members with access to details on tools, file formats and the overarching concepts.
While Arch Linux&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Main_page&quot;&gt;ArchWiki&lt;&#x2F;a&gt; is a great resource for &lt;em&gt;using&lt;&#x2F;em&gt; the distribution, it lacks detailed information on &lt;em&gt;developing&lt;&#x2F;em&gt; it, as well as the concepts governing the existing tech stack.&lt;&#x2F;p&gt;
&lt;p&gt;Arguably, a wiki is not the best place for documentation of this sort, which is also made note of in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;rfc.archlinux.page&#x2F;0021-create-a-distro-developer-manual&#x2F;&quot;&gt;RFC0021&lt;&#x2F;a&gt;: Documentation on the operational side of Arch Linux is better served in a separate, dedicated place.&lt;&#x2F;p&gt;
&lt;p&gt;Similarly, central documentation on common file types, data types and concepts used in the package management stack are an important cornerstone for a shared and broad understanding of the technology.
This helps package maintainers, application developers and end-users alike in collaborating and improving the existing set of tools.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;falling-through-the-cracks-hole&quot;&gt;Falling through the cracks 🕳️&lt;&#x2F;h2&gt;
&lt;p&gt;The projects in &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#the-existing-stack&quot;&gt;the existing stack&lt;&#x2F;a&gt; document most of their own functionality and use-cases for end-users.
However, when considering strict validation of artifacts between the various building blocks in the ecosystem, it became clear that large areas of these projects are underspecified and only loosely follow an overarching design.
For example, APIs or file formats not considered public or important enough for a dedicated specification by one project may be integral to the safe use of another project consuming its output.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt; follows in a long tradition of tools in the Arch Linux package management ecosystem, while more strongly focusing on modularity and validation.
Already early on it became clear that an extensive documentation effort would be needed as the foundation of its granular design.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alpm-specifications-scroll&quot;&gt;ALPM specifications 📜&lt;&#x2F;h2&gt;
&lt;p&gt;Based mainly on black-box tests with the existing tooling, as well as input from longtime package maintainers and developers, a growing set of specifications has been written by the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, the documentation is split between information on &lt;em&gt;file formats&lt;&#x2F;em&gt; and &lt;em&gt;concepts&lt;&#x2F;em&gt;.
Some specifications already exist in multiple versions, which document different revisions of a format that changed over the past years.&lt;&#x2F;p&gt;
&lt;p&gt;For local access to all specifications in the form of man pages, install the &lt;code&gt;alpm&lt;&#x2F;code&gt; package group.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;pacman&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;Su&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; alpm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;concepts-memo&quot;&gt;Concepts 📝&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm.7.html&quot;&gt;alpm&lt;&#x2F;a&gt;: A top-level overview of Arch Linux Package Management, from package creation to consumption.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package.7.html&quot;&gt;alpm-package&lt;&#x2F;a&gt;: Specifies what ALPM-based packages look like and what they contain.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-meta-package.7.html&quot;&gt;alpm-meta-package&lt;&#x2F;a&gt;: Explains what meta packages are and how they are created.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-split-package.7.html&quot;&gt;alpm-split-package&lt;&#x2F;a&gt;: Explains how split packages work and how they are created.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-architecture.7.html&quot;&gt;alpm-architecture&lt;&#x2F;a&gt;: The CPU architecture identifier used in file formats and file names.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-comparison.7.html&quot;&gt;alpm-comparison&lt;&#x2F;a&gt;: The comparison functionality of packages (in particular versions) in various file formats.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-base.7.html&quot;&gt;alpm-package-base&lt;&#x2F;a&gt;: The use of &lt;code&gt;pkgbase&lt;&#x2F;code&gt; in the various &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-group.7.html&quot;&gt;alpm-package-group&lt;&#x2F;a&gt;: Explains how package groups work in the various &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-name.7.html&quot;&gt;alpm-package-name&lt;&#x2F;a&gt;: Specifies how package names are used in the various &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt; and package files.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-relation.7.html&quot;&gt;alpm-package-relation&lt;&#x2F;a&gt;: The relationships between packages as used in the various &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-source.7.html&quot;&gt;alpm-package-source&lt;&#x2F;a&gt;: The types of package sources in use in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO&lt;&#x2F;a&gt; files.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-source-checksum.7.html&quot;&gt;alpm-package-source-checksum&lt;&#x2F;a&gt;: The hash digests used for package sources in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO&lt;&#x2F;a&gt; files.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-package-version.7.html&quot;&gt;alpm-package-version&lt;&#x2F;a&gt;: An overview of the different types of version strings in use in the various &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt;.
More details on specific components of version strings can be found in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-epoch.7.html&quot;&gt;alpm-epoch&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-pkgver.7.html&quot;&gt;alpm-pkgver&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-pkgrel.7.html&quot;&gt;alpm-pkgrel&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-soname.7.html&quot;&gt;alpm-soname&lt;&#x2F;a&gt;: The handling of soname information in package relations in some of the available &lt;a href=&quot;https:&#x2F;&#x2F;devblog.archlinux.page&#x2F;2025&#x2F;specifications&#x2F;#file-formats&quot;&gt;file formats&lt;&#x2F;a&gt;.
This concept exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-sonamev1.7.html&quot;&gt;alpm-sonamev1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-sonamev2.7.html&quot;&gt;alpm-sonamev2&lt;&#x2F;a&gt;) and describes how soname information of ELF files is used in metadata.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-state-repo.7.html&quot;&gt;alpm-state-repo&lt;&#x2F;a&gt;: A repository in which metadata about the state of one or more binary package repositories is maintained.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;file-formats&quot;&gt;File formats 📄&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;SRCINFO.5.html&quot;&gt;SRCINFO&lt;&#x2F;a&gt;: The format of &lt;code&gt;.SRCINFO&lt;&#x2F;code&gt; files found in the package source repositories of all official packages as well as all &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&quot;&gt;AUR&lt;&#x2F;a&gt; source repositories.
It provides metadata about the sources and packages defined in an enclosed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;PKGBUILD.5&quot;&gt;PKGBUILD&lt;&#x2F;a&gt; file while not requiring Bash to access this data.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREE.5.html&quot;&gt;ALPM-MTREE&lt;&#x2F;a&gt;: The format of &lt;code&gt;.MTREE&lt;&#x2F;code&gt; files found in all package files.
This file format exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREEv1.5.html&quot;&gt;ALPM-MTREEv1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;ALPM-MTREEv2.5.html&quot;&gt;ALPM-MTREEv2&lt;&#x2F;a&gt;) and describes all files contained in a package file.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFO.5.html&quot;&gt;BUILDINFO&lt;&#x2F;a&gt;: The format of &lt;code&gt;.BUILDINFO&lt;&#x2F;code&gt; files found in all package files.
This file format exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFOv1.5.html&quot;&gt;BUILDINFOv1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;BUILDINFOv2.5.html&quot;&gt;BUILDINFOv2&lt;&#x2F;a&gt;) and describes the environment used to build a package file.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFO.5.html&quot;&gt;PKGINFO&lt;&#x2F;a&gt;: The format of &lt;code&gt;.PKGINFO&lt;&#x2F;code&gt; files found in all package files.
This file format exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFOv1.5.html&quot;&gt;PKGINFOv1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;PKGINFOv2.5.html&quot;&gt;PKGINFOv2&lt;&#x2F;a&gt;) and describes the metadata of a package file.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-install-scriptlet.5.html&quot;&gt;alpm-install-scriptlet&lt;&#x2F;a&gt;: The format of an &lt;code&gt;.INSTALL&lt;&#x2F;code&gt; file found in some package files.
This script file is used to run custom commands around the installation, upgrade or uninstallation of a package.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-desc.5.html&quot;&gt;alpm-repo-desc&lt;&#x2F;a&gt;: The format of &lt;code&gt;desc&lt;&#x2F;code&gt; files found in repository sync databases.
This file format exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-descv1.5.html&quot;&gt;alpm-repo-descv1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-descv2.5.html&quot;&gt;alpm-repo-descv2&lt;&#x2F;a&gt;) and describes the state of a single package in a binary package repository.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-desc.5.html&quot;&gt;alpm-db-desc&lt;&#x2F;a&gt;: The format of &lt;code&gt;desc&lt;&#x2F;code&gt; files found in local &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;libalpm.3&quot;&gt;libalpm&lt;&#x2F;a&gt; databases.
This file format exists in multiple versions (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-descv1.5.html&quot;&gt;alpm-db-descv1&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-descv2.5.html&quot;&gt;alpm-db-descv2&lt;&#x2F;a&gt;) and describes the state of a single package on a given system.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-db-files.5.html&quot;&gt;alpm-db-files&lt;&#x2F;a&gt;: The format of &lt;code&gt;files&lt;&#x2F;code&gt; files found in local &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;libalpm.3&quot;&gt;libalpm&lt;&#x2F;a&gt; databases.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&#x2F;specifications&#x2F;alpm-repo-files.5.html&quot;&gt;alpm-repo-files&lt;&#x2F;a&gt;: The format of &lt;code&gt;files&lt;&#x2F;code&gt; files found in repository sync databases.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;in-the-works-construction&quot;&gt;In the works 🚧&lt;&#x2F;h3&gt;
&lt;p&gt;Further specification documents are planned to describe repository sync databases and a new format for the handling of binary repository state in the future.&lt;&#x2F;p&gt;
&lt;p&gt;The documents are usually accompanied by dedicated parser and writer implementations, which are validated against real data to ensure their correctness (or to find bugs in existing tooling and data).&lt;&#x2F;p&gt;
&lt;p&gt;If this article sparked your interest, consider contributing to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpm.archlinux.page&quot;&gt;ALPM project&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
