Your local-first career preparation manager
PrepPilot is a 100% offline, local-first Flutter app that centralizes everything a student needs for placement preparation β tasks, hackathons, certifications, projects, and files β in one focused, minimal interface.
Download APK Β· Features Β· Architecture Β· Schema Β· Tech Stack Β· Roadmap Β· Contributing
| File | Size | Platform |
|---|---|---|
| PrepPilot-v1.0.0.apk | ~18 MB | Android 5.0+ (API 21+) |
Install instructions:
- Download the APK from the link above
- On your Android device: Settings β Security β Enable "Install from unknown sources"
- Open the downloaded APK and tap Install
- No internet connection required β ever
iOS build coming in v1.1.0
| Module | Description |
|---|---|
| π Calendar + Tasks | Central spine of the app. All deadlines, tasks, and activity milestones render as calendar events. |
| π Dashboard | Today view with open tasks, active activities, and a live deadline pressure score. |
| π Activity Tracker | Single screen for hackathons, certifications, and courses β unified by a type field. |
| π Project Manager | Track personal dev projects with tasks linked directly from the tasks table. |
| π Storage Vault | File index that stores metadata + local URIs. No shadow filesystem, no permission hell. |
| π Notifications | Local deadline alerts and resume reminder triggers β all generated on-device. |
| π PDF Export | One-page achievement summary: projects, certs, hackathons, open tasks. |
| π€ CSV Export | Export tasks and activities as CSV for external use. |
PrepPilot follows a local-first, offline-only architecture. No network calls. No backend. No cloud dependency.
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Flutter UI Layer β
β β
β Dashboard β Calendar+Tasks β Activity β
β (Today) β (Core Spine) β Tracker β
β β β β
β Project β Storage Vault β Notificationsβ
β Manager β (File Index) β (Local) β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β Riverpod Providers
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
β Repository Layer β
β TaskRepo β ActivityRepo β ProjectRepo β
β NoteRepo β FileRepo β ReminderRepo β
ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β sqflite DAOs
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
β SQLite Database (on-device) β
β tasks β activities β projects β notes β
β file_index β reminders β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββ
β Device File System β
β /files β /images β /exports β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
graph TD
CAL[π
Calendar + Tasks\nCore Spine]:::purple
DASH[π Dashboard\nToday View + Score]:::teal
ACT[π Activity Tracker\nHackathons Β· Certs Β· Courses]:::teal
PROJ[π Project Manager\nDev Projects]:::teal
VAULT[π Storage Vault\nFile Metadata Index]:::gray
NOTIF[π Notifications\nDeadline Β· Resume Alerts]:::gray
DB[(SQLite\nLocal Only)]:::db
CAL --> DASH
ACT --> CAL
PROJ --> CAL
VAULT --> CAL
CAL --> NOTIF
DB --> CAL
DB --> VAULT
DB --> NOTIF
classDef purple fill:#5C6BC0,stroke:#3949AB,color:#fff
classDef teal fill:#26A69A,stroke:#00897B,color:#fff
classDef gray fill:#78909C,stroke:#546E7A,color:#fff
classDef db fill:#37474F,stroke:#263238,color:#fff
All data is stored in a single SQLite database on the device. Uses a polymorphic FK pattern (linked_type + linked_id) so notes, files, and reminders attach to any entity without extra join tables.
erDiagram
TASKS {
integer task_id PK
text title
text date
text time
integer priority
text status
text linked_type
integer linked_id
}
ACTIVITIES {
integer activity_id PK
text type
text name
text platform
text deadline
integer progress
text notes
}
PROJECTS {
integer project_id PK
text name
text description
text status
text repo_url
}
NOTES {
integer note_id PK
text linked_type
integer linked_id
text text_content
text image_uri
text created_at
}
FILE_INDEX {
integer file_id PK
text linked_type
integer linked_id
text label
text local_uri
text file_type
text created_at
}
REMINDERS {
integer reminder_id PK
text linked_type
integer linked_id
text trigger_type
text scheduled_at
integer fired
}
TASKS ||--o{ NOTES : "has"
TASKS ||--o{ REMINDERS : "triggers"
ACTIVITIES ||--o{ NOTES : "has"
ACTIVITIES ||--o{ FILE_INDEX : "stores"
ACTIVITIES ||--o{ REMINDERS : "triggers"
PROJECTS ||--o{ TASKS : "linked to"
PROJECTS ||--o{ NOTES : "has"
PROJECTS ||--o{ FILE_INDEX : "stores"
| Layer | Technology | Purpose |
|---|---|---|
| UI Framework | Flutter 3.x | Cross-platform mobile UI |
| Language | Dart 3.x | App logic |
| State Management | Riverpod | Reactive state, no manual rebuilds |
| Local Database | sqflite + path_provider | SQLite on-device storage |
| Calendar | table_calendar | Calendar view with event markers |
| Notifications | flutter_local_notifications | On-device deadline alerts |
| File Picker | file_picker | Attach files to vault |
| PDF Export | pdf + printing | Achievement summary export |
| CSV + Share | share_plus | Share tasks/activities as CSV |
| Onboarding | shared_preferences | Store user name, first-launch flag |
| File Opening | open_file | Open vault files |
| URL Launch | url_launcher | Open repo links |
| Speed Dial | flutter_speed_dial | Multi-action FAB |
| IDE | Antigravity IDE | AI-agent assisted development |
The dashboard shows a pressure score (0β100) computed from open tasks and upcoming activity deadlines. Purely local arithmetic β no ML, no API.
int calcPressureScore(List<Task> tasks, List<Activity> activities) {
final now = DateTime.now();
int score = 0;
for (final t in tasks.where((t) => t.status != 'completed')) {
final diff = t.date.difference(now).inDays;
if (diff < 0) score += 3; // overdue
else if (diff == 0) score += 2; // due today
else if (diff <= 7) score += 1; // due this week
}
for (final a in activities) {
final diff = a.deadline.difference(now).inDays;
if (diff < 0) score += 3;
else if (diff <= 2) score += 2;
else if (diff <= 7) score += 1;
}
return score.clamp(0, 100);
}| Score | Status | Color |
|---|---|---|
| 0 β 20 | All clear | π’ Green |
| 21 β 50 | Moderate load | π‘ Amber |
| 51 β 100 | High pressure | π΄ Red |
gantt
title PrepPilot Build Plan
dateFormat YYYY-MM-DD
section Phase 1 β Core Loop
Flutter + SQLite setup :done, p1a, 2026-03-16, 3d
Tasks screen + CRUD :done, p1b, after p1a, 3d
Calendar view :done, p1c, after p1b, 3d
Dashboard today view :done, p1d, after p1c, 2d
section Phase 2 β Trackers
Activity Tracker screen :done, p2a, after p1d, 3d
Project Manager screen :done, p2b, after p2a, 3d
Notes (text + image) :done, p2c, after p2b, 2d
section Phase 3 β Storage + Notifications
File index vault :done, p3a, after p2c, 2d
Local notifications :done, p3b, after p3a, 2d
Resume reminder trigger :done, p3c, after p3b, 2d
section Phase 4 β Polish
Pressure score + dashboard :done, p4a, after p3c, 2d
PDF + CSV export :done, p4b, after p4a, 3d
Dark mode + onboarding :done, p4c, after p4b, 2d
v1.0.0 release :done, p4d, after p4c, 1d
# Clone the repo
git clone https://github.com/sangsaist/PrepPilot.git
cd PrepPilot
# Install dependencies
flutter pub get
# Run on device or emulator
flutter run
# Build release APK
flutter build apk --release
# Output: build/app/outputs/flutter-apk/app-release.apkRequirements: Flutter 3.x Β· Dart 3.x Β· Android SDK 21+ or iOS 13+
Contributions are welcome! Here's how:
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Commit your changes:
git commit -m 'feat: add your feature' - Push to the branch:
git push origin feature/your-feature-name - Open a Pull Request
Please follow the existing folder structure and Riverpod patterns when contributing.
This project is licensed under the MIT License - see the LICENSE file for details.