\n", path, get_title(rel, title_from_name(parts[n]))
}
prev_n = n
diff --git a/kewt.sh b/kewt.sh
index c143c96..9357ce6 100755
--- a/kewt.sh
+++ b/kewt.sh
@@ -75,7 +75,7 @@ DEFAULT_TMPL='
{{TITLE}}
-
+
{{HEAD_EXTRA}}
diff --git a/site/Docs/configuration.md b/site/Docs/configuration.md
deleted file mode 100644
index ed96703..0000000
--- a/site/Docs/configuration.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Configuration
-
-## Dot Files
-
-- `.kewtignore` - files/directories to ignore completely. If the file is empty, the whole directory gets ignored.
-- `.kewthide` - files/directories to hide from navigation but still process. Same empty-file rules as `.kewtignore`.
-- `.kewtpreserve` - files/directories to copy as-is without converting markdown to HTML. Same empty-file rules again.
-
-## Frontmatter
-
-You can set metadata for a page using a `site.conf`-style frontmatter block at the very top of `.md` files:
-
-```conf
----
-title = "Custom Page Title"
-date = "2026-03-23 11:32"
-draft = false
-description = "A short page summary"
----
-```
-- `title` - overrides the page title, post name in index links, and RSS ``.
-- `date` - overrides the post date and time. Supports `YYYY-MM-DD` and `YYYY-MM-DD HH:MM` (or `HH-MM`).
-- `draft` - if `true`, the file is excluded from HTML generation.
-- `description` - page description, used for Open Graph `og:description` meta tag.
-
-## Directory Index Customisation
-
-By default, directories without an `index.md` get an auto-generated index page listing their contents.
-
-If you create your own `index.md` in a directory, you can still include the auto-generated file list by using the `{{LIST}}` placeholder:
-
-```md
-# Blog
-
-This is my blog. The posts are below. The top-most one is the most recent.
-
-{{LIST}}
-```
-The `{{LIST}}` tag will be replaced with the generated list of links to child pages and files, exactly as in case the custom index didn't exist.
-
-## Table of Contents
-
-You can auto-generate a Table of Contents by placing `{{TOC}}` anywhere in your markdown file. It collects all `h2` and `h3` headings and generates an ordered list with anchor links.
-
-## Footnotes
-
-Footnotes use the `[^id]` syntax inline and `[^id]: text` for definitions at the bottom of the file. They are rendered as a numbered `` at the end of the page.
-
-## Definition Lists
-
-Definition lists use the standard syntax:
-
-```md
-Term
-: Definition
-```
-This renders as `
Term
Definition
`. Multiple definitions per term are supported.
-
-## Emoji Shortcodes
-
-Standard GitHub/MkDocs emoji shortcodes like `:smile:`, `:fire:`, `:rocket:` are automatically replaced with their Unicode emoji equivalents. Shortcodes inside code blocks are left as-is.
\ No newline at end of file
diff --git a/site/Docs/index.md b/site/Docs/index.md
deleted file mode 100644
index 576127d..0000000
--- a/site/Docs/index.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Documentation
-
-{{LIST}}
diff --git a/site/Docs/usage.md b/site/docs/configuration.md
similarity index 72%
rename from site/Docs/usage.md
rename to site/docs/configuration.md
index 5424bb3..cf9d678 100644
--- a/site/Docs/usage.md
+++ b/site/docs/configuration.md
@@ -1,23 +1,7 @@
-# Usage
-
-```sh
-kewt --help
-kewt --version
-kewt --new [title]
-kewt --post [title]
-kewt --generate-template [path]
-kewt --update [dir]
-kewt --from --to
-kewt [src] [out]
-kewt --watch
-kewt --serve [port]
-```
-- `--new [title]` creates a new site directory with a default `site.conf`, `template.html`, and `index.md`.
-- `--post [title]` creates a new markdown file in the configured `posts_dir` with the current date/time as the filename and default frontmatter.
-- `--generate-template [path]` writes the default `template.html` to the given path (defaults to `template.html` in the current directory).
-- `--update [dir]` adds any missing keys to `site.conf` and checks `template.html` against the latest default.
-- `--watch` (`-w`) watches for file changes in the source directory and rebuilds automatically.
-- `--serve` (`-s`) starts a local HTTP server (python3 or busybox) in the output directory after building. Use with the port number to specify the port. Composable with `--watch`.
+---
+title = "Configuration"
+---
+# Configuration
## site.conf
@@ -48,6 +32,7 @@ feed_file = "rss.xml"
posts_dir = ""
posts_per_page = 12
custom_admonitions = ""
+cw_hide_url = true
```
- `title` - site title
- `style` - style file name from `./styles` (without `.css`)
@@ -75,3 +60,10 @@ custom_admonitions = ""
- `posts_per_page` - number of posts per page in paginated post indexes (default: 12). Set to 0 to disable pagination.
- `enable_header_links` - turns markdown section headings into clickable anchor links (default: true)
- `custom_admonitions` - comma separated list of custom admonitions
+- `cw_hide_url` - embeds non-breaking JS to replace the URL in the browser bar on content warning pages (default: true)
+
+## Dot Files
+
+- `.kewtignore` - files/directories to ignore completely. If the file is empty, the whole directory gets ignored.
+- `.kewthide` - files/directories to hide from navigation but still process. Same empty-file rules as `.kewtignore`.
+- `.kewtpreserve` - files/directories to copy as-is without converting markdown to HTML. Same empty-file rules again.
\ No newline at end of file
diff --git a/site/Docs/embeds.md b/site/docs/embeds.md
similarity index 96%
rename from site/Docs/embeds.md
rename to site/docs/embeds.md
index e68d734..0a2705d 100644
--- a/site/Docs/embeds.md
+++ b/site/docs/embeds.md
@@ -1,3 +1,6 @@
+---
+title = "Embeds"
+---
# Embeds
- `\![link]`:
diff --git a/site/docs/frontmatter.md b/site/docs/frontmatter.md
new file mode 100644
index 0000000..1115901
--- /dev/null
+++ b/site/docs/frontmatter.md
@@ -0,0 +1,20 @@
+---
+title = "Frontmatter"
+---
+# Frontmatter
+
+You can set metadata for a page using a `site.conf`-style frontmatter block at the very top of `.md` files:
+
+```conf
+---
+title = "Custom Page Title"
+date = "2026-03-23 11:32"
+draft = false
+description = "A short page summary"
+---
+```
+- `title` - overrides the page title, post name in index links, and RSS ``.
+- `date` - overrides the post date and time. Supports `YYYY-MM-DD` and `YYYY-MM-DD HH:MM` (or `HH-MM`).
+- `draft` - if `true`, the file is excluded from HTML generation.
+- `description` - page description, used for Open Graph `og:description` meta tag.
+- `content_warning` - if set, creates an interstitial warning page that the user must click through. If set to `true` uses a generic warning, otherwise uses your string.
diff --git a/site/docs/index.md b/site/docs/index.md
new file mode 100644
index 0000000..5e68b9f
--- /dev/null
+++ b/site/docs/index.md
@@ -0,0 +1,6 @@
+---
+title = "Documentation"
+---
+# Documentation
+
+{{LIST}}
diff --git a/site/Docs/installation.md b/site/docs/installation.md
similarity index 95%
rename from site/Docs/installation.md
rename to site/docs/installation.md
index cecec51..b419092 100644
--- a/site/Docs/installation.md
+++ b/site/docs/installation.md
@@ -1,3 +1,6 @@
+---
+title = "Installation"
+---
# Installation
## Standalone
diff --git a/site/docs/markdown.md b/site/docs/markdown.md
new file mode 100644
index 0000000..4daea21
--- /dev/null
+++ b/site/docs/markdown.md
@@ -0,0 +1,41 @@
+---
+title = "Markdown Extensions"
+---
+# Markdown Extensions
+
+## Directory Index Customisation
+
+By default, directories without an `index.md` get an auto-generated index page listing their contents.
+
+If you create your own `index.md` in a directory, you can still include the auto-generated file list by using the `{{LIST}}` placeholder:
+
+```md
+# Blog
+
+This is my blog. The posts are below. The top-most one is the most recent.
+
+{{LIST}}
+```
+The `{{LIST}}` placeholder is replaced with the autogenerated file list.
+
+## Table of Contents
+
+`{{TOC}}` auto-generates a nested heading list with clickable anchors.
+
+## Footnotes
+
+Full support for `[^id]` footnotes and `[^id]: text` definitions. They render as a numbered `` at the bottom of the page.
+
+## Definition Lists
+
+Definition lists use the standard syntax:
+
+```md
+Term
+: Definition
+```
+This renders as `
Term
Definition
`. Multiple definitions per term are supported.
+
+## Emoji Shortcodes
+
+Standard GitHub/MkDocs emoji shortcodes like `:smile:`, `:fire:`, `:rocket:` are automatically replaced with their Unicode emoji equivalents. Shortcodes inside code blocks are left as-is.
diff --git a/site/docs/templates.md b/site/docs/templates.md
new file mode 100644
index 0000000..b1c8404
--- /dev/null
+++ b/site/docs/templates.md
@@ -0,0 +1,15 @@
+---
+title = "Templates"
+---
+# Templates
+
+When customizing `template.html`, the placeholders available are:
+- `{{CONTENT}}` - the generated content
+- `{{TITLE}}` - the generated title
+- `{{NAV}}` - the generated navigation
+- `{{FOOTER}}` - the configured footer
+- `{{VERSION}}` - the cache-busting string from `versioning = true` (e.g. `?v=12345678`). Safe to use even if versioning is **disabled** (it will be empty).
+- `{{CSS}}` - the configured CSS file path
+- `{{LANG}}` - the configured document language
+- `{{HEAD_EXTRA}}` - meta-tags
+- `{{HEADER_BRAND}}` - header rendering the name and/or logo
diff --git a/site/docs/usage.md b/site/docs/usage.md
new file mode 100644
index 0000000..57f6599
--- /dev/null
+++ b/site/docs/usage.md
@@ -0,0 +1,23 @@
+---
+title = "Usage"
+---
+# Usage
+
+```sh
+kewt --help
+kewt --version
+kewt --new [title]
+kewt --post [title]
+kewt --generate-template [path]
+kewt --update [dir]
+kewt --from --to
+kewt [src] [out]
+kewt --watch
+kewt --serve [port]
+```
+- `--new [title]` creates a new site directory with a default `site.conf`, `template.html`, and `index.md`.
+- `--post [title]` creates a new markdown file in the configured `posts_dir` with the current date/time as the filename and default frontmatter.
+- `--generate-template [path]` writes the default `template.html` to the given path (defaults to `template.html` in the current directory).
+- `--update [dir]` adds any missing keys to `site.conf` and checks `template.html` against the latest default.
+- `--watch` (`-w`) watches for file changes in the source directory and rebuilds automatically.
+- `--serve` (`-s`) starts a local HTTP server (python3 or busybox) in the output directory after building. Use with the port number to specify the port. Composable with `--watch`.
diff --git a/site/Heaven/catgirl.jpg b/site/heaven/catgirl.jpg
similarity index 100%
rename from site/Heaven/catgirl.jpg
rename to site/heaven/catgirl.jpg
diff --git a/site/Heaven/index.md b/site/heaven/index.md
similarity index 92%
rename from site/Heaven/index.md
rename to site/heaven/index.md
index 59a885c..d1c0516 100644
--- a/site/Heaven/index.md
+++ b/site/heaven/index.md
@@ -1,4 +1,5 @@
---
+title = "Heaven"
content_warning = "This page may contain CSS"
---
# Heaven
diff --git a/site/site.conf b/site/site.conf
index a1a683e..dbf5ff1 100644
--- a/site/site.conf
+++ b/site/site.conf
@@ -9,7 +9,7 @@ display_logo = false
display_title = true
logo_as_favicon = false
favicon = "favicon.ico"
-order = "Home, Docs, depths, Heaven"
+order = "Home, docs, depths, heaven"
home_name = "Home"
show_home_in_nav = true
nav_links = ""