A simple, fast notes app for Android. Syncs to the cloud. Subscribes through your mobile carrier billing.
- What is Clean Notes
- Features
- Tech Stack
- Platform
- Subscription & Billing
- Project Layout
- Quick Start
- Architecture
- Documentation
Clean Notes is a paid notes app for Android, built with Flutter.
You write a note, save it, and it is waiting for you the next time you open the app. Notes are stored in the cloud, so they survive a reinstall, a phone change, or a factory reset.
The app is gated by an AppsPro / BDApps subscription at BDT 2/= per day, billed to your mobile phone bill by your operator.
| Feature | Description |
|---|---|
| βοΈ Create | Add a note with a title and description. |
| ποΈ View | Every note is shown in a live-updating list, most-recently-edited first. |
| π§ Update | Tap any note to change its title or description. The updatedAt timestamp refreshes automatically. |
| ποΈ Delete | Remove a note with a confirmation dialog. |
| π Per-user isolation | Each subscriber's notes are stored under their own user space in Cloud Firestore. Two accounts on the same device cannot see each other's notes. |
| βοΈ Cloud sync | Notes are backed up to Firebase. New notes save locally first and sync when you are online again. |
| π΄ Offline reading | Notes you have already opened are available without internet. |
| π§π© Carrier billing | BDT 2/= per day, added to your mobile bill by your operator through AppsPro / BDApps. No card or bank account needed. |
| πͺ Self-service unsubscribe | Logout and cancel your subscription from inside the app. |
| Layer | Technology |
|---|---|
| Framework | Flutter 3.x |
| Language | Dart 3.12+ |
| UI | Material 3 |
| Backend | Firebase (firebase_core 4.x, cloud_firestore 6.x, firebase_auth 6.5.4 β anonymous) |
| Subscription billing | AppsPro / BDApps REST SDK β https://api.appspro.dev/api/v1 |
| Networking | package:http (direct HTTPS) |
| Local storage | SharedPreferences (subscriber record only) |
| Build | Gradle (Kotlin DSL), Android Gradle Plugin, JDK 17 |
| Signing | Release keystore (not included in source) |
| Property | Value |
|---|---|
| Operating system | Android |
| Minimum version | Android 5.0 (Lollipop, API 21) |
| Target version | Android 14 (API 34) |
| Architectures | arm64-v8a, armeabi-v7a, x86_64 |
| iOS, web, desktop | Not built or supported in this release |
Clean Notes is provided as a paid service through the Bangladeshi carrier billing platform (AppsPro / BDApps).
| Price | BDT 2/= per day (about BDT 60/= per 30-day month) |
| How you pay | Added to your mobile phone bill by your operator |
| How to subscribe | Open the app, enter your Bangladeshi mobile number, verify the OTP |
| How to unsubscribe | Tap Logout / Unsubscribe at the bottom of the notes list |
| Listing | appspro.dev/app/CkFUYUsruI |
It may take up to 24 hours for an unsubscribe to fully reflect on your operator bill. If the BDT 2/= daily charge still appears after 24 hours, contact your mobile operator.
lib/
βββ main.dart # App entry, Firebase bootstrap, auth try/catch
βββ firebase_options.dart # Generated by `flutterfire configure`
βββ config/
β βββ appspro_config.dart # AppsPro base URL + secret key
βββ models/
β βββ note.dart # Note entity + Firestore (de)serialisation
β βββ subscriber.dart # Subscriber record (phone, subscriber_id)
βββ services/
β βββ notes_service.dart # Firestore CRUD wrapper, per-user scoped
β βββ subscription_service.dart # AppsPro / BDApps REST wrapper
βββ screens/
β βββ login_screen.dart # Phone entry + OTP request
β βββ subscription_gate.dart # Subscription wall + state machine
β βββ subscription_success_screen.dart # Post-verify confirmation
β βββ notes_list_screen.dart # Home screen β live list + add FAB
β βββ note_editor_screen.dart # Add / edit form
βββ widgets/
βββ note_tile.dart # Single-row presentation
See FIREBASE_SETUP.md for the full Firebase / Firestore setup walkthrough. See APPSPRO_INTEGRATION.md for the AppsPro / BDApps credential setup and the subscribe / unsubscribe flow.
TL;DR:
flutter pub get
flutterfire configure --project=<your-project-id>
flutter runBuild a release APK:
flutter build apk --releaseThe signed APK lands at
build\app\outputs\flutter-apk\app-release.apk.
graph TD
subgraph UI_Layer [UI Layer]
Main[main.dart] --> Login[LoginScreen]
Main --> Gate[SubscriptionGate]
Gate --> List[NotesListScreen]
List --> Editor[NoteEditorScreen]
end
subgraph Service_Layer [Service Layer]
AuthSvc[AuthService]
NotesSvc[NotesService]
SubSvc[SubscriptionService]
end
subgraph External_Layer [External Services & DB]
FA[Firebase Auth]
CF[Cloud Firestore]
SP[(SharedPreferences)]
AP[AppsPro / BDApps REST API]
end
%% UI to Service Connections
Login --> AuthSvc
Gate --> SubSvc
List --> NotesSvc
List --> SubSvc
Editor --> NotesSvc
%% Service to External Connections
AuthSvc --> FA
NotesSvc --> CF
SubSvc --> AP
SubSvc --> SP
- Single source of truth β the UI subscribes to a Firestore stream; there is no local cache for notes. This keeps the code short and matches the assignment scope.
NotesServiceisolates Firestore APIs β the screens never touchFirebaseFirestoredirectly. Swap it for a mock or REST client in tests.SubscriptionServiceisolates AppsPro APIs β the screens never touch the BDApps HTTP endpoints directly. Errors throwSubscriptionException; the UI catches them and shows a snackbar.- Per-user data isolation β every Firestore query is scoped
by the current
firebase_authuser UID. Two subscribers on the same device see two independent notes lists. - No business logic in widgets β validation lives in the form, persistence lives in the service, presentation lives in the tile.
- Material 3 themed with a single seeded
ColorScheme. - Anonymous Firebase Authentication is used at boot to give the app a stable per-device identity for Firestore rules, with a defensive try/catch around the bootstrap so a misconfigured Firebase project does not blank-crash the app on startup.
| File | Purpose |
|---|---|
| USER_MANUAL.txt | End-user guide: install, subscribe, use, unsubscribe. |
| RELEASE_NOTES.md | Release notes (v1.0.0) and user-facing app description. |
| FIREBASE_SETUP.md | Firebase project setup and Firestore rules. |
| APPSPRO_INTEGRATION.md | AppsPro / BDApps setup, endpoints, secret-key handling. |
Developed by: Abir Hasan Arko