open-remark
OpenRemark is an open-source, self-hostable comment system designed specifically for static websites ( Astro, Hugo, or Next.js). It aims to provide a fully featured commenting experience with minimal setup.
OpenRemark adds self hosted comments to static sites
OpenRemark is a self hostable comment system for static websites that ships a shadow DOM widget, threaded replies, and a moderation dashboard.
What OpenRemark provides
OpenRemark is a self hostable comment system for static websites. The README describes it as working with Astro, Hugo, Next.js, and any site that accepts HTML, so the audience is people running static generators who still want reader discussion. The project is in beta and the README shows a version badge of 0.6.1. A live demo is linked from the README for anyone who wants to try the widget before installing.
The feature list covers the basics a comment system needs. Visitors sign in with Google. Replies are threaded, so conversations can nest. There is a spam and moderation dashboard for the site owner. The system supports site teams and roles, which lets several people manage one site with different permissions. The comment widget uses a shadow DOM, which keeps the embedded styles from leaking into the host page. Origin allowlisting restricts which domains may load the widget, a control that matters once the system is public. The README presents these as the headline capabilities rather than an exhaustive list, and the beta tag suggests the surface may still change. None of the features require a third party hosted service, since the whole point is to run the system on your own infrastructure.
Setup and embedding
Getting a local instance running uses pnpm. The quick start clones or checks out the code, then runs pnpm install. Configuration begins by copying .env.example to .env and filling in four secrets: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, AUTH_SECRET, and WIDGET_JWT_SECRET. The database is prepared with pnpm db:migrate, and an optional pnpm db:seed loads demo data. Running pnpm dev also builds the widget and generates the Prisma client, then serves the app at http://localhost:3000 where signing in with Google opens the dashboard.
Embedding comments on a site is a small HTML snippet. The host page includes a div with data-open-remark, a data-site-key, and a data-slug that identifies the post, followed by an async script tag pointing at embed.js on the operator's domain. The site key comes from Dashboard then Sites then Install. The README links framework specific guides for Astro, Hugo, and Next.js, so the generic snippet is adapted per generator. This embedding model means the comment thread lives on the operator's server while the page only ships a tiny script, which keeps the static site static and the dynamic part offloaded to the self hosted backend. The operator controls both the data and the domain that serves embed.js, so moving the system to a new host is a matter of updating that one script URL.
Tech stack and architecture
The tech stack is documented in a table. The framework is Next.js 16 with the App Router. Data lives in PostgreSQL accessed through Prisma, which is both the ORM and the migration tool. Admin authentication uses Auth.js v5 with Google OAuth, while the widget authenticates visitors with a JSON Web Token signed by jose. The user interface is built with shadcn/ui on top of Tailwind v4, and input is validated with Zod. The embeddable widget itself is vanilla TypeScript bundled with esbuild, which keeps the client lightweight compared to shipping the full framework to every reader.
Configuration is driven by environment variables. DATABASE_URL holds the PostgreSQL connection string. AUTH_SECRET is generated with openssl rand, and the two Google values come from an OAuth console. WIDGET_JWT_SECRET signs visitor tokens, and NEXT_PUBLIC_APP_URL is the public URL used inside embed snippets. The README points to docs/architecture.md for system design, request flows, and a scaling path, but does not expand those topics on the front page. The split between a Next.js admin surface and a minimal vanilla widget reflects the two audiences: site owners who need a dashboard, and readers who only need a fast comment box. Keeping the widget dependency free also means the embed script stays small and loads quickly even on a busy article page.
License and maintenance
OpenRemark is published under the MIT license, which the README states explicitly and links to the LICENSE file in the repository. The MIT terms mean the code can be self hosted, modified, and redistributed as long as the copyright notice is kept. A status badge in the README marks the project as beta and the version as 0.6.1, so the license is in place even though the feature set is still settling.
The project is maintained by Zeon Studio, named in the README's footer. That same studio publishes related tooling, and the README includes a Product Hunt badge linking to the OpenRemark product page, which is how the project announces itself to a wider audience. The combination of an MIT license, a self hosting model, and a small documented stack makes the barrier to running your own instance low: clone the repository, set the environment variables, migrate the database, and start the dev server. The README does not promise a hosted commercial tier, and the framing throughout is of a system you operate yourself rather than subscribe to. A version badge of 0.6.1 on the front page is a reminder that the interface may still change before a stable release.
Editorial conclusion
OpenRemark is published under the MIT license and maintained by Zeon Studio at github.com/zeon-studio/open-remark.
Community notes