<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>tooling — farre's blog</title>
    <link>https://blog.farre.se/tags/tooling</link>
    <description>Posts tagged "tooling" on farre's blog</description>
    <atom:link href="https://blog.farre.se/rss/tooling.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Tracing algorithms through web specifications</title>
      <link>https://blog.farre.se/posts/2026/08/17/tracing-web-specs/</link>
      <guid isPermaLink="true">https://blog.farre.se/posts/2026/08/17/tracing-web-specs/</guid>
      <pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate>
      <description>&lt;p&gt;A bug comes in, or someone shows me a page doing something surprising, and the question is always the same one. Is that what the spec says? Not what we all assume it says, and not what Gecko happens to do, but what the algorithm actually does when you follow it step by step. So I open &lt;a href=&quot;https://html.spec.whatwg.org/&quot;&gt;html.spec.whatwg.org&lt;/a&gt;, find the entry point, and start reading. Twenty tabs later I have usually lost the thread.&lt;/p&gt;

&lt;!-- more --&gt;

&lt;p&gt;This isn’t an occasional chore. I do it when I’m implementing something new, when I’m working out whether a Gecko bug is a bug in Gecko or a bug in the spec, when I’m reviewing a spec change someone else has proposed, and when I’m trying to design something that has to fit alongside everything that already exists. Four fairly different jobs, and every one of them comes down to the same mechanical work. Start at an algorithm, follow the calls, keep track of where you’ve been.&lt;/p&gt;

&lt;p&gt;The specs are built for exactly this, in principle. Every step that invokes another algorithm is a hyperlink, and the whole thing is one large call graph spread across HTML, DOM, Fetch, URL and Infra. The trouble is that walking that graph by hand is slow, and it’s the kind of slow a machine should be doing on your behalf.&lt;/p&gt;

&lt;p&gt;Two tools have changed how I do this. One answers questions about the graph, and the other helps me walk it. If you’d rather install them first and read afterwards, &lt;a href=&quot;#getting-them&quot;&gt;they’re both at the end&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;webspec-index-trace&quot;&gt;webspec-index trace&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/jnjaeschke/webspec-index&quot;&gt;webspec-index&lt;/a&gt; is &lt;a href=&quot;https://github.com/jnjaeschke/&quot;&gt;Jan Jaeschke&lt;/a&gt;’s tool for querying web specifications from the command line. It indexes the specs, on demand as it needs them, and lets you ask about definitions, references and IDL. In August it gained a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace&lt;/code&gt; subcommand, and that’s the one I keep reaching for.&lt;/p&gt;

&lt;p&gt;You give it two anchors and it finds the routes between them. It answers in JSON by default, which is the right choice for feeding it into something else but not for reading, so add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--format markdown&lt;/code&gt; when the audience is you. Say I want to know how a navigation can end up firing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigateerror&lt;/code&gt;:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;webspec-index trace HTML#navigate HTML#event-navigateerror &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    --format markdown&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;# trace: `HTML#navigate` -&amp;gt; `HTML#event-navigateerror`

Max depth 6, kind `step`. Found 11 trace(s).

## Trace 1 (5 hop(s))

1) [`HTML#navigate` step 20](…#beginning-navigation:set-the-ongoing-navigation)
   calls `HTML#set-the-ongoing-navigation`
   &amp;gt; Set the ongoing navigation for navigable to navigationId.

2) [`HTML#set-the-ongoing-navigation` step 2](…#aborting-navigation:inform-the-…)
   calls `HTML#inform-the-navigation-api-about-aborting-navigation`
   &amp;gt; Inform the navigation API about aborting navigation given navigable.

3) [`HTML#inform-the-navigation-api-…` step 3.1](…#ongoing-navigation-tracking:…)
   calls `HTML#abort-the-ongoing-navigation`
   - under: While navigation&apos;s ongoing navigate event is not null:
   &amp;gt; Abort the ongoing navigation given navigation.

4) [`HTML#abort-the-ongoing-navigation` step 7](…#ongoing-navigation-tracking:…)
   calls `HTML#abort-a-navigateevent`
   &amp;gt; Abort event given error.

5) `HTML#abort-a-navigateevent` step 6 calls `HTML#event-navigateerror`
   &amp;gt; Fire an event named navigateerror at navigation using ErrorEvent, with
     additional attributes initialized according to errorInfo.&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;I’ve wrapped those lines and shortened the URLs to fit; in the real output each hop is one long line and every link is a full deep link to that exact call site.&lt;/p&gt;

&lt;p&gt;Every hop names the exact step number, quotes the step text, and tells you the condition it sits under. That last part matters more than it looks. Step 3.1 only runs while the ongoing navigate event is non-null, and knowing that is the difference between a path that exists on paper and a path your case actually took.&lt;/p&gt;

&lt;p&gt;Eleven routes, though&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot; role=&quot;doc-noteref&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Reading eleven of these back to back is not much better than the twenty tabs.&lt;/p&gt;

&lt;h2 id=&quot;three-zoom-levels&quot;&gt;Three zoom levels&lt;/h2&gt;

&lt;p&gt;This is where &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webspec-index trace&lt;/code&gt; gets genuinely nice, and it’s the part I want to draw attention to, because it’s easy to miss in the help text. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--detail&lt;/code&gt; flag changes how much of each route you get, and the three levels turn out to be three different ways of working rather than just three verbosity settings.&lt;/p&gt;

&lt;p&gt;Ask the same question again with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--detail edges&lt;/code&gt; and the prose falls away, leaving the skeleton:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;webspec-index trace HTML#navigate HTML#event-navigateerror &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    --detail edges --format markdown&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;# trace: `HTML#navigate` -&amp;gt; `HTML#event-navigateerror`

Max depth 6, kind `step`. Found 11 trace(s).

## Trace 1 (5 hop(s))

1) `HTML#navigate` step 20 calls `HTML#set-the-ongoing-navigation`

2) `HTML#set-the-ongoing-navigation` step 2 calls `HTML#inform-the-navigation-api-about-aborting-navigation`

3) `HTML#inform-the-navigation-api-about-aborting-navigation` step 3.1 calls `HTML#abort-the-ongoing-navigation`

4) `HTML#abort-the-ongoing-navigation` step 7 calls `HTML#abort-a-navigateevent`

5) `HTML#abort-a-navigateevent` step 6 calls `HTML#event-navigateerror`

## Trace 2 (5 hop(s))

1) `HTML#navigate` step 22.4 calls `HTML#fire-a-push/replace/reload-navigate-event`

2) `HTML#fire-a-push/replace/reload-navigate-event` step 2 calls `HTML#inform-the-navigation-api-about-aborting-navigation`

...&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Now you can read all eleven at once, and a shape appears that I could not see in the verbose output at all. There are five places inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigate&lt;/code&gt; where a route starts:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;step&lt;/th&gt;
      &lt;th style=&quot;text-align: left&quot;&gt;calls&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;15.1&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#navigate-fragid&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;20&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#set-the-ongoing-navigation&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;21.1&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#navigate-to-a-javascript:-url&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;22.4&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#fire-a-push/replace/reload-navigate-event&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;24.1&lt;/td&gt;
      &lt;td style=&quot;text-align: left&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#checking-if-unloading-is-canceled&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;And all eleven finish on the same line:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;`HTML#abort-a-navigateevent` step 6 calls `HTML#event-navigateerror`&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;There are exactly two ways into that step, from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#abort-the-ongoing-navigation&lt;/code&gt; step 7 and from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#process-navigate-event-handler-failure&lt;/code&gt; step 5. Eleven routes exist because three of the five entry points re-enter the same navigate event firing machinery from different directions, not because there are eleven genuinely different things going on.&lt;/p&gt;

&lt;p&gt;That’s a useful thing to know before you start debugging. If a navigation is firing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigateerror&lt;/code&gt; and you want to find out why, you don’t instrument eleven places. You instrument the one step they all pass through and work backwards from there.&lt;/p&gt;

&lt;p&gt;So the way I use it now is to start at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--detail edges&lt;/code&gt; to find the shape, then drop back to the default once I know which route I care about and want to read the reasoning. The third level, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--detail compact&lt;/code&gt;, drops the prose but keeps every anchor as a deep link to the exact call site, which is the form you want when you’re pasting a route into a bug report for someone else to follow.&lt;/p&gt;

&lt;h2 id=&quot;webspec-tracer&quot;&gt;WebSpec Tracer&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webspec-index trace&lt;/code&gt; answers a specific kind of question, and it’s worth being precise about which kind. You have to know both ends. That’s fine when you’re asking whether one thing can reach another, but a lot of the time I only know where I’m standing. I have a starting point, a bug in front of me, and no idea yet where the algorithm goes.&lt;/p&gt;

&lt;p&gt;There’s also something &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webspec-index trace&lt;/code&gt; can’t do for you in principle. It finds routes through the spec text, statically. It doesn’t know which branch your case took, because that depends on what actually happened at runtime, and only you have that information.&lt;/p&gt;

&lt;p&gt;So I wrote &lt;a href=&quot;https://github.com/farre/webspec-tracer&quot;&gt;WebSpec Tracer&lt;/a&gt;, a Firefox extension that walks the specs with you rather than ahead of you. You give it a starting anchor and it shows you that algorithm with every linked term highlighted. Click one and it becomes the next hop in the trace, and the panel moves you into it. Click the wrong one and Back undoes it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2026-08-17-tracing-web-specs/branch-point.png&quot; alt=&quot;The WebSpec Tracer sidebar showing the navigate algorithm, with the linked terms in each step highlighted, next to a GitHub issue form containing the trace so far as markdown&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The screenshot is a walk that started at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;location.assign&lt;/code&gt; and has arrived inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;navigate&lt;/code&gt;. Step 15 is the interesting one. It runs only if four things are all true, that there’s no document resource, no response, the URL matches the current entry’s URL ignoring fragments, and the fragment is non-null. If all four hold, it navigates to a fragment and returns. Otherwise the algorithm keeps going into the full navigation path below.&lt;/p&gt;

&lt;p&gt;No tool can decide that for me. Whether my bug went left or right at step 15 depends on the page and on what the user did. But the extension puts the decision in front of me with the alternatives visible, which is precisely what I was failing to do for myself with twenty tabs open.&lt;/p&gt;

&lt;p&gt;The trace builds up in the panel underneath as markdown, with every anchor pointing at the exact call site. That box is a display rather than a text field, so there are buttons for getting the trace out of it. Copy does what you’d expect. Insert is the one I actually use, and it’s the reason the extension lives in the sidebar: it writes the markdown straight into whichever field you have focused on the page, so you can have a spec issue open next to the panel and drop the trace into it without going near the clipboard. Reset clears everything and starts over.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2026-08-17-tracing-web-specs/branch-preview.png&quot; alt=&quot;The same panel, with the GitHub issue switched to the Preview tab, showing the two hops rendered as linked spec anchors&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Switch the issue over to Preview and there are the same two hops, rendered, each one a link into the spec. That’s most of the reason I built the thing. Explaining a route through an algorithm in prose is miserable, and the version you retype by hand is always slightly wrong. This way what I hand over is exactly what I walked.&lt;/p&gt;

&lt;p&gt;One more thing worth knowing, about the anchors themselves. The starting one has to say which spec it’s in, so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#dom-location-assign&lt;/code&gt; rather than just &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dom-location-assign&lt;/code&gt;, but after that the extension works it out as it goes. Anything that turns up in the trace without a prefix is in the spec you started from, and a prefix appears when the trace crosses a boundary:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2026-08-17-tracing-web-specs/cross-spec.png&quot; alt=&quot;The panel showing WebIDL&apos;s wait for all algorithm, with a six hop trace whose last line ends in WEBIDL#wait-for-all&quot; /&gt;&lt;/p&gt;

&lt;p&gt;That’s the same walk carried a few hops further. Hop 3 is that step 15 decision, taken, and the last line is &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WEBIDL#wait-for-all&lt;/code&gt;. Somewhere in the navigate event firing the trace left HTML entirely, and the prefix is the only thing that tells me so. The panel on the left has stopped showing me HTML too, and is now sitting in WebIDL. That’s easy to lose track of when you’re clicking through by hand, and it’s usually the moment a question stops being about HTML and starts being about something else.&lt;/p&gt;

&lt;h2 id=&quot;when-one-call-happens-twelve-times&quot;&gt;When one call happens twelve times&lt;/h2&gt;

&lt;p&gt;Sometimes an algorithm invokes another one from many different places, and a trace has to say something sensible about that. This was in the design from the start, and the answer it arrived at is to do what the spec already does. Start at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#update-the-image-data&lt;/code&gt; and follow it to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#abort-the-image-request&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2026-08-17-tracing-web-specs/multi-branch.png&quot; alt=&quot;The panel showing the abort the image request algorithm, with a single trace line listing twelve numbered call sites&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#abort-the-image-request&lt;/code&gt; is invoked from twelve separate places inside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;HTML#update-the-image-data&lt;/code&gt;. The extension doesn’t make me choose one, and it doesn’t flatten them into a single link either. It records the hop once and hangs all twelve call sites off it as numbered links, so the line reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#update-the-image-data calls #abort-the-image-request, [2], [3]&lt;/code&gt; and onwards to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[12]&lt;/code&gt;, each number pointing at its own anchor.&lt;/p&gt;

&lt;p&gt;The numbering isn’t invented. It’s the spec’s own scheme for repeated references: the anchors run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#abort-the-image-request&lt;/code&gt;, then &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-2&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-3&lt;/code&gt;, and so on up to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-12&lt;/code&gt;. All the trace does is carry that through, so a hop in the output identifies call sites the same way the spec identifies them, and the numbers mean the same thing in both places.&lt;/p&gt;

&lt;p&gt;That also keeps the trace honest. The hop happened, and that’s true whichever of the twelve fired, but the fact that there are twelve is worth knowing on its own, and anyone reading can go and check any one of them. Writing this out by hand you would link the first and lose the other eleven without ever noticing. The same thing is visible in the previous screenshot, where hop 3 reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#navigate calls #navigate-fragid, [2], [3]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webspec-index trace&lt;/code&gt; deals with the same situation the other way round. Ask it the same question and you get twelve separate one hop traces, each naming its own step number, step 2, then 7.4.2, then 11.1, and so on down the algorithm. Neither is wrong. The command line is telling you which steps, and the extension is keeping your trace to one line while preserving every place it could have come from.&lt;/p&gt;

&lt;h2 id=&quot;which-one-when&quot;&gt;Which one, when&lt;/h2&gt;

&lt;p&gt;They divide up cleanly enough that I don’t think about it much any more. If I know both ends and want to know what’s between them, or how many different routes there are, that’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webspec-index trace&lt;/code&gt;. If I know where I’m starting and want to find out where it goes, that’s the extension.&lt;/p&gt;

&lt;p&gt;The one I underused at first was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--detail edges&lt;/code&gt;. Asking a broad question and then zooming out far enough to see the answer’s shape is a different move from following a single path carefully, and it’s the one that has surprised me most often, usually by showing me that several things I thought were separate all funnel through the same step.&lt;/p&gt;

&lt;h2 id=&quot;getting-them&quot;&gt;Getting them&lt;/h2&gt;

&lt;p&gt;webspec-index is on crates.io:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;cargo binstall webspec-index&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;It builds its index as it goes, so the first trace into a corner you haven’t visited before pauses briefly to fetch and index the specs the route touches. After that it’s fast.&lt;/p&gt;

&lt;p&gt;WebSpec Tracer is on &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/webspec-tracer/&quot;&gt;addons.mozilla.org&lt;/a&gt;, and the source is on &lt;a href=&quot;https://github.com/farre/webspec-tracer&quot;&gt;GitHub&lt;/a&gt;. It lives in the sidebar, toggled with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Ctrl+Shift+U&lt;/code&gt;, so you can keep it open next to whatever you’re reading.&lt;/p&gt;

&lt;p&gt;Both are worth a try if you spend any time at all reading specs, whether you’re implementing them, arguing with them, or just trying to find out whether the browser is wrong or you are.&lt;/p&gt;

&lt;h4 id=&quot;notes&quot;&gt;Notes&lt;/h4&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Eleven is what you get at the default maximum depth of six hops. Raise it and there are more. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;

&lt;script src=&quot;https://utteranc.es/client.js&quot; repo=&quot;farre/blog&quot; issue-term=&quot;og:title&quot; label=&quot;comments&quot; theme=&quot;github-light&quot; crossorigin=&quot;anonymous&quot; async=&quot;&quot;&gt;
&lt;/script&gt;

</description>
    </item>
    
  </channel>
</rss>
