<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: abhineet</title>
    <description>The latest articles on DEV Community by abhineet (@abhij1306).</description>
    <link>https://dev.to/abhij1306</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4133629%2Fb937ebf8-4389-4890-8780-852c975c3ac1.png</url>
      <title>DEV Community: abhineet</title>
      <link>https://dev.to/abhij1306</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhij1306"/>
    <language>en</language>
    <item>
      <title>How to track what ChatGPT says about your brand (open source, self-hosted)</title>
      <dc:creator>abhineet</dc:creator>
      <pubDate>Mon, 19 Oct 2026 04:12:22 +0000</pubDate>
      <link>https://dev.to/abhij1306/how-to-track-what-chatgpt-says-about-your-brand-open-source-self-hosted-3g3b</link>
      <guid>https://dev.to/abhij1306/how-to-track-what-chatgpt-says-about-your-brand-open-source-self-hosted-3g3b</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you are measuring
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which brands are named (yours and your competitors), your share of voice and rank&lt;/li&gt;
&lt;li&gt;which pages and domains are cited&lt;/li&gt;
&lt;li&gt;what the engines get wrong about you, checked against your own site&lt;/li&gt;
&lt;li&gt;how the numbers change between runs that used the same prompts and engines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engines covered: ChatGPT, Claude and Gemini through their APIs, plus ChatGPT Search, the Gemini app and Google AI Overviews through DataForSEO.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Run it
&lt;/h2&gt;

&lt;p&gt;You need Docker with Compose v2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/abhij1306/CiteLadder.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CiteLadder
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first build takes a few minutes. Then open &lt;a href="http://localhost:8100" rel="noopener noreferrer"&gt;http://localhost:8100&lt;/a&gt;. There is no login. The Compose file binds to 127.0.0.1 only, so it is not exposed to your network.&lt;/p&gt;

&lt;p&gt;No Docker? You can run it with Node.js 26+, pnpm 12 and PostgreSQL 16. The README has the commands.&lt;/p&gt;

&lt;p&gt;Useful commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; app   &lt;span class="c"&gt;# follow logs&lt;/span&gt;
docker compose down          &lt;span class="c"&gt;# stop, keep data&lt;/span&gt;
docker compose down &lt;span class="nt"&gt;-v&lt;/span&gt;       &lt;span class="c"&gt;# stop and delete all data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Create a project
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;For the Agent, brand research and prompt generation, set an LLM in &lt;code&gt;.env&lt;/code&gt; (copy &lt;code&gt;.env.example&lt;/code&gt;). Anthropic and OpenAI are fully supported. Any OpenAI-compatible endpoint works for research and generation, including a local Ollama server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Add your keys (bring your own)
&lt;/h2&gt;

&lt;p&gt;Go to Settings &amp;gt; 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.&lt;/p&gt;

&lt;p&gt;Back up the &lt;code&gt;citeladder_data&lt;/code&gt; volume together with the database. The encryption key lives there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Write prompts like a buyer
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Good: "What are the best open source alternatives to X for a small team?"&lt;br&gt;
Weak: "Tell me about MyBrand." Nobody asks that before they know you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Run an audit and read the answers
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visibility&lt;/strong&gt;: how often you are named across tracked prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owned citation rate&lt;/strong&gt;: how often the cited pages are yours&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Run the same prompts again later. Comparing runs under the same prompts and engines is where the signal is.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 6: Check why
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;CiteLadder never publishes anything to your site for you.&lt;/p&gt;
&lt;h2&gt;
  
  
  Optional: use it from your AI assistant (MCP)
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;For self-hosting, set &lt;code&gt;MCP_TOKEN&lt;/code&gt; in &lt;code&gt;.env&lt;/code&gt; to a long random string, restart, then for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http citeladder http://localhost:8100/mcp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &amp;lt;MCP_TOKEN&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Before you expose it
&lt;/h2&gt;

&lt;p&gt;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 &lt;code&gt;ALLOWED_HOSTS&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licence and hosted version
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;If you would rather not run it, there is a hosted version at &lt;a href="https://citeladder.com" rel="noopener noreferrer"&gt;citeladder.com&lt;/a&gt; with a 7-day free trial on ChatGPT answers (limits apply).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/abhij1306/CiteLadder" rel="noopener noreferrer"&gt;https://github.com/abhij1306/CiteLadder&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hosted: &lt;a href="https://citeladder.com" rel="noopener noreferrer"&gt;https://citeladder.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.citeladder.com" rel="noopener noreferrer"&gt;https://docs.citeladder.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, tell me what was confusing in the setup. That is the most useful feedback I can get.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>seo</category>
      <category>docker</category>
      <category>ai</category>
    </item>
    <item>
      <title>What an AI visibility score hides: mentions, citations, coverage and source evidence are different measurements</title>
      <dc:creator>abhineet</dc:creator>
      <pubDate>Sun, 20 Sep 2026 03:30:01 +0000</pubDate>
      <link>https://dev.to/abhij1306/what-an-ai-visibility-score-hides-mentions-citations-coverage-and-source-evidence-are-different-4i13</link>
      <guid>https://dev.to/abhij1306/what-an-ai-visibility-score-hides-mentions-citations-coverage-and-source-evidence-are-different-4i13</guid>
      <description>&lt;h2&gt;
  
  
  A score can be directionally useful and still be operationally incomplete
&lt;/h2&gt;

&lt;p&gt;AI visibility dashboards often compress a complicated observation into one number. That is convenient for a weekly report, but dangerous as a debugging interface.&lt;/p&gt;

&lt;p&gt;If a score falls from 62 to 48, what changed?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was the brand named less often?&lt;/li&gt;
&lt;li&gt;Did the model cite fewer owned pages?&lt;/li&gt;
&lt;li&gt;Did the prompt set change?&lt;/li&gt;
&lt;li&gt;Did competitors gain mentions while the brand stayed flat?&lt;/li&gt;
&lt;li&gt;Did the answer contain a citation that nobody can inspect?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are different questions. A single score cannot answer all of them unless its underlying observations remain available.&lt;/p&gt;

&lt;p&gt;The practical distinction is between four measurements: mentions, citations, coverage, and source evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Mentions: was the brand named?
&lt;/h2&gt;

&lt;p&gt;A mention is a textual appearance of the brand, product, or organization in an answer. It answers a narrow question: &lt;em&gt;did the answer say our name?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Mentions are useful for tracking recognition, recommendation language, and competitor co-occurrence. But a mention does not prove that the answer used the brand’s website as a source. An answer can name a company from general model knowledge, a directory, a review, or a retrieved page.&lt;/p&gt;

&lt;p&gt;At minimum, store the exact answer text, engine, model or surface when available, prompt, run time, and the text span that triggered the mention classification. A percentage without those records is difficult to audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Citations: what sources did the answer point to?
&lt;/h2&gt;

&lt;p&gt;A citation is a source link, source chip, or named reference attached to the answer. It answers: &lt;em&gt;what did the engine show as grounding material?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Citation and mention are independent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Mentioned?&lt;/th&gt;
&lt;th&gt;Owned page cited?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The brand is named and its documentation is linked&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The brand is named but a review is linked&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The brand is not named but its documentation is linked&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neither the brand nor an owned page appears&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The third row is easy to miss. A page can be useful evidence for an answer even when the prose never names the company. Conversely, a name can appear without the company’s source supporting the claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Coverage: how much of the test surface was observed?
&lt;/h2&gt;

&lt;p&gt;Coverage is about the measurement surface, not the answer’s wording. A team might define it as the percentage of prompt-and-engine cells that produced an observation, or as the percentage of relevant prompts where the brand was present. Those denominators must be stated.&lt;/p&gt;

&lt;p&gt;For example, “48% visibility” could mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the brand appeared in 48 of 100 prompts;&lt;/li&gt;
&lt;li&gt;the brand was mentioned in 48% of successful runs;&lt;/li&gt;
&lt;li&gt;the brand received 48% of all cited sources;&lt;/li&gt;
&lt;li&gt;48% of the monitored engines were reachable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each is a legitimate metric in the right context. None should be silently substituted for another.&lt;/p&gt;

&lt;p&gt;Coverage also exposes sampling bias. A portfolio containing only branded queries will make a brand look visible. A portfolio containing only “best tools” queries may measure category competition instead. Keep the prompt portfolio versioned, and report changes to its size, intent mix, engines, locales, and schedules.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Source evidence: can another person re-check the observation?
&lt;/h2&gt;

&lt;p&gt;Evidence is the audit layer. It connects a metric to the answer and the source behind it.&lt;/p&gt;

&lt;p&gt;A useful evidence record includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the exact prompt and portfolio version;&lt;/li&gt;
&lt;li&gt;the engine and surface used;&lt;/li&gt;
&lt;li&gt;the timestamp and locale;&lt;/li&gt;
&lt;li&gt;the raw or preserved answer;&lt;/li&gt;
&lt;li&gt;extracted mentions and citations;&lt;/li&gt;
&lt;li&gt;the URL for every cited source;&lt;/li&gt;
&lt;li&gt;the claim-to-source relationship, where it can be determined;&lt;/li&gt;
&lt;li&gt;the page snapshot or retrieval result used for review.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not the same as storing a screenshot of a dashboard. A screenshot shows a conclusion. Evidence lets a reviewer inspect the observation that produced it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the four measurements should not be collapsed
&lt;/h2&gt;

&lt;p&gt;Imagine two weekly reports:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Report A:&lt;/strong&gt; mention rate is flat, owned citations rise, and the cited pages now cover more of the answer’s factual claims.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Report B:&lt;/strong&gt; mention rate rises, but citations shift to third-party pages and the prompt set becomes smaller.&lt;/p&gt;

&lt;p&gt;A composite score might rank both weeks as improvements. An operator would make different decisions: Report A suggests stronger source grounding; Report B needs investigation before it is called progress.&lt;/p&gt;

&lt;p&gt;The same logic applies to competitors. Share of voice is not the same as citation share. A brand may be named often but receive little of the available source space. A competitor may appear less frequently but own the citations that answer the important questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small data model beats a large mystery number
&lt;/h2&gt;

&lt;p&gt;Teams do not need a perfect universal score to start. They need a stable observation table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;run_id
portfolio_version
prompt_id
engine
surface
locale
observed_at
answer_text_or_artifact
brand_mentioned
brand_recommended
owned_citation_urls
competitor_citation_urls
coverage_status
evidence_links
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Derived metrics can then be calculated for a specific purpose. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mention rate = prompts with a brand mention / eligible prompts;&lt;/li&gt;
&lt;li&gt;owned citation rate = prompts with an owned citation / eligible prompts;&lt;/li&gt;
&lt;li&gt;citation share = owned citations / all counted citations in the answer;&lt;/li&gt;
&lt;li&gt;collection coverage = completed runs / scheduled runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The denominator and eligibility rule belong beside the metric. If a number cannot open to the records behind it, treat it as a summary, not as ground truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical review checklist
&lt;/h2&gt;

&lt;p&gt;Before acting on an AI visibility score, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What exactly is the numerator?&lt;/li&gt;
&lt;li&gt;What exactly is the denominator?&lt;/li&gt;
&lt;li&gt;Are mentions and citations separate fields?&lt;/li&gt;
&lt;li&gt;Can I see the prompt and answer for a representative result?&lt;/li&gt;
&lt;li&gt;Did the prompt portfolio, engine, locale, or model change?&lt;/li&gt;
&lt;li&gt;Are the cited sources owned, earned, competitor, or unknown?&lt;/li&gt;
&lt;li&gt;Can a colleague reproduce or challenge the classification?&lt;/li&gt;
&lt;li&gt;Does the system preserve history instead of overwriting yesterday’s run?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between a score that starts a conversation and a measurement system that supports a decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;AI visibility is not one property of a brand. It is a set of observations about language, retrieval, source selection, and sampling. Mentions tell you whether the name appeared. Citations tell you what the engine pointed to. Coverage tells you how much of the test surface you actually observed. Source evidence tells you whether the result can be inspected.&lt;/p&gt;

&lt;p&gt;Use the score as a summary. Keep the four measurements underneath it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work with CiteLadder, an AI-visibility product. The examples above are measurement guidance, not a claim that CiteLadder is the only valid implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt; &lt;a href="https://citeladder.com/" rel="noopener noreferrer"&gt;CiteLadder’s AI visibility overview&lt;/a&gt; and &lt;a href="https://citeladder.com/faq" rel="noopener noreferrer"&gt;FAQ on mentions, citations, and evidence&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>analytics</category>
      <category>monitoring</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
