3-gunde-chatgpt-ye-kaynak-oldum-yaris-radari-nin-ai-first

Image by author

On Saturday evening, I opened an empty repository (code repository). On Wednesday, ChatGPT was listing my site, Yarış Radarı (Race Radar), as a source when answering a race question. In this article, I honestly explain how I built yarisradari.com, what I did to appear in AI searches (ChatGPT, Perplexity, Google AI), and what didn't work. Below is a checklist you can copy and apply to your own project.

First, let me say this: This is not an SEO agency article. I am a genuinely running programmer. Running is a way of life for me, and this project was born out of a big problem.



Love of Running + Programmer's Stubbornness = Yarış Radarı (Race Radar)

My running journey began at the end of 2017 with a run in a strange little garden with my dog. After that, it was a chain reaction: two 63K runs in Cappadocia, Uludağ, Dağyenice, long runs in the forest at 4:30 in the morning... Running has become one of the strongest pillars of my life. I explained this at length in the article "Why I Run?" which you'll see below. It was an enjoyable article. I read it from time to time.

Every runner knows: the race calendar is a constant topic of discussion for group runs. The questions go on and on: "Are you coming to this race? Are registrations open? What's the deadline?" In Turkey, however, you can't find the answers to these questions in one place. The federation calendar is in one place, the organizer's Instagram account is in another, the timing companies' lists are in a different world, and the triathlon federation's full calendar is in a PDF. By the time you hear about the race, registrations may already be closed!

Anyone who knows the pain of missing a race because you missed the registration deadline knows what I'm talking about. (I know.) For years I kept saying, "If only someone would put this in one organized place." Of course, there were examples of this, but none were satisfactory. Then I looked in the mirror: I'm a software developer.

Problem + keyboard = project.

On Saturday evening, I opened the empty repository, purchased the domain name, and filed my trademark application: yarisradari.com; a free, ad-free calendar of running, trail running, cycling, swimming, and triathlon races in Türkiye.

Moreover, even if you forget to check the calendar, it doesn't forget you: You subscribe, and it emails you before registration closes. Before publishing this article, on the third day of the site's launch, I had already gained my first email subscriber via Google. I don't know exactly what they were searching for. Detailed analytics data requires dealing with GDPR, cookies, and a lot of other legal requirements. I overcame my curiosity. I thought that this goes against the nature of the project and that these kinds of tools running on every page would slow it down. So, I don't really know what people were searching for right now.



Copyable Checklist

If you want to apply this to your own project, in order:

  1. Use SSR. Keep content in HTML without JavaScript. Run curl tests.

  2. Find data that no one else is keeping and keep it structured. Don't engage in headquery battles; be the sole source for the long queue.

  3. Add Schema.org markup (appropriate type + FAQPage [FAQ]) but only generate it from real data.

  4. Match structured data with visible content. Ghost markup is punishable.

  5. Include source and last updated date on each page.

  6. Add llms.txt but don't expect miracles from it.

  7. Sign up for Bing Webmaster Tools. ChatGPT feeds from there.

  8. Check Cloudflare's AI bot blocking: test with `curl -A GPTBot `.

  9. Explicitly allow AI crawlers in robots.txt (GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot).

  10. Measure: Check the Bing AI Performance report, and occasionally ask ChatGPT questions as if you were a real user.

Now let's get into the details.



Empty Repository on Saturday, ChatGPT Citing as Source on Wednesday

From day one, I summarized the project's goal in a single sentence: When someone asks about a race, the AI ​​should get the answer from my site and cite me as the source.

I tested it on Wednesday. I hadn't even talked to the ChatGPT version I was using in my browser about this. The guy didn't know I was developing a brand new race announcement website. With web search open, I asked ChatGPT like a regular user: "When is the Davraz Sky Run?" The answer came: date, location, tracks. And on the source card: Yarış Radarı (Race Radar). The title and description came from the metadata of my page.


Yazar tarafından alınmış ekran görüntüsü

Screenshot by author

Runners will understand what I felt at that moment: like seeing the finish line. The race isn't over yet, but you know it's about to end. You say, "I did it! I've been training and working for months, and finally I finished!" and you smile, that's exactly how I felt. Like when your exam results are announced and you've gotten into your target university...

Effective 3 days. A brand new domain, zero backlinks. Aha, now I'm going to put a link to my own site through this article. Zero promotion. I haven't sent anyone a link yet, I haven't said, "Support me, click on my bio..."

An honest footnote to this speed: I did most of the development with Claude Code; the scraper, site, SEO, and GEO layers, which would normally take weeks, were squeezed into days. But speed is only a small part of the job. The real issue was what decisions were made; because if I had built the same site saying, "First the visual show, then we'll look at SEO," this article wouldn't exist.

So what did I do?



What are GEO and AEO? Optimizing for Answer Engines, Not Google

Classic SEO was all about getting to the top of the blue link list. You've probably heard that even Google's click-through rates have decreased. Why do you think they created AI mode? Now there are two more abbreviations: AEO (Answer Engine Optimization) and GEO (Generative Engine Optimization): getting generative engines like ChatGPT, Perplexity, and Google AI to cite you as a source.

Let me explain the difference with an example. In classic SEO, the goal is for someone searching for "Davraz Sky Run" to click on your link on Google. In GEO, the user might never even visit your site; they'll give a ChatGPT answer, and below it, they'll put a small source card as you see in the screenshot above. Your reward isn't clicks, it's name recognition. Becoming the "source of racing knowledge" as a brand.

It sounds like three separate disciplines, but in practice, they all lead to the same thing: produce content that machines can read, trust, and cite. I built the site from the start with this priority. Even in design decisions, the order of priority was always the same: crawler first, then visual appeal.

Every page is SSR: Content Hidden Behind JavaScript Doesn't Exist for AI

This was the most critical technical decision. The entire site is rendered on the server (Next.js on Cloudflare Workers). The calendar on the homepage runs with zero JavaScript; even the panel that opens when you tap a day on mobile is done with CSS.

Why am I so obsessed with this? Because most AI crawlers don't run JavaScript, or if they do, they don't trust it. Pull your page with curl, and if the HTML you see doesn't contain your content, then you don't exist for ChatGPT either.

Simple test:

code
curl -s https://siten.com/ilgili-sayfa | grep "searched content"
code
curl -s https://yarisradari.com/yaris/davraz-sky-run-2026 | grep Davraz

If it's returning empty, it means there's no such thing as AI visibility. Mine is full, of course. 😎



Capture Data No One Else Is Holding: Take Control of the Long Tail

Let's be realistic: AI can prioritize showing someone searching for "Istanbul Marathon" the official website. And it should. I'm not going to bother trying to surpass the Istanbul Metropolitan Municipality's (IMM) advertised race websites on my own. That battle is pointless.

But the following questions weren't answered comprehensively anywhere: "When is the registration deadline for race X? How much is the registration fee? What is the mandatory equipment list? Is a health certificate required? What is the elevation gain of the course in meters?" So I wrote the scraper for exactly these questions. The system, written in Python, scans 8 sources every morning: federation calendars, timing companies, UTMB, major marathons, HYROX. It extracts not only the date and name, but also the registration deadline, fee, mandatory equipment, course distances, and climbing data.

Where automation isn't enough, I enter the data manually. The races on the triathlon federation's PDF-only calendar, HYROX events, and local runs without a source: all were added individually from the admin panel. The scraper doesn't touch the record I manually corrected, meaning human effort isn't crushed under the robot's weight.

There's also a user-facing aspect to this data: email alerts. You select your discipline and leave your email address. I remind you of races with approaching registration deadlines: once 7 days before, and again 2 days before. For races with unknown registration deadlines, the same reminder is sent based on the race day. This is the solution to the "registrations were closed when I heard about the race" problem mentioned at the beginning of the article.

While I was putting this together, as mentioned above, the site's first real subscriber arrived. I don't know them, and I didn't promote them. I don't keep track of users; but according to Cloudflare's privacy-friendly statistics, almost all organic traffic that day came from Google, and visits came from long-tail searches like "Muğla Victory Run," "Ultra Abant," etc., to the race pages. So my subscriber most likely found the site on Google. What I know for sure is this: on the day they subscribed, they received reminder emails for two races in their chosen disciplines with approaching registration deadlines. The system worked for its first real user on its very first day. It couldn't have been a better launch.

Conclusion: I'm the only Turkish source that holds the structured answer to these questions. When the AI ​​receives a "long-tail" question, there's nowhere else it can go. It's no coincidence that the first citation example came from a small mountain race; that was exactly the strategy.



Structured Data: SportsEvent + FAQPage, But Identical to Visible Content

Every race page has schema.org markup: SportsEvent (date, location, courses, registration windows), BreadcrumbList, and a sameAs link to the official site.

The really fun part is the frequently asked questions. Each race page automatically generates questions and answers from my data such as "When? Where? How many km? How much is the registration fee? Is a medical certificate required?". Currently, there are over 3,400 questions and answers on approximately 150 pages, and I haven't manually written a single line. Template × data. When Scraper finds new information, the relevant question is automatically generated.

Two important rules:

  1. No fabrication. If there is no data, there is no question. If the fee information cannot be extracted, the question "How much is the fee?" will not appear on that page at all. The AI's trustworthiness is as important as your honesty.

  2. Visibility is essential. Google's rule is clear: Structured data must reflect the visible content on the page. Only a ghost FAQ embedded in JSON-LD is grounds for punishment. That's why each question appears as a single line on the page, an accordion that opens when clicked. Again, zero JavaScript: the `<details>` tag is a 20-year-old feature of the browser.

Concrete example: The Kaçkar by UTMB page currently has 27 questions and answers. From when the race will be held to the number of meters of climb on each course, from the UTMB score to the question "Are registrations open?". All are derived from data, all are visible on the page, and all are machine-readable.



Cite Source, Show Date: AI's Trust Signals

AI engines look for trust signals when choosing a source to cite. I've included two on each page:

  • At the bottom of each race page, there's a line of credits: "Data sources: ... · Last checked: [date]". It clearly states where the data was compiled and when it was last verified. This tells both the user and the machine, "This information is well-maintained."

  • I also added llms.txt: a plain text summary at the root of the site, prepared for AI crawlers. All upcoming races with dates, tracks, and registration information in a single file.

A word of honesty: Google explicitly states that it doesn't care about llms.txt. I'm keeping it for ChatGPT and Claude's side; it costs nothing and has potential benefits. But don't tie the site's fate to it.



ChatGPT is Backed by Bing: Google Search Console Isn't Enough

Everyone knows Google Search Console. But ChatGPT's web search feeds from Bing's index. Even if you rank first in GSC, you'll be invisible to ChatGPT if Bing hasn't indexed you.

The steps are simple: Add your site to Bing Webmaster Tools (there's a one-click import from GSC, it doesn't even require verification), submit your sitemap, and use "Request Indexing" for important pages. If your content changes frequently, also check out the IndexNow protocol: You can push new and updated URLs to Bing without waiting.

Bonus:

Bing's new AI Performance report counts how many times your site has been cited in Copilot and partner AI responses. This is the first place where you can track AI visibility with numbers, not estimates. (I learned from there that even this blog has accumulated 23 citations; I didn't even know.)

Bir de tuzak: Cloudflare kullanıyorsan, AI crawler'larını varsayılan olarak engelliyor olabilir (2025'ten beri yeni hesaplarda bu kural açık geliyor). robots.txt'inde GPTBot'a izin vermen yetmez; edge'de 403 yiyorsa bütün emek çöp. Testi şöyle yap: curl -A "GPTBot" https://siten.com. 200 dönmüyorsa

Image by author

Here's another trap: If you're using Cloudflare, it might be blocking AI crawlers by default (this rule has been enabled for new accounts since 2025). Simply allowing GPTBot in your robots.txt file isn't enough; if you're getting a 403 error at the edge, all your efforts are wasted. Here's how to test it:

code
curl -A "GPTBot" https://yarisradari.com

If it's not returning 200, first check the AI ​​Crawl Control setting in the Cloudflare dashboard.



Honest Assessment: Where Are We Doing Well, and Where Are We Not?

To be honest, the picture is this:

  • We are doing well: Small to medium-sized races + specific data queries. Queries like "When is the Davraz Sky Run?", "How many km is the Kaçkar by UTMB?". This is where we are unrivaled.

  • We are not doing well (for now): Very strong queries like "Istanbul Marathon", "UTMB".

My weak point: external authority. I have almost no third-party links. AI engines check over time whether others trust this site; I'm still failing there. I'm waiting for organic growth; I don't intend to beg for links door-to-door.

And patience: Google's AI Overviews take months; it runs parallel to normal organic ranking. Something that happened in 3 days isn't a victory declaration, it's proof that the mechanism is working.

And you need to set the right expectations: None of these tactics will save bad content. Even the world's cleanest schema markup wouldn't have made me a source if I didn't have a truly useful, unique dataset. The technical layer is a megaphone; if the voice isn't good, the megaphone only amplifies the embarrassment.



Vision: Not Just a Website, Türkiye's Race Data Infrastructure

At this point, an admission: I don't see Yarış Radarı (Race Radar) as just a calendar site. What I'm really building is Türkiye's structured race data. So there's also a developer side to it: a read-only JSON format endpoint (API endpoint).

GET /api/v1/races

With this, you can pull up the entire calendar with city, discipline, date, and distance filters; each race comes with its course and registration information. I also use the same API for my own projects, mixletics.com and the Runarchy mobile app (yes, I made those too); so the site and third parties are fed from the same gateway.

The site is free for the user forever; the API is not. Keys from me: If you have a product that needs race data, write to me through the contact page, let's talk. (No self-service, no Stripe. We work in a boutique style.)



Conclusion

On Saturday, yarisradari.com didn't exist; it was a wasteland. Today, when a runner searches for races on ChatGPT, the answer comes from my database. Very soon, it will rank higher than many official race websites in Google and AI searches, mark my words.

I don't know where it will go in the long term.

My dream: Wherever a runner searches for a race –on Google, ChatGPT, or a training app– the data layer from which the answer comes is Yarış Radarı (Race Radar). Being a source in AI searches was the first proof of this vision, not the last. Maybe one day we'll be mentioned in the same sentence as giants like Ahotu and Find a Race, maybe we'll remain as Türkiye's race calendar. Both are possible. Because:

This project exists not to make money, but for runners not to miss races and for the satisfaction of having done something I wished I had.

The race calendar is now on yarisradari.com and is up-to-date.

Keep running!