diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..06cb502
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+# Pagefind: heruntergeladenes Binary (wird vom Entrypoint installiert)
+site/.pagefind/
+
+# Pagefind: generierter Suchindex (wird beim Container-Start neu erzeugt)
+site/public/pagefind/
+
+# Hugo Cache
+site/resources/
diff --git a/ansible/molecule/default/verify.yml b/ansible/molecule/default/verify.yml
index 69d6331..c99f056 100644
--- a/ansible/molecule/default/verify.yml
+++ b/ansible/molecule/default/verify.yml
@@ -13,6 +13,8 @@
- crt
- site
- site/assets/css
+ - site/assets/js
+ - site/assets/js/search.js
- site/layouts/_default
- site/layouts/partials
- Caddyfile
diff --git a/ansible/tasks.yml b/ansible/tasks.yml
index 991143a..9ac45e0 100644
--- a/ansible/tasks.yml
+++ b/ansible/tasks.yml
@@ -12,6 +12,7 @@
- content
- crt
- site/assets/css
+ - site/assets/js
- site/layouts/_default
- site/layouts/partials
- site/static
@@ -36,6 +37,12 @@
dest: "{{ deploy_path }}/site/assets/css/main.css"
mode: "0644"
+- name: search.js kopieren
+ ansible.builtin.copy:
+ src: "{{ project_root }}/site/assets/js/"
+ dest: "{{ deploy_path }}/site/assets/js/"
+ mode: "0644"
+
- name: Entrypoint kopieren und ausführbar machen
ansible.builtin.copy:
src: "{{ project_root }}/site/entrypoint.sh"
diff --git a/site/assets/css/main.css b/site/assets/css/main.css
index a6283b8..6a7622c 100644
--- a/site/assets/css/main.css
+++ b/site/assets/css/main.css
@@ -73,6 +73,115 @@ header {
}
}
+/* ---- Suche (Pagefind) ---- */
+.search {
+ position: relative;
+ flex: 1 1 auto;
+ max-width: 360px;
+ min-width: 160px;
+
+ input[type="search"] {
+ width: 100%;
+ padding: 0.45rem 0.9rem;
+ font-size: 0.9rem;
+ font-family: inherit;
+ color: var(--text);
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: 999px;
+ outline: none;
+ transition: border-color 0.15s, box-shadow 0.15s;
+
+ &::placeholder { color: var(--muted); }
+
+ &:focus {
+ border-color: var(--accent);
+ box-shadow: 0 0 0 3px color-mix(in oklab, var(--accent) 20%, transparent);
+ }
+
+ &::-webkit-search-cancel-button { cursor: pointer; }
+ }
+}
+
+.search-results {
+ position: absolute;
+ top: calc(100% + 0.5rem);
+ left: 0;
+ right: 0;
+ z-index: 50;
+ max-height: 70vh;
+ overflow-y: auto;
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: var(--radius);
+ padding: 0.5rem;
+ box-shadow: 0 12px 32px oklch(0 0 0 / 0.18);
+
+ &[hidden] { display: none; }
+}
+
+.search-item {
+ display: block;
+ padding: 0.6rem 0.75rem;
+ border-radius: calc(var(--radius) - 2px);
+ text-decoration: none;
+
+ &:hover { background: var(--card-h); }
+}
+
+.search-title {
+ display: block;
+ color: var(--text);
+ font-weight: 600;
+ font-size: 0.9rem;
+}
+
+.search-excerpt {
+ display: block;
+ color: var(--muted);
+ font-size: 0.8rem;
+ margin-top: 0.15rem;
+ line-height: 1.5;
+
+ mark {
+ background: color-mix(in oklab, var(--accent) 30%, transparent);
+ color: var(--text);
+ border-radius: 2px;
+ padding: 0 0.1em;
+ }
+}
+
+.search-sub {
+ list-style: none;
+ margin: 0.25rem 0 0.5rem;
+ padding-left: 0.75rem;
+ border-left: 2px solid var(--border);
+
+ li {
+ margin: 0.15rem 0;
+
+ a {
+ display: block;
+ padding: 0.25rem 0.5rem;
+ border-radius: calc(var(--radius) - 2px);
+ color: var(--muted);
+ font-size: 0.8rem;
+ text-decoration: none;
+
+ &:hover { background: var(--card-h); color: var(--text); }
+ }
+
+ .search-excerpt { font-size: 0.75rem; }
+ }
+}
+
+.search-empty {
+ padding: 0.75rem;
+ color: var(--muted);
+ font-size: 0.85rem;
+ text-align: center;
+}
+
/* ---- Footer ---- */
footer {
margin-top: 3rem;
diff --git a/site/assets/js/search.js b/site/assets/js/search.js
new file mode 100644
index 0000000..ac77002
--- /dev/null
+++ b/site/assets/js/search.js
@@ -0,0 +1,103 @@
+(function () {
+ "use strict";
+
+ const input = document.getElementById("search-input");
+ const results = document.getElementById("search-results");
+ if (!input || !results) return;
+
+ let pagefind = null;
+ let timer = null;
+
+ async function getPagefind() {
+ if (!pagefind) pagefind = await import("/pagefind/pagefind.js");
+ return pagefind;
+ }
+
+ function escapeHtml(str) {
+ const div = document.createElement("div");
+ div.textContent = str;
+ return div.innerHTML;
+ }
+
+ function render(items) {
+ if (!items.length) {
+ results.innerHTML = '
Keine Treffer.
';
+ results.hidden = false;
+ return;
+ }
+ results.innerHTML = items
+ .map((it) => {
+ // excerpt enthält bereits von Pagefind – als HTML rendern
+ const excerpt = it.excerpt
+ ? `${it.excerpt} `
+ : "";
+ const sub = (it.sub_results || [])
+ .slice(0, 3)
+ .map(
+ (s) =>
+ `${escapeHtml(s.title)} ` +
+ (s.excerpt ? `${s.excerpt} ` : "") +
+ ` `
+ )
+ .join("");
+ return (
+ `` +
+ `${escapeHtml(it.title)} ${excerpt} ` +
+ (sub ? `` : "")
+ );
+ })
+ .join("");
+ results.hidden = false;
+ }
+
+ async function doSearch(query) {
+ query = query.trim();
+ if (query.length < 2) {
+ results.hidden = true;
+ results.innerHTML = "";
+ return;
+ }
+ try {
+ const pf = await getPagefind();
+ const search = await pf.search(query);
+ const items = [];
+ for (const res of search.results.slice(0, 8)) {
+ const data = await res.data();
+ items.push({
+ url: data.url,
+ title: (data.meta && data.meta.title) || data.url,
+ excerpt: data.excerpt,
+ sub_results: (data.sub_results || []).map((s) => ({
+ url: s.url,
+ title: s.title,
+ excerpt: s.excerpt,
+ })),
+ });
+ }
+ render(items);
+ } catch (e) {
+ results.innerHTML = 'Suche nicht verfügbar.
';
+ results.hidden = false;
+ }
+ }
+
+ input.addEventListener("input", () => {
+ clearTimeout(timer);
+ timer = setTimeout(() => doSearch(input.value), 150);
+ });
+
+ input.addEventListener("focus", () => {
+ if (input.value.trim().length >= 2) doSearch(input.value);
+ });
+
+ document.addEventListener("click", (e) => {
+ if (!e.target.closest(".search")) results.hidden = true;
+ });
+
+ document.addEventListener("keydown", (e) => {
+ if (e.key === "Escape") {
+ results.hidden = true;
+ input.blur();
+ }
+ });
+})();
diff --git a/site/entrypoint.sh b/site/entrypoint.sh
index e5f93f4..5f86c09 100755
--- a/site/entrypoint.sh
+++ b/site/entrypoint.sh
@@ -1,8 +1,12 @@
#!/bin/sh
# Auto-Frontmatter für Hugo 0.165+
# Fügt fehlenden --- Titel-Block in .md-Dateien ein.
+# Installiert zusätzlich Pagefind und hält den Suchindex im Watch-Modus aktuell.
CONTENT_DIR="/src/content"
+PAGEFIND_DIR="/src/.pagefind"
+PAGEFIND_BIN="$PAGEFIND_DIR/pagefind"
+PAGEFIND_VERSION="v1.5.2"
for md in "$CONTENT_DIR"/*.md; do
[ -f "$md" ] || continue
@@ -29,10 +33,56 @@ for md in "$CONTENT_DIR"/*.md; do
fi
done
-exec hugo server \
+# ── Pagefind installieren (einmalig, persistent via site-Mount) ──
+if [ ! -x "$PAGEFIND_BIN" ]; then
+ echo "[pagefind] installiere ${PAGEFIND_VERSION} ..."
+ mkdir -p "$PAGEFIND_DIR"
+ wget -q -O /tmp/pagefind.tar.gz \
+ "https://github.com/CloudCannon/pagefind/releases/download/${PAGEFIND_VERSION}/pagefind-${PAGEFIND_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
+ && tar -xzf /tmp/pagefind.tar.gz -C "$PAGEFIND_DIR" \
+ && chmod +x "$PAGEFIND_BIN" \
+ && rm -f /tmp/pagefind.tar.gz \
+ && echo "[pagefind] installiert: $("$PAGEFIND_BIN" --version 2>&1 | head -1)"
+fi
+
+# ── Pagefind-Index (neu) bauen ──
+build_pagefind() {
+ if [ -x "$PAGEFIND_BIN" ] && [ -d /src/public ]; then
+ "$PAGEFIND_BIN" --site /src/public --output-subdir pagefind >/dev/null 2>&1 \
+ && echo "[pagefind] Index aktualisiert"
+ fi
+}
+
+# Hugo im Hintergrund starten (Watch-Modus)
+hugo server \
--watch \
--bind=0.0.0.0 \
--port=1313 \
--disableFastRender \
--baseURL=https://localhost:5443/ \
- --renderStaticToDisk
\ No newline at end of file
+ --renderStaticToDisk &
+
+HUGO_PID=$!
+
+# Warten bis der erste Build fertig ist, dann initial indizieren
+i=0
+while [ $i -lt 60 ]; do
+ [ -f /src/public/index.html ] && break
+ sleep 1
+ i=$((i + 1))
+done
+build_pagefind
+
+# ── Watch-Loop: Pagefind neu bauen, wenn sich HTML in public ändert ──
+PAGEFIND_MARKER=/tmp/pagefind.marker
+touch "$PAGEFIND_MARKER"
+while true; do
+ sleep 2
+ if find /src/public -name '*.html' -newer "$PAGEFIND_MARKER" 2>/dev/null | grep -q .; then
+ touch "$PAGEFIND_MARKER"
+ build_pagefind
+ fi
+done &
+
+# Hugo im Vordergrund halten; bei dessen Ende den Container beenden
+wait "$HUGO_PID"
diff --git a/site/layouts/_default/baseof.html b/site/layouts/_default/baseof.html
index 7fb3a67..149f4c1 100644
--- a/site/layouts/_default/baseof.html
+++ b/site/layouts/_default/baseof.html
@@ -4,7 +4,7 @@
{{ partial "header.html" . }}
-
+
{{ block "main" . }}{{ end }}
{{ partial "footer.html" . }}
diff --git a/site/layouts/partials/head.html b/site/layouts/partials/head.html
index 3243548..9a6cf4c 100644
--- a/site/layouts/partials/head.html
+++ b/site/layouts/partials/head.html
@@ -14,6 +14,11 @@
{{ $css := resources.Get "css/main.css" | resources.Minify }}
+
+{{ $js := resources.Get "js/search.js" | resources.Minify | resources.Fingerprint }}
+
+
+
{{ with .OutputFormats.Get "rss" }}
diff --git a/site/layouts/partials/header.html b/site/layouts/partials/header.html
index 71e53f2..bac84b3 100644
--- a/site/layouts/partials/header.html
+++ b/site/layouts/partials/header.html
@@ -1,8 +1,19 @@
\ No newline at end of file
+
diff --git a/site/public/astro-vim-recommendations/index.html b/site/public/astro-vim-recommendations/index.html
index 36075b0..1d6b742 100644
--- a/site/public/astro-vim-recommendations/index.html
+++ b/site/public/astro-vim-recommendations/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/awx_und_rundeck_install/index.html b/site/public/awx_und_rundeck_install/index.html
index 88792a5..0234e45 100644
--- a/site/public/awx_und_rundeck_install/index.html
+++ b/site/public/awx_und_rundeck_install/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/blueray_install_manjaro/index.html b/site/public/blueray_install_manjaro/index.html
index 85c2ad1..ed6a9ea 100644
--- a/site/public/blueray_install_manjaro/index.html
+++ b/site/public/blueray_install_manjaro/index.html
@@ -20,17 +20,34 @@ Benötigte …">
+
+
+
+
+
-
+
+
diff --git a/site/public/calcurse_tastenkürzel/index.html b/site/public/calcurse_tastenkürzel/index.html
index 8df464b..d2b82ab 100644
--- a/site/public/calcurse_tastenkürzel/index.html
+++ b/site/public/calcurse_tastenkürzel/index.html
@@ -20,17 +20,34 @@ Allgemeine …">
+
+
+
+
+
-
+
+
diff --git a/site/public/css/main.min.css b/site/public/css/main.min.css
index 91121bd..c125b3c 100644
--- a/site/public/css/main.min.css
+++ b/site/public/css/main.min.css
@@ -1 +1 @@
-*,*::before,*::after{box-sizing:border-box;margin:0}html{color-scheme:light dark;scroll-behavior:smooth}body{--bg:light-dark(oklch(0.98 0 0), oklch(0.15 0.005 260));--text:light-dark(oklch(0.25 0 0), oklch(0.88 0.005 260));--muted:light-dark(oklch(0.50 0 0), oklch(0.55 0.005 260));--border:light-dark(oklch(0.85 0 0), oklch(0.28 0.005 260));--card:light-dark(oklch(1 0 0), oklch(0.20 0.008 260));--card-h:light-dark(oklch(0.96 0 0), oklch(0.25 0.015 260));--accent:light-dark(oklch(0.52 0.23 260), oklch(0.70 0.22 260));--code-bg:light-dark(oklch(0.94 0.01 260), oklch(0.22 0.015 260));--radius:8px;font-family:system-ui,-apple-system,segoe ui,sans-serif;font-size:1rem;line-height:1.7;text-wrap:pretty;color:var(--text);background:var(--bg);min-height:100dvh;display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr min(800px,95%)1fr;> *{grid-column:2}}header{padding:1.5rem 0;display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:.5rem;border-bottom:1px solid var(--border);margin-bottom:2rem;.logo{font-size:1.25rem;font-weight:700;color:var(--accent);text-decoration:none;&:hover{text-decoration:underline}}nav a{color:var(--muted);font-size:.9rem;text-decoration:none;&:hover{color:var(--text)}}}footer{margin-top:3rem;padding:1.5rem 0;border-top:1px solid var(--border);text-align:center;font-size:.85rem;color:var(--muted);a{color:var(--accent)}}h1,h2,h3,h4,h5,h6{line-height:1.3;color:var(--text);text-wrap:balance}h1{font-size:2rem;margin-bottom:.5rem}h2{font-size:1.5rem;margin:2rem 0 .5rem}h3{font-size:1.2rem;margin:1.5rem 0 .4rem}.subtitle{color:var(--muted);margin-bottom:2rem}a{color:var(--accent);text-underline-offset:3px;text-decoration-thickness:1px;&:hover{text-decoration-thickness:2px}}.content{p, ul, ol, blockquote{margin-bottom:1rem}ul, ol{padding-left:1.5rem}li{margin-bottom:.25rem}blockquote{border-left:3px solid var(--accent);padding:.5rem 1rem;color:var(--muted);background:var(--card);border-radius:0 var(--radius)var(--radius)0;p:last-child{margin-bottom:0}}img{max-width:100%;height:auto;border-radius:var(--radius)}hr{border:none;border-top:1px solid var(--border);margin:2rem 0} :not(pre) > code { background: var(--code-bg); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.9em; } pre { background: var(--code-bg); padding: 1rem 1.25rem; border-radius: var(--radius); overflow-x: auto; margin-bottom: 1.5rem; border: 1px solid var(--border); code { font-size: 0.85rem; background: none; padding: 0; } } table { width: 100%; border-collapse: collapse; margin-bottom: 1.5rem; font-size: 0.9rem; th, td { padding: 0.5rem 0.75rem; border: 1px solid var(--border); text-align: left; } th { background: var(--card); font-weight: 600; } tr:nth-child(even) { background: var(--card); } }}.article-header{margin-bottom:1.5rem;h1{margin-bottom:.25rem}time{color:var(--muted);font-size:.9rem}}details.toc{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:.75rem 1rem;margin-bottom:2rem;font-size:.9rem;summary{cursor:pointer;font-weight:600;user-select:none}nav#TableOfContents > ul{padding-left:1rem;margin-top:.5rem}ul{list-style:none;padding-left:1.25rem;li{margin-bottom:.3rem}}a{text-decoration:none}}.post-grid{container-type:inline-size;display:grid;gap:1.5rem}article.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem 1.5rem;transition:background .15s,border-color .15s;&:hover{background:var(--card-h);border-color:var(--accent)}time{color:var(--muted);font-size:.8rem}h2{font-size:1.15rem;margin-top:.25rem;a{color:var(--text);text-decoration:none;&:hover{color:var(--accent)}}}p{color:var(--muted);font-size:.9rem;margin-top:.5rem}}.tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.5rem}.tag{background:var(--code-bg);color:var(--muted);font-size:.75rem;padding:.15em .6em;border-radius:4px}:root{--chroma-bg:oklch(0.22 0.015 260);--chroma-k:#cba6f7;--chroma-s:#a6e3a1;--chroma-c:#6c7086;--chroma-n:#cdd6f4;--chroma-o:#89b4fa;--chroma-m:#f38ba8}@media(prefers-color-scheme:light){:root{--chroma-bg:oklch(0.94 0.01 260);--chroma-k:#8839ef;--chroma-s:#40a02b;--chroma-c:#9ca0b0;--chroma-n:#4c4f69;--chroma-o:#1e66f5;--chroma-m:#d20f39}}pre.chroma{background:var(--chroma-bg)}pre .k,pre .kd,pre .kn{color:var(--chroma-k)}pre .s,pre .s1,pre .s2{color:var(--chroma-s)}pre .c,pre .c1,pre .cm{color:var(--chroma-c);font-style:italic}pre .n,pre .na,pre .nt{color:var(--chroma-n)}pre .o,pre .p{color:var(--chroma-o)}pre .m,pre .mi{color:var(--chroma-m)}@media(max-width:840px){body{grid-template-columns:1fr;padding:0 1rem;> *{grid-column:1}}}
\ No newline at end of file
+*,*::before,*::after{box-sizing:border-box;margin:0}html{color-scheme:light dark;scroll-behavior:smooth}body{--bg:light-dark(oklch(0.98 0 0), oklch(0.15 0.005 260));--text:light-dark(oklch(0.25 0 0), oklch(0.88 0.005 260));--muted:light-dark(oklch(0.50 0 0), oklch(0.55 0.005 260));--border:light-dark(oklch(0.85 0 0), oklch(0.28 0.005 260));--card:light-dark(oklch(1 0 0), oklch(0.20 0.008 260));--card-h:light-dark(oklch(0.96 0 0), oklch(0.25 0.015 260));--accent:light-dark(oklch(0.52 0.23 260), oklch(0.70 0.22 260));--code-bg:light-dark(oklch(0.94 0.01 260), oklch(0.22 0.015 260));--radius:8px;font-family:system-ui,-apple-system,segoe ui,sans-serif;font-size:1rem;line-height:1.7;text-wrap:pretty;color:var(--text);background:var(--bg);min-height:100dvh;display:grid;grid-template-rows:auto 1fr auto;grid-template-columns:1fr min(800px,95%)1fr;> *{grid-column:2}}header{padding:1.5rem 0;display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:.5rem;border-bottom:1px solid var(--border);margin-bottom:2rem;.logo{font-size:1.25rem;font-weight:700;color:var(--accent);text-decoration:none;&:hover{text-decoration:underline}}nav a{color:var(--muted);font-size:.9rem;text-decoration:none;&:hover{color:var(--text)}}}.search{position:relative;flex:auto;max-width:360px;min-width:160px;input[type=search]{width:100%;padding:.45rem .9rem;font-size:.9rem;font-family:inherit;color:var(--text);background:var(--card);border:1px solid var(--border);border-radius:999px;outline:none;transition:border-color .15s,box-shadow .15s;&::placeholder{color:var(--muted)}&:focus{border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in oklab,var(--accent) 20%,transparent)}&::-webkit-search-cancel-button{cursor:pointer}}}.search-results{position:absolute;top:calc(100% + .5rem);left:0;right:0;z-index:50;max-height:70vh;overflow-y:auto;background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:.5rem;box-shadow:0 12px 32px oklch(0 0 0/.18);&[hidden]{display:none}}.search-item{display:block;padding:.6rem .75rem;border-radius:calc(var(--radius) - 2px);text-decoration:none;&:hover{background:var(--card-h)}}.search-title{display:block;color:var(--text);font-weight:600;font-size:.9rem}.search-excerpt{display:block;color:var(--muted);font-size:.8rem;margin-top:.15rem;line-height:1.5;mark{background:color-mix(in oklab,var(--accent) 30%,transparent);color:var(--text);border-radius:2px;padding:0 .1em}}.search-sub{list-style:none;margin:.25rem 0 .5rem;padding-left:.75rem;border-left:2px solid var(--border);li{margin:.15rem 0;a{display:block;padding:.25rem .5rem;border-radius:calc(var(--radius) - 2px);color:var(--muted);font-size:.8rem;text-decoration:none;&:hover{background:var(--card-h);color:var(--text)}}.search-excerpt{font-size:.75rem}}}.search-empty{padding:.75rem;color:var(--muted);font-size:.85rem;text-align:center}footer{margin-top:3rem;padding:1.5rem 0;border-top:1px solid var(--border);text-align:center;font-size:.85rem;color:var(--muted);a{color:var(--accent)}}h1,h2,h3,h4,h5,h6{line-height:1.3;color:var(--text);text-wrap:balance}h1{font-size:2rem;margin-bottom:.5rem}h2{font-size:1.5rem;margin:2rem 0 .5rem}h3{font-size:1.2rem;margin:1.5rem 0 .4rem}.subtitle{color:var(--muted);margin-bottom:2rem}a{color:var(--accent);text-underline-offset:3px;text-decoration-thickness:1px;&:hover{text-decoration-thickness:2px}}.content{p, ul, ol, blockquote{margin-bottom:1rem}ul, ol{padding-left:1.5rem}li{margin-bottom:.25rem}blockquote{border-left:3px solid var(--accent);padding:.5rem 1rem;color:var(--muted);background:var(--card);border-radius:0 var(--radius)var(--radius)0;p:last-child{margin-bottom:0}}img{max-width:100%;height:auto;border-radius:var(--radius)}hr{border:none;border-top:1px solid var(--border);margin:2rem 0} :not(pre) > code { background: var(--code-bg); padding: 0.15em 0.4em; border-radius: 4px; font-size: 0.9em; } pre { background: var(--code-bg); padding: 1rem 1.25rem; border-radius: var(--radius); overflow-x: auto; margin-bottom: 1.5rem; border: 1px solid var(--border); code { font-size: 0.85rem; background: none; padding: 0; } } table { width: 100%; border-collapse: collapse; margin-bottom: 1.5rem; font-size: 0.9rem; th, td { padding: 0.5rem 0.75rem; border: 1px solid var(--border); text-align: left; } th { background: var(--card); font-weight: 600; } tr:nth-child(even) { background: var(--card); } }}.article-header{margin-bottom:1.5rem;h1{margin-bottom:.25rem}time{color:var(--muted);font-size:.9rem}}details.toc{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:.75rem 1rem;margin-bottom:2rem;font-size:.9rem;summary{cursor:pointer;font-weight:600;user-select:none}nav#TableOfContents > ul{padding-left:1rem;margin-top:.5rem}ul{list-style:none;padding-left:1.25rem;li{margin-bottom:.3rem}}a{text-decoration:none}}.post-grid{container-type:inline-size;display:grid;gap:1.5rem}article.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem 1.5rem;transition:background .15s,border-color .15s;&:hover{background:var(--card-h);border-color:var(--accent)}time{color:var(--muted);font-size:.8rem}h2{font-size:1.15rem;margin-top:.25rem;a{color:var(--text);text-decoration:none;&:hover{color:var(--accent)}}}p{color:var(--muted);font-size:.9rem;margin-top:.5rem}}.tags{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.5rem}.tag{background:var(--code-bg);color:var(--muted);font-size:.75rem;padding:.15em .6em;border-radius:4px}:root{--chroma-bg:oklch(0.22 0.015 260);--chroma-k:#cba6f7;--chroma-s:#a6e3a1;--chroma-c:#6c7086;--chroma-n:#cdd6f4;--chroma-o:#89b4fa;--chroma-m:#f38ba8}@media(prefers-color-scheme:light){:root{--chroma-bg:oklch(0.94 0.01 260);--chroma-k:#8839ef;--chroma-s:#40a02b;--chroma-c:#9ca0b0;--chroma-n:#4c4f69;--chroma-o:#1e66f5;--chroma-m:#d20f39}}pre.chroma{background:var(--chroma-bg)}pre .k,pre .kd,pre .kn{color:var(--chroma-k)}pre .s,pre .s1,pre .s2{color:var(--chroma-s)}pre .c,pre .c1,pre .cm{color:var(--chroma-c);font-style:italic}pre .n,pre .na,pre .nt{color:var(--chroma-n)}pre .o,pre .p{color:var(--chroma-o)}pre .m,pre .mi{color:var(--chroma-m)}@media(max-width:840px){body{grid-template-columns:1fr;padding:0 1rem;> *{grid-column:1}}}
\ No newline at end of file
diff --git a/site/public/index.html b/site/public/index.html
index 605a4b9..43f36b5 100644
--- a/site/public/index.html
+++ b/site/public/index.html
@@ -19,15 +19,32 @@
+
+
+
+
+
-
+
+
Hugo Docker CMS
Markdown-Dateien einfach in content/ ablegen.
diff --git a/site/public/index.xml b/site/public/index.xml
index 43f909a..c7896f3 100644
--- a/site/public/index.xml
+++ b/site/public/index.xml
@@ -6,7 +6,7 @@
Markdown-Dateien einfach in content/ ablegen.
Hugo 0.165.0
de
- Tue, 08 Sep 2026 08:07:00 +0000
+ Thu, 10 Sep 2026 07:28:09 +0000
-
diff --git a/site/public/install_browser/index.html b/site/public/install_browser/index.html
index 0c55f58..f2eec27 100644
--- a/site/public/install_browser/index.html
+++ b/site/public/install_browser/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/js/search.min.868f9708373e89ca72730cc71884718dc463b495c2a72c24a6d6f48e64000709.js b/site/public/js/search.min.868f9708373e89ca72730cc71884718dc463b495c2a72c24a6d6f48e64000709.js
new file mode 100644
index 0000000..11b77c5
--- /dev/null
+++ b/site/public/js/search.min.868f9708373e89ca72730cc71884718dc463b495c2a72c24a6d6f48e64000709.js
@@ -0,0 +1 @@
+(function(){"use strict";const t=document.getElementById("search-input"),e=document.getElementById("search-results");if(!t||!e)return;let n=null,s=null;async function a(){return n||(n=await import("/pagefind/pagefind.js")),n}function o(e){const t=document.createElement("div");return t.textContent=e,t.innerHTML}function r(t){if(!t.length){e.innerHTML='Keine Treffer.
',e.hidden=!1;return}e.innerHTML=t.map(e=>{const n=e.excerpt?`${e.excerpt} `:"",t=(e.sub_results||[]).slice(0,3).map(e=>`${o(e.title)} `+(e.excerpt?`${e.excerpt} `:"")+` `).join("");return``+`${o(e.title)} ${n} `+(t?``:"")}).join(""),e.hidden=!1}async function i(t){if(t=t.trim(),t.length<2){e.hidden=!0,e.innerHTML="";return}try{const n=await a(),s=await n.search(t),e=[];for(const n of s.results.slice(0,8)){const t=await n.data();e.push({url:t.url,title:t.meta&&t.meta.title||t.url,excerpt:t.excerpt,sub_results:(t.sub_results||[]).map(e=>({url:e.url,title:e.title,excerpt:e.excerpt}))})}r(e)}catch{e.innerHTML='Suche nicht verfügbar.
',e.hidden=!1}}t.addEventListener("input",()=>{clearTimeout(s),s=setTimeout(()=>i(t.value),150)}),t.addEventListener("focus",()=>{t.value.trim().length>=2&&i(t.value)}),document.addEventListener("click",t=>{t.target.closest(".search")||(e.hidden=!0)}),document.addEventListener("keydown",n=>{n.key==="Escape"&&(e.hidden=!0,t.blur())})})()
\ No newline at end of file
diff --git a/site/public/lazygit/index.html b/site/public/lazygit/index.html
index 06b67b8..e808cb4 100644
--- a/site/public/lazygit/index.html
+++ b/site/public/lazygit/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/networkconfig_dns/index.html b/site/public/networkconfig_dns/index.html
index 3396808..c60187d 100644
--- a/site/public/networkconfig_dns/index.html
+++ b/site/public/networkconfig_dns/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/stretchen_laufen/index.html b/site/public/stretchen_laufen/index.html
index 465ccfd..2580b0f 100644
--- a/site/public/stretchen_laufen/index.html
+++ b/site/public/stretchen_laufen/index.html
@@ -20,17 +20,34 @@ Zwillingswadenmuskel dehnen S166 Zwillingswadenmuskel dehen S164 Beste Dhenübun
+
+
+
+
+
-
+
+
diff --git a/site/public/string_prefixes/index.html b/site/public/string_prefixes/index.html
index 7937e6d..ae22feb 100644
--- a/site/public/string_prefixes/index.html
+++ b/site/public/string_prefixes/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/system-optimierung/index.html b/site/public/system-optimierung/index.html
index b1b1f8f..b230716 100644
--- a/site/public/system-optimierung/index.html
+++ b/site/public/system-optimierung/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/tags/index.html b/site/public/tags/index.html
index b4107d0..c3084be 100644
--- a/site/public/tags/index.html
+++ b/site/public/tags/index.html
@@ -18,19 +18,36 @@
+
+
+
+
+
-
+
+
Tags
Markdown-Dateien einfach in content/ ablegen.
diff --git a/site/public/tags/index.xml b/site/public/tags/index.xml
index 1d33775..4120b92 100644
--- a/site/public/tags/index.xml
+++ b/site/public/tags/index.xml
@@ -6,7 +6,7 @@
Markdown-Dateien einfach in content/ ablegen.
Hugo 0.165.0
de
- Tue, 08 Sep 2026 08:07:00 +0000
+ Thu, 10 Sep 2026 07:26:03 +0000
diff --git a/site/public/tinydb_vs_sqlite/index.html b/site/public/tinydb_vs_sqlite/index.html
index e5e235f..574433f 100644
--- a/site/public/tinydb_vs_sqlite/index.html
+++ b/site/public/tinydb_vs_sqlite/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/ver_next_einbinden/index.html b/site/public/ver_next_einbinden/index.html
index f0f595c..75b9deb 100644
--- a/site/public/ver_next_einbinden/index.html
+++ b/site/public/ver_next_einbinden/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+
diff --git a/site/public/willkommen/index.html b/site/public/willkommen/index.html
index b6a0df2..0440525 100644
--- a/site/public/willkommen/index.html
+++ b/site/public/willkommen/index.html
@@ -22,17 +22,34 @@ So geht’s # Neue Seite …">
+
+
+
+
+
-
+
+
diff --git a/site/public/yubikey_setup_guide/index.html b/site/public/yubikey_setup_guide/index.html
index cd3e4a8..b3f372c 100644
--- a/site/public/yubikey_setup_guide/index.html
+++ b/site/public/yubikey_setup_guide/index.html
@@ -18,17 +18,34 @@
+
+
+
+
+
-
+
+