Popsicle Boat as a comment section
July 10, 2026
The usual ways to put comments on a blog: a third-party widget, a self-hosted comment server, or silence. The widgets are free because the reader is the product — the big ones ship ads and trackers into every page that embeds them. Self-hosting means running a spam-fighting service forever. Silence is silence.
This blog does a fourth thing, and any blog can copy it.
The pattern #
A post that wants a discussion gets a thread on Popsicle Boat, and the post links to it. That’s the entire integration:
<a href="https://www.popsicleboat.com/c/programming/posts/168">
Discuss this post aboard Popsicle Boat →
</a>
The previous post here does exactly this — its discussion lives in the programming interest. The boat’s own changelog posts discuss in the Logbook. Each thread sits in a space whose members actually care about the topic, which is more than a comment box at the bottom of a page can say.
What the reader’s browser sees #
Nothing. A link is inert — no script, no iframe, no cookie, no pixel, nothing for a content blocker to block or a consent banner to confess. The blog page stays exactly as private as it was.
Following the link lands on a public thread: reading requires no account, replying takes a free one. Popsicle Boat itself carries no ads and loads no third-party scripts — the conversation is the product, not the person having it.
Steps, for any blog on any stack #
- Make an account at popsicleboat.com.
- Find an interest that fits your post’s topic, or propose one.
- Post there about your article — a title and a couple of sentences, with the link back.
- Copy the thread’s URL and link it from your article.
Repeat per post. Moderation is whatever you can do with your own posts aboard — edit, delete, and the thread’s replies are in a community with norms rather than an unattended box.
Why a link and not a widget #
We tried the widget version — an embedded iframe mirroring the thread onto the blog — and removed it. Replies written for a community read strangely when syndicated somewhere else, and an embed is one more thing a reader’s browser has to trust. The link asks nothing.
A nicety for static sites #
Threads are posts, and posts get deleted — this integration survived three of them before settling. On a static site the fix is to make the build check: this blog’s Hugo template probes each linked thread and only renders the link if the thread still answers, so a dead discussion quietly becomes no link at all instead of a reader’s dead end.
{{ with .Params.popsicleboat }}
{{ with try (resources.GetRemote .) }}
{{ if not .Err }}
<p class="boat-discuss">
<a href="{{ $.Params.popsicleboat }}">Discuss this post aboard Popsicle Boat →</a>
</p>
{{ end }}
{{ end }}
{{ end }}
One frontmatter line per post drives it. Non-static blogs can do the same check at render time, or just fix links when they break.
That’s the whole system. No ad network gets a seat, no analytics script rides along, and the conversation happens somewhere built for conversations. An anchor tag can’t track anyone.