Freelance · Castro Solutions — full-stack & SEO

Cattleya Tattoo — studio website (Salamanca)

A production website for a tattoo studio in Salamanca: a fast, bilingual Next.js 16 landing built for local SEO and structured booking, on a zero-infrastructure-cost budget.

Cattleya Tattoo — studio website (Salamanca)

Cattleya Tattoo is a tattoo and piercing studio in central Salamanca. The brief was concrete: rank for "tatuajes Salamanca", replace appointment management over Instagram DMs with a structured intake, and eventually charge a design deposit — all on a single-developer, near-zero budget.

What's live today is a fast, bilingual landing with the SEO and performance foundations done properly — with room to grow into artist pages, portfolio, and a booking form as the studio needs them.

The brief #s1

A small studio running its bookings through Instagram DMs loses requests, can't quote consistently, and is invisible to local search. The goal was to fix all three without adding monthly cost: the only recurring expense is the domain.

  • Local SEO — be the first result for "tatuajes Salamanca" and related searches.
  • Structured intake — replace freeform DMs with a guided "tell us your idea in 3 steps" flow that funnels into WhatsApp today and a real form later.
  • Room to grow — a phased roadmap toward artist pages, portfolio, a booking form, auth + admin, and Stripe deposits, without rewrites.

Stack & decisions #s2

Next.js 16 App Router on Vercel, with an aggressively server-first posture: data and rendering happen on the server, and "use client" is reserved for the few interactions that genuinely need it. The landing ships almost no interactive JavaScript, which is most of why it feels instant.

TypeScript with explicit typing on domain-meaningful boundaries, Tailwind 4 for styling, pnpm, and Prettier + ESLint wired into git hooks so the repo stays consistent.

Local SEO from the first line #s3

SEO wasn't bolted on at the end — it shaped the first page. Everything a search engine and a social preview need is generated server-side and validated in production.

  • Metadata API: metadataBase, a title template + default, OpenGraph, Twitter summary_large_image, robots directives and a canonical alternate.
  • Structured data: TattooParlor JSON-LD (name, address, geo, telephone, sameAs, employee) plus FAQPage for the questions section.
  • Crawl surface: sitemap.ts and robots.ts serving /sitemap.xml and /robots.txt, with the domain property verified in Google Search Console.
  • Dynamic OG image rendered at request time with next/og ImageResponse (1200×630) — no static asset to keep in sync.

Performance #s4

Because the landing is server-rendered and ships almost no client JS, the numbers come out clean in production without special tuning.

Metric Result
LCP ≈90 ms
CLS 0.00
INP ≈0 ms (no interactive JS)
Lighthouse (A11y / Best Practices / SEO / Perf) 100 / 100 / 100 / 100
Production metrics on cattleyatattoo.com (mobile).

Stack

Next.js 16 React 19 TypeScript Tailwind CSS 4 Vercel SEO / JSON-LD i18n (ES/EN)

Links