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:
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:
// 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:
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