Back to blog

Utterances Alternative: Comments Without the GitHub Account Gate

Introduction: When GitHub Issues stops being enough

Utterances is a beautiful idea: store blog comments as GitHub Issues. No database, no server, no hosting bill, no spam (because GitHub already filters), and a clean UI that fits perfectly into developer-focused blogs. For static sites maintained by developers and read by developers, Utterances is genuinely excellent and the right choice.

The catch shows up the moment your audience grows beyond developers. Every commenter needs a GitHub account. Anyone without one — the long tail of designers, marketers, students, casual readers, your mom — either can't comment, or has to create a GitHub account just to leave a "great post, thanks" reply. The conversion rate from "wanted to comment" to "actually commented" collapses, and the feedback you do get is biased toward the kind of person who already had a GitHub account.

This guide compares Utterances with EchoThread for the case where your blog has outgrown the dev-only audience — or never had one to begin with. It covers what Utterances does well, where the GitHub-Issues model breaks down, and the migration path if you decide to switch.

What Utterances gets right

For a tool maintained essentially by one person, Utterances is remarkably polished. The widget is small, loads fast, integrates cleanly with any static site, and stores comments where developers already live. It's free forever (GitHub Issues are free), it's open source, and it has zero third-party tracking. If your blog's audience is GitHub users discussing technical content, Utterances is the right tool.

What this guide is not is "Utterances is bad." It's an attempt to honestly describe the cases where its design choices push more friction onto your readers than is worth the operational simplicity it gives you.

EchoThread vs. Utterances at a glance

FeatureEchoThreadUtterances
Account requirement to commentNone — magic link worksGitHub account required
Sign-in optionsGoogle, GitHub, magic link, passkeyGitHub only
Threaded repliesYes — nestedFlat list (Issues are flat)
Emoji reactionsYes (4 emoji)Yes (8 GitHub reactions)
Spam handlingML classifier on by defaultGitHub's anti-abuse + manual
Image attachmentsYesYes (via GitHub upload)
Moderation dashboardPolished web app, mobile-firstGitHub Issues UI
Bulk moderationYesLimited (GitHub bulk-edit)
Comment count badge on postYesManual API call
Comments survive repo deletionYesNo — comments live in your repo
Pricing$0 Hobby / $5 StarterFree

The GitHub-account requirement is the single biggest issue

Every Utterances comment requires the reader to be signed into GitHub. There is no alternative path — no email magic link, no Google sign-in, no anonymous mode. For an audience of developers, that's a non-issue: they're already signed in. For any audience that includes non-developers, you're filtering out the majority of your potential commenters.

What this looks like in practice when sites migrate from Utterances to EchoThread is a substantial, immediate increase in comment volume, driven entirely by readers who could now sign in via Google or magic link. Whether that's a good or a bad thing depends on whether you wanted those readers' input in the first place — but if your goal was a community discussion, the gating is working against you.

Threading: nested replies vs. a flat list

GitHub Issues are flat. Every comment hangs off the issue at the same level. Utterances reflects this faithfully: discussions appear as a chronological list with no nesting. That's fine for short conversations and breaks down quickly when more than a handful of people start replying to each other. By comment thirty, the chronology has overtaken the structure and readers can no longer tell which reply was a response to which.

EchoThread renders nested replies, so a long discussion stays readable: each reply hangs off its parent comment rather than the chronological list. The structure scales to long threads without losing the conversational shape, even at hundreds of comments.

Spam: the GitHub firewall is shrinking

Utterances inherits GitHub's built-in spam filter, which used to be excellent. In recent years, with the rise of AI-generated content, GitHub spam in repository Issues has become a real problem — especially on repos pinned by Utterances installations, which become attractive targets for SEO-spam comment dropping. The filter still works, but the manual triage burden on a popular blog can grow uncomfortably.

EchoThread's ML classifier is purpose-built for comment spam (not generic GitHub abuse), which means it's tuned for exactly the patterns Utterances installations attract. The result is dramatically fewer manual triage actions after switching, particularly for blogs that have hit the HN front page or any equivalent traffic spike.

Operational risk: comments live in your repo

Utterances stores comments as GitHub Issues in a repository you own. That's mostly a feature — you have the data — but it has two failure modes:

  1. Repo deletion or transfer breaks the comment system. If you ever rename, transfer, or delete the repository (which happens during company changes, GitHub username changes, etc.), the entire comment dataset becomes inaccessible without manually updating every page on your blog.
  2. Repo issues count toward GitHub's secondary rate limits. A heavily-commented blog can run into 5,000-issue-per-hour limits during traffic spikes (e.g. an HN frontpage), causing comments to fail to post for some readers.

EchoThread sidesteps both: comments are tied to a stable thread identifier (you can set this via data-thread-id), and our infrastructure isn't subject to GitHub's rate limits.

Moderation: GitHub Issues UI vs. a purpose-built dashboard

If you've ever moderated a popular blog using GitHub Issues directly, you know the workflow: open a tab per comment that needs attention, decide what to do, click through. There's no "approve all the queued comments from new users" button, no regex-based banned-words rule, no per-page thread overview, no mobile-friendly bulk action.

EchoThread's moderation dashboard was designed for moderation specifically. Bulk approve / bulk reject, regex rules, banned word lists, per-thread overview, full mobile responsiveness. The pattern moderators describe after migrating is the same: what used to be a tab-juggling chore becomes a one-minute habit.

Migration path: from Utterances to EchoThread

Migration is a little less polished than from Disqus or Remark42 because Utterances stores data in GitHub Issues, which require API access. The path:

  1. Generate a GitHub personal access token with repo read permissions.
  2. Run our utterances-export script (in the EchoThread CLI), pointing it at your repository name. The script paginates through every Issue created by Utterances, extracts the comments, normalizes the parent-child structure (flat — everything at level 0), and produces a JSON file the EchoThread importer accepts.
  3. Import the JSON into EchoThread.
  4. Swap the embed snippet on your site.

Total time: 30 minutes for a typical blog. The export script handles the GitHub rate-limit pagination automatically.

When to stay on Utterances

Utterances is the right choice when:

  • Your audience is exclusively developers who are already signed into GitHub.
  • Your blog has fewer than ten comments per post on average and threading isn't useful.
  • You strongly prefer "no third-party service at all" and are willing to accept the GitHub account gating that comes with that.

For anything beyond a developer-only audience, the gating cost outweighs the operational simplicity.

Frequently asked questions

Will my Utterances commenters still be able to use their GitHub account?

Yes. EchoThread supports GitHub OAuth as a sign-in method, so anyone who signed in to your Utterances comments via GitHub can keep doing exactly that. They'll also gain the option to sign in via Google, email magic link, or passkey if they prefer.

Do I lose my existing GitHub Issue history if I migrate?

No. Migration copies the comments into EchoThread; it doesn't delete them from your GitHub repository. You can leave the Issues in place as a record, or close them in bulk via the GitHub API once you've verified the migration succeeded.

Does EchoThread work on static sites the same way Utterances does?

Yes — that's exactly the use case it's designed for. A single script tag in your base layout (Astro, Eleventy, Hugo, Jekyll, Next, Nuxt, Hexo) drops the comment widget on every post automatically. See the add-comments-to-any-website guide for platform-specific snippets.

What about page-speed?

EchoThread's widget is under 15 KB gzipped and lazy-loads below the fold by default. Utterances is heavier and renders eagerly. Both will pass any reasonable Lighthouse audit; EchoThread will score better on slow connections.

What does it cost?

Free for under 10,000 monthly page views (Hobby tier). $5 a month for up to 100,000 page views (Starter). $19 a month for up to a million (Pro). $79 a month for unlimited (Business). Beta signups keep Hobby free for life on the sites they had at the cutoff. Full pricing is on the pricing page.

Outgrown the GitHub-account requirement? Create a free EchoThread account and migrate your Utterances comments in under thirty minutes.

Ready to try EchoThread?

Free during beta. Set up in under a minute.

Create free account