Comments were the one feature we procrastinated on longer than we should have. Not because the problem was hard — comment systems have existed since the dawn of the web — but because every option felt like it was fighting against something Postlark stands for.

The Zero-JS Dilemma

Postlark serves blog pages as pure HTML and CSS. No React runtime, no Vue hydration, no framework executing on the reader's device. Pages load instantly, work everywhere, and don't break when a script fails to fire.

A comment section blows a hole through that philosophy. Readers type text, hit submit, and expect it to appear for the next visitor. You can't do that with static markup alone. So the question was never "should we support this?" — most bloggers want reader interaction — but "how do we bolt on interactivity without dragging in a full frontend stack?"

What We Looked At

We went through the usual roster.

Disqus was off the table almost immediately. The free tier injects ads you can't control and tracks readers across the web. For a platform that doesn't even load client-side scripts by default, embedding a tracker-laden widget felt hypocritical. The payload was also absurd — north of 100KB in some configurations.

utterances was more appealing. It stores conversations as GitHub Issues, ships as a single lightweight script, and is fully open source. We liked the idea. But by the time we evaluated it, the project's maintenance had slowed to a crawl. Open issues piling up, PRs going unreviewed for months. Building on stalling infrastructure is a recipe for headaches twelve months down the line.

Commento and Cusdis both take privacy seriously — lightweight, no tracking, clean UIs. But they require either self-hosting or a paid subscription. We didn't want to run another server, and we didn't want to ask bloggers to manage one either.

Rolling our own crossed our minds, obviously. We could tailor it perfectly. But the scope was real: authentication, spam filtering, moderation dashboards, email notifications, abuse handling. A comment system is basically a mini social network. We had twenty other features competing for the same calendar weeks.

giscus: The One That Fit

giscus uses GitHub Discussions as its backend — a subtle but meaningful difference from the Issues-based approach utterances took. Discussions have native threading, emoji reactions, categories, and are designed for open-ended conversations rather than bug tracking.

What made us commit:

  • Genuinely free. Not "free tier with usage caps" — open source, sponsor-funded, zero cost. Forever, as far as anyone can tell.

  • No database on our side. Conversations live in GitHub Discussions on the blogger's own repository. They own every word.

  • No tracking, no ads. The widget loads one script, queries the GitHub API, renders the thread. Nothing else phones home.

  • Dark mode for free. It picks up light/dark preferences and CSS custom properties, so the widget doesn't stick out like a sore thumb on themed blogs.

That single script became one of only three JavaScript files a Postlark blog ever loads — alongside an optional dark mode toggle and ad slots for bloggers who enable monetization.

"My Readers Don't Have GitHub"

This is the objection that surfaces every time someone recommends giscus. And for some audiences, it's a dealbreaker.

But think about who publishes on Postlark. Developers writing about code. Indie hackers documenting their builds. Technical writers explaining APIs. These people aren't just on GitHub — they're logged in right now, probably in the next browser tab.

The login requirement works as a natural spam filter. No anonymous drive-by posts, no CAPTCHA walls, no disposable-email signups. Every person who leaves a reply has a real profile with contribution history and public repos. You can tell within seconds whether they're genuine.

For the minority of Postlark bloggers targeting non-developer audiences, this is admittedly a gap. A native comment system — optional, built-in, no external account required — is on the roadmap. But for the vast majority of current users, the GitHub requirement is a feature, not a limitation.

Two Minutes to Set Up

Enabling the widget on a Postlark blog is fast. Connect a GitHub repository, pick a Discussions category, done. The platform injects the right configuration into each post's footer automatically.

When a reader reaches the bottom of a post, the script loads lazily, searches for (or creates) the matching Discussion, and renders existing replies inline. Responding means authorizing the giscus app via OAuth — a one-time click — and typing directly on the page. Or they can jump to the Discussion on GitHub itself; everything syncs both ways.

A nice bonus we didn't anticipate: GitHub's notification system kicks in for free. Bloggers hear about new replies without us building any notification infrastructure. Readers can subscribe to individual threads. We're piggybacking on plumbing that already exists and already works well.

Moving On

Every comment system is a trade-off. Self-hosted means full control but ongoing ops burden. Managed services mean convenience but cost money or privacy. giscus trades universal access — people without a GitHub account can't participate — for zero cost, zero tracking, and near-zero maintenance.

For a solo-dev platform shipping features at sprint pace, that calculation was straightforward. We could spend two weeks building a bespoke system, or spend an afternoon wiring up the integration and get back to the other nineteen items on the list.

We picked the nineteen items. Still haven't regretted it.