Technical previewShare feedback

Config File

Updated Nov 12, 2026

Livemark is configured by a single file at the root of your project: livemark.config.ts. Drop it next to your package.json, export a defineConfig({...}) call, and Livemark picks it up automatically — no flag, no env var.

Minimal config

Every field is optional. The smallest valid config is just an empty call:

livemark.config.ts
import { defineConfig } from "livemark"

export default defineConfig({})

That picks up every .md file under your project (default include: "**/*.md") and renders it with the standard Livemark theme — sidebar, search, syntax highlighting, dark mode, all defaults.

What you can configure

Every field falls back to a sensible default. The full set:

OptionTypePurpose
includestring | string[]Glob(s) for content files. Default: "**/*.md".
excludestring | string[]Glob(s) to skip (drafts, partials, etc.).
titlestringSite title shown in the header and <title>. Default: "Livemark".
descriptionstringMeta description for SEO/Open Graph. Default: "Markdown site generator".
sitestringCanonical site URL — required for sitemap generation.
basestring | (command) => stringSub-path the site is served under, e.g. on GitHub Pages.
faviconstringPath to a favicon image, relative to project root.
logostringPath to a logo image used in the header (falls back to the bundled Livemark logo).
bannerstringInline Markdown announcement shown in a strip above the header.
head{ meta, links, scripts }Extra <head> tags for every page.
breadcrumbsbooleanShow the trail of folders above each article's title. Default: true.
languagesLanguage[]Translations: one entry per language, the first the default.
codeThemeLightShiki theme nameLight-mode syntax theme. Default: "catppuccin-latte".
codeThemeDarkShiki theme nameDark-mode syntax theme. Default: "catppuccin-mocha".
sectionsSection[]Split content into Docs / Blog / Changelog with their own URL prefixes.
linksLink[]Custom links shown in the header or sidebar.
patchesPatch[]Override a markdown file's frontmatter from config without editing the file.
contentSignalsContentSignalsAI usage preferences published in robots.txt. Default: all true.
skillsstring | string[]Glob(s) for SKILL.md files to publish as agent skills.
plugins{ md, html }Your own Markdown and HTML plugins, added to the article pipeline.
allowDangerousHtmlbooleanKeep raw HTML written in Markdown and allow MDX articles. false drops raw HTML and fails on any MDX article. Default: true.
viteUserConfig | (env) => UserConfigExtra Vite config, merged over Livemark's own.

The full schema lives in livemark/source/models/config.ts — defineConfig validates against it with Zod. Unknown keys are rejected — at the top level and inside sections, links, languages, head, contentSignals and patches — so a typo fails with a clear error at start-up instead of being silently ignored.

title, description and banner take a string or one value per language code.

Worked example

Most real sites end up looking something like this:

livemark.config.ts
import { defineConfig } from "livemark"

export default defineConfig({
  title: "My docs",
  description: "Documentation for my project",
  site: "https://docs.example.com",
  include: ["docs/**/*.md", "blog/**/*.md"],
  exclude: "docs/**/_*",
  sections: [
    { title: "Docs", prefix: "/" },
    { title: "Blog", prefix: "/blog/", type: "blog" },
  ],
  links: [
    {
      url: "https://github.com/example/project",
      title: "GitHub",
      icon: "github",
    },
  ],
})

Where to go next

Created with ❤ and Livemark