PERSONAL FINANCE / PRIVATE PRODUCT

Money

Turning years of real bookkeeping habits into a private, local-first, cross-device product that can be recovered.

Role
Product designer and design engineer (service architecture / data migration)
Time
2026 · 24h first release, ongoing
Platforms
Mobile Web / Desktop Web / PWA

One track handles daily recording. The other keeps the data owned and recoverable.

01 / Context

Not another expense UI

The real problem was moving years of private data out of a closed tool while preserving fast mobile entry, desktop analysis, and long-term recoverability.
Early Money desktop ledger prototype
Early prototype

The early demo established the visual direction, but data, sync, and history were still simulated.

Early Money mobile analytics prototype
Early prototype

The early mobile chart validated the monochrome-yellow language while exposing crowded periods and weak state feedback.

01

02 / Framing

Fix the taxonomy before the entry flow

  • Categories represent spending domains; subcategories represent concrete items.
  • One home per item reduces hesitation and analytical noise.
BEFORE场景 × 物品 × 行为

按摩 / 厨具 / 游泳散落多处

AFTER12 个消费领域

一个事项,一个稳定归属

Product brief and category seed

The taxonomy moved from mixed contexts, objects, and behaviors to twelve spending domains.

02

03 / Decision

One PWA, two densities

  • Mobile handles fast entry, search, and refresh.
  • Desktop handles period analysis, drill-down, and organization.
  • No native app and no premature offline-write conflict system.
Money desktop analytics with period navigation, spending trend, and category ranking
Local synthetic build

Desktop keeps period decisions, trend, and category drill-down in one workbench.

Money mobile expense entry sheet with numeric keypad and category choices
Local synthetic build

Recording is a global action; amount, category, item, and date stay in one bottom-sheet flow.

Money mobile analytics with current month trend and category ranking
Local synthetic build

Mobile keeps the same analytical logic while showing only the period and metrics needed for the current decision.

Money mobile search with progressively loaded historical results
Local synthetic build

Search spans notes, concrete items, and categories, progressively traversing full history with stable cursors.

01Responsive PWA
02IndexedDB
03Same-origin API
04Worker
05D1
Architecture record

D1 preserves truth while IndexedDB makes historical content immediately available on-device.

03

04 / System

Immediate locally, truthful in the cloud

Private structured data stays out of the service-worker HTTP cache. IndexedDB handles local reads; Worker and D1 own authentication and truth.
01OPEN
02LOCAL
03VISIBLE
04VERIFY

先显示本机历史,后台静默校验;退出即清除私人缓存。

Caching decision

Read locally, validate in the background, and clear private caches on logout.

记录输入

幂等写入

确认即时刷新

主库读取

分析下钻

周期查询

导出下载

鉴权生成

恢复重建

备份校验

USER / FRONTSTAGE / BACKSTAGE

Service audit

Entry, sync, analysis, export, and recovery are treated as one service chain.

04

05 / Iteration

Real use exposed the feeling of waiting

Mobile slowness was not just API latency. Fixed periods, repeated network reads, and oversized loading states amplified loss of control, leading to full-history cursors, local-first reads, and in-place feedback.
BEFORE整块等待

大型 spinner

AFTER内容保留

原位进度与低对比骨架

Interaction iteration

Large spinners gave way to in-place progress and quiet skeletons.

05

06 / Delivery

Done means the data can come back

  • Real auth, CRUD, search, export, and category management.
  • Migrations, backup, restore, and release smoke checks.
  • A private product with no public registration or invented commercial proof.
0114 tests
02D1 migrations
03CSV / JSON
04Backup
05Restore
06Leak scan
Repository verification

Tests, migrations, export, backup, and restore define what done means.

06