Passionfruit Design

morganharnett.tattoo: artist's site

A site for a tattoo artist. It fills itself from his Instagram, so he updates one place. Clients ask for a tattoo, pick a time and pay a deposit on the site.

Who it is for

A tattoo artist in Southsea, Portsmouth.

What I built

A site that fills itself from his Instagram. He posts his work there, and the site checks for new work four times a day and shows it.

A booking system. A client describes the tattoo they want: the idea, where on the body and how big, with up to four reference photos. He reads it, and either declines or makes an offer.

A client with an offer picks a time from the hours he is really free, and pays a deposit by card. The booking goes straight into his own calendar. Both of them get a confirmation, and a reminder goes out 48 hours before.

Every picture has a written description for people who cannot see it. New pictures are described by AI, and he can rewrite any of them. Clients' names are kept out.

It can be installed on a phone like an app.

What it does for him

He updates one place. A request arrives with everything he needs to decide, and an accepted booking lands in his calendar without anyone retyping it.

Where it is now

It has been live since October 2026.

Visit morganharnett.tattoo

What I did here

  • Websites you can update yourself

    A small business website you update yourself. Change the words and pictures from a simple editing screen. Designed, built and kept running by me.

For IT people

Site and booking system for a tattoo artist, on a custom CMS written for the job.

  • It fills itself from Instagram, so the artist updates one place. The official Instagram API, synced every six hours in its own short-lived process.
  • Booking flow: apply, offer, pick a slot, pay a deposit through Stripe Checkout. A slot is held for 35 minutes while the client pays.
  • Availability is his working hours, minus his Apple Calendar over CalDAV, existing bookings and held slots.
  • A Fastify API in TypeScript, run directly by Node with no server build step. State lives in one SQLite file.
  • A React front end rendered on the server, so crawlers get real pages, then precached by a service worker as an installable PWA.
  • Alt text for new images from Claude Haiku. The backlog was described locally with Ollama.
  • Google sign-in for the admin. Deployed by GitHub Actions after tests.

All the work, with the tools named

Tell me what you need

A few lines about the project is enough. I read every message myself. I meet people face to face within about 30 miles of Portsmouth, and work with organisations anywhere in the UK.

Send me a message

Or email hello@passionfruit.design, or call or WhatsApp 07385 509278.