You know what contractors buy. This is how they think.
11,006 recorded conversations with painting contractors — 10,586 hours across 4 years. Not a survey and not a focus group: owners talking candidly about hiring, pricing, cash, crews and the parts of the job they hate, because they were being coached rather than researched. Ask it a question and get back attributed verbatim evidence.
Write copy that sounds like them
Every excerpt is verbatim — disfluencies intact, never tidied. The phrasing a contractor actually uses for their own customers, their crew and their worst week is the phrasing an ad has to use back.
Train reps on the real conversation
What an owner is carrying when a rep walks in — the hire that fell through, the job that lost money, the thing they have not told their team. A rep who knows that is a different rep.
Segment by what actually changes
The same question read across the growth curve. What a $500K owner is solving and what a $3M owner is solving are different problems in the same trade, and they do not respond to the same message.
Coaching calls, not research calls
Every conversation here happened because an owner was working on their business with a coach. That is the source of its value and the shape of its limits: nobody was performing for a researcher, so what they said about money, staff and their own competence is unusually direct — and nobody was asked about paint, so the corpus has little to say about brand preference.
8,731 verbatim excerpts are drawn from them, most carrying a revenue band, so the same question can be read across the growth curve. Painter Growth’s own internal meetings are out of scope: every number here is a conversation with a contractor in it.
Stated up front, not in a footnote
- Purchase volumes, share of wallet or spend by brand. Nothing transactional is in the corpus.
- Market sizing, or anything projectable to the national pro population. It is a coaching population, not a probability sample.
- Campaign, ad or packaging recall. Nobody was shown stimulus.
- Price elasticity as a number. You get the reasoning behind price behaviour, not a curve.
- Brand preference between manufacturers. Contractors were being coached on their business, not asked about paint.
Documented, so it can be audited rather than believed
Every conversation above is held as a full transcript, not a summary. The index holds 305,941 embedded passages across them, with the 8,731 labelled excerpts drawn on top. Four steps sit between a question and an answer, and each one is a claim you can check.
Every transcript is chunked and embedded
Both layers are embedded with voyage-3.5 at 1,024 dimensions and indexed with pgvector HNSW. Queries are embedded with the same model — a query vector from a different model is nearest-neighbour noise, not a weaker result.
Meaning, not keywords — and deep enough to filter
A question is matched by semantic similarity, so "the job that lost money" finds an owner who never used those words. Retrieval pulls a pool of 200 and hands the model 20, because pgvector stops walking an HNSW index at ef_search candidates: asking for 200 with the default of 40 silently returns 40, and a filter applied to 40 rows is a filter applied to nothing.
Revenue bands are matched exactly, never by substring
The band written by the extractor is normalised on read and compared exactly. Matching it as text looks fine and is wrong — a pattern for $3M also matches $1M–$3M, and a request for the top band came back nineteen-twentieths the band below it. That is measured, not hypothetical.
The model may only cite what it was given
Claude reads the retrieved excerpts and nothing else. Citations resolve against that set, so an invented reference resolves to nothing rather than to the wrong quote, and an answer with no resolvable evidence is discarded instead of shown. A thin set is reported as thin.
The console is one reading of this. It is not the asset.
What sits underneath is a labelled, embedded, traceable dataset. Anyone on your side who works with vectors and categorical data can go at it directly — and the rough edges are named here rather than found later.
Vectors, not just text
Every chunk and every excerpt carries its 1,024-dimension embedding. That is the input to clustering, topic models, outlier detection and similarity work that has nothing to do with asking questions in a box — including projecting your own language into the same space to see what it sits next to.
Structured facets per excerpt
Each excerpt is labelled with theme, angle, segment, revenue band, sentiment, emotional driver, intensity and a grounding score. Emotional driver is a small closed set — seventeen values at last count, fear and frustration through pride and ambition — so it behaves as a categorical you can group and cross-tabulate on directly.
Where the labels are rough
Theme and angle are open-vocabulary: the extractor wrote thousands of distinct values, some snake_case and some sentence-case. They are a clustering input, not a taxonomy, and anyone treating them as categories will get thousands of groups of one. Revenue band needs the same normalisation the console applies.
Traceable to the conversation
Every excerpt keys back to its recording and its position in the transcript, so any finding can be walked back to the surrounding minutes of conversation. Nothing here is an aggregate you have to take on faith.
Joinable to what you already have
The unit is a contractor at a moment in time, carrying a revenue band and a date. That is enough to align with your own segmentation, territory or category data and ask what your numbers cannot: not what a segment bought, but what the owners in it were worried about that quarter.
Anonymised, and deterministically so
Identity is replaced at export with a stable derived id — no names, companies or cities, and no lookup table anywhere. The same contractor is the same id across every query, so longitudinal work is possible without anyone being identifiable.
Access beyond this console — a scoped extract, a query interface for your team, or a defined slice to work against — is a conversation about terms and scope, not a download. The point of stating the shape here is that you can decide whether it is worth having.
Every question becomes a project you can keep working
Ask, read the evidence, then ask the follow-up. The answer, its quotes and the thread stay together.
Open the console →