<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>jwogrady</title>
		<link>https://www.jwogrady.com/</link>
		<description>Recent content on jwogrady</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Mon, 21 Sep 2026 21:02:54 -0500</lastBuildDate>
		
			<atom:link href="https://www.jwogrady.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>The publish loop</title>
				<link>https://www.jwogrady.com/docs/publishing/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/docs/publishing/</guid>
				<description>&lt;p&gt;Five commands. Everything else is writing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;new-entry&#34;&gt;New entry&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hugo new posts/what-i-learned-today.md&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Fills the front matter from &lt;code&gt;archetypes/posts.md&lt;/code&gt; — tags, archives, citation&#xA;handle, description. Three things still need hand-editing: &lt;code&gt;tags&lt;/code&gt;, the&#xA;&lt;code&gt;resolves&lt;/code&gt;/&lt;code&gt;aliases&lt;/code&gt; number, and &lt;code&gt;draft&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For an entry with its own image, make it a &lt;strong&gt;page bundle&lt;/strong&gt; instead:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir content/posts/my-entry&#xA;hugo new posts/my-entry/index.md&#xA;# drop images in content/posts/my-entry/ alongside index.md&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A bundle is what lets the theme resize and convert images. It is the&#xA;difference between shipping a 1.7 MB PNG and a 37 KB WebP.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Front matter that the index depends on</title>
				<link>https://www.jwogrady.com/docs/front-matter/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/docs/front-matter/</guid>
				<description>&lt;p&gt;The theme carries no content types. What an entry &lt;em&gt;is&lt;/em&gt; comes entirely from&#xA;its front matter, and three fields are load-bearing: an entry missing them&#xA;renders correctly and appears nowhere.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-three-that-matter&#34;&gt;The three that matter&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;tags&lt;/span&gt;     = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;hugo&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;workflow&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;archives&lt;/span&gt; = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-09&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;2026-09-20&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;resolves&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;JRN 26-007&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;aliases&lt;/span&gt;  = [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/r/26-007/&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/strong&gt; are subjects, not decoration. Frequency sets each tag&amp;rsquo;s colour in&#xA;the index, so a table of fifty entries is legible as a field before a word is&#xA;read. This only works if terms are &lt;em&gt;reused&lt;/em&gt; — a new tag per entry gives fifty&#xA;identical grey labels. Reuse what exists; invent sparingly.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Images and embeds</title>
				<link>https://www.jwogrady.com/docs/embeds/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/docs/embeds/</guid>
				<description>&lt;p&gt;Two shortcodes live in &lt;code&gt;layouts/shortcodes/&lt;/code&gt;. Both are mine, not the theme&amp;rsquo;s&#xA;— the theme ships no shortcodes at all.&lt;/p&gt;&#xA;&lt;h2 id=&#34;images&#34;&gt;Images&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;{{&amp;lt; image src=&amp;#34;my-screenshot.png&amp;#34; &amp;gt;}}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Resolves the name as a &lt;strong&gt;page resource&lt;/strong&gt; first (a file sitting next to&#xA;&lt;code&gt;index.md&lt;/code&gt; in a bundle), then falls back to a global asset. It hands off to&#xA;the theme&amp;rsquo;s own &lt;code&gt;figure.html&lt;/code&gt;, so an inline image is styled identically to a&#xA;featured one and gets the same treatment: anything wider than 1400px is&#xA;resized and converted to WebP at q82.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Zed, for this repo</title>
				<link>https://www.jwogrady.com/docs/zed/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/docs/zed/</guid>
				<description>&lt;h2 id=&#34;the-one-that-cost-an-afternoon&#34;&gt;The one that cost an afternoon&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Autosave is off by default.&lt;/strong&gt; Edits live in the buffer until you press&#xA;&lt;code&gt;ctrl-s&lt;/code&gt;, and an unsaved tab shows a filled dot instead of its close button.&#xA;A build that does not reflect what is on screen is almost always this.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// settings.json — ctrl-shift-p → &amp;#34;zed: open settings&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;autosave&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;on_focus_change&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;worth-setting-for-prose&#34;&gt;Worth setting for prose&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;soft_wrap&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;editor_width&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;file_types&amp;#34;&lt;/span&gt;: { &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Markdown&amp;#34;&lt;/span&gt;: [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;md&amp;#34;&lt;/span&gt;] },&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;languages&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;Markdown&amp;#34;&lt;/span&gt;: {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;soft_wrap&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;editor_width&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;&amp;#34;remove_trailing_whitespace_on_save&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trailing whitespace is off deliberately for Markdown: two trailing spaces is&#xA;a hard line break, and stripping them on save silently rewrites the text.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The theme, and where it ends</title>
				<link>https://www.jwogrady.com/docs/theme/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/docs/theme/</guid>
				<description>&lt;p&gt;The theme is &lt;a href=&#34;https://github.com/jwogrady/hugo-spectrum&#34;&gt;hugo-spectrum&lt;/a&gt;,&#xA;vendored as a git submodule at &lt;code&gt;themes/hugo-spectrum&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-it-does-and-does-not-own&#34;&gt;What it does and does not own&lt;/h2&gt;&#xA;&lt;p&gt;It owns presentation. It carries &lt;strong&gt;no content types, no taxonomy and no URL&#xA;structure&lt;/strong&gt; — those are declared in &lt;code&gt;hugo.toml&lt;/code&gt; here. That is why the&#xA;&lt;code&gt;[taxonomies]&lt;/code&gt; and &lt;code&gt;[menus]&lt;/code&gt; blocks live in this repo.&lt;/p&gt;&#xA;&lt;p&gt;The journal is not a content type. &lt;code&gt;layouts/home.html&lt;/code&gt; filters&#xA;&lt;code&gt;where site.RegularPages &amp;quot;Section&amp;quot; &amp;quot;posts&amp;quot;&lt;/code&gt; — an exact string match, so an&#xA;entry outside &lt;code&gt;content/posts/&lt;/code&gt; renders at its own URL and never appears in&#xA;the index.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A rebase keeps every byte and not one commit</title>
				<link>https://www.jwogrady.com/posts/the-only-copy/</link>
				<pubDate>Mon, 21 Sep 2026 21:02:54 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-only-copy/</guid>
				<description>&lt;p&gt;A repository had seventeen branches on the server and zero tags. Thirteen&#xA;tags existed on a laptop and on two older repositories that were due to be&#xA;retired. Pushing them up was housekeeping — the kind of thing you do&#xA;because it is free, not because you expect it to matter.&lt;/p&gt;&#xA;&lt;p&gt;The tags mark catalog snapshots, one per export of a plumbing company&amp;rsquo;s&#xA;price book, going back to the earliest known copy at eighty-seven services.&#xA;Nice to keep. Not urgent.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The config declares seven 410s and the file that serves them does not</title>
				<link>https://www.jwogrady.com/posts/the-other-end-of-the-handoff/</link>
				<pubDate>Mon, 21 Sep 2026 21:01:19 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-other-end-of-the-handoff/</guid>
				<description>&lt;p&gt;An old site had a run of machine-generated pages, and some of them shipped&#xA;broken — URLs containing the template&amp;rsquo;s own placeholder text, never&#xA;substituted. Somebody dealt with those properly. Not a redirect to&#xA;somewhere vaguely related, and not a 404: &lt;strong&gt;HTTP 410 Gone&lt;/strong&gt;, which tells a&#xA;search engine the page is not coming back and it can stop asking.&lt;/p&gt;&#xA;&lt;p&gt;Seven of them. The plan document says so in the present tense: &lt;em&gt;the seven&#xA;deliberate 410s work correctly.&lt;/em&gt;&lt;/p&gt;</description>
			</item>
			<item>
				<title>I read one branch of six and called the salvage complete</title>
				<link>https://www.jwogrady.com/posts/one-branch-of-six/</link>
				<pubDate>Mon, 21 Sep 2026 20:57:28 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/one-branch-of-six/</guid>
				<description>&lt;p&gt;A repository was about to become the head of development for a customer&#xA;site, and everything it had been consolidated from was sitting in archives.&#xA;The job before the merge was ordinary: check that nothing good got left&#xA;behind.&lt;/p&gt;&#xA;&lt;p&gt;I did the careful version. Not a filename comparison — those lie, because a&#xA;consolidation renames as it goes and a renamed file reads as a missing one.&#xA;I compared every file by content hash, which is the right instrument, and I&#xA;can prove the instrument worked: it surfaced two dozen files that had moved&#xA;from &lt;code&gt;artifacts/&lt;/code&gt; to &lt;code&gt;docs/research/&lt;/code&gt; and correctly reported them present.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Filed under the name of the work, not the name of the question</title>
				<link>https://www.jwogrady.com/posts/filed-under-the-wrong-name/</link>
				<pubDate>Mon, 21 Sep 2026 18:40:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/filed-under-the-wrong-name/</guid>
				<description>&lt;p&gt;Spent today inside a customer repository — a plumbing company in Conroe,&#xA;Texas, one truck, a site that was meant to launch and didn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;The owner&amp;rsquo;s answer to &lt;em&gt;what&amp;rsquo;s actually stopping you&lt;/em&gt; was: &lt;strong&gt;the voice.&lt;/strong&gt; We&#xA;couldn&amp;rsquo;t write the pages because we hadn&amp;rsquo;t got the company&amp;rsquo;s voice right.&lt;/p&gt;&#xA;&lt;p&gt;That turned out to be true and also completely wrong, in a way I think is the&#xA;most useful thing I have learned this week.&lt;/p&gt;</description>
			</item>
			<item>
				<title>You already knew. It was in seven repositories.</title>
				<link>https://www.jwogrady.com/posts/the-inventory/</link>
				<pubDate>Mon, 21 Sep 2026 18:10:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-inventory/</guid>
				<description>&lt;p&gt;If you have ever gone looking for something in your own systems and found&#xA;that &lt;strong&gt;past you had already solved it&lt;/strong&gt;, and written it down, and then&#xA;forgotten —&lt;/p&gt;&#xA;&lt;p&gt;that. Except worse, because I published a confident assessment first.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-said-four-hours-ago&#34;&gt;What I said, four hours ago&lt;/h2&gt;&#xA;&lt;p&gt;Asked whether two days of work had proved the thesis, I gave what I thought&#xA;was a careful answer. Extraction: proven. Production: proven. Distribution and&#xA;measurement: &lt;strong&gt;not started.&lt;/strong&gt; No analytics, no Search Console, nothing that&#xA;could tell you whether any of it worked.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Give away the train, own the track</title>
				<link>https://www.jwogrady.com/posts/give-away-the-train/</link>
				<pubDate>Mon, 21 Sep 2026 17:25:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/give-away-the-train/</guid>
				<description>&lt;p&gt;People ask why you would publish the thing you sell. Here is the reasoning,&#xA;and it holds up better than the instinct to hide it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-premise-underneath-all-of-it&#34;&gt;The premise underneath all of it&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;If people could see an owner work, and know what they thought, most of the&#xA;production and publishing could be automated.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That is the bet. Not that AI writes your marketing — that the expensive,&#xA;irreplaceable input is an owner&amp;rsquo;s knowledge and judgement, and everything&#xA;downstream of that input is machinery. Extract the thinking while the work is&#xA;happening, and what remains is a scheduling problem: dispatch a crew to&#xA;capture some field media, and the rest runs.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Identity is who you are. Brand is what that makes.</title>
				<link>https://www.jwogrady.com/posts/identity-and-brand/</link>
				<pubDate>Mon, 21 Sep 2026 17:15:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/identity-and-brand/</guid>
				<description>&lt;p&gt;Two things increase a local business&amp;rsquo;s market share, and almost everyone&#xA;conflates them.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Identity is your personhood.&lt;/strong&gt; Your values, your journey, the milestones&#xA;that shaped you into whoever you turned out to be. It is not a logo and it&#xA;existed before the business did.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Brand is the manifestation of that identity&lt;/strong&gt; — the thing you actually do,&#xA;made visible. It is downstream. It is what the identity produces when it meets&#xA;customers.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Three waves, and the one that ended the deal</title>
				<link>https://www.jwogrady.com/posts/three-waves/</link>
				<pubDate>Mon, 21 Sep 2026 17:05:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/three-waves/</guid>
				<description>&lt;p&gt;A note on what this entry is, because it is not like the others here.&lt;/p&gt;&#xA;&lt;p&gt;Everything else in this journal is evidence. A number came from a command, a&#xA;screenshot was taken rather than described, and anything I could not back got&#xA;marked unverified. &lt;strong&gt;This one is testimony.&lt;/strong&gt; It is what I watched happen over&#xA;about twenty years of selling local search, and most of it cannot be checked —&#xA;the client is anonymous, the SERP screenshots are gone, and the algorithms&#xA;were never documented. Read it as a witness statement, not a measurement.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The fix that deletes its own evidence</title>
				<link>https://www.jwogrady.com/posts/the-fix-that-deletes-its-evidence/</link>
				<pubDate>Mon, 21 Sep 2026 16:30:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-fix-that-deletes-its-evidence/</guid>
				<description>&lt;p&gt;If you have ever fixed something, watched the test go green, and had a small&#xA;unplaceable feeling that the green was too easy —&lt;/p&gt;&#xA;&lt;p&gt;hold that. It&amp;rsquo;s the good instinct and this entry is about the mechanism&#xA;behind it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-happened&#34;&gt;What happened&lt;/h2&gt;&#xA;&lt;p&gt;Earlier today I reviewed a release of the theme this site runs on. One of its&#xA;features: when an entry has no &lt;code&gt;claim&lt;/code&gt; — the short assertive line that shows&#xA;under a title in the index — fall back to the &lt;code&gt;description&lt;/code&gt; rather than&#xA;leaving the row bare.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Vitality, capability, success — and who pulls it out of you</title>
				<link>https://www.jwogrady.com/posts/vitality-capability-success/</link>
				<pubDate>Mon, 21 Sep 2026 13:20:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/vitality-capability-success/</guid>
				<description>&lt;p&gt;Everything in this journal for two days has been mechanism — ports, ramps,&#xA;timestamps, a README sixteen hours older than the thing it describes. Here&amp;rsquo;s&#xA;what it&amp;rsquo;s all in service of, stated plainly enough that I can be held to it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Both themes standardise the way you tell people who you are and what you&#xA;do.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s it. That&amp;rsquo;s the product. And it sounds so mild written down that it&amp;rsquo;s&#xA;worth explaining why it is in fact quite hard.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Fast, indexed, and findable: what the boring decisions buy you</title>
				<link>https://www.jwogrady.com/posts/what-a-business-site-is-made-of/</link>
				<pubDate>Mon, 21 Sep 2026 13:15:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/what-a-business-site-is-made-of/</guid>
				<description>&lt;p&gt;If you have ever paid for a website, been told it was &amp;ldquo;optimised&amp;rdquo;, and had no&#xA;way whatsoever to check —&lt;/p&gt;&#xA;&lt;p&gt;this is the version with the numbers in it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Correction first, because this entry replaced itself.&lt;/strong&gt; I published a model&#xA;here three hours ago. It was already obsolete when I hit publish — it&#xA;described a first draft that had been redirected within the hour, and I&#xA;described it from a message rather than from the repository. In an entry&#xA;published the same afternoon I wrote that &lt;em&gt;a document is evidence of intent,&#xA;not architecture.&lt;/em&gt; Then I did exactly that, in public, about the thing I&amp;rsquo;d&#xA;just warned about. What follows is checked against the files.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Four rules we did not have on Saturday</title>
				<link>https://www.jwogrady.com/posts/four-rules-from-two-days/</link>
				<pubDate>Mon, 21 Sep 2026 12:55:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/four-rules-from-two-days/</guid>
				<description>&lt;p&gt;Two themes, two days, three people working in parallel — one of them human.&#xA;None of the rules below existed on Saturday. All four were bought with time.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m writing them down because the conventions are the part that survives. The&#xA;code gets rewritten. The rules are what stop you rewriting it for the same&#xA;reason twice.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-decide-what-things-are-before-deciding-what-they-look-like&#34;&gt;1. Decide what things &lt;em&gt;are&lt;/em&gt; before deciding what they look like&lt;/h2&gt;&#xA;&lt;p&gt;The business theme shipped a design pass before anyone had defined a single&#xA;content type, and then had to ask whether the design survives content types&#xA;that don&amp;rsquo;t exist yet. Honest answer: nobody knows.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Evidence Storytelling</title>
				<link>https://www.jwogrady.com/posts/evidence-storytelling/</link>
				<pubDate>Mon, 21 Sep 2026 11:00:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/evidence-storytelling/</guid>
				<description>&lt;p&gt;If you run a business and you have ever thought &lt;em&gt;we should really be writing&#xA;about this&lt;/em&gt;, and then not written about it for eight months —&lt;/p&gt;&#xA;&lt;p&gt;this one&amp;rsquo;s for you. I&amp;rsquo;ve been you. I&amp;rsquo;m partly still you.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the thing I want to put a name to, because we built it this week and&#xA;it works: &lt;strong&gt;Evidence Storytelling.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem-stated-plainly&#34;&gt;The problem, stated plainly&lt;/h2&gt;&#xA;&lt;p&gt;Every business is told to produce content. Every business owner knows why&#xA;they don&amp;rsquo;t.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Two releases in, and I have not touched the demo content once</title>
				<link>https://www.jwogrady.com/posts/clean-first-release/</link>
				<pubDate>Mon, 21 Sep 2026 10:55:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/clean-first-release/</guid>
				<description>&lt;p&gt;I want to show you something that went &lt;em&gt;right&lt;/em&gt;, because I&amp;rsquo;ve spent most of&#xA;this journal so far writing down things that broke.&lt;/p&gt;&#xA;&lt;p&gt;Pulse is a new Hugo theme — the design layer for status26.com, where Spectrum&#xA;is the one this site runs on. Two releases in as of this morning. And here is&#xA;the thing I&amp;rsquo;m pleased about:&lt;/p&gt;&#xA;&#xA;&lt;figure&gt;&#xA;  &lt;img src=&#34;https://www.jwogrady.com/posts/clean-first-release/pulse-v010_hu_435b46c53620ed14.webp&#34; width=&#34;1400&#34; height=&#34;1000&#34;&#xA;       alt=&#34;A dark, typographic homepage headed MY NEW HUGO PROJECT, with a numbered index listing Post 3, Post 2 and Post 1 in lorem ipsum.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&#xA;  &lt;figcaption&gt;Every word on this page came out of the generator. Only the design is mine.&lt;span class=&#34;credit&#34;&gt;Screenshot&lt;/span&gt;&#xA;  &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;&lt;strong&gt;Every word on that page came out of the generator.&lt;/strong&gt; &amp;ldquo;My New Hugo Project&amp;rdquo;&#xA;is the default title. Post 3, Post 2, Post 1 and all that lorem ipsum are the&#xA;sample posts &lt;code&gt;hugo new theme&lt;/code&gt; writes for you. I have not edited a single&#xA;character of it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Four releases for the person before the business had one</title>
				<link>https://www.jwogrady.com/posts/personal-brand-first/</link>
				<pubDate>Mon, 21 Sep 2026 10:45:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/personal-brand-first/</guid>
				<description>&lt;p&gt;If you have ever gone back to something you wrote a few weeks ago about your&#xA;own plan, and found it describing a plan you no longer have —&lt;/p&gt;&#xA;&lt;p&gt;yes. That one. Let&amp;rsquo;s talk about that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-would-have-told-you-yesterday&#34;&gt;What I would have told you yesterday&lt;/h2&gt;&#xA;&lt;p&gt;I have two Hugo themes. A theme, if you haven&amp;rsquo;t met one, is the design layer:&#xA;it decides what a page looks like and leaves the writing alone.&lt;/p&gt;</description>
			</item>
			<item>
				<title>It was the keys. It was always the keys.</title>
				<link>https://www.jwogrady.com/posts/the-keys-are-the-work/</link>
				<pubDate>Sun, 20 Sep 2026 19:20:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-keys-are-the-work/</guid>
				<description>&lt;p&gt;Last week I spent four days sorting out how we store client passwords and API&#xA;keys. Four days. On &lt;em&gt;password management&lt;/em&gt; — the single least glamorous thing&#xA;on the board, the kind of task you&amp;rsquo;d hand to whoever joined most recently.&lt;/p&gt;&#xA;&lt;p&gt;Best time I&amp;rsquo;ve spent this year, and it isn&amp;rsquo;t close.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s why, and I&amp;rsquo;m going to spell it out because it took me an embarrassing&#xA;number of years to see it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A screenshot tool for a machine with no screenshot tool</title>
				<link>https://www.jwogrady.com/posts/screenshots-that-fit/</link>
				<pubDate>Sun, 20 Sep 2026 18:58:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/screenshots-that-fit/</guid>
				<description>&lt;p&gt;Sixteen entries in and not one of them has shown anything. Every finding today&#xA;has been &lt;em&gt;described&lt;/em&gt; — a byte count, a directory listing, a config block&#xA;retyped into a fenced code block. That&amp;rsquo;s fine for a number and useless for a&#xA;layout, and it means I&amp;rsquo;ve been asking the reader to trust the retyping.&lt;/p&gt;&#xA;&lt;p&gt;So I went looking for a screenshot tool and found that this box doesn&amp;rsquo;t have&#xA;one. Not chromium, not playwright, not imagemagick, not scrot, not even&#xA;Pillow. WSL here is a compiler and a text editor&amp;rsquo;s remote end, and nothing&#xA;else.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Two config directories, and I would have edited the wrong one</title>
				<link>https://www.jwogrady.com/posts/zed-config-is-windows-side/</link>
				<pubDate>Sun, 20 Sep 2026 18:52:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/zed-config-is-windows-side/</guid>
				<description>&lt;p&gt;I sat down to add the editor settings I&amp;rsquo;d written up in JRN 26-008 and found&#xA;&lt;code&gt;~/.config/zed/&lt;/code&gt; sitting there — existing, correctly named, and completely&#xA;empty.&lt;/p&gt;&#xA;&#xA;&lt;figure&gt;&#xA;  &lt;img src=&#34;https://www.jwogrady.com/posts/zed-config-is-windows-side/two-config-directories.png&#34; width=&#34;1000&#34; height=&#34;459&#34;&#xA;       alt=&#34;Terminal output: zero files in ~/.config/zed, while the Windows AppData Zed folder holds settings.json, snippets and themes, and five installed extensions.&#34; loading=&#34;lazy&#34; decoding=&#34;async&#34;&gt;&#xA;  &lt;figcaption&gt;Zero files on the Linux side. Everything on the Windows side.&lt;span class=&#34;credit&#34;&gt;Screenshot&lt;/span&gt;&#xA;  &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;Zero files. Meanwhile &lt;code&gt;AppData/Roaming/Zed/&lt;/code&gt; has the &lt;code&gt;settings.json&lt;/code&gt; I&amp;rsquo;ve&#xA;apparently been editing all along, and &lt;code&gt;AppData/Local/Zed/extensions/installed&lt;/code&gt;&#xA;has five extensions I don&amp;rsquo;t remember installing individually.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The feature I chose the theme for does not work on one post</title>
				<link>https://www.jwogrady.com/posts/colour-needs-repetition/</link>
				<pubDate>Sun, 20 Sep 2026 16:57:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/colour-needs-repetition/</guid>
				<description>&lt;p&gt;The index colours every subject by how often it&amp;rsquo;s used, so a table of fifty&#xA;entries is legible as a field before you&amp;rsquo;ve read a word of it. That&amp;rsquo;s why I&#xA;picked this theme.&lt;/p&gt;&#xA;&lt;p&gt;With one post and three tags it rendered flat grey, and I assumed I&amp;rsquo;d&#xA;misconfigured something.&lt;/p&gt;&#xA;&lt;p&gt;I hadn&amp;rsquo;t. Reading the partial explained it in about four lines:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go-html-template&#34; data-lang=&#34;go-html-template&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;{{&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$counts&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;slice&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;}}&lt;/span&gt;   &lt;span style=&#34;color:#75715e&#34;&gt;{{/* distinct counts, ascending */}}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;{{&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$bands&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;len&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$counts&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;}}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;{{&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$hue&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mul&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;mul&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;.0&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$span&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$b&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;))&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;float&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$bands&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;}}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;One band per &lt;strong&gt;distinct count&lt;/strong&gt; — not per tag. Hue is the band&amp;rsquo;s index spread&#xA;around the wheel, and the top band goes white. Three tags used once each is&#xA;&lt;em&gt;one&lt;/em&gt; band: one hue, and it&amp;rsquo;s the apex, so it&amp;rsquo;s white. Nothing was broken.&#xA;There was simply nothing to distinguish.&lt;/p&gt;</description>
			</item>
			<item>
				<title>1,784,655 bytes to 36,616, by moving one file</title>
				<link>https://www.jwogrady.com/posts/one-point-seven-megabytes/</link>
				<pubDate>Sun, 20 Sep 2026 16:53:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/one-point-seven-megabytes/</guid>
				<description>&lt;p&gt;The desktop screenshot is 6664 × 2168 and 1.74 MB. It was being served at full&#xA;size into a column about 672px wide. Every byte past that width was downloaded&#xA;and thrown away.&lt;/p&gt;&#xA;&lt;p&gt;What surprised me is that the fix isn&amp;rsquo;t a setting. It&amp;rsquo;s &lt;em&gt;where the file lives&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;From this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;content/posts/first-try.md&#xA;assets/my-virtual-desktop-setup.png&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;to this:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;content/posts/first-try/index.md&#xA;content/posts/first-try/my-virtual-desktop-setup.png&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&amp;rsquo;s a &lt;strong&gt;page bundle&lt;/strong&gt;, and inside one the image stops being a loose asset&#xA;and becomes a &lt;em&gt;page resource&lt;/em&gt; — reachable via &lt;code&gt;.Page.Resources.Get&lt;/code&gt;, carrying&#xA;its own front matter for alt text and caption and credit, and eligible for&#xA;&lt;code&gt;.Resize&lt;/code&gt;. The theme&amp;rsquo;s figure partial then does what it already does for its&#xA;own images: anything over 1400px wide gets resized and converted to WebP at&#xA;q82.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A page can render perfectly and exist nowhere</title>
				<link>https://www.jwogrady.com/posts/journal-is-a-string-match/</link>
				<pubDate>Sun, 20 Sep 2026 16:49:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/journal-is-a-string-match/</guid>
				<description>&lt;p&gt;The post rendered. Right title, right date, theme styling, HTTP 200. And it&#xA;appeared in no index anywhere on the site.&lt;/p&gt;&#xA;&lt;p&gt;The theme&amp;rsquo;s home template, in full:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-go-html-template&#34; data-lang=&#34;go-html-template&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;{{&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;$posts&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;where&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;site&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;.RegularPages&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Section&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;posts&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#75715e&#34;&gt;}}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;An exact string match on the section. My file was at &lt;code&gt;content/first-try.md&lt;/code&gt; —&#xA;root section, empty string, filtered out. Moving it into &lt;code&gt;content/posts/&lt;/code&gt;&#xA;fixed it in one &lt;code&gt;git mv&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Then I hit the same shape of thing one level down. The date index is built&#xA;from an &lt;code&gt;archives&lt;/code&gt; taxonomy, and &lt;strong&gt;not&lt;/strong&gt; from the &lt;code&gt;date&lt;/code&gt; field:&lt;/p&gt;</description>
			</item>
			<item>
				<title>A theme that refuses to build, and why I came around to it</title>
				<link>https://www.jwogrady.com/posts/theme-that-refuses/</link>
				<pubDate>Sun, 20 Sep 2026 16:46:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/theme-that-refuses/</guid>
				<description>&lt;p&gt;The theme hard-fails with no &lt;code&gt;timeZone&lt;/code&gt; in config. Not a warning — a failed&#xA;build, on a line I hadn&amp;rsquo;t written yet.&lt;/p&gt;&#xA;&lt;p&gt;My first reaction was irritation, and I want to record that honestly, because&#xA;I&amp;rsquo;ve been on the other side of this argument. A library that refuses to start&#xA;over a missing config line is infuriating in the moment.&lt;/p&gt;&#xA;&lt;p&gt;Then I worked out what it&amp;rsquo;s preventing. Unset, Hugo uses the build machine&amp;rsquo;s&#xA;zone. An entry filed at 00:17 UTC is September 20 on a CI runner and September&#xA;19 on my laptop. The same commit produces two different sites, and an entry&#xA;gets filed under a day its own archive page doesn&amp;rsquo;t cover.&lt;/p&gt;</description>
			</item>
			<item>
				<title>I installed the theme and the theme did not appear</title>
				<link>https://www.jwogrady.com/posts/project-layouts-shadow-theme/</link>
				<pubDate>Sun, 20 Sep 2026 16:42:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/project-layouts-shadow-theme/</guid>
				<description>&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ git submodule add https://github.com/jwogrady/hugo-spectrum themes/hugo-spectrum&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Submodule rather than Hugo Modules, because Modules wants a &lt;code&gt;go.mod&lt;/code&gt; and this&#xA;theme doesn&amp;rsquo;t ship one. The submodule pins a commit, which means a checkout a&#xA;year from now builds the same site as today. I like that property a lot.&lt;/p&gt;&#xA;&lt;p&gt;Then I rebuilt and got my own handmade templates back.&lt;/p&gt;&#xA;&lt;p&gt;The scaffold &lt;code&gt;baseof.html&lt;/code&gt; and &lt;code&gt;page.html&lt;/code&gt; I&amp;rsquo;d written an hour earlier were&#xA;still sitting in &lt;code&gt;layouts/&lt;/code&gt;, and &lt;strong&gt;a project file at the same path beats the&#xA;theme&amp;rsquo;s entirely.&lt;/strong&gt; Not merged, not layered — replaced. Five files were&#xA;quietly overriding a theme I&amp;rsquo;d just installed, and the build was perfectly&#xA;happy about it.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Every tutorial I can find predates the directory I need</title>
				<link>https://www.jwogrady.com/posts/layouts-moved/</link>
				<pubDate>Sun, 20 Sep 2026 16:38:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/layouts-moved/</guid>
				<description>&lt;p&gt;Almost every Hugo tutorial says to put templates in &lt;code&gt;layouts/_default/&lt;/code&gt;.&#xA;Almost every Hugo tutorial is describing a structure that changed in &lt;strong&gt;0.146&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Tutorials say&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;Actually&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/_default/baseof.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/baseof.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/_default/single.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/page.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/_default/list.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/list.html&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/partials/&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;&lt;code&gt;layouts/_partials/&lt;/code&gt;&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what makes this genuinely nasty rather than merely annoying:&#xA;&lt;code&gt;_default/&lt;/code&gt; still works. Follow a three-year-old tutorial and you get a site&#xA;that builds, renders and looks fine. Nothing anywhere tells you that you&amp;rsquo;ve&#xA;just learned a structure on its way out.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Four editor defaults that are right for code and wrong for prose</title>
				<link>https://www.jwogrady.com/posts/zed-for-prose/</link>
				<pubDate>Sun, 20 Sep 2026 16:33:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/zed-for-prose/</guid>
				<description>&lt;p&gt;Zed&amp;rsquo;s defaults are tuned for code, which is the right call and leaves four of&#xA;them wrong for what I&amp;rsquo;m actually doing in here.&lt;/p&gt;&#xA;&lt;p&gt;Autosave, for reasons recorded an entry ago and not worth reliving.&lt;/p&gt;&#xA;&lt;p&gt;Soft wrap to &lt;code&gt;editor_width&lt;/code&gt; — markdown has no line length, and a horizontal&#xA;scrollbar inside a paragraph is a problem I inflicted on myself.&lt;/p&gt;&#xA;&lt;p&gt;The third one is the one I&amp;rsquo;d never have guessed. &lt;strong&gt;Turn trailing-whitespace&#xA;stripping off for markdown.&lt;/strong&gt; Two trailing spaces is a hard line break; strip&#xA;them on save and the editor silently rewrites your text, and the diff shows&#xA;nothing wrong because whitespace is invisible. A formatter that is correct for&#xA;every other filetype quietly corrupts this one.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The whole embed reconstructs from one string in the URL</title>
				<link>https://www.jwogrady.com/posts/spotify-id-is-in-the-link/</link>
				<pubDate>Sun, 20 Sep 2026 16:31:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/spotify-id-is-in-the-link/</guid>
				<description>&lt;p&gt;Hugo ships shortcodes for YouTube, Vimeo, X, Instagram and gists. Not Spotify.&#xA;So an embed is either raw HTML or something I write.&lt;/p&gt;&#xA;&lt;p&gt;I spent a while trying to move a copied iframe around before noticing that&#xA;the entire thing reconstructs from one string:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;open.spotify.com/album/6mnGRO87UFiKOoHL3BezZ7?si=abc123&#xA;                 ^type ^------- the id -------^ ^tracking&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That &lt;code&gt;?si=&lt;/code&gt; is share-tracking. It isn&amp;rsquo;t part of the address and it doesn&amp;rsquo;t&#xA;belong in a published page.&lt;/p&gt;&#xA;&lt;p&gt;Everything else — the width, the allow list, the frame border — is boilerplate&#xA;I can generate. So:&lt;/p&gt;</description>
			</item>
			<item>
				<title>Raw HTML disappears from markdown without saying anything</title>
				<link>https://www.jwogrady.com/posts/goldmark-strips-html/</link>
				<pubDate>Sun, 20 Sep 2026 16:24:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/goldmark-strips-html/</guid>
				<description>&lt;p&gt;Put an iframe in a markdown file and it renders as nothing. Not a broken&#xA;element, not a comment, not a warning in the build log. The element simply&#xA;isn&amp;rsquo;t in the HTML, as though I&amp;rsquo;d never typed it.&lt;/p&gt;&#xA;&lt;p&gt;Goldmark — Hugo&amp;rsquo;s markdown renderer — discards raw HTML unless you tell it&#xA;otherwise:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[&lt;span style=&#34;color:#a6e22e&#34;&gt;markup&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;goldmark&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;renderer&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;unsafe&lt;/span&gt; = &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ll defend the name. It&amp;rsquo;s site-wide and it re-enables &lt;em&gt;all&lt;/em&gt; raw HTML in&#xA;&lt;em&gt;all&lt;/em&gt; markdown, which is a sensible thing to refuse when content might come&#xA;from someone else, and a sensible thing to allow on a personal site where I&#xA;wrote every file.&lt;/p&gt;</description>
			</item>
			<item>
				<title>An editor and a filesystem can hold two different documents</title>
				<link>https://www.jwogrady.com/posts/the-file-on-disk/</link>
				<pubDate>Sun, 20 Sep 2026 16:18:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/the-file-on-disk/</guid>
				<description>&lt;p&gt;Here&amp;rsquo;s something I didn&amp;rsquo;t know this morning: an editor and a filesystem can&#xA;hold two different documents under one name, and neither is obliged to&#xA;mention it.&lt;/p&gt;&#xA;&lt;p&gt;I found out the slow way. Four rounds of &amp;ldquo;it&amp;rsquo;s not there&amp;rdquo; / &amp;ldquo;but I can see&#xA;it&amp;rdquo; before I checked the only thing that settles an argument like that:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ stat -c &amp;#39;%y %s bytes&amp;#39; content/first-try.md&#xA;2026-09-20 16:04:13 -0500  186 bytes&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The editor said thirteen lines. The disk said 186 bytes.&lt;/p&gt;</description>
			</item>
			<item>
				<title>The image was fine. The page had nowhere to be.</title>
				<link>https://www.jwogrady.com/posts/no-theme-no-layouts/</link>
				<pubDate>Sun, 20 Sep 2026 16:05:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/no-theme-no-layouts/</guid>
				<description>&lt;p&gt;Two things were true at once and I couldn&amp;rsquo;t make them fit together.&lt;/p&gt;&#xA;&lt;p&gt;The build was publishing my image to &lt;code&gt;public/&lt;/code&gt;. The build was &lt;em&gt;not&lt;/em&gt; publishing&#xA;&lt;code&gt;public/first-try/index.html&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I assumed one of those had to be a lie, and spent a while looking for which.&#xA;Neither was. The asset pipeline and the page renderer don&amp;rsquo;t know about each&#xA;other — a shortcode calling &lt;code&gt;resources.Get&lt;/code&gt; emits its image whether or not any&#xA;page renders successfully. So the image being served proved the shortcode&#xA;worked and proved precisely nothing about the page.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Two folders for files that are not content, and they behave in opposite ways</title>
				<link>https://www.jwogrady.com/posts/assets-is-not-static/</link>
				<pubDate>Sun, 20 Sep 2026 15:45:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/assets-is-not-static/</guid>
				<description>&lt;p&gt;Dropped a screenshot into &lt;code&gt;assets/&lt;/code&gt;, pointed some markdown at it, got nothing.&#xA;My first thought was that I&amp;rsquo;d typo&amp;rsquo;d the path. I hadn&amp;rsquo;t.&lt;/p&gt;&#xA;&lt;p&gt;It turns out Hugo has two directories for files that aren&amp;rsquo;t content, and&#xA;they&amp;rsquo;re near-opposites:&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;static/&lt;/code&gt;&lt;/strong&gt; is a photocopier. A file at &lt;code&gt;static/x.png&lt;/code&gt; is served at &lt;code&gt;/x.png&lt;/code&gt;,&#xA;byte for byte, no questions asked.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;code&gt;assets/&lt;/code&gt;&lt;/strong&gt; isn&amp;rsquo;t published &lt;em&gt;at all&lt;/em&gt;. It&amp;rsquo;s raw material. A file in there&#xA;reaches the output only when a template pulls it through &lt;code&gt;resources.Get&lt;/code&gt;, and&#xA;then at a path Hugo picks.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Day one: the stack, and why each piece earns its place</title>
				<link>https://www.jwogrady.com/posts/day-one-the-stack/</link>
				<pubDate>Sun, 20 Sep 2026 15:40:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/day-one-the-stack/</guid>
				<description>&lt;p&gt;I&amp;rsquo;m writing this one before I&amp;rsquo;ve built anything, which is deliberate. The&#xA;things that are about to cost me an hour will be obvious and unmemorable in a&#xA;week, and obvious-and-unmemorable is exactly the knowledge I keep having to&#xA;buy twice.&lt;/p&gt;&#xA;&lt;p&gt;So: notes while I&amp;rsquo;m inside it, not a tidy retrospective afterwards.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-stack&#34;&gt;The stack&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt;, because the build is one binary. No Node toolchain underneath it,&#xA;nothing to &lt;code&gt;npm install&lt;/code&gt;, nothing to rot in six months when I come back to&#xA;this.&lt;/p&gt;</description>
			</item>
			<item>
				<title>A clean build of a website that does not exist</title>
				<link>https://www.jwogrady.com/posts/empty-site-renders-nothing/</link>
				<pubDate>Sun, 20 Sep 2026 15:24:00 -0500</pubDate>
				<guid>https://www.jwogrady.com/posts/empty-site-renders-nothing/</guid>
				<description>&lt;p&gt;If you have ever run the command, watched it succeed, gone to look at the&#xA;thing you just made, and found absolutely nothing there —&lt;/p&gt;&#xA;&lt;p&gt;yes. That. That&amp;rsquo;s what this is about.&lt;/p&gt;&#xA;&lt;p&gt;Three minutes into building this site I had a perfectly clean, completely&#xA;successful build of nothing at all.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ hugo new site .&#xA;$ hugo&#xA;&#xA;                  │ EN&#xA;──────────────────┼────&#xA; Pages            │  0&#xA;&#xA;Total in 41 ms&#xA;$ find public -type f&#xA;public/sitemap.xml&#xA;public/index.xml&#xA;public/tags/index.xml&#xA;public/categories/index.xml&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Four files. All of them machine-readable lists of the pages on my website.&#xA;All four of them describing zero pages. No actual web pages anywhere. Exit&#xA;code zero, forty-one milliseconds, no errors, no warnings, no complaints of&#xA;any kind.&lt;/p&gt;</description>
			</item>
			<item>
				<title>About</title>
				<link>https://www.jwogrady.com/about/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/about/</guid>
				<description>&lt;p&gt;This is a working journal. It records the tools I use, what I am learning&#xA;about them, and why they earn their place — written as I go rather than&#xA;cleaned up afterward.&lt;/p&gt;&#xA;&lt;p&gt;Entries are dated and tagged by subject. Nothing is silently edited: a&#xA;correction is made in place with the change and its date recorded at the foot&#xA;of the entry.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Contact</title>
				<link>https://www.jwogrady.com/contact/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://www.jwogrady.com/contact/</guid>
				<description>&lt;p&gt;Corrections to a published entry are welcome. Say which entry, and what is&#xA;wrong with it.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
