Projects
Mindfulness app that also drives an ice bath

Nordic Flow

Breathing and mindfulness app for iOS and Android. Inherited it, redesigned it completely, added features, and connected it over hardware to the chiller controlling the ice bath.

Role
Lead frontend — Antártida
Period
2023 — 2024
Type
Client work
Status
shipped
2
App stores, one codebase
5
Session intents
4s / 6s
The default pacer
1
Ice bath on the other end
01

Overview

A breathing and mindfulness app with guided sessions, already live on both stores when it reached us. We took it over, did a complete redesign, kept maintaining it and added features on top.

What comes out is wider than a meditation app. One React Native codebase carries the session player, a scored analytics layer, an on-demand class library with collections and instructors, a habit streak, and a storefront selling the cold plunge tubs and accessories the sessions are written for.

The part that made it unusual is that it does not stop at the phone. Some units are paired with an ice bath, and the app talks to the tub’s control board — you set and manage the chiller from the app. That pulled the work into native mobile development and hardware communication, which is a different discipline from shipping screens.

Redesigning a live app is also its own problem: every screen has to change without breaking the habits of the people already using it daily.

02

Architecture

1 diagrams
01

An app with a tub on the end of it

One React Native appGuided sessionspacer, plans, streakLibrarycollections, instructorsShoptubs, mats, coursesFlow Scoremeasurement toone numberNative moduleIce bath control boardchiller, temperatureiOS and Android

Scroll to pan

Three product surfaces most companies would ship separately — a session player, a content library and a store — sit in one React Native app, and one of them reaches past the phone into the hardware. Cold plunge is a session intent, not a device settings screen.
03

Screens

2 captures
Three app screens: the breathing pacer, a cold plunge hub with a flow score, and the breath analytics readout
01Store boards from the redesign — the pacer, a personalised hub, and the Flow Score readout.
Three app screens: the home screen with intents and a streak, the Nordic shop, and the on-demand class library
02The rest of the surface — intents and streak on the home screen, the shop, and the on-demand library.
04

Modules

8 units
01

The breathing pacer

The core of the product and almost the whole screen: a ring that expands and contracts against a set rhythm — four seconds in, six out by default — with the controls hidden until you tap, because the interface competing with the breath is the failure mode.

02

Intents and streak

The home screen asks one question — calm, focus, energize, sleep or cold plunge — over a week ring and a streak count, so the daily decision is a single tap and the habit is visible before anything else.

03

Personalised breath hubs

Each intent opens its own hub: quick starts of a couple of minutes with a named instructor, longer guided plans, and the score for that practice at the top of it.

04

Flow Score

Breath measurements condensed into one number, a sentence about what it means, and the next thing to do about it — with "how it works" sitting immediately next to the gauge, because an unexplained score is not something anyone acts on.

05

On-demand library

Collections and classes with instructors, durations, categories, search, sort and favourites — the content half of the product, kept navigable as the catalogue grew.

06

Shop and ecosystem

Cold plunge tubs, mats and accessories, plus courses and certifications, sold inside the app the hardware is used with.

07

Ice bath & chiller control

Communication with the tub’s control board so the chiller can be driven from the app — native mobile work and hardware connectivity rather than pure UI.

08

Complete redesign

An inherited, live application rebuilt visually and structurally without disrupting existing users, then maintained and extended.

05

Engineering

What was hard
01

Redesigning an app people already use every morning

An inherited product with daily users has no blank slate. Every screen changed, but the muscle memory underneath it could not: where the session starts, how many taps to the thing you did yesterday, what the streak means. The interesting constraint is that the users who care most are the ones most likely to be broken by the redesign, and they are also the ones who leave reviews.

02

The pacer is judged against the user’s own body

Most animation in an app is decoration and nobody times it. A breathing ring is different — someone is inhaling along with it, and if the ring and the four seconds it claims disagree, they feel it immediately and stop trusting the app. That turns a visual component into a timing one, which is a different set of decisions on a phone that is free to throttle, background and interrupt whatever is on screen.

03

A score has to be explainable to be useful

Turning breath measurements into a single number is the easy part; making it actionable is not. A bare 50 tells a person nothing, so the score ships with a sentence about what it means, a threshold to aim at, and a "how it works" disclosure inches from the gauge. The product decision underneath is that a score nobody understands is worse than no score, because it looks like information.

04

The app is also a remote control

One of these installs sits next to a tub full of ice, and the phone is what sets the chiller. That means native modules and hardware communication in a codebase otherwise made of screens, and it means cold plunge lives on the home screen as a session intent alongside calm and sleep — the hardware is part of the content model, not a device settings page bolted onto the side.

06

Stack

6 entries
  • 01React Native
  • 02TypeScript
  • 03iOS
  • 04Android
  • 05Native modules
  • 06Hardware integration