Week 17 of 2026

Development log of Tad Lispy website

22 items
  1. Present devlogs in reverse chronological order
  2. Update Nix dependencies
  3. Introduce craft taxonomy for projects
  4. Create two featured project pages
  5. List crafts for all projects in front matter
  6. Implement the unescape macro for Devlog entries
  7. Excavat devlog of the Elm Tree workshop
  8. Excavate more of the TBB devlog
  9. Excavate latest entries from the devlog excavator
  10. Describe (stub) more projects and excavate devlogs
  11. Disable global RSS and Atom feeds
  12. Don't break RSS and Atom subscribers
  13. Correctly escape closing Tera delimiter \%}
  14. Standardize the crafts taxonomy terms
  15. Describe the TBB project
  16. Move crafts list to the header of a project
  17. Write a short description of TBB for HTML meta
  18. Describe the REST in Python course
  19. Extract description from Agile Plan Exporter page
  20. Extract descriptions from several projects
  21. Describe the Better Tech Club website project
  22. Devlog: Prevent vertical overflow of inline SVGs

Present devlogs in reverse chronological order

On by Tad Lispy

So latest entries first. I think it makes more sense that way, so readers can easily see what happened recently. Otherwise they would have to scroll through a lot of historical entries.

index d80af22..f75a753 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -28,7 +28,7 @@
=    {# NOTE: If there is no devlog, then the heading will be hidden using CSS #}
=    <h2 id="devlog-heading">Devlog</h2>
=
-    {% for entry in devlog.pages %}
+    {% 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>

Update Nix dependencies

On by Tad Lispy

index 03cb250..4cee253 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
=    },
=    "nixpkgs": {
=      "locked": {
-        "lastModified": 1775036866,
-        "narHash": "sha256-ZojAnPuCdy657PbTq5V0Y+AHKhZAIwSIT2cb8UgAz/U=",
+        "lastModified": 1776169885,
+        "narHash": "sha256-l/iNYDZ4bGOAFQY2q8y5OAfBBtrDAaPuRQqWaFHVRXM=",
=        "owner": "NixOS",
=        "repo": "nixpkgs",
-        "rev": "6201e203d09599479a3b3450ed24fa81537ebc4e",
+        "rev": "4bd9165a9165d7b5e33ae57f3eecbcb28fb231c9",
=        "type": "github"
=      },
=      "original": {

Introduce craft taxonomy for projects

On by Tad Lispy

I want to highlight the crafts (like programming languages, frameworks, methodologies, tools and techniques) applied to each project. In Zola this is best expressed using taxonomies.

Each craft is listed in the project card and dedicated page. There is also a crafts list page under /crafts/ and each craft has a page listing projects it's applied to.

index e276ece..56a70c8 100644
--- a/config.toml
+++ b/config.toml
@@ -14,6 +14,10 @@ build_search_index = true
=generate_feeds = true
=feed_filenames = ["atom.xml", "rss.xml"]
=
+taxonomies = [
+    { name = "craft", render = true }
+]
+
=[markdown]
=bottom_footnotes = false
=
index f55c819..fe4f05e 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -1,6 +1,12 @@
=---
=title: Tad Better Behavior
=weight: 0
+
+taxonomies:
+    craft: 
+    - Rust
+    - Behavior Driven Development
+    - Command Line Tools
=---
=
=# TBB: Tad Better Behavior
new file mode 100644
index 0000000..59464a7
--- /dev/null
+++ b/templates/craft/list.html
@@ -0,0 +1,43 @@
+{% extends "base.html" %}
+
+{% block variables %}
+{{ super() }}
+{% set page_class  = "taxonomy crafts" %}
+{% set title = "Tad Crafts" %}
+{% set description = "Technologies, methods, techniques and skills I cultivate in my work." %}
+{% endblock variables %}
+
+{% block content %}
+<header>
+    <nav aria-label="breadcrumb">
+        <ul>
+            <li><a href="{{ get_url(path='@/_index.md') }}">Tad Lispy</a></li>
+            <li><strong>Crafts</strong></li>
+        </ul>
+    </nav>
+</header>
+
+<main>
+
+    <p>In my work I proudly cultivate the following crafts.</p>
+
+    {% for craft in terms %}
+    <article class="craft-card">
+        <p><a href="{{ craft.path }}">{{ craft.name }}</a></p>
+        <p>
+            Practiced in {{ craft.pages | length }} featured
+            {{ craft.pages | length | pluralize(singular="project", plural="project")}}:
+
+            {% for project in craft.pages %}
+            <a href="{{ project.path }}">{{ project.title }}</a>
+            {% endfor %}
+        </p>
+
+    </article>
+    {% endfor %}
+
+</main>
+
+{% include "includes/footer.html" %}
+{% endblock content %}
+
new file mode 100644
index 0000000..3977306
--- /dev/null
+++ b/templates/craft/single.html
@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+
+{% block variables %}
+{{ super() }}
+{% set page_class  = "taxonomy crafts" %}
+{% set title = term.name %}
+{% set description = "It's a craft." %}
+{% endblock variables %}
+
+{% 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='/craft/') }}">Crafts</a></li>
+            <li><strong>{{ term.name }}</strong></li>
+        </ul>
+    </nav>
+</header>
+
+<main>
+
+    <p>
+        Practiced in {{ term.pages | length }} featured
+        {{ term.pages | length | pluralize(singular="project", plural="project")}}.
+    </p>
+    
+    {% for project in term.pages %}
+        <article>
+            <h2>{{ project.title }}</h2>
+            <p><a href="{{ project.path }}">Read more about {{ project.title }}</a> </p>
+        </article>
+    {% endfor %}
+
+</main>
+
+{% include "includes/footer.html" %}
+{% endblock content %}
+
index f75a753..eccccad 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -25,6 +25,13 @@
=
=    {{ page.content | safe }}
=
+    <ul class="craft-list">
+        {% for craft in page.taxonomies | get(key="craft", default=[]) %}
+
+        <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
+        {% endfor %}
+    </ul>
+
=    {# NOTE: If there is no devlog, then the heading will be hidden using CSS #}
=    <h2 id="devlog-heading">Devlog</h2>
=
index ec1694f..49b18af 100644
--- a/templates/works.html
+++ b/templates/works.html
@@ -29,6 +29,12 @@
=        {% for project in section.pages %}
=        <article>
=            <h2>{{ project.title }}</h2>
+            <ul class="craft-list">
+                {% for craft in project.taxonomies | get(key="craft", default=[]) %}
+
+                <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
+                {% endfor %}
+            </ul>
=            <p><a href="{{ project.path }}">Read more about {{ project.title }}</a> </p>
=        </article>
=        {% endfor %}

On by Tad Lispy

At this moment I mainly want to see how the new taxonomy will work with multiple projects. There are already some devlog entries for them, and they share some crafts, so these are good candidates to add. Later I'll list many more projects.

And of course as soon as I added them, I found a bug in pluralization :P

new file mode 100644
index 0000000..35bfae2
--- /dev/null
+++ b/content/works/better-tech-club-website/index.md
@@ -0,0 +1,15 @@
+---
+title: Better Tech Club website
+weight: 1
+taxonomies:
+    craft:
+    - Web Development
+    - No JS
+    - Modern CSS
+    - Handcrafted HTML
+    - Graphic Design
+---
+
+# Better Tech Club website
+
+<https://bettertechclub.eu>
new file mode 100644
index 0000000..fe5fdff
--- /dev/null
+++ b/content/works/devlog-excavator/index.md
@@ -0,0 +1,16 @@
+---
+title: Devlog Excavator
+weight: 1
+
+taxonomies:
+    craft: 
+    - Nushell
+    - Behavior Driven Development
+    - Command Line Tools
+    - Markdown processing
+---
+
+# Devlog Excavator
+
+I use it to excavate the content below, and in other projects listed on this site.
+
index fe4f05e..aa74ada 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -7,6 +7,7 @@ taxonomies:
=    - Rust
=    - Behavior Driven Development
=    - Command Line Tools
+    - Markdown processing
=---
=
=# TBB: Tad Better Behavior
index 59464a7..c506e7a 100644
--- a/templates/craft/list.html
+++ b/templates/craft/list.html
@@ -26,7 +26,7 @@
=        <p><a href="{{ craft.path }}">{{ craft.name }}</a></p>
=        <p>
=            Practiced in {{ craft.pages | length }} featured
-            {{ craft.pages | length | pluralize(singular="project", plural="project")}}:
+            {{ craft.pages | length | pluralize(singular="project", plural="projects")}}:
=
=            {% for project in craft.pages %}
=            <a href="{{ project.path }}">{{ project.title }}</a>
index 3977306..67ab0de 100644
--- a/templates/craft/single.html
+++ b/templates/craft/single.html
@@ -22,7 +22,7 @@
=
=    <p>
=        Practiced in {{ term.pages | length }} featured
-        {{ term.pages | length | pluralize(singular="project", plural="project")}}.
+        {{ term.pages | length | pluralize(singular="project", plural="projects")}}.
=    </p>
=    
=    {% for project in term.pages %}

List crafts for all projects in front matter

On by Tad Lispy

Some of them had crafts listed in content. Others didn't have them at all. Some of the items aren't really crafts, but more like features or categories of software. Later I'll sort it out with different taxonomies or something. But for now it's an improvement.

index cb5136c..c406ab7 100644
--- a/content/works/agile-planner/index.md
+++ b/content/works/agile-planner/index.md
@@ -1,17 +1,19 @@
=---
=title: Agile Planner
=weight: 3
+taxonomies:
+  craft:
+  - Agile software development
+  - Rust programming
+  - Collaboration software
+  - Free / Open source software
+  - Markdown processing
+  - iCalendar processing
=---
=
=
=# Agile Plan Exporter
=
-  - agile software development
-  - Rust programming
-  - collaboration
-  - free / open source software
-  - markdown processing
-  - iCalendar 
=
=At Software Garden we attempted to create a work environment where we can be efficient and happy at the same time. Part of it was agile planning - a simple and collaborative process where everyone had a chance to catch up with all the latest developments and choose the priorities they will work on. To facilitate it, we created several tools, including this one. 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. This enabled  every team member to synchronize their personal calendars with our shared plan! 
=
deleted file mode 100644
index 154cb72..0000000
--- a/content/works/ehtical-software-garden/elm-tree-worksho/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Elm Tree Workshop
-weight: 2
----
-
-# Elm Tree Workshop
-
-  - teaching
-  - Elm programming
-  - web development
-
-A workshop that will give you a glimpse into the way software is created. It is intended for people with no prior experience in programming and doesn’t require any technical knowledge. Everybody is welcome! During this 5 days workshop (3 hours each day) you will learn to solve problems using a functional programming language. Together, we will build a program that simulates growth of a tree. In 2019 the workshop was presented to students of Utrecht University.
-
-[Visit the website](https://elm-tree.software.garden/)
index bc59274..d683a4c 100644
--- a/content/works/elm-springs/index.md
+++ b/content/works/elm-springs/index.md
@@ -1,15 +1,16 @@
=---
=title: Elm Springs
=weight: 2
+taxonomies:
+  craft:
+  - Elm programming
+  - Physics simulation
+  - Procedural animations
+  - Free / Open source software
=---
=
=# Elm Springs
=
-  - Elm programming
-  - physics simulation
-  - animations
-  - free / open source software
-
=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). High physical accuracy is not a priority - performance and API simplicity is more important.
=
=[See the package](https://package.elm-lang.org/packages/tad-lispy/springs/latest/).
similarity index 80%
rename from content/works/elm-tree-worksho/index.md
rename to content/works/elm-tree-workshop/index.md
index 154cb72..967c096 100644
--- a/content/works/elm-tree-worksho/index.md
+++ b/content/works/elm-tree-workshop/index.md
@@ -1,6 +1,13 @@
=---
=title: Elm Tree Workshop
-weight: 2
+weight: 1
+taxonomies:
+  craft:
+  - Web development
+  - Education technology
+  - Elm programming
+  - Procedural animation
+  - Free / Open source software
=---
=
=# Elm Tree Workshop
similarity index 84%
rename from content/works/ehtical-software-garden/index.md
rename to content/works/ethtical-software-garden/index.md
index 8812b5b..202921a 100644
--- a/content/works/ehtical-software-garden/index.md
+++ b/content/works/ethtical-software-garden/index.md
@@ -1,18 +1,18 @@
=---
=title: Ethical Software Garden
=weight: 3
+taxonomies:
+  craft:
+  - Collaboration
+  - Digital ethics research
+  - Content Management Systems
+  - GitLab API
+  - Free / Open source software
+  - GraphQL
=---
=
=# Ethical Software Garden
=
-  - collaboration
-  - digital ethics
-  - CMS
-  - GitLab API
-  - free / open source software
-  - GraphQL
-  
-
=After taking part in the Offsite Sustainability meetup hosted by [Railslove](https://railslove.com/) we realized that resources about digital ethics are very scattered. This website uses our GitLab GraphQL API and Elm Pages static site generator to produce a catalogue of articles, videos, websites etc. about digital ethics. The idea is to use GitLab issues, comments, reactions (up and down votes) and moderation to generate web content. The webpage is re-generated daily in a CI/CD pipeline for fast loading, but the content is also loaded live.
=
=[See the catalogue](https://ethical.software.garden/)
index b7a52b8..bc34395 100644
--- a/content/works/lead-studio/index.md
+++ b/content/works/lead-studio/index.md
@@ -1,19 +1,21 @@
=---
=title: Lead Studio
=weight: 1
----
-
-# Lead Studio
-
-  - data engineering
-  - business process automation
-  - web extensions
-  - user experience
-  - internal tooling
+taxonomies:
+  craft:
+  - Data engineering
+  - Business process automation
+  - Web extensions
+  - User experience
+  - Internal tooling
=  - LinkedIn Sales Navigator
=  - Google Cloud
=  - Elm programming
=  - JavaScript programming
+---
+
+# Lead Studio
+
=
=In 2021, we promised our client, Saleslift Studio, to deliver a working software solution to improve prospecting performance within a fixed time and at a fixed price. In just 6 weeks (a single development cycle), we provided them with a useful solution - Lead Studio. Further incremental development enabled them to improve a number of key performance indicators. Thanks to their partnership with Software Garden, prospecting specialists at Saleslift Studio are now able to enrich leads 20⨉ faster than before.
=
index aa74ada..f4bbb9a 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -6,7 +6,7 @@ taxonomies:
=    craft: 
=    - Rust
=    - Behavior Driven Development
-    - Command Line Tools
+    - Command Line Tools development
=    - Markdown processing
=---
=
index 431d6d1..c3d1fbc 100644
--- a/content/works/word-snake/index.md
+++ b/content/works/word-snake/index.md
@@ -1,14 +1,16 @@
=---
=title: Word Snake
=weight: 2
+taxonomies:
+  craft:
+  - Game development
+  - web development
+  - Education technology
+  - Elm programming
=---
=
=# Word Snake
=
-  - game development
-  - web development
-  - education technology
-  - Elm programming
=
=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. Challenges are designed to let players learn various facts about the world or improve their arithmetic and logical thinking while playing. It's extra fun to play in a group on a phone or a tablet - one player controls the snake while others help to guess the password. It can be a nice family exercise that brings people together.
=

Implement the unescape macro for Devlog entries

On by Tad Lispy

Sometimes I have Zola shortcodes in content, either in a code block, or in prose, but it's not for Zola to process, but a fragment of "foreign" code that I want to display verbatim. I can't find a reliable way to do that. I wish there was a parameter to the markdown filter to disable shortcodes. Something like:

content | markdown(shortcodes=false)

But there's no such thing. There is the {{/* shortcode() */}} trick, but it's flaky. For example, {{/* not_a_shortcode */}} would print the slashes and stars. Also the trick doesn't work for shortcodes with bodies (they use the {% and %} delimiters and I don't know how to escape it). For Devlog Excavator I need a straight forward system to escape those sequences (in diffs and prose).

So as a workaround, in excavated markdown content I escape part of the delimiters (inner curly or percent) with a backslash. This makes the code meaningless to Zola. Then using the new unescape macro I remove the slashes, but only after rendering to HTML. This can potentially break syntax highlighting, but I can always be used selectively.

If there is ever a literal sequence of slash followed by curly or percent, I just need to add another slash in front of it and it should be fine.

index 8184f40..c7d5e6e 100644
--- a/templates/components.html
+++ b/templates/components.html
@@ -14,3 +14,24 @@
=  {% endfor %}
=  {{ demoted | safe }}
={% endmacro table_of_contents %}
+
+{% macro unescape(body) %}
+{# This is a hack.
+
+Remove slashes from escaped Zola delimiters. Useful to display Zola templates on
+this website without triggering Zola to interpret them.
+
+If there is ever a literal sequence of slash followed by curly or percent, just
+add another slash in front of it and it should be fine.
+
+#}
+
+{{ 
+    body
+    | markdown()
+    | replace(from="{{", to="{{")
+    | replace(from="\}}", to="}}")
+    | replace(from="{%", to="{%")
+    | replace(from="\%}", to="%}")
+}}
+{% endmacro unescape %}
index eccccad..7e9b2d6 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -40,9 +40,8 @@
=    <section class="devlog-entry">
=        <h3><time datetime="{{ entry.date }}">{{ entry.date | date(format="%A, %F")}}</time></h3>
=
-        {{- components::demote_headings (content=entry.content, levels=3)
-        | safe
-        -}}
+        {% set unescaped = components::unescape(body=entry.content) %}
+        {{- components::demote_headings (content=unescaped, levels=3) | safe -}}
=    </section>
=    {% endif %}
=    {% endfor %}

Excavat devlog of the Elm Tree workshop

On by Tad Lispy

new file mode 100644
index 0000000..537e0e4
Binary files /dev/null and b/content/devlog/2018-10-22-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f92f695
Binary files /dev/null and b/content/devlog/2018-10-23-elm-tree-workshop.md differ
new file mode 100644
index 0000000..6ab1342
Binary files /dev/null and b/content/devlog/2018-10-24-elm-tree-workshop.md differ
new file mode 100644
index 0000000..17f375f
Binary files /dev/null and b/content/devlog/2018-10-25-elm-tree-workshop.md differ
new file mode 100644
index 0000000..1278ccb
Binary files /dev/null and b/content/devlog/2018-10-29-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f5e6752
Binary files /dev/null and b/content/devlog/2018-10-30-elm-tree-workshop.md differ
new file mode 100644
index 0000000..03de9f2
Binary files /dev/null and b/content/devlog/2018-11-01-elm-tree-workshop.md differ
new file mode 100644
index 0000000..5ab7a8f
Binary files /dev/null and b/content/devlog/2018-11-12-elm-tree-workshop.md differ
new file mode 100644
index 0000000..e8bb256
Binary files /dev/null and b/content/devlog/2018-11-13-elm-tree-workshop.md differ
new file mode 100644
index 0000000..80115c8
Binary files /dev/null and b/content/devlog/2018-11-15-elm-tree-workshop.md differ
new file mode 100644
index 0000000..664b557
Binary files /dev/null and b/content/devlog/2018-11-19-elm-tree-workshop.md differ
new file mode 100644
index 0000000..fb2fd54
Binary files /dev/null and b/content/devlog/2018-11-20-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f4c5e55
Binary files /dev/null and b/content/devlog/2018-11-21-elm-tree-workshop.md differ
new file mode 100644
index 0000000..ab103f3
Binary files /dev/null and b/content/devlog/2018-11-22-elm-tree-workshop.md differ
new file mode 100644
index 0000000..4b65ce5
Binary files /dev/null and b/content/devlog/2018-11-23-elm-tree-workshop.md differ
new file mode 100644
index 0000000..4a45f59
Binary files /dev/null and b/content/devlog/2018-11-27-elm-tree-workshop.md differ
new file mode 100644
index 0000000..55f29c6
Binary files /dev/null and b/content/devlog/2018-11-28-elm-tree-workshop.md differ
new file mode 100644
index 0000000..300922e
Binary files /dev/null and b/content/devlog/2018-11-29-elm-tree-workshop.md differ
new file mode 100644
index 0000000..2ed43f7
Binary files /dev/null and b/content/devlog/2018-12-03-elm-tree-workshop.md differ
new file mode 100644
index 0000000..e422b16
Binary files /dev/null and b/content/devlog/2018-12-04-elm-tree-workshop.md differ
new file mode 100644
index 0000000..884427a
Binary files /dev/null and b/content/devlog/2018-12-05-elm-tree-workshop.md differ
new file mode 100644
index 0000000..1f6ab25
Binary files /dev/null and b/content/devlog/2018-12-11-elm-tree-workshop.md differ
new file mode 100644
index 0000000..9eaf8af
Binary files /dev/null and b/content/devlog/2018-12-13-elm-tree-workshop.md differ
new file mode 100644
index 0000000..caec6c9
Binary files /dev/null and b/content/devlog/2018-12-14-elm-tree-workshop.md differ
new file mode 100644
index 0000000..cdba38f
Binary files /dev/null and b/content/devlog/2018-12-16-elm-tree-workshop.md differ
new file mode 100644
index 0000000..83a52e3
Binary files /dev/null and b/content/devlog/2018-12-18-elm-tree-workshop.md differ
new file mode 100644
index 0000000..b1bf6d0
Binary files /dev/null and b/content/devlog/2018-12-19-elm-tree-workshop.md differ
new file mode 100644
index 0000000..210583f
Binary files /dev/null and b/content/devlog/2018-12-20-elm-tree-workshop.md differ
new file mode 100644
index 0000000..278b1d8
Binary files /dev/null and b/content/devlog/2018-12-21-elm-tree-workshop.md differ
new file mode 100644
index 0000000..602dc82
Binary files /dev/null and b/content/devlog/2018-12-23-elm-tree-workshop.md differ
new file mode 100644
index 0000000..dcec09c
Binary files /dev/null and b/content/devlog/2018-12-24-elm-tree-workshop.md differ
new file mode 100644
index 0000000..9d92221
Binary files /dev/null and b/content/devlog/2018-12-28-elm-tree-workshop.md differ
new file mode 100644
index 0000000..dad25f4
Binary files /dev/null and b/content/devlog/2019-01-02-elm-tree-workshop.md differ
new file mode 100644
index 0000000..58ad4c9
Binary files /dev/null and b/content/devlog/2019-01-03-elm-tree-workshop.md differ
new file mode 100644
index 0000000..67e4b0c
Binary files /dev/null and b/content/devlog/2019-01-04-elm-tree-workshop.md differ
new file mode 100644
index 0000000..b5e1129
Binary files /dev/null and b/content/devlog/2019-01-07-elm-tree-workshop.md differ
new file mode 100644
index 0000000..d16582b
Binary files /dev/null and b/content/devlog/2019-01-08-elm-tree-workshop.md differ
new file mode 100644
index 0000000..d84c4fa
Binary files /dev/null and b/content/devlog/2019-01-09-elm-tree-workshop.md differ
new file mode 100644
index 0000000..3ad4f68
Binary files /dev/null and b/content/devlog/2019-01-10-elm-tree-workshop.md differ
new file mode 100644
index 0000000..94af5ea
Binary files /dev/null and b/content/devlog/2019-01-11-elm-tree-workshop.md differ
new file mode 100644
index 0000000..3c7c6e6
Binary files /dev/null and b/content/devlog/2019-01-14-elm-tree-workshop.md differ
new file mode 100644
index 0000000..00ee2c5
Binary files /dev/null and b/content/devlog/2019-01-15-elm-tree-workshop.md differ
new file mode 100644
index 0000000..aaf7efd
Binary files /dev/null and b/content/devlog/2019-01-16-elm-tree-workshop.md differ
new file mode 100644
index 0000000..37cf88f
Binary files /dev/null and b/content/devlog/2019-01-17-elm-tree-workshop.md differ
new file mode 100644
index 0000000..aa04d19
Binary files /dev/null and b/content/devlog/2019-01-18-elm-tree-workshop.md differ
new file mode 100644
index 0000000..c3110af
Binary files /dev/null and b/content/devlog/2019-01-20-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f7c9a19
Binary files /dev/null and b/content/devlog/2019-01-21-elm-tree-workshop.md differ
new file mode 100644
index 0000000..2a9ba96
Binary files /dev/null and b/content/devlog/2019-01-22-elm-tree-workshop.md differ
new file mode 100644
index 0000000..0d959c0
Binary files /dev/null and b/content/devlog/2019-01-23-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f906e5f
Binary files /dev/null and b/content/devlog/2019-01-24-elm-tree-workshop.md differ
new file mode 100644
index 0000000..2a8f80c
Binary files /dev/null and b/content/devlog/2019-01-25-elm-tree-workshop.md differ
new file mode 100644
index 0000000..98f583e
Binary files /dev/null and b/content/devlog/2019-01-27-elm-tree-workshop.md differ
new file mode 100644
index 0000000..c82c38b
Binary files /dev/null and b/content/devlog/2019-01-30-elm-tree-workshop.md differ
new file mode 100644
index 0000000..5644869
Binary files /dev/null and b/content/devlog/2019-01-31-elm-tree-workshop.md differ
new file mode 100644
index 0000000..09b08e3
Binary files /dev/null and b/content/devlog/2019-02-01-elm-tree-workshop.md differ
new file mode 100644
index 0000000..bf9e938
Binary files /dev/null and b/content/devlog/2019-02-04-elm-tree-workshop.md differ
new file mode 100644
index 0000000..b8fba72
Binary files /dev/null and b/content/devlog/2019-02-05-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f8fbd07
Binary files /dev/null and b/content/devlog/2019-02-08-elm-tree-workshop.md differ
new file mode 100644
index 0000000..fc488a5
Binary files /dev/null and b/content/devlog/2019-02-10-elm-tree-workshop.md differ
new file mode 100644
index 0000000..881edc8
Binary files /dev/null and b/content/devlog/2019-02-11-elm-tree-workshop.md differ
new file mode 100644
index 0000000..eab07df
Binary files /dev/null and b/content/devlog/2019-02-12-elm-tree-workshop.md differ
new file mode 100644
index 0000000..0f8d4cf
Binary files /dev/null and b/content/devlog/2019-02-14-elm-tree-workshop.md differ
new file mode 100644
index 0000000..ba75bf6
Binary files /dev/null and b/content/devlog/2019-02-18-elm-tree-workshop.md differ
new file mode 100644
index 0000000..9f52ffa
Binary files /dev/null and b/content/devlog/2019-02-20-elm-tree-workshop.md differ
new file mode 100644
index 0000000..b97852c
Binary files /dev/null and b/content/devlog/2019-02-21-elm-tree-workshop.md differ
new file mode 100644
index 0000000..6ce4c9e
Binary files /dev/null and b/content/devlog/2019-02-22-elm-tree-workshop.md differ
new file mode 100644
index 0000000..fb7ab64
Binary files /dev/null and b/content/devlog/2019-02-25-elm-tree-workshop.md differ
new file mode 100644
index 0000000..130821e
Binary files /dev/null and b/content/devlog/2019-02-26-elm-tree-workshop.md differ
new file mode 100644
index 0000000..fcf3382
Binary files /dev/null and b/content/devlog/2019-02-27-elm-tree-workshop.md differ
new file mode 100644
index 0000000..45221d1
Binary files /dev/null and b/content/devlog/2019-03-03-elm-tree-workshop.md differ
new file mode 100644
index 0000000..85b7d7b
Binary files /dev/null and b/content/devlog/2019-03-06-elm-tree-workshop.md differ
new file mode 100644
index 0000000..8903bd4
Binary files /dev/null and b/content/devlog/2019-03-13-elm-tree-workshop.md differ
new file mode 100644
index 0000000..1060f4e
Binary files /dev/null and b/content/devlog/2019-03-17-elm-tree-workshop.md differ
new file mode 100644
index 0000000..f88d521
Binary files /dev/null and b/content/devlog/2019-03-23-elm-tree-workshop.md differ
new file mode 100644
index 0000000..e70aeab
Binary files /dev/null and b/content/devlog/2019-03-26-elm-tree-workshop.md differ
new file mode 100644
index 0000000..5bdaf9f
Binary files /dev/null and b/content/devlog/2019-04-02-elm-tree-workshop.md differ
new file mode 100644
index 0000000..ab0a0b9
Binary files /dev/null and b/content/devlog/2019-04-04-elm-tree-workshop.md differ
new file mode 100644
index 0000000..fcbe31f
Binary files /dev/null and b/content/devlog/2019-05-04-elm-tree-workshop.md differ
new file mode 100644
index 0000000..d653559
Binary files /dev/null and b/content/devlog/2019-05-09-elm-tree-workshop.md differ
new file mode 100644
index 0000000..7244d2e
Binary files /dev/null and b/content/devlog/2019-06-12-elm-tree-workshop.md differ
new file mode 100644
index 0000000..5dbb244
Binary files /dev/null and b/content/devlog/2019-07-28-elm-tree-workshop.md differ
new file mode 100644
index 0000000..8f5f2f7
Binary files /dev/null and b/content/devlog/2019-11-03-elm-tree-workshop.md differ
new file mode 100644
index 0000000..a640221
Binary files /dev/null and b/content/devlog/2020-05-12-elm-tree-workshop.md differ
new file mode 100644
index 0000000..0cc9cf3
Binary files /dev/null and b/content/devlog/2020-10-07-elm-tree-workshop.md differ
new file mode 100644
index 0000000..1c1001f
Binary files /dev/null and b/content/devlog/2021-02-21-elm-tree-workshop.md differ
new file mode 100644
index 0000000..e8e6630
Binary files /dev/null and b/content/devlog/2021-03-05-elm-tree-workshop.md differ
new file mode 100644
index 0000000..069f959
Binary files /dev/null and b/content/devlog/2022-04-07-elm-tree-workshop.md differ
new file mode 100644
index 0000000..b075a26
Binary files /dev/null and b/content/devlog/2025-07-01-elm-tree-workshop.md differ
new file mode 100644
index 0000000..80bfa03
Binary files /dev/null and b/content/devlog/2025-10-07-elm-tree-workshop.md differ

Excavate more of the TBB devlog

On by Tad Lispy

new file mode 100644
index 0000000..17a37e1
Binary files /dev/null and b/content/devlog/2025-11-13-tad-better-behavior.md differ
new file mode 100644
index 0000000..92c8833
Binary files /dev/null and b/content/devlog/2025-11-14-tad-better-behavior.md differ
new file mode 100644
index 0000000..52a1995
Binary files /dev/null and b/content/devlog/2025-11-15-tad-better-behavior.md differ
new file mode 100644
index 0000000..5114f05
Binary files /dev/null and b/content/devlog/2025-11-17-tad-better-behavior.md differ
new file mode 100644
index 0000000..2399a1f
Binary files /dev/null and b/content/devlog/2025-11-18-tad-better-behavior.md differ
new file mode 100644
index 0000000..90a5fa8
Binary files /dev/null and b/content/devlog/2025-11-20-tad-better-behavior.md differ
new file mode 100644
index 0000000..cb4fc3c
Binary files /dev/null and b/content/devlog/2025-11-21-tad-better-behavior.md differ
new file mode 100644
index 0000000..29c502e
Binary files /dev/null and b/content/devlog/2025-11-22-tad-better-behavior.md differ
new file mode 100644
index 0000000..fd70422
Binary files /dev/null and b/content/devlog/2025-11-24-tad-better-behavior.md differ
new file mode 100644
index 0000000..26a34c2
Binary files /dev/null and b/content/devlog/2025-11-25-tad-better-behavior.md differ
new file mode 100644
index 0000000..6a55b26
Binary files /dev/null and b/content/devlog/2025-11-26-tad-better-behavior.md differ
new file mode 100644
index 0000000..03a7464
Binary files /dev/null and b/content/devlog/2025-11-27-tad-better-behavior.md differ
new file mode 100644
index 0000000..d264a40
Binary files /dev/null and b/content/devlog/2025-11-28-tad-better-behavior.md differ
new file mode 100644
index 0000000..cb441ab
Binary files /dev/null and b/content/devlog/2025-11-29-tad-better-behavior.md differ
new file mode 100644
index 0000000..90d9158
Binary files /dev/null and b/content/devlog/2025-12-01-tad-better-behavior.md differ
new file mode 100644
index 0000000..0ed7dcb
Binary files /dev/null and b/content/devlog/2025-12-02-tad-better-behavior.md differ
new file mode 100644
index 0000000..5fe0fe5
Binary files /dev/null and b/content/devlog/2025-12-05-tad-better-behavior.md differ
new file mode 100644
index 0000000..1181cbb
Binary files /dev/null and b/content/devlog/2025-12-10-tad-better-behavior.md differ
new file mode 100644
index 0000000..f8bb1ba
Binary files /dev/null and b/content/devlog/2025-12-11-tad-better-behavior.md differ
new file mode 100644
index 0000000..1aba296
Binary files /dev/null and b/content/devlog/2026-03-19-tad-better-behavior.md differ
new file mode 100644
index 0000000..184f39e
Binary files /dev/null and b/content/devlog/2026-03-20-tad-better-behavior.md differ

Excavate latest entries from the devlog excavator

On by Tad Lispy

Excavate the excavator 🤯

new file mode 100644
index 0000000..8f80321
Binary files /dev/null and b/content/devlog/2026-04-20-devlog-excavator.md differ
new file mode 100644
index 0000000..88a80f2
Binary files /dev/null and b/content/devlog/2026-04-21-devlog-excavator.md differ

Describe (stub) more projects and excavate devlogs

On by Tad Lispy

new file mode 100644
index 0000000..60059c6
Binary files /dev/null and b/content/devlog/2025-05-25-esc-collective-website.md differ
new file mode 100644
index 0000000..2034e63
Binary files /dev/null and b/content/devlog/2025-05-26-esc-collective-website.md differ
new file mode 100644
index 0000000..e90376d
Binary files /dev/null and b/content/devlog/2025-05-27-esc-collective-website.md differ
new file mode 100644
index 0000000..6eff5de
Binary files /dev/null and b/content/devlog/2025-05-28-esc-collective-website.md differ
new file mode 100644
index 0000000..c593947
Binary files /dev/null and b/content/devlog/2025-05-29-esc-collective-website.md differ
new file mode 100644
index 0000000..74b2dfe
Binary files /dev/null and b/content/devlog/2025-06-05-esc-collective-website.md differ
new file mode 100644
index 0000000..befe9fa
Binary files /dev/null and b/content/devlog/2025-06-06-esc-collective-website.md differ
new file mode 100644
index 0000000..80a62c7
Binary files /dev/null and b/content/devlog/2025-06-08-esc-collective-website.md differ
new file mode 100644
index 0000000..fd121f3
Binary files /dev/null and b/content/devlog/2025-06-09-esc-collective-website.md differ
new file mode 100644
index 0000000..456b327
Binary files /dev/null and b/content/devlog/2025-06-10-esc-collective-website.md differ
new file mode 100644
index 0000000..3d1ba48
Binary files /dev/null and b/content/devlog/2025-06-11-esc-collective-website.md differ
new file mode 100644
index 0000000..6d9d257
Binary files /dev/null and b/content/devlog/2025-06-12-esc-collective-website.md differ
new file mode 100644
index 0000000..5f269e7
Binary files /dev/null and b/content/devlog/2025-06-13-esc-collective-website.md differ
new file mode 100644
index 0000000..33921f5
Binary files /dev/null and b/content/devlog/2025-06-15-esc-collective-website.md differ
new file mode 100644
index 0000000..2390b73
Binary files /dev/null and b/content/devlog/2025-06-19-esc-collective-website.md differ
new file mode 100644
index 0000000..600b87b
Binary files /dev/null and b/content/devlog/2025-06-20-esc-collective-website.md differ
new file mode 100644
index 0000000..765af25
Binary files /dev/null and b/content/devlog/2025-06-21-esc-collective-website.md differ
new file mode 100644
index 0000000..9f56626
Binary files /dev/null and b/content/devlog/2025-06-23-esc-collective-website.md differ
new file mode 100644
index 0000000..e1ccbd5
Binary files /dev/null and b/content/devlog/2025-06-24-esc-collective-website.md differ
new file mode 100644
index 0000000..59d13d6
Binary files /dev/null and b/content/devlog/2025-07-01-tad-lispy-website.md differ
new file mode 100644
index 0000000..7ea954e
Binary files /dev/null and b/content/devlog/2025-07-01-word-snake.md differ
new file mode 100644
index 0000000..30e0313
Binary files /dev/null and b/content/devlog/2025-07-02-tad-lispy-website.md differ
new file mode 100644
index 0000000..0e5c817
Binary files /dev/null and b/content/devlog/2025-09-05-joke-as-a-service.md differ
new file mode 100644
index 0000000..65b8260
Binary files /dev/null and b/content/devlog/2025-09-08-joke-as-a-service.md differ
new file mode 100644
index 0000000..61e1218
Binary files /dev/null and b/content/devlog/2025-09-09-joke-as-a-service.md differ
new file mode 100644
index 0000000..600f598
Binary files /dev/null and b/content/devlog/2025-09-10-joke-as-a-service.md differ
new file mode 100644
index 0000000..8fdd45f
Binary files /dev/null and b/content/devlog/2025-09-11-joke-as-a-service.md differ
new file mode 100644
index 0000000..3c27c9f
Binary files /dev/null and b/content/devlog/2025-09-12-joke-as-a-service.md differ
new file mode 100644
index 0000000..14fb41b
Binary files /dev/null and b/content/devlog/2025-09-12-rest-in-python-course.md differ
new file mode 100644
index 0000000..43caa86
Binary files /dev/null and b/content/devlog/2025-09-13-joke-as-a-service.md differ
new file mode 100644
index 0000000..ce7e4ed
Binary files /dev/null and b/content/devlog/2025-09-15-joke-as-a-service.md differ
new file mode 100644
index 0000000..8cfddae
Binary files /dev/null and b/content/devlog/2025-09-15-rest-in-python-course.md differ
new file mode 100644
index 0000000..f7105dc
Binary files /dev/null and b/content/devlog/2025-09-26-joke-as-a-service.md differ
new file mode 100644
index 0000000..65d7a29
Binary files /dev/null and b/content/devlog/2025-09-29-joke-as-a-service.md differ
new file mode 100644
index 0000000..44cbca3
Binary files /dev/null and b/content/devlog/2025-09-30-joke-as-a-service.md differ
new file mode 100644
index 0000000..fb0d61b
Binary files /dev/null and b/content/devlog/2025-10-01-joke-as-a-service.md differ
new file mode 100644
index 0000000..84d1d4e
Binary files /dev/null and b/content/devlog/2025-10-03-joke-as-a-service.md differ
new file mode 100644
index 0000000..4bdc737
Binary files /dev/null and b/content/devlog/2025-10-14-tad-lispy-website.md differ
new file mode 100644
index 0000000..36e608a
Binary files /dev/null and b/content/devlog/2025-10-16-tad-lispy-website.md differ
new file mode 100644
index 0000000..54ea331
Binary files /dev/null and b/content/devlog/2025-12-06-better-tech-club-website.md differ
new file mode 100644
index 0000000..2e518df
Binary files /dev/null and b/content/devlog/2025-12-11-better-tech-club-website.md differ
new file mode 100644
index 0000000..857c8fc
Binary files /dev/null and b/content/devlog/2025-12-12-better-tech-club-website.md differ
new file mode 100644
index 0000000..b5fe3e1
Binary files /dev/null and b/content/devlog/2025-12-27-otterhide.md differ
new file mode 100644
index 0000000..5fe0886
Binary files /dev/null and b/content/devlog/2026-01-02-bieb-os.md differ
new file mode 100644
index 0000000..c3c1a61
Binary files /dev/null and b/content/devlog/2026-01-03-bieb-os.md differ
new file mode 100644
index 0000000..786d219
Binary files /dev/null and b/content/devlog/2026-01-09-bieb-os.md differ
new file mode 100644
index 0000000..8f482ff
Binary files /dev/null and b/content/devlog/2026-01-20-bieb-os.md differ
new file mode 100644
index 0000000..ec4db0f
Binary files /dev/null and b/content/devlog/2026-01-23-bieb-os.md differ
new file mode 100644
index 0000000..3ea699c
Binary files /dev/null and b/content/devlog/2026-01-27-bieb-os.md differ
new file mode 100644
index 0000000..963eec0
Binary files /dev/null and b/content/devlog/2026-01-30-bieb-os.md differ
new file mode 100644
index 0000000..04a8c8c
Binary files /dev/null and b/content/devlog/2026-02-03-bieb-os.md differ
new file mode 100644
index 0000000..cd4f370
Binary files /dev/null and b/content/devlog/2026-02-09-better-tech-club-website.md differ
new file mode 100644
index 0000000..767486a
Binary files /dev/null and b/content/devlog/2026-02-10-better-tech-club-website.md differ
new file mode 100644
index 0000000..add603d
Binary files /dev/null and b/content/devlog/2026-02-16-esc-collective-website.md differ
new file mode 100644
index 0000000..a9acb9e
Binary files /dev/null and b/content/devlog/2026-02-17-bieb-os.md differ
new file mode 100644
index 0000000..bf76660
Binary files /dev/null and b/content/devlog/2026-02-17-esc-collective-website.md differ
new file mode 100644
index 0000000..12f60da
Binary files /dev/null and b/content/devlog/2026-02-19-better-tech-club-website.md differ
new file mode 100644
index 0000000..09e6f30
Binary files /dev/null and b/content/devlog/2026-02-20-bieb-os.md differ
new file mode 100644
index 0000000..f344acf
Binary files /dev/null and b/content/devlog/2026-02-22-tad-lispy-website.md differ
new file mode 100644
index 0000000..ccb131d
Binary files /dev/null and b/content/devlog/2026-03-03-bieb-os.md differ
new file mode 100644
index 0000000..df7546b
Binary files /dev/null and b/content/devlog/2026-03-06-bieb-os.md differ
new file mode 100644
index 0000000..a578314
Binary files /dev/null and b/content/devlog/2026-03-21-erna.md differ
new file mode 100644
index 0000000..86bb6c1
Binary files /dev/null and b/content/devlog/2026-03-23-erna.md differ
new file mode 100644
index 0000000..68b0145
Binary files /dev/null and b/content/devlog/2026-03-25-erna.md differ
new file mode 100644
index 0000000..4f1b9ed
Binary files /dev/null and b/content/devlog/2026-03-26-erna.md differ
new file mode 100644
index 0000000..d435bae
Binary files /dev/null and b/content/devlog/2026-03-30-erna.md differ
new file mode 100644
index 0000000..252f82f
Binary files /dev/null and b/content/devlog/2026-04-01-tad-lispy-website.md differ
new file mode 100644
index 0000000..d604cf7
Binary files /dev/null and b/content/devlog/2026-04-02-tad-lispy-website.md differ
new file mode 100644
index 0000000..67e3db9
Binary files /dev/null and b/content/devlog/2026-04-03-tad-lispy-website.md differ
new file mode 100644
index 0000000..20c35db
Binary files /dev/null and b/content/devlog/2026-04-04-tad-lispy-website.md differ
new file mode 100644
index 0000000..798a79a
Binary files /dev/null and b/content/devlog/2026-04-09-erna.md differ
new file mode 100644
index 0000000..5cae939
Binary files /dev/null and b/content/devlog/2026-04-10-erna.md differ
new file mode 100644
index 0000000..0d985d2
Binary files /dev/null and b/content/devlog/2026-04-11-erna.md differ
new file mode 100644
index 0000000..d4e6c4c
Binary files /dev/null and b/content/devlog/2026-04-18-tad-lispy-website.md differ
new file mode 100644
index 0000000..19ade0d
Binary files /dev/null and b/content/devlog/2026-04-19-tad-lispy-website.md differ
new file mode 100644
index 0000000..92dd088
Binary files /dev/null and b/content/devlog/2026-04-20-better-tech-club-website.md differ
new file mode 100644
index 0000000..97f11f9
Binary files /dev/null and b/content/devlog/2026-04-20-tad-lispy-website.md differ
new file mode 100644
index 0000000..dd4c5d4
--- /dev/null
+++ b/content/works/bieb-os/index.md
@@ -0,0 +1,13 @@
+---
+title: BiebOS
+weight: 1
+taxonomies:
+    craft: 
+    - NixOS
+    - Linux administration
+    - GitOps
+---
+
+# BiebOS
+
+A NixOS configuration for the public laptops at our library.
new file mode 100644
index 0000000..f7812f8
--- /dev/null
+++ b/content/works/erna/index.md
@@ -0,0 +1,12 @@
+---
+title: Erna
+weight: 1
+taxonomies:
+    craft:
+    - Typst programming
+    - Graphic Design
+---
+
+# Erna
+
+Scale and align images in a neat row, aka the magazine layout.
new file mode 100644
index 0000000..fb4de95
--- /dev/null
+++ b/content/works/esc-collective-website/index.md
@@ -0,0 +1,14 @@
+---
+title: Esc Collective website
+weight: 2
+taxonomies:
+    craft:
+    - Web Development
+    - No JS
+    - Modern CSS
+    - Handcrafted HTML
+    - Graphic Design
+    - Zola
+---
+
+# Esc Collective website
new file mode 100644
index 0000000..1c35d48
--- /dev/null
+++ b/content/works/joke-as-a-service/index.md
@@ -0,0 +1,11 @@
+---
+title: Joke as a Service
+weight: 2
+taxonomies:
+    craft:
+    - Python
+    - REST API
+    - SQLite
+---
+
+# Joke as a Service
new file mode 100644
index 0000000..c90ee3c
--- /dev/null
+++ b/content/works/otterhide/index.md
@@ -0,0 +1,13 @@
+---
+title: Otterhide
+weight: 2
+taxonomies:
+    craft:
+    - Rust
+    - Bevy
+    - Web Assembly
+    - Game development
+    - 3d modeling
+---
+
+# Otterhide
new file mode 100644
index 0000000..532952e
--- /dev/null
+++ b/content/works/rest-in-python-course/index.md
@@ -0,0 +1,13 @@
+---
+title: Rest in Python course
+weight: 2
+taxonomies:
+    craft:
+    - Python
+    - REST API
+    - Jupyter Notebooks
+    - Course development
+    - Training
+---
+
+# Rest in Python course
new file mode 100644
index 0000000..a53de1e
--- /dev/null
+++ b/content/works/tad-lispy-website/index.md
@@ -0,0 +1,17 @@
+---
+title: Tad Lispy website
+weight: 0
+taxonomies:
+    craft:
+    - Web Development
+    - No JS
+    - Modern CSS
+    - PicoCSS
+    - Handcrafted HTML
+    - Graphic Design
+    - Zola
+---
+
+# Tad Lispy website
+
+This very website!
new file mode 100644
index 0000000..d4e3504
--- /dev/null
+++ b/content/works/tad-notes/index.md
@@ -0,0 +1,11 @@
+---
+title: Tad Notes
+weight: 2
+taxonomies:
+    craft:
+    - Rust
+    - Markdown processing
+    - Command Line Tools development
+---
+
+# Tad Notes

Disable global RSS and Atom feeds

On by Tad Lispy

The Devlog section generates a lot of noise. People subscribed to the blog feed probably don't care about it. If the do, they can subscribe to the /devlog/rss.xml separately.

It would probably be a good idea to generate RSS feed for each project separately.

index 56a70c8..9372f29 100644
--- a/config.toml
+++ b/config.toml
@@ -11,7 +11,7 @@ compile_sass = true
=# Whether to build a search index to be used later on by a JavaScript library
=build_search_index = true
=
-generate_feeds = true
+generate_feeds = false
=feed_filenames = ["atom.xml", "rss.xml"]
=
=taxonomies = [
index 25d0e65..6d30309 100644
--- a/content/blog/_index.md
+++ b/content/blog/_index.md
@@ -4,6 +4,7 @@ sort_by: "date"
=template: "blog.html"
=page_template: "blog-post.html"
=description: "The infamous blog of Tad Lispy"
+generate_feeds: true
=---
=
=
index bc3ac1b..0eb0d5e 100644
--- a/content/devlog/_index.md
+++ b/content/devlog/_index.md
@@ -1,6 +1,7 @@
=---
=title: Tad Devlog
=template: blog.html
+generate_feeds: true
=---
=
=I write as I work as I write.
index 4e92e3d..e52a21b 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -27,7 +27,6 @@
=        <meta name="theme-color" content="#ffffff">
=        
=        {% block rss %}
-        <link rel="alternate" type="application/rss+xml" title="RSS" href="{{ get_url(path="rss.xml", trailing_slash=false) }}">
=        {% endblock %}
=        
=        <script src="https://cdn.usefathom.com/script.js" data-site="ODXZZEEQ" defer></script>
index be6be4e..daeb166 100644
--- a/templates/blog.html
+++ b/templates/blog.html
@@ -9,8 +9,19 @@
={%- set description = section.description -%}
={%- set title       = section.title ~ " - " ~ title -%}
=
+{%- set rss_path     = section.path ~ "rss.xml" -%}
+
={%- endblock variables -%}
=
+{% block rss %}
+<link
+    rel="alternate"
+    type="application/rss+xml"
+    title="{{ title }} RSS"
+    href="{{ get_url(path=rss_path, trailing_slash=false) }}"
+>
+{% endblock %}
+
={% block content %}
=
=<header>

Don't break RSS and Atom subscribers

On by Tad Lispy

On the live site copy blog section feeds to the old URLs, so whoever subscribed before, should still get the feed. Also, link the blog feed to the homepage, so new subscribers can use it.

index 27967cd..e585491 100644
--- a/Makefile
+++ b/Makefile
@@ -25,6 +25,7 @@ install:
=
=public:
=	zola build
+	cp public/blog/rss.xml public/blog/atom.xml public/
=	touch $@
=
=### DEVELOPMENT
index 6eaa7a8..61a66d8 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -8,9 +8,19 @@
={%- set page_class  = "home" %}
={%- set description = section.description -%}
={%- set title       = section.title -%}
+{%- set rss_path     = "/blog/rss.xml" -%}
=
={%- endblock variables -%}
=
+{% block rss %}
+<link
+    rel="alternate"
+    type="application/rss+xml"
+    title="{{ title }} RSS"
+    href="{{ get_url(path=rss_path, trailing_slash=false) }}"
+>
+{% endblock %}
+
={% block content %}
=  <header>
=    <nav class="main-nav">

Correctly escape closing Tera delimiter %}

On by Tad Lispy

There was a mistake in my Devlog Excavator configuration, leading to closing delimiters not being properly escaped. It's fixed now.

index 2034e63..4cdfdde 100644
Binary files a/content/devlog/2025-05-26-esc-collective-website.md and b/content/devlog/2025-05-26-esc-collective-website.md differ
index e90376d..b20dfd4 100644
Binary files a/content/devlog/2025-05-27-esc-collective-website.md and b/content/devlog/2025-05-27-esc-collective-website.md differ
index 6eff5de..70447ee 100644
Binary files a/content/devlog/2025-05-28-esc-collective-website.md and b/content/devlog/2025-05-28-esc-collective-website.md differ
index c593947..1a4776c 100644
Binary files a/content/devlog/2025-05-29-esc-collective-website.md and b/content/devlog/2025-05-29-esc-collective-website.md differ
index befe9fa..5fb2dd1 100644
Binary files a/content/devlog/2025-06-06-esc-collective-website.md and b/content/devlog/2025-06-06-esc-collective-website.md differ
index 456b327..aa1d847 100644
Binary files a/content/devlog/2025-06-10-esc-collective-website.md and b/content/devlog/2025-06-10-esc-collective-website.md differ
index 3d1ba48..1ab8403 100644
Binary files a/content/devlog/2025-06-11-esc-collective-website.md and b/content/devlog/2025-06-11-esc-collective-website.md differ
index 6d9d257..aae49ef 100644
Binary files a/content/devlog/2025-06-12-esc-collective-website.md and b/content/devlog/2025-06-12-esc-collective-website.md differ
index 2390b73..f8448ac 100644
Binary files a/content/devlog/2025-06-19-esc-collective-website.md and b/content/devlog/2025-06-19-esc-collective-website.md differ
index 600b87b..5157b71 100644
Binary files a/content/devlog/2025-06-20-esc-collective-website.md and b/content/devlog/2025-06-20-esc-collective-website.md differ
index 765af25..c37f2f6 100644
Binary files a/content/devlog/2025-06-21-esc-collective-website.md and b/content/devlog/2025-06-21-esc-collective-website.md differ
index 9f56626..63c68ad 100644
Binary files a/content/devlog/2025-06-23-esc-collective-website.md and b/content/devlog/2025-06-23-esc-collective-website.md differ
index e1ccbd5..a6d4aa5 100644
Binary files a/content/devlog/2025-06-24-esc-collective-website.md and b/content/devlog/2025-06-24-esc-collective-website.md differ
index bf76660..c1bd247 100644
Binary files a/content/devlog/2026-02-17-esc-collective-website.md and b/content/devlog/2026-02-17-esc-collective-website.md differ
index 61a66d8..2853ae1 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -8,7 +8,7 @@
={%- set page_class  = "home" %}
={%- set description = section.description -%}
={%- set title       = section.title -%}
-{%- set rss_path     = "/blog/rss.xml" -%}
+{%- set rss_path    = "/blog/rss.xml" -%}
=
={%- endblock variables -%}
=

Standardize the crafts taxonomy terms

On by Tad Lispy

All terms now start with a capital letter, and the rest is lowercase unless:

Programming languages and frameworks, unless very well known (like JavaScript or Python), are now qualified, like "Elm programming language" or "Bevy framework". Rust is quite well known, but there is also a popular video game by this name, so to avoid any confusion I opted for "Rust programming language".

Some terms were duplicates and I've added some new. The work in this area will likely continue.

index c406ab7..479823a 100644
--- a/content/works/agile-planner/index.md
+++ b/content/works/agile-planner/index.md
@@ -4,8 +4,8 @@ weight: 3
=taxonomies:
=  craft:
=  - Agile software development
-  - Rust programming
-  - Collaboration software
+  - Rust programming language
+  - Collaboration tools
=  - Free / Open source software
=  - Markdown processing
=  - iCalendar processing
index 35bfae2..082e59c 100644
--- a/content/works/better-tech-club-website/index.md
+++ b/content/works/better-tech-club-website/index.md
@@ -3,11 +3,12 @@ title: Better Tech Club website
=weight: 1
=taxonomies:
=    craft:
-    - Web Development
+    - Web development
=    - No JS
=    - Modern CSS
=    - Handcrafted HTML
-    - Graphic Design
+    - Graphic design
+    - Static websites
=---
=
=# Better Tech Club website
index fe5fdff..84cd741 100644
--- a/content/works/devlog-excavator/index.md
+++ b/content/works/devlog-excavator/index.md
@@ -4,9 +4,9 @@ weight: 1
=
=taxonomies:
=    craft: 
-    - Nushell
-    - Behavior Driven Development
-    - Command Line Tools
+    - Nu shell scripting
+    - Behavior driven development
+    - Command line
=    - Markdown processing
=---
=
index d683a4c..97258ac 100644
--- a/content/works/elm-springs/index.md
+++ b/content/works/elm-springs/index.md
@@ -3,7 +3,7 @@ title: Elm Springs
=weight: 2
=taxonomies:
=  craft:
-  - Elm programming
+  - Elm programming language
=  - Physics simulation
=  - Procedural animations
=  - Free / Open source software
index 967c096..9d7963d 100644
--- a/content/works/elm-tree-workshop/index.md
+++ b/content/works/elm-tree-workshop/index.md
@@ -5,17 +5,14 @@ taxonomies:
=  craft:
=  - Web development
=  - Education technology
-  - Elm programming
-  - Procedural animation
+  - Teaching
+  - Elm programming language
+  - Procedural animations
=  - Free / Open source software
=---
=
=# Elm Tree Workshop
=
-  - teaching
-  - Elm programming
-  - web development
-
=A workshop that will give you a glimpse into the way software is created. It is intended for people with no prior experience in programming and doesn’t require any technical knowledge. Everybody is welcome! During this 5 days workshop (3 hours each day) you will learn to solve problems using a functional programming language. Together, we will build a program that simulates growth of a tree. In 2019 the workshop was presented to students of Utrecht University.
=
=[Visit the website](https://elm-tree.software.garden/)
index f7812f8..584c85c 100644
--- a/content/works/erna/index.md
+++ b/content/works/erna/index.md
@@ -4,7 +4,7 @@ weight: 1
=taxonomies:
=    craft:
=    - Typst programming
-    - Graphic Design
+    - Graphic design
=---
=
=# Erna
index fb4de95..4c661e8 100644
--- a/content/works/esc-collective-website/index.md
+++ b/content/works/esc-collective-website/index.md
@@ -3,11 +3,12 @@ title: Esc Collective website
=weight: 2
=taxonomies:
=    craft:
-    - Web Development
+    - Web development
=    - No JS
=    - Modern CSS
=    - Handcrafted HTML
-    - Graphic Design
+    - Graphic design
+    - Static websites
=    - Zola
=---
=
index 202921a..5295a36 100644
--- a/content/works/ethtical-software-garden/index.md
+++ b/content/works/ethtical-software-garden/index.md
@@ -5,10 +5,10 @@ taxonomies:
=  craft:
=  - Collaboration
=  - Digital ethics research
-  - Content Management Systems
+  - Content management systems
=  - GitLab API
-  - Free / Open source software
=  - GraphQL
+  - Free / Open source software
=---
=
=# Ethical Software Garden
index bc34395..f594a4a 100644
--- a/content/works/lead-studio/index.md
+++ b/content/works/lead-studio/index.md
@@ -3,15 +3,15 @@ title: Lead Studio
=weight: 1
=taxonomies:
=  craft:
+  - Facilitation
=  - Data engineering
=  - Business process automation
=  - Web extensions
-  - User experience
=  - Internal tooling
=  - LinkedIn Sales Navigator
=  - Google Cloud
-  - Elm programming
-  - JavaScript programming
+  - Elm programming language
+  - JavaScript
=---
=
=# Lead Studio
index c90ee3c..25a6657 100644
--- a/content/works/otterhide/index.md
+++ b/content/works/otterhide/index.md
@@ -3,8 +3,8 @@ title: Otterhide
=weight: 2
=taxonomies:
=    craft:
-    - Rust
-    - Bevy
+    - Rust programming language
+    - Bevy famework
=    - Web Assembly
=    - Game development
=    - 3d modeling
index 532952e..f01fa18 100644
--- a/content/works/rest-in-python-course/index.md
+++ b/content/works/rest-in-python-course/index.md
@@ -6,8 +6,7 @@ taxonomies:
=    - Python
=    - REST API
=    - Jupyter Notebooks
-    - Course development
-    - Training
+    - Teaching
=---
=
=# Rest in Python course
index f4bbb9a..5a9ec5e 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -4,9 +4,9 @@ weight: 0
=
=taxonomies:
=    craft: 
-    - Rust
-    - Behavior Driven Development
-    - Command Line Tools development
+    - Rust programming language
+    - Behavior driven development
+    - Command line
=    - Markdown processing
=---
=
index a53de1e..05abeae 100644
--- a/content/works/tad-lispy-website/index.md
+++ b/content/works/tad-lispy-website/index.md
@@ -3,12 +3,13 @@ title: Tad Lispy website
=weight: 0
=taxonomies:
=    craft:
-    - Web Development
+    - Web development
=    - No JS
=    - Modern CSS
-    - PicoCSS
+    - PicoCSS framework
=    - Handcrafted HTML
-    - Graphic Design
+    - Graphic design
+    - Static websites
=    - Zola
=---
=
index d4e3504..cc5a098 100644
--- a/content/works/tad-notes/index.md
+++ b/content/works/tad-notes/index.md
@@ -3,9 +3,9 @@ title: Tad Notes
=weight: 2
=taxonomies:
=    craft:
-    - Rust
+    - Rust programming language
=    - Markdown processing
-    - Command Line Tools development
+    - Command line
=---
=
=# Tad Notes
index c3d1fbc..44276ee 100644
--- a/content/works/word-snake/index.md
+++ b/content/works/word-snake/index.md
@@ -4,9 +4,9 @@ weight: 2
=taxonomies:
=  craft:
=  - Game development
-  - web development
+  - Web development
=  - Education technology
-  - Elm programming
+  - Elm programming language
=---
=
=# Word Snake

Describe the TBB project

On by Tad Lispy

With a long description like this the crafts list hanging at the bottom looks off.

index 5a9ec5e..685106c 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -10,7 +10,38 @@ taxonomies:
=    - Markdown processing
=---
=
-# TBB: Tad Better Behavior
+ TBB replaces magic and complexity with Unix and simplicity.
=
-A <abbrev title="Behhavior Driven Development">BDD</abbrev> tool that works well on Unix.
+
+# Tad Better Behavior
+
+Tad Better Behavior (**TBB**) is a fresh take on <abbrev title="Behhavior Driven Development">BDD</abbrev> 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, with features like:
+
+  * Markdown spec parsing
+  * Suite / scenario / step hierarchy
+  * Tagging and filtering (`--only`, `--exclude` CLI flags)
+  * Rich text and structured JSON output formats
+  * Condensed output for successful steps
+  * Observations system (text, code snippet, link, and more)
+  * Source information tracking (file paths, line numbers)
+  * Report status indicators (✓, x, ?, ⊞, ⊠, □)
+  * Self-check - of course we use TBB to verify correctness of TBB 
+
+TBB is inspired by Gauge from Thoughtworks, but aims to be simpler and more flexible. It sends steps from Markdown documents to custom *interpreters*. Interpreters are simple <abbrev title="command line interface">CLI</abbrev> programs that you can write yourself. They leverage Unix <abbrev title="input - output">I/O</abbrev> features and widely supported JSON format for a very simple control protocol. It's easy to write interpreters from scratch in almost any programming language. To let you start in no time we also maintain **helper libraries** in the following languages:
+
+  * Python,
+  * Clojure (Babashka),
+  * and Nushell. 
+  
+It's relatively easy to port those helpers to other languages and we are always happy to help.
+
+
+# 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.
+  * Write steps to reproduce each scenario as Markdown bullet points.
+  * Discuss the scenarios with interested parties, until you get an agreement on all the important aspects.
+  * Write the interpreter (or several specialized interpreters) to evaluate the scenarios.
+  * Implement the <abbrev title="system under test">SUT</abbrev> (i.e. your product) features with confidence.
=

Move crafts list to the header of a project

On by Tad Lispy

Make it an in-line list without bullet points, and use smaller font size. This also affects the project cards on the Works section page.

index e5f6040..6d6e5cd 100644
--- a/sass/style.scss
+++ b/sass/style.scss
@@ -391,3 +391,23 @@ ul.client-logos {
=    }
=}
=
+
+.craft-list {
+    display: flex;
+    flex-wrap: wrap;
+    padding: 0;
+    gap: 0 2rem;
+    font-size: 0.8rem;
+    margin-top: 2rem;
+
+    li {
+        padding: 0;
+        display: block;
+    }
+}
+
+html.project {
+    main {
+        padding-top: 0;
+    }
+}
index 7e9b2d6..243e599 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -19,11 +19,6 @@
=            <li><strong>{{ page.title | markdown(inline=true) | safe }}</strong></li>
=        </ul>
=    </nav>
-</header>
-
-<main>
-
-    {{ page.content | safe }}
=
=    <ul class="craft-list">
=        {% for craft in page.taxonomies | get(key="craft", default=[]) %}
@@ -31,6 +26,12 @@
=        <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
=        {% endfor %}
=    </ul>
+</header>
+
+<main>
+
+    {{ page.content | safe }}
+
=
=    {# NOTE: If there is no devlog, then the heading will be hidden using CSS #}
=    <h2 id="devlog-heading">Devlog</h2>

Write a short description of TBB for HTML meta

On by Tad Lispy

Use it in the project card on the Works section page. Other projects are to follow.

index 685106c..33f35a2 100644
--- a/content/works/tad-better-behavior/index.md
+++ b/content/works/tad-better-behavior/index.md
@@ -1,6 +1,8 @@
=---
=title: Tad Better Behavior
=weight: 0
+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:
index 243e599..0559538 100644
--- a/templates/project.html
+++ b/templates/project.html
@@ -6,7 +6,7 @@
={{ super() }}
={% set page_class  = "page project" %}
={% set title = page.title | markdown(inline=true) | striptags %}
-{% set description = page.summary | default(value="A project by Tad Lispy.") | striptags %}
+{% set description = page.description | default(value="A project by Tad Lispy.") | striptags %}
={% set devlog = get_section(path="devlog/_index.md") %}
={% endblock variables %}
=
index 49b18af..6dd99d7 100644
--- a/templates/works.html
+++ b/templates/works.html
@@ -35,6 +35,7 @@
=                <li><a href="{{ get_taxonomy_url(kind="craft", name=craft) }}">{{ craft }}</a></li>
=                {% endfor %}
=            </ul>
+            {{ project.description | default(value="") | markdown() | safe }}
=            <p><a href="{{ project.path }}">Read more about {{ project.title }}</a> </p>
=        </article>
=        {% endfor %}

Describe the REST in Python course

On by Tad Lispy

index f01fa18..b7b1821 100644
--- a/content/works/rest-in-python-course/index.md
+++ b/content/works/rest-in-python-course/index.md
@@ -1,5 +1,8 @@
=---
=title: Rest in Python course
+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:
@@ -9,4 +12,8 @@ taxonomies:
=    - Teaching
=---
=
-# Rest in Python course
+Basic principles and practical techniques to use REST APIs in Python
+
+# REST in Python course
+
+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. Tad Lispy guides learners through authentic scenarios, like user authentication, CRUD operations, optimistic locking with `ETags`, and secure resource management. Using the `requests` library and a custom HTTP inspection tool, participants gain immediate, tangible experience with HTTP APIs. We interact with services like JaaS (Jokes as a Service) and JSONPlaceholder to give participants practical, working skills. With a modern development environment powered by Nix-based devenv and Python 3, this course is ideal for teams seeking to standardize their API practices while fostering a collaborative, engaging learning atmosphere.

Extract description from Agile Plan Exporter page

On by Tad Lispy

The name rubs me wrong now. It's a simple tool to export .ics data from .md files. Nothing particularly agile about it. I'll think about a better name later.

index 479823a..caf9571 100644
--- a/content/works/agile-planner/index.md
+++ b/content/works/agile-planner/index.md
@@ -1,6 +1,8 @@
=---
=title: Agile Planner
=weight: 3
+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:
=  - Agile software development
@@ -12,6 +14,8 @@ taxonomies:
=---
=
=
+Export from Markdown to online calendar
+
=# Agile Plan Exporter
=
=

Extract descriptions from several projects

On by Tad Lispy

Those projects already had some content on their pages, so it was easy to write a short description for them.

index 97258ac..f2d1ed9 100644
--- a/content/works/elm-springs/index.md
+++ b/content/works/elm-springs/index.md
@@ -1,6 +1,8 @@
=---
=title: Elm Springs
=weight: 2
+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
index 9d7963d..a8ffd92 100644
--- a/content/works/elm-tree-workshop/index.md
+++ b/content/works/elm-tree-workshop/index.md
@@ -1,6 +1,8 @@
=---
=title: Elm Tree Workshop
=weight: 1
+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:
=  - Web development
@@ -11,6 +13,8 @@ taxonomies:
=  - Free / Open source software
=---
=
+A functional programming workshop for non-programmers
+
=# Elm Tree Workshop
=
=A workshop that will give you a glimpse into the way software is created. It is intended for people with no prior experience in programming and doesn’t require any technical knowledge. Everybody is welcome! During this 5 days workshop (3 hours each day) you will learn to solve problems using a functional programming language. Together, we will build a program that simulates growth of a tree. In 2019 the workshop was presented to students of Utrecht University.
index 5295a36..eccf4b9 100644
--- a/content/works/ethtical-software-garden/index.md
+++ b/content/works/ethtical-software-garden/index.md
@@ -1,6 +1,9 @@
=---
=title: Ethical Software Garden
=weight: 3
+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:
=  - Collaboration
@@ -11,6 +14,8 @@ taxonomies:
=  - Free / Open source software
=---
=
+Tracking resources about digital ethics
+
=# Ethical Software Garden
=
=After taking part in the Offsite Sustainability meetup hosted by [Railslove](https://railslove.com/) we realized that resources about digital ethics are very scattered. This website uses our GitLab GraphQL API and Elm Pages static site generator to produce a catalogue of articles, videos, websites etc. about digital ethics. The idea is to use GitLab issues, comments, reactions (up and down votes) and moderation to generate web content. The webpage is re-generated daily in a CI/CD pipeline for fast loading, but the content is also loaded live.
index f594a4a..a9ee6a3 100644
--- a/content/works/lead-studio/index.md
+++ b/content/works/lead-studio/index.md
@@ -1,6 +1,9 @@
=---
=title: Lead Studio
=weight: 1
+description: |
+  A software solution to improve sales prospecting performance up to 20 times.
+  
=taxonomies:
=  craft:
=  - Facilitation
@@ -14,6 +17,8 @@ taxonomies:
=  - JavaScript
=---
=
+A software solution to improve sales prospecting performance up to 20 times.
+
=# Lead Studio
=
=
index 44276ee..0353434 100644
--- a/content/works/word-snake/index.md
+++ b/content/works/word-snake/index.md
@@ -1,6 +1,8 @@
=---
=title: Word Snake
=weight: 2
+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:
=  - Game development
@@ -9,6 +11,8 @@ taxonomies:
=  - Elm programming language
=---
=
+Avoid fire and poop in this fast paced knowledge, logic and language game
+
=# Word Snake
=
=

Describe the Better Tech Club website project

On by Tad Lispy

For now it's just a lot of text. We need some multimedia elements to illustrate it, and frankly make it less boring. But one thing at a time.

index 082e59c..9208182 100644
--- a/content/works/better-tech-club-website/index.md
+++ b/content/works/better-tech-club-website/index.md
@@ -1,6 +1,8 @@
=---
=title: Better Tech Club website
-weight: 1
+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:
=    - Web development
@@ -11,6 +13,37 @@ taxonomies:
=    - Static websites
=---
=
+Small European communities to support better digital choices
+
=# Better Tech Club website
=
+The Better Tech Club website is a welcoming entry point to a community-oriented advocacy for digital independence. It serves as a hub for a network of local, off-line first groups promoting free and open source software (FOSS) in Europe. A place where community organizers find each other to share experience and collaborate, but most of all for regular people looking to connect with like-minded neighbors. 
+
+The website prioritizes accessibility; positive, user-friendly design; and semantic correctness. It evolves through a transparent, commit-driven process (see the Devlog below). It is deployed as a static site hosted on Codeberg Pages – itself a community operated service that perfectly aligns with our values. 
+
+Originally launched as "FOSS for Normies," the project was rebranded to Better Tech Club – a more accessible name, reflecting our conviction that the ethical, sustainable, and inclusive tech choices we promote are simply better than Big Tech alternatives.
+
=<https://bettertechclub.eu>
+
+## Development Environment
+
+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.
+
+
+## Front-End Practices
+
+To invite wider collaboration we avoid heavy frameworks in favor of semantic HTML5 and modern CSS3, focusing on performance and accessibility:
+
+  *   **Semantic HTML**: The structure strictly adheres to WAI-ARIA best practices, utilizing landmarks like `<header>`, `<main>`, and `<section>` to ensure screen reader compatibility.
+  
+  *   **Modern CSS**: Styling is driven by **CSS Custom Properties (Variables)** using the **OKLCH** color space for precise, perceptually uniform color management. The layout employs fluid typography and spacing that scales responsively with the viewport width (`vw` units) and media queries.
+
+  *   **Accessibility**: The design carefully avoids common pitfalls like justified text (which creates uneven spacing for dyslexic readers) and ensures high contrast ratios for links and text. Hidden text spans are included to guide assistive technology without affecting visual design. We regularly audit the website for <abbrev title="Accessibility">a11y</abbrev> issues.
+
+
+## Branding and Assets
+
+Branding assets, like the logotype and icons, are created as **SVG** files to ensure infinite scalability and crisp rendering on any device. The color palette is anchored by a deep blue  and a vibrant yellow, chosen for their high contrast and friendly aesthetic. The site supports progressive web app (PWA) standards with a comprehensive `site.webmanifest` and a full suite of touch icons for seamless installation on mobile devices.

Devlog: Prevent vertical overflow of inline SVGs

On by Tad Lispy

Some SVGs displayed in the devlog have huge viewbox, and unless constrained, on small screens would overflow the container and make the page scrollable to the right. That's not nice, so let's limit their width to that of a container.

index 6d6e5cd..3ea7579 100644
--- a/sass/style.scss
+++ b/sass/style.scss
@@ -68,6 +68,10 @@ html.project {
=            top: 0;
=            background: var(--background-color);
=        }
+
+        svg {
+            max-width: 100%;
+        }
=    }
=}
=