People now ask ChatGPT, Gemini and Claude things like "what's the best tool for X?" before they ever open Google. If your product is in that answer, you get a visit. If it isn't, you never find out.
I wanted to measure this properly, so I built CiteLadder and open sourced it under AGPL-3.0. This post walks through running it on your own machine and getting a first real result. No sign-up, and your data stays with you.
What you are measuring
You give it a set of real buyer questions (prompts). On a schedule it asks the answer engines and records every answer. From those answers you get:
- which brands are named (yours and your competitors), your share of voice and rank
- which pages and domains are cited
- what the engines get wrong about you, checked against your own site
- how the numbers change between runs that used the same prompts and engines
Engines covered: ChatGPT, Claude and Gemini through their APIs, plus ChatGPT Search, the Gemini app and Google AI Overviews through DataForSEO.
One honest note: this measures what the engines answer, observed over time. It does not prove why an answer changed. Site and demand data are leading indicators, not proof of cause.
Step 1: Run it
You need Docker with Compose v2.
git clone https://github.com/abhij1306/CiteLadder.git
cd CiteLadder
docker compose up -d --build
The first build takes a few minutes. Then open http://localhost:8100. There is no login. The Compose file binds to 127.0.0.1 only, so it is not exposed to your network.
No Docker? You can run it with Node.js 26+, pnpm 12 and PostgreSQL 16. The README has the commands.
Useful commands:
docker compose logs -f app # follow logs
docker compose down # stop, keep data
docker compose down -v # stop and delete all data
Step 2: Create a project
Enter your website. CiteLadder researches the brand and proposes competitors and an ideal customer profile. You confirm or edit them. It is worth ten minutes here, because everything downstream depends on the competitor list.
For the Agent, brand research and prompt generation, set an LLM in .env (copy .env.example). Anthropic and OpenAI are fully supported. Any OpenAI-compatible endpoint works for research and generation, including a local Ollama server.
Step 3: Add your keys (bring your own)
Go to Settings > Providers and add the keys you have: OpenAI, Anthropic, Google, and DataForSEO if you want ChatGPT Search, the Gemini app or AI Overviews. You pay those providers directly. Keys are stored encrypted in your own database.
Back up the citeladder_data volume together with the database. The encryption key lives there.
Step 4: Write prompts like a buyer
Prompts are the whole experiment. Generate candidates from your site, market and competitors, then review them before they are tracked. Organise by topic, intent and buyer stage.
Good: "What are the best open source alternatives to X for a small team?"
Weak: "Tell me about MyBrand." Nobody asks that before they know you.
Step 5: Run an audit and read the answers
Run the audit. For each answer you can open the record: the engine, the prompt, the date, where your brand appeared and which sources were cited. Start with two numbers:
- Visibility: how often you are named across tracked prompts
- Owned citation rate: how often the cited pages are yours
Then look at who is named next to you, and which publishers keep showing up. Those are the pages that shape the answers in your category.
Run the same prompts again later. Comparing runs under the same prompts and engines is where the signal is.
Step 6: Check why
Site Health crawls your site (politely, with bounds) and checks things that affect AI answers: robots.txt and llms.txt access for AI crawlers, structure, evidence, freshness. It needs no keys. Findings roll into a ranked list of actions you can work through and mark done.
CiteLadder never publishes anything to your site for you.
Optional: use it from your AI assistant (MCP)
The MCP server has 46 tools. You can read visibility, sources, Site Health, actions, demand and traffic, and also make changes such as adding prompts or competitors, launching audits and updating actions. Every change is shown as a preview and applied only after you confirm.
For self-hosting, set MCP_TOKEN in .env to a long random string, restart, then for example:
claude mcp add --transport http citeladder http://localhost:8100/mcp \
--header "Authorization: Bearer <MCP_TOKEN>"
Before you expose it
It is a single-workspace tool with no login. Put an authenticating reverse proxy in front of it before opening it to a network, and list any extra host names in ALLOWED_HOSTS.
Licence and hosted version
The code is AGPL-3.0. If you run a modified version as a network service, you must offer the source to its users. I am the only maintainer right now, so issues and PRs are welcome and I will read them.
If you would rather not run it, there is a hosted version at citeladder.com with a 7-day free trial on ChatGPT answers (limits apply).
- Repo: https://github.com/abhij1306/CiteLadder
- Hosted: https://citeladder.com
- Docs: https://docs.citeladder.com
If you try it, tell me what was confusing in the setup. That is the most useful feedback I can get.
Top comments (0)