diff --git a/apps/docs/astro.config.mjs b/apps/docs/astro.config.mjs
index 5b659351..659adeee 100644
--- a/apps/docs/astro.config.mjs
+++ b/apps/docs/astro.config.mjs
@@ -13,18 +13,15 @@ export default defineConfig({
title: 'chkit Docs',
description: 'Public documentation for chkit, the ClickHouse schema and migration CLI.',
customCss: ['./src/styles/custom.css'],
- ...(isDev && {
- components: {
- Footer: './src/components/Footer.astro',
- },
- }),
+ components: {
+ Header: './src/components/Header.astro',
+ Hero: './src/components/Hero.astro',
+ Footer: './src/components/Footer.astro',
+ SiteTitle: './src/components/SiteTitle.astro',
+ SocialIcons: './src/components/SocialIcons.astro',
+ ThemeSelect: './src/components/ThemeSelect.astro',
+ },
sidebar: [
- {
- label: 'Overview',
- items: [
- { label: 'Introduction', slug: 'index' },
- ],
- },
{
label: 'Getting Started',
items: [
diff --git a/apps/docs/public/fonts/Goldman-Latin-400.woff2 b/apps/docs/public/fonts/Goldman-Latin-400.woff2
new file mode 100644
index 00000000..54f1a402
Binary files /dev/null and b/apps/docs/public/fonts/Goldman-Latin-400.woff2 differ
diff --git a/apps/docs/public/fonts/Goldman-Latin-700.woff2 b/apps/docs/public/fonts/Goldman-Latin-700.woff2
new file mode 100644
index 00000000..b8e09f7a
Binary files /dev/null and b/apps/docs/public/fonts/Goldman-Latin-700.woff2 differ
diff --git a/apps/docs/public/fonts/Inter-Variable-Latin.woff2 b/apps/docs/public/fonts/Inter-Variable-Latin.woff2
new file mode 100644
index 00000000..91dc3e85
Binary files /dev/null and b/apps/docs/public/fonts/Inter-Variable-Latin.woff2 differ
diff --git a/apps/docs/public/fonts/Inter-Variable-LatinExt.woff2 b/apps/docs/public/fonts/Inter-Variable-LatinExt.woff2
new file mode 100644
index 00000000..57da6f8d
Binary files /dev/null and b/apps/docs/public/fonts/Inter-Variable-LatinExt.woff2 differ
diff --git a/apps/docs/public/logos/altinity.svg b/apps/docs/public/logos/altinity.svg
new file mode 100644
index 00000000..e96554e3
--- /dev/null
+++ b/apps/docs/public/logos/altinity.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/docs/public/logos/clickhouse.svg b/apps/docs/public/logos/clickhouse.svg
new file mode 100644
index 00000000..80897f10
--- /dev/null
+++ b/apps/docs/public/logos/clickhouse.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/apps/docs/public/logos/obsessiondb-dark.svg b/apps/docs/public/logos/obsessiondb-dark.svg
new file mode 100644
index 00000000..62b77cbe
--- /dev/null
+++ b/apps/docs/public/logos/obsessiondb-dark.svg
@@ -0,0 +1,4 @@
+
diff --git a/apps/docs/public/logos/obsessiondb-light.svg b/apps/docs/public/logos/obsessiondb-light.svg
new file mode 100644
index 00000000..d1cfdfe0
--- /dev/null
+++ b/apps/docs/public/logos/obsessiondb-light.svg
@@ -0,0 +1,4 @@
+
diff --git a/apps/docs/src/assets/chkit-scaffold.png b/apps/docs/src/assets/chkit-scaffold.png
new file mode 100644
index 00000000..e1270f4e
Binary files /dev/null and b/apps/docs/src/assets/chkit-scaffold.png differ
diff --git a/apps/docs/src/components/Footer.astro b/apps/docs/src/components/Footer.astro
index e235a9b4..13159fa5 100644
--- a/apps/docs/src/components/Footer.astro
+++ b/apps/docs/src/components/Footer.astro
@@ -1,8 +1,62 @@
---
+/**
+ * Override of Starlight's Footer.
+ * Renders the default per-page footer (pagination / meta) followed by the
+ * site-wide footer (brand + link columns). The Agentation overlay is
+ * rendered only under `import.meta.env.DEV`, so the production build drops
+ * it (and its react island) via dead-code elimination.
+ */
import Default from '@astrojs/starlight/components/Footer.astro';
import AgentationDev from './AgentationDev';
+
+const repo = 'https://github.com/obsessiondb/chkit';
---
+
+
{import.meta.env.DEV && }
diff --git a/apps/docs/src/components/Header.astro b/apps/docs/src/components/Header.astro
new file mode 100644
index 00000000..90fc0a51
--- /dev/null
+++ b/apps/docs/src/components/Header.astro
@@ -0,0 +1,52 @@
+---
+/**
+ * Override of Starlight's Header.
+ * Renders the default nav, then an ob-db-style breadcrumb subheader that
+ * spans the full width below the nav, above all three content columns.
+ * It is `position: fixed` (see .chk-subheader) so it escapes the nav box;
+ * the columns are offset downward by --chk-subheader-h in custom.css.
+ */
+import Default from '@astrojs/starlight/components/Header.astro';
+
+const { sidebar, entry } = Astro.locals.starlightRoute;
+const title = entry.data.title;
+const isSplash = entry.data.template === 'splash';
+
+type SidebarItem =
+ | { type: 'link'; label: string; isCurrent: boolean }
+ | { type: 'group'; label: string; entries: SidebarItem[] };
+
+function findGroupTrail(entries: SidebarItem[], trail: string[]): string[] | null {
+ for (const item of entries) {
+ if (item.type === 'group') {
+ const found = findGroupTrail(item.entries, [...trail, item.label]);
+ if (found) return found;
+ } else if (item.isCurrent) {
+ return trail;
+ }
+ }
+ return null;
+}
+
+const groups = isSplash ? [] : findGroupTrail(sidebar as SidebarItem[], []) ?? [];
+---
+
+
+
+{
+ !isSplash && (
+
+ )
+}
diff --git a/apps/docs/src/components/Hero.astro b/apps/docs/src/components/Hero.astro
new file mode 100644
index 00000000..210dadf1
--- /dev/null
+++ b/apps/docs/src/components/Hero.astro
@@ -0,0 +1,212 @@
+---
+/**
+ * Override of Starlight's Hero (splash landing only).
+ * Same structure + frontmatter contract as the default Hero (title,
+ * tagline, image, actions), with a Drizzle-style "BACKED BY ObsessionDB"
+ * credit line under the copy. Visual styling lives in custom.css.
+ */
+import { Image } from 'astro:assets';
+import { LinkButton } from '@astrojs/starlight/components';
+
+const PAGE_TITLE_ID = '_top';
+
+const { data } = Astro.locals.starlightRoute.entry;
+const { title = data.title, tagline, image, actions = [] } = data.hero || {};
+
+const imageAttrs = {
+ loading: 'eager' as const,
+ decoding: 'async' as const,
+ width: 400,
+ height: 400,
+ alt: image?.alt || '',
+};
+
+let darkImage: ImageMetadata | undefined;
+let lightImage: ImageMetadata | undefined;
+let rawHtml: string | undefined;
+if (image) {
+ if ('file' in image) {
+ darkImage = image.file;
+ } else if ('dark' in image) {
+ darkImage = image.dark;
+ lightImage = image.light;
+ } else {
+ rawHtml = image.html;
+ }
+}
+---
+
+
+ {
+ darkImage && (
+
+ )
+ }
+ {lightImage &&
}
+ {rawHtml &&
}
+
+
+ {
+ actions.length > 0 && (
+
+
What you will find here
+
+ {actions.map(
+ ({ attrs: { class: className, ...attrs } = {}, icon, link: href, text, variant }) => (
+
+ {text}
+ {icon?.html && }
+
+ )
+ )}
+
+
+ )
+ }
+
+
+
+
diff --git a/apps/docs/src/components/SiteTitle.astro b/apps/docs/src/components/SiteTitle.astro
new file mode 100644
index 00000000..c1d93097
--- /dev/null
+++ b/apps/docs/src/components/SiteTitle.astro
@@ -0,0 +1,50 @@
+---
+/**
+ * Override of Starlight's SiteTitle.
+ * Renders the brand wordmark "chkit" (dropping the "Docs" suffix from the
+ * configured site title) in the Goldman display face. Styling — font and
+ * neutral (non-accent) colour — lives in custom.css (.chk-wordmark).
+ */
+const { siteTitleHref, entry } = Astro.locals.starlightRoute;
+const isSplash = entry.data.template === 'splash';
+---
+
+
+ ch-kit
+ {!isSplash && Docs}
+
+
+
+
+{
+ /* Splash pages have no Starlight sidebar/hamburger, so the collapsed nav
+ above has no mobile affordance. Provide one (no-JS menu).
+ Doc pages keep Starlight's own menu button. */
+ isSplash && (
+
+ )
+}
+
+
diff --git a/apps/docs/src/components/SocialIcons.astro b/apps/docs/src/components/SocialIcons.astro
new file mode 100644
index 00000000..4f644087
--- /dev/null
+++ b/apps/docs/src/components/SocialIcons.astro
@@ -0,0 +1,65 @@
+---
+/**
+ * Override of Starlight's SocialIcons.
+ * Renders any configured social links, then a GitHub "stars" badge.
+ * The star count is filled client-side from the GitHub API and
+ * degrades gracefully to a "Star" label if the request fails.
+ */
+import config from 'virtual:starlight/user-config';
+import { Icon } from '@astrojs/starlight/components';
+
+const links = config.social || [];
+const repo = 'obsessiondb/chkit';
+---
+
+{
+ links.map(({ label, href, icon }) => (
+
+ {label}
+
+
+ ))
+}
+
+
+
+
+ Star
+
+
+
+
+
diff --git a/apps/docs/src/components/ThemeSelect.astro b/apps/docs/src/components/ThemeSelect.astro
new file mode 100644
index 00000000..4f2cfbbb
--- /dev/null
+++ b/apps/docs/src/components/ThemeSelect.astro
@@ -0,0 +1,49 @@
+---
+/**
+ * Override of Starlight's ThemeSelect.
+ * Replaces the dark / light / auto