<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Cecilie Nordahl — Notes</title>
    <link>https://nordahl-resume.vercel.app/notes</link>
    <description>Technical notes from Cecilie Nordahl</description>
    <item>
      <title>What HTTP status codes actually promise (and how APIs quietly break that promise)</title>
      <link>https://nordahl-resume.vercel.app/notes/what-http-status-codes-actually-promise</link>
      <guid>https://nordahl-resume.vercel.app/notes/what-http-status-codes-actually-promise</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>I ran into a small but instructive mess recently while integrating with a third-party API: a single 403 response whose description string covered two completely different failure causes, one of which needed automatic handling and the other of which needed a human. It turned into a good excuse to think through something I&apos;d been fuzzy on for years — what HTTP status codes are actually *for*, and where the line sits between what belongs in the status line versus what belongs in the response body.
</description>
    </item>
    <item>
      <title>Coding From My Phone, and the One Thing That Kills It</title>
      <link>https://nordahl-resume.vercel.app/notes/coding-from-my-phone-and-the-one-thing-that-kills-it</link>
      <guid>https://nordahl-resume.vercel.app/notes/coding-from-my-phone-and-the-one-thing-that-kills-it</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>I&apos;ve been trying to get some real work done on side projects without being at my desk. Not writing code with my thumbs — steering an agent that writes the code. The agent does the typing, I read diffs and redirect. That part turns out to work surprisingly well on a phone. What took me longer to understand was that there are two fundamentally different ways to do it, they fail in completely different ways, and picking the wrong one cost me an afternoon.

## Two topologies, not one feature

The me</description>
    </item>
    <item>
      <title>Attention Is a Team Resource, Not a Personal Virtue</title>
      <link>https://nordahl-resume.vercel.app/notes/attention-is-a-team-resource-not-a-personal-virtue</link>
      <guid>https://nordahl-resume.vercel.app/notes/attention-is-a-team-resource-not-a-personal-virtue</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>![Abstract illustration of a person&apos;s attention fragmenting into a stream of notification icons and screens](/images/notes/attention-is-a-team-resource-not-a-personal-virtue/hero.jpg)

![Cover of Stolen Focus by Johann Hari](/images/notes/attention-is-a-team-resource-not-a-personal-virtue/stolen-focus-cover.jpg)

I got to thinking about this because I&apos;m currently reading *[Stolen Focus](https://www.bloomsbury.com/uk/stolen-focus-9781526620245/)* by Johann Hari — a book about why attention has co</description>
    </item>
    <item>
      <title>When the Logs Lie About Query Parameters</title>
      <link>https://nordahl-resume.vercel.app/notes/when-the-logs-lie-about-query-parameters</link>
      <guid>https://nordahl-resume.vercel.app/notes/when-the-logs-lie-about-query-parameters</guid>
      <pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate>
      <description>I recently chased down a small but surprisingly slippery issue: a `GET` request was clearly behaving as if a boolean flag was being sent, but the logs made it look like that flag had disappeared. At first glance it looked like a deployment problem or a code regression. It turned out to be neither.

What changed was the logging path, not the request itself.

## The symptom

The situation looked like this:

- the client code added a query parameter to a `GET` request
- the downstream response beha</description>
    </item>
    <item>
      <title>Staying a Developer While the Ground Moves</title>
      <link>https://nordahl-resume.vercel.app/notes/staying-a-developer-in-the-age-of-ai</link>
      <guid>https://nordahl-resume.vercel.app/notes/staying-a-developer-in-the-age-of-ai</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>The question I keep sitting with isn&apos;t whether AI will change software development — it obviously already has. It&apos;s how to stay a genuine, hands-on developer through that change rather than either ignoring it out of stubbornness or dissolving into someone who just prompts and reviews without really thinking. I don&apos;t think those are the only two options, but getting the third option right takes some deliberate direction.

## Two tracks, not one

I&apos;ve landed on treating this as two parallel tracks</description>
    </item>
    <item>
      <title>AI Won&apos;t Replace Me, But It Might Move the Goalposts</title>
      <link>https://nordahl-resume.vercel.app/notes/ai-won-t-replace-me-but-it-might-move-the-goalposts</link>
      <guid>https://nordahl-resume.vercel.app/notes/ai-won-t-replace-me-but-it-might-move-the-goalposts</guid>
      <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
      <description>I keep coming back to the same tension: AI is the most useful tool I&apos;ve been handed in my career, and also the thing most likely to quietly hollow out parts of the job I love. Both are true at once, and I think pretending otherwise — in either direction — is where people go wrong.

## The &quot;junior assistant&quot; model

The mental model that&apos;s worked best for me is treating AI like a junior assistant with more raw knowledge than me, but zero institutional memory and zero accountability. That combinati</description>
    </item>
    <item>
      <title>Defect Triage at Scale: Turning Tickets Into a Coordination Problem You Can Actually See</title>
      <link>https://nordahl-resume.vercel.app/notes/defect-triage-at-scale</link>
      <guid>https://nordahl-resume.vercel.app/notes/defect-triage-at-scale</guid>
      <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
      <description>When a program is small, a defect is just a ticket. Someone picks it up, fixes it, moves on. But once you grow past a handful of teams, defects stop being individual work items and quietly become a *coordination* problem. Who owns this? Which team last touched this functionality? Who&apos;s drowning right now? These questions don&apos;t answer themselves, and if you don&apos;t build a process to answer them, you find out the hard way — usually close to a release, when someone finally tallies the backlog and re</description>
    </item>
    <item>
      <title>Workflows as a Shared Language</title>
      <link>https://nordahl-resume.vercel.app/notes/camunda-workflows-in-practice</link>
      <guid>https://nordahl-resume.vercel.app/notes/camunda-workflows-in-practice</guid>
      <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
      <description>Most of the value I get from a workflow engine isn&apos;t the automation — it&apos;s the fact that a process model makes state and responsibility *visible*. When a business process lives as an executable diagram instead of scattered `if` statements across a dozen services, something shifts: developers, testers, and domain experts can all point at the same picture and actually mean the same thing. That&apos;s rare, and it&apos;s worth protecting.

The tool I have most in mind here is Camunda, a BPMN-based orchestrat</description>
    </item>
    <item>
      <title>Reviving a Userscript as a Bookmarklet</title>
      <link>https://nordahl-resume.vercel.app/notes/userscript-to-bookmarklet</link>
      <guid>https://nordahl-resume.vercel.app/notes/userscript-to-bookmarklet</guid>
      <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
      <description>A recent OS upgrade at work came with locked-down browser policies and no extension support. That killed a userscript I&apos;d been relying on daily — a small tool that enhanced a web app&apos;s search page by aggregating results into a floating panel. I didn&apos;t want to lose it, and waiting on IT to allowlist a userscript manager felt optimistic. So I converted it into a bookmarklet. The conversion is straightforward on paper but has enough gotchas that I want to write down what actually worked.

## Why a </description>
    </item>
    <item>
      <title>The Terminal&apos;s Canvas: A Deep Dive into CLI Text Editors</title>
      <link>https://nordahl-resume.vercel.app/notes/terminal-cli-text-editors</link>
      <guid>https://nordahl-resume.vercel.app/notes/terminal-cli-text-editors</guid>
      <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
      <description>I used to dread getting trapped in a terminal text editor, but over time, I&apos;ve found that
understanding what they are and why they exist takes away the fear. If you&apos;ve ever stared
at a blinking terminal cursor not knowing how to save your work, this guide is for you.

## What is a CLI Text Editor?

To dummy it down: text editors are basically programs used to edit files. They might seem
similar to word processors like Microsoft Word or Google Docs at first glance, but they
serve entirely differe</description>
    </item>
    <item>
      <title>Making Git Feel Less Like Typing: A Note on Aliases</title>
      <link>https://nordahl-resume.vercel.app/notes/git-aliases</link>
      <guid>https://nordahl-resume.vercel.app/notes/git-aliases</guid>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
      <description>I type the same handful of Git commands dozens of times a day, and `checkout`, `commit`, `status`, `branch` add up. Git aliases let you map short shortcuts to longer commands — `co` for `checkout`, `st` for `status` — so the muscle memory gets cheaper. Here&apos;s what I&apos;ve found worth knowing, including the bit that tripped me up: what these actually affect and how safely.

## The basic idea

An alias is just a stored mapping: a short name that expands to a longer command. You set them once and they</description>
    </item>
  </channel>
</rss>
