Chiky is a lightweight, content-driven static site generator built on top of SvelteKit. It is designed for small product sites, documentation sites, and multilingual static websites where Markdown content is the source of truth.
The project provides a reusable Svelte package (chiky) plus a docs site that
acts as the reference implementation.
content/{lang}/..
├── packages/
│ └── chiky/ # Reusable Svelte package
└── sites/
└── docs/ # Reference docs site built with chiky
.nvmrcInstall dependencies:
pnpm install
Run the docs site:
pnpm --filter docs dev
Build the package and docs site:
pnpm build
Run checks:
pnpm check
Run tests:
pnpm test
Install the package in your SvelteKit site:
pnpm add chiky
Create a root config.ts:
import type { AppConfig } from 'chiky';
const config: AppConfig = {
site: {
name: 'My Site',
logoUrl: '/img/logo.svg',
copyright: 'My Company'
},
i18n: {
defaultLang: 'en',
supported: ['en', 'es']
},
nav: {
header: {
show: true,
items: {
en: [{ name: 'Home', href: '/en' }],
es: [{ name: 'Inicio', href: '/es' }]
}
},
footer: {
show: true,
items: {
en: [],
es: []
}
}
}
};
export default config;
Initialize and re-export config helpers from src/lib/config.ts:
import rawConfig from '../../config';
import { initConfig } from 'chiky/config';
initConfig(rawConfig, { validate: true });
export * from 'chiky/config';
Load content from src/lib/content.ts:
import { createContent } from 'chiky/content';
const modules = import.meta.glob('/content/**/*.md', { eager: true });
export const {
contents,
index,
validateIndex,
getContent,
getTranslatedSlug,
getHreflangAlternates,
contentRoutes
} = createContent(modules);
Use the provided components in your layout:
<script lang="ts">
import { Header, Footer } from 'chiky/components';
import { showFooter } from '$lib/config';
import { getTranslatedSlug } from '$lib/content';
let { children } = $props();
</script>
<Header {getTranslatedSlug} />
<main>
{@render children?.()}
</main>
{#if showFooter()}
<Footer />
{/if}
Content files live in content/{lang}/{slug}.md.
---
id: home
title: Welcome
---
Hello world.
The id field is the canonical content identifier. Use the same id across
languages to connect translations:
content/en/about.md # id: about
content/es/acerca.md # id: about
Routes are generated from the language and slug:
content/en/about.md -> /en/about
content/es/acerca.md -> /es/acerca
content/en/index.md -> /en
Chiky exposes focused entry points:
chikychiky/configchiky/contentchiky/componentschiky/navigationchiky/vitechiky/svelte-configchiky/typesThe sites/docs project is the canonical working example. It shows:
import.meta.globMIT — see LICENSE.