Comments, done right

No logins.
No spam.
Just comments.

A drop-in comment section your readers can use in one click.

Paste one line. Done.

Create a site, drop the snippet into your template, and comments are live. Works with any framework or plain HTML.

index.htmlCopy to clipboard
<div
  data-site="YOUR_SITE_KEY"
  data-thread="your-page-id"
  data-api="https://threadly-api.threadly.workers.dev"
></div>
<script
  src="https://threadly-widget.pages.dev/widget/0.5.4/widget.js"
  defer
></script>

Live in three steps

1

Create a site

Sign in and register your domain. Get a snippet scoped to that site.

2

Paste the snippet

Add one <script> tag to your page. No build step, no backend.

3

Moderate as you go

Comments wait in your dashboard. Approve with one click.

Your dashboard

You decide what goes live.

Every comment lands in a queue. Approve the good ones, reject the rest β€” from one clean screen.

How moderation works β†’

Why not Disqus?

Most comment tools make your readers sign up, load megabytes of ad tech, or lock you out of your own data. Threadly doesn't.

Disqus

The 2000s incumbent

2 / 6
  • Not supported: Readers comment with no account
  • Not supported: No ads or tracking
  • Supported: Built-in moderation
  • Not supported: Under 30 KB
  • Not supported: Open source
  • Supported: One-line install

Giscus

GitHub-backed comments

3 / 6
  • Not supported: Readers comment with no account
  • Supported: No ads or tracking
  • Not supported: Built-in moderation
  • Supported: Under 30 KB
  • Supported: Open source
  • Not supported: One-line install

For developers

A comment system that respects your stack.

Plain script tag for any site, or a typed component for your framework. Theme it with CSS variables, own the data, self-host if you want to.

Read the docs β†’
Comments.tsxCopy to clipboard
"use client";
import { useEffect, useRef } from "react";

// Mount a thread; remounts on client-side navigation.
export function Comments({ thread }: { thread: string }) {
  const ref = useRef<HTMLDivElement>(null);
  useEffect(() => {
    window.Threadly?.mount(ref.current!);
  }, [thread]);

  return (
    <div
      ref={ref}
      data-site="YOUR_SITE_KEY"
      data-thread={thread}
      data-api="https://threadly-api.threadly.workers.dev"
    />
  );
}

Simple pricing

Start free. Pay only when you outgrow the basics.

Hobby
Free

For personal sites

  • 1 site
  • Unlimited comments
  • Manual moderation
  • Community support
Start free
Coming soonSelf-host
Free

Open source, MIT

  • Run it yourself
  • Your database
  • Full source
  • No limits
View on GitHub

Give your readers a voice.

One line of code. No spam. No sign-up walls.