Smart Task Management Mobile Application for University Students
Mahasiswa masa kini sering menjalani lima mata kuliah atau lebih dalam satu semester, masing-masing dengan tugas, proyek, dan deadline sendiri-sendiri. Masalahnya bukan soal rajin atau tidak, melainkan menentukan mana yang harus dikerjakan lebih dulu. Aplikasi pencatat tugas yang umum dipakai (Notion, Google Tasks, dsb.) memperlakukan semua tugas secara setara, sehingga mahasiswa tetap harus memilah sendiri mana yang paling mendesak β proses yang menguras waktu dan energi.
PrioriTask hadir untuk menjawab persoalan ini. PrioriTask adalah aplikasi mobile yang membantu mahasiswa mencatat tugas akademik sekaligus menghitung skor prioritas setiap tugas secara otomatis, berdasarkan tiga variabel: kedekatan deadline, tingkat kesulitan, dan progres pengerjaan saat ini. Hasilnya, mahasiswa mendapat panduan objektif tentang apa yang harus dikerjakan berikutnya, tanpa perlu menebak-nebak sendiri.
Proyek ini dikembangkan sebagai tugas mata kuliah Software Architecture oleh Kelompok 8.
- Task Management β Tambah, lihat, dan kelola seluruh tugas akademik dalam satu tempat, dikategorikan berdasarkan mata kuliah, tingkat kesulitan, dan status.
- Automated Prioritization β Skor prioritas tiap tugas dihitung otomatis berdasarkan deadline, tingkat kesulitan, dan progres pengerjaan, lalu diperbarui secara dinamis.
- Progress Tracking β Perbarui progres pengerjaan tugas secara visual lewat slider 0β100%, lengkap dengan riwayat catatan progres.
- Notification System β Pengingat otomatis untuk tugas yang mendekati deadline, supaya tidak ada yang terlewat.
- Calendar View β Tampilan kalender bulanan untuk melihat sebaran deadline secara sekilas.
- Account Dashboard β Ringkasan standing akademik (GPA & SKS) serta pengaturan tampilan dan notifikasi.
Home β tugas prioritas utama Β β’Β Daftar Tugas Β β’Β Detail Tugas & Progress Β β’Β Kalender
| Komponen | Teknologi |
|---|---|
| Frontend | Flutter (Dart) |
| Backend | NestJS 10 (TypeScript) |
| Database | Supabase (PostgreSQL) |
| State Management | Provider Pattern |
| CI/CD | GitHub Actions |
PrioriTask/
βββ .github/
β βββ workflows/
β βββ backend.yml # CI/CD pipeline backend
β βββ frontend.yml # CI/CD pipeline frontend
βββ backend/ # NestJS + TypeScript API
β βββ src/
β βββ notifications/ # Modul notifikasi deadline
β βββ priorities/ # Engine kalkulasi skor prioritas
β βββ supabase/ # Koneksi & service Supabase (global module)
β βββ tasks/ # Modul tugas (CRUD, DTO)
βββ frontend/ # Flutter mobile app
βββ assets/
β βββ images/ # Logo, gambar onboarding, dsb.
βββ lib/
βββ models/ # Model data (Task, Profile)
βββ screens/ # Seluruh halaman UI
βββ services/ # API service, auth, state provider
βββ theme/ # Konfigurasi tema aplikasi
βββ widgets/ # Komponen UI reusable
cd backend
npm install --legacy-peer-deps
npm run start:devBackend berjalan di http://localhost:3000 dengan hot reload aktif. Detail environment variable ada di bagian Environment Variables di bawah.
cd frontend
flutter pub get
flutter runPastikan Flutter SDK sudah terpasang (panduan instalasi) dan ada device/emulator yang aktif sebelum menjalankan flutter run.
Architecture β klik untuk lihat detail
PrioriTask mengikuti pola arsitektur Layered Architecture, standar opinionated dari NestJS yang mendorong pemisahan tanggung jawab yang bersih antarlapis.
- Presentation Layer (Controllers) β
@Controller, menangani semua HTTP request masuk, memvalidasi input awal, dan mengirim response keluar. Tidak mengandung logika bisnis. - Business Layer (Services) β Inti dari sistem.
TasksService,PriorityService,NotificationsServiceberada di lapisan ini. Di sinilah formula prioritas dihitung dan aturan bisnis diterapkan. - Persistence Layer (Supabase JS Client) β Query builder yang memetakan data ke dan dari PostgreSQL. Satu-satunya titik kontak dengan database.
- Infrastructure Layer (SupabaseModule β Global Singleton) β Modul global yang menyediakan koneksi ke Supabase dan di-share ke seluruh aplikasi.
Alur request:
HTTP Request β Middlewares β Guards β Pipes β Interceptors β Controller β Service β Supabase Client β PostgreSQL
Exception filters menangkap dan memformat error yang muncul di titik manapun sepanjang alur ini, memastikan response error yang konsisten ke semua client.
Database Schema β klik untuk lihat detail
Database menggunakan PostgreSQL yang di-host di Supabase dengan dua tabel utama:
Tabel tasks
| Kolom | Tipe | Keterangan |
|---|---|---|
id |
UUID | Primary key, di-generate otomatis |
subject_name |
TEXT | Nama mata kuliah |
task_name |
TEXT | Nama tugas |
description |
TEXT | Deskripsi detail tugas |
difficulty |
TEXT | Tingkat kesulitan: easy, medium, hard |
deadline |
TIMESTAMPTZ | Batas waktu pengumpulan tugas |
progress_percent |
NUMERIC(5,2) | Persentase progress (0β100) |
is_completed |
BOOLEAN | Status selesai atau belum |
created_at |
TIMESTAMPTZ | Waktu tugas dibuat |
updated_at |
TIMESTAMPTZ | Waktu terakhir diupdate (auto-update via trigger) |
Tabel progress_updates
| Kolom | Tipe | Keterangan |
|---|---|---|
id |
UUID | Primary key |
task_id |
UUID | Foreign key ke tabel tasks (cascade delete) |
note |
TEXT | Catatan progress dari user |
progress_percent |
NUMERIC(5,2) | Persentase progress saat update dilakukan |
image_url |
TEXT | URL gambar bukti progress (opsional) |
created_at |
TIMESTAMPTZ | Waktu update dibuat |
Relasi
tasks (1) ββββββββ (many) progress_updates
ON DELETE CASCADE
Saat sebuah task dihapus, semua progress update yang terkait akan otomatis ikut terhapus.
Database Trigger
Tabel tasks memiliki trigger tasks_updated_at yang otomatis memperbarui kolom updated_at setiap kali ada perubahan data, tanpa perlu dilakukan secara manual dari aplikasi.
API Endpoints β klik untuk lihat detail
Base URL: http://localhost:3000 (development) atau URL deployment kamu (production)
Mengambil semua tugas beserta skor prioritas masing-masing.
Response:
[
{
"id": "uuid",
"subject_name": "Kalkulus",
"task_name": "Tugas Integral Lipat",
"description": "Kerjakan soal integral lipat dua dan tiga",
"difficulty": "hard",
"deadline": "2026-05-20T23:59:00.000Z",
"progress_percent": 30,
"is_completed": false,
"created_at": "2026-05-18T10:00:00.000Z",
"priority_score": 92.5,
"progress_updates": []
}
]Mengambil detail satu tugas berdasarkan ID beserta seluruh riwayat progress updatenya.
Response: sama dengan objek task di atas, dengan progress_updates berisi array riwayat update.
Membuat tugas baru.
Request Body:
{
"subject_name": "Kalkulus",
"task_name": "Tugas Integral Lipat",
"description": "Kerjakan soal integral lipat dua dan tiga",
"difficulty": "hard",
"deadline": "2026-05-20T23:59:00.000Z"
}Validasi:
subject_nameβ wajib, stringtask_nameβ wajib, stringdescriptionβ opsional, stringdifficultyβ wajib, hanya boleheasy,medium, atauharddeadlineβ wajib, format ISO 8601 date string
Response: 201 Created dengan objek task yang baru dibuat.
Mengupdate data tugas yang sudah ada. Semua field bersifat opsional.
Request Body (semua opsional):
{
"subject_name": "Kalkulus Lanjut",
"progress_percent": 75,
"is_completed": false
}Catatan: jika progress_percent diset ke 100, maka is_completed akan otomatis menjadi true.
Response: 200 OK dengan objek task yang sudah diupdate.
Menghapus tugas beserta seluruh progress update-nya (cascade delete).
Response: 204 No Content
Mengambil seluruh riwayat progress update dari satu tugas, diurutkan dari yang terbaru.
Response:
[
{
"id": "uuid",
"task_id": "uuid",
"note": "Sudah selesai bagian integral substitusi",
"progress_percent": 50,
"image_url": null,
"created_at": "2026-05-18T14:30:00.000Z"
}
]Menambahkan progress update baru untuk suatu tugas. Secara otomatis juga mengupdate kolom progress_percent di tabel tasks.
Request Body:
{
"progress_percent": 50,
"note": "Sudah selesai bagian integral substitusi",
"image_url": "https://example.com/foto.jpg"
}Validasi:
progress_percentβ wajib, angka 0β100noteβ opsional, stringimage_urlβ opsional, string URL
Response: 201 Created dengan objek progress update yang baru dibuat.
Menghitung dan mengembalikan skor prioritas dari satu tugas berdasarkan kondisi terkini (deadline, kesulitan, progress).
Response:
{
"score": 92.5
}Mengambil maksimal 3 tugas yang paling mendesak untuk dijadikan notifikasi, yaitu tugas yang deadlinenya dalam 3 hari ke depan dan belum selesai, diurutkan dari yang paling dekat deadlinenya.
Response:
[
{
"id": "uuid",
"task_id": "uuid",
"task_name": "Tugas Integral Lipat",
"subject_name": "Kalkulus",
"deadline": "2026-05-19T23:59:00.000Z",
"priority_score": 92.5,
"message": "Tugas \"Tugas Integral Lipat\" deadline dalam 18 jam!",
"is_overdue": false,
"hours_left": 18
}
]Formula Kalkulasi Prioritas β klik untuk lihat detail
Ini adalah inti logika bisnis PrioriTask. Setiap tugas memiliki skor prioritas yang dihitung secara dinamis berdasarkan tiga faktor, diimplementasikan di src/priorities/priority.service.ts.
Score = (0.5 Γ DeadlineFactor) + (0.3 Γ DifficultyFactor) + (0.2 Γ ProgressFactor)
1. DeadlineFactor (bobot 50%)
Faktor ini mengukur seberapa mendesak deadline tugas. Semakin sedikit waktu tersisa, semakin tinggi nilainya.
hoursLeft = jam tersisa hingga deadline
DeadlineFactor = 100 Γ (1 - hoursLeft / 168)
- Horizon maksimum adalah 168 jam (7 hari). Tugas dengan deadline lebih dari 7 hari dianggap tidak terlalu mendesak.
- Jika tugas sudah melewati deadline (hoursLeft β€ 0), nilai otomatis menjadi 100 (maksimum urgency).
- Contoh: sisa 84 jam β
100 Γ (1 - 84/168)= 50
2. DifficultyFactor (bobot 30%)
Faktor ini mencerminkan tingkat kesulitan tugas. Tugas yang lebih sulit diprioritaskan lebih tinggi karena membutuhkan lebih banyak waktu pengerjaan.
| Difficulty | Nilai |
|---|---|
easy |
33.3 |
medium |
66.7 |
hard |
100.0 |
3. ProgressFactor (bobot 20%)
Faktor ini mengukur seberapa banyak pekerjaan yang belum diselesaikan. Tugas yang belum dikerjakan sama sekali diprioritaskan lebih tinggi.
ProgressFactor = 100 - progress_percent
- Progress 0% β ProgressFactor = 100 (belum dikerjakan sama sekali)
- Progress 50% β ProgressFactor = 50 (setengah jalan)
- Progress 100% β ProgressFactor = 0 (selesai, skor akan menjadi 0)
Tugas dengan kondisi:
- Deadline 2 hari lagi (48 jam)
- Difficulty:
hard - Progress: 30%
DeadlineFactor = 100 Γ (1 - 48/168) = 71.43
DifficultyFactor = 100 (hard)
ProgressFactor = 100 - 30 = 70
Score = (0.5 Γ 71.43) + (0.3 Γ 100) + (0.2 Γ 70)
= 35.71 + 30 + 14
= 79.71
Skor ini kemudian dibandingkan antar semua tugas aktif untuk menentukan urutan prioritas di aplikasi.
Environment Variables β klik untuk lihat detail
File .env di root folder backend/ perlu diisi sebelum menjalankan backend:
SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_ANON_KEY=your_anon_key_here
SUPABASE_SERVICE_ROLE_KEY=your_service_role_key_here
PORT=3000
NODE_ENV=development
ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8080Cara mendapatkan nilai-nilai di atas:
- Login ke supabase.com
- Buka project kamu
- Pergi ke Settings β API
- Copy Project URL β
SUPABASE_URL - Copy anon public β
SUPABASE_ANON_KEY - Copy service_role β
SUPABASE_SERVICE_ROLE_KEY
CI/CD (GitHub Actions) β klik untuk lihat detail
File .github/workflows/backend.yml menjalankan pipeline otomatis setiap kali ada push ke branch main atau develop pada folder backend/.
Tahapan Pipeline
- Job
test(berjalan di semua push dan pull request) β checkout kode, setup Node.js 20, install dependencies, jalankan linter (eslint), jalankan unit test (jest), build TypeScript ke JavaScript. - Job
deploy(hanya berjalan saat push kemain) β hanya berjalan jika jobtestberhasil. Siap dikonfigurasi untuk deploy ke Railway atau Render.
GitHub Secrets yang Dibutuhkan
Tambahkan di repository β Settings β Secrets and variables β Actions:
| Secret | Keterangan |
|---|---|
SUPABASE_URL |
URL project Supabase |
SUPABASE_ANON_KEY |
Anon key Supabase |
RAILWAY_TOKEN |
Token Railway (jika pakai Railway) |
RENDER_DEPLOY_HOOK_URL |
Deploy hook Render (jika pakai Render) |
Offline Fallback β klik untuk lihat detail
Backend dirancang agar tidak crash saat Supabase tidak tersambung. Jika kredensial Supabase tidak ditemukan atau koneksi gagal, sistem akan:
- Menampilkan warning di console
- Mengembalikan data dummy berisi contoh tugas mahasiswa
- Tetap menjalankan semua kalkulasi prioritas secara normal
Ini memungkinkan pengembangan dan testing frontend berjalan tanpa memerlukan koneksi database aktif.
| Nama | Peran |
|---|---|
| Stawin Revano | Project Manager + Backend |
| Gilbert Nicholin | Backend + Frontend |
| Nabil Rafif Utomo | Frontend |
| Roderikus Orvin Nevanto | Frontend |
| Sindy Aulia Putri Hendrawan | Frontend |





