Joseph Tseng
All personal projects

Personal project case study

JoPie

A personal and household expense app that combines manual records, shared-cost settlement, and AI-assisted entry in a mobile-friendly Traditional Chinese interface.

Overview and my role

I build JoPie as a personal project around daily and household expense tracking. The app includes monthly summaries, recurring expenses, and shared-cost settlement. Its semantic-entry service lets me work across the frontend, API contract, and persistence boundary.

Problem and constraints

Expense entry needs to work on a phone and handle personal and household records. Natural-language input may omit dates, amounts, categories, or members. Receipt extraction also needs a review step before it becomes an expense record.

Solution

The SvelteKit app uses Supabase for sign-in and expense records, with IndexedDB caching for previously loaded data. Users can enter expenses manually, describe them in text, or review extracted receipt items.

Text entry asks for missing details and saves complete, validated entries automatically. Receipt entry lets users edit or exclude extracted rows and explicitly confirm before saving. Those are separate confirmation flows.

Engineering decisions

The Python/FastAPI semantic-entry service uses LangGraph and Gemini to interpret input while program rules control completeness and writes. Streamed analysis informs the user without becoming the source of truth for persistence.

An unresolved request retains its identifier so the app can check status after an uncertain response. Conversation text stays in modal memory. The interface does not turn an ambiguous result into a success message. Taiwan-local date boundaries keep records aligned with daily and monthly views.

Validation evidence

The repository defines frontend browser checks, service tests, cross-language contract parity checks, and synthetic evaluation fixtures. Fixture evaluation checks authored model outputs and normalization rules; it does not measure live model extraction quality.

Lessons and current limits

AI-assisted entry needs explicit validation and recovery behavior around uncertain requests. Receipt review and automatic text saving need different interfaces because the user confirms different things.

Hosted acceptance, service/schema alignment, and paid-model evaluation remain open work. Synthetic fixtures check normalization rules, so live extraction quality needs separate evaluation.