GitHub

Configuration#

Everything about your site is described by a single KilnSite value. This page uses a custom front-matter title (see the browser tab) to demonstrate the meta feature.

Fields#

Field Type Notes
name String Site title.
url String Canonical site URL (used for sitemap, OpenGraph, hreflang).
author String? Used for meta tags.
description String? Default meta/OpenGraph description.
image String? Default social preview image (content-relative path).
twitterSite String? Handle for the twitter:site tag (e.g. "@brokenhandsio").
repository Repository? name, url, optional editURI for “edit this page” links.
copyright String? Footer notice.
theme Theme .default(…) or .custom(directory:…) — see Theming.
social [SocialLink] Icon + link; shown in the header/footer.
carbonAds CarbonAds? Carbon Ads serve/placement.
extraCSS [String] Extra stylesheets (content-relative).
extraJavaScript [String] Extra scripts.
languages [Language] See Content & Localisation.
markdown MarkdownExtensions Feature toggles + table-of-contents options.
navigation @NavBuilder The nav tree — see Navigation.

A fuller example#

let site = KilnSite(
    name: "My Docs",
    url: "https://docs.example.com",
    description: "Documentation for My Project.",
    repository: .init(
        name: "GitHub",
        url: "https://github.com/me/project",
        editURI: "https://github.com/me/project/edit/main/Content/"
    ),
    theme: .default(palette: .autoLightDark(primary: .black, accent: .blue)),
    social: [.init(icon: .github, link: "https://github.com/me/project")],
    languages: [
        .init(.english, isDefault: true),
        .init(.german, navTranslations: ["Guides": "Anleitungen"]),
    ],
    navigation: {
        Page("Welcome", "index.md")
        Section("Guides") {
            Page("Configuration", "guides/configuration.md")
        }
    }
)

try await Kiln.build(site, contentDirectory: "Content", outputDirectory: "site")

Languages#

Declare each language you support with a LanguageCode — a built-in case like .english or .german, or .custom(code:name:). Exactly one language must be the default; missing translations fall back to it automatically.

languages: [
    .init(.english, isDefault: true),
    .init(.german, navTranslations: ["Guides": "Anleitungen"]),
    .init(.custom(code: "gd", name: "Gàidhlig")),
]

See Content & Localisation for the full story on translations, fallback, and UI strings.

Theme#

theme: .default(
    palette: .autoLightDark(primary: .black, accent: .blue),
    logo: "assets/logo.svg",
    favicon: "assets/logo.svg"
)

Color accepts presets (.black, .blue, .indigo, …) or any CSS string via Color("#2f6feb"). To replace the theme entirely, use .custom(directory:) and see Theming.

Logical paths

Navigation references the default-language file path (guides/configuration.md). Kiln finds the right translation per language for you — you never hard-code locale-suffixed paths.

Edit this page