diff --git a/docs/_config.yml b/docs/_config.yml
new file mode 100644
index 000000000..bb7821eb2
--- /dev/null
+++ b/docs/_config.yml
@@ -0,0 +1,39 @@
+title: "CLAWDIS Docs"
+description: "A WhatsApp + Telegram gateway for AI agents (Pi)."
+markdown: kramdown
+highlighter: rouge
+
+# Keep GitHub Pages' default page URLs (e.g. /gateway.html). Many docs links
+# are written as relative *.md links and are rewritten during the build.
+
+plugins:
+ - jekyll-relative-links
+
+relative_links:
+ enabled: true
+ collections: true
+
+defaults:
+ - scope:
+ path: ""
+ values:
+ layout: default
+
+nav:
+ - title: "Home"
+ url: "/"
+ - title: "Gateway"
+ url: "/gateway.html"
+ - title: "Configuration"
+ url: "/configuration.html"
+ - title: "WebChat"
+ url: "/webchat.html"
+ - title: "Telegram"
+ url: "/telegram.html"
+ - title: "Troubleshooting"
+ url: "/troubleshooting.html"
+
+kramdown:
+ input: GFM
+ hard_wrap: false
+ syntax_highlighter: rouge
diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html
new file mode 100644
index 000000000..c8df29486
--- /dev/null
+++ b/docs/_layouts/default.html
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+ clawd@clawdis:~/docs$
+ {% if page.url == "/" %}cat index.md{% else %}less {{ page.path }}{% endif %}
+
+
+
+ {% if page.summary %}
+
{{ page.summary }}
+ {% endif %}
+
+ {% if page.read_when %}
+
+ Read when…
+
+ {% for hint in page.read_when %}
+ - {{ hint }}
+ {% endfor %}
+
+
+ {% endif %}
+
+
+ {{ content }}
+
+
+
+
+
+
+
diff --git a/docs/assets/markdown.css b/docs/assets/markdown.css
new file mode 100644
index 000000000..3fce8adcc
--- /dev/null
+++ b/docs/assets/markdown.css
@@ -0,0 +1,130 @@
+.markdown {
+ margin-top: 18px;
+ line-height: 1.7;
+}
+
+.markdown h1,
+.markdown h2,
+.markdown h3,
+.markdown h4 {
+ font-family: var(--font-pixel);
+ letter-spacing: 0.04em;
+ line-height: 1.15;
+}
+
+.markdown h1 {
+ font-size: clamp(28px, 4vw, 44px);
+ margin: 26px 0 10px;
+}
+
+.markdown h2 {
+ font-size: 22px;
+ margin: 26px 0 10px;
+}
+
+.markdown h3 {
+ font-size: 18px;
+ margin: 22px 0 8px;
+}
+
+.markdown p {
+ margin: 0 0 14px;
+}
+
+.markdown a {
+ color: var(--link);
+ text-decoration: none;
+ border-bottom: 1px dotted color-mix(in oklab, var(--link) 65%, transparent);
+}
+
+.markdown a:hover {
+ color: var(--link2);
+ border-bottom-color: color-mix(in oklab, var(--link2) 75%, transparent);
+}
+
+.markdown hr {
+ border: 0;
+ height: 1px;
+ background: linear-gradient(
+ 90deg,
+ transparent,
+ color-mix(in oklab, var(--frame-border) 30%, transparent),
+ transparent
+ );
+ margin: 26px 0;
+}
+
+.markdown blockquote {
+ margin: 18px 0;
+ padding: 14px 14px;
+ border-radius: var(--radius-sm);
+ background: color-mix(in oklab, var(--panel) 70%, transparent);
+ border-left: 6px solid color-mix(in oklab, var(--accent) 60%, transparent);
+ color: var(--muted);
+}
+
+.markdown ul,
+.markdown ol {
+ margin: 0 0 14px 22px;
+}
+
+.markdown li {
+ margin: 4px 0;
+}
+
+.markdown img {
+ max-width: 100%;
+ height: auto;
+ border-radius: 12px;
+ border: 1px solid color-mix(in oklab, var(--frame-border) 20%, transparent);
+ box-shadow: 0 12px 0 -8px rgba(0, 0, 0, 0.18);
+}
+
+.markdown code {
+ font-family: var(--font-body);
+ font-size: 0.95em;
+ padding: 0.15em 0.35em;
+ border-radius: 8px;
+ background: color-mix(in oklab, var(--panel) 70%, var(--code-bg));
+ border: 1px solid color-mix(in oklab, var(--frame-border) 18%, transparent);
+}
+
+.markdown pre {
+ background: var(--code-bg);
+ color: var(--code-fg);
+ padding: 14px 14px;
+ border-radius: var(--radius-sm);
+ border: 1px solid color-mix(in oklab, var(--frame-border) 18%, transparent);
+ overflow-x: auto;
+ box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--code-accent) 12%, transparent);
+}
+
+.markdown pre code {
+ background: transparent;
+ border: 0;
+ padding: 0;
+ color: inherit;
+}
+
+.markdown table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 16px 0 22px;
+ border: 1px solid color-mix(in oklab, var(--frame-border) 20%, transparent);
+ border-radius: var(--radius-sm);
+ overflow: hidden;
+}
+
+.markdown th,
+.markdown td {
+ padding: 10px 10px;
+ border-bottom: 1px solid color-mix(in oklab, var(--frame-border) 15%, transparent);
+ vertical-align: top;
+}
+
+.markdown th {
+ background: color-mix(in oklab, var(--panel2) 85%, transparent);
+ font-family: var(--font-pixel);
+ letter-spacing: 0.06em;
+}
+
diff --git a/docs/assets/pixel-lobster.svg b/docs/assets/pixel-lobster.svg
new file mode 100644
index 000000000..7bfb7fc4d
--- /dev/null
+++ b/docs/assets/pixel-lobster.svg
@@ -0,0 +1,60 @@
+