Skip to main content
Introducing packages.sweber.dev
Documentation menuWithout React

Without React

Use the core engine with any stack, or build your own UI.

@permitojs/core contains the whole consent logic without any UI.

import { activateBlockedElements, createConsentManager } from "@permitojs/core";

const manager = createConsentManager({
  consentVersion: "2026-10",
  categories: [{ id: "necessary", required: true }, { id: "statistics" }, { id: "marketing" }],
});

// Activate <script type="text/plain" data-consent-…> and <iframe data-consent-src> markup.
activateBlockedElements(manager);

if (manager.getSnapshot().needsConsent) {
  showMyBanner({
    onAccept: () => manager.acceptAll("banner"),
    onReject: () => manager.rejectAll("banner"),
  });
}

manager.on("consent_updated", ({ state }) => console.log("New decision", state));

manager.subscribe(listener) and manager.getSnapshot() follow the external store contract, so the manager also plugs into Vue, Svelte or Solid stores.