003
work/prism
[ case study · in progress ]

prism — open source ios toolkit

rebuilding refds-* as a coherent swift package family aligned with the byescaleira brand

role
creator / maintainer
team
solo
stack
swift · spm · swiftui · design system · dependency injection · networking
period
2026 — present
status
● wip
stack
swiftspmswiftuidesign systemdependency injectionnetworking
packages
0
swift version
0
dependencies
0
platforms
0
migration preview
← before
import RefdsUI
import RefdsInjection

// scattered naming, no coherence
let color = RefdsColor.brand
let font = RefdsFont.body

@RefdsInjected var service: APIService

struct RefdsButton: View {
    var style: RefdsButtonStyle
    var action: () -> Void
}

title: prism — open source ios toolkit subtitle: rebuilding refds-* as a coherent swift package family aligned with the byescaleira brand role: creator / maintainer team: solo stack: [swift, spm, swiftui, design system, dependency injection, networking] period: 2026 — present year: 2026 status: wip order: 3

context

over the years i built a family of swift packages under the refds-* prefix — a swiftui design system, dependency injection, networking, shared utilities, and onboarding components. they work and they're public, but they grew organically without a unified vision.

prism is the rewrite. same problems, better decisions.

the problem

the refds-* packages had inconsistent apis, naming conventions that didn't match across packages, and a design system that predated the byescaleira brand. they were useful tools built for convenience, not for coherence.

specific issues:

RefdsUI used one naming pattern, RefdsInjection used another — no unified namespace

→ the design system had colors and typography that didn't align with any brand

→ networking was built on top of alamofire when async/await made that dependency unnecessary

→ shared utilities had accumulated 40+ extensions, half of which were unused

the approach

starting from the design system and working outward:

design system — Prism

the core package. every color, font, and spacing value comes from BRAND.md. the api is designed to feel native to swiftui:

swift
Text("ship hard problems.")
    .font(Prism.Typography.display(.xl))
    .foregroundStyle(Prism.Colors.text)
    .padding(Prism.Space.s4)

dependency injection — PrismDI

rebuilt with a simpler api. one property wrapper, one container, explicit registration:

swift
// registration
Container.register(APIService.self) { LiveAPIService() }

// usage
struct LineupView: View {
    @Injected var api: APIService
}

networking — PrismNet

async/await native. no alamofire. typed endpoints with codable support:

swift
let players: [Player] = try await api.get("/lineup")
let result = try await api.post("/transfer", body: transfer)

utilities — PrismKit

pruned from 40+ extensions down to the 12 that i actually use in every project. if it's not in at least 3 of my apps, it's not in PrismKit.

roadmap

v0.1 — design system + di container (current)

v0.2 — networking layer + shared utilities

v0.3 — component library (buttons, inputs, lists, cards)

v1.0 — stable api, full documentation, cashly ships on it

what's shipping

the packages will land alongside the byescaleira brand launch. cashly and the other personal apps will be the first real consumers — if the design system can't handle a real app, it's not done.

by escaleira / 2026