Horizons

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

Horizons workspace with Today, Week, Month, Year, and Life columns
Productivity2026

Intro

Horizons is a deliberately narrow task app built on one idea: the column is the deadline.

Today, this week, this month, this year, and life provide 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 is finished because it does less.

My role

I designed and built Horizons as a complete web product.

  • Product concept and interaction model
  • Responsive interface and theme design
  • React and TypeScript development
  • Local persistence and period-expiry logic
  • Keyboard, reduced-motion, and accessible interaction support
  • Cloudflare Workers deployment

Solution

The entire product is one workspace with five columns. The time horizon gives each task its context, so no secondary detail panel or project hierarchy is required.

Horizons dark-mode workspace with empty Today, Week, Month, Year, and Life columns
The empty state presents the complete model without onboarding or configuration.

Tasks remain visible across timescales. Today can stay focused while the week, month, year, and life beyond it remain in view.

Horizons dark-mode workspace with tasks organised across five time horizons
Each task gets one piece of metadata: the horizon it belongs to.
Horizons light-mode workspace with empty time-horizon columnsHorizons light-mode workspace with tasks across five time horizons
Light and dark themes preserve the same hierarchy and interaction model.

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. Tasks in Today, Week, Month, and Year receive a period key when created. When Horizons loads or returns to the foreground, it compares that key with the current period and removes expired tasks. Life has no expiry.

This avoids background jobs, timers, reminders, and scheduled deletion. Tasks and settings stay in local browser storage, and the app uses native browser capabilities with no account, database, sync layer, or server API.

The implementation uses React, TypeScript, Vite, Vanilla CSS, and in-memory Web Audio synthesis. A static build runs through Cloudflare Workers Static Assets.

Lessons

Restraint needs an explicit rule. “Keep it simple” is too vague. “The column is the deadline” made it clear which features belonged and which ones would weaken the product.

Lifecycle events can replace background infrastructure. Checking periods when the app loads or regains focus gives Horizons the reset behaviour it needs without timers or scheduled jobs.

A small product still needs complete interaction work. Themes, responsive columns, keyboard access, sound, and reduced-motion support matter more when there are so few other features competing for attention.