Modes

The widget looks the same in all three modes. Storage and authorization do not. Hosted adds no widget method that BYO cannot implement.

Local

Free. createLocalAdapter({ storageKey }) writes JSON to localStorage when storageKey is set. Same-origin tabs use the storage event and a BroadcastChannel named bsw-comments: plus that key. Other profiles and devices do not sync. If saved JSON cannot be parsed, the adapter starts empty and the widget shows: Saved discussions could not be read. Showing an empty in-memory discussion.

Without a token, the actor is user.id and the adapter allows read, create, reply, edit own, delete own, and resolve. It does not allow moderate. That is a browser sandbox, not a production check.

BYO ($9.99)

Live app config is fetched with a publishable key. Discussion text, mention ids, and read markers stay on your backend. Implement CommentsAdapter or pass createByoAdapter(impl). Your routes must load the session, confirm membership on tenantKey + resourceType + resourceId, and ignore a client-supplied author id. The example in examples/comments-nextjs persists to COMMENTS_BYO_DATA_FILE or .data/comments.json.

Live config fetch needs BYO or Hosted. Test keys skip that entitlement check. Bootstrapware does not receive BYO comment bodies and does not send Hosted webhooks for BYO writes.

Hosted ($19.99)

Omit adapter and pass appId plus publishableKey. Bootstrapware stores threads, comments, mention ids, and read state for that workspace and environment. You moderate. Live writes need an active Hosted plan. The error is Hosted Comments storage requires an active Comments Hosted ($19.99) subscription.

Live always requires an author token. Test requires one when the published app sets requireAuthorToken. requireAuthorToken: false does not turn off the live requirement. Mint and renew the token on your server. Details: identity.

Related: BYO vs Hosted guide · Privacy by mode · Environments