Site Metadata
Updated Nov 12, 2026
A few top-level fields on livemark.config.ts describe your site to browsers, search engines, and social cards.
Fields
import { defineConfig } from "livemark"
export default defineConfig({
include: "docs/**/*.md",
site: "https://example.com",
title: "My Docs",
description: "Everything you need to build things.",
logo: "/logo.svg",
favicon: "/favicon.ico",
banner: "v2 is out · [Read the release notes](/blog/v2/)",
head: { meta: [{ name: "twitter:site", content: "@me" }] },
})| Field | Type | Default | Where it surfaces |
|---|---|---|---|
site | string | — | Canonical origin used by the sitemap and absolute URLs |
title | string | "Livemark" | <title>, Open Graph og:title, header site title |
description | string | "Markdown site generator" | <meta name="description">, og:description |
logo | string | — | Image shown next to the site title in the header (and as favicon default) |
favicon | string | logo ?? bundled default | Browser tab icon |
banner | string | — | Announcement strip above the header on every page |
head | object | — | Extra meta, links and scripts in every page's <head> |
Sitemap and site
If site is set, Livemark builds a sitemap.xml at the root of your output during livemark build, using site as the absolute origin for every URL. Without site, sitemap generation is skipped.
Logo and favicon
logoandfaviconaccept any URL or root-relative path (/logo.svg). Assets placed in.livemark/public/are served at/…and work well here.- If
faviconis omitted, Livemark falls back tologo, and finally to its bundled mark. - The MIME type is inferred from the extension (
.svg,.png,.ico).
Banner
banner shows a full-width strip above the header on every page; it scrolls away while the header stays pinned. The value is inline Markdown — links, **bold**, _emphasis_ and `code` — so a one-line announcement needs no custom component:
banner: "Livemark is in technical preview · [Share feedback →](https://github.com/datisthq/livemark/discussions)",- Absolute links open in a new tab; root-relative links get your
baseprefix. - Raw HTML tags are dropped. For icons or custom markup, escape
components/Banner.tsxinstead (Overriding/Escaping). - The strip uses the
--bannerand--banner-foregroundcolor tokens.
Per-page tags
Every article page overrides the site defaults with its own <title>, description, og:title, og:description and og:type (article). With site set, it also gets og:url, a <link rel="canonical"> and, from the frontmatter image, an absolute og:image.
Extra head tags
head adds tags to every page, after the defaults. A meta entry with the same name or property as a default replaces it:
export default defineConfig({
head: {
meta: [
{ name: "twitter:card", content: "summary_large_image" },
{ name: "google-site-verification", content: "abc123" },
],
links: [{ rel: "me", href: "https://mastodon.social/@me" }],
scripts: [{ src: "https://example.com/analytics.js", defer: "" }],
},
})To drop or rewrite a default tag, escape head.ts and edit what customizeHead returns:
import type { RootHead } from "livemark"
export function customizeHead(head: RootHead) {
head.meta = head.meta.filter(m => m.property !== "og:site_name")
return head
}See also
- External Links — header/sidebar links that live next to the title.
- Article Sections — structuring the content of the site itself.
Created with ❤ and Livemark