<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.protoconf.dev/blog</id>
    <title>protoconf Blog</title>
    <updated>2026-09-03T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.protoconf.dev/blog"/>
    <subtitle>protoconf Blog</subtitle>
    <icon>https://www.protoconf.dev/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Protoconf v0.2.0]]></title>
        <id>https://www.protoconf.dev/blog/protoconf-0-2-0</id>
        <link href="https://www.protoconf.dev/blog/protoconf-0-2-0"/>
        <updated>2026-09-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Protoconf v0.2.0 is out — the first feature release since v0.1.7. It brings]]></summary>
        <content type="html"><![CDATA[<p>Protoconf v0.2.0 is out — the first feature release since v0.1.7. It brings
remote proto modules, staged rollouts, a Kubernetes ConfigMaps backend, one-shot
config reads over gRPC and plain HTTP, opt-in OpenTelemetry, a formatter, and a
single consistent configuration story across every command.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-modules">Remote modules<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#remote-modules" class="hash-link" aria-label="Direct link to Remote modules" title="Direct link to Remote modules" translate="no">​</a></h2>
<p>Configuration repositories can now depend on protos and Starlark that live
somewhere else. Declare the dependency in a <code>CONFIGSPACE</code> file, pin it to a tag,
branch, commit or checksum, and let <code>protoconf mod tidy</code> resolve it into
<code>protoconf.lock</code> and a local cache:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">platform_protos </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> remote_repo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"github.com/acme/platform-protos"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    tag </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1.4.0"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">load</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"@platform_protos//platform/v1/service.proto"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Service"</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>The lock file is what makes a compile reproducible — commit it next to your
configs. <a class="" href="https://www.protoconf.dev/docs/0.2.0/advanced-usage/modules">Remote Modules →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="staged-rollouts">Staged rollouts<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#staged-rollouts" class="hash-link" aria-label="Direct link to Staged rollouts" title="Direct link to Staged rollouts" translate="no">​</a></h2>
<p>A configuration change is a deploy, and v0.2.0 lets you treat it like one. Wrap
a config in a <code>ConfigRollout</code> and it reaches a canary channel first, then a
percentage of your fleet, with a cooldown between each stage:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> ConfigRollout</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        value </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ServerConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">max_connections </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        default_cooldown_time </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Duration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">seconds </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">300</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        stages </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></div><div class="token-line" style="color:#393A34"><span class="token plain">            RolloutStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">channel </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"canary"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            RolloutStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">percentile </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            RolloutStage</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">percentile </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div 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></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Agents started with <code>-enable-rollout</code> pick the first stage they match, hashing
their own identity so the same host lands in the same bucket every time.
Interrupting <code>protoconf insert</code> mid-rollout clears the plan and returns every
agent to the stable config. <a class="" href="https://www.protoconf.dev/docs/0.2.0/production/rollouts">Staged Rollouts →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kubernetes-configmaps">Kubernetes ConfigMaps<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#kubernetes-configmaps" class="hash-link" aria-label="Direct link to Kubernetes ConfigMaps" title="Direct link to Kubernetes ConfigMaps" translate="no">​</a></h2>
<p><code>configmaps</code> is a new key-value backend for both the agent and the inserter, so
a cluster can distribute protoconf configs without running Consul, etcd or
ZooKeeper alongside it:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">protoconf agent -store configmaps -namespace protoconf</span><br></div></code></pre></div></div>
<p><a class="" href="https://www.protoconf.dev/docs/0.2.0/production/kubernetes">Running on Kubernetes →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-shot-reads-including-over-http">One-shot reads, including over HTTP<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#one-shot-reads-including-over-http" class="hash-link" aria-label="Direct link to One-shot reads, including over HTTP" title="Direct link to One-shot reads, including over HTTP" translate="no">​</a></h2>
<p>Not every consumer is a long-running service. <code>GetConfig</code> is the unary
counterpart to <code>SubscribeForConfig</code>, for jobs, scripts and init containers. The
agent also transcodes it onto its admin HTTP listener, so anything that can make
an HTTP request can read a config:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">curl http://localhost:4380/v1/config/myproject/server_config</span><br></div></code></pre></div></div>
<p><a class="" href="https://www.protoconf.dev/docs/0.2.0/consume-config-updates#one-shot-reads">Consuming Configuration Updates →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="telemetry-you-opt-into">Telemetry you opt into<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#telemetry-you-opt-into" class="hash-link" aria-label="Direct link to Telemetry you opt into" title="Direct link to Telemetry you opt into" translate="no">​</a></h2>
<p>OpenTelemetry export is now off by default and enabled with <code>-enable-otel</code>. An
agent that is not asked to export traces installs no-op providers and contacts
nothing. Prometheus metrics stay where they were, on <code>/metrics</code>, no flag
required. <a class="" href="https://www.protoconf.dev/docs/0.2.0/production/observability">Observability →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="protoconf-fmt"><code>protoconf fmt</code><a href="https://www.protoconf.dev/blog/protoconf-0-2-0#protoconf-fmt" class="hash-link" aria-label="Direct link to protoconf-fmt" title="Direct link to protoconf-fmt" translate="no">​</a></h2>
<p>One canonical layout for <code>.pconf</code>, <code>.mpconf</code>, <code>.pinc</code>, <code>.proto-validator</code> and
<code>.star</code> files, and a <code>-l</code> mode to fail CI when something is unformatted:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">protoconf fmt -w .</span><br></div></code></pre></div></div>
<p><a class="" href="https://www.protoconf.dev/docs/0.2.0/advanced-usage/formatting">Formatting →</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-things-to-check-when-upgrading">Two things to check when upgrading<a href="https://www.protoconf.dev/blog/protoconf-0-2-0#two-things-to-check-when-upgrading" class="hash-link" aria-label="Direct link to Two things to check when upgrading" title="Direct link to Two things to check when upgrading" translate="no">​</a></h2>
<p><strong>Configuration precedence.</strong> Every command now resolves configuration as
<code>flags &gt; environment variables &gt; config file &gt; proto defaults</code>. <code>protoconf agent</code> used to let a config file override <code>PROTOCONF_AGENT_*</code> environment
variables; it no longer does. With repeated <code>-config-file</code> flags, the later file
now wins.</p>
<p><strong>Telemetry is off by default.</strong> An agent that used to reach your collector
automatically needs <code>-enable-otel</code> now.</p>
<p>The full list is in
<a class="" href="https://www.protoconf.dev/docs/0.2.0/whats-new-0.2.0">What's New in v0.2.0</a>, and the complete changelog
is on the <a href="https://github.com/protoconf/protoconf/releases/tag/v0.2.0" target="_blank" rel="noopener noreferrer" class="">release page</a>.</p>
<p>As always, we're on <a href="https://discord.protoconf.sh/" target="_blank" rel="noopener noreferrer" class="">Discord</a> if you hit anything.</p>]]></content>
        <author>
            <name>Shahar Mintz</name>
            <uri>https://github.com/smintz</uri>
        </author>
        <category label="protoconf" term="protoconf"/>
        <category label="release" term="release"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introducing Our New Documentation Site]]></title>
        <id>https://www.protoconf.dev/blog/2023/05/16/new-site</id>
        <link href="https://www.protoconf.dev/blog/2023/05/16/new-site"/>
        <updated>2023-05-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Hello to all our amazing users,]]></summary>
        <content type="html"><![CDATA[<p>Hello to all our amazing users,</p>
<p>We are excited to announce the launch of our new documentation site! We've been hard at work behind the scenes to make it easier for you to find the information you need.</p>
<!-- -->
<p>The new site is more than just a fresh coat of paint. It's a fundamental rethinking of how we present information about our product. Our goal is to provide you with clear, concise, and complete information about how to use our services.</p>
<p>Here are some of the new features and improvements we've made:</p>
<p><strong>Improved Navigation:</strong> We've restructured our content to make it easier for you to find what you're looking for. Each page now has a clear title and description, so you can quickly scan to find the relevant content.</p>
<p><strong>Advanced Usage Guides:</strong> We've added in-depth guides for advanced usage, showing you how to take full advantage of our features. These guides provide step-by-step instructions and code examples in different languages.</p>
<p><strong>Better Code Examples:</strong> Our new documentation includes better, more comprehensive code examples. We've included examples in Go, Python, Node.js, Rust, and Java to help you understand how to use our APIs in your own projects.</p>
<p><strong>Thorough API Documentation:</strong> We've expanded our API documentation to cover all the features of our service. You'll find detailed descriptions of each API endpoint, along with request and response examples.</p>
<p>We hope you find this new documentation site helpful and easy to use. As always, we're here to help if you have any questions or feedback. Please don't hesitate to get in touch with us.</p>
<p>Happy coding!</p>
<p>Your protoconf Team</p>]]></content>
        <author>
            <name>Shahar Mintz</name>
            <uri>https://github.com/smintz</uri>
        </author>
        <category label="protoconf" term="protoconf"/>
        <category label="documentation" term="documentation"/>
    </entry>
</feed>