You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Keeping people in mind is not a spreadsheet job. The owner wants a private
iPhone surface where the people they add are visible as floating bubbles —
closer relationships larger — and each person has a dated log of the things
that actually happened.
What
Add, edit, and remove people with name, circle, closeness, hue, optional
birthday, how you met, and standing notes.
A constellation home: drifting lanterns sized by closeness.
A searchable list fallback and a frozen layout when Reduce Motion is on.
Per-person chronological logs with kind, date, and body.
One local JSON document. No account. No network.
Out
Contact import, iCloud, notifications, photos, messaging, a web client,
scoring closeness from activity.
How
SwiftUI app + KithCore document/store, XcodeGen project, XCTest for the
document and the main add-person / add-log path.
Design
Design
Kith is a single-document iPhone app.
flowchart LR
Constellation --> Person
Person --> Log
Store[(kith-v1.json)]
Constellation --> Store
Person --> Store
Log --> Store
Loading
KithDocument owns people and entries. Mutations are methods on the
document so they can be tested without SwiftUI.
KithStore is an actor that reads and writes Application Support with
complete file protection.
AppModel is the @MainActor owner. --ui-demo and --fresh-demo
replace the on-device file so tests never touch real notes.
Bubble size is a pure function of closeness. The field is a small
repulsion / wander simulation; reduced motion freezes it.
No backend, no CloudKit, no HealthKit.
Specs
people-and-logs/spec.md
People and logs
Requirements
Requirement: People are explicit
A person SHALL have a name, a circle, a closeness from 1 to 5, a hue, and
MAY have a birthday, how-we-met text, and standing notes. Closeness SHALL
NOT be inferred from recency or log volume.
Scenario: Closeness is set by the person
WHEN a person is saved with closeness 4
THEN their constellation lantern uses the diameter for closeness 4
Requirement: Logs belong to one person
An entry SHALL have a person, a kind, a happened-on date, and a body. A
person page SHALL list that person's entries newest first.
Scenario: A hangout is recorded
WHEN a hangout entry is added for Maya on a given date
THEN Maya's page shows that hangout and last contact becomes that date
Requirement: Data stays on the device
The document SHALL load and save from the app container. Launch arguments --ui-demo and --fresh-demo SHALL NOT read or write the real document.
Scenario: Empty launch
WHEN the app launches with --fresh-demo
THEN the constellation is empty and invites adding someone
Spec-driven tracking issue. All design content lives here; no local openspec/ docs.
Spec-driven change:
device-first-constellationProposal
Device-first constellation
Why
Keeping people in mind is not a spreadsheet job. The owner wants a private
iPhone surface where the people they add are visible as floating bubbles —
closer relationships larger — and each person has a dated log of the things
that actually happened.
What
birthday, how you met, and standing notes.
Out
scoring closeness from activity.
How
SwiftUI app +
KithCoredocument/store, XcodeGen project, XCTest for thedocument and the main add-person / add-log path.
Design
Design
Kith is a single-document iPhone app.
KithDocumentownspeopleandentries. Mutations are methods on thedocument so they can be tested without SwiftUI.
KithStoreis an actor that reads and writes Application Support withcomplete file protection.
AppModelis the@MainActorowner.--ui-demoand--fresh-demoreplace the on-device file so tests never touch real notes.
repulsion / wander simulation; reduced motion freezes it.
No backend, no CloudKit, no HealthKit.
Specs
people-and-logs/spec.md
People and logs
Requirements
Requirement: People are explicit
A person SHALL have a name, a circle, a closeness from 1 to 5, a hue, and
MAY have a birthday, how-we-met text, and standing notes. Closeness SHALL
NOT be inferred from recency or log volume.
Scenario: Closeness is set by the person
Requirement: Logs belong to one person
An entry SHALL have a person, a kind, a happened-on date, and a body. A
person page SHALL list that person's entries newest first.
Scenario: A hangout is recorded
Requirement: Data stays on the device
The document SHALL load and save from the app container. Launch arguments
--ui-demoand--fresh-demoSHALL NOT read or write the real document.Scenario: Empty launch
--fresh-demoSpec-driven tracking issue. All design content lives here; no local openspec/ docs.