{"type":"page","slug":"colophon","title":"Colophon","summary":"How waltspence.com works: the stack, the open-web features, and the design decisions.","published_at":"2026-09-02T00:00:00-04:00","revised_at":"2026-09-05T02:37:02-04:00","body_markdown":"This site is a publishing server. The web page you are reading is one of its interfaces.\n\n## Stack\n\n```text\nVue 3 (JavaScript, Vite)      islands on server-rendered pages\n    ↓\nRuby on Rails                 system of record, HTML, JSON, text, feeds, API\n    ↓\nPostgreSQL                    content, relationships, full-text search\nRedis                         cache, Sidekiq queues, Action Cable, rate limiting\nPython / Node workers         feed normalisation, transcripts, analysis (as needed)\n```\n\nRails renders a complete document for every public URL. Vue mounts small islands — the search palette, the live Thoughts stream, keyboard navigation, the theme toggle, chapter jumping in the player — only where they add something. Turn JavaScript off and the site still reads.\n\n## Objects and connections\n\nNotes, Thoughts, Projects, episodes, Goodies, pages and topics share one vocabulary: topics and tags, typed relationships between any two objects, revision history, and one search table. Links inside a body automatically become \"mentions\" relationships, so every page can show what points at it.\n\n## Open-web features\n\n- Atom and JSON Feed for everything and for each section; a feed per topic; RSS 2.0 with the podcast namespace for the show.\n- Every object as `.json`, `.txt` and, for long-form, `.md` with front matter. `Accept` headers work too.\n- A read-only JSON API at [/api/v1](/api/v1) that describes itself.\n- `llms.txt`, `humans.txt`, `robots.txt`, a sitemap, JSON-LD, OpenGraph, microformats2 (`h-entry`, `h-card`, `h-feed`).\n- A Webmention receiver. Verified mentions appear under the page they point at.\n- Stable permalinks. A URL only goes away if I take the post down.\n\n## Design\n\nThe site is set like the chart from a sleep study: a warm graphite ground that darkens down the page, warm white text, one amber accent. The chart at the top of every page is a hypnogram of this site's own publishing dates. Anybody sets the name and the headings, Public Sans the reading text, and IBM Plex Mono every label, date and line of code. There is no serif anywhere on the site. All three are self-hosted. The edition number counts everything ever published. Light mode is warm paper; add `?theme=light` to any URL to force it. Type does not move: hover changes colour and nothing else, and the one chart reveal stands down under `prefers-reduced-motion`.\n\n## Keyboard\n\n`/` search, `⌘K` palette, `j`/`k` through lists, `t` theme, `g n` notes, `?` help.\n\n## Terminal\n\nSee [/cli](/cli). `curl waltspence.com/now.txt` is the short version.\n\n## Source\n\nThe site's code is on [GitHub](https://github.com/waltspence). Content is [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) unless a page says otherwise.\n","body_html":"<p>This site is a publishing server. The web page you are reading is one of its interfaces.</p>\n<h2 id=\"stack\">Stack<a href=\"#stack\" aria-label=\"Link to heading 'Stack'\" data-heading-content=\"Stack\" class=\"anchor\"></a></h2>\n<pre class=\"syntax-highlighting\"><code><span class=\"text plain\">Vue 3 (JavaScript, Vite)      islands on server-rendered pages\n    ↓\nRuby on Rails                 system of record, HTML, JSON, text, feeds, API\n    ↓\nPostgreSQL                    content, relationships, full-text search\nRedis                         cache, Sidekiq queues, Action Cable, rate limiting\nPython / Node workers         feed normalisation, transcripts, analysis (as needed)\n</span></code></pre>\n<p>Rails renders a complete document for every public URL. Vue mounts small islands — the search palette, the live Thoughts stream, keyboard navigation, the theme toggle, chapter jumping in the player — only where they add something. Turn JavaScript off and the site still reads.</p>\n<h2 id=\"objects-and-connections\">Objects and connections<a href=\"#objects-and-connections\" aria-label=\"Link to heading 'Objects and connections'\" data-heading-content=\"Objects and connections\" class=\"anchor\"></a></h2>\n<p>Notes, Thoughts, Projects, episodes, Goodies, pages and topics share one vocabulary: topics and tags, typed relationships between any two objects, revision history, and one search table. Links inside a body automatically become “mentions” relationships, so every page can show what points at it.</p>\n<h2 id=\"open-web-features\">Open-web features<a href=\"#open-web-features\" aria-label=\"Link to heading 'Open-web features'\" data-heading-content=\"Open-web features\" class=\"anchor\"></a></h2>\n<ul>\n<li>Atom and JSON Feed for everything and for each section; a feed per topic; RSS 2.0 with the podcast namespace for the show.</li>\n<li>Every object as <code>.json</code>, <code>.txt</code> and, for long-form, <code>.md</code> with front matter. <code>Accept</code> headers work too.</li>\n<li>A read-only JSON API at <a href=\"/api/v1\">/api/v1</a> that describes itself.</li>\n<li><code>llms.txt</code>, <code>humans.txt</code>, <code>robots.txt</code>, a sitemap, JSON-LD, OpenGraph, microformats2 (<code>h-entry</code>, <code>h-card</code>, <code>h-feed</code>).</li>\n<li>A Webmention receiver. Verified mentions appear under the page they point at.</li>\n<li>Stable permalinks. A URL only goes away if I take the post down.</li>\n</ul>\n<h2 id=\"design\">Design<a href=\"#design\" aria-label=\"Link to heading 'Design'\" data-heading-content=\"Design\" class=\"anchor\"></a></h2>\n<p>The site is set like the chart from a sleep study: a warm graphite ground that darkens down the page, warm white text, one amber accent. The chart at the top of every page is a hypnogram of this site’s own publishing dates. Anybody sets the name and the headings, Public Sans the reading text, and IBM Plex Mono every label, date and line of code. There is no serif anywhere on the site. All three are self-hosted. The edition number counts everything ever published. Light mode is warm paper; add <code>?theme=light</code> to any URL to force it. Type does not move: hover changes colour and nothing else, and the one chart reveal stands down under <code>prefers-reduced-motion</code>.</p>\n<h2 id=\"keyboard\">Keyboard<a href=\"#keyboard\" aria-label=\"Link to heading 'Keyboard'\" data-heading-content=\"Keyboard\" class=\"anchor\"></a></h2>\n<p><code>/</code> search, <code>⌘K</code> palette, <code>j</code>/<code>k</code> through lists, <code>t</code> theme, <code>g n</code> notes, <code>?</code> help.</p>\n<h2 id=\"terminal\">Terminal<a href=\"#terminal\" aria-label=\"Link to heading 'Terminal'\" data-heading-content=\"Terminal\" class=\"anchor\"></a></h2>\n<p>See <a href=\"/cli\">/cli</a>. <code>curl waltspence.com/now.txt</code> is the short version.</p>\n<h2 id=\"source\">Source<a href=\"#source\" aria-label=\"Link to heading 'Source'\" data-heading-content=\"Source\" class=\"anchor\"></a></h2>\n<p>The site’s code is on <a href=\"https://github.com/waltspence\">GitHub</a>. Content is <a href=\"https://creativecommons.org/licenses/by-sa/4.0/\">CC BY-SA 4.0</a> unless a page says otherwise.</p>\n","text":"This site is a publishing server. The web page you are reading is one of its interfaces.\nStack\nVue 3 (JavaScript, Vite)      islands on server-rendered pages\n    ↓\nRuby on Rails                 system of record, HTML, JSON, text, feeds, API\n    ↓\nPostgreSQL                    content, relationships, full-text search\nRedis                         cache, Sidekiq queues, Action Cable, rate limiting\nPython / Node workers         feed normalisation, transcripts, analysis (as needed)\n\nRails renders a complete document for every public URL. Vue mounts small islands — the search palette, the live Thoughts stream, keyboard navigation, the theme toggle, chapter jumping in the player — only where they add something. Turn JavaScript off and the site still reads.\nObjects and connections\nNotes, Thoughts, Projects, episodes, Goodies, pages and topics share one vocabulary: topics and tags, typed relationships between any two objects, revision history, and one search table. Links inside a body automatically become “mentions” relationships, so every page can show what points at it.\nOpen-web features\n\nAtom and JSON Feed for everything and for each section; a feed per topic; RSS 2.0 with the podcast namespace for the show.\nEvery object as .json, .txt and, for long-form, .md with front matter. Accept headers work too.\nA read-only JSON API at /api/v1 that describes itself.\nllms.txt, humans.txt, robots.txt, a sitemap, JSON-LD, OpenGraph, microformats2 (h-entry, h-card, h-feed).\nA Webmention receiver. Verified mentions appear under the page they point at.\nStable permalinks. A URL only goes away if I take the post down.\n\nDesign\nThe site is set like the chart from a sleep study: a warm graphite ground that darkens down the page, warm white text, one amber accent. The chart at the top of every page is a hypnogram of this site’s own publishing dates. Anybody sets the name and the headings, Public Sans the reading text, and IBM Plex Mono every label, date and line of code. There is no serif anywhere on the site. All three are self-hosted. The edition number counts everything ever published. Light mode is warm paper; add ?theme=light to any URL to force it. Type does not move: hover changes colour and nothing else, and the one chart reveal stands down under prefers-reduced-motion.\nKeyboard\n/ search, ⌘K palette, j/k through lists, t theme, g n notes, ? help.\nTerminal\nSee /cli. curl waltspence.com/now.txt is the short version.\nSource\nThe site’s code is on GitHub. Content is CC BY-SA 4.0 unless a page says otherwise.","url":"https://waltspence.com/colophon","links":{"html":"https://waltspence.com/colophon","json":"https://waltspence.com/colophon.json","txt":"https://waltspence.com/colophon.txt","md":"https://waltspence.com/colophon.md","canonical":"https://waltspence.com/colophon"},"revisions":[{"at":"2026-09-05T02:37:02-04:00","summary":"Revised"},{"at":"2026-09-05T02:31:04-04:00","summary":"Revised"},{"at":"2026-09-02T23:05:31-04:00","summary":"Revised"}]}