livecodes/configuration

SkillDev tools

Configure playground behavior through Config object, query parameters, EmbedOptions, editor settings, processors, external resources, and custom settings. Load this skill when setting up project content, configuring CSS processors, or customizing display.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the livecodes/configuration skill

What this skill tells your AI

The instructions your AI receives, as published by live-codes/livecodes in .agents/skills/livecodes/configuration/SKILL.md and read by ahel’s review.

LiveCodes uses configuration objects to define project content and behavior. Config can be passed to createPlayground or set via URL parameters.

Setup

import { createPlayground } from 'livecodes';

// Full config object
createPlayground('#container', {
  config: {
    title: 'My Project',
    markup: { language: 'html', content: '<h1>Hello</h1>' },
    style: { language: 'css', content: 'h1 { color: blue; }' },
    script: { language: 'javascript', content: 'console.log("hi")' },
    activeEditor: 'script',
  },
});

// Query params (simpler syntax)
createPlayground('#container', {
  params: {
    html: '<h1>Hello</h1>',
    css: 'h1 { color: blue; }',
    js: 'console.log("hi")',
    console: 'open',
  },
});

Core Patterns

Configure each editor

const config = {
  markup: {
    language: 'markdown',
    content: '# Title\n\nParagraph',
    contentUrl: 'https://example.com/content.md', // Alternative to content
  },
  style: {
    language: 'scss',
    content: '$color: blue; h1 { color: $color; }',
  },
  script: {
    language: 'typescript',
    content: 'const x: number = 1;',
    hiddenContent: 'export function helper() {}', // Hidden but evaluated
  },
};

Enable CSS processors

const config = {
  style: { language: 'css', content: '...' },
  processors: ['tailwindcss', 'autoprefixer'], // Processors run in order
};

Add external resources

const config = {
  stylesheets: ['https://cdn.jsdelivr.net/npm/tailwindcss@3/dist/tailwind.min.css'],
  scripts: ['https://cdn.jsdelivr.net/npm/lodash@4/lodash.min.js'],
};

Configure tests

const config = {
  tests: {
    language: 'typescript',
    content: `
      import { sum } from './script';
      test('sums numbers', () => {
        expect(sum(1, 2)).toBe(3);
      });
    `,
  },
};

Set display mode

const config = {
  mode: 'simple', // 'full' | 'focus' | 'simple' | 'lite' | 'editor' | 'codeblock' | 'result'
  view: 'result', // 'split' | 'editor' | 'result'
  readonly: true, // Read-only mode
};

Configure editor settings

const config = {
  editor: 'monaco', // 'monaco' | 'codemirror' | 'codejar' | 'auto'
  theme: 'dark', // 'light' | 'dark'
  editorTheme: 'vs-dark', // See themes in docs
  fontFamily: 'Fira Code',
  fontSize: 14,
  useTabs: false,
  tabSize: 2,
  lineNumbers: true,
  wordWrap: false,
  emmet: true,
  editorMode: 'vim', // 'vim' | 'emacs' | undefined
};

Add custom imports

const config = {
  imports: {
    'my-lib': 'https://my-cdn.com/lib.js',
    'my-lib/submodule': 'https://my-cdn.com/sub.js',
  },
};

Use URL query parameters

URL: https://livecodes.io/?js=console.log("Hello")&console=open&theme=light

// Equivalent in createPlayground
createPlayground('#container', {
  params: {
    js: 'console.log("Hello")',
    console: 'open',
    theme: 'light',
  },
});

Hidden content for embedded playgrounds

const config = {
  script: {
    language: 'javascript',
    content: 'export function myFunc() { return 42; }',
    hiddenContent: '// Hidden helper\nfunction helper() { return 1; }',
  },
  tests: {
    language: 'javascript',
    content: "import { myFunc } from './script';\ntest('works', () => expect(myFunc()).toBe(42))",
  },
};

Common Mistakes

HIGH Confusing Config with EmbedOptions

Wrong:

createPlayground('#container', {
  config: {
    appUrl: 'https://my-server.com', // Wrong: appUrl belongs in EmbedOptions
    template: 'react', // Wrong: template belongs in EmbedOptions
  },
});

Correct:

createPlayground('#container', {
  // EmbedOptions (SDK-level settings)
  appUrl: 'https://my-server.com',
  template: 'react',
  loading: 'lazy',
  headless: false,

  // Config (Project content)
  config: {
    title: 'My Project',
    markup: { language: 'html', content: '<h1>Hello</h1>' },
    style: { language: 'css', content: '...' },
    script: { language: 'javascript', content: '...' },
  },
});

EmbedOptions controls how the playground is embedded (appUrl, template, loading, headless). Config controls the project content (languages, code, processors).

Source: docs/docs/sdk/js-ts.mdx — EmbedOptions section

MEDIUM Params overriding config unexpectedly

Wrong:

createPlayground('#container', {
  config: {
    markup: { language: 'html', content: '<h1>A</h1>' },
  },
  params: {
    html: '<h1>B</h1>', // This overrides config.markup!
  },
});

Correct:

// Use one source or understand precedence:
// params > config > import > template

createPlayground('#container', {
  params: {
    html: '<h1>B</h1>',
  },
  // No config needed for simple cases
});

// Or use config only
createPlayground('#container', {
  config: {
    markup: { language: 'html', content: '<h1>A</h1>' },
  },
});

When both config and params are provided, params takes precedence. Use one or the other for clarity.

Source: docs/docs/sdk/js-ts.mdx — Multiple Sources section

MEDIUM Using incorrect language name

Wrong:

const config = {
  script: { language: 'react.js', content: '...' }, // Invalid
};

Correct:

// Use language name, extension, or alias
const config = {
  script: { language: 'react', content: '...' }, // Language name
  // or
  script: { language: 'jsx', content: '...' }, // Extension
  // or
  script: { language: 'react-jsx', content: '...' }, // Alias
};

Language names must match supported values. See languages reference for all options.

Source: src/sdk/models.ts — Language type

Config Reference

Project Content

PropertyTypeDefaultDescription
titlestring"Untitled Project"Project title, used as result page title
descriptionstring""Project description, used in search
headstring"<meta charset...>"Custom content for <head> element
htmlAttrsstring | object'lang="en" class=""'Attributes for <html> element
tagsstring[][]Project tags for filtering/search
activeEditor"markup" | "style" | "script""markup"Which editor is visible
languagesLanguage[]all languagesEnabled languages in editor dropdown

Editor Content (markup, style, script, tests)

Each editor config object supports:

PropertyTypeDefaultDescription
languageLanguage(varies by editor)Language name, extension, or alias
contentstring""Initial code content
contentUrlstringURL to load content from
hiddenContentstringHidden code (evaluated but not visible)
hiddenContentUrlstringURL to load hidden content
foldedLinesArray<{from, to}>Lines to fold on load
titlestringOverride editor title
hideTitlebooleanHide editor title
ordernumber0Editor order in UI
selectorstringCSS selector for DOM import
position{lineNumber, column?}Initial cursor position

External Resources

PropertyTypeDefaultDescription
stylesheetsstring[][]URLs for external CSS
scriptsstring[][]URLs for external JS
cssPreset"" | "normalize.css" | "reset-css"""CSS preset to apply
processorsProcessor[][]CSS processors (tailwindcss, autoprefixer, etc.)

Module Resolution

PropertyTypeDefaultDescription
importsRecord<string, string>{}Custom import map for module resolution
typesRecord<string, string | object>{}Custom TypeScript type declarations

App Settings

PropertyTypeDefaultDescription
readonlybooleanfalseRead-only mode
allowLangChangebooleantrueAllow changing editor language
view"split" | "editor" | "result""split"Default view
mode"full" | "focus" | "simple" | "lite" | "editor" | "codeblock" | "result""full"Display mode
toolsobject{enabled: "all", active: "", status: ""}Tools pane config
zoom1 | 0.5 | 0.251Result page zoom level

User Settings

PropertyTypeDefaultDescription
autoupdatebooleantrueAuto-run result on code change
autosavebooleanfalseAuto-save on code change
autotestbooleanfalseAuto-run tests on code change
delaynumber1500Delay before autoupdate/autosave (ms)
formatOnsavebooleanfalseFormat code on save
layout"horizontal" | "vertical" | "responsive""responsive"Editor layout
theme"light" | "dark""dark"App theme
themeColorstring"hsl(214, 40%, 50%)"App theme color
editorThemestring | string[]Editor themes (see docs)
appLanguagestringUI language code (e.g., "ar", "zh-CN")
recoverUnsavedbooleantrueEnable recovery of unsaved project
welcomebooleantrueShow welcome screen
showSpacingbooleanfalseShow element spacing in result

Editor Settings

PropertyTypeDefaultDescription
editor"monaco" | "codemirror" | "codejar" | "auto"Code editor to use
fontFamilystringEditor font family
fontSizenumber14 (full) / 12 (embed)Editor font size
useTabsbooleanfalseUse tabs instead of spaces
tabSizenumber2Spaces per indent level
lineNumbersboolean | "relative"trueShow line numbers
wordWrapbooleanfalseEnable word wrap
closeBracketsbooleantrueAuto-close brackets/quotes
foldRegionsbooleanfalseFold #region blocks on load
minimapbooleanfalseShow minimap (Monaco)
emmetbooleantrueEnable Emmet
editorMode"vim" | "emacs"Editor key bindings
semicolonsbooleantrueUse semicolons in formatting
singleQuotebooleantrueUse single quotes in formatting
trailingCommabooleantrueUse trailing commas in formatting

EmbedOptions Reference

PropertyTypeDefaultDescription
appUrlstring"https://livecodes.io/"URL to self-hosted LiveCodes
configConfig | string{}Project config or URL to config JSON
templatestringStarter template name
importstringURL to import code from
paramsobject{}URL query parameters
loading"eager" | "lazy" | "click""lazy"When to load playground
headlessbooleanfalseRun without UI

Query Parameters

Many config options can be set via URL parameters:

https://livecodes.io/?template=react&theme=light&console=open
ParamConfig Equivalent
templateEmbedOptions.template
xEmbedOptions.import
filesFiles to import (comma-separated)
rawImport URL as raw language
activeactiveEditor
modemode
themetheme
consoletools.status
no-defaultsSkip default template

Boolean params: ?lite, ?autoupdate=false Array params: ?processors=tailwindcss,autoprefixer Custom settings: ?customSettings.template.prerender=false

Signals

GitHub stars
1k
Forks
266
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
livecodes-configuration
Source
github.com/live-codes/livecodes