AOY
TR EN
← All projects

Mane

MobileiOS · Android

See it on your own face before the scissors come out — one photo, one generation.

Mane — hairstyle picker
Pick a style
Mane — hair colour palette and smile options
Colour and smile
Mane — result screen with before/after
Result · before/after
01

What it does

Mane is a look try-on app that works from a single photo. You see a hairstyle, hair colour, beard, moustache, smile or piercing on your own face — before you try to describe “something like this” to a stylist.

There are more than twenty-five hairstyles (long, medium, short, braids, gothic), nineteen preset hair colours and a custom colour of your own. Beard, moustache, smile and piercing sit in their own groups and can all be selected at once.

The result screen opens on a before/after comparison and lists which selections were applied underneath, so a combination you liked does not get lost.

02

How it works

The client is React Native with Expo. A generation request goes to a Fastify service on the backend, is queued on BullMQ, and the result is stored on Cloudflare R2.

Every selection becomes one request

Hair, colour, beard and smile are not processed separately and pasted on top of each other. All the selections turn into a single image generation request, which is why the result does not look assembled — lighting and skin tone stay consistent.

Credits, not a subscription

Usage runs on credits. There is no subscription and purchased credits never expire — unused credits do not burn at the end of the month. If a generation fails, the credit it consumed is refunded automatically; nobody has to open a support ticket for it.

Decision · monetisation

No subscription, and credits never expire. This is not an app anybody opens daily — it gets opened while deciding on a haircut and then not again for months. A monthly subscription punishes exactly that usage pattern.

Credits never expiring follows from the same logic: something you paid for should not evaporate because you did not use it fast enough.

Decision · failed generations

Refunds are automatic. If a job fails in the queue, the credit it consumed goes straight back to the user — nobody has to notice it, write in and wait.

That is not generosity, it falls out of the queue design: when a job ends in a failed state, the refund runs as part of that same job.

03

Architecture

Client
React Native · Expo
API
Fastify
Queue
BullMQ
Storage
Cloudflare R2
Platform
iOS and Android
Options
25+ hairstyles, 19 preset colours plus a custom one, beard, moustache, smile, piercing
Monetisation
Credits; no subscription, credits never expire
Failed generation
The credit is refunded automatically
04

Frequently asked

Is my photo kept?

The uploaded image and its result are stored in the app’s own storage (Cloudflare R2) for the generation job. The full account of how the data is handled lives in the app’s own privacy policy, linked from the store listing and from manehairs.com.

Is there a subscription?

No. Usage is credit based and purchased credits never expire — they are not wiped for going unused.

Do I lose a credit if a generation fails?

No. The credit is refunded automatically when a generation fails; there is no support ticket to open.

Do I have to try options one at a time?

No. Hairstyle, colour, beard, moustache, smile and piercing can be combined, and they all merge into a single generation request.

05

Other projects

built by the same hand
06

Contact

Got something similar?

I build products from idea to store release. Reach me by e-mail.