Brian Duffy

Work

Plainly

In development

A calm daily planner for anyone who finds most planning apps harder work than they should be, built on the principle that a missed day is information rather than failure.

Plainly's daily view in the default Honey palette, dark mode

Summary

Plainly is a calm, private daily planner for routines, tasks and notes. It was designed with ADHD in mind, and for anyone who finds most organisation apps more stressful than helpful. It has no streaks, no confetti, no mascot and no guilt mechanics, and your data stays on your device unless you choose to sync it.

I built it on my own and am now preparing it for release.

The problem

Almost every productivity app is built on shame: streaks that break, counters that reset, a character who is disappointed in you. For the people Plainly is for, that is not motivating. It is the exact mechanism that gets the app deleted in week three.

Removing the shame is easy to say and hard to build, because it is not one feature. It is a constraint on every part of the product: counts that only go up, no red anywhere, notifications that state a fact once and never nag, and wording that reads like a well-made tool rather than a therapist.

Private by design

Privacy is the second principle. The app works fully offline with no account, and everything you write stays on your own device. Sync across devices is opt-in: you only sign in if you want it. Nothing you write is analysed, used for anything else or sold, and you can export all of it to a single file whenever you want.

What I built

I built all of it: local-first data, the routine and task model with versioning, the calendar and statistics views, notes, categories, opt-in sync with row-level security, the installable mobile app, and the reminder system.

Reminders were the hardest part and the design is worth stating. Notifications are opt-in per item rather than per type, each carrying its own time, because a per-type default silently eats reminders the user meant to get. Items sharing a time coalesce into one notification, which is the only real defence against volume - “one per item per day” still lets fifteen through. And completion suppression happens in the scheduler by not sending at all, rather than in the service worker by receiving and staying silent, because a worker that shows nothing gets the browser’s own “this site has been updated in the background” notice displayed in its place.

Technical detail

Data lives in IndexedDB on the device, and the app is fully functional offline with no account. Sync is opt-in and additive: Supabase over HTTPS, with row-level security and safe handling of more than one user on the same device.

Shipped as a static bundle on Cloudflare Pages, a Tauri desktop application, and an installable progressive web app. Push payloads carry no titles, because they pass through third-party push services on the way to the device.