← Back to Blackwattle Tattoo Generative Assets index

Build guide · Wave 39 · Industry Demos XXVIII · site 352

How the Blackwattle Tattoo demo was built

A fictional private-studio custom tattoo shop on William Street, Northbridge, built as a single conversion page for a first-timer with a reference photo, a collector booking her next sitting, the bloke who wants the old name covered, and the pair who want matching fine-line. One job: a consult request that already carries the placement, size, style and extras — priced.

Concept

Blackwattle Tattoo is the wave's dark site. The direction is the studio after the last client: ink-black ground, bone ink, ox-blood calls to action, brass linework for the machine frame and lamp arms. Sharp, quiet, unhurried — a clean bench under a lamp. The signature is the Placement Map: a drawn standing figure (front and back by chip, the view flips with a drawn turn), placement chips that light the zone in ox-blood, a stencil scaled honestly to the chosen size on the drawn limb, the design redrawn in the chosen style, a drawn machine and hand tracing the stencil on a loop, and the studio's booking card pinned beside the figure carrying the sitting price. Every chip pre-fills the booking form.

Palette — measured, not assumed

All figures below are WCAG contrast ratios measured from the shipped hex tokens during Pass 1 (the spec's ratios were hypotheses).

#151316ink black — page ground; a bottle of black ink
#211D23lifted card ground (stage, ledger, service cards)
#EDE6DAbone — body ink, 14.9:1 on ink, 13.4:1 on card; also the stencil paper and booking card
#B9AFA3bone-soft — secondary copy, 8.6:1 on ink, 7.7:1 on card
#8E857Abone-dim — chip captions and fine print, 5.1:1 on ink, 4.6:1 on card
#9E2B2Box-blood — CTA fill, white labels 7.4:1; zone highlight. Never text on the dark ground (2.5:1)
#7F1F1Fox-blood deep — hover/pressed fill (white 9.9:1) and the booking-card eyebrow on bone (8.0:1)
#E27068ox-blood ink — the pre-minted lighter variant for ox-blood-coloured copy: 5.9:1 on ink, 5.3:1 on card (spec ≈5.5, verified); the needle trace and ledger notes
#C9A25Ebrass — machine frame, leader lines, rules, eyebrows, chip outlines: 7.8:1 on ink, 7.0:1 on card
#E4C58Cbrass-ink — links and accent copy over card grounds, 10.0:1 on card

Ox-blood copy on the ground fails (2.5:1), exactly as the spec warned, so it never carries text: the ledger notes and the needle trace use the pre-minted #E27068. Brass small copy passes on both grounds so the lighter brass-ink is used for links only. The booking card and confirmation panel invert to bone paper with ink-black type (14.9:1) — that's the stencil-paper move that lets a black-outline design read as a real stencil.

Type

DM Serif Display (400) for the wordmark, headings, the display line and the prices — a high-contrast serif with a shop-sign spine, and it makes a "$540" look like something painted on the studio window. Inter for everything else, 17px on mobile and 18px from 760px. The display moment is the piece set huge in caps above the map — A5 ON THE FOREARM, FINE‑LINE, THREE HOURS — with the style in brass italic; the hours are spelled as words from the pinned model (half an hour, an hour and a half, six hours…) so the line always reads as a sentence. Non-breaking hyphens keep FINE‑LINE and COIN‑SIZE from splitting at a line end.

Techniques

The Placement Map — how the signature works

The figure is drawn once at ~583 px for a 1750 mm person, so 0.333 px per millimetre is the scale that makes the stencil honest: a coin is a 25 mm circle (8 px), a palm 80 × 80 mm, a hand-size piece 100 × 150 mm, A5 148 × 210 mm, A4 210 × 297 mm — the dashed stencil rectangle is those millimetres times the scale, rotated to the limb's axis, and the size tag under it prints the real dimensions with the pinned hours. It's a flat projection: a big piece overhangs a thin limb on the drawing the way an A4 wraps a real forearm. The stencil paper is bone at 86% so the skin shows through, which lets the cover-up toggle draw a faded old mark (a script-and-star squiggle) under the paper with the new design's strokes 1.6× heavier over it. Four paints of one rose: fine-line is hairline black outlines; traditional & blackwork is a bold outline with the leaves filled solid; colour is the same rose with ox-blood petals, teal leaves, a brass stem and a red spiral accent; realism drops the outline for radial-gradient shading. The machine is an upright coil machine (tube, L-frame, two coils, spring) with the artist's fist drawn around the grip, leaned 34° so the needle points to the trace head; each frame the trace head's position on the stencil perimeter (getPointAtLength on a pathLength="1000" path, mapped through getScreenCTM) becomes the machine's translate, with a 0.5 px needle buzz and an opacity breath between 0.85 and 1 — never below the 0.55 floor. Hard placements (ribs, hand & neck) draw a "+1 hr" tag beside the zone label; labels sit left of the figure, the size tag under the stencil, and the booking card is an HTML card pinned top-right so nothing collides with anything at any of the three widths.

Pricing model (pinned anchors)

AnchorValueSemantic
Size → hourscoin ½ h · palm 1 h · hand 2 h · A5 3 h · A4 5 hreal dimensions printed on the size tag
Style → ratefine-line $180/h · traditional & blackwork $180/h · colour $200/h · realism $220/hsitting = total hours × rate; every rate is even so ½ h is a whole dollar
Hard placementribs, hand & neck: +1 h at the style rateNOTE "ribs, hands and necks add an hour — the skin's tougher and slower, and we don't rush it" + drawn "+1 hr" tag; absent elsewhere
Cover-up / rework+2 h at the style rate, live at every combinationNOTE template "cover-up — 2 hours added at $<rate>/h"; the old mark is drawn under the stencil
Shop minimum$150 per sitting on the whole sitting priceNOTE "billed at the $150 shop minimum — needles, set-up and sterile everything cost the same for a coin as a palm"; only coin × any style with no hard placement and no cover-up falls under it
Sittingstotal hours > 5NOTE only, no price change: "over five hours we split it across sittings — same total, priced per sitting"
Deposit$100 booking deposit comes off the sittingdeclaration on badge, ledger and a11y mirror — never a line item, never subtracted
Includedconsult, drawing, stencil, one free touch-up within three monthsdeclared on-card, never line items
Quoted at consultationsleeves, back pieces, large cover-ups, hand-poke; flash days flat-priced on the daydesigned price-less lines in the grid and FAQ

Worked examples — all measured from the running page and cross-checked against a separately written oracle

ScenarioArithmeticMeasuredNotes asserted
Rest — forearm, A5, fine-line, cover-up off, front3 × 180$540none; deposit declaration on all three surfaces
Coin, forearm, fine-line0.5 × 180 = 90 → minimum$150minimum note PRESENT (grid floor)
Coin, ribs, fine-line1.5 × 180$270minimum ABSENT, hard note + "+1 hr" tag PRESENT
Hand, calf, colour2 × 200$400none
Hand, calf, realism, cover-up4 × 220$880"cover-up — 2 hours added at $220/h"
A4, forearm, traditional5 × 180$900sittings ABSENT (5 is not > 5)
A4, ribs, realism6 × 220$1,320hard + sittings PRESENT
Rest + cover-up5 × 180$900sittings ABSENT
Rest + cover-up on ribs6 × 180$1,080sittings PRESENT (boundary both sides)
Rest → colour / realism / traditional3 × 200 / 220 / 180$600 / $660 / $540none
Back view, back placement, A5 fine-line3 × 180$540placement is price-inert except hard zones
Extra checks: coin hand & neck realism · palm chest colour · coin thigh colour · coin upper arm realism1.5 × 220 · 1 × 200 · 100 → min · 110 → min$330 · $200 · $150 · $150as pinned

Badge short forms below 640 px (ledger and mirror always carry the full template): hard → "+1 h — ribs, hands and necks"; minimum → "billed at the $150 shop minimum"; sittings → "split across sittings — same total"; the cover-up template is short enough to stay whole; deposit → "$100 deposit off the sitting".

Builder decisions the spec left open. (1) The view chip: chest is only drawn on the front and back only on the back, so choosing chest FORCES the front view and choosing back FORCES the back view (with the drawn turn); while a one-sided placement is selected the other view chip is DISABLED with the on-page reason "the chest is only drawn on the front view — pick another placement to turn the figure". Moving to a two-sided placement re-enables both chips and keeps whichever view is showing (no reset). (2) The hand & neck stencil is centred on the back of the hand at every size, and the neck is highlighted as a second dashed zone; a big stencil overhangs the drawn hand — honest, since an A5 doesn't fit on a hand. (3) The stencil is a flat projection of the real millimetres; wrapping isn't drawn.

Conversion decisions

Local SEO we'd implement for the real business

The live page carries only WebPage / WebSite / BreadcrumbList schema naming it a demonstration. For the real studio we'd ship this (their real reviews, hours and geo), plus a Google Business Profile with the same NAP, per-artist portfolio pages, and an aftercare page that answers the questions in the FAQ:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TattooParlor",
  "name": "Blackwattle Tattoo",
  "image": "https://blackwattletattoo.example/studio.jpg",
  "url": "https://blackwattletattoo.example/",
  "telephone": "+61 8 9000 0352",
  "priceRange": "$150 – $1,500",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "William Street",
    "addressLocality": "Northbridge",
    "addressRegion": "WA",
    "postalCode": "6003",
    "addressCountry": "AU"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": -31.946, "longitude": 115.859 },
  "openingHoursSpecification": [
    { "@type": "OpeningHoursSpecification", "dayOfWeek": ["Tuesday","Wednesday","Friday","Saturday"], "opens": "10:00", "closes": "18:00" },
    { "@type": "OpeningHoursSpecification", "dayOfWeek": "Thursday", "opens": "10:00", "closes": "20:00" }
  ],
  "areaServed": ["Northbridge","Perth","Leederville","Mount Lawley","Subiaco","Victoria Park","Fremantle"],
  "hasOfferCatalog": {
    "@type": "OfferCatalog",
    "name": "Tattoo work",
    "itemListElement": [
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Custom fine-line" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "180", "priceCurrency": "AUD", "unitText": "hour" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Colour work" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "200", "priceCurrency": "AUD", "unitText": "hour" } },
      { "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Realism" }, "priceSpecification": { "@type": "UnitPriceSpecification", "price": "220", "priceCurrency": "AUD", "unitText": "hour" } }
    ]
  },
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.9", "reviewCount": "184" },
  "review": [
    {
      "@type": "Review",
      "author": { "@type": "Person", "name": "Priya" },
      "reviewRating": { "@type": "Rating", "ratingValue": "5" },
      "reviewBody": "My first one — the forearm was the easy spot, talked through every pass, stopped whenever I asked."
    }
  ]
}
</script>

What would change for the real client

Iteration log

Pass 1 — Craft

Pass 2 — Depth

Pass 3 — Hardening

Blackwattle Tattoo is a fictional business — a tattoo studio industry demonstration designed & built by Sapience Analytics, part of the Generative Assets collection. Back to the site · Index.