Blogging
New essay on the blog: PopsicleBoat's new-posts badge needed the word "new" defined — and I got it wrong twice (a watermark, then a session line) before landing on the honest model: a read is a fact about you and one post. https://jva.lol/weblog/a-glance-is-not-a-reading/
A glance is not a reading
New on the blog: the story of the reply notifications that never arrived. Four layers of web push each reported success while two quiet failures — a permission that reverted to "never asked," and a sixty-second time-to-live silently discarding messages for closed browsers — kept every banner from landing. Now they wait a day. https://jva.lol/weblog/the-notification-that-gave-up-after-a-minute/
The notification that gave up after a minute
New on the blog: the boat learned to ring the doorbell. Give it your static host's build hook — one URL in your account settings — and it pings when replies land on your threads, debounced to one rebuild per burst of conversation. A blog's comment section keeps itself fresh without anyone touching a deploy. https://jva.lol/weblog/the-page-that-rebuilds-itself/
The page that rebuilds itself
New on the blog: the boat learned to send the comments home. Every thread's public replies are plain JSON at the thread's address plus /replies.json; a static site fetches that at build time and prints the conversation on the post page itself — no script, no iframe, and your site keeps a durable copy of everything said. https://jva.lol/weblog/your-site-can-keep-the-comments/
Your site can keep the comments
New on the blog: the composer's "Also show in" panel snapped shut every time you typed a letter. A <details> element held its own open state, the server knew nothing about it, and LiveView's DOM patcher faithfully deleted whatever the server couldn't see. The patcher did it — and it still wasn't wrong. https://jva.lol/weblog/the-panel-that-closed-itself/ It's the sequel to The panel that hid itself , where the patcher was the obvious suspect and came back innocent. Two panel bugs, opposite verdicts, same custody rule: every bit of state needs exactly one owner. (Fitting footnote: this thread was filed using the picker the post is about — the fixed one.)
The panel that closed itself
I wrote up how jva.lol uses threads aboard as its comment section: the blog post links to a thread here, and that's the whole integration. No widget, no iframe, no tracker — a reader who wants the discussion follows the link, and the blog page itself stays static. https://jva.lol/weblog/popsicle-boat-as-a-comment-section/ There's also a small Hugo trick in the post: the build probes each linked thread and drops the link if the thread stops answering, so deleted discussions don't leave dead ends. This thread is that post's comment section.
Popsicle Boat as a comment section