A cross-platform writing app for personal journaling rather than fiction — entries live on a single reverse-chronological timeline with rich-text, 45+ mood tags, and photo attachments, all stored locally behind PIN, FaceID, or fingerprint. The codebase is a clean MVVM Flutter split (lib/models, lib/views, lib/view_models, lib/providers) where the entire writing surface is a customized fork of flutter_quill pinned to a specific commit.
From the project's README: An open source diary & journal app with over 100k downloads 🪴
Storypad
Storypad is an open-source diary and journal app for Android, iOS, and macOS that ships from a single Flutter codebase. Despite the name suggesting a fiction-writing or Wattpad-style platform, it is a private, on-device journaling tool modeled closer to Day One than a publishing surface: every entry lives on one reverse-chronological timeline, with no folders or notebooks to organize.
Why it matters
- Timeline-first model. The product bet is that most journal apps bury users in folder/tab structure they never revisit. Storypad collapses everything into a single infinite timeline ordered by entry date, with a "throwback" surface that surfaces past entries written on this day in previous years.
- Customizable writing surface. Entries are built on a customized
fork of
flutter_quill(pinned to a specific commit viagit:ref) that exposes 1300+ Google Fonts, per-entry color theming, lists, headers, and embedded photo memories. Mood tracking layers on top with 45+ curated emotion tags. - On-device by default, cloud as opt-in. The primary store is
objectbox(NoSQL) running locally; Firebase (Firestore, Auth, Storage, Analytics, Crashlytics, Remote Config) is wired in for users who explicitly enable Google Drive backup. Local-only users can keep their diary completely offline. - Privacy gates that actually work. PIN, FaceID, and fingerprint
unlock are implemented via
local_authandflutter_secure_storage, so the OS-level biometric prompt gates app entry rather than being purely a UX flourish. - Monetization that respects free users. Pro features
(templates, backgrounds, relaxing sounds, period calendar, voice
journal, markdown export, writing stats, pinned notes, auto-backup)
are gated behind a one-time
purchases_flutterpurchase. The core journaling loop is fully usable without paying.
How it works
The architecture is a textbook Flutter MVVM split. lib/models/
holds the ObjectBox entities (Story, StoryPage, Asset,
Moment, etc.); lib/views/ and lib/widgets/ hold the UI tree;
lib/view_models/ hold the per-screen ChangeNotifier business
logic; and lib/providers/ wires it together with a three-tier
Provider scope (global ProviderScope, view ChangeNotifierProvider,
widget StatefulWidget). The writing surface (lib/views/quill/)
is a thin wrapper around the forked flutter_quill package that
adds Storypad-specific delta handling and asset embedding.
Local persistence is an ObjectBox database with the schema defined
in objectbox-model.json and generated by objectbox_generator.
Cloud sync is split across lib/services/cloud/ modules that talk
to Firebase Firestore for metadata and Firebase Storage for media.
Backup and restore flow through tar for export bundles and a
custom sync engine that reconciles ObjectBox state with Firestore
documents.
The bin/dev entrypoint exposes platform-specific runners:
--community (Android), --community-ios (iOS), and
--community-macos (macOS), with flutter_flavor-style build
config under android/app/build.gradle.kts and ios/Flutter/.
Caveats
- GPL-3.0. Modifications and forks must stay open-source under the same license, which is unusual for a personal app and worth flagging for downstream use.
- Firebase is in the dependency graph regardless of choice. Even users who never sign in have Firebase Crashlytics, Analytics, and Remote Config compiled into the binary; only Firestore/Auth/Storage are gated behind the cloud-sync toggle.
- Pre-1.0 versioning. Version
2.32.1+798inpubspec.yamlis not yet on a SemVer-stable release. Expect occasional schema churn on the ObjectBox side. - macOS is desktop-flavored mobile, not a native windowing app. The desktop build shares most of the mobile UI rather than offering a distinct macOS layout.
Deployment notes
git clone https://github.com/theachoem/storypad.git
cd storypad
flutter pub get
dart run build_runner build # ObjectBox + copy_with codegen
bin/dev --community # Android
bin/dev --community-ios # iOS (requires Xcode + signing)
bin/dev --community-macos # macOS (requires macOS host)
Prerequisites: Flutter 3.x with Dart 3, Xcode for iOS/macOS targets, Android Studio for Android, and a Firebase project (optional) if you want to test the cloud-sync path.
Integration tip: if you curate an Open Apps record tagged
diary, journal, or offline-first, link Storypad alongside
Day One and similar entries — its real niche is the single-timeline
UX and the GPL-3.0 commitment to keeping the on-device store open,
not feature parity with commercial journals.