<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- generator="FeedCreator 1.8" --><rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Andreas Gohr: Linkblog [splitbrain.org]</title>
        <description>Noteworthy or interesting links collected by Andreas Gohr.</description>
        <link/>
        <lastBuildDate>Tue, 26 May 2026 04:41:49 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <item>
            <title>Bearming theme for Bear blog</title>
            <link>https://robertbirming.com/bearming/</link>
            <description></description>
            <pubDate>Mon, 25 May 2026 05:36:39 +0000</pubDate>
            <guid>https://robertbirming.com/bearming/</guid>
        </item>
        <item>
            <title>The maintainer's dilemma</title>
            <link>https://spf13.com/p/the-maintainers-dilemma/</link>
            <description>&lt;blockquote&gt;When a maintainer reviews a contributor’s PR, there’s an unspoken contract.  [...] the human stays accountable regardless; the tool doesn’t absorb the responsibility. [...] it assumes someone is actually there to take responsibility. For most projects, nobody is. The social contract isn’t being broken by AI — it’s already being broken by silence.&lt;hr&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;p&gt;A protected branch requires a second person to review a change before code ships. The rule exists because humans make mistakes, and a second pair of eyes catches what the first one missed. But what happens when one of those reviewers is a robot? What if both are?&lt;/p&gt;&lt;p&gt;Currently I can ask an AI to open a pull request on my repository and then merge it myself. Or I can write the code and ask an AI to review it. In both cases, the branch is technically “protected.” But what does that even mean now?&lt;/p&gt;&lt;p&gt;Those are questions worth asking. But they tend to get all the attention while a more immediate problem goes unaddressed. Right now, across my repositories, there are open pull requests from people who took time to understand the codebase, write tests, and submit clean patches. I haven’t reviewed them. Sadly, the ironic part is I haven’t reviewed them because I deeply care. I know how big of a deal it is to take the time to open a pull request on a project, and even more so on a popular one. I know that each one deserves an honest review and that that takes time I don’t have for projects I maintain as a volunteer. For every open source project with a funded maintainer, there are millions with an unpaid human staring at a growing backlog, wondering whether the right thing to do is spend their weekend triaging issues or just close the laptop and go outside.&lt;/p&gt;&lt;p&gt;AI tools can now do credible code reviews, write patches, and triage issues. The question is no longer whether they’re good enough to be useful. The real questions are where “useful” becomes “liability,” and whether leaning on them breaks something we can’t easily rebuild — the trust between maintainers and contributors, the judgment that comes from experience, and the community that forms around that exchange.&lt;/p&gt;&lt;h2 id="118-open-pull-requests"&gt;118 Open Pull Requests&lt;/h2&gt;&lt;p&gt;I checked my GitHub notifications last week and closed the tab. &lt;a href="https://cobra.dev"&gt;Cobra&lt;/a&gt; has 243 open issues and 118 open pull requests. &lt;a href="https://github.com/spf13/afero"&gt;Afero&lt;/a&gt; has 114 issues and 55 PRs. I created both projects. I haven’t meaningfully reviewed a PR on either in months.&lt;/p&gt;&lt;p&gt;In spite of my inaction as a reviewer, these are actively maintained projects. Cobra powers kubectl, GitHub CLI, &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt;, and hundreds of thousands of other tools. When you type &lt;code&gt;kubectl get pods&lt;/code&gt; or &lt;code&gt;gh pr list&lt;/code&gt;, Cobra parses your command. Afero sits inside Hugo, inside Cobra itself, inside hundreds of thousands of other projects. A careless merge on Cobra could break Kubernetes tooling. A bad review on Afero could open a filesystem vulnerability that quietly propagates through everything downstream.&lt;/p&gt;&lt;p&gt;I created Cobra because I needed a specific CLI UX for Hugo and no existing library could support it. I split it out as its own project, thinking others might find it useful. I never imagined I’d still be maintaining it a decade later, or that both projects would become critical infrastructure for so many others. I just wanted to build something useful for me and maybe a few friends. But does open sourcing code mean I’m obligated to maintain it indefinitely? With each new project I release, there’s less time for the existing ones. Some of those PRs have been waiting for years. There’s a reported security vulnerability in Afero’s &lt;code&gt;BasePathFs&lt;/code&gt; that’s been sitting open since June 2025 — which, until I wrote this post, I didn’t realize was there, because the backlog is that overwhelming.&lt;/p&gt;&lt;p&gt;The math of maintenance doesn’t work. It’s a well-known problem across open source (&lt;a href="https://xkcd.com/2347/"&gt;relevant XKCD&lt;/a&gt;). The number of contributions grows faster than the number of maintainers, and the time required to review each one grows with a project’s complexity and impact. Some projects attract volunteer co-maintainers, but that brings its own problem: no one is clearly responsible, so everyone picks what matters to them and the rest just sits. Cobra is intentionally slow to change — too many projects depend on it to casually merge anything — so each change requires more thorough review, not less. Many of my other projects fall into the gray area between maintained and abandoned. I’d describe it as optimized maintenance around the most critical paths, but that distinction matters a lot more to me than it does to the person who submitted a fix eight months ago and never heard back.&lt;/p&gt;&lt;p&gt;This isn’t just my problem. GitHub hosts over 420 million repositories. I was very fortunate to be a part of the inaugural cohort of the &lt;a href="/p/cobra-viper-join-github-secure-fund/"&gt;Secure Open Source Fund&lt;/a&gt; — a real investment that made a real difference. But even after expanding to several cohorts, it covers about 200 projects. &lt;a href="https://securityscorecards.dev"&gt;OpenSSF&lt;/a&gt; scans a million critical projects weekly. &lt;a href="https://tidelift.com"&gt;Tidelift&lt;/a&gt; pays maintainers. Add it all up and you’re covering thousands of projects. It’s meaningful work. It’s also a rounding error against the actual surface area.&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.blackduck.com/resources/analyst-reports/open-source-security-risk-analysis.html"&gt;Ninety-six percent of codebases contain open source components&lt;/a&gt;, and the foundations they build on are maintained by people staring at a backlog they’ll never clear, wondering if this is the weekend they finally burn out or just stop checking. And that’s before you get to maintainer guilt — the knowledge that people are counting on your work, that you have the capacity to help, but that you can’t keep up.&lt;/p&gt;&lt;h2 id="enter-the-robots"&gt;Enter the Robots&lt;/h2&gt;&lt;figure&gt;&lt;img src="/p/the-maintainers-dilemma/mechanical-reviewer.jpg" alt="Brass clockwork automaton inspecting a scroll at a candlelit desk, with a rack of waiting scrolls behind it"&gt;&lt;/figure&gt;&lt;p&gt;I’ve been experimenting with AI tools across a couple of repositories — &lt;a href="https://jules.google.com/"&gt;Jules&lt;/a&gt; on &lt;a href="https://github.com/spf13/fileflow"&gt;fileflow&lt;/a&gt; and &lt;a href="https://github.com/spf13/pathologize"&gt;pathologize&lt;/a&gt;, which have fewer dependencies and more room to try things. I’ve also been running &lt;a href="https://github.com/features/copilot"&gt;GitHub Copilot&lt;/a&gt; on Afero, which has more dependencies, but its modular architecture lets me extend new backends without touching the critical paths other projects depend on.&lt;/p&gt;&lt;p&gt;I turned Jules loose and watched email after email arrive with new PRs. Looked promising. Then I went on a cruise. While I was at sea, Jules kept going, opening more pull requests each day because I hadn’t merged the first ones yet. By the time I got home, I had over 120 PRs across the two projects. I set aside a morning to review them all, only to find they represented roughly five distinct change sets, each submitted daily over several weeks. The PRs themselves weren’t wrong, Jules had found real issues. But none were quite right either; each needed course correction before I could merge. With guidance Jules made the adjustments, and the overall direction showed promise. But the experiment so far has created more maintenance work, not less: I had to verify each of those 120 PRs was actually a duplicate before closing it. The tool meant to reduce my backlog had added to it.&lt;/p&gt;&lt;p&gt;Jules also created these PRs as me, not as Jules — which raises its own questions about attribution and accountability. From the repository’s perspective, I authored those changes. But I didn’t write a line of them. If one of those patches introduced a bug or a vulnerability, the commit history points to me. Most contributor policies weren’t written with this scenario in mind, and the standard CLA doesn’t distinguish between code a human wrote and code a human directed an AI to write on their behalf.&lt;/p&gt;&lt;p&gt;Currently, it appears that Jules has no memory of its own previous work and doesn’t have the ability to check open PRs. It scans the repository, finds an issue, opens a PR, and stops. If you don’t merge it, Jules finds the same issue next time and opens another PR. It has no way to know you’re aware of the problem and haven’t merged it for your own reasons: maybe you disagree with the fix, maybe it’s lower priority, maybe you’re on a boat and won’t get to it for a couple weeks. That context is invisible to the tool. Jules found a real vulnerability — TOCTOU bugs in file operations are a genuine class of security problem — and it was right to flag it… once.&lt;/p&gt;&lt;figure&gt;&lt;img src="/p/the-maintainers-dilemma/jules-duplicate-prs.jpg" alt="GitHub pull request list with dozens of duplicate Jules PRs across fileflow and pathologize"&gt;&lt;/figure&gt;&lt;p&gt;For the mechanical work — flagging issues, updating dependencies, drafting boilerplate responses — the tools are genuinely useful. But Jules and Copilot couldn’t tell me whether one of those 55 Afero PRs belongs in the project at all. That judgment requires knowing the codebase’s past and future, not just its present state.&lt;/p&gt;&lt;p&gt;These tools work only from what’s visible: the code, the open issues, the PR history. Maintainers work from the visible and the invisible: the context that never made it into comments, the constraints nobody wrote down, the internal debates that shaped the API. The gap between those two things is where human judgment is most irreplaceable, and where AI is most blind.&lt;/p&gt;&lt;p&gt;Russ Cox, who I worked with on the Go team, put this well in a &lt;a href="https://groups.google.com/g/golang-dev/c/4Li4Ovd_ehE/m/8L9s_jq4BAAJ"&gt;recent discussion&lt;/a&gt; about AI contributions: “People brag about codebases of hundreds of thousands of lines that have never been viewed by people, churned out in record time. On closer inspection, these codebases invariably turn out to be more like dancing elephants than useful engineering artifacts.”&lt;/p&gt;&lt;p&gt;He’s right about novel code. But I keep coming back to the distinction between writing new software and maintaining existing software. Dependency updates aren’t dancing elephants. Triaging a stale issue isn’t a creative act. Telling a contributor “thanks, we’re not accepting changes to this API” is just keeping the lights on. And right now, for millions of projects, the lights are off.&lt;/p&gt;&lt;p&gt;That isn’t the biggest challenge, though. What most people don’t realize is that evaluating and merging changes is far harder than writing new code. Understanding how a change fits into the existing codebase, its history, and its plans requires knowledge that’s partly invisible — not in the code, not in the comments, not in the issues. It’s in the maintainer’s head. And some of it is deeply creative work, requiring the kind of judgment no model can replicate.&lt;/p&gt;&lt;h2 id="what-protected-actually-protects"&gt;What “Protected” Actually Protects&lt;/h2&gt;&lt;p&gt;The Go project is genuinely beautiful to me — meticulous reviews, design discussions that ran for months before anything shipped, a review culture refined over 15 years. That’s the ideal. But Go is exceptional in ways most projects can’t replicate: full-time contributors funded by Google, a mandate to build a language meant to last 50 years, rare external deadline pressure.&lt;/p&gt;&lt;p&gt;The Go team had a &lt;a href="https://groups.google.com/g/golang-dev/c/4Li4Ovd_ehE/m/8L9s_jq4BAAJ"&gt;long thread recently&lt;/a&gt; about whether to accept AI-authored contributions — the same discussion where Russ Cox’s quote above originated. These are people I worked with for years — same reviews, same proposals, same arguments at the same whiteboards. Reading the thread, I could hear their voices. And I could see how every one of them was right, and why that was the problem.&lt;/p&gt;&lt;p&gt;Rob Pike went first and didn’t equivocate: “This is a very slippery slope. Be careful on your first step. I recommend simply saying, no.” That’s Rob. Direct, principled, and usually right. Then Alan Donovan pointed out the uncomfortable reality: “I suspect a significant fraction of CLs we receive today already include fragments of LLM-generated code, whether the authors admit it or not.” The horse, in other words, has already left the barn.&lt;/p&gt;&lt;p&gt;Russ Cox wrote the most thoughtful response I’ve seen anyone write about this. His core point: “The most important thing we can do is to maintain our usual processes around code review and code quality… That same bar must still apply when some or all of the code was written with the help of AI-based tools.” And: “Your responsibilities are not lessened when you use AI tools for your work.”&lt;/p&gt;&lt;p&gt;Every one of these positions is reasonable. And every one of them shares an assumption that exposes the core of the dilemma: they assume there are humans available to review.&lt;/p&gt;&lt;p&gt;Go can afford to say “maintain the same bar” because it has full-time contributors funded by Google. It has reviewers. It has a review culture that’s been refined for over a decade. Rob can say “just say no” because Go has enough people to say “yes” to the important things.&lt;/p&gt;&lt;p&gt;Afero doesn’t. Most open source projects don’t. When Rob Pike says no, the Go project keeps functioning. When I say no, the PR just sits there. Those are different kinds of “no.”&lt;/p&gt;&lt;p&gt;There’s a spectrum, and where you land on it depends on what you’re actually choosing between. In practice, maintainers face five options:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Human writes, human reviews.&lt;/li&gt;&lt;li&gt;AI writes, human reviews.&lt;/li&gt;&lt;li&gt;Human writes, AI reviews.&lt;/li&gt;&lt;li&gt;AI writes, AI reviews, human clicks merge.&lt;/li&gt;&lt;li&gt;AI writes, AI reviews, AI clicks merge.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Each step down that list typically trades rigor for velocity, and trust for throughput. But for most projects — certainly for many of mine — there’s a sixth option that doesn’t appear on that list: human or AI writes, nobody reviews.&lt;/p&gt;&lt;h2 id="what-were-really-protecting"&gt;What We’re Really Protecting&lt;/h2&gt;&lt;figure&gt;&lt;img src="/p/the-maintainers-dilemma/the-handshake.jpg" alt="Human and brass clockwork hands reaching toward each other in darkness, with a faint glow between them"&gt;&lt;/figure&gt;&lt;p&gt;When a maintainer reviews a contributor’s PR, there’s an unspoken contract. The contributor invested hours understanding the codebase, writing tests, and submitting something clean. The reviewer invests hours evaluating it, pushing back, and suggesting improvements. Both people learn. The reviewer understands a new corner of the project. The contributor gets better at the codebase’s idioms. A relationship forms. That exchange is a big part of what makes open source a community instead of just a supply chain.&lt;/p&gt;&lt;p&gt;Bryan Cantrill at Oxide described this contract precisely in their &lt;a href="https://rfd.shared.oxide.computer/rfd/0576"&gt;internal policy on LLM use&lt;/a&gt;: ordinarily, “it is presumed that of the reader and the writer, it is the writer that has undertaken the greater intellectual exertion.” When the writing is AI-generated, “this social contract becomes ripped up.” The same holds for code review — we expect the reviewer to invest effort because the author invested effort. If neither did, what’s the review even for? Oxide’s answer is that the human stays accountable regardless; the tool doesn’t absorb the responsibility. That’s the right instinct. But it assumes someone is actually there to take responsibility.&lt;/p&gt;&lt;p&gt;For most projects, nobody is. The social contract isn’t being broken by AI — it’s already being broken by silence. The contributor who submitted a clean, well-tested patch six months ago and never heard back isn’t experiencing a degraded version of the ideal. They’re experiencing nothing.&lt;/p&gt;&lt;p&gt;Is a perfect social contract that never happens better than an imperfect one that does?&lt;/p&gt;&lt;p&gt;&lt;span&gt;A response from an AI in a day might be more respectful than silence from a human forever.&lt;/span&gt;&lt;/p&gt;&lt;h2 id="the-experiment-ahead"&gt;The Experiment Ahead&lt;/h2&gt;&lt;p&gt;I’ve decided to find out. I’ve been staring at 55 open PRs on Afero long enough to know that deliberation has become its own form of neglect.&lt;/p&gt;&lt;p&gt;Will AI tools make me more engaged, freeing me to focus on decisions that actually need me? Or will it feel less connected — the human element reduced by one more degree? I don’t know how it feels to have an AI review a PR instead of a human, or whether accountability holds when the effort on both sides is diminished. That’s the experiment.&lt;/p&gt;&lt;p&gt;Russ said something else in that thread I keep returning to: “The most important thing is to keep thinking. The tools make it very easy to turn off your brain, but if you are careful to avoid that trap, you can produce good work.” That’s the line I’m trying to walk. Let AI handle the volume. Stay responsible for the judgment.&lt;/p&gt;&lt;p&gt;There’s no universal policy that works for both Go and Afero. There shouldn’t be.&lt;/p&gt;&lt;p&gt;The protected branch is still protected. I’m just not sure what that even means anymore.&lt;/p&gt;&lt;p&gt;Have you run into this? I’d especially like to hear from maintainers who’ve tried AI review — what held, and what broke.&lt;/p&gt;&lt;/div&gt;</description>
            <pubDate>Fri, 22 May 2026 15:43:35 +0000</pubDate>
            <guid>https://spf13.com/p/the-maintainers-dilemma/</guid>
        </item>
        <item>
            <title>CSS &amp;amp; vertical rhythm for text, images, and tables</title>
            <link>https://vincent.bernat.ch/en/blog/2026-css-vertical-rhythm</link>
            <description>&lt;blockquote&gt;&lt;hr&gt;&lt;/blockquote&gt;&lt;div&gt;
    &lt;article data-pagefind-body&gt;
      &lt;header&gt;
        
        &lt;h2 data-pagefind-ignore&gt;
          Vincent Bernat
          &lt;time datetime="2026-04-22T19:48:10Z"&gt;
                      April 22, 2026
                  &lt;/time&gt;
        &lt;/h2&gt;
              &lt;/header&gt;
      &lt;div&gt;

&lt;p&gt;Vertical rhythm aligns lines to a consistent spacing cadence down the page. It
creates a predictable flow for the eye to follow. Thanks to the &lt;code&gt;rlh&lt;/code&gt; CSS unit,
vertical rhythm is now easier to implement for text.&lt;sup id="fnref-pawel"&gt;&lt;a href="#sidenote-pawel"&gt;1&lt;/a&gt;&lt;/sup&gt; But illustrations
and tables can disrupt the layout. The amateur typographer in me wants to follow
Bringhurst’s wisdom:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Headings, subheads, block quotations, footnotes, illustrations, captions and
other intrusions into the text create syncopations and variations against the
base rhythm of regularly leaded lines. These variations can and should add
life to the page, but the main text should also return after each variation
precisely on beat and in phase.&lt;/p&gt;
&lt;p&gt;― &lt;em&gt;Robert Bringhurst&lt;/em&gt;, &lt;a href="https://en.wikipedia.org/wiki/The_Elements_of_Typographic_Style" title="The Elements of Typographic Style on Wikipedia"&gt;The Elements of Typographic Style&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="text"&gt;Text&lt;a href="#text" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Three factors govern vertical rhythm: &lt;strong&gt;font size&lt;/strong&gt;, &lt;strong&gt;line height&lt;/strong&gt; and
&lt;strong&gt;margin or padding&lt;/strong&gt;. Let’s set our baseline with an 18-pixel font and a 1.5
line height:&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;112.5&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1.5&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;html&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blockquote&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;
&lt;span&gt;dl&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dt&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dd&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ol&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://www.w3.org/TR/css-values-4/" title="CSS Values and Units Module Level 4, W3C Working Draft"&gt;CSS Values and Units Module Level 4&lt;/a&gt; defines the &lt;code&gt;rlh&lt;/code&gt; unit, equal to the
computed line height of the root element. All browsers support it &lt;a href="https://webstatus.dev/features/rlh" title="rlh unit on Web Platform Status"&gt;since
2023&lt;/a&gt;.&lt;sup id="fnref-postcss"&gt;&lt;a href="#sidenote-postcss"&gt;2&lt;/a&gt;&lt;/sup&gt; Use it to insert vertical spaces or to fix the line height
when altering font size:&lt;sup id="fnref-calc"&gt;&lt;a href="#sidenote-calc"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;h4&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;h1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2.4&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;h2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1.5&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;h3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1.2&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;p&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;blockquote&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pre&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;margin-top&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;aside&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;font-size&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.875&lt;/span&gt;&lt;span&gt;rem&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We can check the result by overlaying a grid&lt;sup id="fnref-grid"&gt;&lt;a href="#sidenote-grid"&gt;4&lt;/a&gt;&lt;/sup&gt; on the content:&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;&lt;span&gt;&lt;img alt="Screenshot of my website with a grid as an overlay and each line of text
fitting on the grid" src="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/text@1x.17b2e8512acd85.png" srcset="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/text@1x.17b2e8512acd85.png 855w,https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/text@2x.93207136439be4.png 1360w" sizes="auto, (max-width: 680px) 100vw, 680px" width="680" height="713" loading="lazy" decoding="async"&gt;&lt;/span&gt;&lt;/p&gt;&lt;figcaption&gt;Using CSS &lt;code&gt;rlh&lt;/code&gt; unit to set vertical space works well for text. You can display the grid using &lt;kbd&gt;Ctrl&lt;/kbd&gt;+&lt;kbd&gt;Shift&lt;/kbd&gt;+&lt;kbd&gt;G&lt;/kbd&gt;.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;If a child element uses a font with taller intrinsic metrics, it may stretch
the line’s box beyond the configured line height.&lt;sup id="fnref-line-height"&gt;&lt;a href="#sidenote-line-height"&gt;5&lt;/a&gt;&lt;/sup&gt; A workaround
is to reduce the line height to 1. The glyphs overflow but don’t push the line
taller.&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kbd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;line-height&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="responsive-images"&gt;Responsive images&lt;a href="#responsive-images" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Responsive images are difficult to align on the grid because we don’t know their
height. &lt;a href="https://www.w3.org/TR/css-rhythm-1/" title="CSS Rhythmic Sizing Module Level 1"&gt;CSS Rhythmic Sizing Module Level 1&lt;/a&gt; introduces the &lt;code&gt;block-step&lt;/code&gt;
property to adjust the height of an element to a multiple of a step unit. But
most browsers don’t support it yet.&lt;/p&gt;
&lt;p&gt;With JavaScript, we can add padding around the image so it does not disturb
the vertical rhythm:&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;targets&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;querySelectorAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;".lf-media-outer"&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;
&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adjust&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;parseFloat&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;getComputedStyle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;document&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;documentElement&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;lineHeight&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;Math&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ceil&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;style&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;px 0`&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;};&lt;/span&gt;

&lt;span&gt;targets&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;forEach&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adjust&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;el&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;clientHeight&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;figure&gt;&lt;p&gt;&lt;span&gt;&lt;img alt="Screenshot of my website with a grid as an overlay and an image not breaking
the vertical rhythm. Additional padding is visible before and after the image.
The height of the image with padding is
216." src="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/images@1x.08d84fe73e020f.png" srcset="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/images@1x.08d84fe73e020f.png 855w,https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/images@2x.5e994bde851c27.png 1360w" sizes="auto, (max-width: 680px) 100vw, 680px" width="680" height="713" loading="lazy" decoding="async"&gt;&lt;/span&gt;&lt;/p&gt;&lt;figcaption&gt;The image is snapped to the grid thanks to the additional padding computed with JavaScript. 216 is divisible by 27, our line height in this example.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;As the image is responsive, its height can change. We need to wrap a resize
observer around the &lt;code&gt;adjust()&lt;/code&gt; function:&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ro&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ResizeObserver&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;entries&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entries&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;contentBoxSize&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;blockSize&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;adjust&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;entry&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;height&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;});&lt;/span&gt;
&lt;span&gt;for&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;targets&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;ro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;observe&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;h2 id="tables"&gt;Tables&lt;a href="#tables" title="Permanent link"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Table cells could set &lt;code&gt;1rlh&lt;/code&gt; as their height but they would feel constricted.
Using &lt;code&gt;2rlh&lt;/code&gt; wastes too much space. Instead, we use &lt;a href="https://markboulton.co.uk/journal/incremental-leading/" title="Incremental leading"&gt;incremental leading&lt;/a&gt;: we
align one in every five lines.&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;border-spacing&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;px&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;border-collapse&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;separate&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;th&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.4&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;td&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
&lt;span&gt;    &lt;/span&gt;&lt;span&gt;padding&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.2&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt;em&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;
&lt;span&gt;  &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To align the elements after the table, we need to add some padding. We can
either reuse the JavaScript code from images or use a few lines of CSS that
count the regular rows and compute the missing vertical padding:&lt;/p&gt;
&lt;div&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;table&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;nth-child&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;last-child&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;   &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.2&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;table&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;nth-child&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5n&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;last-child&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.8&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;table&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;nth-child&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5n&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;last-child&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.4&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;table&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;nth-child&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5n&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;last-child&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;span&gt;table&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tbody&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tr&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;nth-child&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;5n&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;last-child&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;padding-bottom&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0.6&lt;/span&gt;&lt;span&gt;rlh&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;A header cell has twice the padding of a regular cell. With two regular rows,
the total padding is 2×2×0.2+2×0.4=1.6. We need to add &lt;code&gt;0.4rlh&lt;/code&gt; to reach
&lt;code&gt;2rlh&lt;/code&gt; of extra vertical padding across the table.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;&lt;span&gt;&lt;img alt="Screenshot of my website with a grid as an overlay and a table following the
vertical rhythm. Additional padding is visible after the table. The height of
the table with padding is 405." src="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/tables@1x.56e678195427d0.png" srcset="https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/tables@1x.56e678195427d0.png 855w,https://d2pzklc15kok91.cloudfront.net/images/vertical-rhythm/tables@2x.19b9c475806bf5.png 1360w" sizes="auto, (max-width: 680px) 100vw, 680px" width="680" height="590" loading="lazy" decoding="async"&gt;&lt;/span&gt;&lt;/p&gt;&lt;figcaption&gt;One line out of five is aligned to the grid. Additional padding is added after the table to not break the vertical rhythm. 405 is divisible by 27, our line height in this example.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;None of this is necessary. But once you start looking, you can’t unsee it. Until
browsers implement &lt;a href="https://www.w3.org/TR/css-rhythm-1/" title="CSS Rhythmic Sizing Module Level 1"&gt;CSS Rhythmic Sizing&lt;/a&gt;, a
bit of CSS wizardry and a touch of JavaScript is enough to pull it off. The main
text now returns after each intrusion “precisely on beat and in phase.” &#127932;&lt;/p&gt;

      &lt;/div&gt;
    &lt;/article&gt;
  &lt;/div&gt;</description>
            <pubDate>Tue, 12 May 2026 06:29:38 +0000</pubDate>
            <guid>https://vincent.bernat.ch/en/blog/2026-css-vertical-rhythm</guid>
        </item>
        <item>
            <title>Task Paralysis &amp;amp; AI | g5t.de</title>
            <link>https://g5t.de/articles/20260510-task-paralysis-and-ai/index.html</link>
            <description>&lt;blockquote&gt;&lt;hr&gt;&lt;/blockquote&gt;&lt;div&gt;
        
        &lt;x-article-metalines published="2026-05-10" updated="2026-05-10" author="Daniel Gilbert"&gt;&lt;/x-article-metalines&gt;
        &lt;h4&gt;About Task Paralysis&lt;/h4&gt;
        &lt;p&gt;Straight away: I am not diagnosed yet. So I'm hesitant to say "I have ADHD", because the truth is: I don't know it. There are signs: My siblings have been diagnosed as kids, and I'm personally struggling with tasks that others deem to be "easy". I have a tremendous need for novelty, and I can hardly picture myself doing the same job for the next 30 years.&lt;/p&gt;
        &lt;p&gt;I'm not kidding: At the moment, I change roles every 2-3 years. This isn't really sustainable. Due to circumstances out of my control, I wasn't able to tackle that earlier.&lt;/p&gt;
        &lt;p&gt;Also, it doesn't really help if you want to build a career: I can navigate myself around a lot of technical fields, but I have no special knowledge.&lt;/p&gt;
        &lt;p&gt;Often, I struggle with the execution of a strategy that I successfully laid out. I will simply refuse to do the first step, because everything now feels overwhelming.&lt;/p&gt;
        &lt;p&gt;So... there are signs. Yes. But that might be another article.&lt;/p&gt;
        &lt;p&gt;I'm aware that there is something called &lt;a href="https://en.wikipedia.org/wiki/Analysis_paralysis"&gt;Analysis Paralysis&lt;/a&gt;. But that's different, at least for me and to my understanding. Let me put it this way: When &lt;em&gt;Analysis Paralysis&lt;/em&gt; kicks in, my brain will run in circles. When &lt;em&gt;Task Paralysis&lt;/em&gt; kicks in, my brain won't run at all. That sucks.&lt;/p&gt;
        &lt;h4&gt;About AI&lt;/h4&gt;
        &lt;p&gt;I won't go as far and say that I HATE AI per se. I just shelled out almost 100 € in tokens (&lt;em&gt;Max&lt;/em&gt;-plan for Claude) to code a game. And an iOS App. Because I need the latter and want the former. But I see all the negative effects that come with AI: People are loosing their jobs, sometimes loosing themselves. Art gets stolen, and suddenly, piracy isn't piracy any longer once large companies are doing the deed. That feels unfair, to say the least, and strange at best.
        &lt;/p&gt;&lt;p&gt;&lt;small&gt;(I &#128116; grew up in the 2000s, so I have &lt;em&gt;some&lt;/em&gt; knowledge about piracy from back in the days, and how copyright holders went after people.)&lt;/small&gt;&lt;/p&gt;
        &lt;p&gt;I refrain to use AI for anything artistic since a couple of months. I either buy it, or try to do it myself "the old way". I can fail, I can succeed - but I did it on my own. That's important. The effect AI has on artists feels just too destructive.&lt;/p&gt;
        &lt;h4&gt;What is it good for?&lt;/h4&gt;
        &lt;p&gt;For me, personally? It helps me overcome my task paralysis. As mentioned earlier: I have a plan. A strategy. An idea. I just need someone (or something), who has fun in churning through the implementation. I have the ideas. But boy is coding exhausting. As I learned quite late in my life, it is indeed not normal to fight with your motivation to create code every time you tackle a new user story, but succeed once you started.&lt;/p&gt;
        &lt;h4&gt;The Catch&lt;/h4&gt;
        &lt;p&gt;Claude Code in this case is the &lt;em&gt;something&lt;/em&gt; that just helps me getting started. And, lo' and behold, I see myself struggling to not get addicted to that.&lt;/p&gt;
        &lt;p&gt;What do I mean by that? While overcoming the task paralysis on one hand, it quickly produces really good results. Last time I tried AI was in fall of 2025. It's an understatement to say that a lot has changed. There are worlds between what is possible today and what was possible back then.&lt;/p&gt;
        &lt;p&gt;That means that the dopamine really kicks fast, because the cycle between "I have an idea" and "This is the result!" is so tremendously short. But Claude has token limits. You can only spend a limited amount of tokens per 5 hours or 7 days. But you can buy additional API tokens. And now you set yourself in a position where you throw endless money at your source of dopamine, like a junkie running to their dealer, begging for the next shot. Or a poor player waiting for the golden ticket.&lt;/p&gt;
        &lt;p&gt;And, to be brutally honest: I know because I fell for it. After getting the &lt;em&gt;Pro&lt;/em&gt;-plan, I added another 20 € for API credits. After that, I realized I should go for &lt;em&gt;Max&lt;/em&gt; for this month, and also leverage some tricks like &lt;code&gt;/modus opusplan&lt;/code&gt; to reduce the amount of tokens that are used.&lt;/p&gt;
        &lt;p&gt;But the dopamine feels so freaking good.&lt;/p&gt;   
        &lt;p&gt;&lt;small&gt;Disclaimer: No AI was used to create this article.&lt;/small&gt;&lt;/p&gt;     
    &lt;/div&gt;</description>
            <pubDate>Sun, 10 May 2026 17:06:29 +0000</pubDate>
            <guid>https://g5t.de/articles/20260510-task-paralysis-and-ai/index.html</guid>
        </item>
        <item>
            <title>Die dänische Entscheidung, konsequent für Wohlbefinden zu sorgen</title>
            <link>https://blog.vanessagiese.de/2026/04/25/tourblog-4-luebeck-kopenhagen-die-daenische-entscheidung-konsequent-fuer-wohlbefinden-zu-sorgen/?pk_kwd=tourblog-4-luebeck-kopenhagen-die-daenische-entscheidung-konsequent-fuer-wohlbefinden-zu-sorgen</link>
            <description>&lt;blockquote&gt;&amp;quot;Morgen fahren wir nicht nur 800 Kilometer nach Hause. Wir reisen 30 Jahre in der Zeit zurück.&amp;quot;&lt;hr&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Prolog |&amp;nbsp;&lt;/strong&gt;Am Abend vor unserer Abreise sagte ich zum Reiseleiter: „Morgen fahren wir nicht nur 800 Kilometer nach Hause. Wir reisen 30 Jahre in der Zeit zurück.“&lt;/p&gt;&lt;p&gt;Damit meinte ich nicht die Digitalisierung in Dänemark. Vielmehr meine ich damit die Art, wie Dänen und insbesondere die Kopenhagener Zusammenleben gestalten.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Das Design |&lt;/strong&gt; Wenn man Dänemarks und Kopenhagens Idee von Stadtplanung verstehen will, kommt man nicht an Jan Gehl vorbei. Foto aus dem &lt;em&gt;&lt;a href="https://dac.dk/en" target="_blank" rel="noopener" title&gt;Danish Architecture Center&lt;/a&gt;&lt;/em&gt;:&lt;/p&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl.jpeg"&gt;&lt;img fetchpriority="high" decoding="async" width="1500" height="1125" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl.jpeg" alt="Im Vordergrund Notizbücher Jan Gehls mit Fotos und Notizen, im Hintergrund ein Foto von ihm und ein Fernseher, auf dem ein Film läuft." srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl-260x195.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl-545x409.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl-768x576.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_JanGehl-1320x990.jpeg 1320w" sizes="(max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Als der 79-Jährige seinerzeit Architektur studierte, zeigten ihm seine Professoren Fotos mit Gebäuden. Um die Fotos zu machen, sind sie um 5 Uhr aufgestanden, damit keine Menschen auf den Bildern zu sehen waren. Gehl sagt, er habe im Studium gelernt, Skulpturen zu erschaffen, keine Gebäude für Menschen. Dann heiratete er eine Psychologin, „a big crossing point in my life“. Seither, sagt er, studiere er Architektur neu, seit 40 Jahren.&lt;/p&gt;&lt;p&gt;Das erzählt er in seiner Standardvorlesung, die zum Beispiel als &lt;a href="https://www.youtube.com/watch?v=4ODzOv5OH6s" target="_blank" rel="noopener" title&gt;Annual Lecture 2018 &lt;em&gt;Mistra Urban Future&lt;/em&gt;s&lt;/a&gt; zu sehen ist, Video ab Minute 8:30. Oder im Podcast &lt;em&gt;&lt;a href="https://thedeveloper.live/podcasts/podcasts/first-life-then-spaces-then-buildings-the-other-way-around-never-works-" target="_blank" rel="noopener" title&gt;The Developer.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Gehl begann, Menschen zu beobachten. Er fuhr nach Italien und führte in den Altstädten akkurat Buch darüber, was in den Straßen, Gassen und auf den Plätzen geschah. Er schrieb auf, wie sich Menschen verhalten. Er bereiste andere Länder, andere Städte. Ihm wurde klar, dass die Architektur bislang einem Irrtum unterlegen war: Sie maß, wie viele Menschen wo gehen und fahren – um dann Straßen und Häuser zu gestalten. Dabei sei nicht wichtig, wo sie sich bewegen, sondern wo sie stehenbleiben, in Kontakt kommen, miteinander sprechen. So entstand Gehls &lt;a href="https://www.gehlpeople.com/company/" target="_blank" rel="noopener" title&gt;Verständnis von Stadtplanung&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;A good city is like a good party — people stay longer than really necessary because they are enjoying themselves.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Er beschäftigte sich mit menschlichen Dimensionen, mit Augenhöhen, Sichtachsen, wie weit wir gucken und laufen können, bei welchen Geschwindigkeiten wir noch was wahrnehmen können, welche Strecken wir wählen, warum wir lieber am Rand sitzen als in der Mitte, bis zu welcher Entfernung wir Mimik lesen können und vieles mehr.&lt;/p&gt;&lt;p&gt;Gehl kam zu dem Schluss, das der Mensch alles tut, um Energie zu sparen. Wenn wir uns entscheiden, wie wir eine Strecke zurücklegen, dann ist es immer eine Effizienzentscheidung. Also, sagte er sich, müssen Städte so gestaltet sein, dass sie effizient und bequem sind – nicht für ein Auto, sondern für den Menschen, für den menschlichen Körper und den menschlichen Geist.&lt;/p&gt;&lt;p&gt;Das Ergebnis ist eine Stadtplanung, die Plätze und Räume priorisiert, auf denen Menschen zusammenkommen und sich sicher fühlen, eine Planung, die am menschlichen Körper ausgerichtet ist, die Aktivität fördert und Gesundheit erhält. Er entwickelte eine demokratische Stadtplanung, die wiederum Demokratie fördert.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It emphasizes that we shall walk more, we shall meet each other more. That’s good for health, that’s good for safety, that’s good for social inclusion, that’s good for democracy. Don’t sit in your private little house and look out of little little windows. Come out in our wonderful outdoor spaces and enjoy the spaces with your wonderful fellow citizens.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Filmempfehlung: &lt;em&gt;The Human Scale&lt;/em&gt;, verfügbar &lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=OlrXeh1z1LU" target="_blank" rel="noopener" title&gt;auf youtube&lt;/a&gt;&lt;/em&gt;. Leseempfehlung: &lt;em&gt;&lt;a href="https://jovis.de/de/book/9783868598223" target="_blank" rel="noopener" title&gt;Städte für Menschen&lt;/a&gt;&lt;/em&gt;. Außerdem &lt;a href="https://www.deutschlandfunk.de/die-stadt-planen-3-4-jan-gehl-der-menschenfreundliche-100.html" target="_blank" rel="noopener" title&gt;ein Interview beim Deutschlandfunk&lt;/a&gt;.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Wege und Plätze |&amp;nbsp;&lt;/strong&gt;Der Reiseleiter und ich sind in den vergangenen Jahren mehr als tausend Kilometer mit dem Fahrrad durch Dänemark gefahren. Diese Mobilitätsform hat zwar den Nachteil, dass einem immer irgendwas weh tut und man sich fortwährend mit Keksen befüllen muss. Sie hat jedoch einen entscheidenden Vorteil: Man erkennt hervorragend Muster und Zusammenhänge, Verbindungen zwischen Menschen und Geographie, zwischen Städten und Stadtteilen, sich wiederholende Strukturen und die Prioritäten, die sich durchs Land ziehen. Diese Prioritäten finden in Kopenhagen ihren kummulierten Höhepunkt: Allerorten geht es darum, Gemeinschaft zu stärken. Der öffentliche Raum gehört dem Menschen, nicht Autos, nicht der Wertschöpfung, sondern dem Wohlbefinden der Däninnen und Dänen. Der Mensch wird willkommen geheißen: mit Bänken und Blumen, Schatten spendenden Bäumen, Spielgeräten, Wasser, Schaukeln und Rutschen – auch für Erwachsene -, mit Ruheliegen, Picknickmöglichkeiten, öffentlichen Toiletten, breiten Wegen und Beleuchtung.&lt;/p&gt;&lt;p&gt;Sollten Sie einmal in Kopenhagen sein, organisieren Sie sich ein Fahrrad und fahren Sie durch die Stadt. Sie werden erkennen, wie alles auf magische Weise verbunden ist, wie Wege sich öffnen und fügen, wie es fließt und wie verschiedene Orte und unterschiedliche Stadtteile sich zu einem verwobenen Ganzen zusammenfügen, das ohne Motor, nur mit menschlicher Körperkraft erfahrbar ist. Es existieren viele Plätze, die im Einzelnen unscheinbar wirken, die in ihrer Fülle und in ihrer Verbindung jedoch ein Netz bilden, das nicht nur für den funktionalen Teil des Erwachsenendaseins, sondern fürs Zusammenleben aller Altersgruppen sicher und praktikabel ist.&lt;/p&gt;&lt;figure&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz.jpeg"&gt;&lt;img decoding="async" width="1500" height="1125" data-id="43385" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz.jpeg" alt="Im Hintergrund Mehrfamilienhäuser, davor Beete mit einem Weg dazwischen und Bänke. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz-260x195.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz-545x409.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz-768x576.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Sitzplatz-1320x990.jpeg 1320w" sizes="(max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz.jpeg"&gt;&lt;img decoding="async" width="1500" height="1125" data-id="43386" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz.jpeg" alt="Spielplatz mit einem abgestürzten Flugzeug (aus Holz), auf dem Kinder klettern. Dahinter Mehrfamilienhäuser. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz-260x195.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz-545x409.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz-768x576.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Spielplatz-1320x990.jpeg 1320w" sizes="(max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/figure&gt;&lt;p&gt;Kopenhagen hat weniger Spielplätze als deutsche Städte mit vergleichbarer Fläche. Es braucht auch nicht so viele, weil die Stadt selbst kinderfreundlich ist, weil sie Plätze hat, die zum Spielen, Rennen und Verstecken einladen. Eingezäunte Spielplätze helfen nicht, wenn die Stadt außerhalb des Zauns feindlich ist.&lt;/p&gt;&lt;p&gt;Dass Kinder Teil der Stadt sind, zeigt sich auch am &lt;em&gt;Israels Plads&lt;/em&gt;, einem großen Platz, der umringt ist von Schulen (Foto des Reiseleiters aus dem vergangenen Juni):&lt;/p&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01.jpeg"&gt;&lt;img loading="lazy" decoding="async" width="1500" height="680" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01.jpeg" alt="Panoramaaufnahme eines PLatzes, viel Beton, ein paar Bäume, viele Kinder, Bänke, Stufen, eine Art Skatepark. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01-260x118.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01-545x247.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01-768x348.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_IsraelsPlads_01-1320x598.jpeg 1320w" sizes="auto, (max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Der Platz ist der Pausenplatz aller Schulen und gleichzeitig ein öffentlicher Ort. Kinder mischen sich mit Menschen, die einkaufen, mit Senioren, die sich ausruhen, mit Mittagspäuslern, die &lt;em&gt;Smørrebrød&lt;/em&gt; essen. Keine Haftungsfrage, keine Angst: ein Schulhof, nicht eingezäunt? Der Platz ist übrigens auch Teil der städtischen Klimaanpassung. Er ist ein Regenrückhaltebecken, das tiefer liegt als die Umgebung: Regnet es zu viel, läuft er voll.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Gebäude für alle |&amp;nbsp;&lt;/strong&gt;Wir radelten zu den &lt;a href="https://kulturogfritidn.kk.dk/huse/noerrebrohallen" target="_blank" rel="noopener" title&gt;Nørrebrohallen&lt;/a&gt;. Ein Treffpunkt, eine Bibliothek, Sporthallen – alles öffentlich, alles steht für alle zur Verfügug.&lt;/p&gt;&lt;figure&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02.jpeg"&gt;&lt;img loading="lazy" decoding="async" width="1392" height="831" data-id="43391" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02.jpeg" alt="Nørrebrohallen, ein Informationsdesk, dahinter eine Straßenbahn, eine Tür führt in eine Turnhalle. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02.jpeg 1392w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02-260x155.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02-545x325.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02-768x458.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_02-1320x788.jpeg 1320w" sizes="auto, (max-width: 1392px) 100vw, 1392px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01.jpeg"&gt;&lt;img loading="lazy" decoding="async" width="1500" height="1125" data-id="43392" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01.jpeg" alt="Eine Halle, darin Bücher, gebaute Stufen. Darin viele Menschen, darunter viele Kinder. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01-260x195.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01-545x409.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01-768x576.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Noerrebrohallen_01-1320x990.jpeg 1320w" sizes="auto, (max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;/figure&gt;&lt;p&gt;Es gibt mehrere ähnliche Orte in Kopenhagen. Über die Seite &lt;a href="https://bookbyen.dk" target="_blank" rel="noopener" title&gt;bookbyen.dk&lt;/a&gt; („Buch die Stadt“) kann jeder sich einen Platz, einen Raum buchen. Ein Badmintonkort kostet beispielsweise 98 Kronen pro Stunde, das sind etwa 13 Euro. Als wir dort waren, war massig los: Die Leute kamen aus den Sporthallen, gingen hinein, trafen sich im Café, saßen einfach nur auf Bänken, besuchten die öffentliche Toilette, den Bücherschrank oder waren alleine oder mit Kind in der Bücherei. In der Eingangshalle standen locker 25 Kinderwagen. Es gibt einen Kochclub und andere Interessenskreise, außerdem &lt;em&gt;Snakkeklubber&lt;/em&gt; für diverse Sprachen, in denen man seine Sprachkenntnisse vertiefen und sprechen üben kann – auch in Dänisch für alle Zugewanderten.&lt;/p&gt;&lt;p&gt;Wir hielten uns dort eineinhalb Stunden auf, lasen, aßen etwas. Ich nahm ein Buch aus dem Bücherschrank mit, &lt;a href="https://app.thestorygraph.com/book_reviews/a0df9746-6ae6-44f3-8938-f1327cbf8dbb?sort=oldest" target="_blank" rel="noopener" title&gt;einen Krimi&lt;/a&gt;, mein erstes Buch, das ich auf Dänisch lese. Mit etwas Anstrengung verstehe ich gut; mein Vokabelschatz erweitert sich um Wörter wie „Tatort“, „Ertrinkungstod“, „Zeugenaussage“ – mein Dänischlehrer wird irritiert sein. Das Schöne an dem Ort: Wir fühlten uns willkommen, obwohl wir nur Gäste waren. Ein Ort der unkomplizierten Freundlichkeit.&lt;/p&gt;&lt;p&gt;Die Bibliothek in den Nørrebrohallen war ein warmer, wuseliger, kreativer Ort. &lt;em&gt;Den Sorte Diamant&lt;/em&gt;, &lt;a href="https://de.wikipedia.org/wiki/Den_Sorte_Diamant" target="_blank" rel="noopener" title&gt;Der Schwarze Diamant&lt;/a&gt;, die Dänische Nationalbibliothek, ist deutlich minimalistischer und vor allem dem Studium gewidmet.&lt;/p&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01.jpeg"&gt;&lt;img loading="lazy" decoding="async" width="1500" height="1125" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01.jpeg" alt="Die Einganngshalle, fotografiert aus dem höchsten Stockwerk: geschwungene Seitenwände, die wie Wellen anmuten, Blick aufs Wasser, Holz. " srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01-260x195.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01-545x409.jpeg 545w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01-768x576.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_SorteDiamant_01-1320x990.jpeg 1320w" sizes="auto, (max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Eine tolle Architektur.&lt;/p&gt;&lt;p&gt;Im Museum für Architektur und Design gab es übrigens eine Rutsche vom obersten Stockwerk ins Erdgeschoss – ausdrücklich auch für Erwachsene (&lt;a href="https://dac.dk/en/exhibitions/dac-slide" target="_blank" rel="noopener" title&gt;mehr dazu, mit Bild&lt;/a&gt;). Ein wilder Ritt. Ich sah mein Leben an mir vorbeiziehen.&lt;/p&gt;&lt;figure&gt;&lt;a href="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche.jpeg"&gt;&lt;img loading="lazy" decoding="async" width="1500" height="2000" src="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche.jpeg" alt="Vanessa sitzt im Eingang einer Röhrenrutsche und sieht sich zum Fotografen um. Überschrift &amp;quot;Fast Track&amp;quot;." srcset="https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche.jpeg 1500w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche-260x347.jpeg 260w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche-450x600.jpeg 450w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche-768x1024.jpeg 768w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche-1152x1536.jpeg 1152w, https://blog.vanessagiese.de/wp-content/uploads/2026/04/20260414_Museum_Architektur_Rutsche-1320x1760.jpeg 1320w" sizes="auto, (max-width: 1500px) 100vw, 1500px"&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Rutschen-Architekt Carsten Höller:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Why are slides not used in architecture to complement stairs, elevators and escalators? They are fast, safe and energy-savvy – and they produce a sensation in the user that has been described as a kind of voluptuous panic upon an otherwise lucid mind, somewhere between delight and madness.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Das kann ich so bestätigen.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Epilog |&lt;/strong&gt;&amp;nbsp;„Aber in Deutschland ist doch nicht alles schlecht! – „30 Jahren hintendran – so kannst du das doch nicht sagen!“&lt;/p&gt;&lt;p&gt;In unserem Land sind Städte und Orte so gestaltet, dass sie funktionieren; dass sie effizient und vorschriftsgemäß sind. Dummerweise verhält sich der Mensch nicht normgerecht, sondern folgt seiner Intuition. In Dänemark passt sich die Stadt dem Menschen an, schafft Zugehörigkeit. In Deutschland muss sich der Mensch an die Stadt anpassen, steht der Individualismus über dem Gemeinsinn. Dieser Unterschied wirkt so fundamental, dass wir in Deutschland, selbst wenn alle Kommunen plötzlich Geld im Überfluss hätten, nur mehr von dem bekämen, was wir bereits haben: normtreu gestaltete Orte.&lt;/p&gt;&lt;p&gt;Bis wir diesen gedanklichen Sprung gemacht haben, werden Jahrzehnte vergehen.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Die Etappen |&lt;/strong&gt;&amp;nbsp;Auf der nächsten Etappe erzähle ich noch vom Radfahren in Kopenhagen:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://blog.vanessagiese.de/2026/04/16/tourblog-1-die-fahrt-der-wind-die-einoede-schnee-und-ein-baellebad/"&gt;#1 – Die Fahrt, der Wind, die Einöde, Schnee und ein Bällebad&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.vanessagiese.de/2026/04/19/tourblog-2-luebeck-kopenhagen-eine-erzaehlung-ueber-museen-und-friedhoefe/"&gt;#2 – Eine Erzählung über Museen und Friedhöfe&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://blog.vanessagiese.de/2026/04/20/tourblog3-luebeck-kopenhagen-bruecken-tunnel-und-faehren-ein-beitrag-fuer-den-freundeskreis-ingenieurskunst/" title="Tourblog#3 Lübeck – Kopenhagen: Brücken, Tunnel und Fähren – ein Beitrag für den Freundeskreis Ingenieurskunst"&gt;#3 – Brücken, Tunnel und Fähren – ein Beitrag für den Freundeskreis Ingenieurskunst &lt;/a&gt;&lt;/li&gt;&lt;li&gt;#5 – Test eines Mythos: Radfahren in Kopenhagen&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description>
            <pubDate>Sat, 25 Apr 2026 14:46:44 +0000</pubDate>
            <guid>https://blog.vanessagiese.de/2026/04/25/tourblog-4-luebeck-kopenhagen-die-daenische-entscheidung-konsequent-fuer-wohlbefinden-zu-sorgen/?pk_kwd=tourblog-4-luebeck-kopenhagen-die-daenische-entscheidung-konsequent-fuer-wohlbefinden-zu-sorgen</guid>
        </item>
    </channel>
</rss>