# hermes-wiki-static Static HTML wiki generator for Lukas Huber's karpathy-style Obsidian-vault. ## What this is A Python tool that watches `/home/admin/my-karpathy-wiki/` for changes and regenerates static HTML files on disk. A simple HTTP server serves them on loopback port 8765; Tailscale exposes it to the tailnet. ## Why this exists We previously used `DanielCheer/obsidian-web-viewer` (forked as `hermes-wiki-viewer`). It had three blockers: - **No touch support on iOS Safari** — click handlers don't work reliably - **3D-Graph auto-rotates** — prevents node selection via tap - **Fixed 260px Graph column** — wastes horizontal space This tool replaces obv with our own renderer: - **Touch-first design** — bottom-nav on mobile, hamburger-tree, FAB+modal graph - **Static HTML** — each page is a real URL, deep-linkable, PWA-installable - **No auto-rotation** — graph is static, click-to-rotate, click-to-navigate - **Native-feeling** — service worker, pull-to-refresh, swipe-back ## Architecture ``` my-karpathy-wiki/*.md (input) | v [watchdog observer] (auto-regen on .md change) | v generator.py (Python: markdown + frontmatter) | v ~/.local/share/hermes-wiki/site/ (static HTML output) | v python3 http.server (loopback:8765) | v tailscale serve (https://openclaw.wholphin-musical.ts.net/) ``` ## Files - `generator.py` — daemon with watchdog + HTTP server - `requirements.txt` — markdown, pyyaml, watchdog, python-frontmatter ## Run ```bash # Install deps (one-time, system Python) pip install --break-system-packages markdown pyyaml watchdog python-frontmatter # Start daemon python3 generator.py --start # Status / Stop python3 generator.py --status python3 generator.py --stop # One-shot regen (no watcher, no HTTP server) python3 generator.py --once ``` ## Output structure ``` site/ ├── index.html (redirect to first note) ├── concepts/.html (one file per .md) ├── entities/.html ├── ... └── __/ ├── style.css ├── app.js ├── data.js (all metadata inlined for offline) ├── tree.json ├── graph.json ├── tags.json ├── backlinks.json └── manifest.json (PWA) ``` ## WikiLink syntax `[[entity-name]]` or `[[entity-name|display text]]` resolves to a real `` if the target exists, otherwise `` (greyed out). ## Frontmatter ```yaml --- title: My Note type: concept status: stable updated: 2026-07-15 sources: - https://example.com tags: - hermes - architecture --- ``` ## Known limitations (Phase 1) - CSS is placeholder — touch design comes in Phase 2 - JS is placeholder — search/tree/graph render comes in Phase 2 - Bottom-Nav template is there but not styled - 5 YAML files in the wiki have malformed frontmatter (parser warnings) - Graph only shows 27 edges — some WikiLinks not resolving due to those YAML issues