- Go 56.7%
- TypeScript 37.5%
- CSS 3.2%
- HTML 1.1%
- Python 0.8%
- Other 0.6%
| cmd | ||
| config | ||
| docs | ||
| internal | ||
| schema | ||
| scripts | ||
| vision | ||
| .gitignore | ||
| .golangci.yml | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| config.sandbox.yaml.example | ||
| config.yaml.example | ||
| DEPLOY.md | ||
| go.mod | ||
| go.sum | ||
| INSTALL.md | ||
| Makefile | ||
| README.md | ||
treedoc / treelink
Werkzeuge zum Erfassen, Verwalten und Publizieren von Fotos und Stammdaten
von Obstbäumen. Das Go-Modul heißt forge.23.nu/md/treedoc.
Bäume werden mit treephoto.app (iPhone) fotografiert, in treedoc redaktionell bearbeitet und als statisches Archiv nach S3 ausgespielt. Zusätzliche Quelle ist der L&F-Obsidian-Vault.
Schnellstart
# Systemabhängigkeiten (Debian/Ubuntu)
apt install libimage-exiftool-perl imagemagick
make build # React-UI + alle cmd/-Binaries nach bin/
./bin/treedoc # → http://localhost:8767
Konfiguration: config.yaml (Vorlage: config.yaml.example; enthält Secrets
und ist gitignored). Die DB-DSN kommt aus db_dsn bzw. TREEDOC_DB_DSN.
make check # fmt, vet, lint, typecheck, tests
make sandbox-seed N=10 && make sandbox-treedoc # Spielwiese auf :8768
Architektur, Paketstruktur und Datenflüsse: CLAUDE.md.
Installation und Betrieb: INSTALL.md, DEPLOY.md. Änderungen: CHANGELOG.md.
Statische Archiv-Seite (store/{id}/index.html)
Pro Baum wird bei jedem Speichern eine statische, dependency-freie HTML-Seite nach S3 geschrieben (Langzeit-Archiv). Die Vorlage ist:
internal/treestore/tree-static.html.tmpl
Das ist eine Go-html/template-Datei und wird per //go:embed fest ins Binary
gebacken. Zum Ändern des Aussehens diese Datei bearbeiten und neu bauen
(make build bzw. go build ./...). Die Seite muss ohne JavaScript und ohne
externe Abhängigkeiten auskommen.
Vorschaukarten (Mastodon & Co.) kommen ausschließlich aus den Open-Graph-Marken im Seitenkopf. Einen oEmbed-Beipackzettel gibt es bewusst nicht: Mastodon fragt oEmbed zuerst und liest Open Graph nur, wenn das nichts ergibt — die schmalere Auskunft gewinnt sonst gegen die reichere.
Alternativ lässt sich zur Laufzeit eine andere Vorlage per Flag übergeben
(treedoc --template pfad/zur/vorlage.tmpl, ebenso cmd/render --template …);
ist der Pfad leer oder unlesbar, greift die eingebettete Vorlage.
Bestehende Seiten neu rendern (z. B. nach einer Template-Änderung):
go run ./cmd/render --base https://treedoc.foxel.org --prefix store # alle Bäume
go run ./cmd/rerender --base https://treedoc.foxel.org abc123 def456 # nur diese IDs