<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>paperhurts</title>
  <link>https://paperhurts.com/</link>
  <description>A post for each project: what it is, why it happened, and what I learned building it.</description>
  <atom:link href="https://paperhurts.com/feed.xml" rel="self" type="application/rss+xml"/>
  <item>
    <title>Why</title>
    <link>https://paperhurts.com/posts/why/</link>
    <guid>https://paperhurts.com/posts/why/</guid>
    <pubDate>Wed, 07 Oct 2026 21:56:00 GMT</pubDate>
    <description><![CDATA[<p>Are logical pixels and physical pixels so infuriating.</p>
]]></description>
  </item>
  <item>
    <title>Heresy</title>
    <link>https://paperhurts.com/posts/heresy/</link>
    <guid>https://paperhurts.com/posts/heresy/</guid>
    <pubDate>Sat, 26 Sep 2026 02:16:00 GMT</pubDate>
    <description><![CDATA[<p><img src="https://paperhurts.com/images/2026-09-26-0216-q1jr.png" alt="Saint Katherine does not approve" loading="lazy">
Thy name is humidity.</p>
<p>I’ve been wanting to paint for some time, which means I’m using <a href="https://paperhurts.dev/coatcheck/">https://paperhurts.dev/coatcheck/</a></p>
<p>But what fun is a progressive web app specifically designed to be a simplistic guide to when you can paint minis if it doesn’t have cute little sprites declaring heresy?</p>
<p>I guess it’s just <a href="https://paperhurts.com/posts/one-more-commit/">One more commit</a> at one AM again.</p>
]]></description>
  </item>
  <item>
    <title>Why clouds are white</title>
    <link>https://paperhurts.com/posts/volumetric-clouds/</link>
    <guid>https://paperhurts.com/posts/volumetric-clouds/</guid>
    <pubDate>Fri, 25 Sep 2026 21:30:00 GMT</pubDate>
    <description><![CDATA[<p>Let every photon bounce exactly once and a cloud renders as dirty gray smoke. Everything white about a cloud is light that bounced more than once. Drag the first slider to zero and watch.</p>
<figure class="demo"><iframe src="https://paperhurts.com/demos/volumetric-clouds.html" title="Volumetric clouds" loading="lazy"></iframe><figcaption>Volumetric clouds. <a href="https://paperhurts.com/demos/volumetric-clouds.html">Open it on its own page</a></figcaption></figure>
]]></description>
  </item>
  <item>
    <title>Caustics in shallow water</title>
    <link>https://paperhurts.com/posts/shallow-water/</link>
    <guid>https://paperhurts.com/posts/shallow-water/</guid>
    <pubDate>Fri, 25 Sep 2026 21:20:00 GMT</pubDate>
    <description><![CDATA[<p>The bright ripples on the bottom of a pool are light squeezed together by a wavy surface. This one computes them instead of painting them on, and runs the whole refraction three times so the edges pick up a rainbow.</p>
<figure class="demo"><iframe src="https://paperhurts.com/demos/shallow-water.html" title="Shallow water" loading="lazy"></iframe><figcaption>Shallow water. <a href="https://paperhurts.com/demos/shallow-water.html">Open it on its own page</a></figcaption></figure>
]]></description>
  </item>
  <item>
    <title>Plasma, the way a 486 did it</title>
    <link>https://paperhurts.com/posts/plasma/</link>
    <guid>https://paperhurts.com/posts/plasma/</guid>
    <pubDate>Fri, 25 Sep 2026 21:10:00 GMT</pubDate>
    <description><![CDATA[<p>The field is computed once: four sine waves per pixel, folded into a byte. After that, the only thing that moves is a 256-color lookup table. Your eye sees flowing liquid; the pixels never change.</p>
<figure class="demo"><iframe src="https://paperhurts.com/demos/plasma.html" title="Plasma, 320×240, 256 colors" loading="lazy"></iframe><figcaption>Plasma, 320×240, 256 colors. <a href="https://paperhurts.com/demos/plasma.html">Open it on its own page</a></figcaption></figure>
]]></description>
  </item>
  <item>
    <title>The ten minutes after a storm</title>
    <link>https://paperhurts.com/posts/after-the-storm/</link>
    <guid>https://paperhurts.com/posts/after-the-storm/</guid>
    <pubDate>Wed, 09 Sep 2026 19:24:00 GMT</pubDate>
    <description><![CDATA[<p>The best air of the day comes right after the rain quits. Everything drips, the road steams, and the frogs start up like someone flipped a breaker. I&#39;ve stopped trying to be useful in those ten minutes. I just go stand in them.</p>
]]></description>
  </item>
  <item>
    <title>How to draw rain with a for-loop</title>
    <link>https://paperhurts.com/posts/rain-with-a-for-loop/</link>
    <guid>https://paperhurts.com/posts/rain-with-a-for-loop/</guid>
    <pubDate>Sun, 30 Aug 2026 13:24:00 GMT</pubDate>
    <description><![CDATA[<p>Every drop falling behind this page is one line: a start point, a length, a speed, and a little wind. A few hundred of them, recycled forever. Weather, it turns out, is mostly a lot of small, simple things agreeing to fall at the same time.</p>
<p>Here&#39;s the whole idea, minus the drawing:</p>
<pre><code class="language-js">for (const drop of drops) {
  drop.y += drop.speed * dt;
  drop.x += drop.speed * wind * dt;
  if (drop.y &gt; height) recycle(drop); // start over
}
</code></pre>
<p>The part that makes it feel like weather rather than a screensaver is that rain only starts once the clouds are thick enough to hold it. Clouds roll in first, the sky goes gray, and then it rains. Nobody notices that rule until it&#39;s missing.</p>
]]></description>
  </item>
  <item>
    <title>Things to enjoy</title>
    <link>https://paperhurts.com/posts/things-worth-keeping/</link>
    <guid>https://paperhurts.com/posts/things-worth-keeping/</guid>
    <pubDate>Wed, 22 Jul 2026 18:12:00 GMT</pubDate>
    <description><![CDATA[<p>A running list, updated whenever.</p>
<ul>
<li>The smell right before a storm.</li>
<li>Code that deletes more lines than it adds.</li>
<li>Friends who tell you the truth and then stay for dinner.</li>
<li>The first page of a new notebook, before you ruin it.</li>
</ul>
]]></description>
  </item>
  <item>
    <title>Building in the margins</title>
    <link>https://paperhurts.com/posts/building-in-the-margins/</link>
    <guid>https://paperhurts.com/posts/building-in-the-margins/</guid>
    <pubDate>Mon, 08 Jun 2026 10:12:00 GMT</pubDate>
    <description><![CDATA[<p>Almost everything I&#39;ve made, I made in the gaps: lunch breaks, the hour after the house goes quiet, the ten minutes a build takes. Margins are underrated real estate. The rent is cheap and nobody checks on you.</p>
]]></description>
  </item>
  <item>
    <title>Why this blog has weather</title>
    <link>https://paperhurts.com/posts/why-this-blog-has-weather/</link>
    <guid>https://paperhurts.com/posts/why-this-blog-has-weather/</guid>
    <pubDate>Thu, 14 May 2026 21:54:00 GMT</pubDate>
    <description><![CDATA[<p>Most websites look the same at noon and at midnight. That always felt a little dishonest for something that&#39;s supposed to be a journal. People have weather. So does this. Sometimes it rains while you read, and that isn&#39;t a bug.</p>
<h3>How it works</h3>
<p>Every post sits at the hour it was written. Scroll the front page and you&#39;re scrolling through a day: early posts under a sunrise, late ones under the stars. The weather does its own thing on top of that, the way weather does. The mechanics of the rain are in <a href="https://paperhurts.com/posts/rain-with-a-for-loop/">How to draw rain with a for-loop</a>.</p>
<p>Posts written after midnight stay in the night they belong to, instead of jumping to the top of the next morning. See <a href="https://paperhurts.com/posts/one-more-commit/">One more commit</a>.</p>
<h3>Writing one</h3>
<p>A post is a markdown file with a title and the time you wrote it:</p>
<pre><code class="language-md">---
title: The ten minutes after a storm
date: 2026-09-09 19:24
---
</code></pre>
<p>That&#39;s the whole ritual.</p>
]]></description>
  </item>
  <item>
    <title>One more commit</title>
    <link>https://paperhurts.com/posts/one-more-commit/</link>
    <guid>https://paperhurts.com/posts/one-more-commit/</guid>
    <pubDate>Thu, 02 Apr 2026 01:10:00 GMT</pubDate>
    <description><![CDATA[<p>Nothing good has ever been committed at one in the morning. I say this as someone who has committed a great deal at one in the morning.</p>
<blockquote>
<p>The fix is obvious. It will still be obvious after sleep.</p>
</blockquote>
<p>It was not, in fact, obvious after sleep. But at least I could see why.</p>
]]></description>
  </item>
  <item>
    <title>Start before the sun</title>
    <link>https://paperhurts.com/posts/start-before-the-sun/</link>
    <guid>https://paperhurts.com/posts/start-before-the-sun/</guid>
    <pubDate>Tue, 03 Mar 2026 06:24:00 GMT</pubDate>
    <description><![CDATA[<p>There&#39;s a quiet at six in the morning that belongs to whoever shows up first. It isn&#39;t productive quiet. It&#39;s permissive quiet: nothing has asked for you yet, and nothing has broken. Most of what I like about my days, I can trace back to protecting about forty minutes of it.</p>
<p>The trick isn&#39;t getting up early. It&#39;s not spending those minutes on anything that has a notification attached. Coffee, a notebook, the window. Everything else can wait for <a href="https://paperhurts.com/posts/afternoon-load-case/">the part of the day that&#39;s built for it</a>.</p>
]]></description>
  </item>
  <item>
    <title>The afternoon slump is a load case</title>
    <link>https://paperhurts.com/posts/afternoon-load-case/</link>
    <guid>https://paperhurts.com/posts/afternoon-load-case/</guid>
    <pubDate>Wed, 11 Feb 2026 15:30:00 GMT</pubDate>
    <description><![CDATA[<p>I used to treat three o&#39;clock as a character flaw. Now I treat it like a load case. You don&#39;t blame a beam for deflecting; you size it for the load it actually sees. So: hard thinking before lunch, easy wins after, and nothing important on the calendar at 3:15.</p>
]]></description>
  </item>
  <item>
    <title>Tools that fit in one hand</title>
    <link>https://paperhurts.com/posts/tools-that-fit-in-one-hand/</link>
    <guid>https://paperhurts.com/posts/tools-that-fit-in-one-hand/</guid>
    <pubDate>Mon, 19 Jan 2026 07:45:00 GMT</pubDate>
    <description><![CDATA[<p>The software I love most does one thing and forgets me the moment I close it. A timer. A notepad that opens before I finish thinking. A unit converter with no account. Somewhere along the way we decided every tool should grow up to be a platform. I&#39;d like to un-decide that.</p>
]]></description>
  </item>
</channel>
</rss>
