Skip to content

Untwine · Product engineering

One product model. Two native ways to use it.

Shared task state and domain logic, with a Mac shell that respects the platform. Local storage and optional private sync keep the architecture aligned with the product’s promise.

← All engineering work
Role & scope
Independent · iPhone & Mac
Built with
Swift · SwiftUI · SwiftData · CloudKit · WidgetKit
Untwine’s Mac app with sidebar navigation and a task list
The Mac shell uses a sidebar and desktop navigation around the same task model used on iPhone.

The constraint

Untwine is a task app for work that feels difficult to face. Emotional difficulty sits alongside priority and effort in the model; it isn’t just a color applied by the interface.

The app ships on iPhone and Mac. The underlying meaning of a task needs to stay consistent while navigation, editing, and input feel appropriate to each device.

What I share

I separate persisted models, domain logic, view state, and SwiftUI views. The shared layer holds the task data and rules; platform shells handle the interaction around them. On Mac that means a sidebar, menu commands, and keyboard shortcuts.

Sharing the product model avoids maintaining two definitions of the same task. Keeping separate shells still costs implementation and verification time, but it gives desktop interactions room to be properly native.

Privacy as architecture

Task data lives locally in SwiftData. Private iCloud sync is optional and consent-based; the core experience does not require an account with me. Widgets share a constrained view of the task store rather than introducing a separate source of task truth.

That choice also creates platform work: the app and its extensions must agree on their shared container, and iOS and macOS have different sandbox requirements. A shared codebase does not remove the need to verify each shipped target.

What I take from this

The useful boundary is between product rules and platform interaction. I want one definition of what a task means, while leaving each platform enough freedom to make working with it feel natural.