--- title: "Letterhearth: a paid newsletter for an independent writer" author: "@chris" author_url: https://elements.dev/users/chris published: 2026-09-30T22:01:08.798Z url: https://elements.dev/demos/8l3w567l/letterhearth-a-paid-newsletter-for-an-independent-writer kind: post format: article --- # Letterhearth: a paid newsletter for an independent writer by [@chris](https://elements.dev/users/chris) ยท 2026-09-30 ## Description Free or $8 a month subscriptions by card, a teaser on paid posts, and markdown posts the writer schedules and emails. Letterhearth needed free and paid subscriptions billed monthly by card, scheduled posts that go out by email, a teaser for readers who are not paying, one-click unsubscribe, and live counts for the writer. Each of those is a part of Elements, so the agent spent its 22 minutes on the newsletter itself. **What Elements gave the app** - **Live counts and revenue.** Subscribers are a LiveTable, so the writer's free and paid counts and monthly revenue move the moment a reader subscribes or upgrades. - **Monthly subscriptions.** Subscribing, upgrading and cancelling are `@rpc` calls, and paid plans go through Stripe at $8 a month. The return page and Stripe's webhook record a new subscription once. Until a Stripe key is added, a built-in test checkout takes the payment through the same code, and in production the app registers its own webhook. - **Posts on a schedule.** A cron schedule checks every minute for posts whose time has come and queues one email job per reader, so a failed send retries alone. Paid posts go in full to paid readers and as a teaser to everyone else. - **One-click unsubscribe.** Every email carries the headers mail clients turn into an unsubscribe button, and the app answers that button directly. - **Data from SQL files.** Migrations define the newsletter and seed the writer, six posts (three paid), five free readers and three on complimentary paid plans. - **Sessions for readers and the writer.** Readers are signed in when they subscribe and later by an emailed link, and every writer page shares one guard on the writer's role. **What the project server gave the agent** The project server runs alongside the agent and answers as soon as a file is saved: it type-checks the templates, TypeScript and SQL, applies migrations and reruns the tests, so every question came back right away and the agent kept building. **What shipped** The app type-checks with zero errors and all 57 tests pass. Every page works on desktop and phone. A real sandbox payment went through Stripe end to end.