For bloggers
The offer, in one sentence: A hassle-free comment section for your blog: set up once, totally free, no subscriptions, nothing, and you always own the content.
PopsicleBoat is a small social web for creators: no ads, no tracking, no dependencies, built and looked after by one person (me). If your blog has no comments (on purpose, or because every option is either surveillance-ware or a maintenance chore), PopsicleBoat can host the conversation instead. It's designed to be as easy as possible.
That button walks you through a quick signup. Prove the blog is yours with one link and I'll approve it. Or read on first.
How it works
- You get a space. Write to me and I'll set it up the same day. Or claim it yourself: sign in or sign up -> add one link to popsicleboat.com to your blog -> it goes in for approval.
- Each post gets a thread. You (or I, happily, while you try it out) post a short companion thread: the post's title and a link back to your site. Prefer to wire it yourself? The API is one page.
- Your posts link the thread. Add a "Discuss this post" link at the bottom of a post and you're done. Readers click through, read freely, and reply if they care enough to join.
One post a month, one post a year, one post ever. All fine.
See it working
This isn't hypothetical. My own blog uses it. Here's a post: What's new aboard. Here's its discussion thread on the boat. The link at the bottom of the essay is the whole integration.
What your readers get
- Reading is open: no account needed to follow the conversation.
- Replying takes an account, which is the point: replies come from named members of a small community, not drive-by spam. You'll never moderate a spam queue.
- Your space gets its own RSS feed automatically, so readers can follow your discussions from any feed reader.
- Writing supports simple formatting (links, emphasis, code) with a live preview.
Your site can keep the comments
Every thread's public replies are also published as plain JSON at the thread's address plus /replies.json. A static site can fetch that at build time and print the conversation on the post page itself. No script, no iframe, nothing in your readers' browsers.
My own blog is wired this way, and it makes the no-lock-in promise physical: the copies your site builds are yours to keep, whatever happens to the boat.
The JSON is small and stable. This is the whole shape:
{
"thread": { "title": "…", "url": "…", "reply_count": 2 },
"replies": [
{
"author": "username",
"body_html": "<p>rendered, sanitized markup</p>",
"body_text": "the same words as plain text",
"posted_at": "2026-07-13T02:18:26Z",
"url": "the reply's permalink",
"depth": 0
}
]
}
Replies arrive in thread order (every nested answer directly after its parent), and depth says how deep it sits, from 0 at the top. Indent by it if you like; my blog caps the indent at three levels so a long exchange stays readable.
Only what a signed-out visitor could read is included, deleted replies disappear from the JSON on your next build, and if the boat is ever unreachable your build should just skip the section and the page stays whole.
And your page can keep itself fresh: put a build hook (the plain POST URL Netlify, Vercel, and Cloudflare Pages all offer) in your account settings and the boat pings it when replies land on your threads, wherever they live. One debounced ping per conversation burst, so a lively thread doesn't trigger twenty builds. A space's edit form takes a hook too, for rebuilding on anything that moves in a dedicated space.
The wiring, concretely: any generator that can fetch a URL at build time can do this. Here's a minimal Hugo version. My own blog runs a fancier cousin of exactly this.
{{ $data := dict }}
{{ with try (resources.GetRemote "https://www.popsicleboat.com/c/YOUR-SPACE/posts/THREAD-ID/replies.json") }}
{{ if and (not .Err) .Value }}
{{ $data = .Value.Content | transform.Unmarshal }}
{{ end }}
{{ end }}
{{ with $data.replies }}
<section>
<h2>Replies</h2>
{{ range . }}
<article style="margin-left: {{ math.Min (int (.depth | default 0)) 3 }}em">
<p><strong>{{ .author }}</strong> · {{ .posted_at }}</p>
{{ .body_html | safeHTML }}
</article>
{{ end }}
</section>
{{ end }}
Drop that in your post template -> point it at your thread -> build. If the boat is ever unreachable there's no JSON, so no section renders and the page stays whole. Not on Hugo? The shape is the same anywhere: fetch the JSON -> loop the replies -> print them.
The promises
- No lock-in. The integration is a link on your site. Remove the link and you've left, nothing held hostage.
- No ads, no tracking, ever. The privacy policy is one page of plain sentences.
- Free. The boat is a labor of care with bounded costs, not a growth machine with a pricing page waiting to hatch.
- A person answers. Moderation questions, feature wishes, or "this feels off": you write to me and I reply.
- Your blog keeps every comment, no matter what. Conversations are built into your site's own pages at deploy time. If PopsicleBoat vanished tomorrow, your blog would still show every comment it has ever shown.
How is this funded?
The boat is funded out of my own pocket, with no investors or ads. It's a labor of care, and I keep the costs bounded.
The link, if you want to style it
Anything works (it's just a link), but here's a plain version to paste:
<p>
<a href="https://www.popsicleboat.com/c/YOUR-SPACE/posts/THREAD-ID">
Discuss this post →
</a>
</p>
Interested?
Send your blog's address to me, through the letters page. I'll set up your space the same day and send you the links. If you try it and it's not for you, no hard feelings and nothing to uninstall.
Either way, it works the same: your blog keeps the comments, and the boat just serves as a conduit for the discussion.