Secretary Journal (Android)
Android-Client für ein digitales Tagebuch/Journal auf dem
secretary-server (CalDAV). Jeder Eintrag ist ein
VJOURNAL-Komponent (RFC 5545 §3.6.3) in einer .ics-Datei unter einer
Journal-Collection (/journal/main/, seit v129 eigener Namespace-Root;
zuvor /calendars/journal-*/).
What it does
- A daily journal where every entry is a VJOURNAL component (RFC 5545 3.6.3) on your own server
- Track mood per entry, with the surrounding context that actually moves it: triggers, skills and habits
- Free text per entry, plus the entry date
- Offline first: entries live in a local JSON cache and edits queue up until the server is reachable again
- Shared offline sync engine with the other Secretary apps, so all of them behave the same way when the network drops
- Search and filter your entries
How to use
- Opens on the calendar/month view
- Shows entries by day
- Tap an entry to open/edit it
- Supports different entry types (text, mood, habit, skill, trigger, medicine, food/drink, excreta)
- Leave the editor via back without saving (changes saved only via "Speichern")
- Scroll to see all entries of a day
Screenshots

Entry types


Developer information
Every released version: Apps/journal/changelog
Verzeichnisstruktur
secretary-journal-android/
├── build.gradle.kts # Root-Build
├── settings.gradle.kts
├── gradle.properties
├── CONTEXT.md
├── gradle/wrapper/
└── app/
├── build.gradle.kts
├── proguard-rules.pro
└── src/main/
├── AndroidManifest.xml
├── res/values/
│ ├── strings.xml # Englisch (Systemstandard)
│ └── themes.xml
├── res/values-de/strings.xml # Deutsch
└── java/org/beowulf/secretary/journal/
├── SecretaryJournalApp.kt # Application (Service-Locator)
├── MainActivity.kt # Single-Activity
├── data/
│ ├── JournalModels.kt # JournalEntry, Mood
│ ├── VJournal.kt # RFC-5545-Parser/-Writer
│ ├── JournalRepository.kt # Config-Persistenz (zentrales Konto)
│ └── AccountResolver.kt # Zentrales Konto (ContentProvider)
├── vm/
│ └── JournalViewModel.kt # App-State
└── ui/
├── Theme.kt # Material 3
├── LoginScreen.kt # Server + Basic-Auth
├── JournalCalendarScreen.kt # Monatskalender
├── JournalEditScreen.kt # Editor (Datum/Stimmung/Text)
├── SettingsScreen.kt # Verbindung/Abmelden
└── navigation/NavGraph.kt # Routen: login, calendar, entry, settings
Die Sync-Engine (OfflineSyncEngine) und ihre Test-Suite liegen im gemeinsamen
secretary-common-android (nicht im Journal) und werden von allen secretary-Apps
genutzt.
Befehle
Voraussetzungen: JDK 21, Android-SDK (Platform 37, Build-Tools 34)
und Gradle 9.x. Im Repository liegt bewusst kein Gradle-Wrapper --
entweder Android Studio nutzen (bringt sein Gradle mit) oder Gradle 9 selbst
installieren; die Beispiele unten rufen deshalb gradle direkt.
export ANDROID_HOME="$HOME/Android/Sdk" # bzw. sdk.dir=... in local.properties
gradle :journal:assembleDebug # Debug-APK
gradle :common:testDebugUnitTest # gemeinsame Engine (local/online/offline)
gradle :journal:compileDebugKotlin # Kompilierung inkl. Engine-Wiring
Konzepte
- Journal: VJOURNAL-Einträge mit Datum, Stimmung (Mood) und Freitext in
einer (
journal--präfixten) Calendar-Collection auf dem secretary-server. - Offline: Einträge liegen als JSON-Cache (
filesDir/secretary_journal_cache.json) vor; Änderungen gehen bei fehlender Verbindung in eine Write-Behind-Queue und werden beim nächsten erfolgreichenloadCollections()abgespielt. - Sync-Engine:
loadEntriesInternaldelegiert an die gemeinsameOfflineSyncEngineaussecretary-common-android(OfflineSyncEngine.kt), die alle secretary-Apps für den Offline-first-Load/Handoff nutzen. Das Journal bindet sie überCodec+GOfflineStore+CrudItemRemote, parametrisiert mit einemprepare-Lambda (Decrypt → Re-Encode → Encrypt,nullüberspringt nicht entschlüsselbare Einträge) undonDavError→logErr. Lokal-only-Einträge werden beim ersten Connect re-homed auf den Server-Ressourcenpfad und geladen; einIOExceptionbeim Upload markiert sie für die Write-Behind-Queue, einDavException(Server-Reject) lässt sie im Cache und meldet sie überonDavError; einIOExceptionbeim Fetch ergibtOffline(Cache bleibt Quelle). - Zentrales Konto: Zugangsdaten kommen aus dem gemeinsamen Android-Konto
(
AccountManager, Typorg.beowulf.secretary) mit lokalem SharedPreferences-Cache und Legacy-Fallback für die eigene Anmeldung.
Berechtigungen
INTERNET– CalDAV-ZugriffGET_ACCOUNTS– zentrales Konto lesen (damit nicht von der Signer-Visibility-Provisionierung des Android-Kontos abhängig)org.beowulf.secretary.account.permission.READ_ACCOUNT(signature, legacy)
Server-Referenz
secretary-server(CalDAV, Rust):~/Projects/secretary-server/(/calendars/, PROPFIND, REPORT calendar-query, PUT/DELETE, MKCALENDAR)
Attachments:
- journal-habit.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-skill.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-trigger.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-food.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-medicine.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-excreta.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-mood.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-detail.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-list.png [download] added by beowulf on 2026-10-13 09:39:01. [details]
- journal-liste.png [download] added by beowulf on 2026-10-13 09:38:51. [details]