Version: 2.0.0
Author: Nicola De Nicolais
Contact: ndn21dev@gmail.com
License: GNU GPL v3 with Additional Commercial Restrictions
A digital notebook — notes, tasks, and calendar events in one place, synced via Firebase.
- Overview
- Features
- Architecture
- Project Structure
- Data Models
- Screens
- State Management
- Services & Utilities
- Firebase Integration
- Theme & Styling
- Getting Started
- Dependencies
- License
Noteep is a full-featured Flutter note-taking and productivity app. It combines notes, tasks, and a calendar into a single interface, backed by Firebase Firestore for real-time cloud sync and Firebase Auth for user authentication.
- Google Sign-In via Firebase Auth
- Email / Password sign-in and registration
- Password reset by email
- Persistent session — on app launch the user is redirected to Home if already authenticated
| Feature | Details |
|---|---|
| Note types | Free-text note or Checklist |
| Rich styling | Font family, font size, bold, italic, strikethrough, text color, background color — with separate overrides for the title |
| Markdown | Full Markdown rendering inside notes |
| Audio notes | Record audio clips (AAC/M4A) directly inside a note; playback with waveform visualisation |
| Checklist items | Each item has its own id, text, and checked state |
| Pin | Pins a note to the top of the list |
| Archive | Moves note out of the main list without deleting it |
| Soft-delete / Trash | Moves note to Trash; auto-purged after 7 days |
| Note lock | Protects a note behind biometric authentication (local_auth) |
| Reminders | Schedule a local notification for any note |
| Tags / Labels | Add multiple tags per note; manage (rename, delete) all tags from the Labels screen |
| Note linking | Cross-reference notes by linking their IDs |
| Reorder | Drag-and-drop reordering in both grid and list layouts |
| Search | Real-time full-text search across title and content |
| Sort | Sort by creation date, modification date, or custom order |
| Templates | 6 built-in templates (Meeting Notes, Daily Journal, Project Plan, Shopping List, Travel Packing, Brainstorming) |
| Feature | Details |
|---|---|
| Task lists | Create and manage named lists; tabs in the Tasks screen |
| Special tasks | Star a task to mark it as high-priority; visible in the "Speciali" tab |
| Subtasks | Nest sub-items under any task |
| Due date | Set a due date for each task |
| Recurrence | none / daily / weekly / monthly / yearly |
| Reminders | Schedule a local notification for any task |
| Tags | Same tagging system as notes |
| Pin / Archive | Same mechanics as notes |
| Soft-delete | 7-day auto-purge from Trash |
| Search & Sort | Real-time search; sort by date or custom order |
| Move between lists | Reassign a task to a different list |
| Feature | Details |
|---|---|
| Event types | Standard event, Birthday (isBirthday), Name day (isNameDay) |
| All-day events | Toggle for all-day duration |
| Recurrence | none / daily / weekly / monthly / yearly |
| Reminders | Local notification per event |
| Tags | Tagging system shared with notes and tasks |
| ICS Export | Export calendar events as an .ics file |
| ICS Import | Import events from an external .ics file |
| Mini calendar | Compact monthly calendar widget; full workspace view |
| Archive / Trash | Same soft-delete pipeline as notes and tasks |
Dedicated screen listing all upcoming reminders across notes, tasks, and calendar events in a single view.
Visual dashboard with counts broken down by entity type (Notes, Tasks, Calendar Events) and state (Active, Archived, Trashed). Charts powered by fl_chart.
Export notes to PDF format (rendered with the pdf / printing packages); download link on web, share sheet on mobile.
- Manual backup to a local ZIP file containing
notes.json,tasks.json,calendar.json, andmetadata.json - Automatic backups with configurable frequency (daily / weekly / monthly)
- Up to 30 backup files retained; older ones purged automatically
- Full restore from any saved backup file
| Option | Values |
|---|---|
| Theme | System / Light / Dark |
| Home layout | Grid / List |
| Show completed tasks | Toggle |
| Group tasks by priority | Toggle |
| Backup frequency | Daily / Weekly / Monthly |
| ICS import / export | Calendar interoperability |
| Export notes | Opens the PDF export screen |
| Statistics | Opens the statistics screen |
| App info | Version, build number, changelog, author |
Android home screen widget support via home_widget.
After an update, a "Changelog" dialog lists what changed since the last version the user saw (nothing is shown on a fresh install). The full history is always available from Info app.
Flutter (Dart)
├── State Management → Riverpod (StateNotifier + Provider)
├── Backend → Firebase (Auth + Firestore)
├── Local Storage → SharedPreferences (settings)
├── Notifications → flutter_local_notifications (timezone-aware)
├── Audio → record + just_audio + audio_waveforms
├── PDF Export → pdf + printing
├── Charts → fl_chart
├── Biometrics → local_auth
├── Home Widget → home_widget
└── Backup → archive (ZIP)
Data flow for notes and tasks:
UI Widget
└─ reads/writes via Riverpod provider
└─ StateNotifier mutates in-memory state + writes to Firestore
└─ Firestore collection: users/{uid}/notes | tasks | task_lists | calendar_events
lib/
├── main.dart # App entry point, Firebase init, routing
├── models/
│ ├── note_model.dart # NoteModel, NoteStyle, ChecklistItem, NoteType
│ ├── audio_note.dart # AudioNote
│ ├── task_model.dart # TaskModel
│ ├── task_list_model.dart # TaskListModel
│ ├── subtask_model.dart # SubtaskModel
│ ├── calendar_model.dart # CalendarEventModel
│ ├── note_template.dart # NoteTemplate + kNoteTemplates
│ └── change_history.dart # Undo/redo history model
├── providers/
│ ├── auth_provider.dart # Firebase Auth stream, AuthNotifier
│ ├── notes_provider.dart # NotesNotifier (Firestore CRUD)
│ ├── notes_undo_redo_provider.dart
│ ├── tasks_provider.dart # TasksNotifier, TaskListsNotifier
│ ├── tasks_undo_redo_provider.dart
│ ├── audio_provider.dart # Audio recording/playback state
│ ├── calendar_provider.dart # CalendarNotifier
│ └── settings/
│ ├── theme_provider.dart # ThemeMode (SharedPreferences)
│ ├── ui_provider.dart # Layout, sort order, search query
│ └── backup_provider.dart # Backup frequency settings
├── screens/
│ ├── home_screen.dart # Main notes list (grid / list)
│ ├── tasks_screen.dart # Tasks list with tab bar
│ ├── archive_screen.dart
│ ├── trash_screen.dart
│ ├── labels_screen.dart # Tag management
│ ├── reminders_screen.dart
│ ├── export_screen.dart # PDF export
│ ├── info_screen.dart
│ ├── note_template_screen.dart
│ ├── auth/
│ │ └── login_screen.dart
│ ├── home/
│ │ ├── reorderable_grid_view.dart
│ │ ├── reorderable_list_view.dart
│ │ ├── speed_dial_fab.dart
│ │ └── home_layout_utils.dart
│ ├── note_editor/
│ │ ├── note_editor_screen.dart
│ │ ├── note_checklist_editor.dart
│ │ └── note_link_sheet.dart
│ ├── task_editor/
│ │ └── task_editor_screen.dart
│ ├── calendar/
│ │ ├── calendar_screen.dart
│ │ ├── calendar_event_editor_screen.dart
│ │ ├── calendar_day_cell.dart
│ │ ├── calendar_mini_month.dart
│ │ ├── calendar_search_bar.dart
│ │ └── calendar_utils.dart
│ ├── settings/
│ │ ├── settings_screen.dart
│ │ └── settings_section_header.dart
│ └── statistics/
│ ├── statistics_screen.dart
│ └── statistics_widgets.dart
├── theme/
│ ├── app_theme.dart # Light and Dark MaterialTheme
│ ├── app_colors.dart # AppColors palette
│ └── app_font_sizes.dart
├── utils/
│ ├── audio_service.dart # AudioRecordingService singleton
│ ├── backup_service.dart # BackupService (ZIP create/restore)
│ ├── notification_service.dart # NotificationService singleton
│ ├── widget_service.dart # Home widget updates
│ ├── note_lock_service.dart # Biometric lock
│ ├── recurrence.dart # RecurrenceType enum + helpers
│ ├── ics_export_service.dart # Calendar → ICS
│ ├── ics_import_service.dart # ICS → CalendarEventModel
│ ├── downloader.dart # Platform-aware file download
│ ├── downloader_io.dart # Mobile implementation
│ └── downloader_web.dart # Web implementation
└── widgets/
├── app_drawer.dart # Shared navigation drawer
├── nav_scaffold.dart # Scaffold with drawer
├── note_card.dart # Note preview card
├── sort_sheet.dart # Bottom sheet for sort options
├── shared/
│ ├── empty_state.dart
│ └── search_field.dart
└── style_editor/ # Note styling controls
| Field | Type | Description |
|---|---|---|
id |
String |
UUID v4 |
title |
String |
Note title |
content |
String |
Note body (Markdown) |
type |
NoteType |
note or checklist |
style |
NoteStyle |
Visual styling configuration |
checklistItems |
List<ChecklistItem> |
Items for checklist notes |
audioNotes |
List<AudioNote> |
Attached audio recordings |
isArchived |
bool |
|
isPinned |
bool |
|
isLocked |
bool |
Biometric lock |
reminder |
DateTime? |
Scheduled reminder |
linkedNoteIds |
List<String> |
IDs of linked notes |
tags |
List<String> |
User-defined tags |
createdAt |
DateTime |
|
updatedAt |
DateTime |
|
deletedAt |
DateTime? |
Set on soft-delete; null = not trashed |
Font family, size, bold, italic, strikethrough, text color, background color — with separate optional overrides for the title only.
| Field | Type | Description |
|---|---|---|
id |
String |
UUID v4 |
title |
String |
|
description |
String |
|
isCompleted |
bool |
|
dueDate |
DateTime? |
|
isPinned |
bool |
|
isSpecial |
bool |
Star / high-priority flag |
isArchived |
bool |
|
listId |
String? |
Parent task list ID (null = no list) |
recurrence |
RecurrenceType |
none / daily / weekly / monthly / yearly |
reminder |
DateTime? |
|
tags |
List<String> |
|
subtasks |
List<SubtaskModel> |
|
createdAt / updatedAt / deletedAt |
DateTime |
Same timestamp fields as NoteModel and TaskModel, plus startTime, endTime, isAllDay, isBirthday, isNameDay, recurrence, reminder, tags.
| Field | Type | Description |
|---|---|---|
id |
String |
UUID v4 |
filename |
String |
Display name |
filepath |
String |
Absolute path on device |
duration |
Duration |
|
createdAt |
DateTime |
|
transcription |
String? |
Optional transcript text |
| Screen | Route | Description |
|---|---|---|
LoginScreen |
— | Email/password and Google sign-in |
HomeScreen |
/ |
Notes grid/list with FAB (speed dial) |
NoteEditorScreen |
push | Create or edit a note / checklist |
TasksScreen |
/tasks |
Tabbed tasks view (All / Special / custom lists) |
TaskEditorScreen |
push | Create or edit a task |
RemindersScreen |
/reminders |
All upcoming reminders |
CalendarWorkspaceView |
/calendar |
Full calendar with event editor |
LabelsScreen |
/labels |
Manage tags |
ArchiveScreen |
/archive |
Archived notes and tasks |
TrashScreen |
/trash |
Trashed items (7-day auto-purge) |
SettingsScreen |
/settings |
App preferences and backup |
ExportScreen |
push from Settings | PDF export |
StatisticsScreen |
push from Settings | Usage statistics |
InfoScreen |
push from Settings | App version and author info |
The AppDrawer (slide-in from the left) is present on all main screens and provides direct access to every top-level route.
Noteep uses Riverpod with StateNotifier for mutable collections and Provider for derived read-only views.
| Provider | Type | Purpose |
|---|---|---|
notesProvider |
StateNotifierProvider |
Full notes list (Firestore-backed) |
activeNotesProvider |
Provider |
Notes that are not archived or trashed |
archivedNotesProvider |
Provider |
Archived, not trashed |
trashedNotesProvider |
Provider |
Soft-deleted notes |
filteredNotesProvider |
Provider |
Applies search query and sort order |
tasksProvider |
StateNotifierProvider |
Full tasks list |
taskListsProvider |
StateNotifierProvider |
Task lists |
activeTasksProvider |
Provider |
Active tasks sorted by taskSortOrderProvider |
specialTasksProvider |
Provider |
Tasks with isSpecial == true |
filteredTasksProvider |
Provider |
Applies search + sort |
taskListTasksProvider |
Provider.family |
Tasks filtered by list ID + search |
calendarProvider |
StateNotifierProvider |
Calendar events |
authStateProvider |
StreamProvider |
Firebase Auth stream |
currentUserProvider |
Provider |
Current User? |
authNotifierProvider |
StateNotifierProvider |
Sign-in / sign-out operations |
themeModeProvider |
StateNotifierProvider |
Persisted in SharedPreferences |
homeLayoutProvider |
StateProvider |
Grid or List |
sortOrderProvider |
StateProvider |
Notes sort order |
taskSortOrderProvider |
StateProvider |
Tasks sort order |
searchQueryProvider |
StateProvider |
Notes search string |
taskSearchQueryProvider |
StateProvider |
Tasks search string |
backupSettingsProvider |
StateNotifierProvider |
Backup frequency |
Singleton. Initialises flutter_local_notifications with timezone support. Provides:
scheduleNotification(id, title, body, scheduledAt)— zones-aware schedulingcancelNotification(id)/cancelAllNotifications()- Static ID helpers:
idForNote,idForTask,idForEvent(offset ranges to avoid collisions)
Singleton. Wraps record (recording) and just_audio (playback):
startRecording()→ records AAC/M4A to<appDocDir>/audio_notes/stopRecording()→ returns anAudioNotecancelRecording()→ deletes partial fileplayAudio(filePath),pauseAudio(),resumeAudio(),stopAudio(),seek(duration)- Streams:
playerStateStream,positionStream
Static class:
createBackup(notesData, tasksData, calendarData)→ writes a ZIP to<appDocDir>/noteep_backups/restoreBackup(backupPath)→ extracts ZIP and returns parsed JSON mapslistBackups()→ sorted list of backup filesdeleteBackup(path), auto-purge (keeps last 30)getLastBackupTime()/setLastBackupTime()via SharedPreferences
Wraps local_auth to prompt biometric or device credential authentication before showing a locked note.
Manages the Android home screen widget state via home_widget.
Enum: none | daily | weekly | monthly | yearly
Includes label (Italian display string), shortLabel, and toShortString() helpers.
IcsExportService— serialisesCalendarEventModellist to RFC 5545.icsformatIcsImportService— parses.icsfiles back intoCalendarEventModelobjects
Platform-adaptive file download:
downloader_io.dart— usespath_provideron mobiledownloader_web.dart— triggers browser download on webdownloader.dart— conditional export selecting the correct implementation
All user data is stored under users/{uid}/ in Firestore:
users/
{uid}/
notes/ ← NoteModel documents
tasks/ ← TaskModel documents
task_lists/ ← TaskListModel documents
calendar_events/ ← CalendarEventModel documents
Each StateNotifier holds the uid and a FirebaseFirestore reference, loading its collection on construction. Write operations use doc(id).set(...) for upserts and batch.commit() for bulk changes (reorder, tag rename/delete, replaceAll, clearAll).
firestore.rules restricts every signed-in user to their own users/{uid}/ branch; everything else is denied. Deploy with:
firebase deploy --only firestore:rulesOn every load, items with deletedAt older than 7 days are batch-deleted from Firestore and removed from in-memory state.
| Item | Value |
|---|---|
| Font | Exo 2 (variable weight + italic variant) |
| Theme engine | Material 3 (useMaterial3: true) |
| Color palette | AppColors — white #FFFFFF, dark #3D3F4D, warm yellow #FEDFA9, warm brown #CCA775 |
| Themes | AppTheme.light / AppTheme.dark |
| Selection | System / Light / Dark — persisted via themeModeProvider |
- Flutter SDK ≥ 3.7.2 / Dart SDK ^3.7.2
- A Firebase project with Authentication and Firestore enabled
google-services.jsonplaced inandroid/app/lib/firebase_options.dartgenerated withflutterfire configure(both files are git-ignored)
# 1. Clone the repository
git clone https://github.com/ndenicolais/Noteep.git
cd Noteep
# 2. Install dependencies
flutter pub get
# 3. Run code generation (Riverpod annotations)
dart run build_runner build --delete-conflicting-outputs
# 4. Run the app
flutter run
# Web: keep port 5000, it is the authorized OAuth origin / API key referrer
flutter run -d chrome --web-port 5000Release builds are signed with the keystore described in android/key.properties (git-ignored):
storeFile=C:/path/to/noteep-release.jks
storePassword=...
keyAlias=noteep
keyPassword=...Without this file, release builds fall back to the debug key (local testing only). Register the release keystore SHA-1 in the Firebase console, otherwise Google Sign-In fails.
flutter build apk --release --target-platform android-arm64flutter testtest/providers/: unit tests forNotesNotifier,TasksNotifierandTaskListsNotifieragainstfake_cloud_firestore(CRUD, trash lifecycle, tags, cross-notifiertaskLists → taskscoupling, derived/filtered providers).test/screens/: widget tests forNoteEditorScreenandTaskEditorScreen(render, edit + save, overflow-menu actions), withnotesProvider/tasksProvideroverridden to a fake-Firestore-backed notifier so no real Firebase project is needed to run them.
| Package | Version | Purpose |
|---|---|---|
flutter_riverpod |
^2.6.1 | State management |
riverpod_annotation |
^2.6.1 | Code-gen for Riverpod |
firebase_core |
^3.13.1 | Firebase initialisation |
firebase_auth |
^5.5.3 | Authentication |
cloud_firestore |
^5.6.6 | Cloud database |
google_sign_in |
^6.2.2 | Google OAuth |
shared_preferences |
^2.3.4 | Local settings storage |
flutter_local_notifications |
^18.0.1 | Local notifications |
flutter_timezone |
^3.0.0 | Timezone detection |
timezone |
^0.9.4 | Timezone data |
record |
^6.0.0 | Audio recording |
just_audio |
^0.9.39 | Audio playback |
audio_waveforms |
^1.1.3 | Waveform visualisation |
table_calendar |
^3.1.3 | Calendar UI |
fl_chart |
^0.68.0 | Statistics charts |
pdf |
^3.11.1 | PDF generation |
printing |
^5.13.1 | PDF preview & print |
local_auth |
^2.3.0 | Biometric authentication |
home_widget |
^0.9.1 | Android home screen widget |
archive |
^3.6.1 | ZIP backup |
background_fetch |
^1.3.0 | Background auto-backup |
share_plus |
^10.1.4 | Share sheet |
file_picker |
^8.1.7 | File picker (ICS, backup) |
flutter_markdown |
^0.7.6 | Markdown rendering |
path_provider |
^2.1.4 | File system paths |
intl |
^0.20.2 | Date formatting / i18n |
flutter_localizations |
SDK | Italian Material/Cupertino widgets (pickers, menus) |
uuid |
^4.5.1 | UUID generation |
fake_cloud_firestore (dev) |
latest | Firestore fake for provider/widget tests |
Copyright © 2026 Nicola De Nicolais — All Rights Reserved.
Licensed under the GNU General Public License v3 with Additional Commercial Restrictions.
Commercial use — including publishing or monetising on any app store — requires explicit written permission from the copyright holder.
Contact: ndn21dev@gmail.com
GitHub: https://github.com/ndenicolais