Paolo Gianfelici
All work
On the stores · recorded on a copy that runs on its ownCase study

Massage Mate

A companion for a massage gun: tap where it hurts on a 3D body and follow a session made for it, with the gun, by hand or with a partner.

Role
Sole developer and UI/UX designer: the body-picker home, the gun-centred sessions and partner view, progress, dark mode, RevenueCat
Client
Physiozep srl
Period
2025–2026 (on the stores since February 2026)
Platforms
iOS and Android from one Flutter codebase, shared with TEPY
  • Flutter
  • Dart
  • Riverpod
  • go_router
  • Firebase Auth
  • Cloud Firestore
  • Cloud Messaging
  • RevenueCat
  • Rive
  • media_kit

The product

Massage Mate is the app that comes with a massage gun. Its home is a 3D body: the user taps where it hurts, zooms in, marks the sore point and gets a session made for it (a minute on each zone, with a video showing where to hold the gun and how to move it).

It is built on TEPY, the self-massage app I develop. In seven months I turned TEPY's code into a second product (a new home around the body picker, sessions centred on the gun with a partner view, a progress page, dark mode and subscriptions through RevenueCat) and released it in February 2026.

38
commits on the Massage Mate branch, all mine, July 2025 to February 2026
7 mo
from the first commit to the App Store
3
ways to do each step: with the gun, by hand, or by a partner
2
apps from one codebase: Massage Mate is built on TEPY

Walkthrough

The app, in motion

Pick a recording, or jump straight to a chapter.

A session with the gun, first frame
0:00 / 0:48

Recorded from the released code at phone size, with the app’s own treatment videos (the gun, the hand, and a partner holding the gun) under their own names, so its partner view and tool switch work as they do on a phone.

What it does

From “it hurts here” to a session with the gun

01

A 3D body as the home

No onboarding: the app opens on the body. A tap zooms on a part, another marks the exact point; the app records the pain point and asks the backend for a programme around it.

02

A session for each pain point

The home lists the pain points with their level and the session waiting for them: one step per zone (the sore one and the ones worked on with it), a minute each, with a timer.

03

With a partner, or by hand

For the massage gun the player switches to a partner view: the same step, done by someone else. The tools button changes to any other tool the user owns (the hand, here), and a swipe up moves to the next zone, keeping the tool.

04

Progress you can see

A wellbeing score, a heatmap of the days with sessions over three months, the steps done per zone and the pain level of each zone over time.

05

Subscriptions through RevenueCat

After a free period the sessions need a plan: yearly or monthly, bought through the App Store or Google Play via RevenueCat. The app unlocks as soon as the store confirms.

Under the hood

How it was built

A second product from TEPY's code

Massage Mate is a branch of TEPY. The shared widgets, styles, icons and utilities moved into local packages both apps use; the onboarding was removed so the app opens on the body picker; texts and translations lost the TEPY brand; the Rive animations moved to the new runtime.

Videos that follow the tool

Each step carries a video per tool. The player opens the massage gun's, swaps to the partner recording when asked, and keeps the chosen tool from one zone to the next. Finished steps feed a daily activity record and per-zone statistics in Firestore, which the progress page reads.

RevenueCat for subscriptions

TEPY checks its subscriptions through its own backend; Massage Mate moved to RevenueCat: offerings for the paywall, one entitlement that unlocks the app, live updates when it changes, and a one-time restore that carried existing subscribers over.

Recording a live app

The app is real. The user is not.

Massage Mate has real users, real pain histories and real subscriptions. None of that belongs in a portfolio, so the recordings use a copy of the released code that runs on its own, on the stand-ins built for the TEPY demo.

  1. 1

    The released code, built for the browser

    A Flutter web build at phone size, told it runs on an iPhone, with the compliance fixes waiting for the next release. Push notifications, analytics and crash reporting are off.

  2. 2

    TEPY's stand-ins, and a new one

    Sign-in and the database run on the in-memory fakes from the tests and the backend is answered inside the page, as in the TEPY demo. RevenueCat is new: the demo answers it with two sample plans and a purchase that charges nothing.

  3. 3

    The app's own videos

    For each of the eight zones the demo uses, a script fetches the videos of the gun, of the hand and of a partner holding the gun from the CDN the app streams them from, picked in the app's own catalogue so that the point on the body matches the zone. They keep their names, so the partner view and the tool switch work unchanged.

  4. 4

    Recorded offline

    The recorder refuses any request that leaves the machine, so a take cannot reach the real service.

The logo, the interface, its icons, the 3D body model, the pictures and the videos are the app's own. The zone texts, the user, the pain history and the plans are sample content made for this portfolio; the paywall's reviews and store rating are hidden.

With a partner

No demo to try here: Massage Mate is a live product, so this page shows recordings of a copy that runs on its own.

Every screen

The full set of screenshots

  • The bodyTap a part of the body to zoom in.
  • Zoomed inThe thigh, ready for the exact point.
  • The sore pointOne tap marks it.
  • Wellness overviewThe pain point and a session waiting for it.
  • The sessionThe zones of the programme, a minute each.
  • With the gunWhere and how to use the massage gun.
  • With a partnerThe same step, done by someone else.
  • ToolsSwitch to another tool you have.
  • By handThe same zone without the gun.
  • Next zoneSwipe up for the next step.
  • Wellbeing scoreFrom the pain points and how regularly the programme is followed.
  • ActivitySessions over the last 90 days.
  • Zones treatedProgramme steps completed per zone.
  • Pain over timeThe pain level of each zone, going down.
  • ProfilePains, plan and subscription, tutorials, appearance.
  • PlansYearly with a free week, or monthly (sample prices).
  • SubscribedEverything unlocked.
  • Sign-inApple, Google, a company code or e-mail.

Next case study

Photo2Post →