Horizons
A focused task app that keeps daily work aligned with weekly, monthly, yearly, and lifelong goals.

Intro
Horizons is a task app built around one idea: the column is the deadline.
Today, this week, this month, this year, and life give you enough structure to decide what matters without adding dates, priorities, tags, projects, or another productivity system to maintain.
The goal was a quiet place to write down what needs to be done, complete it, and move on. Horizons feels complete because it does less.
My role
I designed and built Horizons as a complete web product. I defined the five-horizon task model, designed the responsive interface, and built the frontend with React, TypeScript, and Vite.
I built the task system with Hono, Cloudflare Workers, and D1 so tasks sync to each user’s Overhawl account. I also handled timezone-aware task expiry, keyboard and reduced-motion support, sound feedback, theme controls, and deployment.
Solution
Horizons puts every task in one workspace with five columns: Today, This Week, This Month, This Year, and Life. The column tells you how far ahead a task belongs, so you do not need separate dates, priorities, or project structures.

Tasks are grouped by time horizon, so you can focus on today while keeping the week, month, year, and life goals in view.



Process
The starting point was frustration with the maintenance cost of productivity tools. Dates, reminders, priorities, projects, tags, and recurring rules can make organising a task feel like another task.
I reduced the model until only the time horizon remained. Each task is saved with a period based on its horizon and the user’s timezone. When the app loads or returns to the foreground, Horizons checks whether that period is still current. Today, week, month, and year tasks expire; Life tasks remain.
Tasks are stored in Cloudflare D1 and synced through an authenticated Hono API connected to the shared Overhawl account system. Theme and sound preferences stay local in the browser, while task data remains tied to the user’s account. Checking for expired tasks when data is loaded means the app does not need timers or background jobs.
The frontend uses React, TypeScript, Vite, and Vanilla CSS. Sound effects are synthesized in memory with the Web Audio API, and the app runs on Cloudflare Workers Static Assets.
Lessons
Restraint needs a clear rule. “Keep it simple” is too vague. “The column is the deadline” made it easier to decide which features belonged in Horizons and which would add complexity without helping.
A task can expire without a timer running in the background. Horizons checks each task’s time horizon when the app loads or becomes visible again, using the task’s timezone. This gives the app a clean reset without timers or scheduled jobs.
A small product still needs complete interaction design. Themes, responsive columns, keyboard access, sound, and reduced-motion support matter even when the product has only a few features.