Spec 0.1-draftTattoo 0.1.0 · draftEdit on git.cafe ↗
On this page

Industry packs

Shared objects. Trade-specific questions.

A pack defines the questions and pricing factors for a trade. Each business chooses its enabled factors, rates, minimums and deposit rules. All packs use the same core objects.

Tattoo Draft · 0.1.0

Powered by Tattoo.dev. Pack ID: tattoo. The reference catalogs and evaluator live in packs/tattoo/ in the repository.

Example data, not real prices. Reference settings are synthetic and carry the provenance “tattoo.co current constant, unvalidated.” They are not validated market prices. The example seven-day expiry is a configurable business choice, not a protocol default.

Intake questions

Preserve raw sizes, including unsure. Positive width and height, both supplied in inches, override square defaults. Placement is multi-select; multiple selections do not add areas. Budget and first-tattoo answers are informational and do not affect price. Required questions depend on enabled factors and asked versus inferred mode.

Tattoo question catalog
IDQuestionTypeCatalog required
descriptionDescribe your tattootextYes, when applicable
placementPlacement areasmulti_selectYes, when applicable
sizeSize choicesingle_selectYes, when applicable
widthWidthnumberNo
heightHeightnumberNo
complexityComplexitysingle_selectYes, when applicable
styleColor stylesingle_selectYes, when applicable
budget_minMinimum budgetnumberNo
budget_maxMaximum budgetnumberNo
first_tattooIs this your first tattoo?booleanNo
reference_imagesNumber of reference imagesnumberNo

Pricing switches

Tattoo factor catalog
FactorStatusEnabled by default
sizemodeledYes
placementmodeledYes
complexitymodeledYes
stylemodeledYes
wraparoundmodeledNo
tiermodeledYes
depositmodeledYes
sessionsnot yet modeledNo
cover_upnot yet modeledNo
multi_areanot yet modeledNo
city_ratenot yet modeledNo
non_usdnot yet modeledNo

Size, placement, complexity, style, wraparound, tier and deposit have reference math. Sessions/session caps, cover-up, multi-area summing, city rate and non-USD currency are explicitly not yet modeled and cannot be enabled. The session envelope is provisional, not session splitting.

Reference evaluator

Call evaluate(answers, pricingModel, now) with consent alongside the raw answers and an explicit Date or RFC 3339 timestamp. Call getEnabledQuestions(pricingModel) to select intake questions. The evaluator does no I/O, reads no clock and does not mutate its inputs.

For a QuoteRequest, pass { ...request.answers, consent: request.consent }. A non-binding Estimate includes a price range in both pre_price and post_price review modes, and still requires artist review. The evaluator does not approve quotes or anonymize free text.

Tattoo QuoteRequest. Example data, not real prices.
Tattoo QuoteRequest
{
  "pack_id": "tattoo",
  "pack_version": "0.1.0",
  "answers": {
    "description": "A small geometric mountain design with clean outlines.",
    "size": "sm",
    "placement": [
      "Lower Arm"
    ],
    "complexity": "simple",
    "style": "blackgrey"
  },
  "consent": {
    "share_for_pricing_research": false,
    "anonymize": true,
    "captured_at": "2026-11-05T12:00:00Z"
  }
}

Inspect the actual default model · See the evaluator’s complete Estimate · Question catalog schema · Factor catalog schema

Help define the next pack

  • Laser removal — planned.
  • Agency websites — planned.
  • Auto wraps / PPF / tint — planned.

These are directions for co-design, not available packs. No draft pricing or industry-specific schema is published for them.

Co-design a pack for your industry