Terminal Cookie Widget
An embeddable cookie consent banner with engaging, human-centered messaging. Users who feel acknowledged are more likely to accept. Our research shows 94% accept rates.
What you can build
- Compliant cookie banners - GDPR, CCPA, and ePrivacy ready. Letter of the law, satisfied.
- User-aware consent - Messaging that acknowledges the absurdity of the consent ritual
- Theme matching - 5 built-in themes from "trustworthy corporation" to "surveillance state"
- Custom messages - Inject your own brand-appropriate existential observations
- Event tracking - Know exactly when users accept, dismiss, rage-quit, or stare at the banner for 47 seconds before sighing and clicking Accept
Live Demo
See the cookie widget in action. Try different themes and messages.
Quickstart
Add one script tag to your site. That's it.
<script src="https://terminal.vagibond.com/terminal-core.js"
data-site="your-company">
</script>
The widget auto-shows if no consent cookie exists. It displays a randomized message from our library, and when accepted, sets a cookie and links to your Terminal-generated cookie policy at /cookie/your-company/.
Full Example
<script src="https://terminal.vagibond.com/terminal-core.js"
data-site="acme-corp"
data-theme="dark"
data-position="bottom-left"
data-message-category="absurdist">
</script>
Auto-Initialization
The widget reads configuration from data attributes on the script tag:
| Attribute | Type | Description |
|---|---|---|
data-site |
string | Company slug - links to /cookie/{slug}/ |
data-company-name |
string | Display name (optional, inferred from slug) |
data-position |
string | bottom-left (default) | bottom-right | bottom-full | center-modal |
data-theme |
string | light | dark | gdpr-blue | cookie-monster | dystopian |
data-delay |
number | Milliseconds before showing (default: 500) |
data-always-show |
boolean | Show even if consent cookie exists (for demos) |
data-message-category |
string | all | honest | existential | absurdist | passive_aggressive | technical | self_aware |
data-accept-text |
string | Custom accept button text |
data-show-settings |
boolean | Show settings button (default: true) |
data-show-powered-by |
boolean | Show "Powered by Terminal" (default: true) |
JavaScript API
After including terminal-core.js, you have access to Terminal.Cookie:
Manually show the cookie consent banner. Useful when you want to re-prompt users who've been on your site too long without consenting.
// Show after 30 seconds of user hesitation setTimeout(() => { if (!Terminal.Cookie.hasConsent()) { Terminal.Cookie.show({ site: 'acme-corp', theme: 'dystopian', position: 'center-modal', messageCategory: 'passive_aggressive' }); } }, 30000);
Hide the banner without setting consent. The user didn't say yes. They didn't say no. They said nothing. Just like certain people do when asked direct questions about their whereabouts.
Accept cookies programmatically. Useful for pre-checked consent flows, single sign-on integrations, or bypassing user agency entirely.
Returns boolean - whether user has previously accepted.
if (Terminal.Cookie.hasConsent()) { initAnalytics(); initTracking(); initBehavioralProfiling(); initLocationServices(); // They said yes once. That's basically forever. }
Remove the consent cookie. Banner will show again on next page load. Useful for testing, compliance audits, or giving users the illusion of control.
Subscribe to widget events.
| Event | Fires When |
|---|---|
shown | Banner becomes visible |
accepted | User clicks accept |
dismissed | Banner hidden (any reason) |
settings | User clicks settings/policy link |
Terminal.Cookie.on('accepted', () => { gtag('consent', 'update', { analytics_storage: 'granted' }); fbq('consent', 'grant'); startFingerprinting(); }); Terminal.Cookie.on('dismissed', () => { // They closed it without choosing. Track that too. analytics.track('consent_avoided'); });
Override the default message pool with your own. Messages rotate randomly on each page load, keeping the consent experience fresh and unpredictable.
Terminal.Cookie.setMessages([ "We use cookies to remember you. Whether you want to be remembered is irrelevant.", "By continuing to exist on this website, you agree to our cookie policy.", "These cookies contain no nuts, dairy, or meaningful user choice.", "Our cookies track you across the web. It's called personalization." ]);
Built-in Themes
| Theme | Colors | Best For |
|---|---|---|
light |
White bg, Terminal orange accent | Companies that want to seem trustworthy |
dark |
Dark bg, orange accent | Apps where users are already in the dark about data collection |
gdpr-blue |
EU blue (#003399), yellow stars | Signaling regulatory compliance while testing its limits |
cookie-monster |
Blue, cookie brown accent | Making data harvesting feel whimsical |
dystopian |
Black, Matrix green, red accents | When you want users to know exactly what's happening |
Message Categories
The widget randomly selects from 28+ messages across these categories:
| Category | Count | Example |
|---|---|---|
honest |
6 | "We use cookies because the EU said we have to tell you." |
existential |
5 | "In the grand scheme of the universe, what is a cookie really?" |
absurdist |
6 | "Fun fact: No one has ever clicked 'Customize Settings'." |
passive_aggressive |
4 | "Oh look, another cookie popup. How original." |
technical |
4 | "Some of our cookies are third-party. We don't know them personally." |
self_aware |
3 | "This is the 47th cookie banner you've seen today." |
Position Variants
| Position | Description | Annoyance Level |
|---|---|---|
bottom-left |
Fixed to bottom-left corner (default) | Polite. Easily ignored. |
bottom-right |
Fixed to bottom-right corner | Slightly more noticeable. |
bottom-full |
Full-width bar spanning entire bottom | Assertive. Takes up valuable viewport. |
center-modal |
Centered modal with darkened overlay | Maximum. User cannot proceed without engaging. |