Lewati ke konten
Semua proyek
Kode di GitHubMasih aktif dikembangkanDeveloper tunggal, proyek pribadiJun 2026 – sekarang

HitungUang

Pencatat pengeluaran Android offline-first yang menyimpan semuanya di perangkat: tanpa akun, tanpa server, tanpa sinkronisasi. Pemindaian struk dan grafiknya berjalan lokal.

HitungUang
KotlinJetpack ComposeDagger HiltRoom DBDataStoreWorkManagerGoogle ML Kit

Masalahnya

Sebagian besar aplikasi pencatat pengeluaran meminta Anda membuat akun dan mengunggah riwayat pengeluaran ke server orang lain, lalu tetap butuh koneksi hanya untuk dibuka. Saya ingin tahu apakah versi yang tetap berguna bisa ada tanpa server sama sekali, dan apa harga yang harus dibayar sebagai gantinya.

Yang ingin saya bangun

Membangun aplikasi keuangan yang tetap jalan meski mode pesawat menyala terus, menyimpan setiap catatan di perangkat, dan tetap membuat pencatatan transaksi cukup cepat sampai saya sendiri mau terus memakainya.

Pendekatan

Aplikasi Compose native di atas Room, dengan seluruh fiturnya dibangun mengelilingi penyimpanan lokal. ML Kit membaca teks struk di perangkat dan mengisi awal transaksi yang dikonfirmasi atau dikoreksi pengguna sebelum disimpan. Grafik digambar langsung dengan Canvas alih-alih menarik library chart. WorkManager menangani pemeliharaan di latar belakang, dan backup serta restore lewat arsip ZIP supaya data tetap milik penggunanya.

Gambaran umum

Aplikasi keuangan pribadi Android native tanpa backend sama sekali. Transaksi tinggal di Room di dalam perangkat, aplikasinya terkunci di balik PIN atau biometrik, struk dipindai dengan OCR on-device, grafik pengeluaran digambar dengan Compose Canvas, dan backup diekspor ke berkas ZIP yang dipegang penggunanya. Belum dipublikasikan ke Play Store, tapi kodenya ada di GitHub dan masih terus saya kembangkan.

Arsitektur

Clean Architecture feature-first dengan lapisan domain di antara UI Compose dan Room. Dagger Hilt untuk dependency injection, Room dengan KSP untuk basis data lokal, DataStore untuk preferensi, WorkManager untuk pekerjaan terjadwal, ML Kit untuk pengenalan teks di perangkat, dan AndroidX Biometric untuk kunci aplikasinya.

Yang berhasil dirilis

  • Berfungsi penuh tanpa perlu izin jaringan: Room untuk penyimpanan, kunci PIN dan biometrik, dan tidak ada akun yang harus dibuat.
  • Pemindaian struk on-device lewat ML Kit, dengan hasil bacanya selalu ditampilkan untuk dikonfirmasi sebelum disimpan.
  • Backup dan restore sebagai arsip ZIP yang dipegang pengguna, dengan migrasi skema yang tertutup tes sehingga proses impor tidak bisa membuang catatan tanpa diketahui.

Bagian sulit & trade-off

  • Keluaran OCR itu teks tak berstruktur, bukan field. Memetakan struk ke nominal dan nama merchant butuh heuristik, dan solusi yang jujur adalah selalu menampilkan hasil bacanya untuk dikoreksi pengguna alih-alih mempercayainya.
  • Grafik Canvas custom menghindari satu dependency, tapi hit-testing, label, dan aksesibilitasnya jadi tanggungan sendiri. Library akan jadi pilihan yang benar begitu grafiknya perlu melakukan lebih dari yang sekarang.
  • Tanpa server, satu migrasi basis data yang salah berarti data hilang permanen. Tes migrasi jauh lebih berarti di sini dibanding di proyek lain yang pernah saya kerjakan.

Yang saya pelajari

  • Indeks FTS4 milik Room membuat pencarian lokal cukup cepat sampai saya berhenti memikirkannya, dan itu justru intinya.
  • Compose Canvas benar-benar nyaman untuk grafik sederhana, dan jelas jadi alat yang salah begitu interaksinya mulai rumit.
  • Offline-first memindahkan risikonya dari jaringan ke migrasi Anda. Pertukaran itu layak diambil, tapi harganya memang harus dibayar dengan tes.

Rencana berikutnya

  • 1Impor dan ekspor CSV, supaya catatan bisa dipindahkan masuk dan keluar tanpa lewat backup ZIP.
  • 2Transaksi berulang dan anggaran per kategori.
  • 3Merilis build yang sudah ditandatangani supaya bisa dipasang tanpa perlu clone repo-nya.