Skip to content
Type something to search...
Kivo Theme Documentation

Config Reference

File: src/config/config.toml · Skill level: Beginner

config.toml holds every site-wide setting. It is grouped into tables: a line in [brackets] starts a table, and every key = value line below it belongs to that table until the next one. The file has a comment beside almost every key; this page explains them in one place.

Site Identity

Table: [site]

KeyWhat it does
titleSite name. Used in page titles, the logo’s alt text, and {brand} in the copyright line
descriptionDefault description for search results and social previews
taglineAdded after every page title (“Pricing - your tagline”). A page turns it off with disableTagline: true
taglineSeparatorText between title and tagline. Empty uses " - "
baseUrlYour live address, for example "https://www.acme.dev". Ships as the placeholder "https://example.com", and npm run build warns until you change it. Used for canonical URLs, the sitemap, robots.txt, RSS feeds, llms.txt, and social previews. A SITE_URL environment variable on the build overrides it
logoPath to a logo image. Empty shows the built-in mark
logoTextText next to the logo
logoWidth, logoHeightLogo size, for example "28px"
trailingSlashtrue makes every URL end with / (/pricing/). Restart the dev server after changing it
[site.favicon] imageSource image for npm run generate-favicons. Leave path as it is

Search Engines

Tables: [seo], [seo.robotsTxt], [seo.ai], [seo.sitemap]

KeyWhat it does
authorDefault author meta tag
keywordsDefault keywords for pages without their own keywords
robotsDefault robots meta tag. The shipped value lets search and AI answers quote and preview pages
[seo.robotsTxt] enableBuilds /robots.txt
[seo.robotsTxt] disallowPaths crawlers must skip, for example ["/drafts/"]
[seo.robotsTxt] aiSearchfalse asks the crawlers of AI answer engines (ChatGPT search, Claude, Perplexity, and others) not to fetch your pages, and sets ai-input=no in the Content-Signal line for all crawlers
[seo.robotsTxt] aiTrainingfalse asks crawlers that collect content to train AI models to stay away. This includes Google-Extended, which Google also uses for grounding in Gemini apps. Also sets ai-train=no in the Content-Signal line for all crawlers
[seo.ai] llmsTxtBuilds /llms.txt and /llms-full.txt, which some AI tools and coding agents can read
[seo.ai] markdownPagesBuilds a Markdown copy of posts, releases, features, and other pages at <page>.md
[seo.ai] indexNowKeyKey for npm run indexnow. Empty turns IndexNow off
[seo.sitemap] enableBuilds /sitemap-index.xml
[seo.sitemap] excludeFolder names to leave out of the sitemap

Details: SEO & AI Visibility.

General Settings

Table: [settings]

KeyWhat it does
blogFolderFolder name of the blog ("blog"). Changing it also means renaming the content and route folders and the collection in src/content.config.ts
servicesFolderSame, for the feature pages ("services")
blogPaginationPosts per blog list page
paginationItems per page on other paginated lists (changelog)
stickyHeaderKeeps the header pinned while scrolling
docsUrlBase URL of your documentation site. Relative links on the /docs/ page are resolved against it
contactFormActionWhere the contact form sends messages. See Forms
contactFormProvider"formsubmit.co", "formspree", or "netlify"
footerDescriptionFooter description. Empty uses footer.description from src/i18n/<language>.json

Table: [settings.layout]

KeyValuesWhat it does
headerdefault · simple · centeredHeader layout for every page
footerdefault · minimal · largeFooter layout for every page
footerWordmarkinteractive · staticThe large brand name in the default footer: animated dots or plain text

A page can pick its own with headerLayout and footerLayout in its frontmatter. Details: Header and Footer.

Table: [settings.search]

KeyWhat it does
enableShows the search button and the ⌘K / Ctrl+K search modal
excludePath prefixes to leave out of the index, for example ["/legal/"]

Smooth Scroll

Table: [settings.smoothScroll]

Smooth scrolling powered by Lenis. enable turns it on or off; respectReducedMotion switches it off for visitors who ask for less motion; duration (higher feels slower) and easing (expo, linear, easeOutQuad, easeOutCubic) set the feel. Leave the other keys as they are unless you know Lenis.

Animations

Table: [settings.animation]

KeyWhat it does
enableFade-in animations as sections scroll into view
respectReducedMotionShows content without animation for visitors who ask for less motion
duration, distance, easingHow long, how far, and with which curve content moves in
rootMargin, thresholdHow early an element starts animating

Table: [settings.cookieConsent]

KeyWhat it does
enableShows the cookie banner and holds consent-gated scripts until visitors choose
revisionRaise it by 1 when your cookie use changes, to ask every visitor again

Details: Cookies & Analytics.

Table: [settings.pageActions]

KeyWhat it does
enableThe Copy page menu on posts, releases, roles, integrations, and customer stories
footerThe footer row with “Ask AI about this page”, the Markdown copy, and llms.txt links
providersAssistants offered in “Ask”: any of "chatgpt", "claude", "perplexity", "grok". [] hides them

Demo Layout Switcher

Table: [settings.layoutSwitcher]

enable = false is the default. true shows the floating Change layout button on the homepages, a demo feature for comparing section layouts. Keep it false on your production site: the pages then render only the layouts set in your content files, with no extra markup or script.

The theme’s demo deploys are built with the environment variable PUBLIC_DEMO_MODE=true, which turns the switcher on. Leave PUBLIC_DEMO_MODE unset on your site.

Table: [settings.copyright]

enable shows the copyright line. text overrides footer.copyright from the i18n files; {year} and {brand} are replaced with the year and site.title.

Newsletter

Table: [settings.subscription]

KeyWhat it does
enableTurns every newsletter form on or off
title, noteOverride subscription.title and subscription.note from the i18n files
formActionYour Mailchimp form URL. See Forms
mailchimpTagValueOptional Mailchimp tag added to new subscribers

Languages

Table: [settings.multilingual]

KeyWhat it does
enablefalse builds only the default language
defaultLanguageLanguage served without a prefix ("en")
disableLanguagesLanguages to skip, for example ["fr"]
showDefaultLangInUrltrue adds the prefix to the default language too (/en/pricing/)

Details: Internationalization.

Contact Details

Table: [settings.contactInfo]

phone, email, address, and officeHours used by the contact sections. phone and email are Markdown links, so you can write "[[email protected]](mailto:[email protected])".

Tables: [settings.navigationButton], [settings.navigationSecondaryLink]

The button at the right of the header (“Get started”) and the text link before it (“Log in”). Each has enable, label, and url. An empty label uses navigation.buttonLabel or navigation.secondaryLabel from the i18n files.

Code Blocks And Tables Of Contents

Tables: [settings.markup.codeBlocks], [settings.markup.tableOfContents]

KeyWhat it does
[settings.markup.codeBlocks] themeauto follows light/dark mode; dark keeps code blocks dark in both
[settings.markup.tableOfContents]enable, startLevel, endLevel, ordered, and expanded for the “On this page” list on posts, legal pages, and guide feature pages

Social Previews

Table: [opengraph]

KeyWhat it does
imageShared preview image, used when a page has no image
generateImagestrue draws a 1200×630 preview card for every page without an image at build time
themelight or dark palette for the generated cards
ogLocale, ogTypeOpen Graph locale and type
twitter, twitterCardX (Twitter) handle and card type

Custom Head Scripts

Table: [head]

content is pasted into the <head> of every page. Use it for analytics, verification tags, or extra stylesheets. With the cookie banner on, mark tracking scripts so they wait for consent: see Cookies & Analytics.