Independent Work · New Product

Designing for One: Daily Brief

A morning app designed around time anxiety, built in a weekend, and changed through a month of daily use.

Designed for My own morning routine, especially on days when time anxiety made one appointment dominate everything around it.

Role
Product design, prototyping, and implementation
Scope
Problem framing through shipped PWA and cross-device iteration
Result
Installable morning brief used on iPad and Android
Use period
Roughly one month of daily use in June and July 2026
A comparison of the shipped Daily Brief PWA with three future-vision mobile concept screens showing a workday, Sunday view, and Sunday Reset.
The shipped Daily Brief PWA alongside a future-vision mobile concept. The concept uses illustrative content and is separate from the product used during the documented June-July 2026 period.

The problem

The problem

I already had two tools that worked for me: a digital planner for the month and week, and a handwritten journal for whatever needed more space. What I did not have was a lightweight way to orient myself to a single day.

That gap mattered most when work or life got loud. The planner could start to feel like another thing to manage, and once I stopped opening it I lost the thread of what the day actually looked like. The journal survived those stretches because it never asked me to optimize anything. I wanted something between the two, with enough structure to show me the shape of today without creating another system I had to keep up with.

There was also a more specific constraint. My ADHD often shows up as time anxiety. If I have one appointment later in the day, I can spend the hours before it mentally counting backward instead of experiencing everything else around it. The product therefore had a narrow job: give me a short morning read that showed what was ahead without making any one obligation feel larger than the rest of the day.

Design constraint

Designing against manufactured obligation

Because I was the only user, I could start by identifying the conditions that would make me stop using the product. That led to what I called the guilt audit, which asked whether a feature created an obligation the product did not actually need.

Streaks failed that test. Overdue labels failed it. Automatically carrying yesterday's unfinished tasks into today failed it. Countdown language failed it too. The product could acknowledge difficult appointments and unfinished tasks without increasing their urgency through the interface itself.

The calendar became the clearest example. Instead of telling me that an appointment was three hours away, then two, then one, the brief showed events as points across the day. A 9:30 appointment could be important while remaining one part of a larger day.

Shape over countdown Two panels. On the left, the ruled-out pattern: one appointment box looms large with "in 3 hrs, in 2 hrs, in 1 hr" counting down while the rest of the day fades to nothing. On the right, what the brief actually shows: four events as equal points along one horizontal timeline, none dominant. THE CORE DECISION Shape over countdown Countdowns made one appointment dominate the morning, so the brief showed events as equal points across the day. WHAT I RULED OUT 9:30 appointment in 3 hrs . in 2 hrs . in 1 hr everything else loses context noon the rest, faded out WHAT THE BRIEF SHOWS 9:30 12:00 2:00 5:00 Events stay in context with the rest of the day.
The brief shows events as points across the day rather than counting down to the next appointment.

Information architecture

Designing the morning

I designed the brief as a short vertical read rather than a dashboard that expected continued attention. The order of information was part of that design.

Personal orientation came before detailed calendar information. From there, the page moved into the practical shape of the day, while sections that were useful only occasionally stayed collapsed until I wanted them. Some information belonged in the morning read every day, while material such as the fuller routine or Sunday reflection needed to remain available without asking for attention each time the page opened.

The morning read, in order A vertical stack of the brief's sections in the shipped display order, each tagged as read daily, conditional by day type, collapsed by default, or shown only on Sundays: today's header, a conditional day-context row, grounding thought, yesterday's morning paper, the stars today, your morning, what's on today, to-do list, and Sunday reset. THE ARCHITECTURE The morning read, in order The sequence moves from orientation and intention through reference content into the practical shape of the day. Today's header date, day type, weather DAILY Day context working hours or all-day events CONDITIONAL Grounding thought freestanding, the first thing you absorb DAILY Yesterday's Morning Paper always present, opens on a tap COLLAPSED The stars today a friend who reads charts, not an API COLLAPSED Your morning rhythm as reference, not a checklist COLLAPSED What's on today events as a shape, not a countdown DAILY To-do list clears each new day, no carry-forward guilt DAILY Sunday reset three wins, three releases, one moment SUNDAYS Daily sections stay open; reference sections collapse until needed.
The brief's default order and visibility rules.

The voice had to fit the same experience. I called it the "you-after-coffee" voice: grounded, familiar, lightly coach-like, and deliberately separate from productivity cheerleading or affirmation language.

In the second version, the generated grounding thought used the season, how full the day was, and personal context as inputs. The context shaped tone and relevance without turning into a list of things the brief needed to tell me about myself.

I had also planned to pull horoscope content from an API. Once I saw it next to the rest of the experience, generic horoscope copy felt disconnected from the voice, so I replaced it with "the stars today" generated from the same contextual inputs.

The build

Building the first version

I wrote the first specification on a Friday evening and had a working version using my real Google Calendar and weather data by Saturday morning. I built the initial version inside Cowork, Claude's workspace, which let me work on the interface and use it in the same environment. That shortened the feedback loop enough for me to test the central interaction idea before putting effort into the final app container.

Once the experience was useful enough to keep opening, I converted it into an installable PWA for my iPad and Android phone so it could become part of an ordinary morning rather than something I accessed through a chat workspace.

Calendar logic

Making the day accurate

The first calendar model excluded work because I wanted the brief to remain a personal space. Using it on normal workdays exposed the problem: a Monday could contain a full day of meetings while the brief described the day as open because my personal calendar happened to be empty.

Daily use showed that calendar source alone was the wrong classification. What mattered was the role each calendar played in my day.

Personal events could appear normally and contribute to the shape of the day. My partner's events could appear with clear attribution without becoming my tasks. Work blocks could affect whether the day was light or full without filling the personal timeline. Together, those rules gave the brief enough context to describe the day accurately while keeping work contained.

Calendar roles determine what appears Each calendar is given a role that decides how its events are treated. Personal events are shown and count toward the day's shape. A partner's events are shown, tagged as his, and never treated as the user's task. Work time-blocks stay out of the personal timeline but still inform the day's shape. Arrows show the three roles feeding into what the brief shows: a "what's on today" list with the partner's events tagged, and a single contained working-hours banner. SEPARATING WHOSE DAY IT IS Calendar roles determine what appears Personal, partner, and work calendars affect the brief differently. EACH CALENDAR HAS A ROLE WHAT THE BRIEF SHOWS RULES Personal . mine shown, counts toward the shape Partner . his shown, tagged, never my task Work . time blocks out of the timeline, shapes the day WHAT'S ON TODAY My events, shown in full. Partner tags what's his, not mine. WORKING HOURS One work logo, hours from the block. Personal and partner events can appear in the timeline. Partner events stay his, not my tasks. Work blocks shape the day without filling the timeline.
Calendar roles keep the day's shape accurate without turning the brief into a combined task list.

Real use

What daily use changed

I used the brief daily for roughly a month, and several decisions changed only after I encountered them in the morning routine they were meant to support. I swapped the calendar and morning-rhythm sections after seeing the original order in context, and I moved the Sunday reset back to Sunday because showing reflection prompts on Saturday evening made them feel like something I was already late doing.

I also changed to-dos so they cleared with each new day instead of automatically carrying unfinished items forward. Carry-forward behavior is common in task products, but here it recreated the accumulated obligation the guilt audit was meant to prevent.

The calendar model changed through the same process. The first version kept work out of the personal space, but that also made the brief inaccurate on workdays. Regular use made the tradeoff visible in a way the initial specification had not.

During that month, the brief became the first tool I opened in the morning. It did not replace the planner or the journal. It filled the smaller orientation gap between them.

Cross-device iteration

What broke across devices

Using the same PWA on an iPad and an Android phone exposed assumptions I could not see while building in one environment. The clearest example was adding a to-do: on the iPad, typing a task and pressing Return saved it, while on Android the same apparent action did nothing.

The original implementation listened for an Enter keystroke. That matched the hardware keyboard behavior I had been testing, while Android's soft keyboard could express the same user intent differently. I changed the interaction so saving no longer depended on one specific signal. Hardware Enter, form submission, an inserted line-break fallback, and tapping the arrow could all lead to the same save action.

Saving a task across devices Four different ways a keyboard can signal "save this task" across devices, all converging with arrows into a single outcome node that saves the task: a hardware Enter keystroke, a form submit from the Android done key, an inserted line-break fallback, and tapping the arrow button. ONE OUTCOME, FOUR PATHS Saving a task across devices Android and hardware keyboards produced different signals, so the input handled four paths to the same save action. Hardware Enter keystroke . iPad, desktop Form submit . the Android "done" key Inserted line-break . Gboard fallback Tap the arrow button . any device, any state Save the task same save action
Hardware Enter, Android submit, line-break fallback, and tapping the arrow all resolve to the same save intent.

A second issue initially looked like the same bug. I thought the Sunday-reset fields were failing to save on the phone, but they were already saving on every keystroke.

The data was saving correctly; the interface simply gave me no visible confirmation. Pressing Return and seeing nothing happen made a working interaction feel broken. I added a small saved confirmation near the heading and left the persistence logic alone, because changing the save mechanism would have addressed a problem that was not actually present.

Those two issues changed how I checked the product for assumptions about its environment, including keyboard behavior, device input, connectivity, and whether changes in system state were visible enough to trust.

Reflections

Reflections

Starting with the emotional constraint gave me a practical way to make product decisions before I had a feature list. The guilt audit was useful because it was specific enough to reject otherwise normal patterns when they worked against the reason I was building the product.

The month of daily use mattered for a different reason. Several changes were small, but they only became obvious when the brief was part of an actual morning rather than something I was evaluating in isolation.

The cross-device problems added another layer. Designing for one person simplified the feedback loop, but it did not eliminate the variation introduced by different devices and interaction models. The product became more reliable once I stopped treating the environment I had built it in as the only environment it needed to handle.