Skip to content
Announcement | Introducing Last Comments

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.

bash
bun add @lst97-oss/last-comments-widgets

Features

01

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.

ReactVueAngularHTML
02

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.

GuestSigned-in
03

Votes with viewer state.

Every comment carries its score and the viewer’s own vote, so a thread renders correctly for each reader.

scoreviewerVote
04

Moderation dashboard.

Hide, restore, pin, delete and lock pages from /moderation, with block-by-user, moderator replies and a per-page thread view.

hidepinlock
05

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.

POST /api/admin/pages
06

Plugin system.

Server-side plugins hook validation, operations and transactional events. Rate limiting and Turnstile ship enabled.

rate-limitturnstile

Framework

One client, four widgets, and a theme that stays out of your page.

tsx
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..."
    />
  )
}
The theme compiles Tailwind v4 preflight and utilities inside @scope (.lc-comments, .lc-theme), so the widget ships its own reset and never touches the host page.

Latest posts

View all
last-comments
announcementself-hostedcomments

Introducing last-comments: self-hosted comments for any site

What last-comments is, what ships in the box, how threads flow from embed to moderation, and where the project is headed.

Read