<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The Beman Project Blog</title>
        <link>https://bemanproject.org/blog</link>
        <description>The Beman Project Blog</description>
        <lastBuildDate>Mon, 15 Sep 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Reliable CI within a shared container infrastructure]]></title>
            <link>https://bemanproject.org/blog/beman-infra-containers</link>
            <guid>https://bemanproject.org/blog/beman-infra-containers</guid>
            <pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[intro]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="intro" src="https://bemanproject.org/assets/images/splash-61e67e6c117017022d9b378ad901137f.jpg" width="9504" height="6336" class="img_ev3q"></p>
<p>A challenge that comes up when creating a library or any other tool is setting up a reliable and consistent <a href="https://en.wikipedia.org/wiki/Continuous_integration" target="_blank" rel="noopener noreferrer">continuous integration</a> (CI) pipeline for running tests, checks and other tasks. For The Beman Project, it is especially important to have a consistent and reliable CI pipeline that can be used across the full gamut of library projects.</p>
<p>This is where <a href="https://github.com/bemanproject/infra-containers" target="_blank" rel="noopener noreferrer">bemanproject/infra-containers</a> comes in. In this post, we'll briefly examine:</p>
<ul>
<li>What is <code>bemanproject/infra-containers</code>?</li>
<li>How does it work?</li>
<li>How is it used?</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-it">What is it?<a href="https://bemanproject.org/blog/beman-infra-containers#what-is-it" class="hash-link" aria-label="Direct link to What is it?" title="Direct link to What is it?">​</a></h2>
<p>In short, <code>bemanproject/infra-containers</code> is a set of <a href="https://www.docker.com/" target="_blank" rel="noopener noreferrer">Docker</a> container images that can be reused in CI pipelines across the Beman library projects. These containers are automatically built and published to the GitHub package registry under the <a href="https://github.com/orgs/bemanproject/packages" target="_blank" rel="noopener noreferrer">bemanproject organization</a>. Why do this? There are several advantages:</p>
<ul>
<li>These images provide a standard set of tools that are "baked-in" images. There is no further configuration needed in GitHub Actions to get the necessary tooling installed and set up for a particular job.</li>
<li>This setup gives complete control of specific tools are installed in a particular image.</li>
<li>The images don't need to be rebuilt for each CI run. They are built once (when changes are made) and then published to a central repository.</li>
</ul>
<p>Additionally, this setup allows us to build containers that contain pre-release or forked versions of compilers and other tools that may not be available in standard package repositories. This is especially useful for testing upcoming C++ features that are not yet available in stable compiler releases. Currently images are built using the most recent stable versions of GCC and Clang, the most recent trunk builds of both compilers, as well as one for the <a href="https://github.com/bloomberg/clang-p2996" target="_blank" rel="noopener noreferrer">P2996 reflection fork</a> of Clang.</p>
<p>The <code>infra-containers</code> repository also builds <code>devcontainer</code> images which are used as online development environments via <a href="https://github.com/features/codespaces" target="_blank" rel="noopener noreferrer">GitHub Codespaces</a> for the Beman library projects.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-it-work">How does it work?<a href="https://bemanproject.org/blog/beman-infra-containers#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?">​</a></h2>
<p>When a change is made to the <code>Dockerfile</code> definitions in the <a href="https://github.com/bemanproject/infra-containers" target="_blank" rel="noopener noreferrer">infra-containers</a> repository, a series of GitHub Actions are started that build and publish the containers to the package registry, both for production and staging use. These actions additionally run weekly or they can be invoked manually if needed.</p>
<p>If you're not familiar with Docker or containers in general, this may seem like magic. To simplify things, you can think of these images as "virtual" operating systems that have been pre-configured with specific versions of certain tools. For <a href="https://www.gentoo.org/" target="_blank" rel="noopener noreferrer">fast turnaround, binary caching, and building compiler forks</a> the CI images are built on top of <a href="https://www.gentoo.org/" target="_blank" rel="noopener noreferrer">Gentoo Linux</a>. The devcontainer images are built on top of Ubuntu so that Microsoft's devcontainer images can be used as a base.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-is-it-used">How is it used?<a href="https://bemanproject.org/blog/beman-infra-containers#how-is-it-used" class="hash-link" aria-label="Direct link to How is it used?" title="Direct link to How is it used?">​</a></h2>
<p>The simplest way to understand how the infra-containers are used is to look at an example. We will use <a href="https://github.com/bemanproject/task" target="_blank" rel="noopener noreferrer">bemanproject/task</a> for this purpose as it runs tests with a large and diverse set of configurations. If we look at its <a href="https://github.com/bemanproject/task/blob/66da7a2c82f681c0ae1440bc4940626b2791eb9c/.github/workflows/ci_tests.yml#L35" target="_blank" rel="noopener noreferrer">CI GitHub actions workflow</a>, we can see a JSON object used to configure CI. Excerpted below is the Clang portion:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"clang"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"versions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"20"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"cxxversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"c++26"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token property" style="color:#36acaa">"stdlibs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"libstdc++"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"libc++"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"Debug.Default"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"Release.Default"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"Release.MaxSan"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"Debug.Werror"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"Debug.Dynamic"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"cxxversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"c++23"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c++20"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"stdlibs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"libstdc++"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"libc++"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Release.Default"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"versions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"19"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"18"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"cxxversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"c++26"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c++23"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c++20"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"stdlibs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"libstdc++"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"libc++"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Release.Default"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"versions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"17"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"cxxversions"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"c++26"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c++23"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c++20"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"stdlibs"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"libc++"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"tests"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"Release.Default"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>The structure of this configuration allows maintainers to easily produce CI matrices that test large combinations of compilers, standard libraries, and build configurations. The snippet above generates 29 individual CI jobs, each of which takes around 2 minutes to run individually. The compiler name and version specified here is used to determine which CI image to pull.</p>
<p>Hopefully this brief overview of <code>bemanproject/infra-containers</code> has given you a better understanding of why it's beneficial, how it works and how it's used. If you previously were not familiar with Docker, the GitHub package registry, or even the concept of containers, I hope this has inspired you to dig deeper into the topic to improve your own CI infrastructure at your company or for your personal projects.</p>
<p>Currently, seven beman projects use this <code>beman/infra-containers</code> as part of their GitHub Actions setup, including:</p>
<ul>
<li><a href="https://github.com/bemanproject/cache_latest" target="_blank" rel="noopener noreferrer">bemanproject/cache_latest</a></li>
<li><a href="https://github.com/bemanproject/execution" target="_blank" rel="noopener noreferrer">bemanproject/execution</a></li>
<li><a href="https://github.com/bemanproject/net" target="_blank" rel="noopener noreferrer">bemanproject/net</a></li>
<li><a href="https://github.com/bemanproject/scan_view" target="_blank" rel="noopener noreferrer">bemanproject/scan_view</a></li>
<li><a href="https://github.com/bemanproject/scope" target="_blank" rel="noopener noreferrer">bemanproject/scope</a></li>
<li><a href="https://github.com/bemanproject/task" target="_blank" rel="noopener noreferrer">bemanproject/task</a></li>
<li><a href="https://github.com/bemanproject/transform_view" target="_blank" rel="noopener noreferrer">bemanproject/transform_view</a></li>
</ul>
<p>If you're interested in contributing to The Beman Project, including adapting more Beman projects to use the <code>bemanproject/infra-containers</code> setup, please check out the <a href="https://github.com/bemanproject" target="_blank" rel="noopener noreferrer">Beman Project</a> on GitHub or <a href="https://discourse.bemanproject.org/latest" target="_blank" rel="noopener noreferrer">join us on Discourse</a> to get involved! Please also checkout the <a href="https://bemanproject.org/" target="_blank" rel="noopener noreferrer">official website</a> for more information on The Beman Project.</p>]]></content:encoded>
            <category>Beman</category>
            <category>Beman Infra</category>
        </item>
        <item>
            <title><![CDATA[Beman Sofia Hackathon]]></title>
            <link>https://bemanproject.org/blog/sofia-hackathon</link>
            <guid>https://bemanproject.org/blog/sofia-hackathon</guid>
            <pubDate>Sun, 06 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[intro]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="intro" src="https://bemanproject.org/assets/images/intro-v2-c384966db7c0c1c3f89f720ecd5efcf1.png" width="4000" height="3000" class="img_ev3q"></p>
<p>During the ISO WG21 C++ Meeting in <a href="https://wg21.link/N5004" target="_blank" rel="noopener noreferrer">Sofia, June 2025</a>, we hosted an in-person Beman - Evening Session — a mix of short presentations, a hands-on hackathon, and plenty of big ideas for the future of C++. What started as a relaxed gathering quickly turned into a productive (and caffeinated) brainstorming hub, where we explored potential C++29 library proposals, shared early-stage experiments, and even wrote code live. It was part workshop, part jam session, and fully in the spirit of what makes the C++ community so unique: collaboration, creativity, and a shared passion for pushing the language forward.</p>
<p>Since November 2024, we have been organizing Beman presentations at ISO WG21 C++ meetings (Warsaw 2024 - Poland, Hagenberg 2025 - Austria). Since we have been receiving positive feedback, we decided to organize another one in Sofia, June 2025 - Bulgaria. (Note that our next session will be at CppCon in September in Colorado - stay tuned for more details!)</p>
<p><img decoding="async" loading="lazy" alt="intro" src="https://bemanproject.org/assets/images/intro-v1-35ea2e02ec29c01ba071312a59d54dab.png" width="8160" height="4592" class="img_ev3q"></p>
<p>We had a great turnout, with 25 participants. The evening started with a great discussion about The Beman Project and where it is going, especially considering the C++26 is closed and the design cycle for C++29 is starting.</p>
<p>We presented our first <a href="https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#production-ready-api-may-undergo-changes" target="_blank" rel="noopener noreferrer">Production ready. API may undergo changes.</a> library, which is the <a href="https://github.com/bemanproject/optional" target="_blank" rel="noopener noreferrer">beman.optional</a> library, hoping to get it into the C++26 standard and become <a href="https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#production-ready-stable-api" target="_blank" rel="noopener noreferrer">Production ready. Stable API.</a>. We counted a total of 10 <a href="https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#production-ready-stable-api" target="_blank" rel="noopener noreferrer">Under development and not yet ready for production use.</a> Beman libraries.</p>
<p>We have continued the discussion around our set of guidelines for the Beman libraries, which are described in <a href="https://github.com/bemanproject/beman/blob/main/docs/beman_standard.md" target="_blank" rel="noopener noreferrer">The Beman Standard</a>. This strong set of rules is a great foundation for our libraries, and it helps the authors to create libraries that are easy to use, maintain, and extend by example, using our awesome <a href="https://github.com/bemanproject/exemplar" target="_blank" rel="noopener noreferrer">beman.exemplar</a> template library.</p>
<p>The second part of the evening was a hackathon with our latest tool <a href="https://github.com/bemanproject/infra/tree/main/tools/beman-tidy" target="_blank" rel="noopener noreferrer">beman-tidy: The Codebase Bemanification Tool</a>. For more context, the <code>beman-tidy</code> helps you to apply the Beman Standard to your codebase, at a later stage in the library development.</p>
<p>Since the <code>beman-tidy</code> framework was already ready to use, but still required some work to implement around 40-50 checks, we created the <a href="https://github.com/orgs/bemanproject/projects/8" target="_blank" rel="noopener noreferrer">beman-tidy Project on GitHub</a> to track the progress of the implementation and to split the work into smaller tasks.</p>
<p><img decoding="async" loading="lazy" alt="beman tidy board" src="https://bemanproject.org/assets/images/beman-tidy-board-d8f4ec7a433c56bf3cd8dc35942b654a.png" width="3456" height="1956" class="img_ev3q"></p>
<p>The implication during the hackathon was substantial, with 10 participants working on the <code>beman-tidy</code> framework, and more pushing PRs at a later point in time. The tool is not completed yet, so feel free to contribute (ping <a href="https://github.com/neatudarius" target="_blank" rel="noopener noreferrer">@neatudarius</a> on GitHub, which is the <code>beman-tidy</code> author).</p>
<p>We were very happy with the impact of that evening (Wednesday evening, in the middle of the ISO WG21 C++ Meeting), but surprises continued ...</p>
<p>After Friday's LEWG session, <a href="https://wg21.link/P3655R1" target="_blank" rel="noopener noreferrer">P3655R1: std::zstring_view</a> was presented and got feedback to continue the proposed direction. As an immediate consequence of this event, a new author created the <a href="https://github.com/bemanproject/cstring_view" target="_blank" rel="noopener noreferrer">beman.cstring_view</a> library, to pursue the C++29 proposal.</p>
<p>The cherry on the cake was the Saturday's plenary! Lots and lots of great news for Beman folks!</p>
<p>The proposals behind the <a href="https://github.com/bemanproject/task" target="_blank" rel="noopener noreferrer">beman.task</a>, <a href="https://github.com/bemanproject/execution" target="_blank" rel="noopener noreferrer">beman.execution</a> and <a href="https://github.com/bemanproject/net" target="_blank" rel="noopener noreferrer">beman.net</a> libraries got accepted in C++26, although significant work remains to make them production ready.</p>
<p>Previously, in Saint Louis June 2024, <a href="https://wg21.link/P3168R2" target="_blank" rel="noopener noreferrer">(P3168R2) Give std::optional Range Support</a> was accepted into the ISO C++ Working Draft, which is one of the two papers implemented in <a href="https://github.com/bemanproject/optional" target="_blank" rel="noopener noreferrer">beman.optional</a>. The missing piece was the <a href="https://wg21.link/P2988R12" target="_blank" rel="noopener noreferrer">(P2988R12) <code>std::optional&lt;T&amp;&gt;</code></a> paper, which was <strong>also</strong> accepted into the ISO C++ Working Draft. That makes <a href="https://github.com/bemanproject/optional" target="_blank" rel="noopener noreferrer">beman.optional</a> require just a little bit more work to get it <a href="https://github.com/bemanproject/beman/blob/main/docs/beman_library_maturity_model.md#production-ready-stable-api" target="_blank" rel="noopener noreferrer">Production ready. Stable API.</a>.</p>
<p>We couldn't be happier with the outcome of this event, and we are looking forward to the next one! Please check out the <a href="https://github.com/bemanproject" target="_blank" rel="noopener noreferrer">Beman Project</a> on GitHub or <a href="https://discourse.bemanproject.org/latest" target="_blank" rel="noopener noreferrer">join us on Discourse</a> to get involved!</p>]]></content:encoded>
            <category>Beman</category>
            <category>Hackathon</category>
            <category>Beman Tidy</category>
            <category>Sofia</category>
            <category>WG21</category>
            <category>C++26</category>
            <category>C++29</category>
        </item>
        <item>
            <title><![CDATA[NYC Hackathon]]></title>
            <link>https://bemanproject.org/blog/nyc-hackathon</link>
            <guid>https://bemanproject.org/blog/nyc-hackathon</guid>
            <pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[busy coding]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="busy coding" src="https://bemanproject.org/assets/images/hacking-5945c8c4c7e6f3bfb41d42196d483662.jpg" title="Several hackathon members busy coding. They give the impression of serious and intense work happening!" width="4000" height="3000" class="img_ev3q"></p>
<p>Adobe hosted an exciting and intense half-day Beman hackathon where we worked on
adding new Beman libraries, addressed infrastructure issues, and brainstormed
designs for the Beman website.</p>
<p>It was awesome to collaborate in person. Here's
some of the awesome stuff that got accomplished:</p>
<ul>
<li><strong>New Beman tagline: "Tomorrow's C++ Standard Libraries Today"</strong>. Thanks Nick
DeMarco for this great contribution!</li>
<li><strong>std::elide</strong> paper implementation from Robert Leahy, a first time
contributor!</li>
<li>Linus Boehm made some great progress creating a
<a href="https://github.com/bemanproject/indirect/pull/1" target="_blank" rel="noopener noreferrer"><strong>std::indirect/std::polymorphic</strong></a>
Beman library.</li>
<li>We had several discussions on the future of the
<a href="https://github.com/bemanproject/exemplar" target="_blank" rel="noopener noreferrer">exemplar</a> library.</li>
<li>River Wu identified <strong>root cause of an ASAN hanging issue</strong>.</li>
<li>Eddie Nolan and I sketched out a <a href="https://www.ednolan.com/mockup.html" target="_blank" rel="noopener noreferrer">rough
design</a> for the new website.</li>
</ul>
<p>Overall it was productive and a ton of fun. Thanks to Robert, Eddie, Linus,
River, Nick, Bret, and Robert for participating!</p>
<p><img decoding="async" loading="lazy" alt="portrait of attendees" src="https://bemanproject.org/assets/images/final-photo-407637652af7b6439137bab178736b99.jpg" title="All the hackathon folks standing together in a portrait looking very cool." width="4000" height="3000" class="img_ev3q"></p>]]></content:encoded>
            <category>Hackathon</category>
            <category>Beman</category>
        </item>
        <item>
            <title><![CDATA[Beman Project Introduction Online]]></title>
            <link>https://bemanproject.org/blog/beman-tutorial</link>
            <guid>https://bemanproject.org/blog/beman-tutorial</guid>
            <pubDate>Mon, 13 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[David Sankel’s talk on Beman at 2024 CppCon is now online!]]></description>
            <content:encoded><![CDATA[<p>David Sankel’s talk on Beman at 2024 CppCon is now online!
The presentation answers many questions about the project purpose and policies.</p>
<iframe src="https://www.youtube.com/embed/f4JinCpcQOg" style="width:100%;aspect-ratio:16/9;border:0" allowfullscreen=""></iframe>]]></content:encoded>
            <category>CppCon</category>
            <category>Conference</category>
        </item>
        <item>
            <title><![CDATA[About Beman]]></title>
            <link>https://bemanproject.org/blog/about-beman</link>
            <guid>https://bemanproject.org/blog/about-beman</guid>
            <pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A photo of Beman Dawes]]></description>
            <content:encoded><![CDATA[<p><img decoding="async" loading="lazy" alt="A photo of Beman Dawes" src="https://bemanproject.org/assets/images/beman-6694694642e14174e61829c7aae7c8c8.png" width="1920" height="1654" class="img_ev3q"></p>
<p>I met Beman Dawes when I attended my first C++ committee meeting in 1997. I wasn’t even a committee member at that time; I showed up at the meeting because I was trying to get exception safety into the C++ standard and Andrew Koenig had made it clear that arguing for it over email wasn’t going to cut it; I needed to show my face.</p>
<p>I didn’t know what to expect; I sat in one of the chairs at the edge of the room while the committee took seats at a big “U” of tables in the center. After some preliminary business, the meeting broke into Core and Library “working groups.” Since exception safety was mostly a library issue, I stayed with the library group, of which Beman was the chair.</p>
<p>Beman started by asking me to join the other members in the center of the room and filling me in on the job at hand: working through issues people had reported with the draft C++ standard. That was my first indication of the extraordinarily inclusive tone he set for these meetings. Everyone, and every idea, was treated with collegial respect, and the spirit of openness and contribution flowing from Beman had clearly “infected” the other participants. I cautiously made a few points, which were greeted with appreciation, where I thought I could contribute.</p>
<p>I left that meeting with the realization that it was possible to work together in a way I had never experienced in my regular job, driven by consensus, and that this spirit both raised the level of discourse, and produced better results, than what I had seen before. It put the lie to the disparaging phrase “designed by committee.” So when Beman proposed that we start the Boost Libraries project, I was immediately on board. His idea for Boost would blossom into a unique community of collaborative library designers because of the example he set.</p>
<p>As we grew Boost over the years, so grew our friendship, and when Beman passed away suddenly in 2020, it was a great loss to me personally, and, I think, to the world of programming. Beman never sought the spotlight, and I always wondered what would become of his contribution, which was surely underappreciated. That’s why I was so thrilled to hear that a modern C++ libraries project was being launched in his name. May it continue to demonstrate Beman’s commitment to community and excellence.</p>]]></content:encoded>
            <category>Beman</category>
        </item>
    </channel>
</rss>