No plugin to install, version, or watch break on the next CMS update. If your platform can render two lines of HTML, Lipwalk runs on it. Here are the exact snippets.
Any static site, any generator, any CMS that lets you paste HTML.
<div id="lipwalk-comments" data-page-id="my-post-42"></div>
<script
src="https://js.lipwalk.com/embed.js"
data-lipwalk-site-key="YOUR_SITE_KEY"
async
></script>Easiest: the official Lipwalk Comments plugin. No account needed: install, press Connect, and comments are live on the free plan; claim your account later to customize. One-click import of your existing comments (and Disqus exports) included. Or paste the snippet manually:
<div
id="lipwalk-comments"
data-page-id="wp-<?php the_ID(); ?>"
></div>
<script
src="https://js.lipwalk.com/embed.js"
data-lipwalk-site-key="YOUR_SITE_KEY"
async
></script>The official TypeScript SDK. No account needed: one env secret plus one route file and the SDK auto-registers your domain on the free plan; claim later to customize. Components render the widgets, and a typed server client reads comments during SSR (site key only, no secret in the browser).
npm install @lipwalk/comments
// app/blog/[slug]/page.tsx
import { LipwalkComments } from "@lipwalk/comments/react";
<LipwalkComments
siteKey={process.env.NEXT_PUBLIC_LIPWALK_SITE_KEY!}
pageId={"post-" + params.slug}
/>
// Server-side (SSR/SEO), public site key only, no secret:
import { createClient } from "@lipwalk/comments";
const { data } = await createClient({ siteKey })
.getComments({ pageId: "post-42" });Drop it in any .astro layout or page. is:inline keeps Astro from bundling the embed.
<div id="lipwalk-comments" data-page-id={Astro.props.slug}></div>
<script
is:inline
src="https://js.lipwalk.com/embed.js"
data-lipwalk-site-key="YOUR_SITE_KEY"
async
></script>Code Injection → Site Footer for the script; the mount goes in your post template (post.hbs).
{{!-- post.hbs --}}
<div id="lipwalk-comments" data-page-id="{{id}}"></div>
{{!-- Settings → Code injection → Site footer --}}
<script
src="https://js.lipwalk.com/embed.js"
data-lipwalk-site-key="YOUR_SITE_KEY"
async
></script>Lipwalk ships an MCP server, @lipwalk/mcp, so AI agents (Claude Code, Claude Desktop, scheduled bots) connect to a site's comments: read what arrived since the last check, pull full thread context and a conversation summary, reply in-thread, and moderate. Agent keys are scoped, rate-limited, and revocable.
claude mcp add lipwalk \
--env LIPWALK_API_KEY=lw_... \
-- npx -y @lipwalk/mcpSame script, two more optional mounts. Each renders only where its element exists.
<!-- Stars near the content being rated -->
<div id="lipwalk-rating" data-page-id="my-post-42"></div>
<!-- Reactions bar (paid plans) -->
<div id="lipwalk-reactions" data-page-id="my-post-42"></div>Two details that matter on every platform: keep data-page-id stable (a CMS post ID beats a URL, so threads survive redesigns and domain moves), and put the script on the page once. The embed fetches comments on load and refreshes after a visitor posts. Everything else is automatic. Full documentation →
Read and write comments, ratings, and moderation state over a REST API with the same data the SDK uses. For push instead of poll, subscribe to webhooks: Slack alerts, analytics pipelines, search reindexing, and your own moderation tooling can react whenever an event fires. Webhooks are available on Growth and up.
Every delivery carries an HMAC-SHA256 signature (X-Lipwalk-Signature), a unique delivery ID, and a timestamp, so you can verify it came from Lipwalk and was not replayed. Failures retry with backoff, and the dashboard shows the status, latency, and response of every attempt.