<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Doe</title>
    <description>The latest articles on DEV Community by John Doe (@john_doe_9ee7a1434273bedf).</description>
    <link>https://dev.to/john_doe_9ee7a1434273bedf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3120142%2F26994b63-3260-4cca-aa0e-f4c480055617.jpg</url>
      <title>DEV Community: John Doe</title>
      <link>https://dev.to/john_doe_9ee7a1434273bedf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john_doe_9ee7a1434273bedf"/>
    <language>en</language>
    <item>
      <title>I’ve Built the Most Ergonomic Go Config Library</title>
      <dc:creator>John Doe</dc:creator>
      <pubDate>Sat, 03 May 2025 18:06:11 +0000</pubDate>
      <link>https://dev.to/john_doe_9ee7a1434273bedf/ive-built-the-most-ergonomic-go-config-library-44jb</link>
      <guid>https://dev.to/john_doe_9ee7a1434273bedf/ive-built-the-most-ergonomic-go-config-library-44jb</guid>
      <description>&lt;p&gt;Hey everyone! I just released &lt;strong&gt;&lt;a href="https://github.com/chaindead/zerocfg" rel="noopener noreferrer"&gt;zerocfg&lt;/a&gt;&lt;/strong&gt;, the Go config library I believe to be &lt;em&gt;the most ergonomic&lt;/em&gt; you can use. When I say “most ergonomic,” I mean it fixes long-standing pain points in the traditional Go config workflow. Let me walk you through the problems I encountered—and how zerocfg solves them.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Problems with the Standard Go Config Approach
&lt;/h3&gt;

&lt;p&gt;Most Go projects handle configuration roughly the same way—whether you use viper, env, confita, or another library:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define a &lt;code&gt;struct&lt;/code&gt;&lt;/strong&gt; for your config.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nest structs&lt;/strong&gt; for hierarchical settings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tag fields&lt;/strong&gt; with metadata (e.g. &lt;code&gt;yaml:"token"&lt;/code&gt;, &lt;code&gt;env:"TOKEN"&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write a &lt;code&gt;Parse&lt;/code&gt; function&lt;/strong&gt; somewhere to set defaults, read files/env/flags, and validate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sound familiar? Here’s what bugs me about that:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Boilerplate &amp;amp; Three Sources of Truth
&lt;/h4&gt;

&lt;p&gt;Every time you add a new option, you have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a field in a struct—plus a tag (and sometimes even a new nested struct).&lt;/li&gt;
&lt;li&gt;In another place, declare its default value.&lt;/li&gt;
&lt;li&gt;In yet another place, pass that value into your application code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When logically related lines of code live far apart, it’s a recipe for mistakes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Typos in tags&lt;/strong&gt; can silently break behavior, especially if defaults cover up the mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Renamed keys&lt;/strong&gt; that aren’t updated everywhere will blow up in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extra work to add an option&lt;/strong&gt; discourages developers—so many options go unexposed or hardcoded.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. Configuration Sprawl
&lt;/h4&gt;

&lt;p&gt;Over time, your config grows unmaintained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Unused options&lt;/strong&gt; that nobody pruned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing defaults&lt;/strong&gt; that nobody set.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both should be caught &lt;em&gt;automatically&lt;/em&gt; by a great config library.&lt;/p&gt;




&lt;h3&gt;
  
  
  Inspiration: The Simplicity of &lt;code&gt;flag&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The standard &lt;code&gt;flag&lt;/code&gt; package in Go gets it right for CLI flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dbHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"db_host"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"database host"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dbHost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One line per option&lt;/strong&gt;: key, default value, and description all in one place.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One &lt;code&gt;flag.Parse()&lt;/code&gt;&lt;/strong&gt; call in &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero boilerplate&lt;/strong&gt; beyond that.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why can’t we have that level of simplicity for YAML, ENV, and CLI configs? It turns out no existing library nails it—so I built zerocfg.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing &lt;strong&gt;zerocfg&lt;/strong&gt; — Config Without the Overhead
&lt;/h2&gt;

&lt;p&gt;Zerocfg brings the &lt;code&gt;flag&lt;/code&gt; package philosophy to YAML, ENV, and CLI sources, with extra sugar and flexibility.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quickstart Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;

    &lt;span class="n"&gt;zfg&lt;/span&gt; &lt;span class="s"&gt;"github.com/chaindead/zerocfg"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/chaindead/zerocfg/env"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/chaindead/zerocfg/yaml"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"config.path"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"path to config file"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Alias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"db.host"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"database host"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;          &lt;span class="c"&gt;// environment variables&lt;/span&gt;
        &lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;     &lt;span class="c"&gt;// YAML file (path comes from env or CLI)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Current configuration:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Show&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="c"&gt;// CMD: go run ./... -c config.yml&lt;/span&gt;
    &lt;span class="c"&gt;// OUTPUT:&lt;/span&gt;
    &lt;span class="c"&gt;//   Current configuration:&lt;/span&gt;
    &lt;span class="c"&gt;//     db.host = localhost  (database host)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What You Get Out of the Box
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single Source of Truth&lt;/strong&gt;
Each option lives on &lt;em&gt;one&lt;/em&gt; line: name, default, description, and any modifiers.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;   &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http.retries"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"number of HTTP retries"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pluggable &amp;amp; Prioritized Sources&lt;/strong&gt;
Combine any number of sources, in order of priority:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;   &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;highPriorityConfig&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lowPriorityConfig&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
   &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI flags are always included by default at highest priority.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Early Detection of Unknown Keys&lt;/strong&gt;
&lt;code&gt;zfg.Parse&lt;/code&gt; will error on unrecognized options:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;   &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;yaml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsUnknown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unknown options:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Self-Documenting Config&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Every option has a description string.&lt;/li&gt;
&lt;li&gt;Call &lt;code&gt;zfg.Show()&lt;/code&gt; to print a formatted config with descriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Option Modifiers&lt;/strong&gt;
Mark options as required, secret, give aliases, and more:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;   &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"db.password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"database password"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Secret&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;zfg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Required&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Easy Extensibility&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Custom sources&lt;/strong&gt;: implement a simple interface to load from anything (e.g., Consul, Vault).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom option types&lt;/strong&gt;: define your own &lt;code&gt;zfg.Type&lt;/code&gt; to parse special values.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why Bother?
&lt;/h3&gt;

&lt;p&gt;I know plenty of us are happy with viper or env—but every project I’ve touched suffered from boilerplate, sneaky typos, and config debt. &lt;a href="https://github.com/chaindead/zerocfg" rel="noopener noreferrer"&gt;Zerocfg&lt;/a&gt; is my attempt to bring clarity and simplicity back to configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give it a try&lt;/strong&gt;, critique it, suggest features, or even contribute! I’d love to hear your feedback and see zerocfg grow with the community.&lt;/p&gt;

&lt;p&gt;— Enjoy, and happy coding! 🚀&lt;/p&gt;

</description>
      <category>go</category>
    </item>
  </channel>
</rss>
