Catat Uang
Offline-first Flutter finance app with a Go synchronization API



See the app in use
Two-minute recording from the Android emulator with fictional sample data and no audio. It shows offline transactions, bills, backup settings, reopening the app, and first-entry guidance. This offline demo build does not demonstrate cloud synchronization, physical-device acceptance, or a production release.
- Sample transactions and recurring bills in the real Flutter interface.
- Offline entry and data retained after closing and reopening the app.
- Backup settings and guidance for starting with an empty ledger.
My contribution
Implemented the Flutter/SQLite app, Go/PostgreSQL API, explicit synchronization protocols, account recovery, encrypted backups, operational commands and automated backend/mobile verification.
Engineering decisions
- Keep local finance usable without an account; require explicit linking before uploading records.
- Persist synchronization queues and use idempotency keys, version checks and conflict review so interrupted requests can be retried safely.
- Protect bill payments with database transactions, row locks and uniqueness constraints.
- Verify backups and restore on isolated copies; provide cleanup previews before changing retained server data.
Testing & evidence
- The project verification report dated 27 October 2026 records successful Backend and Mobile CI for code 57f956c, including Go race/PostgreSQL, vulnerability checks, container checks and native Android emulator jobs.
- Integration tests exercise two real SQLite ledgers against the Go API, including retry, conflict, payment, reopen and dataset recovery flows.
- An SMTP loopback test covers HTTP recovery requests, outbox delivery, MIME codes, one-time reset and session revocation.
- Source code, the verification report and release gates are available in the public repository. The recorded development APK and CI results do not constitute a public production release.
Current limitations & next steps
Public hosting/HTTPS, provider email delivery, production signing and store release remain pending. Real Android device checks, two-device acceptance and iOS builds still require the corresponding hardware/services. Emulator and CI results do not establish production reliability.
The problem it solves
An offline-first personal finance application built with Flutter and SQLite, backed by a Go/PostgreSQL API. Optional accounts support explicitly linked, manual synchronization of transactions, recurring bills and payment history through persistent outboxes, idempotent retries and conflict review. Includes encrypted file backups, session management, email verification and password recovery. Local implementation and CI verification are complete; public release remains pending.
How it works
SQLite remains the mobile ledger. Users explicitly link local data to an account before manual synchronization through the Go API; account login alone does not upload financial records.
- 01
Flutter → SQLite ledger and persistent sync outbox
- 02
Explicit account linking → manual transaction / bill synchronization
- 03
Go net/http → account isolation, version checks and idempotent operations
- 04
pgx → PostgreSQL transactions, row locks and payment history
- 05
Encrypted email outbox → SMTP worker; encrypted file backup → atomic local restore
Persistent SQLite queues, safe retries, version conflicts and dataset recovery for transactions, bills and payments.
Argon2id password hashing, revocable sessions, password changes, email verification and single-use password recovery through an SMTP outbox.
Database transactions, row locks, unique constraints and idempotency keys protect payment consistency during retries and concurrency.
Encrypted mobile backups with atomic restore; server backup integrity/age checks, isolated restore verification, health checks and cleanup previews.
ReLoop
Circular-Commerce Platform & Escrow Architecture