# Config Reference

## Config Reference

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

`config.toml` holds the site-wide settings. Every key has a comment in the file; this page groups them by task. Save the file and `npm run dev` picks up the change (restart it after changing `trailingSlash` or `[settings.multilingual]`).

<Aside type="tip">
  Many labels are empty on purpose (`label = ""`). Empty means "use the
  translated text from `src/i18n/en.json` or `fr.json`". Fill them in only if
  your site has one language.
</Aside>

### `[site]`: Identity
| Key                | What it does                                                                 |
| ------------------ | ---------------------------------------------------------------------------- |
| `title`            | Site name. Used in titles, structured data, and `{brand}` in the copyright   |
| `description`      | Default meta description for pages without their own                         |
| `tagline`          | Added after page titles ("Pricing - Task management for remote teams") unless a page sets `disableTagline: true`. A translated value in `site.tagline` of `src/i18n/<lang>.json` wins |
| `taglineSeparator` | Text between title and tagline. Empty uses `" - "`                           |
| `baseUrl`          | Your live address. Ships as `https://example.com`; set it before you deploy  |
| `logo`             | Path to your logo image. Empty draws the built-in mark                       |
| `logoDark`         | Logo image for the dark footer, for example a white version. Empty uses `logo` there too |
| `logoText`         | Text next to the logo. `""` hides it                                         |
| `logoWidth`, `logoHeight` | Logo size, for example `"32px"`                                      |
| `trailingSlash`    | `true` builds URLs that end in `/` (`/contact/`). Restart the dev server after changing it |
| `[site.favicon] image` | Source image for `npm run generate-favicons`. Leave `path` as it is      |

Details: [Site Identity & Logo](/taskly/customization/site-identity-logo/).

### `[seo]`: Search Engines And AI
| Key                          | What it does                                                    |
| ---------------------------- | --------------------------------------------------------------- |
| `author`                     | Default author meta tag                                         |
| `keywords`                   | Default keywords for pages without their own                    |
| `robots`                     | Default robots meta tag for every page                          |
| `[seo.robotsTxt] enable`     | Builds `/robots.txt`                                            |
| `[seo.robotsTxt] disallow`   | Paths crawlers should skip                                      |
| `[seo.robotsTxt] aiSearch`   | `false` blocks AI search and answer engines                     |
| `[seo.robotsTxt] aiTraining` | `false` opts out of AI training crawlers only                   |
| `[seo.ai] llmsTxt`           | Builds `/llms.txt` and `/llms-full.txt`                         |
| `[seo.ai] markdownPages`     | Builds a Markdown copy of posts, releases, integrations, and other pages at `<page>.md` |
| `[seo.ai] indexNowKey`       | Key for `npm run indexnow`. Empty turns it off                  |
| `[seo.sitemap] enable`       | Builds the sitemap                                              |
| `[seo.sitemap] exclude`      | Folder names to leave out of the sitemap                        |

Details: [SEO & AI Visibility](/taskly/customization/seo-ai-visibility/).

### `[settings]`: Lists And Forms
| Key                   | What it does                                                    |
| --------------------- | --------------------------------------------------------------- |
| `blogFolder`          | Folder of the blog collection (`blog`). Changing it means renaming folders too, as the comment says |
| `blogPagination`      | Posts per blog list page                                        |
| `pagination`          | Items per page on other paginated lists (the changelog)         |
| `contactFormAction`   | Where the contact and demo request forms send messages, unless a form sets its own `form.action` |
| `contactFormProvider` | `formsubmit.co`, `formspree`, or `netlify`                      |
| `footerDescription`   | Footer text. Empty uses `footer.description` from the i18n files |

Details: [Forms](/taskly/customization/forms/).

### Switches For Site-Wide Features
| Table                               | What it controls                                            | Page |
| ----------------------------------- | ----------------------------------------------------------- | ---- |
| `[settings.search]`                 | The header search button and the ⌘K window; `exclude` leaves paths out | [Search](/taskly/customization/search/) |
| `[settings.smoothScroll]`           | Smooth scrolling (Lenis): speed, easing, reduced motion      | [Animations](/taskly/customization/animations/) |
| `[settings.animation]`              | Scroll-in animations: duration, distance, easing             | [Animations](/taskly/customization/animations/) |
| `[settings.cookieConsent]`          | The cookie banner and `revision` (ask everyone again)       | [Cookies & Analytics](/taskly/customization/cookies-analytics/) |
| `[settings.announcementBar]`        | The dark strip above the header                              | [Header](/taskly/customization/header/) |
| `[settings.pageActions]`            | The "Copy page" menu and the footer AI row, with `providers` | [SEO & AI Visibility](/taskly/customization/seo-ai-visibility/) |
| `[settings.copyright]`              | The copyright line in the footer                             | [Footer](/taskly/customization/footer/) |
| `[settings.subscription]`           | The newsletter forms (footer and `/status/`) and their Mailchimp `formAction` | [Forms](/taskly/customization/forms/) |
| `[settings.multilingual]`           | Languages on or off, default language, URL prefix            | [Internationalization](/taskly/customization/internationalization/) |
| `[settings.navigationButton]`       | The button on the right of the header                        | [Header](/taskly/customization/header/) |
| `[settings.navigationSecondaryLink]`| The "Log in" text link before it                             | [Header](/taskly/customization/header/) |
| `[settings.markup.codeBlocks]`      | Code block colors: `auto` or `dark`                          | [Writing Content](/taskly/customization/writing-content/) |
| `[settings.markup.tableOfContents]` | The "On this page" card on text pages (legal)              | [Writing Content](/taskly/customization/writing-content/) |
| `[settings.layoutSwitcher]`         | Demo only. Has no effect in your builds (see below)          | — |

### `[opengraph]`: Social Previews
| Key              | What it does                                                         |
| ---------------- | -------------------------------------------------------------------- |
| `image`          | Shared preview image for pages without their own `image`             |
| `generateImages` | Draws a 1200×630 card for every page without an `image` during the build |
| `theme`          | `light` or `dark` palette for those cards and `npm run generate-og-image` |
| `ogLocale`, `ogType` | Open Graph locale and type                                       |
| `twitter`, `twitterCard` | Your X (Twitter) handle and card type                        |

### `[head]`: Scripts And Meta Tags
`content` is HTML added to the `<head>` of every page: analytics, verification meta tags, extra stylesheets. With the cookie banner on, gate analytics tags on consent. See [Cookies & Analytics](/taskly/customization/cookies-analytics/).

<Aside type="note" title="The layout switcher is a demo feature">
  `[settings.layoutSwitcher]` controls the floating "Change layout" pill of the
  theme's own live demo. It only appears in a build with the environment
  variable `PUBLIC_DEMO_MODE=true`, which is reserved for the theme author's
  demo deploys. Leave `PUBLIC_DEMO_MODE` unset (it adds "Buy now" links), and
  your site renders only the layouts chosen in your content files, whatever
  `enable` says. To compare layouts, use the `/elements/` gallery instead.
</Aside>