toa://toacomments
Headless kommentarer for statiske nettsteder.
Oversikt
comments er brikken statiske nettsteder ikke kan bygge selv, og fullfører samlingen av backendtjenester for små nettsteder i toa://, ved siden av blog og contact. Lim en Web Component inn på en side, og du har moderert diskusjon med personvernet i behold over et rent REST-API: AI tar seg av spam og ufinheter, og du modererer fra et panel per nettsted. Bygget multi-tenant med row-level security i Postgres som resten av suiten, og med åpen kildekode fra dag én.
Funksjoner
Web Component du limer inn
Legg til <toa-comments> og én script-tag på et hvilket som helst statisk nettsted (Astro, Hugo, Nuxt). Isolert i Shadow DOM, og styles med CSS-variabler.
Moderering med AI
DeepSeek vurderer hver kommentar for spam og ufinheter — de rene publiseres med én gang, de tvilsomme legges i kø, og et regelsett tar over hvis modellen er nede.
Personvernet først
Ingen informasjonskapsler, ingen sporing fra tredjepart. E-postadresser hashes og vises aldri, IP-adresser hashes og slettes automatisk, og avatarene genereres — GDPR-ryddig fra bunnen av.
Tett mot spam
Cloudflare Turnstile, ratebegrensning per nettsted, honeypot og blokkeringsliste — flere lag med forsvar, slik at en offentlig widget aldri trenger å bære på en hemmelig nøkkel.
Multi-tenant
Én tjeneste, mange nettsteder. Row-level security i Postgres holder hvert nettsted for seg, og modereringsflaten er egen per nettsted.
Headless, med admin
Åpent REST-API hvis du vil rendre kommentarene selv, et modereringspanel i Nuxt (single sign-on via toa://auth), og en ferdig kodesnutt til innliming.
Nytt i denne
- added Multi-tenant headless comments backend: per-site RLS (PostgreSQL), SHA-256 API keys,
toacomments_approle. - added Public read API (
GET /api/public/v1/sites/{slug}/threads/{page_key}/comments): approved, depth-1 threaded, paginated, newest/oldest sort. - added Comment submission (
POST /api/public/v1/sites/{slug}/comments): Cloudflare Turnstile verification, per-IP rate limiting, honeypot, link/length caps, per-site blocklist. - added DeepSeek AI moderation gate on submit: spam/toxicity/quality scores decide
published/pending/rejected. Rule-based fallback when AI is unavailable. - added Token-based edit/delete window (15 min) — no account required.
- added Generated identicon avatars (SVG data-URI); no Gravatar, no third-party calls.
- added Hashed email storage (
author_email_hash, SHA-256); emails are never stored or returned in cleartext. - added IP hashing for rate-limit and abuse tracking only.
- added Admin API (
/api/admin/v1): moderation queue (approve/reject/delete, bulk), per-site settings, API key CRUD, thread browser — Authentik JWT-gated. - added
<toa-comments>Web Component (Shadow DOM, ~7.6 kB gzipped): embeddable on any static site (Astro, Hugo, Nuxt, plain HTML). Themeable via--toac-*CSS custom properties. - added Nuxt 4 admin panel: moderation queue, site settings, API keys, embed-snippet generator — toa:// console design, Authentik OIDC.
- added Owner review-notify: opt-in email alert when a comment lands as
pending(notify_on_pending+notify_emailper site). Fire-and-forget via aiosmtplib + FastAPI BackgroundTasks; never blocks submission. - added Docker Compose stack: PostgreSQL 17-alpine, FastAPI backend, Nuxt frontend, Traefik labels for
comments.toaweb.com. - added MIT license, self-host quickstart README,
cliff.tomlfor git-cliff changelog generation.
API