diff --git a/legacy_docs/CNAME b/site/CNAME
similarity index 100%
rename from legacy_docs/CNAME
rename to site/CNAME
diff --git a/site/assets/yggdrasil.ico b/site/assets/yggdrasil.ico
new file mode 100644
index 0000000..6c33aea
Binary files /dev/null and b/site/assets/yggdrasil.ico differ
diff --git a/site/assets/yggdrasil.svg b/site/assets/yggdrasil.svg
new file mode 100644
index 0000000..e94266f
--- /dev/null
+++ b/site/assets/yggdrasil.svg
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/site/calepin.toml b/site/calepin.toml
index 80c3fcb..15a4265 100644
--- a/site/calepin.toml
+++ b/site/calepin.toml
@@ -3,80 +3,89 @@ description = "Personal knowledge base."
base-url = "https://yggdrasil.kb28.ch"
theme = "calepin"
pdf = false
+minify = true
+search = "pagefind"
+logo = "assets/yggdrasil.svg"
+favicon = "assets/yggdrasil.ico"
+
+[robots]
+enabled = false
+
+[pages]
+include = ["tags.typ"]
+exclude = ["drafts/**"]
[static]
-include = ["assets/**"]
+include = [
+ "assets/**",
+ "CNAME"
+]
+exclude = ["drafts/**"]
-[[menus.main]]
-target = "home/index.typ"
-label = "Home"
+[menus]
+main = [
+ { label = "Home", target = "home/index.typ" },
+ { label = "IT", target = "it/index.typ" },
+ { label = "OT", target = "ot/index.typ" },
+ { label = "Security", target = "security/index.typ" },
+ { label = "Medias", target = "medias/index.typ" },
+]
+social = [
+ { label = "{icon:simple-icons:gitea}", target = "https://git.kb28.ch/Klagarge/Yggdrasil", aria-label = "Gitea" },
+]
-[[menus.main]]
-target = "it/index.typ"
-label = "IT"
-[[menus.main]]
-target = "ot/index.typ"
-label = "OT"
-
-[[menus.main]]
-target = "security/index.typ"
-label = "Security"
-
-[[menus.main]]
-target = "medias/index.typ"
-label = "Medias"
+[footer]
+item = [
+ { label = "© 2026" },
+ { label = "@Klagarge", target = "https://git.kb28.ch/Klagarge" },
+ { label = "@Fastium", target = "https://github.com/Fastium" },
+]
[sidebar]
fold = true
[[sidebar.section]]
title = "Home"
+item = [
+ { target = "home/index.typ" },
+ { glob = "home/*" }
+]
- [[sidebar.section.item]]
- target = "home/index.typ"
-
- [[sidebar.section.item]]
- target = "home/cooking.typ"
-
- [[sidebar.section.item]]
- target = "home/washing-clothes.typ"
-
- [[sidebar.section.item]]
- target = "home/gardening.typ"
[[sidebar.section]]
title = "IT"
-
- [[sidebar.section.item]]
- target = "it/index.typ"
+item = [
+ { target = "it/index.typ" },
+ { glob = "it/*" }
+]
[[sidebar.section]]
title = "OT"
-
- [[sidebar.section.item]]
- target = "ot/index.typ"
+item = [
+ { target = "ot/index.typ" },
+ { glob = "ot/*" }
+]
[[sidebar.section]]
title = "Security"
-
- [[sidebar.section.item]]
- target = "security/index.typ"
-
- [[sidebar.section.item]]
- target = "security/ssh.typ"
+item = [
+ { target = "security/index.typ" },
+ { glob = "security/*" }
+]
[[sidebar.section]]
title = "Medias"
-
- [[sidebar.section.item]]
- target = "medias/index.typ"
-
- [[sidebar.section.item]]
- target = "medias/films.typ"
-
- [[sidebar.section.item]]
- target = "medias/series.typ"
-
- [[sidebar.section.item]]
- target = "medias/books.typ"
+target = "medias/index.typ"
+item = [
+ # { glob = "medias/films/*.typ" },
+ # { glob = "medias/series/*.typ" },
+ # { glob = "medias/books/*.typ" },
+ { target = "medias/index.typ" },
+ { glob = "medias/*.typ" },
+]
+section = [
+ { title = "Films", item = [{ glob = "medias/films/*.typ" }] },
+ { title = "Series", item = [{ glob = "medias/series/*.typ" }] },
+ { title = "Books", item = [{ glob = "medias/books/*.typ" }] },
+]
diff --git a/site/medias/books.typ b/site/medias/books.typ
deleted file mode 100644
index 0b798e5..0000000
--- a/site/medias/books.typ
+++ /dev/null
@@ -1,6 +0,0 @@
-#set document(title: [Books])
-#metadata((title: "Books", translation_key: "medias-books"))
-
-#title()
-
-Placeholder page — the real content comes later.
diff --git a/site/medias/books/le_grand_cahier.typ b/site/medias/books/le_grand_cahier.typ
new file mode 100644
index 0000000..82dd99f
--- /dev/null
+++ b/site/medias/books/le_grand_cahier.typ
@@ -0,0 +1,11 @@
+#set document(title: [Le Grand Cahier])
+#metadata((
+ translation_key: "le_grand_cahier",
+ date: "2026-10-10",
+ author: "Rémi Heredero",
+ pdf: true
+))
+
+#title()
+
+This book is awesome!
diff --git a/site/medias/films.typ b/site/medias/films.typ
deleted file mode 100644
index a124b6d..0000000
--- a/site/medias/films.typ
+++ /dev/null
@@ -1,6 +0,0 @@
-#set document(title: [Films])
-#metadata((title: "Films", translation_key: "medias-films"))
-
-#title()
-
-Placeholder page — the real content comes later.
diff --git a/site/medias/films/h2g2.typ b/site/medias/films/h2g2.typ
new file mode 100644
index 0000000..1d5e06d
--- /dev/null
+++ b/site/medias/films/h2g2.typ
@@ -0,0 +1,10 @@
+#set document(title: [H2G2])
+#metadata((
+ translation_key: "h2g2",
+ date: "2026-10-10",
+ author: "Rémi Heredero",
+ pdf: true
+))
+
+#title()
+One of my favourites films!
diff --git a/site/medias/index.typ b/site/medias/index.typ
index 29f2c7c..7a28e38 100644
--- a/site/medias/index.typ
+++ b/site/medias/index.typ
@@ -1,7 +1,43 @@
#set document(title: [Medias])
-#metadata((title: "Overview", translation_key: "medias-index"))
+#metadata((
+ title: "Overview",
+ translation_key: "medias-overview",
+ date: "2026-10-10",
+ tags: ("medias", "films", "series", "books"),
+ author: "Rémi Heredero",
+ summary: "My very opinionned ideas about somes films, series and books",
+ draft: false,
+ pdf: false
+))
#title()
-Placeholder page for the medias category: films, series, books.
+Placeholder page for the medias category.
The real content comes later.
+
+#import "@preview/calepin:0.1.0" as calepin
+#show: calepin.document
+
+== Films
+#let posts = calepin.pages().filter(p => p.path.starts-with("medias/films/")).filter(p => not p.meta.at("draft", default: false)).sorted(key: p => p.meta.at("date", default: "")).rev()
+
+#for post in posts [
+ - #link(post.href)[#post.title] \
+ #post.meta.at("summary", default: [])
+]
+
+== Series
+#let posts = calepin.pages().filter(p => p.path.starts-with("medias/series/")).filter(p => not p.meta.at("draft", default: false)).sorted(key: p => p.meta.at("date", default: "")).rev()
+
+#for post in posts [
+ - #link(post.href)[#post.title] \
+ #post.meta.at("summary", default: [])
+]
+
+== Books
+#let posts = calepin.pages().filter(p => p.path.starts-with("medias/books/")).filter(p => not p.meta.at("draft", default: false)).sorted(key: p => p.meta.at("date", default: "")).rev()
+
+#for post in posts [
+ - #link(post.href)[#post.title] \
+ #post.meta.at("summary", default: [])
+]
diff --git a/site/medias/plex.typ b/site/medias/plex.typ
new file mode 100644
index 0000000..a21479c
--- /dev/null
+++ b/site/medias/plex.typ
@@ -0,0 +1,12 @@
+#set document(title: [Plex])
+#metadata((
+ translation_key: "plex",
+ date: "2026-10-10",
+ author: "Rémi Heredero",
+ summary: "Plex is a media server",
+ pdf: true
+))
+
+#title()
+
+I think I'll switch to Jellyfin not in so long time
diff --git a/site/medias/series.typ b/site/medias/series.typ
deleted file mode 100644
index e673963..0000000
--- a/site/medias/series.typ
+++ /dev/null
@@ -1,6 +0,0 @@
-#set document(title: [Series])
-#metadata((title: "Series", translation_key: "medias-series"))
-
-#title()
-
-Placeholder page — the real content comes later.
diff --git a/site/medias/series/the_expanse.typ b/site/medias/series/the_expanse.typ
new file mode 100644
index 0000000..140cb33
--- /dev/null
+++ b/site/medias/series/the_expanse.typ
@@ -0,0 +1,17 @@
+#set document(title: [The Expanse])
+#metadata((
+ translation_key: "the_expanse",
+ date: "2026-10-10",
+ author: "Rémi Heredero",
+ summary: " - S01: 9/10
+ - S02: 9/10
+ - S03: 8/10
+ - S04: 8/10
+ - S05: 8/10
+ - S06: 8/10",
+ pdf: true
+))
+
+#title()
+
+I love hard science!
diff --git a/site/tags.typ b/site/tags.typ
new file mode 100644
index 0000000..26d2015
--- /dev/null
+++ b/site/tags.typ
@@ -0,0 +1,23 @@
+#import "/.calepin/calepin.typ" as calepin
+#show: calepin.document
+
+#let taxonomy(field) = {
+ let pages = calepin.pages()
+ .filter(page => page.meta.at(field, default: ()) != ())
+ let terms = pages
+ .map(page => page.meta.at(field))
+ .flatten()
+ .dedup()
+ .sorted(key: term => lower(term))
+
+ for term in terms {
+ heading(term, level: 2)
+ for page in pages.filter(
+ page => term in page.meta.at(field)
+ ) [
+ - #link(page.href)[#page.title]
+ ]
+ }
+}
+
+#taxonomy("tags")