Case StudyUnwind.
Productivity · 2025

Unwind

Personal OS.

A mobile-first productivity OS that gamifies discipline through XP mechanics, habit tracking, deep work timers, and financial awareness.

TypeSide Project
PlatformMobile Web PWA
RoleDesign + Dev
Year2025
Deep Work Timer ·XP Economy ·Habit Grid ·Pillar Metrics ·Finance Tracker ·Ship Feed ·Skill Trees ·Level-Up Modal ·Deep Work Timer ·XP Economy ·Habit Grid ·Pillar Metrics ·Finance Tracker ·Ship Feed ·Skill Trees ·Level-Up Modal ·

01 · Overview

Problem & Solution

The design challenge and the mechanism built to resolve it.

Problem

Productivity tools are fragmented, causing constant context-switching and no unified view of discipline.

Solution

A single ambient OS with a gamified XP economy rewarding daily discipline across every life pillar.

Principle

Visible progress is the most powerful habit reinforcement loop.

Scope

Frontend-only React PWA — CSS custom properties, local state, no external data layer.

02 · Process

Double Diamond

How the problem was discovered, defined, developed, and delivered.

Stage 01

Discover

Identified that builders operate across health, work, finance, and learning simultaneously, but no single app reflected this cross-domain momentum.

Competitive audit
Diary studies
Workflow mapping

Stage 02

Define

Core problem: no ambient interface makes total discipline visible as a single motivating number — the same loop that makes games compelling.

Problem statement
Insight synthesis
Success criteria

Stage 03

Develop

Prototyped three nav architectures. The full-screen overlay was chosen after nine destinations exceeded the tab bar cognitive ceiling.

Layout prototypes
XP calibration
Concept sprints

Stage 04

Deliver

A mobile-first dark-mode PWA with nine views, rings, heatmap, XP economy, and level-up modal — in a single React component.

React PWA
Motion system
Component library

Competitive Audit

Evaluated Notion, Habitica, YNAB, and Forest. None unified all four life pillars into a single dashboard with a cross-domain progress signal.

Prototype Testing

Three navigation models were self-tested over two weeks. The overlay eliminated navigation anxiety and preserved full viewport height for timer and heatmap views.

XP Calibration

Values tuned through self-tracking: habits 5 XP, goals 10 XP, reflections 15 XP, shipping 20 XP. The 100 XP level targets one level per active working day.

03 · User Flow

Screen by Screen

Seven key screens. Click any card to reveal design decisions.

Unwind.⚡ 45

Focus

45xp
Level 2
3 DaysStreak

⚡ Deep Work

00:24:13

■ Stop & Save
🏋️

Workout

✓ Done

🧠

Meditate

0 days

📖

Journal

✓ Done

☀️

Sunlight

0 days

Screen 01

Focus / Today

Tap to flip →

Design Notes

Focus / Today

01

Deep work timer is foregrounded above habits — focus sessions earn the highest XP-per-minute rate, guiding users toward deep work over passive tapping.

02

The 2×2 habit bento grid makes all four completion states readable at a glance without vertical scrolling — critical for one-hand mobile use.

03

Floating +XP text is anchored to the exact touch coordinate, creating a physical reward sensation connecting tap location to animation origin.

← Tap back

MetricsWk 24

Pillars

65
Health
82
Work
40
Mind
90
Finance

Activity — 17 weeks

Screen 02

Progress / Metrics

Tap to flip →

Design Notes

Progress / Metrics

01

SVG stroke-dashoffset is computed from the circumference formula in JSX, making each ring's fill fully declarative with no third-party chart dependency.

02

Four pillars receive equal visual weight — no pillar is prioritised — reinforcing the whole-life discipline philosophy.

03

The heatmap is a 7-row CSS grid flowing column-first, matching GitHub's convention so the pattern reads instantly to a builder audience.

← Tap back

Capital↑ +£1,716

Resources

Net Income

£4,250

↑ +1,716 vs base

Bills

£1,820

Scheduled this month

Safety Net

£850/£1,700

Screen 03

Finance / Capital

Tap to flip →

Design Notes

Finance / Capital

01

The Net Income card carries a Brand Blue top-border to mark it as the primary metric; Safety Net uses neutral grey to indicate goal status.

02

A horizontal scroll tab bar provides four sub-views without a routing library, keeping the bundle lean and navigation gesture-native.

03

The safety net bar uses muted grey fill rather than blue, visually distinguishing goal progress from XP and skill progress.

← Tap back

Reflections+15 XP

Daily Review

⭐ Mood4/5
⚡ Energy3/5
🧠 Focus5/5
Shipped the review module…
Save Reflection

Screen 04

Daily Reflection

Tap to flip →

Design Notes

Daily Reflection

01

Slider thumbs are 24px with a 44px effective touch zone, optimised for one-thumb operation in the natural mobile grip.

02

Saving a reflection awards a flat 15 XP regardless of slider values, tying the reward to the act rather than gameable scores.

03

The Early Shutdown XP badge is visible before the submit button, serving as a persistent motivational anchor throughout the form.

← Tap back

Deploy+20 XP

Ship Your Work

📦

Public Accountability

Every ship earns 20 XP.

https://zaltt.com/case-study-01
↑ Ship

zaltt.com/case-study-01

2h ago · +20 XP

github.com/un-mesh/flow

Yesterday · +20 XP

Screen 05

Ship Feed

Tap to flip →

Design Notes

Ship Feed

01

Ship Feed awards the highest single-action XP at 20 points, making public shipping the most rewarded behaviour.

02

Previous shipments are rendered as a log below the input, providing social proof of the user's own output history.

03

The URL input carries a blue tint border at rest, signalling it is the primary action surface.

← Tap back

Skill TreesKnowledge

Knowledge

📐

Architecture

Level 3

60%
🏛️

Stoicism

Level 1

25%
🤖

Agentic AI

Level 2

48%
🧮

Systems Design

Level 4

78%

Screen 06

Skill Trees

Tap to flip →

Design Notes

Skill Trees

01

RPG-style level-plus-tier labels frame learning as open-ended progression rather than completion, keeping motivation sustainable.

02

Progress bars are 3px tall — thinner than the finance bar — encoding that skill growth is slow relative to financial metrics.

03

The four categories reflect a real builder's interdisciplinary growth arc rather than generic productivity topics.

← Tap back

IdentityLevel 2

Identity

45xp
Total XP145 XP
Streak3 days ⚡
Milestones2 / 9

Milestones

🏆
🧠

Screen 07

Identity / Profile

Tap to flip →

Design Notes

Identity / Profile

01

The level-up modal is a full-viewport blur overlay rather than a toast, communicating that levelling up warrants full attention.

02

Milestone badges use a 4-column grid, making locked badges visible and building a persistent inventory still to earn.

03

The Detach Session action uses muted text at the bottom, reducing accidental taps while remaining accessible.

← Tap back

04 · Accessibility

WCAG Audit

Six criteria — honest compliance status grounded in the source code.

2.5.3

Touch Target Size

Partial

Primary CTAs use w-full + py-3.5, meeting the 44×44px minimum. Secondary icon buttons use p-2 (~40px) and should be increased to p-2.5.

Mobile-firstTouch-optimised

1.4.3

Contrast Ratio

Partial

Primary text (#F0EEE9 on #09090b) achieves ~18:1. The muted colour (#5E5B55) falls to ~3.1:1 on card surfaces and should be raised to #7A7570.

Dark modeColour contrast

2.4.7

Focus Visible

Not Met

focus:outline-none suppresses all browser defaults. A 2px solid #2F7CF6 outline must be added to every interactive element.

Keyboard navFocus rings

1.3.1

Info & Relationships

Partial

Headings use correct hierarchy. Habit tiles and goal items lack aria-checked or role=checkbox so screen readers can't convey toggle state.

Semantic HTMLARIA states

2.4.11

Focus Not Obscured

Not Assessed

The fixed 64px nav bar could obscure focused elements near the scroll top. A global scroll-margin-top: 80px on focusable elements would prevent this.

Sticky navScroll margin

1.4.11

Non-text Contrast

Partial

SVG ring track achieves ~1.3:1 — below the 3:1 minimum. Raising to rgba(255,255,255,0.18) would meet this criterion.

SVG ringsUI components

05 · Inclusivity

Inclusive Design

Eight dimensions — honest assessment of current strengths and gaps.

Physical / Motor

Strength

Full-width CTAs and active:scale-95 feedback reduce precision demands. All primary actions are reachable with one thumb in the natural grip.

Touch-firstLarge targets

Visual

Gap

Dark-mode only with no light-mode alternative. Users with photosensitivity or those outdoors have no accessible option.

Dark onlyNo light mode

Cognitive

Strength

One task per view prevents overload. The persistent XP counter provides a progress anchor without requiring navigation away.

Single focusPersistent XP

Auditory

Strength

No audio features present. All state changes are communicated visually only, satisfying WCAG 1.1.1.

Visual-onlyNo audio

Keyboard / Switch

Gap

No skip links, no defined focus order in the overlay menu. Users relying on keyboard cannot navigate efficiently.

No skip linksFocus gap

Language / Literacy

Partial

Copy uses domain-specific terms. Suits the target audience but excludes others. No i18n or RTL support.

English onlyTechnical vocab

Escalation Paths

Gap

No error states, loading states, or in-app help defined. Onboarding and empty-state illustrations would reduce first-session abandonment.

No errorsNo onboarding

Device / Context

Partial

Optimised for mobile. Performance is strong. The backdrop-filter blur may degrade on lower-end Android hardware.

Mobile-firstbackdrop-filter

"The highest-leverage accessibility improvements for Unwind. are a light/dark toggle and explicit focus styles — two CSS changes that would open the app to significantly more users without any architectural work."

06 · Stack

Architecture Q&A

Technical questions a senior reviewer would ask — answered from the source.

Q01

Why centralise all XP state in a single addXp callback?

Answer

Centralising XP in App.jsx with useCallback ensures the reference stays stable, preventing stale closures. The level-up side-effect also fires exactly once regardless of trigger.

Q02

Why CSS custom properties rather than Tailwind config tokens?

Answer

CSS custom properties allow runtime dark/light switching via a single classList toggle. Tailwind tokens are compile-time only.

Q03

Why a full-screen overlay nav instead of a bottom tab bar?

Answer

Nine destinations exceed the five-item cognitive maximum for a tab bar. The overlay preserves full viewport height for timer and heatmap components.

07 · Decisions

Trade-off Table

Five architectural decisions, with the alternatives that were on the table.

#Decision MadeAlternativeRationale
01Single addXp callback in App rootDistributed XP state per viewStable closure; level-up fires exactly once regardless of which view triggers it.
02CSS custom property theme tokensTailwind config tokensRuntime dark/light toggle via classList — Tailwind tokens are compile-time only.
03Full-screen overlay navigationBottom tab barNine destinations exceed the 5-item limit; overlay preserves full viewport height.
04Dark-only; classList forced on mountSystem prefers-color-scheme queryNo FOUC on load; consistent dark rendering before React hydrates.
05Floating +XP at touch coordinatesFixed-position toast notificationSpatial anchor reinforces the action-reward loop physically.

← Previous

Spatial Memory Interface

Next →

Generative UI Systems

Zaltt Studio
© 2026 Zaltt Studio · zaltt.com