<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>The Rustling of the Leaves</title>
  <link href="https://timecrowave.neocities.org"/>
  <link href="https://timecrowave.neocities.org/feed.xml" rel="self"/>
  <updated>2026-03-23T21:17:22.761Z</updated>
  <id>https://timecrowave.neocities.org/</id>
  <icon>https://timecrowave.neocities.org/favicon.svg</icon>
  <author>
    <name>Maarten Goudsmit</name>
  </author>
  <entry>
    <title>Photo</title>
    <link href="https://timecrowave.neocities.org/photo/2026-3-23-nothing-to-see-here/"/>
    <id>https://timecrowave.neocities.org/photo/2026-3-23-nothing-to-see-here/</id>
    <published>2026-03-23T21:17:22.761Z</published>
    <updated>2026-03-23T21:17:22.761Z</updated>
    <category term="photo"/>
    <content type="html">&lt;p&gt;nothing to see here&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Photo</title>
    <link href="https://timecrowave.neocities.org/photo/2026-3-15-day-2---when/"/>
    <id>https://timecrowave.neocities.org/photo/2026-3-15-day-2---when/</id>
    <published>2026-03-15T19:35:26.650Z</published>
    <updated>2026-03-15T19:37:22.498Z</updated>
    <category term="photo"/>
    <content type="html">&lt;p&gt;day 2 - when good boys go bad&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Photo</title>
    <link href="https://timecrowave.neocities.org/photo/2026-3-14-it-do-be-like/"/>
    <id>https://timecrowave.neocities.org/photo/2026-3-14-it-do-be-like/</id>
    <published>2026-03-14T14:02:22.875Z</published>
    <updated>2026-03-14T14:03:47.358Z</updated>
    <category term="photo"/>
    <content type="html">&lt;p&gt;it do be like that sometimes&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Sensational Typography Showcase Sites</title>
    <link href="https://timecrowave.neocities.org/note/2026-3-2-sensational-typography-showcase-sites/"/>
    <id>https://timecrowave.neocities.org/note/2026-3-2-sensational-typography-showcase-sites/</id>
    <published>2026-03-02T20:40:04.818Z</published>
    <updated>2026-03-02T21:08:15.666Z</updated>
    <category term="note"/>
    <category term="typography"/>
    <content type="html">&lt;p&gt;There&#39;s an art to showing off a typeface. A proper font showcase page sells, inspires and delights the reader. Here are some best-in-class web pages that do just that. &lt;em&gt;This is a living list, updated as I discover worthy new entries.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Fraunces by Undercase Type&lt;/h3&gt;
&lt;p&gt;The font I use as the header for this very site. Both stately and playful at the same time, it occupies a tidy mid-point between Cooper Black and Bookman Swash.&lt;/p&gt;
&lt;p&gt;🔗 &lt;a href=&#34;https://fraunces.undercase.xyz/&#34;&gt;fraunces.undercase.xyz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;/media/Fraunces.png&#34; alt=&#34;A screenshot from the Fraunces showcase page&#34;&gt;&lt;/p&gt;
&lt;h3&gt;Playwrite by Type Together&lt;/h3&gt;
&lt;p&gt;An effort by Type Together to document and preserve traditional handwriting styles taught in primary schools around the world. The project has resulted in a truly magnificent collection of typefaces. Moreover, &lt;a href=&#34;https://primarium.info/&#34;&gt;its website&lt;/a&gt; showcases the many documents used in the creation of the final artifacts.
&lt;img src=&#34;/media/Primarium.png&#34; alt=&#34;Curisve handwriting samples from Dutch textbooks&#34;&gt;&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Relative date filter in Eleventy</title>
    <link href="https://timecrowave.neocities.org/note/2026-2-23-relative-date-filter-in-eleventy/"/>
    <id>https://timecrowave.neocities.org/note/2026-2-23-relative-date-filter-in-eleventy/</id>
    <published>2026-02-23T16:16:35.098Z</published>
    <updated>2026-02-26T13:46:05.110Z</updated>
    <category term="note"/>
    <category term="eleventy"/>
    <category term="javascript"/>
    <content type="html">&lt;p&gt;For this new blog, I wanted to display the time since the post was published, e.g. “two days ago”. My CMS appends a &lt;code&gt;published&lt;/code&gt; and &lt;code&gt;updated&lt;/code&gt; date to each post automatically, indicating when it was originally published and when it was last updated. These are formatted like this: &lt;code&gt;2026-02-18T21:58:50.158Z&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I wanted to use the templating language support built into Eleventy to turn a hard-to-read date string into a &lt;em&gt;relative date&lt;/em&gt;, such as “5 days ago”. In Eleventy, you can set up custom filters that allow you to easily transform data, which is exactly what I&#39;m trying to do here. For example, let&#39;s say you are editing a page with a &lt;code&gt;title&lt;/code&gt; property of “About Me&amp;quot;. If you wanted to render this in uppercase, you would write &lt;code&gt;{{ title | upcase }}&lt;/code&gt; (in Liquid). Let&#39;s introduce a &lt;code&gt;relative_date&lt;/code&gt; filter.&lt;/p&gt;
&lt;p&gt;The first step is working out the logic that translates the time difference between &lt;code&gt;Date.now()&lt;/code&gt; and the timestamp attached to each post. I went with the following implementation:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;relativeDate&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; diff &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;input&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; Date&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; rel &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;Intl&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;RelativeTimeFormat&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;en&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token literal-property property&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;long&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token literal-property property&#34;&gt;numeric&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;auto&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Gives us &#34;yesterday&#34; instead of &#34;1 day ago&#34;, which I prefer&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; units &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;year&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;365&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;month&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;30&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Choosing to ignore that months have different durations in days&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;week&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;7&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;day&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;hour&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;minute&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;ms&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Find the largest time unit that exceeds the corresponding ms thresholds&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; unit&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; ms &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;
    units&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;find&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; ms &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; Math&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;diff&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;=&lt;/span&gt; ms&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;??&lt;/span&gt; units&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;at&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; rel&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;Math&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;round&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;diff &lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt; ms&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; unit&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This relies on the native JavaScript &lt;code&gt;Intl.RelativeTimeFormat&lt;/code&gt; API, which provides all this logic out of the box. It&#39;s amazing to have such a powerful API natively supported in the language, rather than having to use a library. It&#39;s good separation of concerns to have this code as a module that we can invoke in a few places (as will become clear later).&lt;/p&gt;
&lt;p&gt;Second, we want to ensure that this code is accessible within the templates of my blog.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; relativeDate &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;./scripts/relativeDate.js&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addFilter&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;relative_date&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;lt;span class=&#34;relative-date&#34; data-date=&#34;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;input&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;&gt;&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;relativeDate&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
      input&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code creates a filter &lt;code&gt;relative_date&lt;/code&gt; which wraps the input (the data) in a span element with a relevant class. I&#39;m also baking the publication date into a &lt;code&gt;data-*&lt;/code&gt; attribute, so it&#39;s easier to use in the next step.&lt;/p&gt;
&lt;p&gt;Combining these two steps, we now have what we need. Let&#39;s say we have a Markdown page with the following frontmatter.&lt;/p&gt;
&lt;pre class=&#34;language-markdown&#34;&gt;&lt;code class=&#34;language-markdown&#34;&gt;&lt;span class=&#34;token front-matter-block&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;---&lt;/span&gt;
&lt;span class=&#34;token front-matter yaml language-yaml&#34;&gt;title: Relative date filter in Eleventy
tags:
  - eleventy
  - javascript
published: &#39;2026-02-23T16:16:35.098Z&#39;
updated: &#39;2026-02-23T16:28:24.036Z&#39;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We can now easily use our filter &lt;code&gt;{{ published | relative_date }}&lt;/code&gt; to get:&lt;/p&gt;
&lt;div class=&#34;interactive-demo&#34;&gt;
  &lt;pre class=&#34;language-html&#34;&gt;&lt;span id=&#34;relative-date-demo&#34;&gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;script type=&#34;module&#34;&gt;
    import {relativeDate} from &#39;/scripts/relativeDate.js&#39;;
    const pageLoad = new Date().toISOString()
    function updateRelativeDateDemo (date) {
      const el = document.querySelector(&#34;#relative-date-demo&#34;);
      el.innerText = `${relativeDate(date)}`;
    }
    updateRelativeDateDemo(pageLoad);
    setInterval(updateRelativeDateDemo, 1_000, pageLoad);
  &lt;/script&gt;
   &lt;/div&gt;
&lt;p&gt;Finally, Eleventy generates static sites and the above code is only generated at build time. If we built the site a week ago, then the relative time difference will be a week out of date! Therefore, we grab all elements with the class relative-date and update their contents at run time. Because we baked the published date in the span element itself, we can recalculate the relative time difference.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;updateRelativeDate&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; elements &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;.relative-date&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  elements&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;el&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    el&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;textContent &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;relativeDate&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;el&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;dataset&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;date&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, in our base template, we add the following code:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;script type&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;module&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; updateRelativeDate &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./scripts/relativeDate.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token function&#34;&gt;updateRelativeDate&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token function&#34;&gt;setInterval&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;updateRelativeDate&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;60_000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This ensures that our relative time difference is always accurate to within one minute!&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Photo</title>
    <link href="https://timecrowave.neocities.org/photo/2026-2-23-swiss-alps-in-the/"/>
    <id>https://timecrowave.neocities.org/photo/2026-2-23-swiss-alps-in-the/</id>
    <published>2026-02-23T11:53:20.767Z</published>
    <updated>2026-02-24T20:46:01.337Z</updated>
    <category term="photo"/>
    <content type="html">&lt;p&gt;Swiss Alps in the Summer of 2025.&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Star Trek: Strange New Worlds</title>
    <link href="https://timecrowave.neocities.org/review/2026-2-22-star-trek-strange-new-worlds/"/>
    <id>https://timecrowave.neocities.org/review/2026-2-22-star-trek-strange-new-worlds/</id>
    <published>2026-02-22T15:06:47.989Z</published>
    <updated>2026-02-23T08:35:17.042Z</updated>
    <category term="review"/>
    <category term="star trek"/>
    <category term="science fiction"/>
    <category term="tv"/>
    <content type="html">&lt;p&gt;I&#39;m not a massive Star Trek guy, so I wasn&#39;t prepared to like the odd mixture of bonkers sci-fi in &lt;em&gt;Star Trek: Strange New Worlds&lt;/em&gt; quite so much. Something I always appreciate about Star Trek is its dedication to diversity and to the notion that conflict is resolved through curiosity and empathy. Battles are won by the side that best understands what drives their adversary, rather than by strength. &lt;em&gt;Strange New Worlds&lt;/em&gt; uses this backdrop to put the crew through wacky space adventures (body swap! pirates! medieval fantasy!) with surprising emotional beats that hit hard (for me, at least). 🖖&lt;/p&gt;
</content>
  </entry>
  <entry>
    <title>Note</title>
    <link href="https://timecrowave.neocities.org/note/2026-2-18-starting-up-this-new/"/>
    <id>https://timecrowave.neocities.org/note/2026-2-18-starting-up-this-new/</id>
    <published>2026-02-18T21:58:50.158Z</published>
    <updated>2026-02-22T16:54:54.962Z</updated>
    <category term="note"/>
    <category term="new"/>
    <content type="html">&lt;p&gt;Starting up this new site. First note!&lt;/p&gt;
</content>
  </entry>
</feed>
