Free Tier Available

Share Your Vibe-Coded Blocks

Generate interactive eLearning components with ChatGPT or Claude, then paste them into Slate. Share with a link, or export to SCORM.

  • AI code blocks included on the free tier
  • Theme-aware, responsive components
  • Ready-made prompt template included

5 free courses Β· AI code blocks included Β· No credit card required

5 free courses

Build up to 5 complete courses at no cost.

AI code blocks

Add interactive components that match your brand.

SCORM 1.2 export

Deploy to any LMS with standard packaging.

Shareable previews

Share your work with a simple link.

How vibe coding works

Generate interactive eLearning components in four steps.

1

Prompt your AI

Copy the Slate prompt template and tell ChatGPT or Claude what you want: a drag-and-drop, a calculator, a timer, a scenario.

2

Copy the HTML output

The AI returns a complete HTML file. Copy the entire response.

3

Paste into Slate

Add a Code Block to your lesson and paste. The component renders instantly.

4

Refine and share

Iterate with the AI until it's perfect, then share your creation with a link or export to SCORM.

The sandbox rules

Slate runs code blocks in a secure sandbox. Here's what your AI needs to know.

Container-based DOM access

Use container.querySelector() instead of document.querySelector(). The sandbox provides a scoped root element.

Classes or data-attributes, not ids

The HTML sanitizer strips ids that match window or document property names (title, name, body, location, and more), so your selectors silently break. Target elements with classes or data-* attributes instead.

No IIFEs or wrappers

Write script content as bare statements. The sandbox handles execution context.

Self-contained code

No external CDNs, fonts, or API calls. Everything must be inline.

Shadowed globals

document, window, fetch, localStorage, and the static methods on Object and Array are unavailable. Use spread, for-in loops, and instance methods instead.

Theme-aware styling

10 CSS variables automatically adapt to light/dark themes and brand colors.

Available CSS variables

Use these variables for automatic theme adaptation:

--primary-colorBrand color
--hover-colorHover state color
--border-radiusRounded corners
--success-colorGreen for success
--error-colorRed for errors
--text-colorMain text (adapts to theme)
--text-mutedSecondary text (adapts to theme)
--bg-lightLightest background (adapts to theme)
--bg-mutedMuted background (adapts to theme)
--border-colorBorders (adapts to theme)

The magic prompt

Copy this template and paste it into ChatGPT or Claude before describing your component.

Slate Code Block Prompt Template
Build a self-contained interactive HTML snippet. Build exactly what I describe at the end β€” do not substitute a quiz, flashcard, flip card, or any other pattern I did not ask for.

REQUIREMENTS:
- Single HTML file with embedded <style> and <script> tags
- No external dependencies (no CDNs, external fonts, or API calls)
- Use transparent background (background: transparent on html/body)
- Vanilla JavaScript only (no frameworks)

JAVASCRIPT SANDBOX:
Your JavaScript runs in a sandbox where 'document' is NOT available. Instead, use 'container' which references your element's root.

Write your <script> content as bare statements (no IIFEs or wrappers):

<script>
const btn = container.querySelector('.my-button');
if (btn) {
  btn.addEventListener('click', handleClick);
}

function handleClick() {
  container.querySelector('.result').textContent = 'Clicked!';
}
</script>

INSTEAD OF β†’ USE:
- document.querySelector() β†’ container.querySelector()
- document.querySelectorAll() β†’ container.querySelectorAll()
- document.getElementById() β†’ container.querySelector('.my-class')
- document.createElement() β†’ cloneNode() from a template, or set .innerHTML on an element
- document.addEventListener() β†’ container.addEventListener()

SCRIPT HOOKS β€” USE CLASSES OR data-* ATTRIBUTES, NEVER IDS:
The player's HTML sanitizer silently strips 'id' values that collide with window or document property names (title, name, body, head, location, cookie, domain, length, constructor, and many more). If you use one of those as an id, your querySelector('#title') will return null at runtime and the interaction will break with no error shown. Use classes or data-* attributes as script hooks instead:

HTML:  <h2 class="detail-title" data-role="title">Item</h2>
JS:    const el = container.querySelector('.detail-title');

BLOCKED GLOBALS (shadowed as undefined in the sandbox):
- document, window, parent, top, self, frames, globalThis
- localStorage, sessionStorage
- fetch, XMLHttpRequest, WebSocket, postMessage
- eval, Function constructor
- Object, Array, Proxy, Reflect β€” do NOT call Object.keys(), Object.assign(), Object.entries(), Array.from(), or Array.isArray(). Array/object LITERALS and instance methods (arr.map(), arr.forEach(), spread {...obj}) work fine; only the named static calls throw.

SAFE ALTERNATIVES to blocked static methods:
- Array.from(nodeList)   β†’ [...nodeList] or nodeList.forEach(...)
- Object.keys(obj)       β†’ for (const key in obj) { ... }
- Object.assign(a, b)    β†’ { ...a, ...b }

AVAILABLE CSS VARIABLES (adapt to light/dark themes):
- var(--primary-color) - brand color
- var(--hover-color) - hover state
- var(--border-radius) - rounded corners
- var(--success-color) - green for success
- var(--error-color) - red for errors
- var(--text-color) - main text (adapts to theme)
- var(--text-muted) - secondary text (adapts to theme)
- var(--bg-light) - lightest background (adapts to theme)
- var(--bg-muted) - muted background (adapts to theme)
- var(--border-color) - borders (adapts to theme)

Start your response with <!DOCTYPE html> - no explanations or markdown.

MY REQUEST:

Tip: After pasting the template, add your specific request on a new line. For example: "Create a drag-and-drop matching activity with 5 terms and definitions."

Built for AI-generated code

Slate's Code Block is designed from the ground up for vibe coding.

Theme inheritance

Code blocks automatically match your course theme. Change your brand, everything updates.

Sandboxed execution

JavaScript runs in isolation. Safe for learners, safe for your LMS.

Instant preview

See your component render as you paste. No build step, no waiting.

AI-ready architecture

The prompt template is designed for ChatGPT, Claude, and other LLMs.

Start sharing your vibes today.

5 free courses. AI code blocks included. No credit card required.

Export to SCORM 1.2 Β· Share with a link Β· Works with any LMS