Bloom
Product • Cloud-Synced Life Planner
Notice: The repository is private while Bloom prepares for a public launch on web, iOS, and Android.
About this project
The problem
Planner apps either sync well and feel like enterprise software, or feel nice and lose your data between devices. I wanted one that does both, and that does not punish you for missing a day.
My role
Sole developer and designer. Data model, sync engine, authentication, theming, and every screen.
What I shipped
- Shipped a finished product, not a prototype: seven connected modules, three themes, custom accent colours, achievements, and an installable PWA build.
- Built an offline-first sync engine: writes land in local state immediately, then sync to Postgres on a debounce, so the interface never waits on the network.
- Wired Realtime subscriptions so a change on one device shows up on every other signed-in device, including theme and settings.
- Secured user data with Row Level Security across 10 Postgres tables, isolating every account at the database level rather than trusting client-side checks.
- Replaced streak counters with a forgiveness-based consistency score, because a single missed day should not erase two months of work.
- Added a global Ctrl/Cmd+K quick-add that creates a task, event, or note from any screen in about two seconds.
Achievements
3 of 4 unlocked
Product From Scratch
Designed and shipped a full life planner end to end, solo. Live right now.
Sync That Disappears
Offline-first writes, debounced cloud sync, realtime across every signed-in device.
Locked at the Database
Row Level Security across 10 Postgres tables. A frontend bug cannot leak another account.
Hidden achievement
Keep playing this project to find out.
Case study
Bloom
Live app: bloom-cal.vercel.app · Sign in with Google.
Summary
Bloom is a planner that holds calendar, tasks, habits, notes, journal, goals, and a focus timer in one place. I designed and built it solo. It is live now, and a public launch on web, iOS, and Android is in progress, which is why the repository is private for the moment.
The problem
Planner apps tend to fall into two groups. Some sync reliably and feel like enterprise software. Others feel good to use and quietly lose your data between devices. I wanted one that syncs properly, works with no connection, and does not make you feel bad for missing a day.
The engineering I care about: sync you never notice
Bloom is offline-first. Every write lands in local state immediately through Zustand and localStorage, then syncs to Postgres on a debounce in the background. The interface never waits on a network round trip, so it stays responsive on bad transit Wi-Fi.
Realtime subscriptions push changes back out to every signed-in device. Add a task on your phone on the bus and it is already on your laptop when you sit down. Theme and settings travel with the account too, not just content.
- Auth: Google sign-in through Supabase Auth.
- Data: PostgreSQL, 10 tables, each protected by Row Level Security. Accounts are isolated at the database level rather than by client-side checks, so a bug in the frontend cannot expose another user's data.
- Offline: PWA with Workbox. The app keeps working with no connection and reconciles when it returns.
- Safety: Markdown notes are sanitized with DOMPurify before render.
Product decisions
Forgiveness-based habit scoring. Streak counters reset to zero the first day life gets in the way, which is exactly when people quit. Bloom uses a 0 to 100% consistency score that dips instead of resetting. It is kinder and it is a more accurate description of how someone is actually doing.
Mood and habit correlation. Log a daily mood and the statistics view shows how it moves alongside your habits over 30 days.
Speed as a feature. A global Ctrl/Cmd+K creates a task, event, or note from any screen in about two seconds. If capture is slow, people stop capturing.
A focus timer that follows you. Start a Pomodoro and a small widget keeps counting as you move around the app, with lo-fi, rain, or fireplace audio.
Tech
- React 18 + TypeScript (Vite)
- Tailwind CSS v4, Framer Motion
- Zustand for state, persisted to localStorage
- Supabase: PostgreSQL, Google Auth, Realtime
- PWA via Workbox, deployed on Vercel
Why it matters
Bloom is the project where I am both the product designer and the engineer. I decide what deserves to exist and then build it: the data model, the sync engine, authentication, theming, and every screen. It is also where I practice shipping like a product team rather than a student, which means a private beta first, then polish, then a public launch.