Taskuadro began with a practical question: how can a task app help me put an idea down and return to the work in front of me? I designed a board with four working states: Soon, In Progress, Later, and Completed. Each gives a task a clear place without asking the user to plan every detail immediately.
I developed the app independently in Swift and SwiftUI, from the interaction design and task model to local persistence, iCloud synchronization, testing, and release. My focus was a compact daily workspace where capturing, moving, and reviewing tasks could share the same screen.
The board in use
The four regions reflect how I move through work. Soon holds near plans, In Progress keeps active work visible, Later stores ideas for another time, and Completed acknowledges what is finished. The arrangement combines a view of current work with space for tasks that can wait.
Double tapping a region opens a new task. Cards can be dragged between regions or placed before another card to change their order. I kept editing close to the board, with a sheet for the title and durations, tactile feedback for actions, and confirmation before deletion.
Make time part of the task
A task can record both an estimated duration and an actual duration. These are entered manually and displayed together on the card, including in History. The comparison stays attached to the work it describes.
I wanted estimation to be a small part of starting. Recording an expectation gives the user something concrete to revisit afterward. Keeping both values visible supports reflection on how long familiar tasks take, without requiring a separate reporting workflow.
Preserve the meaning of completion
I modeled a task’s identity, modification time, and completion date separately. Its UUID identifies the same task as it moves. Its modification timestamp helps compare versions. Its completion date determines where finished work belongs in History.
Moving a task into Completed records that day; moving it back into active work clears the date. The archive routine retains today’s completed tasks on the board and groups earlier work under its recorded completion day. History supports reviewing, editing, and deleting those records.
Keep changes connected across devices
The app encodes the board and archive as JSON in UserDefaults and synchronizes through NSUbiquitousKeyValueStore. Local data provides the starting state, while cloud updates are checked at launch, when the app becomes active, and after external change notifications.
The merge logic compares tasks by UUID and modification time. I implemented version selection, duplicate filtering, deletion handling, and ordered list reconstruction so synchronization accounts for task placement as well as text. Editing or removing a task saves the local state and pushes the revised data.
Test the rules behind the interface
I added XCTest coverage for task creation, movement, ordering, editing, deletion, and archive behavior. Cases address inserting before an anchor, moving between regions without duplicating a task, retaining today’s completed work, and repeating an archive check on the same day.
Taskuadro brought product design and data modeling into the same set of decisions. A simple board depends on consistent rules for what a task is, where it belongs, and which day its completion represents. Working through those details shaped the app as much as the four visible regions.