The most comprehensive self-hosted comments
Drop-in comment threads for any page: embed a site key, comment on URLs or stable page keys, moderate in the dashboard. Markdown bodies, guest and signed-in posting, votes, and a publisher API for sites that register their threads up front.
README
Comments that live inside your stack. Drop-in threads, moderation and a publisher API — self-hosted on your own Postgres, from weekend blogs to production publishers.
bun add @lst97-oss/last-comments-widgetsFeatures
Works with your stack.
React, Vue, Angular and plain HTML share one API client and one theme. Register a page origin and comments work on any URL.
Guests and signed-in authors.
Every post carries a Turnstile token. Guests add a display name; signed-in users post through a Better Auth session.
Votes with viewer state.
Every comment carries its score and the viewer’s own vote, so a thread renders correctly for each reader.
Moderation dashboard.
Hide, restore, pin, delete and lock pages from /moderation, with block-by-user, moderator replies and a per-page thread view.
Publisher API.
Site-bound API keys register page threads up front, so a publishing pipeline can claim a page key before the first comment lands.
Plugin system.
Server-side plugins hook validation, operations and transactional events. Rate limiting and Turnstile ship enabled.
Framework
One client, four widgets, and a theme that stays out of your page.
import { Comments } from '@lst97-oss/last-comments-widgets/react'
import '@lst97-oss/last-comments-widgets/react/styles.css'
export function Thread() {
return (
<Comments
baseUrl="https://comments.example.com"
site="blog"
pageUrl="https://example.com/blog/hello"
turnstileSiteKey="0x4AAAAAA..."
/>
)
}