Skip to content
Open Apps
Menu
Submit app
productivity

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 via git: 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_auth and flutter_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_flutter purchase. 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+798 in pubspec.yaml is 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.

On this page
  1. Why it matters
  2. How it works
  3. Caveats
  4. Deployment notes