[← back]
kintsugi · KM-2026-0004 · personal, in use

A recovery tracker that never leaves the phone

Kintsugi is a personal iOS app I built for myself and use every day. Streaks, journaling, and a mode for riding out a hard moment. All of it on device, single user, no accounts and no analytics. It is named for the Japanese repair that mends a break with gold.

Swift 6SwiftUI · iOS 26SwiftDataon device
the app, running
01

Built for one person

This is the one project here I did not build to show anyone. I built it because I wanted it, and the design follows from that. It is for one person, it runs entirely on the phone, and nothing about me leaves the device unless I explicitly send it somewhere I own.

That constraint shaped every technical choice. There is no account to make, no server to trust, no analytics counting anything. The only network call in the whole app is an optional backup to a private GitHub repo, and even that only happens if I turn it on.

02

Safe and private at once

The interesting engineering is in keeping the data both safe and private at the same time, which usually pull against each other. Kintsugi does it with three layers of backup that all stay on device or in a repo I own.

keychain

The one value that must never be lost, the date a streak began, lives in the Keychain, because Keychain entries survive even a full uninstall.

json snapshot

Every time the app goes to the background it writes a full snapshot to disk with a SHA256 hash, and keeps the previous one as a fallback. On import it verifies the hash before trusting the file.

optional github

If I want off-device redundancy, it can push an encrypted backup to a private repo over the GitHub Contents API, skipping the write when nothing changed.

where the data lives
SwiftDataon the phoneKeychainsurvives uninstallJSON + SHA256on backgroundoptional · private repo
what it deliberately does not use
No HealthKit, no CloudKit, no CoreML, no third-party SDK. The sentiment scoring on journal entries runs on Apple's on-device NaturalLanguage framework, so even the analysis of what I write stays on the phone.
03

Riding out a hard moment

The mode I am most careful about is the one for a hard moment. There are two. One is a three-level escalation for a crisis, from box breathing up through personal anchors. The other is urge surfing.

Urge surfing is a fifteen-minute timer, but the visual is not a countdown. It is a wave whose height follows an envelope that rises, crests around the two-thirds mark, and falls, because that is the shape an urge actually has. You watch it build and pass instead of fighting it. The math on screen mirrors the thing you are riding out.

04

Private on purpose

Built in Swift 6 with the strictest concurrency checking on and the newest SwiftUI. It is private on purpose. There is no repo to link and no live site, because it holds my own data and only ever needed to work for one person.

It does that. It has for months.