# 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.

Case study by Paolo Gianfelici (Full-stack developer & UI/UX designer). https://paologianfelici.com/work/massage-mate

- **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
- **Stack:** Flutter, Dart, Riverpod, go_router, Firebase Auth, Cloud Firestore, Cloud Messaging, RevenueCat, Rive, media_kit
- **App Store:** https://apps.apple.com/it/app/massage-mate/id6749038075
- **Google Play:** https://play.google.com/store/apps/details?id=com.tepy.massagegun.app

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.

*Massage Mate is on the stores. The recordings on this page do not touch the service: they run the released code (with the compliance fixes prepared for the next release) as a self-contained build, with Firebase, the backend and RevenueCat answered inside the page. The videos, pictures and icons are the app’s own, bundled with the build; the user, the pain history and the plans are invented, nothing is charged and nothing was sent anywhere.*

- 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

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

### 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.

### 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.

### 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.

### 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.

### 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.

## 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.

- **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.
- **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.
- **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.
- **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.

## Recordings

- **A session with the gun** (48 s): One step per zone, a minute each: the video shows where and how to use the gun; a partner can do it instead, or it can be done by hand. Swipe up for the next zone. https://paologianfelici.com/media/massage-mate/clips/session.mp4?v=69ae726d09
- **Where does it hurt?** (20 s): The home is a 3D body: tap a part to zoom in, tap the sore point, and the app builds a programme for it. The pain point appears on the home with its own session. https://paologianfelici.com/media/massage-mate/clips/first-zone.mp4?v=9f7b58dcbc
- **Progress** (30 s): A wellbeing score, the days with sessions over three months, the steps done per zone and how the pain of each zone has changed. https://paologianfelici.com/media/massage-mate/clips/progress.mp4?v=8087ecce55
- **Subscribing** (27 s): Plans come from RevenueCat: a yearly plan with a free week and a monthly one; the purchase goes through the store (played by the demo with sample prices, nothing is charged). https://paologianfelici.com/media/massage-mate/clips/subscription.mp4?v=21d7ecfedd
