Digital Position · competitive intelligence
Two independent captures of his content engine, merged and then taken apart into typed atoms — every statistic, claim, framework, post shape, opening line and takeaway as its own addressable unit, each one carrying its provenance, its caveat, and the DP-side work it implies. Built to be read by a person and fetched by Claude.
Matt's brief was specific: the drafts only have to get the data points and the beginner-level takeaways right. So every number Curtis leans on is here as a typed hole — what it measures, where his figure came from, the caveat that makes it honest, and the DP-account equivalent to go and get. That turns “get the data right” into a finite worklist.
| ID | His number | Measures | Provenance | The DP number to go get |
|---|
The full merged corpus, his writing reproduced verbatim. Read opens a formatted page with his images intact; .md is the same text as raw markdown, which is what the connector and any agent fetches. One document at a time either way — nobody gets handed the other ninety-three.
This adds six tools to your Claude — search the knowledge base, pull a specific benchmark, assemble a draft kit, read one of his posts verbatim. Claude does the retrieval itself; you just ask.
claude.ai → Settings → Connectors → Add custom connector, paste the
URL below, save. Claude Code: claude mcp add --transport http curtis-brain
https://curtis-kb-production.up.railway.app/mcp
The connector gives Claude the tools. The skill tells it how to use them well: search before fetching, always give a benchmark with its provenance and its caveat, never present his figures as yours. Say "curtis kb" to invoke it.
claude.ai → Settings → Capabilities → Skills → upload.
Claude Code: unzip into ~/.claude/skills/.
https://curtis-kb-production.up.railway.app/mcp
The corpus was taken apart into 275 addressable atoms precisely so that retrieval could be cheap. Answering "what's a good hook rate" through the connector costs 2,104 bytes — a search for the matching atoms, then one atom. Handing Claude the whole knowledge base instead costs 239,991 bytes. That is 114× the payload for the same answer, and it is why a folder of markdown files is a corpus rather than a brain.
Paste this and Claude will read the whole knowledge base in one go. It works, but it spends the full payload on every question and it cannot fetch his original posts.
Read __BASE__/kb.md and use it to answer everything that follows.
A single text file listing every atom and every document with its URL. This is what you give Claude first; it reads the map, then fetches only what it needs.
__BASE__/llms.txt
Every atom with all its fields, plus the source inventory, as JSON. Use this when you want Claude reasoning across the entire corpus at once.
__BASE__/index.json
Markdown with frontmatter. IDs are typed: N=number, C=claim,
F=framework, A=archetype, H=hook, T=takeaway.
__BASE__/atoms/N01.md
Every post, framework page, site page, lead magnet and published Claude Skill as raw markdown. This is the draft foundation.
__BASE__/source/newsletter/2026-08-14-a-winner-is-not-a-variable.md
Read __BASE__/llms.txt then fetch __BASE__/index.json. You now have Curtis Howland's content engine as typed atoms. Using the CLAIM atoms as raw material, give me 10 post ideas for Digital Position where: - we can take a genuinely different position from his, or extend his with our own data - each idea names the DP client data we'd need to make it real (use the dp_slot / dp_angle fields) - none of them are just a restatement of his post Rank by how defensible the idea is with data we actually have.
Fetch __BASE__/index.json. Pick the ARCHETYPE atom that best fits this topic: [TOPIC]. Then draft a Digital Position post following that archetype's beats exactly, and: - mark every place a DP number belongs as [DP DATA:] - mark every place Steve's expert opinion belongs as [STEVE POV: ] - pull the relevant NUMBER atoms in as reference, but never present his figure as ours - keep his structural discipline: every threshold gets a provenance line and a "when this does not hold" section Return the draft plus a short list of exactly which numbers we need to collect.
Fetch __BASE__/source/newsletter/.md for the original post. Do not paraphrase it into a summary. Instead: 1. Extract its skeleton — the beats in order, with what each beat is doing rhetorically 2. List every number in it and flag which are his own data vs vendor-sourced vs third-party 3. Rebuild the same skeleton for [OUR TOPIC], leaving [DP DATA] and [STEVE POV] slots 4. Tell me which of his beats we cannot honestly fill and why
Fetch __BASE__/index.json and take only atoms where type == "number". Build me a collection worklist for our accounts, grouped by the `measures` field. For each group: what to pull, from which tool, and how much work it is. Flag every number where Curtis's own caveat means our figure won't be comparable to his. Put the ones we can compute from creative alone — no account access — at the top.
Fetch __BASE__/index.json. Find every place Curtis contradicts himself or cites a vendor for a number he elsewhere disputes. The caveat fields already flag several. For each one, tell me which version to use and what we'd need to settle it ourselves.
For work you come back to, put the KB in project knowledge instead of fetching each time:
save llms.txt and index.json as project files, then add this to the
project's custom instructions.
You have a knowledge base of Curtis Howland's DTC/Meta-ads content engine,
decomposed into typed atoms. index.json holds every atom; llms.txt maps every URL.
Rules:
- His numbers are HIS. Never present one as Digital Position's own. Every NUMBER
atom has a dp_slot field naming the equivalent figure we'd have to measure.
- Every NUMBER and FRAMEWORK atom has a caveat / fails_when field. If you cite the
figure, carry the caveat with it.
- When drafting, use the ARCHETYPE atoms for structure and leave [DP DATA] and
[STEVE POV] slots rather than inventing either.
- When I ask for the original copy, fetch the source/ URL. Don't work from a summary.
A folder of 94 markdown files is a corpus, not a brain. What makes this usable by an agent is that the retrieval unit matches the reasoning unit: