A Magazine with One Subscriber

m-hodges2 pts1 comments

A Magazine With One Subscriber

For LLMs:<br>Markdown<br>Open in ChatGPT<br>Open in Claude

For LLMs:<br>Markdown<br>Open in ChatGPT<br>Open in Claude

Issue 001 of The Periodical

This week a physical magazine showed up at my door. It has a cover, an editor’s note, a table of contents, feature articles set in two columns, pull quotes, drop caps, and a colophon. It’s Issue 001 of The Periodical , and I am its only subscriber.

I made it with Claude Code, Claude Design, and Codex, and the whole thing started as a shower thought I typed into ChatGPT:

I wonder if there’s a way to use Obsidian Web Clipper to make a custom magazine based on a collection of clippings… thinking like every month clipped articles go into a folder and then the clippings somehow get packaged or bundled into a beautiful monthly periodical. I don’t yet use Obsidian so maybe this isn’t feasible?

I recently bought my dad a number of back issues of Lapham’s Quarterly, and it got me thinking about how to have something similar for myself. I liked the idea of a finite, private, beautiful object built from the articles I was already saving. I’ve always felt that read-later apps guilt me with an infinite backlog. But a physical magazine is something I could pick up and put down, and it ultimately ends.

That ChatGPT conversation grew into a full product spec for a pipeline that:

Pulls my recent clippings, saved with Obsidian Web Clipper, from an Obsidian vault

Processes each article to capture its images and metadata from the source

Reads everything in full, drafts an editorial note, and arranges the pieces into topical sections

Forks out to Codex to generate a magazine cover image

Typesets it all into a print-friendly magazine

I took that spec to Claude Code, and argued through the open decisions over a few sessions to get to a few more constraints:

The Obsidian vault is an immutable capture surface. The pipeline never writes to it. Every issue gets snapshotted into a git repo so the whole magazine is version controlled and reproducible.

Issues are folders, not calendar months. When I feel like an issue is full, I build it.

The AI work runs on my existing Claude and ChatGPT subscriptions, no metered API keys.

I got to a technical design I ended up liking. Every AI step sits behind a file contract. The editorial agent writes a JSON file. The image model writes a PNG. The deterministic Python pipeline doesn’t know or care what produced them, which means I can swap the editorial model or the image backend later without touching the pipeline at all.

The Wrong Renderer

The first spec called for Paged.js, a JavaScript library that polyfills the CSS Paged Media spec in a headless Chrome. It’s a standard answer for HTML-to-print. It was also two hours of my life I want back. The npm install tripped over blocked install scripts, the CLI shipped a Puppeteer that predated my Node version, and Chromium refused to download. I rarely work in the Node ecosystem, and I finally typed:

hey, this is terrible. Like really terrible. I’m fighting awful node tooling here. Is this a sign that this is not the best path?

It was. I threw out Node entirely and moved to WeasyPrint, a Python renderer that implements CSS Paged Media without a browser or JavaScript. I like Python, the whole pipeline became one language, and the renderer runs in-process. Much better. A few years ago I’d have kept fighting Node just to justify the two hours already gone, but rebuilding on a new stack with Claude cost me close to nothing.

By the end of that night, Claude had built the full pipeline to snapshot the vault, parse the clippings, download and freeze every image, render HTML through Jinja2 templates, and paginate to PDF. I opened the first output and told it:

This is so freaking good I’m so impressed!

Which was true! Also premature. It looked like a nicely formatted Word document. I had no idea how to make it look like a magazine, because I’m not a designer.

Finding a Design

I did not want to own the design of this thing. I said so directly during the spec phase:

the goal is not a custom design, the goal is a nice design with custom content.

So I treated design as a one-time subcontract. I connected Claude Design, to the GitHub repo, and Claude Code wrote the creative brief for it, including a hard rule:

The one constraint that matters most: the renderer is WeasyPrint, not a browser. Browser previews will lie to you. Verify your work by actually building.

The brief asked for a full typeface system with appropriate licenses, a recommendations memo answering my open questions (trim size, body type size, paper color), a cover system with a masthead, and recto/verso layouts with mirrored margins. So one Claude wrote the design brief for another Claude, with build instructions so the designer could check its own work in the real renderer.

Claude Design came back with a fantastic restyle. Newsreader for display type, Spectral for body text, Libre Franklin in tracked caps for...

claude design magazine open like pipeline

Related Articles