I'm building the Learning Journal App to help you build a daily learning habit: write down what you learned, one entry at a time. It's still a work in progress, but the core architecture is done before any feature code starts.
My goal is different from most note-taking tools: it's not about capturing everything you see. It's a learning journal. The point is to understand and remember what you studied, then reflect on it later.
🏗️ Architecture and Design
Before writing any code, I spent a long time designing the system on paper. I write docs and Architecture Decision Records (ADRs) first, so every design choice is settled before implementation starts.
- Offline-First: The app must work fully offline. A journal you reach for daily can't depend on a flaky connection.
- Layered Architecture: I'm separating
core(pure domain + infrastructure),features(modules scoped to each feature), and presentation so business logic never leaks into widgets. - Drift Database: A typed, reactive SQLite layer so my domain model maps to real relational integrity without an ORM.
- Riverpod for State: Compile-safe, testable state management with no service locator surprises at runtime.
- go_router for Navigation: Declarative routing with deep link support.
- Dependency Injection: A single
ProviderScopeacts as the composition root, so every layer is swapped and tested in isolation.
Every decision is documented, from the domain model down to serialization and logging strategy. When I start typing code, I'm implementing a spec, not making it up as I go.
🚀 Core Features
Once the foundation is done, the app will take you through the full learning loop:
- Workspaces: organizing learning into long-term goals (like "Learning Web Dev" or "IELTS Prep") so every entry has a direction.
- Daily Learning Sessions: a lightweight daily flow for writing down what you studied, keeping it as low-friction as possible.
- Categories and Tags: flexible classification so older entries stay findable as the journal grows.
- Media Evidence: attaching images or videos as proof of what you learned, not just text notes.
- Fully Offline: your data lives on your device, always, with no server in the middle.
- Optional Google Drive Sync: keeping the journal available across devices without ever giving up local ownership of your data.
🔒 Privacy and Offline
Privacy is the main reason the app is offline-first. Your journal never leaves your device unless you turn on sync. Google Drive sync is opt-in and runs against your own account, so no third-party server has your data.
🧭 Current Status (WIP)
I'm currently working on Sprint 00 (Foundation): bootstrapping the Flutter
project with the locked-in dependency set (Riverpod, go_router, Drift, freezed,
google_fonts, logging), the AppDatabase skeleton, theme and typography
integration, localization (English + Bahasa Indonesia), and a router with
Splash, Home, and Settings placeholder screens. No feature code exists yet. This
sprint is infrastructure only, so every later sprint gets a stable base.
The repository isn't published yet and there are no screenshots to show. I'll update this page as the app takes shape.