All options are passed to blogTheme() in vite.config.ts.

BlogThemeOptions

OptionTypeDefaultDescription
titlestringSite title. Used in <title>, sidebar brand, OG tags, RSS feed.
descriptionstringSite description. Used for meta + OG.
basestringFully-qualified site URL (e.g. https://example.com). Used to produce absolute RSS links and OG image URLs.
authorAuthorProfileAuthor identity shown in the sidebar.
about{ html: string }Raw HTML block rendered below author info in the sidebar (keep it short — About no longer has a standalone page).
navbarArray<{ title, to }>Nav links rendered below author info. to values are automatically prefixed with SvelteKit's base.
themeColorThemeColorEmber paletteDark-mode palette override.
themeColorLightThemeColorwarm creamLight-mode palette override.
defaultMode'system' | 'dark' | 'light''system'Initial colour mode before user toggles.
postsDirstring'src/posts'Directory scanned for *.md posts.
pageSizenumber12Posts per page on the home listing.
highlighterHighlighterOptionsShiki/Twoslash options.
rss{ enabled, limit, copyright }enabled, 20RSS feed generation. Writes to static/rss.xml.
ogImage{ enabled, fontPath, tagline }enabledPer-post OG image generation via Satori. Skipped when native addons cannot load.
giscusGiscusConfigSet to enable GitHub-discussions-backed comments.
searchreservedDo not configure yet. The current release always uses the built-in Pagefind search.

AuthorProfile

interface AuthorProfile {
  AuthorProfile.name: stringname: string
  AuthorProfile.avatar?: string | undefinedavatar?: string // absolute URL or /-prefixed static/ path
  AuthorProfile.bio?: string | undefinedbio?: string
  
AuthorProfile.socials?: {
    github?: string;
    twitter?: string;
    mastodon?: string;
    bluesky?: string;
    email?: string;
    website?: string;
    rss?: string;
} | undefined
socials
?: {
github?: string | undefinedgithub?: string // username, not URL twitter?: string | undefinedtwitter?: string // username, not URL mastodon?: string | undefinedmastodon?: string // full profile URL bluesky?: string | undefinedbluesky?: string // handle like 'name.bsky.social' email?: string | undefinedemail?: string website?: string | undefinedwebsite?: string // full URL rss?: string | undefinedrss?: string // full URL or /-prefixed path } }
ts

ThemeColor

interface ThemeColor {
  ThemeColor.primary?: string | undefinedprimary?: string // default '#fb923c'
  ThemeColor.secondary?: string | undefinedsecondary?: string // default '#dc2626'
  ThemeColor.bg?: string | undefinedbg?: string // default '#1a0a00'
  ThemeColor.surface?: string | undefinedsurface?: string // default '#2d1200'
}
ts

HighlighterOptions

interface HighlighterOptions {
  HighlighterOptions.themeDark?: string | undefinedthemeDark?: string // Shiki theme, default 'night-owl'
  HighlighterOptions.themeLight?: string | undefinedthemeLight?: string // Shiki theme, default 'vitesse-light'
  HighlighterOptions.languages?: string[] | undefinedlanguages?: string[] // extra languages merged with defaults
  HighlighterOptions.twoslash?: boolean | undefinedtwoslash?: boolean // enable Twoslash TypeScript hover info
}
ts

GiscusConfig

interface GiscusConfig {
  GiscusConfig.repo: `${string}/${string}`repo: `${string}/${string}`
  GiscusConfig.repoId: stringrepoId: string
  GiscusConfig.category: stringcategory: string
  GiscusConfig.categoryId: stringcategoryId: string
  GiscusConfig.mapping?: "number" | "pathname" | "url" | "title" | "og:title" | "specific" | undefinedmapping?: 'pathname' | 'url' | 'title' | 'og:title' | 'specific' | 'number'
  GiscusConfig.reactionsEnabled?: boolean | undefinedreactionsEnabled?: boolean
  GiscusConfig.inputPosition?: "top" | "bottom" | undefinedinputPosition?: 'top' | 'bottom'
  GiscusConfig.lang?: string | undefinedlang?: string
}
ts

Fill in these values from giscus.app. A GiscusComments component is rendered below each post automatically when giscus is set. Theme switching (light/dark) is wired through automatically.

Environment variables

The example site reads two env vars at build time:

VarEffect
BASE_PATHSvelteKit paths.base. Set when deploying under a subpath.
SITE_URLOverrides blogTheme() base. Used for OG/RSS absolute URLs.

The theme itself doesn't read these — they're wired by your svelte.config.js and vite.config.ts.