<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>human.json on foosel.net</title><link>https://foosel.net/tags/human.json/</link><description>Recent content in human.json on foosel.net</description><generator>Hugo</generator><language>en-us</language><copyright>Gina Häußge (foosel)</copyright><lastBuildDate>Fri, 20 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://foosel.net/tags/human.json/feed.xml" rel="self" type="application/rss+xml"/><item><title>TIL: How to automatically build a human.json file in Hugo</title><link>https://foosel.net/til/2026-03-20-how-to-automatically-build-a-humanjson-file-in-hugo/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://foosel.net/til/2026-03-20-how-to-automatically-build-a-humanjson-file-in-hugo/</guid><description>&lt;p&gt;As I mentioned the other day, I recently added a &lt;a href="https://foosel.net/til/humanjson/"&gt;human.json file&lt;/a&gt; to this site.&lt;/p&gt;
&lt;p&gt;However, it became a bit annoying adding new vouches to the json manually.&lt;/p&gt;
&lt;p&gt;So today I sat down and made it get created automatically during my page build powered by &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;, based on a list of vouches stored in a &lt;code&gt;vouches.yaml&lt;/code&gt; data file&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;For this I first created said data file in &lt;code&gt;data/vouches.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://food.foosel.net&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;date&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-03-14&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://chaos.social/@foosel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;date&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-03-14&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;- &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;https://octoprint.org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;date&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2026-03-14&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I created a new output format &lt;code&gt;humanjson&lt;/code&gt; in my &lt;code&gt;config.yaml&lt;/code&gt;, making sure to also add it to the home page:&lt;/p&gt;</description><content:encoded><![CDATA[<p>As I mentioned the other day, I recently added a <a href="https://foosel.net/til/humanjson/">human.json file</a> to this site.</p>
<p>However, it became a bit annoying adding new vouches to the json manually.</p>
<p>So today I sat down and made it get created automatically during my page build powered by <a href="https://gohugo.io">Hugo</a>, based on a list of vouches stored in a <code>vouches.yaml</code> data file<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>.</p>
<p>For this I first created said data file in <code>data/vouches.yaml</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>- <span style="color:#f92672">url</span>: <span style="color:#ae81ff">https://food.foosel.net</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">date</span>: <span style="color:#e6db74">&#34;2026-03-14&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">url</span>: <span style="color:#ae81ff">https://chaos.social/@foosel</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">date</span>: <span style="color:#e6db74">&#34;2026-03-14&#34;</span>
</span></span><span style="display:flex;"><span>- <span style="color:#f92672">url</span>: <span style="color:#ae81ff">https://octoprint.org</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">date</span>: <span style="color:#e6db74">&#34;2026-03-14&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ...</span>
</span></span></code></pre></div><p>Then I created a new output format <code>humanjson</code> in my <code>config.yaml</code>, making sure to also add it to the home page:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">outputs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">home</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">HTML</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">JSON</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">humanjson</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">outputFormats</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">humanjson</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">mediaType</span>: <span style="color:#ae81ff">application/json</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">baseName</span>: <span style="color:#ae81ff">human</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">isPlainText</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">notAlternative</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># ...</span>
</span></span></code></pre></div><p>Finally I created a template for that in  <code>_layout/home.humanjson.json</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-go-text-template" data-lang="go-text-template"><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    &#34;version&#34;: &#34;0.1.1&#34;,
</span></span><span style="display:flex;"><span>    &#34;url&#34;: <span style="color:#75715e">{{</span> <span style="color:#a6e22e">.Site.BaseURL</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">jsonify</span> <span style="color:#75715e">}}</span>,
</span></span><span style="display:flex;"><span>    &#34;vouches&#34;: [
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{-</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">$index</span><span style="color:#f92672">,</span> <span style="color:#a6e22e">$vouch</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">hugo</span><span style="color:#a6e22e">.Data.vouches</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{-</span> <span style="color:#66d9ef">with</span> <span style="color:#a6e22e">$vouch</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">{{-</span> <span style="color:#66d9ef">if</span> <span style="color:#a6e22e">$index</span> <span style="color:#75715e">}}</span>,<span style="color:#75715e">{{</span><span style="color:#66d9ef">end</span><span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            &#34;url&#34;: <span style="color:#75715e">{{</span> <span style="color:#a6e22e">.url</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">jsonify</span> <span style="color:#75715e">}}</span>,
</span></span><span style="display:flex;"><span>            &#34;vouched_at&#34;: <span style="color:#75715e">{{</span> <span style="color:#a6e22e">.date</span> <span style="color:#f92672">|</span> <span style="color:#a6e22e">jsonify</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{-</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">{{-</span> <span style="color:#66d9ef">end</span> <span style="color:#75715e">}}</span>
</span></span><span style="display:flex;"><span>    ]
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><p>I kept the required <code>&lt;link rel=&quot;/human.json&quot;&gt;</code> in my <code>layouts/partials/extend_head.html</code> file that gets included on <em>all</em> pages by my theme (contrary to how the linking of output formats work, which is why I went with <code>notAlternative: true</code> for that).</p>
<p>And to make it even easier to quickly add a new vouch, I also added a new task to my <a href="https://taskfile.dev">Taskfile</a>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>  <span style="color:#f92672">add-vouch</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">desc</span>: <span style="color:#ae81ff">Adds a new vouch to human.json.</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">vars</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">PAGE</span>: <span style="color:#e6db74">&#39;{{.CLI_ARGS}}&#39;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">FILE</span>: <span style="color:#e6db74">&#39;data/vouches.yaml&#39;</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">TODAY</span>: <span style="color:#e6db74">&#39;{{now | date &#34;2006-01-02&#34;}}&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cmds</span>:
</span></span><span style="display:flex;"><span>      - |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        cat &gt;&gt; {{.FILE}} &lt;&lt;EOF
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        - url: {{.PAGE}}
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          date: &#34;{{.TODAY}}&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        EOF</span>
</span></span></code></pre></div><p>Now, vouching for a page<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> is as easy as</p>
<pre tabindex="0"><code>task add-vouch -- https://example.com
</code></pre><div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Targeting Hugo 0.156.0+&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Even from my phone thanks to <a href="https://termux.dev/">Termux</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item><item><title>TIL: human.json</title><link>https://foosel.net/til/2026-03-15-humanjson/</link><pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate><guid>https://foosel.net/til/2026-03-15-humanjson/</guid><description>&lt;p&gt;Thanks to &lt;a href="https://mastodon.social/@sethmlarson/116229292847984092"&gt;a toot by Seth Larson&lt;/a&gt; yesterday I learned about the &lt;a href="https://codeberg.org/robida/human.json"&gt;still in draft &lt;code&gt;human.json&lt;/code&gt; spec&lt;/a&gt; by Beto Dealmeida:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;human.json&lt;/code&gt; is a lightweight protocol for humans to assert authorship of their site content and vouch for the humanity of others. It uses URL ownership as identity, and trust propagates through a crawlable web of vouches between sites.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically, a web of trust to confirm that pages are written by actual human beings vs just LLM generated slop.&lt;/p&gt;</description><content:encoded><![CDATA[<p>Thanks to <a href="https://mastodon.social/@sethmlarson/116229292847984092">a toot by Seth Larson</a> yesterday I learned about the <a href="https://codeberg.org/robida/human.json">still in draft <code>human.json</code> spec</a> by Beto Dealmeida:</p>
<blockquote>
<p><code>human.json</code> is a lightweight protocol for humans to assert authorship of their site content and vouch for the humanity of others. It uses URL ownership as identity, and trust propagates through a crawlable web of vouches between sites.</p>
</blockquote>
<p>Basically, a web of trust to confirm that pages are written by actual human beings vs just LLM generated slop.</p>
<p>That idea certainly clicked with me and so I quickly threw together a basic <a href="https://foosel.net/human.json"><code>human.json</code></a> in this page&rsquo;s <code>static</code> folder and linked to it from the <code>layouts/partials/extend_head.html</code> override file. That will get filled more over time 😊</p>
<p>And as reading through the spec of <code>human.json</code> also made me learn about the <a href="https://foosel.net/ai"><code>/ai</code> slashpage</a> I added that as well and linked it from the footer.</p>
<p>Those <a href="https://slashpages.net/">slashpages</a> are a fun idea I&rsquo;ll have to investigate further too!</p>
]]></content:encoded></item></channel></rss>