Skip to content
2 min read

TaskDashboard: Designing a Local-First Project Manager

A practical look at hierarchical task modeling, derived views, local persistence, and the operational details behind a portable desktop application.

  • #local-first
  • #react
  • #developer-tools
  • #open-source

TaskDashboard started with a need for a focused project tracker that could run locally and represent dependencies clearly. The design centers on projects, user stories, and tasks, with enough context to understand why work is blocked.

Model the work before choosing the view

A flat list is useful for immediate actions, but it can lose the relationship between a task and the initiative it supports. TaskDashboard uses a hierarchy of projects, user stories, and tasks so that context remains available when navigating the work.

A conceptual illustration of software portability featuring a glowing USB drive containing the application and database, plugged into a transparent laptop.
A hierarchy connects tasks to the initiatives and projects they support.

Status and dependency information serve different purposes. A task can be blocked because another item is incomplete, and the interface should make that relationship visible instead of relying on a free-text note alone.

Derive useful views from a consistent model

The implementation uses React and TypeScript for the interface, Zustand for application state, and Dexie over IndexedDB for local persistence. Electron provides the desktop shell.

Dashboard views should be derived from the stored model where practical. Keeping separate copies of the same status or progress calculation creates synchronization work and makes defects harder to diagnose.

A clear boundary between persistence, derived state, and presentation helps keep those calculations testable as the interface changes.

Treat local persistence as an operational choice

Local-first storage allows the core workflow to run without a remote application backend. The local database still needs recovery planning: schema changes, failed writes, exports, and imports are part of the product.

Local storage is not itself a backup. A portable application also needs an explicit strategy for its data directory; packaging an executable does not automatically make its state portable.

An abstract 3D visualization of the data hierarchy, showing Projects splitting into User Stories and Tasks, with visual indicators for blocked items.
A portable desktop application needs an explicit data-location and backup strategy.

The portable build places application data alongside the executable through explicit configuration. That simplifies moving the application, provided it is closed and its files are copied consistently. Exported backups remain useful for recovery and migration.

Keep the scope deliberate

A local tool trades shared, continuously synchronized collaboration for simpler deployment and direct control of its data. That tradeoff fits some personal workflows; it should be reconsidered if multi-user editing becomes a requirement.

The project reinforced a familiar architectural lesson: the storage and deployment model should follow the user's workflow, including how they recover their work when something goes wrong.