Skip to content

sangsaist/PrepPilot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PrepPilot Logo

PrepPilot

Your local-first career preparation manager

Flutter Dart SQLite Riverpod License: MIT Platform Release Downloads


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


πŸ“₯ Download

Latest Release β€” v1.0.0

Download APK
File Size Platform
PrepPilot-v1.0.0.apk ~18 MB Android 5.0+ (API 21+)

Install instructions:

  1. Download the APK from the link above
  2. On your Android device: Settings β†’ Security β†’ Enable "Install from unknown sources"
  3. Open the downloaded APK and tap Install
  4. No internet connection required β€” ever

iOS build coming in v1.1.0


🧩 Features

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.

πŸ› Architecture

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                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Module Dependency Map

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
Loading

πŸ—„ Database Schema

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"
Loading

πŸ›  Tech Stack

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

πŸ“Š Deadline Pressure Score

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

πŸ—Ί Roadmap

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
Loading

πŸš€ Getting Started

# 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.apk

Requirements: Flutter 3.x Β· Dart 3.x Β· Android SDK 21+ or iOS 13+


🀝 Contributing

Contributions are welcome! Here's how:

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/your-feature-name
  3. Commit your changes: git commit -m 'feat: add your feature'
  4. Push to the branch: git push origin feature/your-feature-name
  5. Open a Pull Request

Please follow the existing folder structure and Riverpod patterns when contributing.


πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.


PrepPilot

Built with focus by sangsaist

GitHub

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors