VF ← All work
LIVE ON THE APP STORE iOS · FLUTTER · 2026 Released 1 October 2026
Pace Tape app icon

Pace Tape

Pace, speed and time calculator for swim, bike, run and triathlon. Set any two numbers — the third is calculated.

ROLE
Design engineer — product, UX/UI, design system, build with AI agents, App Store release
PLATFORM
iOS (iPhone) · Flutter · EN + UK
TOOLS
Illustrator · Figma · Claude Design · Claude Code · Widgetbook · App Store Connect
Figma: design system synced from code (tokens, components), decision boards with options, final screens before code.
WHO WROTE THE CODE
Claude Code, under my direction. Product, design and decisions — mine.
Get it on the App Store ↗ Privacy Support Component catalog (Widgetbook) ↗
Pace Tape run screen: pace, distance and the pink result card Pace Tape triathlon screen: swim, T1, bike, T2, run and the total
01 / CONTEXT AND PROBLEM

A number you need at the start line shouldn’t take a minute.

A
Calculators exist — clarity doesn’t

Many pace apps are cluttered, carry ads, or don’t make clear which number is being calculated.

B
Triathletes need one total

Three sports plus T1 and T2 transitions — added into one finish time, not three separate tools.

C
A chatbot is slow for one number

Typing a question and reading a paragraph is slower than a screen that answers as you change a value.

A and C are my framing of the problem. Section 02 shows what the competitor pages and 6 interviews support.

02 / RESEARCH

Six apps on the App Store, six conversations.

A · Competitor analysis

APPPRICE / ADSSPORTSTRIATHLON TOTALINPUTDATA (APP PRIVACY)LANGUAGES
Pace Calculator
Polymorph Solutions
Free · contains ads · Remove Ads €1.99Run—Fields + chat assistantUsed to track you (location, identifiers, usage)EN, FR
Paces
Austin Louden
Free · no ads, no in-app purchasesRun—±1 min buttons, distance pickerNot collectedEN
Pace: Running Pace Calculator
Skipjack Studios
Free · contains ads · Remove Ads €5.99Run—Sliders; Apple WatchUsed to track you (identifiers, usage)EN
PaceAce
CyberWisp
Free · no ads, no in-app purchasesRun (splits)—Number keyboard; Apple WatchNot collectedEN
TriCalc
Robert Rusch
Free · lifetime unlock €1.99 · no adsSwim, bike, runYes, with transitionsSplit fieldsNot collectedEN
RunTriX
Markus Malz
Free · Pro €9.99 or €19.99Run, bike, triathlonTriathlon calculatorCalculators + Apple HealthNot collectedEN
Pace TapeFree · no ads · no loginSwim, bike, runYes — Σ with T1 + T2Stopwatch keypad + drag to scrubNot collected · works offlineEN, UK

Source: App Store product pages, IE storefront, checked 25.09.2026. — = not offered.

2 of 6 show ads and track users. None offers Ukrainian. Pace Tape: free, no ads, no data collected, EN + UK.

B · User interviews

6
interviews
Small sample — directional findings.
WOULD THEY USE ONE?

Most participants said they would use a pace calculator app if it were light and easy to use.

WHAT THEY DISLIKE IN EXISTING APPS
Constant ads Features they don’t need Complex interfaces
DESIGN

2 of 6 said they don’t like the design of competitor apps.

PARTICIPANTS & FORMAT
6 amateur runners · mixed format
WHAT WE HEARD (PARAPHRASED FROM NOTES)
  • I’d use one if it’s light and easy.
  • Constant ads get in the way.
  • Too many features I don’t need.
  • The interface is too complicated.
  • I don’t like how these apps look. (2 of 6)

C · SWOT

Strengths
  • Answers what users asked for: light, no ads, simple
  • Swim, bike, run and a triathlon total with T1/T2 in one free app
  • Offline, no data collected, EN + UK
Weaknesses
  • Small sample (6 interviews)
  • iPhone only; no Apple Watch, unlike several running apps
  • No splits or saved plans yet
Opportunities
  • People are tired of ads and bloated apps
  • Planning features (target time, splits, Pace Band) as a Pro tier
Threats
  • Competitors can drop ads
  • AI chat can also calculate pace
03 / INSIGHT → PRINCIPLE

Every complaint became a rule.

Constant ads
→
Free. No ads, no login.
Features they don’t need
→
One screen per sport, three numbers. Σ only for triathlon.
Complex interfaces
→
The result is a coloured card. Time is typed like a stopwatch. Drag a number to change it second by second.
2 of 6 dislike the design
→
Its own look: tape, stickers, hard shadows.
04 / USERS

Eight user stories, one screen each.

{{ s.n }}{{ s.en }}
PROTO-PERSONA · ASSUMPTION-BASED, TO VALIDATE
The race-day runner

Has a target time and needs the pace for it — or the finish for a pace — in seconds, on the phone, often with no signal.

PROTO-PERSONA · ASSUMPTION-BASED, TO VALIDATE
The triathlete planning a race

Thinks in three paces plus two transitions and wants one finish time that updates when any part changes.

Not covered by interviews (all runners) — to validate.
05 / SCOPE AND BACKLOG

Ship the calculator. Park the planner.

MUST · MVP DONE
  • Engine: pace / distance / time
  • Swim, bike, run screens
  • Σ triathlon with T1, T2
  • Stopwatch keypad
  • km/mi · m/yd
SHOULD · MVP DONE
  • Drag to scrub
  • EN + UK, light/dark
  • VoiceOver, Reduce Motion
  • Onboarding — 2 steps (3 in build 1)
COULD · NEXT / PRO
  • Target-time planning
  • Saved plans
  • Per-km splits
  • Pace Band (printable / lock screen)
  • Home screen widget
WON’T (NOW)
  • Android
  • Apple Watch (idea)
  • Accounts, sync, ads
06 / DESIGN DECISIONS — MY CALLS

Seven calls, and what I said no to.

Try the toggles and sliders. “Illustration” = a recreation, not a real earlier build.

01MY CALL
Platform — Flutter
WHY

One codebase for iOS and Android — Android comes next from the same code. The custom animations and the keypad are the product: hard shadows, tilts, drag-to-scrub, the ticker, the stopwatch keypad. Flutter draws every pixel, so none of this fights native controls.

REJECTED

Native SwiftUI — iOS only, a second app for Android.

SwiftUI
Swift
→
iOS
App Store
Kotlin
Jetpack Compose
→
Android
Google Play
Flutter
Dart · one codebase
⇉
iOS
App Store · now
Android
next · same code
02MY CALL
Look — paper, ink, tape
WHY

Stand out among grey, look-alike calculators; 2 of 6 interviewees disliked competitors’ design. Chosen after the interviews and reference research.

REJECTED

A standard grey form calculator.

Chosen version
Pace Calculator
PACE
min/km
DISTANCE
km
TIME
hh:mm:ss
Calculate
AD BANNER
REJECTED · ILLUSTRATION CHOSEN · REAL APP
03MY CALL
Colour — one accent per sport
WHY

Each sport has its own colour, so you know the screen at a glance. Bright like sports gear, maximum contrast on paper and ink — a variation of the colours used to mark triathlon legs. The accent appears only on the result.

REJECTED

One brand colour everywhere, and accent on every state.

PACE
4:30 /km
DISTANCE
42.195 km
TIME
3:09:53
04MY CALL
Shadows — hard, no blur
WHY

A printed-paper feel; clear edges readable at a glance.

REJECTED

Soft blurred shadows.

PACE
4:30 /km
05MY CALL
Type — Sofia Sans Extra Condensed + Fixel
WHY

Tabular figures, so numbers don’t jump while you drag them. Fixel is a Ukrainian typeface by MacPaw with proper Cyrillic for the UK version. Both are open-licensed (OFL).

REJECTED

Proportional digits that jitter while scrubbing.

PROPORTIONAL DIGITS — JITTERS (REJECTED)
{{ num5 }}/km
TABULAR DIGITS — STEADY (CHOSEN)
{{ num5 }}/km
{{ head5 }}
{{ ui5 }}
Sofia Sans Extra Condensed 800 · Fixel (MacPaw) · OFL
06MY CALL
Voice — sports humour in the ticker
WHY

A joke about the sport eases pre-race nerves; jokes are about the sport, never the person. Can be switched off; hidden with Reduce Motion.

REJECTED

An endless loop: TEMPO / SWIM / BIKE / RUN. Literal translation into Ukrainian.

{{ ticker6 }}
RUN PACE{{ pace6 }} /km
UKRAINIAN — WRITTEN, NOT TRANSLATED
EN · TRANSITIONS ARE FREE SPEED
✕ ТРАНЗИТКА — БЕЗКОШТОВНА ШВИДКІСТЬ
✓ T1 І T2 — ТЕЖ ДИСЦИПЛІНИ
07MY CALL
Keypad — edited card always visible
WHY

The keypad covered the bottom card and every card looked the same. Now the edited card stays above the keypad with a heavier ink outline, the other input dims, and the keypad bar shows the value and the live result.

REJECTED

The first build: keypad over the cards, no edit state.

Chosen version
Before
BEFORE AFTER
07 / TESTFLIGHT ROUND · 25–26 SEPT 2026

Test → fix → ship: one day, three builds.

Build 1 was already waiting for App Review when I tested it on my iPhone (a 2:38 screen recording) and collected feedback from other testers. I pulled it from review.

BUGS FOUND · 7
{{ b.n }}{{ b.en }}
UX · TESTERS, PARAPHRASED
{{ u.n }}{{ u.en }}
{{ pr.n }}
{{ pr.en }}

Build 1 → after

{{ p.altB }}BUILD 1
{{ p.altA }}AFTER
{{ p.en }}

Build 1 = frames from my screen recording. After = screenshots of builds 2–4.

The calls I made in this round

Rejected options stay visible. Chosen = pink.

aMY CALL
Drag hint — chevrons
A · REJECTEDTiny chevrons at 30%.
B · CHOSEN2× chevrons, 45% ink, centred on the digits.
C · REJECTEDA track behind the number.
WHY

A was invisible; C adds noise to every card.

bMY CALL
Onboarding demo finger
A · REJECTEDSmall circle on the digits — covered them, and the arrow rendered as an emoji.
B · REJECTEDSee-through circle over the number.
C · CHOSENFinger beside the number on a dashed track.
WHY

Digits stay readable, and that space is part of the drag area.

Figma board: build 2 fixes — three chevron options and three onboarding finger options, B and C marked chosen
OPTIONS I COMPARED · FIGMA
cMY IDEA
Idle nudge

If someone has never dragged and doesn’t touch the screen for 8 s, the finger slides once. No dim, no text.

LIMITS
once per sessionmax 3 sessionsnever after the first drag
Run screen with the pink demo finger beside the pace, on a dashed track
IDLE NUDGE · BUILD 4
dMY CALL
Copy — the band speaks like a coach
WHY

“Tip / Порада” took space and set the wrong tone.

REJECTED
TIP: DRAG A NUMBER ← → TO NUDGE IT
CHOSEN · EN / UK
DRAG THE NUMBER ← →
ТЯГНИ ЧИСЛО ← →
eMY CALL
Ticker band — moving, with rules
A · REJECTEDBuild 2: a permanent slot, so cards never move.
B · CHOSENCards drop while the band runs and glide back — it feels alive.
RULES
  • The band arrives with the screen — no drop.
  • One 300 ms glide.
  • Never under a finger.
  • No band during onboarding.
EXCEPTION · SMALL SCREENS

On iPhone SE the slot stays permanent: there the moving band pushed the result under the tab bar.

Run screen with the ticker band passing above the cards
REGULAR · BAND PASSES
iPhone SE run screen with a permanent ticker slot
IPHONE SE · PERMANENT SLOT
fMY CALL
Horizontal scrub, not a picker wheel
REJECTEDPicker wheel.
CHOSENDrag the number itself left or right.
WHY
  • The number is edited in place — no extra ~200 pt control.
  • Vertical drags on a stack of cards read as scrolling, and the screen edges belong to the system.
  • Left = less, right = more — like sliders and scrubby number fields in Figma.
  • Comfortable one-handed.
WHAT THE TEST SHOWED

The problem was discoverability, not direction — hence a–c. Next test: ask people to change the pace and watch which way they drag.

TRY IT · DRAG THE NUMBER ← →
PACE
‹{{ scrubVal }}›/km
← lessmore →

Final screens in Figma, before code

Seven final run screens in Figma: ticker, onboarding 1/2 and 2/2, keypad, ticker again, idle nudge, rest state

Launch

{{ l.den }}
{{ l.en }}
08 / DESIGN SYSTEM: FIGMA ↔ CODE

One set of tokens — in Figma and in code.

Widgetbook is the Flutter version of Storybook. Every state is visible without clicking through the app, and every UI change updates its Widgetbook story in the same commit.

Design side: a Figma library generated from the same tokens as the code — colour variables for light and dark, sizes, shadow and text styles. Code side: Widgetbook. Same values, same names.

LAYER 1 · TOKENS

Colours light/dark, type, hard shadows, tilts.

LAYER 2 · BASE COMPONENTS

HardBox, Pressable, Sticker, OutlineButton, InkButton, chips, icons.

LAYER 3 · APP COMPONENTS

Card, keypad, header, tab bar, ticker, toast, coach tips, settings, race total, launch intro.

20
components
34
states
48
reference screenshots
1:1
UI change = story update, same commit

Rule: accent = result only

The number you’re typing gets an ink outline and a caret. Only the calculated number gets the sport colour.

Figma value card component states: with chevrons, replace state, dimmed, result in three sport colours
FIGMA · COMPONENT STATES: chevrons, replace state, dimmed, result
09 / KEY SCREENS AND INTERACTIONS

Run, swim, bike, Σ — and a keypad that tells you what it’s typing.

{{ st.alt }}
{{ st.en }}

App Store screenshot frames — matched to the real app before release.

{{ it.alt }}
{{ it.ten }}
{{ it.en }}
10 / HOW IT WAS BUILT

I designed and directed. Claude Code wrote the code.

The code was written by Claude Code under my direction. Product, design and every decision below were mine. From the first sketches to the App Store release took about three weeks.

STEP 0
Sketches, logo & first prototypes

First visual sketches and the logo in Illustrator (the three tapes, the paper-and-ink look), first prototypes in Figma.

STEP 1
Prototype + spec

Claude Design prototype and UI kit (EN + UK), README spec, tri-core engine.

STAGE 1 · 24 SEPT 2026
Foundation

Engine ported 1:1 from the prototype’s tri-core, design system, sport screen, keypad.

STAGE 2 · 24 SEPT 2026
Features

Settings, Σ triathlon, ticker, onboarding, accessibility, Widgetbook component catalog.

SUBMIT · 24 SEPT 2026
App Store Connect

Privacy page, store screenshots, 1.0 with build 1 submitted. Release kept manual.

FIGMA · 25 SEPT 2026
Design system from code

Tokens and components generated from the code, with a parity check. From here on, every change is designed in Figma first.

TEST · 25 SEPT 2026
TestFlight

Tested on my iPhone (screen recording) and collected testers’ feedback. Build 1 pulled from review.

FIX · 26 SEPT 2026
Figma → code

Options in Figma, my pick, final screens; builds 2, 3 and 4; 1.0 with build 4 resubmitted.

Section 07 ↑
REVIEW · 26–30 SEPT 2026
App Review

Waiting for App Review, then approved.

1 OCTVersion 1.0 released

Every change: options in Figma → my pick → staged prompt → tests → one commit → my review on the phone.

Key decisions that shaped the product

A selection of 10 — not the full list.

{{ d.n }}
{{ d.en }}
{{ d.wen }}
{{ d.tag }}
11 / RESULTS

Live on the App Store.

Version 1.0 (build 4) · released 1 October 2026 · available in 173 countries · no ads, no account, no data collected.

It has only just gone live — download it and rate it.

Get it on the App Store ↗
3 weeks
from the first sketch to the App Store
sketches, Figma, Claude Design, code, review
1 day
from TestFlight test to fixed build
7 bugs and 3 UX problems found on 25 Sept, builds 2 to 4 and resubmission on 26 Sept
0 rejections
from App Review
build 1 was pulled by me after testing; build 4 approved first time
139 tests
automated, all green
plus 75 render checks in the Widgetbook catalog
WHAT I TOOK AWAY
01
Test on a real phone before you submit.

Build 1 was already in review when my iPhone showed 7 bugs.

02
A gesture nobody finds doesn’t exist.

The test showed a discoverability problem, not a direction problem — so I made the drag visible instead of replacing it.

03
Figma first, then code.

Since 25 Sept every change starts as options in Figma and ends with screenshots checked against it.

12 / WHAT’S NEXT

Version 1.0.1 is already in the backlog.

Release is where real feedback starts. I collect it in one backlog and ship it as one update, so the app doesn’t sit in the review queue for every small fix.

01
Launch intro

After installing from the App Store over the TestFlight build, my phone no longer counted as a first launch, so I only saw the 1.2 s flash and the slogan got cut off.

Next version: the slogan runs in full on every cold start, a tap skips it.

02
Listening to runners

I shared the app in running communities.

Their feedback goes straight into the backlog, word for word.

03
More languages

First the App Store page in German, Spanish, French and Polish, then the app itself.

Ticker jokes are written from scratch for each language, not translated. The order follows where downloads actually come from.

04
Android

Same Flutter code.

It ships if people ask for it.

05
Test the direction

The TestFlight round showed a discoverability problem, not a direction problem.

Next test: ask people to change the pace and watch which way they drag.

Lesson: test the App Store install path too, not only TestFlight.

LIKE WHAT YOU SEE?

Let’s build your product next.

Start a project →
Try Pace Tape ↗
NEXT PROJECT
Mocktail Finder
→