Bambu Bar
Monitor Bambu Lab printers from your Mac menu bar: print progress, the live camera, AMS filament, alerts and desktop widgets. Bambu Bar for macOS 26+.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
A self-hosted, tamper-proof personal log
翻訳待ち
Loading the full README.
Read the full README ↗Tagebuch-Microsite zum Loggen des eigenen Tages, ähnlich einem privaten Microblog. Ein einzelnes Go-Binary mit eingebettetem Vanilla-JS-Frontend und SQLite als Speicher.
#hashtags, Suche, Tages- und Zeitraumansichtdocker compose up -d --build
Danach läuft die App auf http://localhost:8080, die Statistikseite auf /dashboard.
Fertige Images liegen auf Docker Hub unter dettmering/personal-timeline (latest = master, sonst der Git-Tag).
| Variable | Default | Bedeutung |
|---|---|---|
DB_PATH | /data/timeline.db | Pfad zur SQLite-Datei |
LISTEN_ADDR | :8080 | Listen-Adresse |
TZ | Systemzeitzone (Europe/Berlin im Image) | Zeitzone, in der Kalendertage gelten |
API_KEY | – | Wenn gesetzt, nötig für automatisierte Einträge und manuelles Versiegeln |
ENCRYPTION_KEY | – | Base64-kodierter 32-Byte-Schlüssel; aktiviert die Verschlüsselung |
WEBHOOK_URL | – | Ziel für den Webhook bei neuen Einträgen |
SHOW_PERMALINK | false | Permalink-Knopf (🔗) an Einträgen anzeigen |
SHOW_QUOTE | false | Zitier-Knopf (❝) an Einträgen anzeigen |
Statt ENCRYPTION_KEY direkt zu setzen, kann der Schlüssel als Datei nach /run/secrets/timeline_encryption_key gemountet werden (siehe docker-compose.yml). Neuen Schlüssel erzeugen:
openssl rand -base64 32
Beim ersten Start mit Schlüssel werden alle bestehenden Klartext-Einträge verschlüsselt. Die Tagessiegel bleiben dabei gültig. Ohne den Schlüssel sind die Einträge danach nicht mehr lesbar.
Basis-URL ist der Server selbst, z. B. http://localhost:8080. GET /api/schema liefert eine maschinenlesbare Beschreibung aller Ausgabeformate, gedacht für LLM-Clients.
application/json; charset=utf-8), außer dem .ots-Download.2026-06-06T14:03:21.123456789Z.YYYY-MM-DD, bezogen auf die Server-Zeitzone (TZ), nicht auf UTC.merkle_root, seal_hash, …) sind SHA-256-Digests als Standard-Base64.null zu sein.{"error": "<Meldung>"} mit Status 400 (ungültige Eingabe), 401 (API-Key fehlt oder falsch), 403 (nicht bearbeitbar/löschbar), 404 (nicht gefunden) oder 500.Der API-Key wird nur verlangt für POST /api/entries mit "automated": true und für POST /api/seals/{date}. Alle anderen Endpunkte sind offen. Ist API_KEY nicht gesetzt, entfällt die Prüfung ganz.
Übergabe per Header, wahlweise:
Authorization: Bearer <API_KEY>
X-API-Key: <API_KEY>
Entry
| Feld | Typ | |
|---|---|---|
id | Integer | |
text | String | max. 10 000 Zeichen, Markdown, kann #hashtags enthalten |
created_at | Zeitstempel | |
edited_at | Zeitstempel, optional | fehlt, wenn nie bearbeitet |
automated | Boolean | per API-Key angelegt statt in der Oberfläche |
hashtags | String-Array | kleingeschrieben, ohne #; leer, wenn keine |
lat, lon | Zahl, optional | nur gemeinsam vorhanden |
{
"id": 42,
"text": "Morgenlauf am See #sport #morgen",
"created_at": "2026-06-06T05:12:44.123456789Z",
"automated": false,
"hashtags": ["morgen", "sport"],
"lat": 52.5163,
"lon": 13.3777
}
DaySeal
| Feld | Typ | |
|---|---|---|
date | Datum | versiegelter Tag |
entry_count | Integer | Anzahl Einträge an dem Tag |
merkle_root | Base64 | SHA-256(entry_hash₁ ‖ entry_hash₂ ‖ …) über die Eintrags-Hashes des Tages in id-Reihenfolge (trotz des Namens kein Merkle-Baum) |
prev_seal_hash | Base64, optional | seal_hash des Vortags-Siegels; fehlt beim ersten Siegel |
seal_hash | Base64 | SHA-256(date ‖ merkle_root ‖ prev_seal_hash) |
sealed_at | Zeitstempel | |
has_ots_proof | Boolean | OpenTimestamps-Beleg liegt vor |
ots_upgraded_at | Zeitstempel, optional | gesetzt, sobald der Beleg in einem Bitcoin-Block verankert ist |
VerifyResult
| Feld | Typ | |
|---|---|---|
entries_checked | Integer | |
days_checked | Integer | |
chain_ok | Boolean | alle Siegel passen zu ihren Einträgen, Kette intakt |
first_broken_day | Datum, optional | erster Tag mit Abweichung |
break_reason | String, optional | Grund der Abweichung |
ots_present | Integer | Siegel mit OTS-Beleg |
ots_upgraded | Integer | Siegel mit Bitcoin-Verankerung |
GET /api/entriesDie Query-Parameter bestimmen den Modus. Geprüft wird in dieser Reihenfolge, der erste passende gewinnt:
| Modus | Parameter | Antwort |
|---|---|---|
| Hashtag | hashtag=<tag> (# optional), limit=<n> optional | {"hashtag": "<tag>", "entries": [Entry…]} |
| Suche | q=<text>, limit=<n> (Default 20, max. 50) | {"entries": [Entry…]} |
| Zeitraum | from=YYYY-MM-DD&to=YYYY-MM-DD (beide Pflicht, inklusive) | {"from": "…", "to": "…", "entries": [Entry…]} |
| Tag (Default) | date=YYYY-MM-DD (Default: heute) | {"date": "…", "entries": [Entry…]} |
Die Suche findet Teilstrings ohne Beachtung von Groß- und Kleinschreibung. Ein leeres q liefert die neuesten Einträge.
curl 'http://localhost:8080/api/entries?date=2026-06-06'
curl 'http://localhost:8080/api/entries?from=2026-06-01&to=2026-06-07'
curl 'http://localhost:8080/api/entries?hashtag=sport&limit=10'
curl 'http://localhost:8080/api/entries?q=see'
GET /api/entries/{id}Ein einzelner Eintrag. Antwort: Entry.
This is the beginning of the README. Read the rest at the original. Read the full README ↗