004
work/cashly
[ case study · in progress ]

cashly — personal finance app

budget organization built on the prism design system

role
creator
team
solo
stack
swift · swiftui · swiftdata · widgets · charts
period
2026 — present
status
● wip
stack
swiftswiftuiswiftdatawidgetscharts
budget categories
0+
widgets
0
data models
0
ios target
0+

title: cashly — personal finance app subtitle: budget organization built on the prism design system role: creator team: solo stack: [swift, swiftui, swiftdata, widgets, charts] period: 2026 — present year: 2026 status: wip order: 4

context

cashly is a personal finance app for budget organization. it's the first real consumer of the prism design system — built to prove that the design tokens and component library work in a real product, not just in a demo.

the goal isn't to compete with nubank or copilot. it's to build the budgeting tool i actually want to use — simple, fast, native, with the specific workflows that matter to someone who tracks expenses daily but doesn't need a full accounting suite.

core features

budget categories — create custom categories with spending limits per month. visual progress bar shows how close you are to each limit.

quick entry — add an expense in 3 taps. category, amount, done. no required fields for notes, tags, or receipts. those are optional.

monthly overview — swift charts integration for spending breakdowns. category comparison month-over-month.

widgets — home screen widgets showing remaining budget, largest category this month, and daily average spend.

the swiftdata approach

cashly is fully swiftdata — no core data migration layer, no realm, no sqlite wrapper.

swift
@Model
final class Transaction {
    var amount: Decimal
    var category: Category
    var date: Date
    var note: String?

    @Relationship(deleteRule: .nullify, inverse: \Category.transactions)
    var category: Category
}

@Model
final class Category {
    var name: String
    var monthlyLimit: Decimal
    var color: String
    var transactions: [Transaction]

    var spent: Decimal {
        transactions
            .filter { Calendar.current.isDate($0.date, equalTo: .now, toGranularity: .month) }
            .reduce(0) { $0 + $1.amount }
    }
}

swiftdata gives us icloud sync for free, @Query for reactive ui updates, and a model layer that feels native to swiftui. the trade-off: less control over the underlying store, and some rough edges with complex queries.

widget design

three widget families, all using the prism design system tokens:

small — remaining budget for the current month. single number, progress ring, category color.

medium — top 3 categories with spending bars. tappable to open the category detail.

large — full monthly breakdown with chart. matches the in-app overview screen.

status

in development. will ship under the byescaleira brand when prism is stable.

by escaleira / 2026