Project / app experiment

Just Spent

Just Spent started with one simple idea: tell Siri or Gemini something like "I just spent 20 dollars for groceries," and let the app log the expense for you. It is a native iOS and Android experiment around making everyday expense tracking feel as quick as speaking a sentence.

Project stage

Cross-platform prototype

Native iOS and Android foundations built around voice-first expense capture, multi-currency tracking, and local storage.

Test status

425 / 428 passing

The repo keeps test status visible across iOS and Android, so the remaining reliability work is easy to track.

Architecture

Local-first native apps

SwiftUI/Core Data on iOS and Kotlin/Compose/Room on Android, with shared ideas for currency data, voice parsing, tests, and assistant entry points.

What it does

Expense tracking designed around the moment you spend.

The app is not trying to become a heavy finance dashboard first. It starts with the most common problem: people forget to record expenses because opening a form takes too long. The real product bet is that voice assistants can make that capture step almost instant.

Voice expense capture

The intended flow is to tell Siri or Gemini, "I just spent 20 dollars for groceries," and have the app create the expense automatically.

Multi-currency tracking

Expenses can be grouped by currency. The app uses a default currency from the device locale and creates currency views when new currencies appear.

Fast categorization

Common words like coffee, fuel, taxi, grocery, rent, medicine, books, and shopping map to useful spending categories.

Local app storage

The product is built around local persistence: Core Data for iOS and Room for Android. That keeps the basic expense history available without a server.

Assistant entry points

Siri/Shortcuts, Android voice, shortcuts, and App Functions are the planned integration surfaces for assistant-driven logging.

Test-heavy development

The project uses unit, UI, integration, and local CI checks as a major part of the experiment, not as an afterthought.

Build details

Two native apps, one product idea.

iOS app

SwiftSwiftUICore DataSiriKitXCTest
  • SwiftUI screens for onboarding, single-currency and multi-currency expense views.
  • Core Data repository layer for creating, listing, deleting, and paginating expenses.
  • Voice command parsing, currency detection, number phrase parsing, and Siri shortcut support.
  • Current status docs show 105/105 unit tests and 80/81 UI tests passing.

Android app

KotlinComposeRoomApp ActionsJUnit
  • Jetpack Compose screens for expense lists, filters, onboarding, settings, and voice entry.
  • Room database, DAO, repository, preference, permission, and lifecycle layers.
  • Voice command processor, speech recording manager, shortcuts, and Android App Functions schemas.
  • Current status docs show 145/145 unit tests passing, with two remaining phone UI test failures in the edit flow.

Shared project system

Local CIFastlaneGitHub ActionsDocs
  • Shared currency and test data support cross-platform consistency.
  • Local CI scripts are documented for fast checks and full checks.
  • Release automation docs exist for TestFlight and Play Store workflows.
  • Deployment is still a planned milestone, so the public page should not imply a finished store release.

Current blockers

The useful unfinished work is visible.

The repo does not show a broken idea; it shows a prototype that reached the point where the remaining work depends heavily on the assistant platforms becoming easier to trust, test, and ship.

01

Siri was not ready for the intended flow

The goal was natural voice logging through Siri, not just opening the app. At the time, Siri was not reliable enough for that full "I just spent 20 dollars for groceries" path, so the iOS AI integration is waiting for newer Siri and App Intents improvements.

02

Android assistant testing became too heavy

The Android idea moved toward Gemini and app actions, but the Play Console testing and setup path became a blocker before the flow could be validated cleanly end to end.

03

iOS multi-currency UI test

One UI test still fails when checking that all expected currency tabs appear from test data. The docs say the test data exists, so the next step is to inspect UI state, accessibility identifiers, and tab generation timing.

04

Android edit dialog tests

Two phone UI tests still fail around the edit dialog: one cannot find the Cancel button quickly enough, and one checks category dropdown options before the dropdown appears reliably.

05

Phone-only Android testing

The app is phone-only. A tablet emulator caused many false failures, so CI should consistently use a phone AVD such as a Pixel profile.

06

Release readiness

The deployment guides and Fastlane lanes are useful, but the current roadmap still places store submission, beta testing, and post-launch monitoring in planned work.

Next steps

What would move the app forward.

Restart the iOS assistant work when the newer Siri/App Intents direction is ready enough for a real voice-to-expense flow.

Revisit Android Gemini integration with a clearer Play Console testing path and less setup friction.

Finish the remaining UI test failures and update the status docs after a clean run.

Lock Android CI to a phone emulator and add validation so tablet AVDs are not picked accidentally.

Decide whether the project should stay a portfolio experiment or move toward a real beta release after assistant logging works.

Why this project matters

A practical AI-assisted product engineering experiment.

Just Spent is useful as a product idea, but it is also useful as a development record: architecture, test plans, local CI, platform-specific implementation, and release automation all live in one cross-platform app experiment.

The important part is not claiming that AI magically replaces engineering. The important part is using AI to move faster while still checking the work through tests, platform behavior, documentation, and honest status tracking.