Catat Keuangan Pribadi
Aplikasi mobile (React Native/Expo) offline-first untuk mencatat pemasukan dan pengeluaran harian secara berkategori. Pengguna dapat memasukkan transaksi dalam hitungan detik, menerima pengingat harian agar konsisten mencatat, serta melihat laporan bulanan dengan grafik komposisi pengeluaran. MVP berfokus pada pencatatan cepat, wawasan bulanan sederhana, dan penyimpanan lokal tanpa perlu akun atau koneksi internet.
Catat Keuangan Pribadi
Aplikasi mobile (React Native/Expo) offline-first untuk mencatat pemasukan dan pengeluaran harian secara berkategori. Pengguna dapat memasukkan transaksi dalam hitungan detik, menerima pengingat harian agar konsisten mencatat, serta melihat laporan bulanan dengan grafik komposisi pengeluaran. MVP berfokus pada pencatatan cepat, wawasan bulanan sederhana, dan penyimpanan lokal tanpa perlu akun atau koneksi internet.
Problem
Banyak individu di Indonesia kesulitan mengontrol keuangan harian karena tidak tahu ke mana uang mereka pergi. Mencatat manual di buku atau spreadsheet terasa merepotkan dan sering ditinggalkan, sementara aplikasi keuangan yang ada kerap terlalu kompleks, menuntut pembuatan akun, atau penuh fitur yang membingungkan. Akibatnya pengguna tidak punya kebiasaan mencatat dan tidak memiliki gambaran pola pengeluaran bulanan mereka.
Goals
- Memungkinkan pencatatan satu transaksi pemasukan/pengeluaran dalam waktu di bawah 15 detik.
- Membangun kebiasaan mencatat harian melalui pengingat (notifikasi) yang dapat diatur.
- Memberi wawasan bulanan yang mudah dipahami lewat ringkasan saldo dan grafik komposisi pengeluaran.
- Menyediakan aplikasi offline-first yang cepat dan ringan, tanpa perlu login atau koneksi internet.
- Merilis MVP yang stabil ke jalur uji internal (TestFlight untuk iOS dan Play Internal Testing untuk Android).
Non-Goals
- Sinkronisasi cloud dan login akun pengguna (MVP disengaja offline/lokal saja).
- Multi-dompet/akun (kas, bank, e-wallet) dan transfer antar akun.
- Anggaran (budget) per kategori beserta notifikasi ketika melewati batas.
- Dukungan multi-mata uang dan konversi kurs (MVP hanya Rupiah/IDR).
- Transaksi berulang otomatis (recurring) dan penjadwalan tagihan.
- Impor otomatis dari SMS bank atau e-statement.
- Keamanan lanjutan seperti kunci PIN/biometrik dan enkripsi database.
- Kolaborasi/berbagi anggaran keluarga serta versi web/desktop.
Target Users
- Karyawan atau mahasiswa muda Indonesia (20-30 tahun) yang melek smartphone — Cara cepat dan tidak merepotkan untuk mencatat pengeluaran harian serta melihat sisa uang bulan ini, tanpa harus membuat akun atau belajar aplikasi rumit.
- Freelancer atau pekerja gig dengan pemasukan tidak tetap — Memantau arus kas masuk dan keluar per bulan serta memahami kategori pengeluaran terbesar agar bisa mengatur pengeluaran saat pemasukan naik-turun.
- Individu yang baru mulai belajar mengelola uang — Pengingat rutin agar tidak lupa mencatat dan laporan visual sederhana yang membantu menyadari pola boros tanpa istilah keuangan yang membingungkan.
User Stories
- must-haveSebagai pengguna yang sibuk, saya ingin mencatat pengeluaran dengan cepat lengkap dengan nominal, kategori, dan tanggal, agar saya tidak lupa transaksi dan datanya akurat.
- must-haveSebagai pengguna yang ingin memahami pengeluaran, saya ingin mengelompokkan setiap transaksi ke dalam kategori dan mengatur kategori saya sendiri, agar saya tahu persis ke mana uang saya mengalir.
- must-haveSebagai pengguna yang ingin melihat kondisi keuangan, saya ingin melihat ringkasan saldo, total pemasukan, dan pengeluaran bulan berjalan beserta riwayat transaksinya, agar saya paham posisi keuangan saya saat ini secara sekilas.
- should-haveSebagai pengguna yang mudah lupa, saya ingin menerima pengingat harian pada jam yang saya tentukan, agar saya konsisten mencatat keuangan setiap hari.
- must-haveSebagai pengguna yang ingin mengevaluasi kebiasaan, saya ingin melihat laporan bulanan dengan grafik komposisi pengeluaran per kategori, agar saya bisa mengenali kategori paling boros dan memperbaikinya.
Features
Pencatatan Transaksi Berkategori
Form input/edit transaksi pemasukan dan pengeluaran dengan nominal (format Rupiah), kategori, catatan opsional, dan tanggal. Data tersimpan lokal secara persisten.
- Pengguna dapat menyimpan transaksi baru dengan minimal nominal (> 0) dan kategori yang wajib dipilih.
- Toggle Pemasukan/Pengeluaran memfilter daftar kategori yang muncul sesuai tipe.
- Nominal ditampilkan dengan pemisah ribuan saat diketik dan disimpan sebagai integer Rupiah (tanpa desimal).
- Transaksi dapat diedit dan dihapus (dengan konfirmasi), dan perubahan langsung tercermin di Beranda.
- Validasi menolak penyimpanan bila nominal 0/kosong atau kategori belum dipilih, dengan pesan error inline.
- Data tetap ada setelah aplikasi ditutup dan dibuka kembali.
Manajemen Kategori
Daftar kategori bawaan dan CRUD kategori buatan pengguna, lengkap dengan ikon dan warna, dipisah antara tipe pemasukan dan pengeluaran.
- Tersedia minimal 8 kategori default saat pertama kali aplikasi dijalankan (mis. Makan, Transport, Tagihan, Gaji).
- Pengguna dapat menambah kategori baru dengan nama, tipe, ikon, dan warna, lalu langsung muncul di form transaksi.
- Nama kategori harus unik per tipe; input duplikat ditolak dengan pesan jelas.
- Kategori yang masih dipakai oleh transaksi tidak dapat dihapus dan menampilkan peringatan.
- Perubahan kategori (nama/ikon/warna) langsung tercermin pada transaksi terkait dan laporan.
Beranda & Ringkasan Saldo
Layar utama menampilkan kartu ringkasan bulan berjalan (pemasukan, pengeluaran, saldo) dan daftar transaksi dikelompokkan per tanggal, dengan navigasi antar bulan.
- Kartu ringkasan menampilkan total pemasukan, total pengeluaran, dan saldo (pemasukan - pengeluaran) dalam format Rupiah.
- Daftar transaksi dikelompokkan per tanggal, menampilkan ikon+warna kategori, catatan, dan nominal (hijau untuk pemasukan, merah untuk pengeluaran).
- Tombol aksi mengambang membuka form tambah transaksi, dan menekan baris membuka mode edit.
- Pengguna dapat berpindah bulan (mundur/maju) dan data yang ditampilkan sesuai bulan terpilih.
- Empty state tampil rapi saat belum ada transaksi pada bulan tersebut.
- Daftar tetap mulus digulir untuk 500+ transaksi.
Reminder Harian
Notifikasi lokal harian yang dapat diaktifkan/dinonaktifkan dan diatur jamnya untuk mengingatkan pengguna mencatat keuangan.
- Pengguna dapat mengaktifkan pengingat dan memilih jam (default 20:00) melalui menu Pengaturan.
- Notifikasi benar-benar muncul pada jam yang dipilih dengan judul dan pesan ajakan mencatat.
- Menonaktifkan pengingat membatalkan seluruh jadwal notifikasi.
- Preferensi pengingat (aktif/nonaktif dan jam) tetap tersimpan setelah aplikasi di-restart.
- Bila izin notifikasi ditolak, aplikasi menampilkan informasi dan jalan pintas ke pengaturan sistem.
Laporan Bulanan dengan Grafik
Layar laporan menampilkan grafik komposisi pengeluaran per kategori (pie/donut), perbandingan pemasukan vs pengeluaran (bar), dan rincian nominal serta persentase per kategori.
- Pie/donut chart menampilkan komposisi pengeluaran per kategori memakai warna kategori, dengan total persentase 100%.
- Daftar kategori diurutkan dari nominal terbesar, menampilkan nominal dan persentase yang cocok dengan data transaksi.
- Terdapat kartu total pemasukan vs pengeluaran dan bar chart perbandingannya untuk bulan terpilih.
- Mengganti bulan memperbarui seluruh grafik dan angka.
- Empty state tampil dan aplikasi tidak crash ketika tidak ada data pada bulan tersebut.
Pengaturan, Tema & Ekspor Data
Menu pengaturan berisi tautan ke manajemen kategori, pengaturan reminder, pilihan tema (terang/gelap/ikuti sistem), ekspor data ke CSV, dan hapus semua data.
- Pengguna dapat memilih tema Terang/Gelap/Ikuti Sistem dan seluruh layar mengikuti tanpa teks yang tidak terbaca.
- Tombol Ekspor menghasilkan file CSV berisi seluruh transaksi (tanggal, tipe, kategori, nominal, catatan) dan dapat dibagikan.
- Tombol Hapus Semua Data meminta konfirmasi ganda sebelum menghapus dan mengosongkan database.
- Onboarding singkat hanya muncul saat pertama kali aplikasi dibuka.
- Preferensi tema tersimpan dan tetap berlaku setelah aplikasi di-restart.
Tech Stack
Semua nominal disimpan sebagai integer Rupiah (tanpa desimal) untuk menghindari galat pembulatan floating point. Format tampilan memakai Intl.NumberFormat 'id-ID'. Arsitektur repository memisahkan akses data (Drizzle) dari UI agar mudah ditest dan kelak ditambah sync cloud.
Tasks (siap kirim ke AI agent)
Menyiapkan kerangka aplikasi Expo + TypeScript, routing, struktur folder, tema, dan util format mata uang/tanggal.
Lihat isi perintah
Inisialisasi proyek mobile 'catat-keuangan-pribadi'. Buat aplikasi Expo SDK 52 + TypeScript (strict) memakai Expo Router (routing file-based di folder `app/`). Pasang & konfigurasi dependensi: zustand, drizzle-orm, expo-sqlite, drizzle-kit (dev), react-native-gifted-charts, expo-notifications, @react-native-async-storage/async-storage, @react-native-community/datetimepicker, date-fns, @expo/vector-icons. Buat struktur folder: `app/` (routes), `src/db/` (schema & client), `src/store/` (zustand stores), `src/components/` (UI reusable), `src/lib/` (util), `src/theme/` (warna, spacing, tipografi). Buat `src/lib/format.ts` berisi `formatRupiah(nominal:number):string` (Intl.NumberFormat 'id-ID', gaya currency IDR tanpa desimal) dan `formatTanggal(epochMs:number):string`. Buat `src/theme/index.ts` dengan token warna untuk light & dark. Setel path alias `@/*` -> `src/*` di `tsconfig.json`, plus ESLint + Prettier. Definition of done: `npx expo start` berjalan tanpa error dan menampilkan layar placeholder di simulator iOS & Android, `npm run lint` bersih, `formatRupiah(150000)` menghasilkan 'Rp150.000', commit awal dibuat.
Membangun lapisan penyimpanan lokal offline-first dengan Drizzle + expo-sqlite, termasuk migrasi otomatis dan kategori bawaan.
Lihat isi perintah
Bangun lapisan data lokal dengan Drizzle ORM + expo-sqlite. Buat `src/db/schema.ts` dengan tabel: `categories` (id text PK berisi uuid, name text, type text 'income'|'expense', icon text, color text, is_default integer, created_at integer) dan `transactions` (id text PK uuid, amount integer /nominal Rupiah bulat/, type text 'income'|'expense', category_id text FK -> categories.id, note text nullable, occurred_at integer /epoch ms/, created_at integer, updated_at integer). Tambah index pada `transactions(occurred_at)` dan `transactions(category_id)`. Buat `src/db/client.ts` yang membuka database `keuangan.db` dan menjalankan migrasi drizzle (folder `drizzle/`) saat startup. Buat `src/db/seed.ts` untuk menanam kategori default sekali (cek flag di AsyncStorage): income = Gaji, Bonus, Lainnya; expense = Makan, Transport, Belanja, Tagihan, Hiburan, Kesehatan, Lainnya (beri ikon @expo/vector-icons dan warna berbeda). Definition of done: migrasi & seed berjalan otomatis saat app start, unit test jest memverifikasi seed menghasilkan >= 8 kategori, dan query select transaksi tidak melempar error.
Membungkus akses database dalam repository yang teruji dan store Zustand untuk dikonsumsi UI.
Lihat isi perintah
Buat lapisan repository dan state. `src/db/repositories/transactionRepo.ts`: `createTransaction`, `updateTransaction`, `deleteTransaction`, `listTransactions({year, month, type?, categoryId?})`, dan `getMonthlySummary(year, month)` yang mengembalikan { totalIncome, totalExpense, balance, breakdown: Array<{categoryId, categoryName, color, total, percentage}> }. `src/db/repositories/categoryRepo.ts`: CRUD kategori plus guard `deleteCategory` yang menolak (melempar error jelas) bila kategori masih dipakai transaksi, serta cek keunikan nama per tipe. Buat store `src/store/useTransactionStore.ts` dan `src/store/useCategoryStore.ts` (Zustand) yang membungkus repo, menyimpan cache in-memory, dan menyediakan aksi refresh setelah mutasi. Semua nominal integer Rupiah. Definition of done: unit test jest untuk `getMonthlySummary` dengan data dummy menghasilkan angka benar (totalIncome - totalExpense === balance dan jumlah percentage breakdown mendekati 100), `deleteCategory` pada kategori terpakai menolak dengan error, dan store memicu re-render setelah create/update/delete.Alur input/edit/hapus transaksi lengkap dengan validasi, pemilih kategori, dan pemilih tanggal.
Lihat isi perintah
Bangun alur input & edit transaksi. Buat route `app/transaksi/tambah.tsx` dan `app/transaksi/[id].tsx` (edit). Komponen `src/components/TransactionForm.tsx` berisi: segmented toggle Pemasukan/Pengeluaran, input nominal dengan mask pemisah ribuan (format saat mengetik, simpan sebagai integer), `src/components/CategoryPicker.tsx` yang menampilkan hanya kategori sesuai tipe (ikon+warna) dan bersumber dari useCategoryStore, input catatan opsional, dan pemilih tanggal (default hari ini) memakai @react-native-community/datetimepicker. Tombol Simpan; di mode edit tambahkan tombol Hapus dengan konfirmasi. Validasi: nominal harus > 0 dan kategori wajib, tampilkan error inline. Setelah simpan panggil aksi store lalu `router.back()`. Definition of done: bisa membuat, mengedit, dan menghapus transaksi; data persist setelah app di-restart; validasi mencegah simpan nominal 0/kosong atau tanpa kategori; nominal tampil terformat saat diketik; layar rapi di light mode.
Layar utama dengan kartu ringkasan, daftar transaksi per tanggal, navigasi bulan, dan tab navigation.
Lihat isi perintah
Bangun layar Beranda `app/(tabs)/index.tsx` dan bottom tab navigation di `app/(tabs)/_layout.tsx` dengan tiga tab: Beranda, Laporan, Pengaturan (ikon @expo/vector-icons). Di Beranda: kartu ringkasan bulan berjalan menampilkan total Pemasukan, total Pengeluaran, dan Saldo memakai `getMonthlySummary` + `formatRupiah`. Selector bulan (tombol mundur/maju) di header. Di bawahnya `SectionList` transaksi bulan itu dikelompokkan per tanggal; tiap baris menampilkan ikon+warna kategori, nama kategori, catatan, dan nominal (hijau untuk income, merah untuk expense). Floating Action Button memanggil `router.push('/transaksi/tambah')`. Menekan baris membuka `app/transaksi/[id]`. Sediakan empty state saat belum ada transaksi. Definition of done: ringkasan & daftar diperbarui otomatis setelah tambah/edit/hapus, ganti bulan memuat data bulan yang benar, empty state tampil, dan daftar tetap mulus untuk 500+ transaksi (uji dengan data dummy).Layar untuk melihat, menambah, mengedit, dan menghapus kategori dengan ikon dan warna.
Lihat isi perintah
Bangun manajemen kategori. Buat route `app/pengaturan/kategori.tsx`: daftar kategori dipisah tab Pemasukan/Pengeluaran, tiap item menampilkan ikon+warna+nama. Komponen `src/components/CategoryForm.tsx` untuk tambah/edit: field nama, pilihan tipe, pemilih ikon dari set @expo/vector-icons, dan pemilih warna dari palet preset. Aksi hapus meminta konfirmasi; bila kategori dipakai transaksi tampilkan alert penolakan (berasal dari guard `deleteCategory` di categoryRepo). Validasi nama unik per tipe. Definition of done: CRUD kategori berfungsi dan persist; kategori baru langsung muncul di CategoryPicker pada form transaksi; kategori yang sedang dipakai tidak bisa dihapus; nama duplikat per tipe ditolak dengan pesan jelas.
Penjadwalan notifikasi harian yang dapat diaktifkan/dinonaktifkan dan diatur jamnya.
Lihat isi perintah
Implementasikan reminder harian dengan expo-notifications. Buat `src/lib/notifications.ts`: fungsi `requestPermission()`, `scheduleDailyReminder(hour, minute)` (pakai trigger harian berulang; batalkan jadwal lama sebelum menjadwalkan baru), dan `cancelDailyReminder()`. Di `app/pengaturan/index.tsx` tambahkan Switch 'Pengingat Harian' dan pemilih jam (default 20:00); simpan preferensi (aktif + jam) di AsyncStorage. Isi notifikasi: judul 'Catat keuanganmu hari ini' dan body ajakan mencatat. Tangani kasus izin ditolak dengan menampilkan info dan tombol membuka setelan sistem. Definition of done: mengaktifkan switch menjadwalkan notifikasi harian yang benar-benar muncul pada jam terpilih (verifikasi dengan menjadwalkan 1-2 menit ke depan), menonaktifkan membatalkannya, dan preferensi tetap ada setelah restart.
Layar laporan berisi pie/donut komposisi pengeluaran, bar pemasukan vs pengeluaran, dan rincian per kategori.
Lihat isi perintah
Bangun layar Laporan `app/(tabs)/laporan.tsx`. Tambahkan selector bulan (mundur/maju). Ambil data dari `getMonthlySummary(year, month)`. Tampilkan: (1) donut/pie chart komposisi pengeluaran per kategori memakai react-native-gifted-charts dengan warna kategori; (2) daftar kategori diurutkan dari nominal terbesar menampilkan nominal (formatRupiah) dan persentase; (3) kartu total pemasukan vs pengeluaran; (4) bar chart perbandingan pemasukan vs pengeluaran. Sediakan toggle untuk melihat komposisi Pengeluaran atau Pemasukan. Tampilkan empty state bila tidak ada data. Definition of done: grafik menampilkan angka yang cocok dengan data transaksi (jumlah persentase mendekati 100%), ganti bulan memperbarui semua grafik, tampilan benar pada berbagai ukuran layar, dan tidak crash saat data kosong.
Menyelesaikan pengaturan (tema, ekspor CSV, hapus data), onboarding singkat, dan konfigurasi build EAS.
Lihat isi perintah
Finalisasi aplikasi dan siapkan rilis. Di `app/pengaturan/index.tsx` lengkapi: tautan ke Kategori dan pengaturan Reminder, pemilihan tema (Terang/Gelap/Ikuti Sistem) via ThemeContext di `src/theme/`, info versi, tombol Ekspor Data ke CSV (susun CSV berisi tanggal, tipe, kategori, nominal, catatan lalu bagikan via expo-sharing), dan tombol Hapus Semua Data dengan konfirmasi ganda yang mengosongkan database. Buat onboarding 2-3 slide `app/onboarding.tsx` yang hanya tampil sekali (flag AsyncStorage) menjelaskan input, reminder, dan laporan. Terapkan tema gelap secara konsisten di seluruh layar. Konfigurasi `app.json` (nama, ikon, splash, bundle identifier iOS & package Android) dan `eas.json` (profil build development/preview/production). Definition of done: `eas build` menghasilkan build internal untuk Android (APK/AAB) dan iOS (TestFlight/simulator), ekspor CSV berisi seluruh transaksi, tema gelap tanpa teks tidak terbaca, dan onboarding hanya muncul pada peluncuran pertama.
Risks
- Notifikasi lokal di Android bisa tertunda atau tidak muncul akibat optimasi baterai/Doze mode dari OEM tertentu, sehingga reminder kurang andal.
- Tanpa backup cloud, data pengguna hilang jika aplikasi di-uninstall atau ganti perangkat; mitigasi sementara lewat ekspor CSV.
- Performa agregasi dan daftar dapat menurun saat jumlah transaksi sangat besar bila query tidak terindeks dengan baik.
- Input dan format nominal Rupiah rawan bug (mask ribuan, pembulatan); perlu konsisten memakai integer dan pengujian.
- Proses review App Store/Play Store serta izin notifikasi dapat memperlambat rilis MVP.
Open Questions
- Apakah versi berikutnya perlu dukungan multi-dompet/akun (kas, bank, e-wallet) dan transfer antar akun?
- Perlukah fitur anggaran (budget) per kategori dengan peringatan saat melewati batas?
- Apakah cukup Rupiah saja, atau perlu multi-mata uang untuk pengguna tertentu?
- Apakah pengguna membutuhkan backup cloud dan sinkronisasi antar perangkat, dan bagaimana model akun/privasinya?
- Perlukah keamanan tambahan seperti kunci PIN atau biometrik untuk membuka aplikasi?