So ist mein Second Brain aufgesetzt
Dieser Post beschreibt, wie mein Second Brain technisch aufgebaut ist, so dass ein Kollege das Setup versteht und bei Bedarf selbst nachbauen kann. Das Wissen dahinter (warum «kompilieren statt abrufen», was OKF ist) steht im Konzept-Post; wie ich das Ding im Alltag pflege, im Post zu Betrieb & Moderation.
1. 💡 Die Idee in einem Satz
Mein Wissen lebt als Markdown-Dateien in einem privaten Git-Repo. Das Repo ist die einzige Quelle der Wahrheit. Alles andere (Builds, Domains, der Capture vom Handy) sind nur Sichten auf diese Dateien oder Wege, neue Dateien hineinzubekommen.
2. 🗂️ Warum eigene Files in Git statt Obsidian oder Notion
Ich wollte drei Dinge: portabel, vendor-frei, kostenlos.
Portabel. Reines Markdown mit YAML-Frontmatter. Kein proprietäres Format, keine Datenbank, die ich exportieren müsste. Wenn ich morgen das Tooling wechsle, nehme ich die Dateien einfach mit.
Vendor-frei. Git ist der gemeinsame Nenner. Notion oder Obsidian Sync binden mich an einen Anbieter und dessen Format. Hier hängt nichts an einer Firma: Hugo, Git und Cloudflare sind austauschbar, und die Inhalte überleben jeden Wechsel.
Free-Tier. Das gesamte Setup läuft im kostenlosen Bereich: GitHub für das Repo, Cloudflare Pages für die Builds, ein Cloudflare Worker für den Capture. Keine laufenden Kosten.
Dazu kommt der eigentliche Hebel: Weil das Wissen als strukturierte Files vorliegt, kann ein Agent es lesen, ergänzen und pflegen. Das ist mit einer geschlossenen Notiz-App nicht in derselben Tiefe möglich.
3. 🌐 Die drei Domains und ihre Rollen
Aus einem Repo entstehen zwei Cloudflare-Pages-Builds, plus eine kleine PWA für den Capture. Daraus ergeben sich drei Domains mit klar getrennten Rollen.
| Domain | Rolle | Build | Zugang |
|---|---|---|---|
private.onlythoughts.io | Das komplette Brain: alles, was im Repo liegt | hugo --buildDrafts | Hinter Cloudflare Access (Login) |
onlythoughts.io | Nur ausgewählte, freigegebene Beiträge | Allowlist via scripts/stage-public.sh, Output public_public/ | Offen im Netz |
capture.onlythoughts.io | Eingang fürs Handy (Text/Foto) | PWA, registriert als Android-Teilen-Ziel | Secret nur auf dem Gerät |
Der Brain-Build ist meine Arbeitssicht. Er baut alles, inklusive Entwürfen, und liegt komplett hinter einem Login. Hier denke und kuratiere ich.
Der Public-Build ist die Ausnahme, nicht die Regel. Er baut über ein Allowlist-Skript ausschliesslich Beiträge, die ich ausdrücklich freigegeben habe (Default-deny). Was nicht explizit freigeschaltet ist, kann gar nicht erst öffentlich werden.
Der Capture-Pfad ist der Weg hinein (siehe unten).
4. 🔀 Der Publish-Toggle
Ob eine Seite öffentlich erscheint, entscheidet ein einziges Feld im Frontmatter:
Das Prinzip ist Default-deny: Ohne public: true bleibt alles privat. Der Public-Build zieht über die Allowlist nur das, was ausdrücklich freigegeben ist. draft ist davon unabhängig und optional: es regelt nur den Arbeitsstatus, nicht die Veröffentlichung.
Wichtig: Den Toggle setze ich selbst. Ein Agent setzt public: true nie von sich aus.
5. 📥 Der Capture-Pfad: vom Handy ins Repo
Gedanken kommen unterwegs. Damit sie nicht verloren gehen, gibt es einen kurzen Weg vom Handy ins Repo:
- Auf dem Handy teile ich Text oder ein Foto über das Android-Teilen-Menü an das Ziel «Brain» (die PWA unter
capture.onlythoughts.io). - Ein Cloudflare Worker (
brain-capture) nimmt das entgegen und schreibt es roh nachinbox/, als Markdown mit Frontmatterstatus: inbox. Das Secret für diesen Weg liegt nur auf meinem Gerät. - Später verarbeite ich die Inbox in einem strukturierten Lauf. Das ist bewusst ein eigener Schritt und im Post zu Betrieb & Moderation beschrieben.
Der Capture ist also absichtlich «dumm»: schnell reinwerfen, ohne nachzudenken. Die Struktur entsteht erst beim Verarbeiten.
6. 🛠️ So baust du es selbst nach
Auf hohem Niveau, ohne Secrets:
- Repo anlegen. Privates Git-Repo, Hugo mit PaperMod. Inhalte als Leaf Bundles unter
content/posts/<slug>/index.md, Bilder daneben. - Frontmatter-Konvention festlegen. Pflichtfeld
type(OKF-Vokabular), dazutitle,description,timestampund daspublic-Feld als Publish-Gate. - Brain-Build aufsetzen. Cloudflare Pages aus dem Repo, Build
hugo --buildDrafts, davor Cloudflare Access für den Login. Eigene Domain für die private Sicht. - Public-Build aufsetzen. Zweiter Pages-Build aus demselben Repo mit einem Staging-Skript, das nur
public: true-Seiten in ein separates Output-Verzeichnis kopiert (Default-deny). Eigene, offene Domain. - Capture bauen. Ein Worker, der authentifizierte Requests entgegennimmt und roh nach
inbox/schreibt, plus eine kleine PWA als Teilen-Ziel. Das Secret bleibt auf dem Gerät. - Pflegeregeln definieren. Operationen für Ingest, Edit, Delete und Lint festhalten (bei mir in
AGENTS.md), damit das Brain konsistent bleibt.
Danach gilt: lokal mit hugo server -D prüfen, committen, pushen; die Builds laufen automatisch.
📚 Weiterführende Links & Quellen
- Das Konzept dahinter: LLM-Wiki trifft OKF (warum «kompilieren statt abrufen»)
- Betrieb & Moderation: der Inbox-Workflow (wie das Brain gepflegt wird)
- Hugo & PaperMod-Theme (Static-Site-Generator und Theme)
- Cloudflare Pages & Cloudflare Access (Hosting der beiden Builds und Login-Schutz)
- Buch: Building a Second Brain von Tiago Forte (das Konzept des persönlichen Wissensspeichers)