WorkspaceOne place for the things I was keeping in six.

Workspace across four screens: the month timeline under its graded water band, the day sheet, the todo list and the memory library.
Role
Designer & builder
Team
Solo
Built with
React, TypeScript, IndexedDB
Data
Local-first, no account
Year
2026
Overview

Workspace is a personal tool that runs entirely on your own machine: a month timeline, a journal, photos, the things you mean to do, and a memory file you can hand to any assistant. I designed and built it end to end, and I use it every day.

Problem

Six apps each owned one slice of my life, and none of them talked.

A calendar, a habit tracker, a notes app, a photo library, a todo list and a reading log. Each was good at its own slice, and the only place any of it came together was in my head. I wanted one surface where a day is simply a day: what happened, what I meant to do, and the photograph I took of it.

The Workspace timeline: a month grid under a graded water band, with a logged session and an undo bar.
A day is the unit. Everything else is a view of one.
Structure

It had eight tabs. Five is the whole product.

The first build gave every idea I had a tab of its own. Cutting it to five lost nothing, because most of them were not places, they were views of two things: what you mean to do, and what happened. Habits folded into the todo list as repeating rows, and their history moved to the timeline, which is where history lives.

The Workspace todo list: a focus timer above one flat list of tasks, some of them repeating.
One list. A repeating thing is a row with a cadence, not a second product.
What came out

The setup screen went, and the eight categories with it.

The app used to open by handing you eight life areas it had chosen for you. Nobody files their life that way, and the eight I picked were mine. The first area asks for a name and nothing else now, and every screen downstream stopped assuming a shape that was never yours.

The areas sheet in Workspace, with colour-coded areas the user has named.
You name the areas. The app has no opinion about what they should be.
Ownership

Nothing leaves the device unless I ask it to.

This is a life archive, so the default had to be that it stays put. Everything lives in the browser’s own database on the machine in front of you. No account, no server of mine to trust, and backup is one file you download. Sync points at a database you own rather than one I run, and the copy on your machine stays the source of truth.

The Memory library in Workspace: kept notes and images filed under two areas.
A dump folder, on purpose. Sorting is what the compile step is for.
Detail

The band at the top keeps the same hour as this site.

The header is a water photograph graded to the time of day, on the portfolio’s own clock. It is the only decoration in the app, and it earns that by saying something: opening this at two in the morning should not look like opening it at noon. Keeping the type legible on all six skies decided every grade.

The Workspace header band at sunrise, dusk and night: the same water photograph in three grades, with the month title legible on all three.
Sunrise, dusk, night. The same photograph, and the title holds on every one of the six.
Outcome

The screenshots caught what the numbers did not.

More than once I shipped a change every measurement called an improvement, and it looked wrong the moment I opened a picture of it. A button that jumped. A block under the calendar that should not have been there. Building the thing I use daily is the fastest feedback I have, because I am the one who lives with the bad version.

A focus block running in Workspace: the area, the task and a countdown ring.
A focus block is a real session, logged and journalled like anything else.
Workspace on a phone: a book with a saved quote beside the todo list.
The same five tabs on a phone. Nothing is a smaller version of itself.