Popsicle Boat as a comment section

Projects
Popsicleboat
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 #

  1. Make an account at popsicleboat.com.
  2. Find an interest that fits your post’s topic, or propose one.
  3. Post there about your article — a title and a couple of sentences, with the link back.
  4. 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.

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 &rarr;</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.