Week 19 of 2026

Development log of Tad Lispy website

7 items
  1. Write "Who is a Normie?" post
  2. In blog posts use a description before a summary
  3. Add Open Graph meta tags for Fediverse
  4. Edit the "Who is a Normie" post a little
  5. Replace daily devlog with weekly, per project entries
  6. Convert project pages to sections
  7. Create a new template for devlog entries

Write "Who is a Normie?" post

On by Tad Lispy

Thanks to Fana for proof-reading and spotting mistakes.

new file mode 100644
index 0000000..a597354
--- /dev/null
+++ b/content/blog/2026-05-04-who-is-a-normie/index.md
@@ -0,0 +1,26 @@
+---
+title: Who is a Normie?
+---
+
+For the past eight months together with a few friends I've been involved with something called [Better Tech Club](https://bettertechclub.eu/). In the beginning we called our activity "FOSS for Normies", and we had a rather nerdy logo. We've changed the name, but being "for normies" remains part of our mission.
+
+
+# Who is a Normie?
+
+With a bit of a wink πŸ˜‰ I say that in the context of our work _a normie is a person for whom a computer is a mean to some other end_. They will use a computer to send an email, file taxes, prepare a presentation, watch a movie, or talk to a friend. But they don't particularly care about computers, as long as their job is done. 
+
+This makes them different from nerds like me, and many of my friends from Better Tech Club. For us, computers are very interesting on their own. We like interacting with them just for the sake of "doing computer stuff" and seeing what's possible. It's fun. It's our hobby. So we think a lot about computers and have have many strong opinions about them. Normies typically don't[^0].
+
+Historically this made it difficult to make normies care about important, political aspects related to computers - like economic and social inequality, imperialism, and hegemony. Those real life problems, that should concern every intelligent and decent person, were easy to dismiss as "just another rant from those computer nerds and radicals; nobody understands what they say anyway".
+
+This changed with the second coming of Donald Trump[^1], and a noticeable drop in the quality of big tech software[^2]. People who just a few months earlier did not care about politics of technology, suddenly started asking questions about privacy, security, political misinformation, European independence, and complicity of USA big tech in war and genocide. They started asking, if they can install Linux on their iPhone[^3]! I'm thrilled about this, because for a meaningful political change we need them on our side.
+
+Now is the time for nerds and normies to unite!
+
+<center><big>πŸ€œπŸ€›</big></center>
+
+
+[^0]: Of course the boundary between a nerd and a normie is blurred at best. When exposed to cool stuff, many normies gradually become nerds. Seldom the other way around.
+[^1]: The big US American cry-baby and wannabe king of the world
+[^2]: Sometimes the quality is lowered on purpose (so called "enshittification"), but often due to incompetence. It's likely a result of decades long attack on education; hostile, and racist attitudes to migrants; and financialization of previously productive sectors of US American economy.
+[^3]: The answer is sadly "no". But maybe some nerd is already working on it.

In blog posts use a description before a summary

On by Tad Lispy

Previously a summary (the part of content before ) was used to populate the content of meta summary tag. Now, if present, the description field from frontmatter will be used. If not present, then summary, and finally a fixed fallback.

I tried to write it in a more elegant way, but somehow it doesn't work like this:

{% set description =
   page.description
   | default(value=page.summary)
   | default(value="From the infamous blog of Tad Lispy")
   | striptags
%}

It always produces null and striptags is choking on it. Maybe I'm doing something wrong; maybe it's a bug in tera, or zola. No time to look into it right now.

index bdc1835..5e964a4 100644
--- a/templates/blog-post.html
+++ b/templates/blog-post.html
@@ -4,7 +4,14 @@
={{ super() }}
={% set page_class  = "blog-post" %}
={% set title = page.title | markdown(inline=true) | striptags %}
-{% set description = page.summary | default(value="From the infamous blog of Tad Lispy") | striptags %}
+{% if page.description %}
+{# TODO: Why can't I do this with a chain of default filters? #}
+{% set description = page.description  %}
+{% elif page.summary %}
+{% set description = page.summary | striptags %}
+{% else %}
+{% set description = "From the infamous blog of Tad Lispy" %}
+{% endif %}
={% endblock variables %}
=
=

Add Open Graph meta tags for Fediverse

On by Tad Lispy

Following advice from https://fedi.tips/how-do-i-get-a-link-preview-to-appear-in-my-post-on-mastodon/

I've also provided a description for the "Who is a Normie?" post (sharing this post on Mastodon was actually the impetus for the Open Graph setup), and improved the "Works" section description.

index a597354..46df37e 100644
--- a/content/blog/2026-05-04-who-is-a-normie/index.md
+++ b/content/blog/2026-05-04-who-is-a-normie/index.md
@@ -1,5 +1,7 @@
=---
=title: Who is a Normie?
+description: |
+  In the context of our work at Better Tech Club a "normie" is a person for whom a computer is a mean to some other end. Meanwhile for us nerds, computers are very interesting on their own. This difference often leads to misunderstandings. But for a meaningful political change, all decent and intelligent people need to work together. It may not be immediately obvious, but many normies are in fact intelligent and decent. So let's try to understand each other better.
=---
=
=For the past eight months together with a few friends I've been involved with something called [Better Tech Club](https://bettertechclub.eu/). In the beginning we called our activity "FOSS for Normies", and we had a rather nerdy logo. We've changed the name, but being "for normies" remains part of our mission.
index 1cb38af..206c6a6 100644
--- a/content/works/_index.md
+++ b/content/works/_index.md
@@ -3,7 +3,7 @@ title: "Tad Works"
=sort_by: "weight"
=template: "works.html"
=page_template: "project.html"
-description: "Featured works of Tad Lispy"
+description: "I'm a software developer, trainer and coach with over 15 years of experience. Over those years I worked for many organizations, large and small. Check out some of my open-source projects and satisfied client testimonials."
=---
=
=
index e52a21b..3519421 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -25,7 +25,15 @@
=        <link rel="mask-icon" href="{{ get_url(path = '/safari-pinned-tab.svg') }}" color="#5bbad5">
=        <meta name="msapplication-TileColor" content="#da532c">
=        <meta name="theme-color" content="#ffffff">
-        
+
+        <meta property="og:title" content="{{ title }}">
+        <meta property="og:site_name" content="Tad Lispy">
+        <meta property="og:description" content="{{ description }}">
+
+        {% block head_extra %}
+        <meta property="og:image" content="{{ get_url(path='tad-lispy-centered.png') }}">
+        {% endblock head_extra %}
+
=        {% block rss %}
=        {% endblock %}
=
index 5e964a4..51df0c1 100644
--- a/templates/blog-post.html
+++ b/templates/blog-post.html
@@ -15,6 +15,13 @@
={% endblock variables %}
=
=
+{% block head_extra %}
+<meta property="og:type" content="article">
+<meta property="og:url" content="{{ page.permalink }}">
+<meta property="og:description" content="{{ description }}">
+<meta property="og:image" content="{{ get_url(path='tad-lispy-centered.png') }}">
+{% endblock head_extra %}
+
={% block content %}
=
=<header>
index a4448d1..388764c 100644
--- a/templates/section.html
+++ b/templates/section.html
@@ -7,6 +7,13 @@
={% set description = section.summary | default(value="by Tad Lispy.") | striptags%}
={% endblock variables %}
=
+{% block head_extra %}
+<meta property="og:type" content="website">
+<meta property="og:url" content="{{ section.permalink }}">
+<meta property="og:description" content="{{ description }}">
+<meta property="og:image" content="{{ get_url(path='tad-lispy-centered.png') }}">
+{% endblock head_extra %}
+
={% block content %}
=<header>
=    <nav aria-label="breadcrumb">

Edit the "Who is a Normie" post a little

On by Tad Lispy

index 46df37e..4e0cecc 100644
--- a/content/blog/2026-05-04-who-is-a-normie/index.md
+++ b/content/blog/2026-05-04-who-is-a-normie/index.md
@@ -4,12 +4,12 @@ description: |
=  In the context of our work at Better Tech Club a "normie" is a person for whom a computer is a mean to some other end. Meanwhile for us nerds, computers are very interesting on their own. This difference often leads to misunderstandings. But for a meaningful political change, all decent and intelligent people need to work together. It may not be immediately obvious, but many normies are in fact intelligent and decent. So let's try to understand each other better.
=---
=
-For the past eight months together with a few friends I've been involved with something called [Better Tech Club](https://bettertechclub.eu/). In the beginning we called our activity "FOSS for Normies", and we had a rather nerdy logo. We've changed the name, but being "for normies" remains part of our mission.
+For the past eight months together with a few friends I've been involved with something called [Better Tech Club](https://bettertechclub.eu/). In the beginning we called our activity "FOSS for Normies", and we had a rather nerdy logo. We've changed the name and the logo, but being "for normies" remains part of our mission.
=
=
=# Who is a Normie?
=
-With a bit of a wink πŸ˜‰ I say that in the context of our work _a normie is a person for whom a computer is a mean to some other end_. They will use a computer to send an email, file taxes, prepare a presentation, watch a movie, or talk to a friend. But they don't particularly care about computers, as long as their job is done. 
+In the context of our work and with a bit of a wink πŸ˜‰ I say that _a normie is a person for whom a computer is a mean to some other end_. They will use a computer to send an email, file taxes, prepare a presentation, watch a movie, or talk to a friend. But they don't particularly care about computers, as long as their job is done. 
=
=This makes them different from nerds like me, and many of my friends from Better Tech Club. For us, computers are very interesting on their own. We like interacting with them just for the sake of "doing computer stuff" and seeing what's possible. It's fun. It's our hobby. So we think a lot about computers and have have many strong opinions about them. Normies typically don't[^0].
=

Replace daily devlog with weekly, per project entries

On by Tad Lispy

The first attempt at publishing and editing my devlog was hard to maintain, with hundreds of individual documents. I realized that I think about my development activity in weekly horizon, with Sunday often being a day for quiet reflection. So now Devlog Excavator produces one directory per project, and inside each directory, one entry per week. Now I've just imported this newly fashioned devlog. Let's see how this will work for me.

deleted file mode 100644
index 537e0e4..0000000
Binary files a/content/devlog/2018-10-22-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index f92f695..0000000
Binary files a/content/devlog/2018-10-23-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 6ab1342..0000000
Binary files a/content/devlog/2018-10-24-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 17f375f..0000000
Binary files a/content/devlog/2018-10-25-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 1278ccb..0000000
Binary files a/content/devlog/2018-10-29-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index f5e6752..0000000
Binary files a/content/devlog/2018-10-30-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 5ab7a8f..0000000
Binary files a/content/devlog/2018-11-12-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index e8bb256..0000000
Binary files a/content/devlog/2018-11-13-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 664b557..0000000
Binary files a/content/devlog/2018-11-19-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index fb2fd54..0000000
Binary files a/content/devlog/2018-11-20-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index f4c5e55..0000000
Binary files a/content/devlog/2018-11-21-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 4b65ce5..0000000
Binary files a/content/devlog/2018-11-23-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 4a45f59..0000000
Binary files a/content/devlog/2018-11-27-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 55f29c6..0000000
Binary files a/content/devlog/2018-11-28-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 300922e..0000000
Binary files a/content/devlog/2018-11-29-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 2ed43f7..0000000
Binary files a/content/devlog/2018-12-03-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 884427a..0000000
Binary files a/content/devlog/2018-12-05-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 1f6ab25..0000000
Binary files a/content/devlog/2018-12-11-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 9eaf8af..0000000
Binary files a/content/devlog/2018-12-13-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index cdba38f..0000000
Binary files a/content/devlog/2018-12-16-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 83a52e3..0000000
Binary files a/content/devlog/2018-12-18-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index b1bf6d0..0000000
Binary files a/content/devlog/2018-12-19-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 210583f..0000000
Binary files a/content/devlog/2018-12-20-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 278b1d8..0000000
Binary files a/content/devlog/2018-12-21-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 602dc82..0000000
Binary files a/content/devlog/2018-12-23-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 9d92221..0000000
Binary files a/content/devlog/2018-12-28-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 58ad4c9..0000000
Binary files a/content/devlog/2019-01-03-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 67e4b0c..0000000
Binary files a/content/devlog/2019-01-04-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index b5e1129..0000000
Binary files a/content/devlog/2019-01-07-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index d84c4fa..0000000
Binary files a/content/devlog/2019-01-09-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 3ad4f68..0000000
Binary files a/content/devlog/2019-01-10-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 94af5ea..0000000
Binary files a/content/devlog/2019-01-11-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 3c7c6e6..0000000
Binary files a/content/devlog/2019-01-14-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 00ee2c5..0000000
Binary files a/content/devlog/2019-01-15-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index aaf7efd..0000000
Binary files a/content/devlog/2019-01-16-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 37cf88f..0000000
Binary files a/content/devlog/2019-01-17-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index aa04d19..0000000
Binary files a/content/devlog/2019-01-18-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index c3110af..0000000
Binary files a/content/devlog/2019-01-20-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index f7c9a19..0000000
Binary files a/content/devlog/2019-01-21-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 2a9ba96..0000000
Binary files a/content/devlog/2019-01-22-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 0d959c0..0000000
Binary files a/content/devlog/2019-01-23-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index f906e5f..0000000
Binary files a/content/devlog/2019-01-24-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 98f583e..0000000
Binary files a/content/devlog/2019-01-27-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 5644869..0000000
Binary files a/content/devlog/2019-01-31-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 09b08e3..0000000
Binary files a/content/devlog/2019-02-01-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index bf9e938..0000000
Binary files a/content/devlog/2019-02-04-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index b8fba72..0000000
Binary files a/content/devlog/2019-02-05-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index fc488a5..0000000
Binary files a/content/devlog/2019-02-10-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 881edc8..0000000
Binary files a/content/devlog/2019-02-11-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 0f8d4cf..0000000
Binary files a/content/devlog/2019-02-14-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index ba75bf6..0000000
Binary files a/content/devlog/2019-02-18-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 9f52ffa..0000000
Binary files a/content/devlog/2019-02-20-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 6ce4c9e..0000000
Binary files a/content/devlog/2019-02-22-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index fb7ab64..0000000
Binary files a/content/devlog/2019-02-25-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 130821e..0000000
Binary files a/content/devlog/2019-02-26-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index fcf3382..0000000
Binary files a/content/devlog/2019-02-27-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 45221d1..0000000
Binary files a/content/devlog/2019-03-03-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 8903bd4..0000000
Binary files a/content/devlog/2019-03-13-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 1060f4e..0000000
Binary files a/content/devlog/2019-03-17-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 5bdaf9f..0000000
Binary files a/content/devlog/2019-04-02-elm-tree-workshop.md and /dev/null differ
deleted file mode 100644
index 4cdfdde..0000000
Binary files a/content/devlog/2025-05-26-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index b20dfd4..0000000
Binary files a/content/devlog/2025-05-27-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 70447ee..0000000
Binary files a/content/devlog/2025-05-28-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 1a4776c..0000000
Binary files a/content/devlog/2025-05-29-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 74b2dfe..0000000
Binary files a/content/devlog/2025-06-05-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 80a62c7..0000000
Binary files a/content/devlog/2025-06-08-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index fd121f3..0000000
Binary files a/content/devlog/2025-06-09-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index aa1d847..0000000
Binary files a/content/devlog/2025-06-10-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index aae49ef..0000000
Binary files a/content/devlog/2025-06-12-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 5f269e7..0000000
Binary files a/content/devlog/2025-06-13-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 33921f5..0000000
Binary files a/content/devlog/2025-06-15-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index f8448ac..0000000
Binary files a/content/devlog/2025-06-19-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 5157b71..0000000
Binary files a/content/devlog/2025-06-20-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index c37f2f6..0000000
Binary files a/content/devlog/2025-06-21-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 63c68ad..0000000
Binary files a/content/devlog/2025-06-23-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index a6d4aa5..0000000
Binary files a/content/devlog/2025-06-24-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 59d13d6..0000000
Binary files a/content/devlog/2025-07-01-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 30e0313..0000000
Binary files a/content/devlog/2025-07-02-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 65b8260..0000000
Binary files a/content/devlog/2025-09-08-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 61e1218..0000000
Binary files a/content/devlog/2025-09-09-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 600f598..0000000
Binary files a/content/devlog/2025-09-10-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 8fdd45f..0000000
Binary files a/content/devlog/2025-09-11-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 3c27c9f..0000000
Binary files a/content/devlog/2025-09-12-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 65d7a29..0000000
Binary files a/content/devlog/2025-09-29-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index fb0d61b..0000000
Binary files a/content/devlog/2025-10-01-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 84d1d4e..0000000
Binary files a/content/devlog/2025-10-03-joke-as-a-service.md and /dev/null differ
deleted file mode 100644
index 4bdc737..0000000
Binary files a/content/devlog/2025-10-14-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 17a37e1..0000000
Binary files a/content/devlog/2025-11-13-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 92c8833..0000000
Binary files a/content/devlog/2025-11-14-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 52a1995..0000000
Binary files a/content/devlog/2025-11-15-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 5114f05..0000000
Binary files a/content/devlog/2025-11-17-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 2399a1f..0000000
Binary files a/content/devlog/2025-11-18-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 90a5fa8..0000000
Binary files a/content/devlog/2025-11-20-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index cb4fc3c..0000000
Binary files a/content/devlog/2025-11-21-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 29c502e..0000000
Binary files a/content/devlog/2025-11-22-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index fd70422..0000000
Binary files a/content/devlog/2025-11-24-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 26a34c2..0000000
Binary files a/content/devlog/2025-11-25-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 6a55b26..0000000
Binary files a/content/devlog/2025-11-26-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 03a7464..0000000
Binary files a/content/devlog/2025-11-27-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index d264a40..0000000
Binary files a/content/devlog/2025-11-28-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index cb441ab..0000000
Binary files a/content/devlog/2025-11-29-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 90d9158..0000000
Binary files a/content/devlog/2025-12-01-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 5fe0fe5..0000000
Binary files a/content/devlog/2025-12-05-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 54ea331..0000000
Binary files a/content/devlog/2025-12-06-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index 1181cbb..0000000
Binary files a/content/devlog/2025-12-10-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 857c8fc..0000000
Binary files a/content/devlog/2025-12-12-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index c3c1a61..0000000
Binary files a/content/devlog/2026-01-03-bieb-os.md and /dev/null differ
deleted file mode 100644
index 8f482ff..0000000
Binary files a/content/devlog/2026-01-20-bieb-os.md and /dev/null differ
deleted file mode 100644
index 3ea699c..0000000
Binary files a/content/devlog/2026-01-27-bieb-os.md and /dev/null differ
deleted file mode 100644
index 767486a..0000000
Binary files a/content/devlog/2026-02-10-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index c1bd247..0000000
Binary files a/content/devlog/2026-02-17-esc-collective-website.md and /dev/null differ
deleted file mode 100644
index 09e6f30..0000000
Binary files a/content/devlog/2026-02-20-bieb-os.md and /dev/null differ
deleted file mode 100644
index ccb131d..0000000
Binary files a/content/devlog/2026-03-03-bieb-os.md and /dev/null differ
deleted file mode 100644
index 1aba296..0000000
Binary files a/content/devlog/2026-03-19-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 86bb6c1..0000000
Binary files a/content/devlog/2026-03-23-erna.md and /dev/null differ
deleted file mode 100644
index 68b0145..0000000
Binary files a/content/devlog/2026-03-25-erna.md and /dev/null differ
deleted file mode 100644
index 252f82f..0000000
Binary files a/content/devlog/2026-04-01-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index d604cf7..0000000
Binary files a/content/devlog/2026-04-02-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 20c35db..0000000
Binary files a/content/devlog/2026-04-04-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index a3ba4f7..0000000
Binary files a/content/devlog/2026-04-07-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index 78af26e..0000000
Binary files a/content/devlog/2026-04-08-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index 12ee7eb..0000000
Binary files a/content/devlog/2026-04-08-tad-better-behavior.md and /dev/null differ
deleted file mode 100644
index 1d68057..0000000
Binary files a/content/devlog/2026-04-09-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index bb69070..0000000
Binary files a/content/devlog/2026-04-10-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index 5cae939..0000000
Binary files a/content/devlog/2026-04-10-erna.md and /dev/null differ
deleted file mode 100644
index 77eddcb..0000000
Binary files a/content/devlog/2026-04-11-better-tech-club-website.md and /dev/null differ
deleted file mode 100644
index 0d985d2..0000000
Binary files a/content/devlog/2026-04-11-erna.md and /dev/null differ
deleted file mode 100644
index c2bd98a..0000000
Binary files a/content/devlog/2026-04-13-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 15947e4..0000000
Binary files a/content/devlog/2026-04-14-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 9360a72..0000000
Binary files a/content/devlog/2026-04-15-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 68868da..0000000
Binary files a/content/devlog/2026-04-16-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 2db1eb6..0000000
Binary files a/content/devlog/2026-04-17-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 41e3abd..0000000
Binary files a/content/devlog/2026-04-18-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 19ade0d..0000000
Binary files a/content/devlog/2026-04-19-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 8f80321..0000000
Binary files a/content/devlog/2026-04-20-devlog-excavator.md and /dev/null differ
deleted file mode 100644
index 97f11f9..0000000
Binary files a/content/devlog/2026-04-20-tad-lispy-website.md and /dev/null differ
deleted file mode 100644
index 0eb0d5e..0000000
--- a/content/devlog/_index.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: Tad Devlog
-template: blog.html
-generate_feeds: true
----
-
-I write as I work as I write.
-
new file mode 100644
index 0000000..921e95d
Binary files /dev/null and b/content/works/better-tech-club-website/2025-W49.md differ
similarity index 71%
rename from content/devlog/2025-12-11-better-tech-club-website.md
rename to content/works/better-tech-club-website/2025-W50.md
index 2e518df..2aced52 100644
Binary files a/content/devlog/2025-12-11-better-tech-club-website.md and b/content/works/better-tech-club-website/2025-W50.md differ
similarity index 79%
rename from content/devlog/2026-02-09-better-tech-club-website.md
rename to content/works/better-tech-club-website/2026-W07.md
index cd4f370..49eba92 100644
Binary files a/content/devlog/2026-02-09-better-tech-club-website.md and b/content/works/better-tech-club-website/2026-W07.md differ
similarity index 86%
rename from content/devlog/2026-02-19-better-tech-club-website.md
rename to content/works/better-tech-club-website/2026-W08.md
index 12f60da..73f5d13 100644
Binary files a/content/devlog/2026-02-19-better-tech-club-website.md and b/content/works/better-tech-club-website/2026-W08.md differ
new file mode 100644
index 0000000..2de30e1
Binary files /dev/null and b/content/works/better-tech-club-website/2026-W15.md differ
similarity index 75%
rename from content/devlog/2026-04-14-better-tech-club-website.md
rename to content/works/better-tech-club-website/2026-W16.md
index b50488b..8fc5322 100644
Binary files a/content/devlog/2026-04-14-better-tech-club-website.md and b/content/works/better-tech-club-website/2026-W16.md differ
similarity index 89%
rename from content/devlog/2026-04-20-better-tech-club-website.md
rename to content/works/better-tech-club-website/2026-W17.md
index 92dd088..ba787e7 100644
Binary files a/content/devlog/2026-04-20-better-tech-club-website.md and b/content/works/better-tech-club-website/2026-W17.md differ
new file mode 100644
index 0000000..a68fcbd
Binary files /dev/null and b/content/works/better-tech-club-website/2026-W18.md differ
similarity index 86%
rename from content/devlog/2026-01-02-bieb-os.md
rename to content/works/bieb-os/2026-W01.md
index 5fe0886..ec5d049 100644
Binary files a/content/devlog/2026-01-02-bieb-os.md and b/content/works/bieb-os/2026-W01.md differ
similarity index 87%
rename from content/devlog/2026-01-09-bieb-os.md
rename to content/works/bieb-os/2026-W02.md
index 786d219..3f5079b 100644
Binary files a/content/devlog/2026-01-09-bieb-os.md and b/content/works/bieb-os/2026-W02.md differ
similarity index 74%
rename from content/devlog/2026-01-23-bieb-os.md
rename to content/works/bieb-os/2026-W04.md
index ec4db0f..612f33c 100644
Binary files a/content/devlog/2026-01-23-bieb-os.md and b/content/works/bieb-os/2026-W04.md differ
similarity index 59%
rename from content/devlog/2026-01-30-bieb-os.md
rename to content/works/bieb-os/2026-W05.md
index 963eec0..8504cb8 100644
Binary files a/content/devlog/2026-01-30-bieb-os.md and b/content/works/bieb-os/2026-W05.md differ
similarity index 71%
rename from content/devlog/2026-02-03-bieb-os.md
rename to content/works/bieb-os/2026-W06.md
index 04a8c8c..1a78ce3 100644
Binary files a/content/devlog/2026-02-03-bieb-os.md and b/content/works/bieb-os/2026-W06.md differ
similarity index 52%
rename from content/devlog/2026-02-17-bieb-os.md
rename to content/works/bieb-os/2026-W08.md
index a9acb9e..d883193 100644
Binary files a/content/devlog/2026-02-17-bieb-os.md and b/content/works/bieb-os/2026-W08.md differ
similarity index 65%
rename from content/devlog/2026-03-06-bieb-os.md
rename to content/works/bieb-os/2026-W10.md
index df7546b..0cd817f 100644
Binary files a/content/devlog/2026-03-06-bieb-os.md and b/content/works/bieb-os/2026-W10.md differ
similarity index 96%
rename from content/devlog/2026-04-11-devlog-excavator.md
rename to content/works/devlog-excavator/2026-W15.md
index d8c4970..3102d80 100644
Binary files a/content/devlog/2026-04-11-devlog-excavator.md and b/content/works/devlog-excavator/2026-W15.md differ
new file mode 100644
index 0000000..520fcd0
Binary files /dev/null and b/content/works/devlog-excavator/2026-W16.md differ
similarity index 68%
rename from content/devlog/2026-04-21-devlog-excavator.md
rename to content/works/devlog-excavator/2026-W17.md
index 88a80f2..f0af81d 100644
Binary files a/content/devlog/2026-04-21-devlog-excavator.md and b/content/works/devlog-excavator/2026-W17.md differ
new file mode 100644
index 0000000..2083e43
Binary files /dev/null and b/content/works/devlog-excavator/2026-W18.md differ
new file mode 100644
index 0000000..55e7c9d
Binary files /dev/null and b/content/works/devlog-excavator/2026-W19.md differ
new file mode 100644
index 0000000..a249788
Binary files /dev/null and b/content/works/elm-tree-workshop/2018-W43.md differ
similarity index 57%
rename from content/devlog/2018-11-01-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W44.md
index 03de9f2..7ad67f3 100644
Binary files a/content/devlog/2018-11-01-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W44.md differ
similarity index 73%
rename from content/devlog/2018-11-15-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W46.md
index 80115c8..400b02e 100644
Binary files a/content/devlog/2018-11-15-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W46.md differ
similarity index 51%
rename from content/devlog/2018-11-22-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W47.md
index ab103f3..621d9ac 100644
Binary files a/content/devlog/2018-11-22-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W47.md differ
new file mode 100644
index 0000000..b38384b
Binary files /dev/null and b/content/works/elm-tree-workshop/2018-W48.md differ
similarity index 68%
rename from content/devlog/2018-12-04-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W49.md
index e422b16..96a8b4f 100644
Binary files a/content/devlog/2018-12-04-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W49.md differ
similarity index 65%
rename from content/devlog/2018-12-14-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W50.md
index caec6c9..fe34dad 100644
Binary files a/content/devlog/2018-12-14-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W50.md differ
new file mode 100644
index 0000000..6bbf147
Binary files /dev/null and b/content/works/elm-tree-workshop/2018-W51.md differ
similarity index 70%
rename from content/devlog/2018-12-24-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2018-W52.md
index dcec09c..c3fea1e 100644
Binary files a/content/devlog/2018-12-24-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2018-W52.md differ
similarity index 86%
rename from content/devlog/2019-01-02-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W01.md
index dad25f4..8798430 100644
Binary files a/content/devlog/2019-01-02-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W01.md differ
similarity index 51%
rename from content/devlog/2019-01-08-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W02.md
index d16582b..cdf6f6e 100644
Binary files a/content/devlog/2019-01-08-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W02.md differ
new file mode 100644
index 0000000..20b9ad4
Binary files /dev/null and b/content/works/elm-tree-workshop/2019-W03.md differ
similarity index 56%
rename from content/devlog/2019-01-25-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W04.md
index 2a8f80c..e42eeb2 100644
Binary files a/content/devlog/2019-01-25-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W04.md differ
similarity index 92%
rename from content/devlog/2019-01-30-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W05.md
index c82c38b..42582d3 100644
Binary files a/content/devlog/2019-01-30-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W05.md differ
similarity index 67%
rename from content/devlog/2019-02-08-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W06.md
index f8fbd07..473bab8 100644
Binary files a/content/devlog/2019-02-08-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W06.md differ
similarity index 77%
rename from content/devlog/2019-02-12-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W07.md
index eab07df..34c30f7 100644
Binary files a/content/devlog/2019-02-12-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W07.md differ
similarity index 69%
rename from content/devlog/2019-02-21-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W08.md
index b97852c..834a289 100644
Binary files a/content/devlog/2019-02-21-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W08.md differ
new file mode 100644
index 0000000..78f64dd
Binary files /dev/null and b/content/works/elm-tree-workshop/2019-W09.md differ
similarity index 77%
rename from content/devlog/2019-03-06-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W10.md
index 85b7d7b..5a39c0a 100644
Binary files a/content/devlog/2019-03-06-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W10.md differ
new file mode 100644
index 0000000..a6b8f6e
Binary files /dev/null and b/content/works/elm-tree-workshop/2019-W11.md differ
similarity index 69%
rename from content/devlog/2019-03-23-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W12.md
index f88d521..bb13146 100644
Binary files a/content/devlog/2019-03-23-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W12.md differ
similarity index 95%
rename from content/devlog/2019-03-26-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W13.md
index e70aeab..ade1750 100644
Binary files a/content/devlog/2019-03-26-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W13.md differ
similarity index 65%
rename from content/devlog/2019-04-04-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W14.md
index ab0a0b9..ada6cd3 100644
Binary files a/content/devlog/2019-04-04-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W14.md differ
similarity index 78%
rename from content/devlog/2019-05-04-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W18.md
index fcbe31f..be633d4 100644
Binary files a/content/devlog/2019-05-04-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W18.md differ
similarity index 92%
rename from content/devlog/2019-05-09-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W19.md
index d653559..5cfc126 100644
Binary files a/content/devlog/2019-05-09-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W19.md differ
similarity index 56%
rename from content/devlog/2019-06-12-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W24.md
index 7244d2e..41954a3 100644
Binary files a/content/devlog/2019-06-12-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W24.md differ
similarity index 74%
rename from content/devlog/2019-07-28-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W30.md
index 5dbb244..977ce24 100644
Binary files a/content/devlog/2019-07-28-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W30.md differ
similarity index 73%
rename from content/devlog/2019-11-03-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2019-W44.md
index 8f5f2f7..7f0d0a3 100644
Binary files a/content/devlog/2019-11-03-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2019-W44.md differ
similarity index 82%
rename from content/devlog/2020-05-12-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2020-W20.md
index a640221..a9013c7 100644
Binary files a/content/devlog/2020-05-12-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2020-W20.md differ
similarity index 80%
rename from content/devlog/2020-10-07-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2020-W41.md
index 0cc9cf3..c3faa4a 100644
Binary files a/content/devlog/2020-10-07-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2020-W41.md differ
similarity index 95%
rename from content/devlog/2021-02-21-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2021-W07.md
index 1c1001f..1b44987 100644
Binary files a/content/devlog/2021-02-21-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2021-W07.md differ
similarity index 92%
rename from content/devlog/2021-03-05-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2021-W09.md
index e8e6630..92a7422 100644
Binary files a/content/devlog/2021-03-05-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2021-W09.md differ
similarity index 65%
rename from content/devlog/2022-04-07-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2022-W14.md
index 069f959..33d7845 100644
Binary files a/content/devlog/2022-04-07-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2022-W14.md differ
similarity index 65%
rename from content/devlog/2025-07-01-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2025-W27.md
index b075a26..a067448 100644
Binary files a/content/devlog/2025-07-01-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2025-W27.md differ
similarity index 68%
rename from content/devlog/2025-10-07-elm-tree-workshop.md
rename to content/works/elm-tree-workshop/2025-W41.md
index 80bfa03..1b8edce 100644
Binary files a/content/devlog/2025-10-07-elm-tree-workshop.md and b/content/works/elm-tree-workshop/2025-W41.md differ
similarity index 97%
rename from content/devlog/2026-03-21-erna.md
rename to content/works/erna/2026-W12.md
index a578314..c1a69b7 100644
Binary files a/content/devlog/2026-03-21-erna.md and b/content/works/erna/2026-W12.md differ
similarity index 54%
rename from content/devlog/2026-03-26-erna.md
rename to content/works/erna/2026-W13.md
index 4f1b9ed..be28fc4 100644
Binary files a/content/devlog/2026-03-26-erna.md and b/content/works/erna/2026-W13.md differ
similarity index 99%
rename from content/devlog/2026-03-30-erna.md
rename to content/works/erna/2026-W14.md
index d435bae..0dfd040 100644
Binary files a/content/devlog/2026-03-30-erna.md and b/content/works/erna/2026-W14.md differ
similarity index 71%
rename from content/devlog/2026-04-09-erna.md
rename to content/works/erna/2026-W15.md
index 798a79a..38bda89 100644
Binary files a/content/devlog/2026-04-09-erna.md and b/content/works/erna/2026-W15.md differ
similarity index 95%
rename from content/devlog/2025-05-25-esc-collective-website.md
rename to content/works/esc-collective-website/2025-W21.md
index 60059c6..07a8d46 100644
Binary files a/content/devlog/2025-05-25-esc-collective-website.md and b/content/works/esc-collective-website/2025-W21.md differ
new file mode 100644
index 0000000..523fb3b
Binary files /dev/null and b/content/works/esc-collective-website/2025-W22.md differ
similarity index 85%
rename from content/devlog/2025-06-06-esc-collective-website.md
rename to content/works/esc-collective-website/2025-W23.md
index 5fb2dd1..a3034f9 100644
Binary files a/content/devlog/2025-06-06-esc-collective-website.md and b/content/works/esc-collective-website/2025-W23.md differ
similarity index 99%
rename from content/devlog/2025-06-11-esc-collective-website.md
rename to content/works/esc-collective-website/2025-W24.md
index 1ab8403..319d995 100644
Binary files a/content/devlog/2025-06-11-esc-collective-website.md and b/content/works/esc-collective-website/2025-W24.md differ
new file mode 100644
index 0000000..a9e3397
Binary files /dev/null and b/content/works/esc-collective-website/2025-W25.md differ
new file mode 100644
index 0000000..4f1aacd
Binary files /dev/null and b/content/works/esc-collective-website/2025-W26.md differ
similarity index 65%
rename from content/devlog/2026-02-16-esc-collective-website.md
rename to content/works/esc-collective-website/2026-W08.md
index add603d..cb06a76 100644
Binary files a/content/devlog/2026-02-16-esc-collective-website.md and b/content/works/esc-collective-website/2026-W08.md differ
similarity index 94%
rename from content/devlog/2025-09-05-joke-as-a-service.md
rename to content/works/joke-as-a-service/2025-W36.md
index 0e5c817..7b4d4ee 100644
Binary files a/content/devlog/2025-09-05-joke-as-a-service.md and b/content/works/joke-as-a-service/2025-W36.md differ
similarity index 57%
rename from content/devlog/2025-09-13-joke-as-a-service.md
rename to content/works/joke-as-a-service/2025-W37.md
index 43caa86..0b67b4b 100644
Binary files a/content/devlog/2025-09-13-joke-as-a-service.md and b/content/works/joke-as-a-service/2025-W37.md differ
similarity index 65%
rename from content/devlog/2025-09-15-joke-as-a-service.md
rename to content/works/joke-as-a-service/2025-W38.md
index ce7e4ed..3aad1d0 100644
Binary files a/content/devlog/2025-09-15-joke-as-a-service.md and b/content/works/joke-as-a-service/2025-W38.md differ
similarity index 91%
rename from content/devlog/2025-09-26-joke-as-a-service.md
rename to content/works/joke-as-a-service/2025-W39.md
index f7105dc..2ddade2 100644
Binary files a/content/devlog/2025-09-26-joke-as-a-service.md and b/content/works/joke-as-a-service/2025-W39.md differ
similarity index 68%
rename from content/devlog/2025-09-30-joke-as-a-service.md
rename to content/works/joke-as-a-service/2025-W40.md
index 44cbca3..8e12e6f 100644
Binary files a/content/devlog/2025-09-30-joke-as-a-service.md and b/content/works/joke-as-a-service/2025-W40.md differ
new file mode 100644
index 0000000..06975fb
Binary files /dev/null and b/content/works/otterhide/2024-W09.md differ
new file mode 100644
index 0000000..61497ec
Binary files /dev/null and b/content/works/otterhide/2024-W10.md differ
new file mode 100644
index 0000000..d1ce64c
Binary files /dev/null and b/content/works/otterhide/2024-W11.md differ
new file mode 100644
index 0000000..ec727aa
Binary files /dev/null and b/content/works/otterhide/2024-W12.md differ
new file mode 100644
index 0000000..38e476a
Binary files /dev/null and b/content/works/otterhide/2024-W13.md differ
new file mode 100644
index 0000000..7e1b3b7
Binary files /dev/null and b/content/works/otterhide/2024-W14.md differ
new file mode 100644
index 0000000..1472bc5
Binary files /dev/null and b/content/works/otterhide/2024-W15.md differ
new file mode 100644
index 0000000..c795ae0
Binary files /dev/null and b/content/works/otterhide/2024-W16.md differ
new file mode 100644
index 0000000..210c88f
Binary files /dev/null and b/content/works/otterhide/2024-W17.md differ
new file mode 100644
index 0000000..507a4a7
Binary files /dev/null and b/content/works/otterhide/2024-W18.md differ
new file mode 100644
index 0000000..385f362
Binary files /dev/null and b/content/works/otterhide/2024-W20.md differ
new file mode 100644
index 0000000..b895979
Binary files /dev/null and b/content/works/otterhide/2024-W33.md differ
new file mode 100644
index 0000000..dad7edd
Binary files /dev/null and b/content/works/otterhide/2024-W34.md differ
similarity index 91%
rename from content/devlog/2025-12-27-otterhide.md
rename to content/works/otterhide/2025-W52.md
index b5fe3e1..1a802aa 100644
Binary files a/content/devlog/2025-12-27-otterhide.md and b/content/works/otterhide/2025-W52.md differ
new file mode 100644
index 0000000..3142035
Binary files /dev/null and b/content/works/rest-in-python-course/2025-W15.md differ
new file mode 100644
index 0000000..06a5181
Binary files /dev/null and b/content/works/rest-in-python-course/2025-W16.md differ
similarity index 99%
rename from content/devlog/2025-09-12-rest-in-python-course.md
rename to content/works/rest-in-python-course/2025-W37.md
index 14fb41b..a4974d2 100644
Binary files a/content/devlog/2025-09-12-rest-in-python-course.md and b/content/works/rest-in-python-course/2025-W37.md differ
similarity index 96%
rename from content/devlog/2025-09-15-rest-in-python-course.md
rename to content/works/rest-in-python-course/2025-W38.md
index 8cfddae..52b273c 100644
Binary files a/content/devlog/2025-09-15-rest-in-python-course.md and b/content/works/rest-in-python-course/2025-W38.md differ
new file mode 100644
index 0000000..516d176
Binary files /dev/null and b/content/works/tad-better-behavior/2025-W46.md differ
new file mode 100644
index 0000000..5c5dec7
Binary files /dev/null and b/content/works/tad-better-behavior/2025-W47.md differ
new file mode 100644
index 0000000..e3beb5b
Binary files /dev/null and b/content/works/tad-better-behavior/2025-W48.md differ
similarity index 69%
rename from content/devlog/2025-12-02-tad-better-behavior.md
rename to content/works/tad-better-behavior/2025-W49.md
index 0ed7dcb..8bc8193 100644
Binary files a/content/devlog/2025-12-02-tad-better-behavior.md and b/content/works/tad-better-behavior/2025-W49.md differ
similarity index 92%
rename from content/devlog/2025-12-11-tad-better-behavior.md
rename to content/works/tad-better-behavior/2025-W50.md
index f8bb1ba..915ba93 100644
Binary files a/content/devlog/2025-12-11-tad-better-behavior.md and b/content/works/tad-better-behavior/2025-W50.md differ
similarity index 60%
rename from content/devlog/2026-03-20-tad-better-behavior.md
rename to content/works/tad-better-behavior/2026-W12.md
index 184f39e..35d8ff3 100644
Binary files a/content/devlog/2026-03-20-tad-better-behavior.md and b/content/works/tad-better-behavior/2026-W12.md differ
similarity index 96%
rename from content/devlog/2026-04-02-tad-better-behavior.md
rename to content/works/tad-better-behavior/2026-W14.md
index c2414f3..6736c47 100644
Binary files a/content/devlog/2026-04-02-tad-better-behavior.md and b/content/works/tad-better-behavior/2026-W14.md differ
new file mode 100644
index 0000000..d97271c
Binary files /dev/null and b/content/works/tad-better-behavior/2026-W15.md differ
similarity index 93%
rename from content/devlog/2026-04-15-tad-better-behavior.md
rename to content/works/tad-better-behavior/2026-W16.md
index 928595e..5ea7127 100644
Binary files a/content/devlog/2026-04-15-tad-better-behavior.md and b/content/works/tad-better-behavior/2026-W16.md differ
new file mode 100644
index 0000000..b1a90b8
Binary files /dev/null and b/content/works/tad-better-behavior/2026-W17.md differ
new file mode 100644
index 0000000..afb2da7
Binary files /dev/null and b/content/works/tad-better-behavior/2026-W18.md differ
new file mode 100644
index 0000000..33094d6
Binary files /dev/null and b/content/works/tad-lispy-website/2024-W06.md differ
new file mode 100644
index 0000000..2689e39
Binary files /dev/null and b/content/works/tad-lispy-website/2024-W07.md differ
new file mode 100644
index 0000000..edff006
Binary files /dev/null and b/content/works/tad-lispy-website/2024-W31.md differ
new file mode 100644
index 0000000..480af44
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W04.md differ
new file mode 100644
index 0000000..a384e35
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W09.md differ
new file mode 100644
index 0000000..ac76638
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W10.md differ
new file mode 100644
index 0000000..a1ebd90
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W11.md differ
new file mode 100644
index 0000000..aeda115
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W12.md differ
new file mode 100644
index 0000000..4f9fc9f
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W13.md differ
new file mode 100644
index 0000000..9a6e2ee
Binary files /dev/null and b/content/works/tad-lispy-website/2025-W27.md differ
similarity index 89%
rename from content/devlog/2025-10-16-tad-lispy-website.md
rename to content/works/tad-lispy-website/2025-W42.md
index 36e608a..515f3be 100644
Binary files a/content/devlog/2025-10-16-tad-lispy-website.md and b/content/works/tad-lispy-website/2025-W42.md differ
similarity index 92%
rename from content/devlog/2026-02-22-tad-lispy-website.md
rename to content/works/tad-lispy-website/2026-W08.md
index f344acf..16d84cd 100644
Binary files a/content/devlog/2026-02-22-tad-lispy-website.md and b/content/works/tad-lispy-website/2026-W08.md differ
similarity index 92%
rename from content/devlog/2026-04-03-tad-lispy-website.md
rename to content/works/tad-lispy-website/2026-W14.md
index 67e3db9..600702a 100644
Binary files a/content/devlog/2026-04-03-tad-lispy-website.md and b/content/works/tad-lispy-website/2026-W14.md differ
similarity index 97%
rename from content/devlog/2026-04-18-tad-lispy-website.md
rename to content/works/tad-lispy-website/2026-W16.md
index d4e6c4c..4640618 100644
Binary files a/content/devlog/2026-04-18-tad-lispy-website.md and b/content/works/tad-lispy-website/2026-W16.md differ
new file mode 100644
index 0000000..6c1c0f8
Binary files /dev/null and b/content/works/tad-lispy-website/2026-W17.md differ
new file mode 100644
index 0000000..b569f93
Binary files /dev/null and b/content/works/tad-lispy-website/2026-W19.md differ
new file mode 100644
index 0000000..8974503
Binary files /dev/null and b/content/works/tad-notes/2024-W01.md differ
new file mode 100644
index 0000000..cb9f581
Binary files /dev/null and b/content/works/tad-notes/2024-W02.md differ
new file mode 100644
index 0000000..3223fe1
Binary files /dev/null and b/content/works/tad-notes/2024-W03.md differ
new file mode 100644
index 0000000..6ed16b6
Binary files /dev/null and b/content/works/tad-notes/2024-W04.md differ
new file mode 100644
index 0000000..fbaf4ac
Binary files /dev/null and b/content/works/tad-notes/2024-W05.md differ
new file mode 100644
index 0000000..266c1e2
Binary files /dev/null and b/content/works/tad-notes/2024-W06.md differ
new file mode 100644
index 0000000..ef750f8
Binary files /dev/null and b/content/works/tad-notes/2024-W21.md differ
new file mode 100644
index 0000000..03261c9
Binary files /dev/null and b/content/works/tad-notes/2024-W39.md differ
new file mode 100644
index 0000000..cde23bf
Binary files /dev/null and b/content/works/tad-notes/2024-W49.md differ
new file mode 100644
index 0000000..ce275d3
Binary files /dev/null and b/content/works/tad-notes/2024-W50.md differ
new file mode 100644
index 0000000..f7ddf24
Binary files /dev/null and b/content/works/tad-notes/2025-W01.md differ
new file mode 100644
index 0000000..f8c407e
Binary files /dev/null and b/content/works/tad-notes/2025-W02.md differ
new file mode 100644
index 0000000..289fe8f
Binary files /dev/null and b/content/works/word-snake/2020-W43.md differ
new file mode 100644
index 0000000..ce6ee49
Binary files /dev/null and b/content/works/word-snake/2020-W44.md differ
new file mode 100644
index 0000000..6ba7c7d
Binary files /dev/null and b/content/works/word-snake/2020-W45.md differ
new file mode 100644
index 0000000..c6bf8e2
Binary files /dev/null and b/content/works/word-snake/2020-W46.md differ
new file mode 100644
index 0000000..a7575e0
Binary files /dev/null and b/content/works/word-snake/2020-W50.md differ
new file mode 100644
index 0000000..2d0117c
Binary files /dev/null and b/content/works/word-snake/2021-W09.md differ
new file mode 100644
index 0000000..5d128ea
Binary files /dev/null and b/content/works/word-snake/2021-W13.md differ
new file mode 100644
index 0000000..a05f834
Binary files /dev/null and b/content/works/word-snake/2021-W14.md differ
new file mode 100644
index 0000000..1cc4982
Binary files /dev/null and b/content/works/word-snake/2021-W17.md differ
new file mode 100644
index 0000000..ec88f0f
Binary files /dev/null and b/content/works/word-snake/2022-W12.md differ
new file mode 100644
index 0000000..7364657
Binary files /dev/null and b/content/works/word-snake/2023-W01.md differ
new file mode 100644
index 0000000..86302f5
Binary files /dev/null and b/content/works/word-snake/2023-W02.md differ
new file mode 100644
index 0000000..3356f26
Binary files /dev/null and b/content/works/word-snake/2023-W03.md differ
new file mode 100644
index 0000000..d7e01fd
Binary files /dev/null and b/content/works/word-snake/2023-W04.md differ
new file mode 100644
index 0000000..af13a50
Binary files /dev/null and b/content/works/word-snake/2023-W05.md differ
similarity index 83%
rename from content/devlog/2025-07-01-word-snake.md
rename to content/works/word-snake/2025-W27.md
index 7ea954e..3aba61c 100644
Binary files a/content/devlog/2025-07-01-word-snake.md and b/content/works/word-snake/2025-W27.md differ
index 0559538..43da93b 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -5,9 +5,8 @@
={% block variables %}
={{ super() }}
={% set page_class  = "page project" %}
-{% set title = page.title | markdown(inline=true) | striptags %}
-{% set description = page.description | default(value="A project by Tad Lispy.") | striptags %}
-{% set devlog = get_section(path="devlog/_index.md") %}
+{% set title = section.title | markdown(inline=true) | striptags %}
+{% set description = section.description | default(value="A project by Tad Lispy.") | striptags %}
={% endblock variables %}
=
={% block content %}
@@ -16,36 +15,54 @@
=        <ul>
=            <li><a href="{{ get_url(path='@/_index.md') }}">Tad Lispy</a></li>
=            <li><a href="{{ get_url(path='@/works/_index.md') }}">Works</a></li>
-            <li><strong>{{ page.title | markdown(inline=true) | safe }}</strong></li>
+            <li><strong>{{ section.title | markdown(inline=true) | safe }}</strong></li>
=        </ul>
=    </nav>
=
+    {# TODO: Re-implement crafts using pages instead of taxonomies
=    <ul class="craft-list">
-        {% for craft in page.taxonomies | get(key="craft", default=[]) %}
+        {% for craft in section.extra.crafts | get(key="craft", default=[]) %}
=
=        <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
=        {% endfor %}
=    </ul>
+    #}
=</header>
=
=<main>
=
-    {{ page.content | safe }}
+    {{ section.content | safe }}
=
+    {% if section.pages %}
+    {% set latest_entry = section.pages | first %}
=
-    {# NOTE: If there is no devlog, then the heading will be hidden using CSS #}
-    <h2 id="devlog-heading">Devlog</h2>
+    <hgroup>
+        <h2>Latest developments</h2>
+        <p>
+            from
+            <time datetime="{{ latest_entry.extra.iso_week }}">
+                the week of {{ latest_entry.extra.last_day | date(format="%A, %F") }}
+            </time>.
+        {% if section.pages | length > 1 %}
+            <a href="#devlog-entries">See older</a>.
+        {% endif %}
+        </p>
+    </hgroup>
=
-    {% for entry in devlog.pages | sort(attribute="date") | reverse %}
-    {% if entry.extra.projects is containing(page.title) %}
=    <section class="devlog-entry">
-        <h3><time datetime="{{ entry.date }}">{{ entry.date | date(format="%A, %F")}}</time></h3>
-
-        {% set unescaped = components::unescape(body=entry.content) %}
+        {% set unescaped = components::unescape(body=latest_entry.content) %}
=        {{- components::demote_headings (content=unescaped, levels=3) | safe -}}
=    </section>
=    {% endif %}
-    {% endfor %}
+
+    <h2 id="devlog-entries">Older Devlog Entries</h2>
+    <ul>
+        {% for entry in section.pages %}
+        <li class="devlog-entry">
+            <a href="{{ entry.permalink }}">{{ entry.title }}</a>
+        </section>
+        {% endfor %}
+    </ul>
=</main>
=
={% include "includes/footer.html" %}

Convert project pages to sections

On by Tad Lispy

In Zola terms, each project is now a section, and each devlog entry is a page within a project section.

As far as I know, there is no way to specify a template for every subsection of a parent section, so each project has to declare to use project.html template. Maybe it's a good thing, as it will allow me to put other content under works/ and differentiate using template?

Sections can't have taxonomies, so I converted taxonomies.craft to extra.crafts.

Because crafts are no longer a taxonomy, I will need to put some extra work to re-createe the automatic linking of projects to crafts. I did a similar thing in Escco website, so it shouldn't be too hard.

similarity index 96%
rename from content/works/agile-planner/index.md
rename to content/works/agile-planner/_index.md
index caf9571..a7f8e54 100644
--- a/content/works/agile-planner/index.md
+++ b/content/works/agile-planner/_index.md
@@ -1,10 +1,11 @@
=---
=title: Agile Planner
=weight: 3
+template: "project.html"
=description: |
=  It exports our schedule from a Markdown document,  to iCalendar format. Markdown is a flexible and lightweight plain text format, ideal for taking notes while planning, while iCalendar is the industry standard for calendaring data.
-taxonomies:
-  craft:
+extra:
+  crafts:
=  - Agile software development
=  - Rust programming language
=  - Collaboration tools
similarity index 93%
rename from content/works/better-tech-club-website/index.md
rename to content/works/better-tech-club-website/_index.md
index 9208182..c85f755 100644
--- a/content/works/better-tech-club-website/index.md
+++ b/content/works/better-tech-club-website/_index.md
@@ -3,8 +3,9 @@ title: Better Tech Club website
=description: |
=    Better Tech Club promotes the use of ethical software and digital services across Europe - free and open-source software (FOSS) solutions that prioritize user privacy, security, and digital independence. It's a network of local, off-line first, autonomous groups. The website serves as a landing page.
=weight: 0
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Web development
=    - No JS
=    - Modern CSS
@@ -29,8 +30,8 @@ Originally launched as "FOSS for Normies," the project was rebranded to Better T
=
=The project utilizes **Nix Flakes** combined with **Devenv** to create a fully isolated and reproducible development environment. This setup guarantees that every contributor works with identical versions of tools, eliminating "it works on my machine" issues. The development environment includes:
=
-*   Miniserve for local previewing of the static site.
- * [TBB](@/works/tad-better-behavior/index.md "Tad Better Behavior") with Babashka (Clojure) interpreter for automated tests.
+  * Miniserve for local previewing of the static site.
+  * [TBB](@/works/tad-better-behavior/_index.md "Tad Better Behavior") with Babashka (Clojure) interpreter for automated tests.
=
=
=## Front-End Practices
similarity index 77%
rename from content/works/bieb-os/index.md
rename to content/works/bieb-os/_index.md
index dd4c5d4..01084e4 100644
--- a/content/works/bieb-os/index.md
+++ b/content/works/bieb-os/_index.md
@@ -1,8 +1,9 @@
=---
=title: BiebOS
=weight: 1
-taxonomies:
-    craft: 
+template: "project.html"
+extra:
+    crafts: 
=    - NixOS
=    - Linux administration
=    - GitOps
similarity index 81%
rename from content/works/devlog-excavator/index.md
rename to content/works/devlog-excavator/_index.md
index 84cd741..a299786 100644
--- a/content/works/devlog-excavator/index.md
+++ b/content/works/devlog-excavator/_index.md
@@ -1,9 +1,10 @@
=---
=title: Devlog Excavator
-weight: 1
+weight: 2
+template: "project.html"
=
-taxonomies:
-    craft: 
+extra:
+    crafts: 
=    - Nu shell scripting
=    - Behavior driven development
=    - Command line
similarity index 81%
rename from content/works/elm-springs/index.md
rename to content/works/elm-springs/_index.md
index f2d1ed9..acfc59b 100644
--- a/content/works/elm-springs/index.md
+++ b/content/works/elm-springs/_index.md
@@ -1,14 +1,15 @@
=---
=title: Elm Springs
=weight: 2
+template: "project.html"
=description: |
=    An Elm package implementing a rough model of a physical mass attached to a spring, as described in physics by Hooke's law. Good for making smooth and organic looking animations or modeling oscillating values (for example emotions).
-taxonomies:
-  craft:
-  - Elm programming language
-  - Physics simulation
-  - Procedural animations
-  - Free / Open source software
+extra:
+    crafts:
+    - Elm programming language
+    - Physics simulation
+    - Procedural animations
+    - Free / Open source software
=---
=
=# Elm Springs
similarity index 95%
rename from content/works/elm-tree-workshop/index.md
rename to content/works/elm-tree-workshop/_index.md
index a8ffd92..58362e5 100644
--- a/content/works/elm-tree-workshop/index.md
+++ b/content/works/elm-tree-workshop/_index.md
@@ -1,10 +1,11 @@
=---
=title: Elm Tree Workshop
=weight: 1
+template: "project.html"
=description: |
=  Get a glimpse into the way software is created. This workshop is intended for people with no prior experience in programming and doesn’t require any technical knowledge. Everyone is welcome!
-taxonomies:
-  craft:
+extra:
+  crafts:
=  - Web development
=  - Education technology
=  - Teaching
similarity index 76%
rename from content/works/erna/index.md
rename to content/works/erna/_index.md
index 584c85c..90d06a1 100644
--- a/content/works/erna/index.md
+++ b/content/works/erna/_index.md
@@ -1,8 +1,9 @@
=---
=title: Erna
=weight: 1
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Typst programming
=    - Graphic design
=---
similarity index 82%
rename from content/works/esc-collective-website/index.md
rename to content/works/esc-collective-website/_index.md
index 4c661e8..0f1e5a8 100644
--- a/content/works/esc-collective-website/index.md
+++ b/content/works/esc-collective-website/_index.md
@@ -1,8 +1,9 @@
=---
=title: Esc Collective website
=weight: 2
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Web development
=    - No JS
=    - Modern CSS
similarity index 96%
rename from content/works/ethtical-software-garden/index.md
rename to content/works/ethtical-software-garden/_index.md
index eccf4b9..4080c67 100644
--- a/content/works/ethtical-software-garden/index.md
+++ b/content/works/ethtical-software-garden/_index.md
@@ -1,11 +1,12 @@
=---
=title: Ethical Software Garden
=weight: 3
+template: "project.html"
=description: |
=    A catalogue of articles, videos, websites and other resources about digital ethics. We use GitLab issues, comments, reactions (up and down votes) and moderation to generate the web content.
=
-taxonomies:
-  craft:
+extra:
+  crafts:
=  - Collaboration
=  - Digital ethics research
=  - Content management systems
similarity index 70%
rename from content/works/joke-as-a-service/index.md
rename to content/works/joke-as-a-service/_index.md
index 1c35d48..3f0c5b5 100644
--- a/content/works/joke-as-a-service/index.md
+++ b/content/works/joke-as-a-service/_index.md
@@ -1,8 +1,9 @@
=---
=title: Joke as a Service
=weight: 2
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Python
=    - REST API
=    - SQLite
similarity index 96%
rename from content/works/lead-studio/index.md
rename to content/works/lead-studio/_index.md
index a9ee6a3..97fa5cc 100644
--- a/content/works/lead-studio/index.md
+++ b/content/works/lead-studio/_index.md
@@ -1,11 +1,12 @@
=---
=title: Lead Studio
=weight: 1
+template: "project.html"
=description: |
=  A software solution to improve sales prospecting performance up to 20 times.
=  
-taxonomies:
-  craft:
+extra:
+  crafts:
=  - Facilitation
=  - Data engineering
=  - Business process automation
similarity index 78%
rename from content/works/otterhide/index.md
rename to content/works/otterhide/_index.md
index 25a6657..99e5584 100644
--- a/content/works/otterhide/index.md
+++ b/content/works/otterhide/_index.md
@@ -1,8 +1,9 @@
=---
=title: Otterhide
=weight: 2
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Rust programming language
=    - Bevy famework
=    - Web Assembly
similarity index 97%
rename from content/works/rest-in-python-course/index.md
rename to content/works/rest-in-python-course/_index.md
index b7b1821..00504ab 100644
--- a/content/works/rest-in-python-course/index.md
+++ b/content/works/rest-in-python-course/_index.md
@@ -4,8 +4,9 @@ description: |
=    A hands-on, interactive training program designed to equip developers with practical expertise in building and consuming RESTful APIs using Python. Delivered through live Jupyter Notebooks, the course covers foundational concepts, like REST constraints, HTTP methods, headers, payloads and status codes, but is delivered as a real-world workshop.
=
=weight: 2
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Python
=    - REST API
=    - Jupyter Notebooks
similarity index 95%
rename from content/works/tad-better-behavior/index.md
rename to content/works/tad-better-behavior/_index.md
index 33f35a2..dbb5ab3 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/_index.md
@@ -1,18 +1,19 @@
=---
=title: Tad Better Behavior
=weight: 0
+template: "project.html"
=description: |
=    TBB is a fresh take on BDD software testing. It lets you write test scenarios in simple and readable Markdown documents and gives you the freedom to evaluate them with any programming language you choose. It's great for testing user facing applications and network APIs.
=
-taxonomies:
-    craft: 
+extra:
+    crafts: 
=    - Rust programming language
=    - Behavior driven development
=    - Command line
=    - Markdown processing
=---
=
- TBB replaces magic and complexity with Unix and simplicity.
+Replace magic and complexity with Unix and simplicity.
=
=
=# Tad Better Behavior
@@ -38,7 +39,7 @@ TBB is inspired by Gauge from Thoughtworks, but aims to be simpler and more flex
=It's relatively easy to port those helpers to other languages and we are always happy to help.
=
=
-# Typical TBB workflow
+## Typical TBB workflow
=
=  * Take free form notes during a client meeting or design session (I use pen and paper, but you can go straight to markdown)
=  * Later structure your notes into <abbrev title="short for specification">spec</abbrev> document(s) with scenarios describing use cases.
similarity index 80%
rename from content/works/tad-lispy-website/index.md
rename to content/works/tad-lispy-website/_index.md
index 05abeae..92bf050 100644
--- a/content/works/tad-lispy-website/index.md
+++ b/content/works/tad-lispy-website/_index.md
@@ -1,8 +1,9 @@
=---
=title: Tad Lispy website
-weight: 0
-taxonomies:
-    craft:
+weight: 1
+template: "project.html"
+extra:
+    crafts:
=    - Web development
=    - No JS
=    - Modern CSS
similarity index 73%
rename from content/works/tad-notes/index.md
rename to content/works/tad-notes/_index.md
index cc5a098..b774435 100644
--- a/content/works/tad-notes/index.md
+++ b/content/works/tad-notes/_index.md
@@ -1,8 +1,9 @@
=---
=title: Tad Notes
=weight: 2
-taxonomies:
-    craft:
+template: "project.html"
+extra:
+    crafts:
=    - Rust programming language
=    - Markdown processing
=    - Command line
similarity index 95%
rename from content/works/word-snake/index.md
rename to content/works/word-snake/_index.md
index 0353434..917f64b 100644
--- a/content/works/word-snake/index.md
+++ b/content/works/word-snake/_index.md
@@ -1,10 +1,11 @@
=---
=title: Word Snake
=weight: 2
+template: "project.html"
=description: 
=    Think fast - guess a password, collect letters and save the snake from a fire trap! In this simple word puzzle game you control a snake while guessing a password.
-taxonomies:
-  craft:
+extra:
+  crafts:
=  - Game development
=  - Web development
=  - Education technology
index 6dd99d7..f44074a 100644
--- a/templates/works.html
+++ b/templates/works.html
@@ -26,16 +26,17 @@
=    {{ section.content | safe }}
=
=    <section id="featured-projects">
-        {% for project in section.pages %}
+        {% for project in section.subsections %}
+        {% set project = get_section(path=project) %}
=        <article>
=            <h2>{{ project.title }}</h2>
+            {{ project.description | default(value="") | markdown() | safe }}
=            <ul class="craft-list">
-                {% for craft in project.taxonomies | get(key="craft", default=[]) %}
+                {% for craft in project.extra.crafts %}
=
-                <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
+                <li>{{ craft }}</li>
=                {% endfor %}
=            </ul>
-            {{ project.description | default(value="") | markdown() | safe }}
=            <p><a href="{{ project.path }}">Read more about {{ project.title }}</a> </p>
=        </article>
=        {% endfor %}

Create a new template for devlog entries

On by Tad Lispy

Featuring:

index 206c6a6..1f247da 100644
--- a/content/works/_index.md
+++ b/content/works/_index.md
@@ -2,7 +2,7 @@
=title: "Tad Works"
=sort_by: "weight"
=template: "works.html"
-page_template: "project.html"
+page_template: "devlog-entry.html"
=description: "I'm a software developer, trainer and coach with over 15 years of experience. Over those years I worked for many organizations, large and small. Check out some of my open-source projects and satisfied client testimonials."
=---
=
new file mode 100644
index 0000000..b9b3d18
--- /dev/null
+++ b/templates/devlog-entry.html
@@ -0,0 +1,74 @@
+{% extends "base.html" %}
+
+{% import "components.html" as components %}
+
+{% block variables %}
+{{ super() }}
+{% set page_class  = "devlog-entry" %}
+{% set project = get_section(path=page.ancestors | last) %}
+{% set title = page.title | markdown(inline=true) | striptags %}
+{% if page.description %}
+{# TODO: Why can't I do this with a chain of default filters? #}
+{% set description = page.description %}
+{% elif page.summary %}
+{% set description = page.summary | striptags %}
+{% else %}
+{% set description = "Development log of " ~ project.title ~ " for week " ~ page.extra.week ~ " of " ~ page.extra.year %}
+{% endif %}
+{% endblock variables %}
+
+
+{% block head_extra %}
+<meta property="og:type" content="article">
+<meta property="og:url" content="{{ page.permalink }}">
+<meta property="og:description" content="{{ description }}">
+<meta property="og:image" content="{{ get_url(path='tad-lispy-centered.png') }}">
+{% endblock head_extra %}
+
+{% block content %}
+
+
+<header>
+    <nav aria-label="breadcrumb">
+        <ul>
+            <li><a href="{{ get_url(path='@/_index.md') }}">Tad Lispy</a></li>
+            <li><a href="{{ get_url(path='@/works/_index.md') }}">Works</a></li>
+            <li><a href="{{ project.permalink }}">{{ project.title }}</a></li>
+            <li>
+                <strong>
+                    <time datetime="{{ page.extra.iso_week }}">
+                        {{ page.extra.iso_week }}
+                    </time>
+                </strong>
+            </li>
+        </ul>
+    </nav>
+</header>
+
+<main>
+    <hgroup>
+        <h1>
+            Week {{ page.extra.week }} of {{ page.extra.year }}
+        </h1>
+        <p>Development log of {{ project.title }}</p>
+    </hgroup>
+
+    {% if page.toc | length > 1 %}
+    <details class="toc">
+        <summary>{{ page.toc | length }} items</summary>
+        <ol>
+            {% for item in page.toc %}
+            <li>
+                <a href="{{ item.permalink }}">{{ item.title }}</a>
+            </li>
+            {% endfor %}
+        </ol>
+    </details>
+    {% endif %}
+
+    {% set unescaped = components::unescape(body=page.content) %}
+    {{- components::demote_headings (content=unescaped, levels=1) | safe -}}
+</main>
+
+{% include "includes/footer.html" %}
+{% endblock content %}
index 43da93b..46b674f 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -33,18 +33,19 @@
=
=    {{ section.content | safe }}
=
-    {% if section.pages %}
-    {% set latest_entry = section.pages | first %}
+    {% set entries = section.pages | sort(attribute="extra.iso_week") | reverse %}
=
+    {% if entries %}
+    {% set latest_entry = entries | first %}
=    <hgroup>
=        <h2>Latest developments</h2>
=        <p>
=            from
=            <time datetime="{{ latest_entry.extra.iso_week }}">
-                the week of {{ latest_entry.extra.last_day | date(format="%A, %F") }}
-            </time>.
+                the week of {{ latest_entry.extra.last_day | date(format="%F") }}
+            </time>
=        {% if section.pages | length > 1 %}
-            <a href="#devlog-entries">See older</a>.
+            <a href="#devlog-entries">see older</a>.
=        {% endif %}
=        </p>
=    </hgroup>
@@ -55,14 +56,16 @@
=    </section>
=    {% endif %}
=
+    {% if section.pages | length > 1 %}
=    <h2 id="devlog-entries">Older Devlog Entries</h2>
=    <ul>
-        {% for entry in section.pages %}
+        {% for entry in entries %}
=        <li class="devlog-entry">
=            <a href="{{ entry.permalink }}">{{ entry.title }}</a>
=        </section>
=        {% endfor %}
=    </ul>
+    {% endif %}
=</main>
=
={% include "includes/footer.html" %}