<?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: adif sgaid</title>
    <description>The latest articles on DEV Community by adif sgaid (@adifsgaid).</description>
    <link>https://dev.to/adifsgaid</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%2F546940%2Ffea5f8c0-0f71-4d0c-bb2f-2692df793711.jpeg</url>
      <title>DEV Community: adif sgaid</title>
      <link>https://dev.to/adifsgaid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adifsgaid"/>
    <language>en</language>
    <item>
      <title>What actually got our articles cited by ChatGPT (and what didn't)</title>
      <dc:creator>adif sgaid</dc:creator>
      <pubDate>Thu, 23 Jul 2026 16:01:30 +0000</pubDate>
      <link>https://dev.to/adifsgaid/what-actually-got-our-articles-cited-by-chatgpt-and-what-didnt-5906</link>
      <guid>https://dev.to/adifsgaid/what-actually-got-our-articles-cited-by-chatgpt-and-what-didnt-5906</guid>
      <description>&lt;p&gt;A few weeks ago I found out our site had a table of contents that rendered for absolutely nobody.&lt;/p&gt;

&lt;p&gt;The code was there. The CSS was there. It had been shipping to production for months. It just never appeared, because the partial looked for &lt;code&gt;h2[id]&lt;/code&gt; and our markdown renderer only ever emitted &lt;code&gt;&amp;lt;a name="..."&amp;gt;&lt;/code&gt; — a legacy anchor, no &lt;code&gt;id&lt;/code&gt; on the heading itself. So the selector matched zero elements, every time, on every article. Nobody noticed because nobody was looking at it.&lt;/p&gt;

&lt;p&gt;I only found it because I was hunting for something else: why our content wasn't getting picked up by AI search — ChatGPT, Perplexity, Google's AI Overviews. We've got ~1,600 published articles. Plenty of traffic historically. And almost nothing showing up as a &lt;em&gt;citation&lt;/em&gt; in any of the answer engines.&lt;/p&gt;

&lt;p&gt;That hunt turned into a couple of weeks of work. Here's what actually mattered, what didn't, and the stuff I got wrong on the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing nobody tells you: access comes first
&lt;/h2&gt;

&lt;p&gt;I spent a day reading AEO checklists (that's "answer engine optimization" — SEO for the machines that answer instead of link). Every one of them opens with schema markup. None of them start with the question that actually gates everything: &lt;strong&gt;can the AI crawlers even fetch your pages?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go look at your &lt;code&gt;robots.txt&lt;/code&gt; right now. The bots that feed the answer engines are &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;OAI-SearchBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;PerplexityBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt;, &lt;code&gt;CCBot&lt;/code&gt;. If any of those are disallowed, everything downstream is theater.&lt;/p&gt;

&lt;p&gt;There's a genuinely nasty gotcha here I didn't know. In the robots protocol, a &lt;em&gt;named&lt;/em&gt; user-agent group &lt;strong&gt;replaces&lt;/strong&gt; the &lt;code&gt;*&lt;/code&gt; group for that bot — it doesn't merge. So if you did the "nice" thing and added &lt;code&gt;User-agent: GPTBot&lt;/code&gt; / &lt;code&gt;Allow: /&lt;/code&gt; blocks, congratulations: those bots now ignore all your &lt;code&gt;*&lt;/code&gt; disallows and happily crawl &lt;code&gt;/reactions&lt;/code&gt;, &lt;code&gt;/admin&lt;/code&gt;, whatever. We had GPTBot burning crawl budget on tracking endpoints for exactly this reason. The fix was to delete all the per-bot groups and keep one &lt;code&gt;User-agent: *&lt;/code&gt; that allows content and blocks only the junk. Everyone, bots included, follows it.&lt;/p&gt;

&lt;p&gt;Then add an &lt;code&gt;llms.txt&lt;/code&gt; — a plain-text, hand-curated list of your best URLs with a one-line description each. It's the "here's what's worth reading" file for models. Cheap to write, and it's becoming a real convention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make your paragraphs quotable
&lt;/h2&gt;

&lt;p&gt;This is the part that clicked for me. Answer engines don't cite pages. They cite &lt;em&gt;passages&lt;/em&gt;. And a passage a model can grab cleanly is one that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lives under a heading that answers a real question ("How much VRAM do I need for a 70B model?" not "Requirements"),&lt;/li&gt;
&lt;li&gt;states its answer in the first two sentences, no "as we discussed above,"&lt;/li&gt;
&lt;li&gt;and is small enough to be a chunk on its own (the rough unit is ~500 tokens).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparison content punches above its weight here, and I think I finally understand why. The rerankers these systems use are good at contrast and negation — "X does this, Y does &lt;em&gt;not&lt;/em&gt;." So a section literally titled "Cursor vs Copilot" with a table underneath is basically pre-chewed for them.&lt;/p&gt;

&lt;p&gt;And — back to my dead table of contents — put &lt;code&gt;id&lt;/code&gt;s on your headings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- legacy, not enough --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"vram"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;VRAM&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- what you want --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"vram"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;VRAM&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fragment-addressable sections (&lt;code&gt;/post#vram&lt;/code&gt;) are easier for a model to isolate and quote. Fixing our renderer was one line. Fixing the &lt;em&gt;existing&lt;/em&gt; 1,600 articles meant re-rendering all of them, because the HTML was stored, not generated on the fly. Don't forget that step — I almost did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schema: useful, but not for the reason you think
&lt;/h2&gt;

&lt;p&gt;Yes, emit JSON-LD. But Google killed FAQ rich &lt;em&gt;results&lt;/em&gt; for most sites back in 2023, so if you're doing FAQ schema for the little dropdown in search results, stop — you won't get it. Do it because the answer engines &lt;em&gt;parse&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;One bug I'd bet money you have if you generate FAQ schema from markdown: your answer text is full of markdown. A &lt;code&gt;[link](url)&lt;/code&gt; or &lt;code&gt;**bold**&lt;/code&gt; sitting inside &lt;code&gt;acceptedAnswer.text&lt;/code&gt; looks broken to a parser. We were doing exactly this. Strip the syntax before you store it — plain text only.&lt;/p&gt;

&lt;p&gt;The one that I think matters most, though, is the site-level entity graph. An &lt;code&gt;Organization&lt;/code&gt; + &lt;code&gt;WebSite&lt;/code&gt; block, emitted on every page, with a &lt;code&gt;sameAs&lt;/code&gt; array pointing at your real social/profile URLs. It's how you tell these systems "this domain is a coherent entity you can trust as a source." If you do one schema thing, do this one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;Here's what I can't tell you: whether any of it worked yet.&lt;/p&gt;

&lt;p&gt;Our Google traffic is still down about 24% over the last month. The AEO changes are days old. Crawlers re-fetch on their own clock, and the answer engines update slowly, so the earliest I'd expect to see movement is a few weeks out. Anyone promising you a before/after in 48 hours is selling something.&lt;/p&gt;

&lt;p&gt;What I &lt;em&gt;can&lt;/em&gt; tell you is the metric to watch, and it's not Google clicks. It's &lt;strong&gt;cited pages&lt;/strong&gt; — how many of your URLs show up as sources inside ChatGPT / Perplexity / AI Overviews. Some tools report this now. That number is the one that responds to this work. Track it every couple of weeks, ignore the daily noise.&lt;/p&gt;

&lt;p&gt;So that's the playbook: let the crawlers in, make your paragraphs stand on their own, describe your entity consistently, and measure the right thing. Most of it is unglamorous. The table of contents that rendered for nobody is a decent metaphor for the whole exercise — half of AEO is just fixing the quiet stuff you assumed already worked.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I run &lt;a href="https://promptzone.com" rel="noopener noreferrer"&gt;PromptZone&lt;/a&gt;, a community for prompt engineering and AI builders. Everything above came out of doing this to our own corpus.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Deploying Forem on Render.com PromptZone.com</title>
      <dc:creator>adif sgaid</dc:creator>
      <pubDate>Tue, 30 Apr 2024 08:31:03 +0000</pubDate>
      <link>https://dev.to/adifsgaid/deploying-forem-on-rendercom-promptzonecom-3721</link>
      <guid>https://dev.to/adifsgaid/deploying-forem-on-rendercom-promptzonecom-3721</guid>
      <description>&lt;p&gt;The journey of deploying an open-source software platform like &lt;a href="https://github.com/forem/forem"&gt;forem&lt;/a&gt; can be complex and daunting, but with the right tools and services, it can also be remarkably rewarding. This article details my experience deploying &lt;a href="https://www.forem.com/"&gt;Forem&lt;/a&gt;, the software behind the &lt;a href="//Dev.to"&gt;Dev.to&lt;/a&gt;, on &lt;a href="https://render.com/"&gt;Render.com&lt;/a&gt;, deploying &lt;a href="https://promptzone.com/"&gt;Promptzone.com&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Understanding Forem&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Forem is an open-source platform designed to empower community builders to create their own spaces for discussion and connection. It's built using a robust tech stack including Ruby on Rails, JavaScript, and PostgreSQL, making it a solid choice for developers looking to customize or scale their community platforms.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Choosing Render.com for Deployment&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Render.com emerged as an excellent choice for deploying Forem due to its simplicity and powerful features, think of it like Heroku when it was still cheap and good. Render offers straightforward configurations, automatic scaling, and a suite of services that support web applications, background workers, cron jobs, and databases—all crucial for a Forem deployment.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Step-by-Step Deployment Process&lt;/strong&gt;
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting Up the Forem Repository&lt;/strong&gt;: The first step involved forking the Forem repository on GitHub. This allowed me to manage customizations and updates with ease.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Configuring Render.com Services&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web Service&lt;/strong&gt;: I configured a web service on Render for the Forem web application. This involved setting environment variables such as the database URL and Redis instances, I then deployed a Docker image to the Docker hub registry and deployed in a web service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background Workers&lt;/strong&gt;: Forem utilizes Sidekiq for background jobs. I set up a worker service on Render to handle these jobs, ensuring that email notifications, feed updates, and other background tasks run smoothly, same thing here I deployed the same docker image.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database and Redis Setup&lt;/strong&gt;: I used Render’s managed PostgreSQL and Redis services, which provided hassle-free maintenance and scalability for the database needs of Forem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Environment and Secrets Management&lt;/strong&gt;: Render’s environment groups feature was invaluable for managing the application’s environment variables and secrets securely, make sure to add all the necessary ENV secrets otherwise it won't work (I will dive in detail in another post on everything you need.).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Going Live with PromptZone.com&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;After configuring and testing the Forem instance on Render.com, the final step was to go live. I also used Fastly.com as CDN like Forem suggested.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;This is not the suggested way of deployment by the forem team, nevertheless I found it easier and smother than using the &lt;a href="https://github.com/forem/selfhost"&gt;deployment selfhost&lt;/a&gt;, however I think it's good to know different approaches and use the one suits you the most, if you don't have time to manage a server I think using a pass like Render does the job, and it's cheaper then Heroku at the time of this post.&lt;/p&gt;

</description>
      <category>forem</category>
      <category>deploy</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
