Skip to study
EW Studio

2021 → 2026 / TaskPilot

Your day, co-piloted.

Your tasks stay on your device; AI is an action you choose.

Role
Product, design direction and engineering lead, built with Claude Code
Timeline
2021 original · rebuilt 19–25 October 2026
Stack
React 19 · TypeScript · TanStack Router · IndexedDB

Live product recording, October 2026. AI actions requiring sign-in are not demonstrated. The capture manifest records each interaction and its limits.

Capture actions, source links and limits

See the phone layoutTaskPilot live phone interface at 390 pixels wide
0.79 → 0.98

README-reported mobile landing performance after prerendering; not a new portfolio measurement.

The rebuild

Keep the spark.
Rebuild the product.

2021 → 2026

TaskPilot began in 2021 as a tutorial-sized React app: a form, four tabs and localStorage. It indexed tasks by id - 1, showed the wrong month, and reversed the stored list every time it rendered. This is a rebuild of it as a real product.

Reconstructed from the archived original source with React 18, esbuild and Dart Sass; the original CRA 4/node-sass toolchain was not rebuilt. Revision and substitutions

2021 source reconstruction → live 2026 product. Same 1440 × 900 viewport, uncropped. Historical layout rendered with compatibility tooling; it does not demonstrate the old services working.

TaskPilot, live 2026 interface
2026 / live product
TaskPilot, 2021 source reconstruction
2021 / reconstruction

The idea

A cockpit for a calmer day.

Natural-language capture, a flight path through the day and one place to plan, focus and review. The orange cockpit pairs Space Grotesk with a quiet task surface.

TaskPilot

Space Grotesk / original SVG mark

Cockpit orange / #FF6B3DSky / #7CC4FF

Brand colours above; text and focus accents adapt for contrast in each portfolio theme. Design source ↗

Three engineering decisions

The constraint shapes
the implementation.

Local-first ownership

Constraint. The 2021 app was a form, four tabs and localStorage, with indexing/date/render-order bugs

Decision. store tasks in IndexedDB with plain JSON import/export, and require no account for core use

Result. offline task management; sync remains a Pro feature for later. AI receives selected fields when invoked, never notes or project names.

Source and evidence limits

taskpilot/README.md → “The idea”; “Decisions worth explaining” → “Local-first, no account”, “The AI sees as little as possible”. The historical counts are context, not a measured privacy/performance result; no sync benchmark exists.

Read the pinned README ↗

First paint before hydration

Constraint. A JavaScript-dependent public landing delays content

Decision. prerender using React renderToString inside the built app and hydrate with the correct markers

Result. reported mobile Lighthouse performance 0.79 → 0.98.

Source and evidence limits

taskpilot/README.md → “Prerender and hydrate, not a server framework”; “How it is built” names scripts/prerender.mjs. Preserve the score scale and mobile/landing scope.

Read the pinned README ↗

Drag by destination, not by pixels

Constraint. The default keyboard sensor only nudges cards

Decision. a coordinate getter jumps between drop zones for board, matrix and calendar

Result. a complete keyboard path, not just a mouse alternative in the marketing copy.

Source and evidence limits

taskpilot/README.md → “Keyboard drag for everyone”; “A walk through” → Board describes Space/arrows/Space. taskpilot/docs/design-brief.md → “Motion” specifies 150–220ms list/board transitions; this is a design timing, not a keyboard speed measurement. No numerical keyboard benchmark is documented; do not invent one.

Read the pinned README ↗

Architecture

Follow one request.

Quick add01Local parser02IndexedDB03Board / calendar04Undo05Quick addLocal parserIndexedDBBoard / calendarUndo
Quick add is parsed locally and stored through Dexie in IndexedDB. Board, matrix and calendar read the same tasks. Optional AI sends selected task fields through a chosen provider; validated streamed items enter the calendar with Undo. Notes and project names are excluded.

Quality proof / evidence, with scope

Show what was checked.

App evidence

README reports Lighthouse 98–100 and zero axe violations.

Repository report, read 26 October 2026. These app scores were not rerun for this portfolio.

Commands and evidence in the README ↗

This portfolio page

Static HTML, deferred decorative Stage, explicit media intent and complete reduced-motion content.

performance
98/100
accessibility
100/100
best practices
100/100
seo
100/100

Lighthouse mobile, light theme, cold cache, simulated throttling. Measured 2026-10-26. Gzip static export on localhost.

Eight page cases across Chromium/WebKit, phone/desktop and both themes; two axe audits with zero violations. WebKit playback and real Safari hardware remain unverified.

Read the dated portfolio check results ↗

The honest next step

What remains.

Sync is Pro planned. Core task management needs no account; browser storage still needs a backup through JSON export.

Next / PixeA light table for creative direction. ← Back to studio index