<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><id>https://vinyl-cache.org/</id><title>Vinyl Cache Project</title><updated>2026-04-01T13:31:20.922996+00:00</updated><author><name>The Vinyl Cache Project</name></author><link href="https://vinyl-cache.org/"/><generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator><rights>2016-2026, The Varnish Cache and Vinyl Cache Contributors. Vinyl Cache Logo &amp; Mascot: CC-BY 4.0 Rhubarbe.design</rights><subtitle>News from the Vinyl Cache Project</subtitle><entry><id>f122444a-81a0-5f29-ab6b-ac22328d3a0e</id><title>Filter request- or response-headers with VMOD re2 sets</title><updated>2026-04-01T13:32:17.671992+00:00</updated><content>&lt;section id="filter-request-or-response-headers-with-vmod-re2-sets"&gt;
&lt;span id="tutorial-hdr-filter"&gt;&lt;/span&gt;&lt;h1&gt;Filter request- or response-headers with VMOD re2 sets&lt;a class="headerlink" href="#filter-request-or-response-headers-with-vmod-re2-sets" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="why-filter-headers-at-all"&gt;
&lt;h2&gt;Why filter headers at all?&lt;a class="headerlink" href="#why-filter-headers-at-all" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When we care about security, less is often more. If we avoid malicious headers
reaching backends, they can not be used to exploit security issues.&lt;/p&gt;
&lt;p&gt;In general, there is a denylist and an allowlist approach. Both can be
efficiently implemented using &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/libvmod-re2"&gt;vmod_re2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The denylist approach is (way) less secure, but used by most commercial WAFs and
CDNs with WAF-features, because it needs less customization. The allowlist
approach is much more restrictive and provides best security.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="denylist-with-plain-vcl"&gt;
&lt;h2&gt;Denylist with plain vcl&lt;a class="headerlink" href="#denylist-with-plain-vcl" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;But before we dive into &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vmod_re2&lt;/span&gt;&lt;/code&gt; let’s warm up with a very simple denylist-example using plain vcl:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_recv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;unset&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Chaotic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;unset&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Evil&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wicked&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(?i)^wicked$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;unset&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wicked&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All unwanted headers are sanitized. So far so good. But this doesn’t scale. If
you have thousands of patterns it will get really really slow, because patterns
are checked sequentially. Also you can’t implement an allowlist approach with
plain vcl. Using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter&lt;/span&gt;&lt;/code&gt; from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vmod_re2&lt;/span&gt;&lt;/code&gt; solves both problems.&lt;/p&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;To ensure they are working as expected, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vtc&lt;/span&gt;&lt;/code&gt; files for use with
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vinyltest&lt;/span&gt;&lt;/code&gt; are provided for all examples in this tutorial.&lt;/p&gt;
&lt;p&gt;Download the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vtc&lt;/span&gt;&lt;/code&gt; file for this first example
&lt;a class="reference download internal" download="" href="../_downloads/2dd74361dc15da37481f1acdfb604c7c/hdr_filter-simple-denylist-plain-vcl.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-denylist-plain-vcl.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and run it using: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vinyltest&lt;/span&gt;
&lt;span class="pre"&gt;&amp;lt;testfile.vtc&amp;gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Make sure your &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PATH&lt;/span&gt;&lt;/code&gt; contains the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vinyld&lt;/span&gt;&lt;/code&gt; binary. You can easily make
your own modifications to try out stuff. The reference manual for vtc is
available &lt;a class="reference external" href="https://vinyl-cache.org/docs/trunk/reference/vtc.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="denylist-with-vmod-re2-and-hdr-filter"&gt;
&lt;h2&gt;Denylist with vmod_re2 and hdr_filter&lt;a class="headerlink" href="#denylist-with-vmod-re2-and-hdr-filter" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So, to get startet with &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/libvmod-re2"&gt;vmod_re2&lt;/a&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter&lt;/span&gt;&lt;/code&gt;, let’s do the exact same
thing as before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_init&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;chaotic:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Evil:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Wicked: wicked$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_recv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hdr_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;quot;false&amp;quot; makes this filter a denylist&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Download full example as vtc: &lt;a class="reference download internal" download="" href="../_downloads/94d30b3539ebfaec69923eda6d3cd6df/hdr_filter-simple-denylist.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-denylist.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Two parameters are used for the set.&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;anchor=start&lt;/span&gt;&lt;/code&gt; puts an implicit anchor &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;^&lt;/span&gt;&lt;/code&gt; at the beginning of each
regex. It is equivalent to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;deny&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^chaotic:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^Evil:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;deny&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^Wicked: wicked$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;case_sensitive=false&lt;/span&gt;&lt;/code&gt; is very useful for our use case because http-headers are case insensitive anyway and attackers could easily bypass our filters otherwise.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;Notice that the request is not rejected if headers matching the denylisted are
received, they get removed as if &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;unset&lt;/span&gt;&lt;/code&gt; was called.&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="allowlists-with-vmod-re2-and-hdr-filter"&gt;
&lt;h2&gt;Allowlists with vmod_re2 and hdr_filter&lt;a class="headerlink" href="#allowlists-with-vmod-re2-and-hdr-filter" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now let’s proceed to what we really want to do: filter out all headers &lt;em&gt;except&lt;/em&gt;
for a list of explicitly allowed headers:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;re2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_init&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;If-(Modified-Since|None-Match):&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Non-Standard-Header:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_recv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hdr_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;# &amp;quot;true&amp;quot; makes this filter an allowlist&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Download full example as vtc: &lt;a class="reference download internal" download="" href="../_downloads/46d18bd293dec291f5b96d913ec4d52b/hdr_filter-simple-allowlist.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-allowlist.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The second parameter for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter&lt;/span&gt;&lt;/code&gt; may also be omitted, because &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;true&lt;/span&gt;&lt;/code&gt;
for allowlist is the default anyway. All following examples will not contain
the second parameter.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ok, now we filter out everything except the added patterns, which makes it a
really restrictive and secure setup. Currently, we do this in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_recv&lt;/span&gt;&lt;/code&gt;,
which is pretty early.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="filter-in-backend-fetch"&gt;
&lt;h2&gt;Filter in backend_fetch&lt;a class="headerlink" href="#filter-in-backend-fetch" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There could be some reasons to delay the filtering until &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_backend_fetch&lt;/span&gt;&lt;/code&gt;,
just before the request is send to the backends. Or to do an additional
filtering at this point. For example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the client sends some headers we want to honour within vcl, but there is no
need to send it to our backends&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we might set some artificial request headers in vcl for internal purposes,
which we also don’t want to send to our backends&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we want to modify the cache-key in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_hash&lt;/span&gt;&lt;/code&gt; based on headers the backends
don’t need&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fortunately &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter&lt;/span&gt;&lt;/code&gt; can also be used on the backend side:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_init&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;allow_recv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow_recv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow_recv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;If-(Modified-Since|None-Match):&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow_recv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Non-Standard-Header:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;allow_backend_fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow_backend_fetch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;allow_backend_fetch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;If-(Modified-Since|None-Match):&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_recv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;allow_recv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hdr_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_backend_fetch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;allow_backend_fetch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hdr_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bereq&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Download full example as vtc:
&lt;a class="reference download internal" download="" href="../_downloads/b359f3dab58acbd5cb9d78a79a0c0b1e/hdr_filter-simple-allowlist-backend_fetch.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-allowlist-backend_fetch.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="patterns-in-detail"&gt;
&lt;h2&gt;Patterns in detail&lt;a class="headerlink" href="#patterns-in-detail" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now let’s look in more detail at some examples of patterns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;fixed header name:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Host:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;regular expressions for header names:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;X-Forwarded-(Host|Proto):&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prefix matches on header names:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Notice the missing colon! This matches all headers starting with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Accept&lt;/span&gt;&lt;/code&gt;
and any value, for example &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Accept:&lt;/span&gt; &lt;span class="pre"&gt;xyz&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Accept-Encoding:&lt;/span&gt; &lt;span class="pre"&gt;gzip&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Accept-Language:&lt;/span&gt; &lt;span class="pre"&gt;en-US&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;regular expression for header name and value:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Content-Type: \w+/\w+(; charset=\w+)?$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Download examples as vtc: &lt;a class="reference download internal" download="" href="../_downloads/bb96d602c8812e2bdd3373f277999cf5/hdr_filter-simple-allowlist-pattern.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-allowlist-pattern.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="response-header-filtering"&gt;
&lt;h2&gt;Response header filtering&lt;a class="headerlink" href="#response-header-filtering" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;So far we’ve been looking at filtering &lt;em&gt;request&lt;/em&gt; headers of incoming requests,
which is certainly the most important use case from a security perspective.&lt;/p&gt;
&lt;p&gt;But &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/libvmod-re2"&gt;vmod_re2&lt;/a&gt; is also capable of &lt;em&gt;response&lt;/em&gt; header filtering. You might need
this in some cases, for example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;For misbehaving backends, which are not under your control, sending response
headers you don’t want, you can filter in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_backend_response&lt;/span&gt;&lt;/code&gt; using
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.hdr_filter(beresp)&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Response headers from backends steering Vinyl Cache behaviour, which should
not leak to clients, can either be filtered in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_backend_response&lt;/span&gt;&lt;/code&gt;
&lt;em&gt;after&lt;/em&gt; having been avaluated using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.hdr_filter(beresp)&lt;/span&gt;&lt;/code&gt;, or in
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_deliver&lt;/span&gt;&lt;/code&gt; using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.hdr_filter(resp)&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To prevent information disclosure through debug headers or other internal
headers, filter in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_deliver&lt;/span&gt;&lt;/code&gt; using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.hdr_filter(resp)&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To summarize all options:&lt;/p&gt;
&lt;div class="table-wrapper docutils container"&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;client side             backend&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;side&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;request&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;req&lt;/span&gt;&lt;/code&gt; (e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_recv&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bereq&lt;/span&gt;&lt;/code&gt; (e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_backend_fetch&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;response&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resp&lt;/span&gt;&lt;/code&gt; (e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_deliver&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;beresp&lt;/span&gt;&lt;/code&gt; (e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_backend_response&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;section id="response-header-filtering-example"&gt;
&lt;h3&gt;Response header filtering example&lt;a class="headerlink" href="#response-header-filtering-example" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Let’s take a look at a simple denylist example for response headers. Of course
you could use allowlists, but in contrast to request header filtering, for
response headers using denylists can be more practical if the backends can be
trusted:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_init&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;deny_beresp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;case_sensitive&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;deny_beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Some-debug-header-send-by-backends: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="n"&gt;vcl_backend_response&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;deny_beresp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hdr_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beresp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;# false makes this filter a denylist&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;Download example as vtc: &lt;a class="reference download internal" download="" href="../_downloads/ce836b75dd583ac37bd42491236463ae/hdr_filter-simple-response-denylist.vtc"&gt;&lt;code class="xref download docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter-simple-response-denylist.vtc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Depending on your scenario you could do the same with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hdr_filter(resp,&lt;/span&gt;
&lt;span class="pre"&gt;false)&lt;/span&gt;&lt;/code&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vcl_deliver&lt;/span&gt;&lt;/code&gt;, the vtc-file includes an example.&lt;/p&gt;
&lt;p&gt;And yes, if you only use denylists and only a bunch of headers like in this
example, you could also use plain vcl &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;unset&lt;/span&gt;&lt;/code&gt;, but the more headers you want
to filter, the more useful &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/libvmod-re2"&gt;vmod_re2&lt;/a&gt; gets in addition to being more efficient.
And if you want to use allowlists there is no alternative anyway.&lt;/p&gt;
&lt;p&gt;After this excursion to &lt;em&gt;response&lt;/em&gt; header filtering let’s get back to &lt;em&gt;request&lt;/em&gt; header filtering.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="which-headers-should-i-put-on-my-allowlist-without-breaking-stuff"&gt;
&lt;h2&gt;Which headers should I put on my allowlist without breaking stuff?&lt;a class="headerlink" href="#which-headers-should-i-put-on-my-allowlist-without-breaking-stuff" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We are looking at the case to build an &lt;em&gt;allowlist&lt;/em&gt; for &lt;em&gt;request&lt;/em&gt; headers. He’s
some practical assistance how to analyse your live traffic:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# for a quick overview, just dump the content of the VSL buffer:&lt;/span&gt;
&lt;span class="n"&gt;vinyllog&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;Reqheader&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;RespStatus &amp;gt;= 200 and RespStatus &amp;lt;=399&amp;#39;&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;reqheader&lt;/span&gt;

&lt;span class="c1"&gt;# for more data let vinyllog run for longer, for example for one day:&lt;/span&gt;
&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;vinyllog&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;Reqheader&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;RespStatus &amp;gt;= 200 and RespStatus &amp;lt;=399&amp;#39;&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;reqheader&lt;/span&gt;

&lt;span class="c1"&gt;# you may also add a filter to only trusted IP-adresses not sending malicious headers:&lt;/span&gt;
&lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;vinyllog&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;Reqheader&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;RespStatus &amp;gt;= 200 and RespStatus &amp;lt;=399 and ReqStart ~&amp;quot;^10\.72\.&amp;quot;&amp;#39;&lt;/span&gt; \
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;reqheader&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We group by request to grab &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ReqHeader&lt;/span&gt;&lt;/code&gt; while still being able to filter the
requests to just those with status &amp;gt;=200 and &amp;lt;=399 responses. This might be
useful to reduce the amount of illegal headers. For example, if you have Apache
with mod_security running it will respond to requests classified as malicious
with a 403 status.&lt;/p&gt;
&lt;p&gt;If you let &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vinyllog&lt;/span&gt;&lt;/code&gt; run for a longer time, please make sure you have enough
space in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/tmp/&lt;/span&gt;&lt;/code&gt; or choose another location.&lt;/p&gt;
&lt;p&gt;When it’s time for the evaluation, you might want to run:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;vinyllog&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;reqheader&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$2 == &amp;quot;ReqHeader&amp;quot; {print tolower($3)}&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;uniq&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You’ll get a histogram like this, the first column being the number of
occurrences of the respective headername in your logfile:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="mi"&gt;109&lt;/span&gt; &lt;span class="n"&gt;authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;118&lt;/span&gt; &lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;146&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;168&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;168&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;195&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;219&lt;/span&gt; &lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;224&lt;/span&gt; &lt;span class="n"&gt;cookie&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;257&lt;/span&gt; &lt;span class="n"&gt;referer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;312&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;394&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;423&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;490&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;555&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;555&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="n"&gt;accept&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This might serve as a good starting point to build your own allowlist.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-further-reading"&gt;
&lt;h2&gt;Documentation / Further Reading&lt;a class="headerlink" href="#documentation-further-reading" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The current documentation for vmod re2 is available using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;man&lt;/span&gt; &lt;span class="pre"&gt;vmod_re2&lt;/span&gt;&lt;/code&gt; or
online &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/libvmod-re2/-/blob/master/src/vmod_re2.vcc"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="contributing"&gt;
&lt;h2&gt;Contributing&lt;a class="headerlink" href="#contributing" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you found any mistake in this tutorial, I’d like to cite Poul-Henning: “We’d
absolutely love to have you help improve the project homepage, send us pull
requests!” &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage"&gt;https://code.vinyl-cache.org/vinyl-cache/homepage&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//tutorials/hdr_filter.html"/><published>2026-03-31T00:00:00+00:00</published></entry><entry><id>b7a4ba36-94b2-5199-b47d-1bd3377395b3</id><title>VSV00018 Varnish Cache absolute form parsing deficiency</title><updated>2026-04-01T13:32:14.090889+00:00</updated><content>&lt;section id="vsv00018-varnish-cache-absolute-form-parsing-deficiency"&gt;
&lt;span id="vsv00018"&gt;&lt;/span&gt;&lt;h1&gt;VSV00018 Varnish Cache absolute form parsing deficiency&lt;a class="headerlink" href="#vsv00018-varnish-cache-absolute-form-parsing-deficiency" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p class="date rubric"&gt;2026-03-16&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.cve.org/CVERecord?id=CVE-2026-34475"&gt;CVE-2026-34475&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A deficiency in HTTP/1.1 request parsing can potentially be used for cache
poisoning or authentication bypass, if the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;req.url&lt;/span&gt;&lt;/code&gt; VCL variable gets passed
unchecked to a backend which accepts requests with absolute form URIs.&lt;/p&gt;
&lt;p&gt;The potential attack surface of this issue is limited to “root” URLs with a path
of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/&lt;/span&gt;&lt;/code&gt; as in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;https://example.com/&lt;/span&gt;&lt;/code&gt;, but not &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;https://example.com/whatever&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We recommend to upgrade to a version which is not affected or mitigate the issue
in VCL, as detailed below.&lt;/p&gt;
&lt;section id="versions-affected"&gt;
&lt;h2&gt;Versions affected&lt;a class="headerlink" href="#versions-affected" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;All Varnish Cache Releases up to and including 8.0.0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Cache 6.0 LTS series up to and including 6.0.16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Enterprise by Varnish Software 6.0.x up to and including 6.0.16r11.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="versions-not-affected"&gt;
&lt;h2&gt;Versions not affected&lt;a class="headerlink" href="#versions-not-affected" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Vinyl Cache 9.0 (released 2026-03-16)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vinyl Cache main branch at commit f27e9550aa30ad18e5196371d583e7131745088e or later&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Cache 8.0.1 (released 2026-03-16)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Cache 6.0 LTS version 6.0.17 (released 2026-03-16)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Enterprise by Varnish Software version 6.0.16r12 or later.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mitigation"&gt;
&lt;h2&gt;Mitigation&lt;a class="headerlink" href="#mitigation" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If upgrading is not possible, the problem can be mitigated by adding the
following VCL snippet at the top of the VCL:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sub vsv18 {
  if (req.url == &amp;quot;*&amp;quot; &amp;amp;&amp;amp; req.method == &amp;quot;OPTIONS&amp;quot;) {
    return;
  }
  # NB: we do not allow connect by default (see vcl_req_method)
  if (req.url !~ &amp;quot;^/&amp;quot; &amp;amp;&amp;amp; req.method != &amp;quot;CONNECT&amp;quot;) {
    return (synth(400));
  }
}

sub vcl_recv {
  call vsv18;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This code has now also been added to the built-in VCL as an additional
forward-looking precaution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="acknowledgements-and-credits"&gt;
&lt;h2&gt;Acknowledgements and credits&lt;a class="headerlink" href="#acknowledgements-and-credits" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We thank Tom Kinnaird of Claranet Limited for having reported the issue.&lt;/p&gt;
&lt;p&gt;For the Vinyl Cache project, the issue has been handled and fixed by Nils Goroll
of UPLEX.&lt;/p&gt;
&lt;p&gt;Dridi Boukelmoune and Walid Boudebouda of Varnish Software have provided
feedback, pointed out related aspects to consider and prepared backports to
Varnish Cache.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//security/VSV00018.html"/><published>2026-03-16T00:00:00+00:00</published></entry><entry><id>e838e064-429e-5ee3-aef8-61e0ef5cf5ba</id><title>Vinyl Cache 9.0.0</title><updated>2026-04-01T13:32:08.783244+00:00</updated><content>&lt;section id="vinyl-cache-9-0-0"&gt;
&lt;span id="rel9-0-0"&gt;&lt;/span&gt;&lt;h1&gt;Vinyl Cache 9.0.0&lt;a class="headerlink" href="#vinyl-cache-9-0-0" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;img alt="../_images/announcement-v9.png" src="../_images/announcement-v9.png" /&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Source download &lt;a class="reference external" href="/downloads/vinyl-cache-9.0.0.tgz"&gt;vinyl-cache-9.0.0.tgz&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SHA256=9740c210c2a77627d50fd0ad6c759dc3ca094fcb4e6555ba55fca71cf483bd17&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vinyl Cache 9.0.0 is a regular bi-annual “fresh” release. It supersedes the
&lt;a class="reference internal" href="rel8.0.0.html#rel8-0-0"&gt;&lt;span class="std std-ref"&gt;Varnish Cache 8.0.0&lt;/span&gt;&lt;/a&gt; release and addresses the vulnerability described in
&lt;a class="reference internal" href="../security/VSV00018.html#vsv00018"&gt;&lt;span class="std std-ref"&gt;VSV00018&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More information:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;List of most important &lt;a class="reference external" href="https://vinyl-cache.org/docs/9.0/whats-new/changes-9.0.html"&gt;Changes in 9.0.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Help on &lt;a class="reference external" href="https://vinyl-cache.org/docs/9.0/whats-new/upgrading-9.0.html"&gt;Upgrading to Vinyl Cache 9.0.0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Full changelog can be found under the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Vinyl&lt;/span&gt; &lt;span class="pre"&gt;Cache&lt;/span&gt; &lt;span class="pre"&gt;9.0&lt;/span&gt; &lt;span class="pre"&gt;(2026-03-16)&lt;/span&gt;&lt;/code&gt; section in &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/src/branch/main/doc/changes.rst"&gt;changes.rst.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For installation instructions see &lt;a class="reference external" href="/docs/trunk/installation/index.html"&gt;the Vinyl Cache Installation Manual&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//releases/rel9.0.0.html"/><published>2026-03-16T00:00:00+00:00</published></entry><entry><id>2a289f95-5cb9-5670-8783-24b7a0127c26</id><title>Writing Documentation</title><updated>2026-04-01T13:31:29.058553+00:00</updated><content>&lt;section id="writing-documentation"&gt;
&lt;span id="writing-docs"&gt;&lt;/span&gt;&lt;h1&gt;Writing Documentation&lt;a class="headerlink" href="#writing-documentation" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This short guide concerns documentation in the Vinyl Cache source tree under
&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/src/branch/main/doc/sphinx"&gt;doc/sphinx&lt;/a&gt; as well as basically any document on the &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage"&gt;website&lt;/a&gt;, where
&lt;a class="reference internal" href="#additional-considerations-for-the-website"&gt;Additional Considerations for the Website&lt;/a&gt; apply.&lt;/p&gt;
&lt;p&gt;This document contains the actual RST as well as code blocks with the same RST
again to make the RST source visible on the rendered version.&lt;/p&gt;
&lt;p&gt;Please try to follow this advice. Existing documentation oftentimes does not, in
which case it would be nice if you updated it to follow this guide first and in
a separate commit, such that RST corrections can be reviewed seperately from
content changes.&lt;/p&gt;
&lt;section id="inline-markup"&gt;
&lt;h2&gt;Inline Markup&lt;a class="headerlink" href="#inline-markup" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Please try to be consistent with inline markup and fix places which do
not follow the style:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;VCL language and other literals as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;literal&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;VCL language and other literals as ``literal``
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;placeholders and emphasis as &lt;em&gt;emphasis&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;placeholders&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;emphasis&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;emphasis&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;no &lt;cite&gt;interpreted text&lt;/cite&gt; except where it actually &lt;em&gt;is&lt;/em&gt; that:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;no `interpreted text` except where it actually *is* that
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;exception: Links to manpages outside Vinyl Cache as &lt;cite&gt;man(section)&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;exception: Links to manpages outside vinyl as `man(section)`::
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;see &lt;a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#character-level-inline-markup"&gt;Reference&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use code blocks for:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="n"&gt;blocks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;

        &lt;span class="n"&gt;Examples&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;

        &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="references-are-tricky"&gt;
&lt;h2&gt;References are tricky&lt;a class="headerlink" href="#references-are-tricky" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To build html documentation, we want to create cross-document
cross-references using:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;:ref:`reference name`
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Trouble is that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rst2man&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rst2pdf&lt;/span&gt;&lt;/code&gt; working on individual
files cannot parse &lt;cite&gt;ref&lt;/cite&gt; roles to anything outside the current rst
file, so we need to differentiate link targets depending on the kind
of documentation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;set link targets on the top of documents ending up in man-pages
following the manpage naming scheme, e.g.:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;_vinyld&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;set link targets for important paragraphs following the scheme
ref-&lt;cite&gt;doc&lt;/cite&gt;-&lt;cite&gt;section&lt;/cite&gt;, for instance:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;_ref&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vinyld&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;opt_T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These can be referenced from other documents making up the html
documentation, but not from stand-alone documents (like man-pages).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;in all documents which are used to create man-pages, add the
following definition at the top:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;role&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emphasis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This will allow the use of &lt;cite&gt;ref&lt;/cite&gt; in a compatible manner, IF
references follow the man-page naming scheme&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to be compatible both with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sphinx&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rst2man&lt;/span&gt;&lt;/code&gt;, use &lt;a class="reference external" href="http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#implicit-hyperlink-targets"&gt;implicit
link targets&lt;/a&gt; in stand-alone documents, like this one creating
&lt;a class="reference internal" href="#references-are-tricky"&gt;References are tricky&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;`References are tricky`_
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="document-structure"&gt;
&lt;h2&gt;Document Structure&lt;a class="headerlink" href="#document-structure" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While RST supports a great deal of flexibility for adornments of
titles and section headers, we should adhere to a consistent style to
avoid breaking the document structure unintentionally.&lt;/p&gt;
&lt;p&gt;Within the Vinyl-Cache project, we should use these characters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Over and underline &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;=&lt;/span&gt;&lt;/code&gt; for document titles:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="n"&gt;Title&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Over and underline &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-&lt;/span&gt;&lt;/code&gt; for document subtitles:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;--------&lt;/span&gt;
&lt;span class="n"&gt;Subtitle&lt;/span&gt;
&lt;span class="o"&gt;--------&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Underline &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;=&lt;/span&gt;&lt;/code&gt; for sections:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Section&lt;/span&gt;
&lt;span class="o"&gt;=======&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Underline &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-&lt;/span&gt;&lt;/code&gt; for subsection:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Subsection&lt;/span&gt;
&lt;span class="o"&gt;----------&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Underline &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;~&lt;/span&gt;&lt;/code&gt; for subsubsections:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Subsubsection&lt;/span&gt;
&lt;span class="o"&gt;~~~~~~~~~~~~~&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is in line with the example in &lt;a class="reference external" href="https://docutils.sourceforge.io/docs/user/rst/quickstart.html#sections"&gt;the RST quickstart guide&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="admonitions"&gt;
&lt;h2&gt;Admonitions&lt;a class="headerlink" href="#admonitions" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To point out particularly relevant aspects, admonitions can and should be used.
They all introduce a block with:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;xxx&lt;/span&gt;&lt;/code&gt; being one of the following:&lt;/p&gt;
&lt;div class="admonition attention"&gt;
&lt;p class="admonition-title"&gt;Attention&lt;/p&gt;
&lt;p&gt;attention&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition caution"&gt;
&lt;p class="admonition-title"&gt;Caution&lt;/p&gt;
&lt;p&gt;caution&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition danger"&gt;
&lt;p class="admonition-title"&gt;Danger&lt;/p&gt;
&lt;p&gt;danger&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition error"&gt;
&lt;p class="admonition-title"&gt;Error&lt;/p&gt;
&lt;p&gt;error&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition hint"&gt;
&lt;p class="admonition-title"&gt;Hint&lt;/p&gt;
&lt;p&gt;hint&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;important&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition note"&gt;
&lt;p class="admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;note&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition tip"&gt;
&lt;p class="admonition-title"&gt;Tip&lt;/p&gt;
&lt;p&gt;tip&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition warning"&gt;
&lt;p class="admonition-title"&gt;Warning&lt;/p&gt;
&lt;p&gt;warning&lt;/p&gt;
&lt;/div&gt;
&lt;div class="admonition-title admonition"&gt;
&lt;p class="admonition-title"&gt;title&lt;/p&gt;
&lt;p&gt;admonition:: title&lt;/p&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="additional-considerations-for-the-website"&gt;
&lt;h2&gt;Additional Considerations for the Website&lt;a class="headerlink" href="#additional-considerations-for-the-website" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;section id="treat-the-website-like-a-blog"&gt;
&lt;h3&gt;Treat the website like a blog&lt;a class="headerlink" href="#treat-the-website-like-a-blog" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage"&gt;website&lt;/a&gt; has an &lt;a class="reference external" href="https://vinyl-cache.org/atom.xml"&gt;rss feed&lt;/a&gt;, which is automatically updated for all pages
which contain a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:date:&lt;/span&gt;&lt;/code&gt; interpreted text role, such as:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Consequently, new articles should be created in a seperate document. The top
level &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;index.rst&lt;/span&gt;&lt;/code&gt; should have a headline and a short teaser, linking to that
document.&lt;/p&gt;
&lt;p&gt;Updated articles should have their date updated only if there are relevant
additions.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="linking-on-the-homepage"&gt;
&lt;h3&gt;Linking on the homepage&lt;a class="headerlink" href="#linking-on-the-homepage" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;When adding something to the homepage, please add the title and the date as
follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Title&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;rubric&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;

&lt;span class="n"&gt;Lorem&lt;/span&gt; &lt;span class="n"&gt;ipsum&lt;/span&gt; &lt;span class="n"&gt;dolor&lt;/span&gt; &lt;span class="n"&gt;sit&lt;/span&gt; &lt;span class="n"&gt;amet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consectetur&lt;/span&gt; &lt;span class="n"&gt;adipiscing&lt;/span&gt; &lt;span class="n"&gt;elit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;eiusmod&lt;/span&gt; &lt;span class="n"&gt;tempor&lt;/span&gt; &lt;span class="n"&gt;incididunt&lt;/span&gt; &lt;span class="n"&gt;ut&lt;/span&gt; &lt;span class="n"&gt;labore&lt;/span&gt; &lt;span class="n"&gt;et&lt;/span&gt; &lt;span class="n"&gt;dolore&lt;/span&gt; &lt;span class="n"&gt;magna&lt;/span&gt; &lt;span class="n"&gt;aliqua&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;section id="title"&gt;
&lt;h4&gt;Title&lt;a class="headerlink" href="#title" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p class="date rubric"&gt;2026-03-13&lt;/p&gt;
&lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="sphinx-differences"&gt;
&lt;h3&gt;Sphinx differences&lt;a class="headerlink" href="#sphinx-differences" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The website is not rendered in one piece, rather everything under &lt;a class="reference internal" href="../docs/index.html#docs"&gt;&lt;span class="std std-ref"&gt;Documentation&lt;/span&gt;&lt;/a&gt; is
rendered from &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/src/branch/main/doc/sphinx"&gt;doc/sphinx&lt;/a&gt; of all the contained releases. We try to give the
website and documentation a unified look and feel and sphinx is configured
similarly for both, but not identical.&lt;/p&gt;
&lt;p&gt;The most relevant difference is that the &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage"&gt;website&lt;/a&gt; has &lt;a class="reference external" href="https://sphinx-design.readthedocs.io/en/furo-theme/"&gt;sphinx-design&lt;/a&gt;
enabled, which gives us additional components.&lt;/p&gt;
&lt;section id="id1"&gt;
&lt;h4&gt;Sphinx design&lt;a class="headerlink" href="#id1" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Please see &lt;a class="reference external" href="https://sphinx-design.readthedocs.io/en/furo-theme/"&gt;sphinx-design&lt;/a&gt; for examples for all the available components.&lt;/p&gt;
&lt;p&gt;Here we only give some examples copied from there.&lt;/p&gt;
&lt;section id="dropdowns"&gt;
&lt;h5&gt;Dropdowns&lt;a class="headerlink" href="#dropdowns" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;Only on the website&lt;/p&gt;
&lt;/div&gt;
&lt;details class="sd-sphinx-override sd-dropdown sd-card sd-mb-3"&gt;
&lt;summary class="sd-summary-title sd-card-header"&gt;
&lt;span class="sd-summary-text"&gt;&lt;svg version="1.1" width="1.5em" height="1.5em" class="sd-octicon sd-octicon-kebab-horizontal no-title" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path d="M20 14a2 2 0 1 1-.001-3.999A2 2 0 0 1 20 14ZM6 12a2 2 0 1 1-3.999.001A2 2 0 0 1 6 12Zm8 0a2 2 0 1 1-3.999.001A2 2 0 0 1 14 12Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class="sd-summary-state-marker sd-summary-chevron-right"&gt;&lt;svg version="1.1" width="1.5em" height="1.5em" class="sd-octicon sd-octicon-chevron-right" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path d="M8.72 18.78a.75.75 0 0 1 0-1.06L14.44 12 8.72 6.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l6.25 6.25a.75.75 0 0 1 0 1.06l-6.25 6.25a.75.75 0 0 1-1.06 0Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/summary&gt;&lt;div class="sd-summary-content sd-card-body docutils"&gt;
&lt;p class="sd-card-text"&gt;Dropdown content&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details class="sd-sphinx-override sd-dropdown sd-card sd-mb-3"&gt;
&lt;summary class="sd-summary-title sd-card-header"&gt;
&lt;span class="sd-summary-text"&gt;Dropdown title&lt;/span&gt;&lt;span class="sd-summary-state-marker sd-summary-chevron-right"&gt;&lt;svg version="1.1" width="1.5em" height="1.5em" class="sd-octicon sd-octicon-chevron-right" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path d="M8.72 18.78a.75.75 0 0 1 0-1.06L14.44 12 8.72 6.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l6.25 6.25a.75.75 0 0 1 0 1.06l-6.25 6.25a.75.75 0 0 1-1.06 0Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/summary&gt;&lt;div class="sd-summary-content sd-card-body docutils"&gt;
&lt;p class="sd-card-text"&gt;Dropdown content&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;details class="sd-sphinx-override sd-dropdown sd-card sd-mb-3" open="open"&gt;
&lt;summary class="sd-summary-title sd-card-header"&gt;
&lt;span class="sd-summary-text"&gt;Open dropdown&lt;/span&gt;&lt;span class="sd-summary-state-marker sd-summary-chevron-right"&gt;&lt;svg version="1.1" width="1.5em" height="1.5em" class="sd-octicon sd-octicon-chevron-right" viewBox="0 0 24 24" aria-hidden="true"&gt;&lt;path d="M8.72 18.78a.75.75 0 0 1 0-1.06L14.44 12 8.72 6.28a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l6.25 6.25a.75.75 0 0 1 0 1.06l-6.25 6.25a.75.75 0 0 1-1.06 0Z"&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/summary&gt;&lt;div class="sd-summary-content sd-card-body docutils"&gt;
&lt;p class="sd-card-text"&gt;Dropdown content&lt;/p&gt;
&lt;/div&gt;
&lt;/details&gt;&lt;p&gt;source:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;dropdown&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;

    &lt;span class="n"&gt;Dropdown&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;dropdown&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Dropdown&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;

    &lt;span class="n"&gt;Dropdown&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;dropdown&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Open&lt;/span&gt; &lt;span class="n"&gt;dropdown&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;Dropdown&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="tabs"&gt;
&lt;h5&gt;Tabs&lt;a class="headerlink" href="#tabs" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;Only on the website&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sd-tab-set docutils"&gt;
&lt;input checked="checked" id="sd-tab-item-0" name="sd-tab-set-0" type="radio"&gt;
&lt;label class="sd-tab-label" for="sd-tab-item-0"&gt;
Label1&lt;/label&gt;&lt;div class="sd-tab-content docutils"&gt;
&lt;p&gt;Content 1&lt;/p&gt;
&lt;/div&gt;
&lt;input id="sd-tab-item-1" name="sd-tab-set-0" type="radio"&gt;
&lt;label class="sd-tab-label" for="sd-tab-item-1"&gt;
Label2&lt;/label&gt;&lt;div class="sd-tab-content docutils"&gt;
&lt;p&gt;Content 2&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;source:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;

    &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Label1&lt;/span&gt;

        &lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

    &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;tab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Label2&lt;/span&gt;

        &lt;span class="n"&gt;Content&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="badges"&gt;
&lt;h5&gt;Badges&lt;a class="headerlink" href="#badges" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;Only on the website&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge"&gt;plain badge&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-primary sd-bg-text-primary"&gt;primary&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-primary sd-text-primary"&gt;primary-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-secondary sd-bg-text-secondary"&gt;secondary&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-secondary sd-text-secondary"&gt;secondary-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-success sd-bg-text-success"&gt;success&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-success sd-text-success"&gt;success-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-info sd-bg-text-info"&gt;info&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-info sd-text-info"&gt;info-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-warning sd-bg-text-warning"&gt;warning&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-warning sd-text-warning"&gt;warning-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-danger sd-bg-text-danger"&gt;danger&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-danger sd-text-danger"&gt;danger-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-light sd-bg-text-light"&gt;light&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-light sd-text-light"&gt;light-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="sd-sphinx-override sd-badge sd-bg-dark sd-bg-text-dark"&gt;dark&lt;/span&gt;, &lt;span class="sd-sphinx-override sd-badge sd-outline-dark sd-text-dark"&gt;dark-line&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;source:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;:bdg:`plain badge`

:bdg-primary:`primary`, :bdg-primary-line:`primary-line`

:bdg-secondary:`secondary`, :bdg-secondary-line:`secondary-line`

:bdg-success:`success`, :bdg-success-line:`success-line`

:bdg-info:`info`, :bdg-info-line:`info-line`

:bdg-warning:`warning`, :bdg-warning-line:`warning-line`

:bdg-danger:`danger`, :bdg-danger-line:`danger-line`

:bdg-light:`light`, :bdg-light-line:`light-line`

:bdg-dark:`dark`, :bdg-dark-line:`dark-line`
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="cards"&gt;
&lt;h5&gt;Cards&lt;a class="headerlink" href="#cards" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h5&gt;
&lt;div class="admonition important"&gt;
&lt;p class="admonition-title"&gt;Important&lt;/p&gt;
&lt;p&gt;Only on the website&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sd-card sd-sphinx-override sd-mb-3 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-header docutils"&gt;
&lt;p class="sd-card-text"&gt;Header&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Card Title&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Card content&lt;/p&gt;
&lt;/div&gt;
&lt;div class="sd-card-footer docutils"&gt;
&lt;p class="sd-card-text"&gt;Footer&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;source:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;Card&lt;/span&gt; &lt;span class="n"&gt;Title&lt;/span&gt;

    &lt;span class="n"&gt;Header&lt;/span&gt;
    &lt;span class="o"&gt;^^^&lt;/span&gt;
    &lt;span class="n"&gt;Card&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;
    &lt;span class="o"&gt;+++&lt;/span&gt;
    &lt;span class="n"&gt;Footer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//developer/writing_docs.html"/><published>2026-03-13T00:00:00+00:00</published></entry><entry><id>007163bb-9bcc-560d-8190-35a62f03720f</id><title>Migrating from old versions</title><updated>2026-04-01T13:32:16.077611+00:00</updated><content>&lt;section id="migrating-from-old-versions"&gt;
&lt;span id="migration"&gt;&lt;/span&gt;&lt;h1&gt;Migrating from old versions&lt;a class="headerlink" href="#migrating-from-old-versions" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page is a continuous work in progress, and contributions to it
are welcome. Do not hesitate to open a &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage/pulls"&gt;pull request&lt;/a&gt;.&lt;/p&gt;
&lt;section id="upgrading-should-be-easy"&gt;
&lt;h2&gt;Upgrading should be easy&lt;a class="headerlink" href="#upgrading-should-be-easy" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First and foremost, we make every effort to keep upgrades as seamless as
possible. A long time ago, a big change happened between Varnish Cache 3.x and
4.x, which forced many users to rewrite large parts of their VCL, and we have
since been careful to not demand huge changes again.&lt;/p&gt;
&lt;p&gt;That said, we want to keep Vinyl Cache great, and this requires to sometimes
throw old concepts overboard and make changes. And sometimes we are forced
externally to change even the fundamentals, such as the project name.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="versions"&gt;
&lt;h2&gt;Versions&lt;a class="headerlink" href="#versions" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We try to follow “somehow semantic” versions, with major version bumps when we
break something existing in some meaningful way, such as parameters or bundled
VMOD functions being removed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="we-have-a-lot-of-documentation"&gt;
&lt;h2&gt;We have a lot of documentation&lt;a class="headerlink" href="#we-have-a-lot-of-documentation" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To help users migrate from older versions, we write an &lt;a class="reference external" href="/docs/trunk/whats-new/index.html"&gt;Upgrading&lt;/a&gt; guide for
each Vinyl Cache release. These guides should mention all aspects of each
release which are relevant compared to the previous release. So, to upgrade from
one release to another, we recommend to go through all the &lt;a class="reference external" href="/docs/trunk/whats-new/index.html"&gt;Upgrading&lt;/a&gt; guides
for all intermediate releases.&lt;/p&gt;
&lt;p&gt;We know that this can be a daunting task, but still we recommend to at least get
an overview and look out for particularly relevant aspects, such that when
errors pop up, you might remember a change being mentioned in the
documentation…&lt;/p&gt;
&lt;p&gt;Note that the &lt;a class="reference external" href="/docs/trunk/whats-new/index.html"&gt;Upgrading&lt;/a&gt; page also contains the &lt;em&gt;Changes in …&lt;/em&gt; documents,
which are more comprehensive than the &lt;em&gt;Upgrading to …&lt;/em&gt; guides and also
document new and improved features. You should not need to know these to perform
a successful upgrade, but we still recommend to read them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="no-silent-changes"&gt;
&lt;h2&gt;No silent changes&lt;a class="headerlink" href="#no-silent-changes" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In general, we try to avoid “silent” changes, that is, we try to make sure that
removed or changed behavior triggers an error message if used the old way. One
particular way of marking changes which would otherwise be silent is the VCL
version.&lt;/p&gt;
&lt;p&gt;For example, with introduction of Unix Domain Socket support in &lt;a class="reference external" href="/upgrading-6.0.html#client-ip-server-ip-local-ip-and-remote-ip"&gt;6.0&lt;/a&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;client.ip&lt;/span&gt;&lt;/code&gt;
could suddenly contain the value &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;0.0.0.0&lt;/span&gt;&lt;/code&gt;. To avoid this getting unnoticed,
we tied Unix Domain Socket support to VCL Version 4.1.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="versions-of-the-vcl-language"&gt;
&lt;h1&gt;Versions of the VCL language&lt;a class="headerlink" href="#versions-of-the-vcl-language" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Currently there are two versions of the VCL language, 4.0 and 4.1, and they are
only slightly different.&lt;/p&gt;
&lt;p&gt;This table shows which versions of the VCL language are supported in
different versions of Varnish:&lt;/p&gt;
&lt;div class="table-wrapper docutils container"&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Varnish version&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Supported VCL versions&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;4.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;5.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;5.2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;6.0 LTS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;6.2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6.3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;6.4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6.5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;6.6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;7.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7.1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;7.2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7.3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;7.4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7.5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;7.6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7.7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;8.0&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4.0, 4.1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//tips/migration/index.html"/><published>2026-03-05T00:00:00+00:00</published></entry><entry><id>b7f5bece-985b-55f5-8054-96b538d9e2c0</id><title>The Vinyl Cache Project has a New Identity</title><updated>2026-04-01T13:31:35.967879+00:00</updated><content>&lt;section id="the-vinyl-cache-project-has-a-new-identity"&gt;
&lt;span id="new-identity"&gt;&lt;/span&gt;&lt;h1&gt;The Vinyl Cache Project has a New Identity&lt;a class="headerlink" href="#the-vinyl-cache-project-has-a-new-identity" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="winners-of-the-logo-and-mascot-contets"&gt;
&lt;h2&gt;Winners of the Logo and Mascot Contets&lt;a class="headerlink" href="#winners-of-the-logo-and-mascot-contets" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back in November 2025, we launched a logo contest and promised to announce the
winners in December, but reality hit hard and we missed to keep that promise,
sorry.&lt;/p&gt;
&lt;p&gt;But now we are more than happy to announce the winners:&lt;/p&gt;
&lt;section id="first-price-rhubarbe"&gt;
&lt;h3&gt;First price: &lt;a class="reference external" href="https://rhubarbe.design"&gt;Rhubarbe&lt;/a&gt;&lt;a class="headerlink" href="#first-price-rhubarbe" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="https://rhubarbe.design"&gt;Rhubarbe&lt;/a&gt; convinced the jury with a logo idea inspired by translucent foil,
which adds a layer of protection to web sites:&lt;/p&gt;
&lt;img alt="../_images/vinyl-sketch.png" src="../_images/vinyl-sketch.png" /&gt;
&lt;p&gt;After we informed them of having won the competition (and the prize), they took
this idea and formed it into a polished design:&lt;/p&gt;
&lt;img alt="../_images/logo-construction.png" src="../_images/logo-construction.png" /&gt;
&lt;p&gt;They not only developed the new symbol and wordmark, but also a color scheme,
typography concept and even a website badge. And there is an ASCII transcription
of our logo: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;\(&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You will see more and more of these results on our website
&lt;a class="reference external" href="https://vinyl-cache.org/"&gt;https://vinyl-cache.org/&lt;/a&gt;, and also a hint of it on our source forge
&lt;a class="reference external" href="https://code.vinyl-cache.org/"&gt;https://code.vinyl-cache.org/&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://rhubarbe.design"&gt;Rhubarbe&lt;/a&gt; also won a first price for their submission on a Mascot design, but
we are going to keep you in suspense for a little longer until we annouce that
as well.&lt;/p&gt;
&lt;p&gt;Congratulations, &lt;a class="reference external" href="https://rhubarbe.design"&gt;Rhubarbe&lt;/a&gt;, it has been a pleasure working with you so far,
and we are looking forward to a long lasting relationship.&lt;/p&gt;
&lt;p&gt;The Vinyl Cache Logo is licensed under Creative Commons. If you use it, please do not forget to add:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Rhubarbe&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;rhubarbe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;design&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="n"&gt;Rhubarbe&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;design&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="second-price-pauline-gericke"&gt;
&lt;h3&gt;Second price: &lt;a class="reference external" href="mailto:pauline&amp;#46;gericke&amp;#37;&amp;#52;&amp;#48;ciloud&amp;#46;com"&gt;Pauline Gericke&lt;/a&gt;&lt;a class="headerlink" href="#second-price-pauline-gericke" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a class="reference external" href="mailto:pauline&amp;#46;gericke&amp;#37;&amp;#52;&amp;#48;ciloud&amp;#46;com"&gt;Pauline Gericke&lt;/a&gt; received a well deserved honerable second price for her logo
ideas around variations of a V and a C. We are showing here only one of the
designs she presented:&lt;/p&gt;
&lt;img alt="../_images/pauline.png" src="../_images/pauline.png" /&gt;
&lt;p&gt;The “dynamic sails” idea really resonated with some of the jury.&lt;/p&gt;
&lt;p&gt;Thank you for your submission, Pauline!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//organization/new-identity.html"/><published>2026-03-04T00:00:00+00:00</published></entry><entry><id>9b2913ed-534a-5523-a12b-33364ba92d87</id><title>Governance</title><updated>2026-04-01T13:31:34.515703+00:00</updated><content>&lt;section id="governance"&gt;
&lt;span id="organization"&gt;&lt;/span&gt;&lt;h1&gt;Governance&lt;a class="headerlink" href="#governance" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Vinyl Cache FOSS project is organized as a voluntary association,
a “Forening”, under the laws of Denmark:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference internal" href="bylaws/bylaws_1.00.html#bylaws-1-00"&gt;&lt;span class="std std-ref"&gt;Bylaws of The Vinyl Cache Project (1.00)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference internal" href="minutes/index.html#minutes-of-meetings"&gt;&lt;span class="std std-ref"&gt;Minutes of meetings&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;section id="governing-board"&gt;
&lt;h2&gt;Governing board&lt;a class="headerlink" href="#governing-board" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The governing board is:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Nils Goroll&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Per Buer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Poul-Henning Kamp&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The governing board can be reached as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;core&lt;/span&gt;&lt;/code&gt; at the obvious domain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="policies"&gt;
&lt;h2&gt;Policies&lt;a class="headerlink" href="#policies" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;section id="behavior-code-of-conduct"&gt;
&lt;span id="organization-behavior"&gt;&lt;/span&gt;&lt;h3&gt;Behavior / Code of conduct&lt;a class="headerlink" href="#behavior-code-of-conduct" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;General rules about how contributors should behave within the Vinyl
Cache project:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Show respect for others.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Be sensible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If in doubt, think.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If still in doubt, ask.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Admit your mistakes, it’s faster that way.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thou SHALL not paint &lt;a class="reference external" href="http://bikeshed.org/"&gt;bikesheds.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will toss you out of the project rather than add another rule.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="maintainer-roles"&gt;
&lt;span id="organization-maintainers"&gt;&lt;/span&gt;&lt;h3&gt;Maintainer Roles&lt;a class="headerlink" href="#maintainer-roles" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Regarding the day-to-day development of Vinyl Cache, decisions are
made by project maintainers on:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;disputed pull requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VIPs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;which contributors should be granted the commit bit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and all other relevant decisions regarding the design of Vinyl Cache&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When a change is proposed, maintainers must get ample time to review
the proposition. Then, if the maintainers who are &lt;em&gt;for&lt;/em&gt; the change
outnumber the ones &lt;em&gt;against&lt;/em&gt; by at least two, the pull request can be
merged or the change implemented.&lt;/p&gt;
&lt;p&gt;Maintainer nomination is going to change under the new project governance, but
in the meantime, the old maintainer rules are still in place:&lt;/p&gt;
&lt;p&gt;As of September 2019, three maintainer “hats” have been nominated,
held by&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Firma den Andensidste Viking (Poul-Henning Kamp)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Varnish Software&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;UPLEX&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The companies each nominate a developer as their maintainer, and this
can vary throughout the year (to allow for vacations etc.).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-vinyl-developer-day"&gt;
&lt;span id="organization-vdd"&gt;&lt;/span&gt;&lt;h3&gt;The Vinyl Developer Day&lt;a class="headerlink" href="#the-vinyl-developer-day" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The Vinyl Developer Day (VDD) has, in recent years, been by
invitation only, and traditionally, core developers and relevant
supporters of the project participated. The exact rules for future
Developer Days are still to be worked out, but the project will
continue to invite all developers who have made meaningful
contributions. The purpose of the VDD will remain to provide a
platform for discussion of technical aspects of Vinyl Cache and its
implementation.&lt;/p&gt;
&lt;p&gt;We are also looking to bring back Vinyl Cache User Group (VUG) meetings
before or after VDDs so that Vinyl Cache users can take a bigger part in,
and have a bigger influence on the direction of Vinyl Cache.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bugs-pull-requests-feature-requests"&gt;
&lt;span id="organization-issues"&gt;&lt;/span&gt;&lt;h3&gt;Bugs, pull requests, feature requests&lt;a class="headerlink" href="#bugs-pull-requests-feature-requests" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bugs start out as &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/issues"&gt;issues&lt;/a&gt; or, if they
already have a patch, &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/pulls"&gt;Pull Requests&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Security issues should be reported responsibly, by sending a PGP encrypted email
to our contacts. See &lt;a class="reference internal" href="../security/index.html#security"&gt;&lt;span class="std std-ref"&gt;Security&lt;/span&gt;&lt;/a&gt; for more information on this.&lt;/p&gt;
&lt;p&gt;Feature requests should be sent to the &lt;a class="reference external" href="https://vinyl-cache.org/lists/mailman/listinfo/vinyl-misc"&gt;vinyl-misc mailing list&lt;/a&gt;. A feature request
which is considered important and where a developer is assigned to implement it,
&lt;em&gt;can&lt;/em&gt; be made into an issue. The list is meant to be a place where developers
can bring up ideas of features and their implementation, before the actual code
is written.&lt;/p&gt;
&lt;p&gt;If a feature request make sense, but is not picked up by a developer,
it gets moved to a wiki/VIP page until somebody implements it.&lt;/p&gt;
&lt;p&gt;Monday at 15:00-15:30 (EU time) we “bug-wash” on IRC to decide who
handles which issue and how. See the &lt;a class="reference internal" href="../support/index.html#support"&gt;&lt;span class="std std-ref"&gt;Getting Help&lt;/span&gt;&lt;/a&gt; for details on how
to reach us on IRC. Maintainers are present during the bug-wash, and
external contributors are encouraged to attend to discuss any Pull
Requests or bug reports they have submitted.&lt;/p&gt;
&lt;p&gt;Pull requests are obligatory for all contributions, unless they
qualify for the exceptions laid out below.&lt;/p&gt;
&lt;p&gt;Everybody are encouraged to review pull requests.&lt;/p&gt;
&lt;p&gt;Maintainers can approve pull requests, as described in
&lt;a class="reference internal" href="#organization-maintainers"&gt;&lt;span class="std std-ref"&gt;Maintainer Roles&lt;/span&gt;&lt;/a&gt; above.&lt;/p&gt;
&lt;p&gt;The exception to the pull request process are trivial, &lt;em&gt;risk free&lt;/em&gt;
changes, which can be committed and pushed (by a developer with the
&lt;em&gt;commit bit&lt;/em&gt;) without a review. These include in particular, but are
not limited to,&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Documentation changes, unless they concern policies or governance of
the project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simple bug fixes tested by a vinyl test case (VTC).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="the-commit-bit"&gt;
&lt;h3&gt;The commit bit&lt;a class="headerlink" href="#the-commit-bit" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The commit bit is handed out to contributors who have proven their
knowledge of Vinyl internals, and must be approved unanimously by
the maintainers.&lt;/p&gt;
&lt;p&gt;Committers who have not made contributions in 18 months will have
their commit bit suspended, but can ask the maintainers to hand it
back.&lt;/p&gt;
&lt;p&gt;Commit bits expire after 36 months with no contribution.&lt;/p&gt;
&lt;div class="toctree-wrapper compound"&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//organization/index.html"/><published>2026-03-02T00:00:00+00:00</published></entry><entry><id>5704fdd7-b98a-5221-9082-ffc4e3b9d7c5</id><title>Bylaws of The Vinyl Cache Project (1.00)</title><updated>2026-04-01T13:31:34.292465+00:00</updated><content>&lt;section id="bylaws-of-the-vinyl-cache-project-1-00"&gt;
&lt;span id="bylaws-1-00"&gt;&lt;/span&gt;&lt;h1&gt;Bylaws of The Vinyl Cache Project (1.00)&lt;a class="headerlink" href="#bylaws-of-the-vinyl-cache-project-1-00" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="toctree-wrapper compound"&gt;
&lt;/div&gt;
&lt;section id="background-information-for-non-danes"&gt;
&lt;h2&gt;Background information for non-Danes&lt;a class="headerlink" href="#background-information-for-non-danes" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Vinyl Cache Project is organized as a voluntary association
in, and under the laws of Denmark.&lt;/p&gt;
&lt;p&gt;Voluntary associations, “Foreninger”, have existed for centuries in
Northern Europe, but depending on the country, a royal approval of
their charter was the general norm.&lt;/p&gt;
&lt;p&gt;In Denmark this ended with the first constitution in 1849, where
article §92 made it a citizens unconditional right to form associations
“for any legal purpose”.&lt;/p&gt;
&lt;p&gt;It was an instant hit, and fueled the modernization of Denmark by
organizing intellectual, industrial and agricultural transformations
of the country, to the point where there are jokes in the general
shape of »If three Danes are waiting for a bus and it is more than five
minutes delayed, they will have formed a voluntary organization by
the time it arrives.«&lt;/p&gt;
&lt;p&gt;A voluntary association have only two mandatory components:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The bylaws, or constitution, which lays down the law for
the association.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The General Assembly, a meeting where all the members can
participate, which governs the association according to it’s
bylaws.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Practically all associations also have:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The Governing Board with members elected by, and responsible
to the General Assembly, tasked with managing association’s
business between the meetings of the General Assembly.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are a few questions the bylaws must always answer (see
“Formalia”) but apart from that, it is a free for all:  Bylaws can
100% legally be unfair, discriminatory, incoherent, inconsistent
or even plain stupid, all of which have been tried, with little
success, developing a strong tradition for how to write good bylaws.&lt;/p&gt;
&lt;p&gt;A voluntary association can be dragged into court in three ways:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Law-breaking.  Associations are subject to the law of the
land, just like everybody else.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Externally.  For instance if the association does not pay its
bills, repay it’s loans or deliver on other contracts or
obligations.  Again: Same as everybody else.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Internally.  Members of the association ask courts to get
the bylaws enforced.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The two first are entirely normal business for a Danish Court, the
fact that one part is an association hardly makes any difference.&lt;/p&gt;
&lt;p&gt;The last one almost never goes well in court, because the entire
point is for voluntary associations to manage their own affairs
according to the bylaws they agreed on when they banded together,&lt;/p&gt;
&lt;p&gt;More often than not, the resulting judgment simply says “That is
not for us but for the General Assembly to figure out”.&lt;/p&gt;
&lt;p&gt;Since the looser always pays the winner’s costs in Denmark, very
few judgments get to substance, which again means that it really
is up to each voluntary association to wisely write it’s own bylaws
and manage it’s own affairs sensibly.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="the-bylaws"&gt;
&lt;h1&gt;The Bylaws&lt;a class="headerlink" href="#the-bylaws" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The following are the bylaws of the Vinyl Cache Project, as
enacted by the founding General Assembly on 2025-10-23.&lt;/p&gt;
&lt;p&gt;The full revision history can be found at the bottom.&lt;/p&gt;
&lt;p&gt;The Commentary is not part of the bylaws, but serves only to
explain the thinking that went into them.&lt;/p&gt;
&lt;section id="formalia"&gt;
&lt;h2&gt;Formalia&lt;a class="headerlink" href="#formalia" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§1.1 Name&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The name of the association is:&lt;/p&gt;
&lt;p class="sd-card-text"&gt;»The Vinyl Cache Project«&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The formal name used in correspondence.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§1.2 Purpose&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The purpose of the association is to
develop, maintain and distribute the
Vinyl Cache software under the “BSD-2-clause”
Free and Open Source License.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;All decisions made, and all activities
engaged in, under the umbrella of the
association must be in furtherance of
the association’s stated purpose.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§1.3 Home&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The association is governed by the laws of Denmark,
and its home is the city of Slagelse, Denmark&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;All associations must declare what it considers it’s “legal
home”, in case somebody is insane enough to file a lawsuit
against it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§1.4 Correspondence&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Correspondence to the association must be sent to
the email address &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;core&amp;#64;vinyl-cache.org&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;… and how and where you can contact it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="the-general-assembly"&gt;
&lt;h2&gt;The General Assembly&lt;a class="headerlink" href="#the-general-assembly" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.1 The General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The General Assembly consists of all members
of the association, and is the highest authority
of the association.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;This is literally the definition under Danish law, so
strictly speaking it is not necessary to even write this,
but it is customary to do so, to make the bylaws
read naturally.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.2 Meetings of the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;In anticipation of the members of the association being
spread over continents, and in light of the greenhouse gas
pollution emitted by international travel, the General
Assembly will meet electronically, using suitable Free And Open
Source software technology available to all members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The General Assembly has traditionally always been in-person,
but no court has ever held that it must be so.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;After Covid-19 it has been obvious to everybody that it
cannot be a legal requirement, provided technological access
to the on-line meeting is functional, free and fair.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.3 Calling meetings of the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Meetings of the General Assembly must be called by email
to all members’ personal email address, at least 21 but no
more than 42 calendar days ahead of the meeting.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;The email must include:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Date &amp;amp; Time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The technology for the meeting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The Agenda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The full text of all proposals to be voted on&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="sd-card-text"&gt;Members can submit additional agenda items or proposed
amendments until 15 calendar days before the announced
meeting, and if so the final agenda will be sent to the
members 14 calendar days before the meeting.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;There is a lot of variation in this area, but the universal
theme is that the members must be fairly informed what
decisions might be made and how that might affect them.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Therefore it is customary to require that only matters
announced well head of the G.A can be voted on.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;But see §2.5 for how things can be legally
rushed through anyway.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.4 Meeting agenda for the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The agenda for any meeting of the General Assembly must
follow this template:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Election of the Chair of the meeting.  Membership
is not required for this job, election is by simple
majority of the members present.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The elected Chair determines if the meeting has been
convened in accordance with the bylaws.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;… (The business of the meeting)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Messages.  Member present can bring issues to
the attention of the General Assembly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The Chair closes the meeting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The point named “Messages” here is traditionally named
“Eventuelt” in Danish, which would translate directly to
“Optional”.  No decisions of any consequence can be made
under this agenda point, precisely because they were not
on the agenda.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.5 Rules of quorum of the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Ordinary business on the final agenda distributed prior to
the General Assembly, including on-topic amendments proposed
during the meeting, are decided by simple majority of the
members present.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Where the bylaws require decision by a qualified majority,
two thirds of all members, or two thirds of the members
present at two sequential meetings of the General Assembly
are required for approval.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;If all the members of the Association are in unanimous
agreement, any decision can be made at any time, without
going through the formality of calling a General Assembly
to do so.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The last paragraph is part of the default legal background,
and is based on the observation that if everybody agrees,
there is no minority which needs the protection of due
notice etc.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;There is a weaker background rule which says that if the
General Assembly would be able to change the bylaws, they
can also disregard the bylaws, because they could change
the bylaws to explicitly allow what they want to do.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;That background rule is almost always thwarted by the
requirement, also present here, that the complete agenda
of the G.A. must be announced in advance, so in practice
this only applies if changes to the bylaws are already on
the agenda.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.6 Annual Meetings of the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The ordinary annual meeting on the General Assembly takes
place in the late afternoon, UTC time, on the first
Monday on or after February 22nd.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;The following items must be the first orders of business
for the meeting, in this exact order:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Annual report from the Governing Board&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Termination of memberships according to §4.2.
Removed members lose their voting right instantly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Acceptance of members according to §4.1
New members get to vote from the next General Assembly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Election of members to the Governing Board.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Election of substitute members to the Governing Board,
if the General Assembly so decides.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;February 22nd 2006 is the conventional birthday of the
Varnish Cache Project.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Normally there would also be a  “Approval of last years
accounting” and a “Next years budget &amp;amp; annual membership
fees” point on the agenda, but without money, they are
unnecessary.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§2.7 Extraordinary Meetings of the General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Any two members of the Governing Board or one third of the
members (rounded up) can call an extraordinary meeting
of the General Assembly, by following the procedure in §2.3&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;This is the fall-back conflict resolution mechanism, if all
else fails, the members get to sort things out at the General
Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="the-governing-board"&gt;
&lt;h2&gt;The Governing Board&lt;a class="headerlink" href="#the-governing-board" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.1 The Governing Board&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Governing Board consists of members elected by the
General Assembly, and conduct the day to day business of
the association, between meetings of the General Assembly.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;In line with tradition in Free and Open Source Software, the
Governing Board can also use the alias “The Vinyl Cache Core
Team”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;This is the most common construction, but since not all
associations have a Governing Board, it must be
stated explicitly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.2 Size of the Governing Board&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The number of members on the Governing Board shall be:&lt;/p&gt;
&lt;p class="sd-card-text"&gt;&lt;em&gt;log&lt;/em&gt; &lt;sub&gt;2&lt;/sub&gt; (number_of_members)&lt;/p&gt;
&lt;p class="sd-card-text"&gt;(rounded down) but no less than three.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;div class="table-wrapper docutils container"&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p class="sd-card-text"&gt;Members&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p class="sd-card-text"&gt;Size of G.B&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p class="sd-card-text"&gt;1…15&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p class="sd-card-text"&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p class="sd-card-text"&gt;16…31&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p class="sd-card-text"&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p class="sd-card-text"&gt;32…63&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p class="sd-card-text"&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p class="sd-card-text"&gt;etc.&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.3 Business rules of the Governing Board&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Governing Board makes decisions by a simple majority
of the entire Governing Board, unless they have unanimously
enacted different rules of business.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Board is free to organize its own business as long as
they all agree about it, with the bylaws and General Assembly
as backstop if they can not agree.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.4 Record keeping&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Governing Board is responsible for keeping
the official journal of the association, documenting
therein:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Changes in membership&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Changes in composition of the Governing Board&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Complete recordings of the meetings of the General Assembly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Decisions of the Governing Board&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;External communications&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="sd-card-text"&gt;Members have a right to inspect the official journal, with
only such redactions as the Governing Board deems necessary.
Such redactions can be appealed against to the General Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;There is no legal requirement for an official journal.  But
when a voluntary association engages in legal or monetary
agreements the other party, for instance the association’s
bank, will want to see proof of mandate from the associations
representatives.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;It is however considered very bad form to not have “the
papers on order”.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Normally the General Assembly will also elect a secretary
to write the official summary, but we rely instead on
an electronic recording of the General Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.5 Elections to the Governing Board&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Members of the Governing Board are elected by the
General Assembly, from among the members willing to serve.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Candidacy for the Governing Board can be announced before
or or during the General Assembly.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;The one third (rounded down in even years, rounded up in
odd years) members of the Governing Board, who have served
longest since their previous (re)election, are automatically
up for (re)election at the Annual General Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;This part varies a lot, and can have major impact on the
balance of power between the Governing Board and the members.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;We try to strike a even balance where neither have the
upper hand over the other.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.6 Removal of members from the Governing Board&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The General Assembly can remove a member of the Governing
Board only by a super-majority electing their replacement.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;This sort of follows from §3.2 which defines the precise
size of the Governing Board.
The requirement that a super-majority can agree on the
replacement aims to ensure stability.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§3.7 Vacancies&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Members of the Governing Board may step down at any time.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;If the General Assembly have not elected substitute members
to the Governing Board, a resignation from the Governing
Board triggers an Extraordinary General Assembly to fill
the vacancy.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;We are not allowed to chain the members of the Governing Board
to their oars.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="the-members"&gt;
&lt;h2&gt;The Members&lt;a class="headerlink" href="#the-members" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§4.1 Qualification for Membership&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The qualifications for membership are:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Members must be natural persons acting under their real name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Persons subject to EU or Danish legal sanctions
cannot gain or retain membership.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Membership applications must be supported by two
existing members.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The approval of the General Assembly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;We explicitly limit membership to actual persons to
exclude companies and organizations. in order to
avoid different “classes” or “levels” of membership.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Companies and organizations are encouraged to have an
employee or other person represent them in the association
via a membership, but it is the person holds the membership,
not the company.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§4.2 Disqualification for Membership&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The General Assembly shall deny or terminate memberships if:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The person has acted counter to the interests of the
association, including, but not limited to, wasting
people’s time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The person does not have the trust of the General Assembly&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Granting or retaining membership would give any third
party undue influence over the association.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The person disagrees with or acts counter to the United
Nation’s Universal Declaration of Human Rights.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p class="sd-card-text"&gt;The unanimous Governing Board can temporarily suspend a
membership until the next General Assembly can vote on it.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Point three is to prevent some organization for enrolling
enough members to take over control of association.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;We fully recognize the risk of “slow and gradual takeover”
but we trust the General Assembly do so too.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Point four is our Code of Conduct, written by
people &lt;em&gt;far&lt;/em&gt; smarter and better at it, than the people who
usually writes CoC’s for FOSS projects.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§4.3 Duty of disclosure&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Members and prospective members must truthfully disclose
any information necessary for the General Assembly to
make it’s determination under clause §4.1 and §4.2&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;It is not the Governing Board’s job to spy on the members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§4.4 Proof of actual interest&lt;/div&gt;
&lt;p class="sd-card-text"&gt;In the absence of an annual membership fee to the association,
members must prove their concrete and substantial interest
in the Association, by presenting, before the Annual General
Assembly, a receipt documenting a monetary donation of no
less than EUR 100, made by the member, in the name of the
Association, to one or more of the NGOs on this list:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;The International Red Cross/Crescent/Crystal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;MSF - Médecins Sans Frontières&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Amnesty International&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Human Rights Watch&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;We do not want to get a lot of social-media-cascade membership
applications, from people who will have forgotten everything
about us by the time of the next Annual Meeting.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Normally the annual membership fee serves this purpose,
by eliminating members who, for whatever reason, have not
paid their dues on time.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;The required donations are a “membership fee by proxy” which
imposes the usual duty of attention and monetary commitment
on the members, but avoids the substantial complexity of
handling money in an association with an international
membership&lt;/p&gt;
&lt;p class="sd-card-text"&gt;We deliberately choose to benefit widely respected global
Human Rights Organizations, rather than FOSS NGOs.
Primarily because the work of the former is far more
important, but also because the latter would be “too close
to home” and likely waste much time and energy on debates
about who should, and should not, be on the list.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§4.5 Inter-membership communications&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Governing Board shall maintain an opt-out, mailing list,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;members&amp;#64;vinyl-cache.org&lt;/span&gt;&lt;/code&gt; where the members can communicate
freely amongst themselves in private.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;If the members did not have a private means of communication,
they would not be able to exercise their right to call an
General Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="changing-bylaws-and-dissolution"&gt;
&lt;h2&gt;Changing Bylaws and dissolution&lt;a class="headerlink" href="#changing-bylaws-and-dissolution" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§5.1 Changes to the bylaws&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Changes to the bylaws or dissolution of the Association
requires a qualified majority of the General Assembly.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;They bylaws are meant to be stable, but not cast in
stone.  Changes should be infrequent and important.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§5.2 Dissolution of the association&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The association is automatically dissolved if the membership
ever falls below three.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The mechanics of the bylaws do not work with less than
three members, and it is legally debatable of an association
can even have less than three members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§6.1 No money&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The association will not have and will not handle any money,
but rely entirely on sponsorship for any unavoidable expenses.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Handling money in international context is nothing but trouble,
and the foreseen expenses are trivial enough that we trust
sponsors can be found amongst the members.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§6.2 Administrative Privileges&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Only members of the Governing Board can hold administrative
privileges on the Associations IT and other infrastructure.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;See also: Reflections on Trusting Trust.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§6.3 Commit Privileges&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The Governing Board grants and revokes commit privileges
to the associations repositories.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Commit privilege does not imply membership or vice versa.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="transitional-clauses"&gt;
&lt;h2&gt;Transitional Clauses&lt;a class="headerlink" href="#transitional-clauses" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§7.1 Founding members&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The founding members, and initial Governing Board
of the association consists of:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Poul-Henning Kamp&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Nils Goroll&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p class="sd-card-text"&gt;Per Buer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Poul-Henning lives in Denmark and owns the one-man company
“Den Andensidste Viking”.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Nils lives in Germany, and is the founder and owner
of the company “UPLEX”.&lt;/p&gt;
&lt;p class="sd-card-text"&gt;Per lives in Norway, and is the founder and an employee
of the company “Varnish Software”.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-container-fluid sd-sphinx-override sd-mb-4 docutils"&gt;
&lt;div class="sd-row sd-row-cols-2 sd-row-cols-xs-2 sd-row-cols-sm-2 sd-row-cols-md-2 sd-row-cols-lg-2 docutils"&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
§7.2 First Annual General Assembly&lt;/div&gt;
&lt;p class="sd-card-text"&gt;The first Annual General Assembly will be held on February 23. 2026&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="sd-col sd-d-flex-row docutils"&gt;
&lt;div class="sd-card sd-sphinx-override sd-w-100 sd-shadow-sm docutils"&gt;
&lt;div class="sd-card-body docutils"&gt;
&lt;div class="sd-card-title sd-font-weight-bold docutils"&gt;
Commentary&lt;/div&gt;
&lt;p class="sd-card-text"&gt;Membership applications are welcome.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="revision-log"&gt;
&lt;h2&gt;Revision log&lt;a class="headerlink" href="#revision-log" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="table-wrapper docutils container"&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Version&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Hash&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Date&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Description&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;1.00&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;xxxxxxx&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;20251023&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Ratified&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//organization/bylaws/bylaws_1.00.html"/><published>2026-03-02T00:00:00+00:00</published></entry><entry><id>0ca46216-f158-5f38-baba-6a0c358c52c0</id><title>Vinyl Cache has left github</title><updated>2026-04-01T13:31:35.713043+00:00</updated><content>&lt;section id="vinyl-cache-has-left-github"&gt;
&lt;span id="moving"&gt;&lt;/span&gt;&lt;h1&gt;Vinyl Cache has left github&lt;a class="headerlink" href="#vinyl-cache-has-left-github" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="what-you-need-to-do"&gt;
&lt;h2&gt;… what you need to do&lt;a class="headerlink" href="#what-you-need-to-do" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;If you are interested in continued collaboration with the Vinyl Cache project,
please register an account on our self hosted &lt;a class="reference external" href="https://forgejo.org/"&gt;forgejo&lt;/a&gt;
instance following &lt;a class="reference external" href="https://code.vinyl-cache.org/user/sign_up?jwt=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRWZFVKUFU5QlJVVUNRdHl5Uk1xcS00TmdIVXZJVmtSbE5BUE5jeDgyMmciLCJ0eXAiOiJKV1QifQ.eyJpc3MiOiIvdXNlci9zZXR0aW5ncy9pbnZpdGF0aW9ucyIsInN1YiI6InNsaW5rIiwiYXVkIjpbIi91c2VyL3NpZ25fdXAiXSwiZXhwIjoxNzc3MDQzMzYyLCJpbnZpdGVyIjo0LCJyY250IjoxMDAsInJpbnQiOjI1OTIwMDB9.O2tHLu_rE0ny4YL1r3T_RhcGsnXJ3Nud5gb7Wp4H7g9uisjZm4JL_7wSjp9v5Fur1QMTqOZvX9FfFUtryVJEh-hW_iIduN0wRVL1F4SGtal435CZlgScYCH1fswDUi2CRLS21F6kXfOt7OcRatnfj8dwMPqzXh1C5X-8_l77bTSbxPC0gJZsrvgmsmnojZYCwlFVQKBIV0g4A_y6muLfU8bPo-EYHojtptE8V3KTa_4kBMhTVFHqwE25JQMFWzquD1XaDDgC5pTRGJ63VNcr475HHYoWmNqlNb2uJYviYjABsY3FsjgSQoErE1fyxlwpdPKIxE9MqVyPZRZCENpMQw"&gt;this link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This invitation link expires 2026-04-24T17:09:22+02:00 and is good for up to 100
registrations.&lt;/p&gt;
&lt;p&gt;When it becomes invalid, anyone who already has an account should be able to help out,
unless we still get abused by spammers and need to close registrations again.&lt;/p&gt;
&lt;p&gt;If you have registered and do not receive the email confirmation, please check
your SPAM folder.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-the-new-forge"&gt;
&lt;h2&gt;About the new forge&lt;a class="headerlink" href="#about-the-new-forge" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our forge is special in some ways. Read about it and/or report issues:
&amp;lt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/code.vinyl-cache.org"&gt;https://code.vinyl-cache.org/vinyl-cache/code.vinyl-cache.org&lt;/a&gt;&amp;gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="location-mapping-old-new"&gt;
&lt;h2&gt;Location mapping old/new&lt;a class="headerlink" href="#location-mapping-old-new" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The translation rules from old to new URL are:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the prefix changes from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;https://github.com/varnishcache/&lt;/span&gt;&lt;/code&gt; to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;https://code.vinyl-cache.org/vinyl-cache/&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;in the project name, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;varnish&lt;/span&gt;&lt;/code&gt; is replaced with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vinyl&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The main/trunk branch is going to be &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;main&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Or expressed as a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sed&lt;/span&gt;&lt;/code&gt; command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s:github.com/varnish:code.vinyl-cache.org/vinyl-:; s:varnish:vinyl:&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="table-wrapper docutils container"&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;old&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;new&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/varnish-cache"&gt;https://github.com/varnishcache/varnish-cache&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache"&gt;https://code.vinyl-cache.org/vinyl-cache/vinyl-cache&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/homepage"&gt;https://github.com/varnishcache/homepage&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/homepage"&gt;https://code.vinyl-cache.org/vinyl-cache/homepage&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/pkg-varnish-cache"&gt;https://github.com/varnishcache/pkg-varnish-cache&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/pkg-vinyl-cache"&gt;https://code.vinyl-cache.org/vinyl-cache/pkg-vinyl-cache&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/varnish-devicedetect"&gt;https://github.com/varnishcache/varnish-devicedetect&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-devicedetect"&gt;https://code.vinyl-cache.org/vinyl-cache/vinyl-devicedetect&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/libvmod-example"&gt;https://github.com/varnishcache/libvmod-example&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/libvmod-example"&gt;https://code.vinyl-cache.org/vinyl-cache/libvmod-example&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/fuzzdata"&gt;https://github.com/varnishcache/fuzzdata&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/fuzzdata"&gt;https://code.vinyl-cache.org/vinyl-cache/fuzzdata&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/vc-commit-event"&gt;https://github.com/varnishcache/vc-commit-event&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vc-commit-event"&gt;https://code.vinyl-cache.org/vinyl-cache/vc-commit-event&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/pkg-debian"&gt;https://github.com/varnishcache/pkg-debian&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/pkg-debian"&gt;https://code.vinyl-cache.org/vinyl-cache/pkg-debian&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/varnishcache/varnish-release-rpm"&gt;https://github.com/varnishcache/varnish-release-rpm&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-release-rpm"&gt;https://code.vinyl-cache.org/vinyl-cache/vinyl-release-rpm&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;These are the web frontend URLs. The git clone URLs change accordingly,
optionally with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.git&lt;/span&gt;&lt;/code&gt; appended. Ssh access changes from
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;git&amp;#64;github.com:___.git&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;git&amp;#64;code.vinyl-cache.org/___.git&lt;/span&gt;&lt;/code&gt; (optionally
without &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.git&lt;/span&gt;&lt;/code&gt;) with paths substituted as per the table above. The main/trunk
branch changes to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;main&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note that some repositories have not been in use for some time. We will possibly
decide to then also archive them on our own forge.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="changing-your-git-settings"&gt;
&lt;h2&gt;Changing your git settings&lt;a class="headerlink" href="#changing-your-git-settings" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bash&lt;/span&gt;&lt;/code&gt; script automates changing the origin and main branch. Use
it from within a git-directory. If your “main origin” is not called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;origin&lt;/span&gt;&lt;/code&gt;,
adjust the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;origin=origin&lt;/span&gt;&lt;/code&gt; line accordingly:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;#!/bin/bash

## call this from a varnish-cache git directory

set -eux
top=$(git rev-parse --show-toplevel)
cd &amp;quot;${top}&amp;quot;

# determine the new origin and use it
origin=origin
newurl=$(git remote get-url &amp;quot;${origin}&amp;quot; | sed -e &amp;#39;s:github.com\([\:/]\)varnishcache:code.vinyl-cache.org\1vinyl-cache:;s:varnish:vinyl:&amp;#39;)
git remote set-url &amp;quot;${origin}&amp;quot; &amp;quot;${newurl}&amp;quot;
git fetch

# rename main to master
git checkout -b main master
git branch -u origin/main main
git branch -d master
if [[ &amp;quot;${top}&amp;quot; == *varnish* ]] ; then
      new=&amp;quot;${top/varnish/vinyl}&amp;quot;
      mv &amp;quot;${top}&amp;quot; &amp;quot;${new}&amp;quot;
      echo NOW CALL: cd &amp;quot;${new}&amp;quot;
fi
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="what-is-happening-after-the-forge-migration"&gt;
&lt;h2&gt;What is happening after the forge migration&lt;a class="headerlink" href="#what-is-happening-after-the-forge-migration" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that the important first step is done, we are very busy getting our tooling
back, which is mainly &lt;a class="reference external" href="https://vinyl-cache.org/vtest/"&gt;vtest&lt;/a&gt; and other CI as
well as the automatic website update.&lt;/p&gt;
&lt;p&gt;When the dust has settled, we will add mirrors, which will provide read only
access to &lt;em&gt;code only&lt;/em&gt;. They will get announced on &lt;a class="reference external" href="https://vinyl-cache.org"&gt;https://vinyl-cache.org&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="mini-retro-what-we-did"&gt;
&lt;h2&gt;Mini-Retro: What we did&lt;a class="headerlink" href="#mini-retro-what-we-did" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One by one, we migrated our repositories from github to &lt;a class="reference external" href="https://code.vinyl-cache.org"&gt;https://code.vinyl-cache.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following was done for each in turn:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;last&lt;/span&gt;&lt;/code&gt; tag was pushed for important repositories.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A note will was added to the README to inform about the migration, new
repository location and, optionally, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;last&lt;/span&gt;&lt;/code&gt; tag.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If applicable, the central script/tool called for code builds was changed to
fail and point to the README. This was usually &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt; or a primary
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;make&lt;/span&gt;&lt;/code&gt; target.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The github repository was set to &lt;em&gt;archived&lt;/em&gt;. This means that no changes to
the code, pull requests, issues, the wiki or whatever were possible from this
point on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The repository was migrated to the new location.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the migration was complete and manual sanity checks looked OK, the
repository was opened at the new location.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="what-went-wrong"&gt;
&lt;h3&gt;What went wrong&lt;a class="headerlink" href="#what-went-wrong" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On one or two occasions, the README change was accidentally wrong, so we had to
un-archive, fix and archive github again.&lt;/p&gt;
&lt;p&gt;For the migration to our most important repo
&amp;lt;&lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache"&gt;https://code.vinyl-cache.org/vinyl-cache/vinyl-cache&lt;/a&gt;&amp;gt;, we did not consider that
renaming the master branch to main by pushing a new main branch and then
deleting the master branch would render all migrated pull requests with master
as the base invalid. Forgejo automatically closed them.&lt;/p&gt;
&lt;p&gt;Thanks to the fantastic superpowers of self hosting, fixing this issue directly
on the SQL level was straight forward, so all accidentally closed pull requests
are available again, except for a &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/issues/4450"&gt;minor detail&lt;/a&gt; which we
did not bother fixing.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
&lt;section id="epilogue"&gt;
&lt;h2&gt;Epilogue&lt;a class="headerlink" href="#epilogue" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While “vinylizing” the documentation, I (slink) read again some old articles and
came across &lt;a class="reference external" href="https://vinyl-cache.org/docs/trunk/phk/10goingon50.html"&gt;Varnish - 10 going on 50&lt;/a&gt; where phk wrote in 2006:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;We’re also moving the project to github.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This made me realize that the Vinyl Cache project left github almost exactly
ten years after the Varnish Cache project moved there, and the problem I spent
most time on before migrating to forgejo is still the same as it was back then,
just now we have AI crawlers on top:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;we’re sick and tired of defending (trac) against spammers.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;For a bit of background, see &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/code.vinyl-cache.org"&gt;about this server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At the time, the old tickets could not really be migrated, so phk added some
placeholders with links to static copies of trac, which got retired in the
meantime. But today we can still see the &lt;a class="reference external" href="https://code.vinyl-cache.org/vinyl-cache/vinyl-cache/issues/1866"&gt;first ticket created on github&lt;/a&gt; on
March 4th, 2016.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//organization/moving.html"/><published>2026-02-16T00:00:00+00:00</published></entry><entry><id>dfa03192-4a70-5c10-89b7-91f32aca7891</id><title>VCOT: OpenTelemetry Instrumentation for Vinyl-Cache</title><updated>2026-04-01T13:31:30.773444+00:00</updated><content>&lt;section id="vcot-opentelemetry-instrumentation-for-vinyl-cache"&gt;
&lt;span id="news-2025-11-20-vcot"&gt;&lt;/span&gt;&lt;h1&gt;VCOT: OpenTelemetry Instrumentation for Vinyl-Cache&lt;a class="headerlink" href="#vcot-opentelemetry-instrumentation-for-vinyl-cache" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p class="date rubric"&gt;2025-11-20&lt;/p&gt;
&lt;p&gt;We have opened the repository of &lt;a class="reference external" href="https://gitlab.com/uplex/varnish/VinylCacheOpenTelemetry"&gt;VCOT (VinylCacheOpenTelemetry)&lt;/a&gt;, a brand new
open-source (GPL) Go utility designed to enhance observability in Vinyl-Cache
(and, for the time being, Varnish-Cache) environments through an integration
with OpenTelemetry.&lt;/p&gt;
&lt;p&gt;Up until now Vinyl-Cache was able to produce highly-detailed logs and provide
precise insight into the cache behavior, but it was not able to integrate with
modern observability standards.&lt;/p&gt;
&lt;p&gt;VCOT addresses the need for modern monitoring in high-performance systems by
parsing Varnish Shared Logs (VSL) in real-time and exporting telemetry data -
traces, metrics, and logs - to OpenTelemetry-compatible backends.&lt;/p&gt;
&lt;p&gt;This is just the beginning, VCOT is destined to evolve based on users’ feedback.
Please open issue and/or PRs if you wish to see this tool improve.&lt;/p&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//news/2025-11-20_vcot.html"/><published>2025-11-20T00:00:00+00:00</published></entry><entry><id>b8d5e913-c484-50e4-8e7b-c595fb1a940f</id><title>20 years old and it is time to get serious(er)</title><updated>2026-04-01T13:31:33.913971+00:00</updated><content>&lt;section id="years-old-and-it-is-time-to-get-serious-er"&gt;
&lt;span id="years"&gt;&lt;/span&gt;&lt;h1&gt;20 years old and it is time to get serious(er)&lt;a class="headerlink" href="#years-old-and-it-is-time-to-get-serious-er" title="Permalink to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Slagelse, 2025-09-15&lt;/p&gt;
&lt;p&gt;This coming february 22nd, The Varnish Cache Project will officially
be 20 years old.  We consider the first surviving commit from the
subversion-to-git conversion the official birthday of the Project.&lt;/p&gt;
&lt;p&gt;This is as good as any excuse to take stock and make some changes
so we are ready for the next 20 years.&lt;/p&gt;
&lt;p&gt;Open Source is not what it used to be:  The EU has launched a
broadside of directives against software related industries, and
while they have gone to great lengths to carve out a niche for Free
and Open Source Software, they have wisely not chosen to make it a
“Get out of jail for free” card to slap “FOSS” sticker on something.&lt;/p&gt;
&lt;p&gt;Concepts like “Maintainers”, “Stewards” and “Contributors” of FOSS
have formal legal definitions now, and we need to find out how we
can and want to fit in.&lt;/p&gt;
&lt;p&gt;Which again means we have to find out who makes that kind of decisions
for the project, both now and in the future.&lt;/p&gt;
&lt;p&gt;Many successful FOSS projects have spawned “Foundations” which are
typically tax-exempt benefical/charity corporations in some country
or other, but we have decided to not go there.  For one thing, none
of us want to take on such a task, but more importantly:  We’re are
less than impressed by how well that model seems to work in practice.&lt;/p&gt;
&lt;p&gt;We will instead form a voluntary association, a “Forening”, under
the laws of Denmark, with bylaws that set out what the goal is
(develop, maintain and distribute the software), who gets to make
the decisions (a governing board appointed by the members), who can
become members (anybody but subject to approval by the members) and
that the association cannot ever hold or handle any money.&lt;/p&gt;
&lt;p&gt;The commented bylaws of the association will be ratified by the
founders and made public this autumn, and the first general assembly
will be on Monday February 23rd 2026 - hopefully with many membership
applications to approve - more about that when we publish the bylaws.&lt;/p&gt;
&lt;p&gt;We will also, at the same time, reluctantly change the name of the project.&lt;/p&gt;
&lt;p&gt;The Varnish Cache FOSS software was initiated and sponsored by the
Norvegian newspaper Verdens Gang.  They hired a company called
“Linpro” to handle the logistics and me to write the code.&lt;/p&gt;
&lt;p&gt;From Linpro grew the company Varnish Software, and if anybody had,
they had earned the right to use “Varnish” in their name commercially.&lt;/p&gt;
&lt;p&gt;I was deeply worried about the potential for confusion and line
drawing issues between the commercial entity and the FOSS project,
and as Varnish Software have grown to become a huge international
company, those worries materialized.&lt;/p&gt;
&lt;p&gt;I thought I had an verbal agreement with them, that “Varnish Cache”
was the FOSS project and “Varnish Software” was the commercial
entity, but the current position of Varnish Software’s IP-lawyers
is that nobody can use “Varnish Cache” in any context, without their
explicit permission.&lt;/p&gt;
&lt;p&gt;The need to get permission from Varnish Software to use our own
name has already caused some potential contributors and supporters
from engaging with the FOSS project.&lt;/p&gt;
&lt;p&gt;We have tried to negotiatiate with Varnish Software for many months
about this issue, but their IP-Lawyers still insist that Varnish
Software owns the Varnish Cache name, and at most we have being
offered a strictly limited, subject to their veto, permission
for the FOSS project to use the “Varnish Cache” name.&lt;/p&gt;
&lt;p&gt;We cannot live with that:  We are independent FOSS project with our own name.&lt;/p&gt;
&lt;p&gt;So we will change the name of the project.&lt;/p&gt;
&lt;p&gt;The new association and the new project will be named “The Vinyl
Cache Project”, and this release 8.0.0, will be the last under the
“Varnish Cache” name.  The next release, in March will be under the
new name, and will include compatibility scripts, to make the
transition as smooth as possible for everybody.&lt;/p&gt;
&lt;p&gt;I want to make it absolutely clear that this is 100% a mess of my
making:  I should have insisted on a firm written agreement about
the name sharing, but I did not.&lt;/p&gt;
&lt;p&gt;I will also state for the record, that there are no hard feelings
between Varnish Software and the FOSS project.&lt;/p&gt;
&lt;p&gt;Varnish Software has always been, and still is, an important and
valued contributor to the FOSS project, but sometimes even friends
can make a mess of a situation.&lt;/p&gt;
&lt;p&gt;On behalf of the Varnish Cache Project,&lt;/p&gt;
&lt;p&gt;Poul-Henning Kamp&lt;/p&gt;
&lt;/section&gt;
</content><link href="https://vinyl-cache.org//organization/20-years.html"/><published>2025-09-15T00:00:00+00:00</published></entry></feed>