Browsing as a guest. You can post with a name and email, like, and report. Sign in as Maya, Tomas, Priya… to pin, moderate, and see author badges from the other side.

18 questions

Questions.

Free vs Pro, the spam pipeline, Livewire / React / Vue, guests, and licensing. Short answers, then a live thread if you want to poke at it.

The package

What is the difference between Commentify and Commentify Pro?

The MIT package is a comments table in your Laravel app: Livewire threads, nested replies, markdown, likes, reports, guests, and basic Filament moderation.

Commentify Pro layers on top of that package. It does not fork it. Pro adds the JSON API, React and Vue SDKs, the spam pipeline, a Filament moderation queue with spam logs and an audit trail, guest spam rules, media uploads, Disqus/WordPress import, webhooks, Reverb, and GDPR commands.

This demo runs the public Livewire UI so you can try a thread before you buy. The features list marks what is free and what is Pro.

Do I need Pro just to put comments on a Laravel app?

No. composer require usamamuneerchaudhary/commentify, migrate, add the Commentable trait, drop <livewire:comments />. That is enough for a blog, a docs site, or product reviews.

Reach for Pro when you need a headless API, React or Vue with the same UI, or a spam path that is more than hoping a captcha holds. Install notes.

Is this a SaaS widget? Where do the comments live?

Commentify is self-hosted. Comments are rows in your database, on a polymorphic comments table, behind your policies and your Filament panel. There is no iframe, no third-party identity, and no runtime licence server.

Packagist is the free package. Pro authenticates Composer at install time only.

Frontends

How do I install it?

Four steps: require the package, publish config and migrate, add Commentable to a model, drop the Livewire component on the page. The install page is the canonical walkthrough. Full docs live at docs.commentify.pro.

Pro is a second Composer require against a private repo, then php artisan commentify-pro:install. That command asks which frontends you use, which guard the API should use, which spam checkers to enable, and which models may receive comments.

Do Livewire, React, and Vue look the same?

Yes. The class strings live once in @commentify/core. PHPUnit compares them to the Blade views; Vitest compares them to what React and Vue actually emit. Avatars, relative timestamps, the sort dropdown, kebab menu, markdown composer, emoji picker, threaded replies, report form, pagination, and dark mode match.

This demo mounts Livewire for all three so you can read the same thread. The React and Vue components ship inside the Pro Composer package — nothing to install from npm.

Can I bring my own markup?

Pro’s useCommentThread() store is what the built-in React and Vue components run on. Sticky notes, a chat, a review list — your DOM, same API. Writes apply optimistically and roll back on failure. Switch on error.code (spam_rejected, read_only, …), not on the message.

The headless page sits the Livewire thread next to a mock canvas.

Do I need Filament?

No. Filament is optional. The free package can register a Comments resource if you already have a panel. Pro adds a moderation queue, spam log, audit trail, and a couple of widgets.

On this demo, Maya and Aisha can open the admin. Sign in as a persona first.

Spam & moderation

How does the spam filter work?

Every comment — Livewire, API, React, or Vue — hits a pipeline of checkers before it is saved, and again if the body is edited. The worst verdict wins: deny > review > allow.

  • allow — saved as usual (still respects require_approval if that is on).
  • review — saved with is_approved = false, so it stays off the public thread until a moderator publishes it.
  • deny — the save is aborted. The API returns 422 with code: spam_rejected. Nothing is stored as a comment.

The default checker is heuristic and runs locally: blocked terms and domains deny immediately; more links than max_links (default 2) holds for review, more than double that denies; authors with fewer than trusted_after (default 3) approved comments who paste a link are held; identical bodies inside duplicate_window (default 300s) are held. Guests get a tighter net when guests.stricter_spam is on.

Optional Akismet and Google Perspective toxicity sit behind heuristic so obvious junk never spends an HTTP round trip. Non-allow decisions are written to commentify_spam_logs. Filament’s Not spam action re-approves the held comment and, if Akismet is configured, submits it as ham.

Flip the same knobs on the playground. The pipeline itself ships with Pro.

What is the difference between deny, review, and require approval?

They stack.

require_approval is a core Commentify switch: every new comment waits for a human, spam or not. Pending items stay off the frontend.

The Pro pipeline runs before that. Deny never creates a row. Review creates a row already unapproved — the same state as require_approval, but only for comments the checkers flagged (too many links, an untrusted author, Akismet, …).

A trusted commenter with a clean body can still go live immediately when require_approval is off.

Can I write my own spam checker?

Yes. Implement Usamamuneerchaudhary\CommentifyPro\Contracts\SpamChecker and add the class name to commentify-pro.spam.checkers. Checkers run in order; the pipeline stops as soon as something returns deny.

A checker receives a CommentCandidate (body, author, IP, user agent, guest fields) and returns SpamVerdict::allow(), review($reason), or deny($reason).

What happens if Akismet or Perspective is down?

spam.fail_mode decides. The default is allow: an external checker that throws or times out fails open, so comments keep flowing. Set it to review to hold everything for a human when the network blips — only if someone actually works the queue.

Heuristic still runs either way. Put it first in checkers.

Guests & privacy

Can people comment without an account?

Yes. Core Commentify has allow_guests: name plus email, Gravatar optional. Pro mirrors that on the JSON API and applies stricter spam rules to unsigned comments (missing email can deny; any link is held).

Try it on this demo without signing in — recipes are a good surface — or open the playground and leave guest commenting on.

Does Pro phone home or check the licence on every request?

No. The licence key authenticates Composer at install time against the private package repo. There is no licence check in the request path, and your app never contacts a licence server in production.

GDPR tools (commentify:gdpr-export, erase, anonymize-ips) ship with Pro. The labs page runs a read-only export for any demo persona.

Licensing

Can I use Pro on client projects?

Yes. A licence is per-developer-or-organisation, not per-seat. Use it in client work and ship the result to the client. Modify the source for your own use.

You may not redistribute the source — publicly or inside a starter kit others install — or publish it to a public package repository. Bundling Pro into something you resell needs a redistribution licence.

What happens when the licence year ends?

Nothing switches off. You keep every version released during the term, forever. Updates and support stop until you renew.

There are two tiers: a single production site, or unlimited production sites. Local and staging copies are unlimited on both.

What is the refund policy?

Thirty days, no argument, if you have not shipped it to production. Checkout is on Anystack.

Is Statamic included?

No. usamamuneerchaudhary/commentify-statamic is a separate addon and SKU. It uses Pro under the hood and exposes a {{ commentify }} Antlers tag. Core Pro features (API, spam, Filament) stay available to the Laravel app underneath.

Can I import Disqus or WordPress comments?

Pro ships commentify:import-disqus and commentify:import-wordpress. Re-running an import is idempotent via import_source + import_id. Imported authors become guest comments, so allow_guests must be on.

Labs has a Disqus XML preview so you can see the mapping before you point it at a real thread.