Jens Oliver Meiert

Website Optimization Measures, Part XXXV

Published on JanĀ 21, 2026, filed under , . (Share this post, e.g. on Mastodon or onĀ Bluesky.)

Welcome to the thirty-fifth edition of this blog series in which I share improvements and lessons from the work on my projects, so that you can pick what could benefit yours:

  1. Refactoring use of rel=tag. When linking tags, I’ve usually marked them with rel=tag. Noting the immense repetition on Frontend Dogma—a tag-heavy site—, I had another look at the HTML spec. This says, rel=tag ā€œgives a tag (identified by the given address) that applies to the current document.ā€ This means that links to tags that (ā€œthatā€ meaning the links) are on overview pages should not be marked rel=tag. Accordingly, I’ve limited my use of rel=tag in what ended up being a little performance optimization step.

  2. Trying Basecoat on top of Tailwind. ā€œOh no,ā€ you yell at me—and yet I discarded the draft in which I laid out my experience.

  3. Simplifying Eleventy passthrough configs. I hadn’t realized that I didn’t need multiple eleventyConfig.addPassthroughCopy() calls, and simplified things in a manner like this:

    eleventyConfig.addPassthroughCopy({
      'dynamic/': '/tools/',
      'media/': '/media/',
      'root/': '/',
      'setup/': '/setup/',
    });
  4. Removing quotes 😬 Oh that meiert.com redesign and migration that I first planned in 2009 and finally did in 2025 (some context)Ā šŸ˜‚ I’m still dealing with some fallout, clean-up tasks I’m working on every other week. One such task: Removing quotes where not needed, notably on many hyperlinks (i.e., <a href=/example>…</a> instead of <a href="/example">…</a>). I write about optional HTML—entire books—and I walk the talkĀ šŸ™‚

  5. Replacing asyncAll by for loops. For some reason—suspected benefit?—I used asyncAll loops in my Frontend Dogma Eleventy project. This came up as unnecessary, which I could confirm:

    In Nunjucks, asyncAll and asyncEach exist to allow concurrent evaluation when the loop body uses asynchronous filters/shortcodes (e.g., filters that return a Promise or call back asynchronously).

    If the loop body is entirely synchronous, asyncAll provides no benefit and adds small overhead.

    I replaced these with for loops, until I noticed that in one place, I did need it. Okay.

  6. Checking links… and taking the time to configure markdown-link-check. Link-checking is still that annoying but important task of ours. For my Markdown-based projects, I like using markdown-link-check. One thing I missed: Configuring it fully, at least for my purposes. These contents of a config file (passed on per -c parameter) help me create better results in my environment:

    {
      "ignorePatterns": [
        {
          "pattern": "^/"
        },
        {
          "pattern": "^#"
        },
        {
          "pattern": "^mailto:"
        }
      ],
      "retryOn429": true,
      "retryCount": 3,
      "showProgressBar": true
    }
  7. Refactoring Markdown code blocks. Some day, I noticed some odd inconsistency for how commands were marked up (down?) in Markdown files:

    ```bash
    command_x
    ```
    
    ```shell
    command_y
    ```

    Clearly, this couldn’t be šŸ˜‰ After searching a bit around, shell felt more appropriate to me, not seeming to limit the commands to Bash and hence leaving the specific shell open. (Do I miss something? Let me know!)

  8. Automatically checking on updates to GitHub Actions. It took me until seeing a Dependabot PR for a GitHub Actions update in the validator repo to notice that there’s a way to automatically update GitHub workflows as well. As these updates don’t seem to happen frequently, I included the following in my dependabot.yml:

    - package-ecosystem: "github-actions"
      directory: "/"
      schedule:
        interval: "monthly"
  9. ā€œStandardizingā€ Markdown indentation. Do you know with how many different numbers of spaces you can indent what list type processed by what tool? After noticing inconsistencies around how Markdown lists were indented in my projects, I started testing what worked in Leanpub and in my Eleventy projects, and… slid down some rabbit hole. The long story short: I defined how I wanted to indent within unordered and ordered list, and made the necessary changes. Maybe I’ll document my findings, given that there were some interesting/frustrating inconsistencies when list content started with markup.

This is a part of an open article series. Check out some of the other optimization posts!

About Me

Jens Oliver Meiert, on November 9, 2024.

I’m Jens (long: Jens Oliver Meiert), and I’m a senior engineering lead, guerrilla philosopher, and indie publisher. I’ve worked as a technical lead and engineering manager for companies you use every day and companies you’ve never heard of, I’m an occasional contributor to web standards (like HTML, CSS, WCAG), and I write and review books for O’Reilly and Frontend Dogma.

I love trying things, not only in web development and engineering management, but also in philosophy. Here on meiert.com I share some of my experiences and perspectives. (I value you being critical, interpreting charitably, and giving feedback.)