<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
    <channel>
      <title>viz.counter.ink</title>
      <link>https://viz.counter.ink</link>
      <description>Last 50 notes on viz.counter.ink</description>
      <generator>Quartz -- quartz.jzhao.xyz</generator>
      <item>
    <title>changelog</title>
    <link>https://viz.counter.ink/</link>
    <guid>https://viz.counter.ink/</guid>
    <description>&lt;script&gt;
  async function loadChangelog() {
    // Dynamically determine base path
    const basePath = window.location.pathname.replace(/\/[^/]*$/, &#039;&#039;);
    const changelogPath = basePath + &#039;/changelog.json&#039;;
    
    try {
      const response = await fetch(changelogPath);
      const entries = await response.json();
      
      const container = document.getElementById(&#039;changelog-entries&#039;);
      
      entries.forEach(entry =&gt; {
        const date = new Date(entry.updated);
        const dateStr = date.toLocaleDateString(&#039;en-US&#039;, { 
          year: &#039;numeric&#039;, 
          month: &#039;short&#039;, 
          day: &#039;numeric&#039; 
        });
        
        const type = entry.isNew ? &#039;[new]&#039; : &#039;[edit]&#039;;
        
        const div = document.createElement(&#039;div&#039;);
        div.className = &#039;changelog-entry&#039;;
        
        const link = document.createElement(&#039;a&#039;);
        link.href = basePath + &#039;/&#039; + entry.slug;
        link.className = &#039;changelog-title&#039;;
        link.textContent = entry.title;
        div.appendChild(link);
        
        const meta = document.createElement(&#039;div&#039;);
        meta.className = &#039;changelog-meta&#039;;
        
        const typeSpan = document.createElement(&#039;span&#039;);
        typeSpan.className = &#039;changelog-type&#039;;
        typeSpan.textContent = type;
        
        const createdSpan = document.createElement(&#039;span&#039;);
        createdSpan.textContent = `Created: ${entry.created ? new Date(entry.created).toLocaleDateString() : &#039;N/A&#039;}`;
        const updatedSpan = document.createElement(&#039;span&#039;);
        updatedSpan.textContent = `Updated: ${dateStr}`;
        const wordsSpan = document.createElement(&#039;span&#039;);
        wordsSpan.textContent = `${entry.wordCount} words`;
        
        meta.appendChild(typeSpan);
        meta.appendChild(createdSpan);
        meta.appendChild(updatedSpan);
        meta.appendChild(wordsSpan);
        div.appendChild(meta);
        
        if (entry.firstParagraph) {
          const preview = document.createElement(&#039;p&#039;);
          preview.className = &#039;changelog-preview&#039;;
          preview.textContent = entry.firstParagraph;
          div.appendChild(preview);
        }
        
        container.appendChild(div);
      });
    } catch (error) {
      console.error(&#039;Failed to load changelog:&#039;, error);
      document.getElementById(&#039;changelog-entries&#039;).innerHTML = &#039;&lt;p&gt;Failed to load changelog.&lt;/p&gt;&#039;;
    }
  }
  
  loadChangelog();
&lt;/script&gt;
&lt;style&gt;
  .changelog-entry {
    padding: 1rem;
    margin-bottom: 1rem;
    border-bottom: 1px solid var(--lightgray);
  }
  
  .changelog-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 0.5rem;
  }
  
  .changelog-title {
    font-size: 1.25rem;
    font-weight: bold;
    display: block;
    margin-bottom: 0.5rem;
  }
  
  .changelog-type {
    font-size: 0.875rem;
  }
  
  .changelog-meta {
    display: flex;
    gap: 1rem;
    font-size: 0.875rem;
    color: var(--gray);
    margin-bottom: 0.5rem;
  }
  
  .changelog-preview {
    font-size: 0.9rem;
    color: var(--darkgray);
  }
&lt;/style&gt;
&lt;h2 id=&quot;recent-changes&quot;&gt;Recent Changes&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#recent-changes&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div id=&quot;changelog-entries&quot;&gt;
  &lt;p&gt;Loading...&lt;/p&gt;
&lt;/div&gt;</description>
    <pubDate>Wed, 25 Feb 2026 21:45:23 GMT</pubDate>
  </item><item>
    <title>anecdata</title>
    <link>https://viz.counter.ink/2-main/2.1-anecdata/2.1-anecdata</link>
    <guid>https://viz.counter.ink/2-main/2.1-anecdata/2.1-anecdata</guid>
    <description></description>
    <pubDate>Wed, 25 Feb 2026 21:45:23 GMT</pubDate>
  </item><item>
    <title>isotype</title>
    <link>https://viz.counter.ink/2-main/2.2-isotype/2.2-isotype</link>
    <guid>https://viz.counter.ink/2-main/2.2-isotype/2.2-isotype</guid>
    <description></description>
    <pubDate>Wed, 25 Feb 2026 21:45:23 GMT</pubDate>
  </item><item>
    <title>introduction</title>
    <link>https://viz.counter.ink/1-front-matter/1.2-introduction</link>
    <guid>https://viz.counter.ink/1-front-matter/1.2-introduction</guid>
    <description>&lt;p&gt;test test test test test test test&lt;/p&gt;</description>
    <pubDate>Tue, 24 Feb 2026 23:11:00 GMT</pubDate>
  </item><item>
    <title>index</title>
    <link>https://viz.counter.ink/3-back-matter/3.4-index</link>
    <guid>https://viz.counter.ink/3-back-matter/3.4-index</guid>
    <description></description>
    <pubDate>Tue, 24 Feb 2026 22:35:00 GMT</pubDate>
  </item><item>
    <title>acknowledgments</title>
    <link>https://viz.counter.ink/3-back-matter/3.3-acknowledgments</link>
    <guid>https://viz.counter.ink/3-back-matter/3.3-acknowledgments</guid>
    <description></description>
    <pubDate>Tue, 24 Feb 2026 22:33:00 GMT</pubDate>
  </item><item>
    <title>tags</title>
    <link>https://viz.counter.ink/1-front-matter/1.4-tags</link>
    <guid>https://viz.counter.ink/1-front-matter/1.4-tags</guid>
    <description>&lt;p&gt;test test test test test test test test test test test test test&lt;/p&gt;</description>
    <pubDate>Sun, 02 Feb 2025 13:50:00 GMT</pubDate>
  </item><item>
    <title>fields</title>
    <link>https://viz.counter.ink/2-main/2.4-fields/2.4-fields</link>
    <guid>https://viz.counter.ink/2-main/2.4-fields/2.4-fields</guid>
    <description>&lt;h1 id=&quot;hello&quot;&gt;hello&lt;a role=&quot;anchor&quot; aria-hidden tabindex=&quot;-1&quot; data-no-popover href=&quot;#hello&quot; class=&quot;internal&quot;&gt;&lt;svg width=&quot;18&quot; height=&quot;18&quot; viewBox=&quot;0 0 24 24&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot;&gt;&lt;path d=&quot;M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71&quot;&gt;&lt;/path&gt;&lt;path d=&quot;M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;/h1&gt;</description>
    <pubDate>Sat, 01 Feb 2025 11:02:00 GMT</pubDate>
  </item><item>
    <title>bodies</title>
    <link>https://viz.counter.ink/2-main/2.5-bodies/2.5-bodies</link>
    <guid>https://viz.counter.ink/2-main/2.5-bodies/2.5-bodies</guid>
    <description></description>
    <pubDate>Sat, 01 Feb 2025 11:02:00 GMT</pubDate>
  </item><item>
    <title>worlds</title>
    <link>https://viz.counter.ink/2-main/2.6-worlds/2.6-worlds</link>
    <guid>https://viz.counter.ink/2-main/2.6-worlds/2.6-worlds</guid>
    <description></description>
    <pubDate>Sat, 01 Feb 2025 11:02:00 GMT</pubDate>
  </item><item>
    <title>interiors</title>
    <link>https://viz.counter.ink/2-main/2.7-interiors/2.7-interiors</link>
    <guid>https://viz.counter.ink/2-main/2.7-interiors/2.7-interiors</guid>
    <description></description>
    <pubDate>Sat, 01 Feb 2025 11:02:00 GMT</pubDate>
  </item><item>
    <title>ends</title>
    <link>https://viz.counter.ink/2-main/2.8-ends/2.8-ends</link>
    <guid>https://viz.counter.ink/2-main/2.8-ends/2.8-ends</guid>
    <description></description>
    <pubDate>Sat, 01 Feb 2025 11:02:00 GMT</pubDate>
  </item><item>
    <title>about this project</title>
    <link>https://viz.counter.ink/1-front-matter/1.1-about</link>
    <guid>https://viz.counter.ink/1-front-matter/1.1-about</guid>
    <description></description>
    <pubDate>Mon, 20 Jan 2025 13:21:00 GMT</pubDate>
  </item><item>
    <title>sources, approaches, methods</title>
    <link>https://viz.counter.ink/1-front-matter/1.3-sources,-approaches,-methods</link>
    <guid>https://viz.counter.ink/1-front-matter/1.3-sources,-approaches,-methods</guid>
    <description>&lt;p&gt;test test test test test test test test test&lt;/p&gt;</description>
    <pubDate>Mon, 20 Jan 2025 13:21:00 GMT</pubDate>
  </item><item>
    <title>spaces</title>
    <link>https://viz.counter.ink/2-main/2.3-spaces/2.3-spaces</link>
    <guid>https://viz.counter.ink/2-main/2.3-spaces/2.3-spaces</guid>
    <description></description>
    <pubDate>Mon, 20 Jan 2025 13:21:00 GMT</pubDate>
  </item><item>
    <title>glossary</title>
    <link>https://viz.counter.ink/3-back-matter/3.1-glossary</link>
    <guid>https://viz.counter.ink/3-back-matter/3.1-glossary</guid>
    <description></description>
    <pubDate>Mon, 20 Jan 2025 13:21:00 GMT</pubDate>
  </item><item>
    <title>bibliography</title>
    <link>https://viz.counter.ink/3-back-matter/3.2-bibliography</link>
    <guid>https://viz.counter.ink/3-back-matter/3.2-bibliography</guid>
    <description></description>
    <pubDate>Mon, 20 Jan 2025 13:21:00 GMT</pubDate>
  </item>
    </channel>
  </rss>