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.

DomainRolleBuildZugang
private.onlythoughts.ioDas komplette Brain: alles, was im Repo liegthugo --buildDraftsHinter Cloudflare Access (Login)
onlythoughts.ioNur ausgewählte, freigegebene BeiträgeAllowlist via scripts/stage-public.sh, Output public_public/Offen im Netz
capture.onlythoughts.ioEingang fürs Handy (Text/Foto)PWA, registriert als Android-Teilen-ZielSecret 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:

public: true   # erscheint zusätzlich im öffentlichen Build
public: false  # oder fehlt: bleibt privat (nur im Brain hinter Login)

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:

  1. Auf dem Handy teile ich Text oder ein Foto über das Android-Teilen-Menü an das Ziel «Brain» (die PWA unter capture.onlythoughts.io).
  2. Ein Cloudflare Worker (brain-capture) nimmt das entgegen und schreibt es roh nach inbox/, als Markdown mit Frontmatter status: inbox. Das Secret für diesen Weg liegt nur auf meinem Gerät.
  3. 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:

  1. Repo anlegen. Privates Git-Repo, Hugo mit PaperMod. Inhalte als Leaf Bundles unter content/posts/<slug>/index.md, Bilder daneben.
  2. Frontmatter-Konvention festlegen. Pflichtfeld type (OKF-Vokabular), dazu title, description, timestamp und das public-Feld als Publish-Gate.
  3. 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.
  4. 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.
  5. 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.
  6. 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.