kemalcalak.com — llms.txt & GEO score
An index of pages, not of content
kemalcalak.com publishes a curated llms.txt — 22 links across 5 sections, 6.6 KB in all.
Every link carries a description, averaging 120 characters — long enough to tell a model which page answers a question without opening all of them first.
The clearest gap is points at clean markdown copies. Right now: 0 of 22 end in .md or .txt (0%, detected by file extension). Closing it is worth 10 points.
What it does well
- Every link carries a description 22 of 22 described (100%)
- Descriptions say something concrete Average 120 characters across 22 described links
- Descriptions add to the title No description merely repeats its title
- A workable number of links 22 links (12–50 is the sweet spot)
What is missing
- Points at clean markdown copies +10 0 of 22 end in .md or .txt (0%, detected by file extension)
- Link titles are descriptive +4 6 weak titles (bare URLs, “here”, one-word labels)
- Publishes llms-full.txt +3 No llms-full.txt alongside the index
- List items are markdown links +2 9 of 31 list items are plain text, not links
Among the 23 sites measured here so far, kemalcalak.com ranks 8th, against a median of 71. That comparison moves as new sites are scanned — it is a snapshot of this list, not of the web.
What kemalcalak.com tells an assistant
Ali Kemal Çalak
Agentic AI engineer building agents, LLM systems and fullstack products. A portfolio shot on code — scroll-driven, cinematic, alive.
Content & links
Can a model pick the right page, first time?
8 of 11 checks pass. What is left: points at clean markdown copies, link titles are descriptive and list items are markdown links.
-
Every link carries a description 22 of 22 described (100%)10/10
-
Descriptions say something concrete Average 120 characters across 22 described links7/7
-
Descriptions add to the title No description merely repeats its title4/4
-
Points at clean markdown copies 0 of 22 end in .md or .txt (0%, detected by file extension)0/10
-
Link titles are descriptive 6 weak titles (bare URLs, “here”, one-word labels)0/4
-
A workable number of links 22 links (12–50 is the sweet spot)4/4
-
Skippable links marked Optional An ## Optional section is present3/3
-
No duplicate links All 22 URLs are distinct2/2
-
List items are markdown links 9 of 31 list items are plain text, not links2/4
-
Enough written detail per link 37 words per link across 805 words3/3
-
Links are absolute URLs All 22 links are absolute URLs1/1
Structure
Does it follow the llms.txt shape?
6 of 7 checks pass. What is left: section names say what is inside.
-
Exactly one H1 project title “Ali Kemal Çalak”3/3
-
Summary directly under the title Present as a blockquote3/3
-
Summary is a usable length 132 characters3/3
-
Concrete language, not marketing filler No marketing filler detected3/3
-
Grouped into balanced sections 5 H2 sections, largest group holds 9 of 22 links4/4
-
Conforms to the published grammar Markdown only, headings used as the spec defines them2/2
-
Section names say what is inside 1 of 5 headings are generic1/2
Discovery & access
Can an assistant reach it, and is it allowed to?
All 5 checks pass in this group.
-
At the root of the domain you typed Found at the standard /llms.txt path2/2
-
Sent as plain text Content-Type: text/plain; charset=utf-81/1
-
robots.txt exists 68 B of crawler rules1/1
-
AI crawlers are not blocked No AI user-agent is disallowed at the root6/6
-
robots.txt points at a sitemap A Sitemap: line is declared1/1
Search-engine basics
What a crawler reads from your homepage today
All 6 checks pass in this group.
-
Homepage title is the right length 37 characters, from title2/2
-
Title is not padded or repetitive No repeated terms1/1
-
Homepage has a meta description 132 characters, from meta description2/2
-
Canonical URL declared https://kemalcalak.com1/1
-
Language declared lang="en"1/1
-
Social card image og:image is set1/1
Depth & upkeep
Is there more than the index, and is it current?
1 of 5 checks pass. What is left: publishes llms-full.txt, the index points at the full file, server reports when it last changed and the index is kept current.
-
Publishes llms-full.txt No llms-full.txt alongside the index0/3
-
The index points at the full file No llms-full.txt exists to link to0/1
-
Index is a sensible size 6.6 KB2/2
-
Server reports when it last changed No Last-Modified header — clients cannot tell when this changed0/1
-
The index is kept current Cannot be confirmed — the server sends no Last-Modified header0/2
What kemalcalak.com should fix next
Ordered by what each one is worth. Open a row for the steps.
-
Right now: 0 of 22 end in .md or .txt (0%, detected by file extension)
Publish a .md version of each page and link to that. The single biggest win here: the model reads your content instead of your navigation and footer.
Where: Your CMS or docs build — this is the biggest single win here
- Publish a .md version of each page you link to, at a predictable URL (page.md next to page).
- Point the llms.txt links at the .md copies, not at the HTML pages.
- Strip navigation, cookie banners and footers from the markdown — that is the whole point: the model reads your content instead of your chrome.
- Declare the pair in your HTML with a link relation so clients can find it without guessing.
In your file
line 20- [About](https://kemalcalak.com/about): Ali Kemal Çalak — agentic AI engineer. The bio, capabilities, education and stack behind the agents, LLM systems and fullstack products he ships.
- [About](https://kemalcalak.com/about.md): Ali Kemal Çalak — agentic AI engineer. The bio, capabilities, education and stack behind the agents, LLM systems and fullstack products he ships.
line 21- [Projects](https://kemalcalak.com/projects): Selected work: agentic AI systems, LLM pipelines and fullstack products — DialogTR, SponsorHub, SaaS Starter and more, each broken down shot by shot.
- [Projects](https://kemalcalak.com/projects.md): Selected work: agentic AI systems, LLM pipelines and fullstack products — DialogTR, SponsorHub, SaaS Starter and more, each broken down shot by shot.
line 22- [Work](https://kemalcalak.com/work): Experience and roles of Ali Kemal Çalak — the production list behind the agentic AI and fullstack work, year by year.
- [Work](https://kemalcalak.com/work.md): Experience and roles of Ali Kemal Çalak — the production list behind the agentic AI and fullstack work, year by year.
Placeholders in { } are yours to write — we do not invent text about your pages.
-
Right now: 6 weak titles (bare URLs, “here”, one-word labels)
Replace bare URLs and “click here” with the page’s real name — the title is half the signal.
Where: The "[Title]" part of each link
- Replace bare URLs, "here", "click here" and one-word labels with the page’s real name.
- The title is half the signal — a model reads it before it reads your description.
In your file
line 19- [Home](https://kemalcalak.com): Agentic AI engineer building agents, LLM systems and fullstack products. A portfolio shot on code — scroll-driven, cinematic, alive.
- [{the page’s real name}](https://kemalcalak.com): Agentic AI engineer building agents, LLM systems and fullstack products. A portfolio shot on code — scroll-driven, cinematic, alive.line 20- [About](https://kemalcalak.com/about): Ali Kemal Çalak — agentic AI engineer. The bio, capabilities, education and stack behind the agents, LLM systems and fullstack products he ships.
- [{the page’s real name}](https://kemalcalak.com/about): Ali Kemal Çalak — agentic AI engineer. The bio, capabilities, education and stack behind the agents, LLM systems and fullstack products he ships.line 22- [Work](https://kemalcalak.com/work): Experience and roles of Ali Kemal Çalak — the production list behind the agentic AI and fullstack work, year by year.
- [{the page’s real name}](https://kemalcalak.com/work): Experience and roles of Ali Kemal Çalak — the production list behind the agentic AI and fullstack work, year by year.Placeholders in { } are yours to write — we do not invent text about your pages.
-
Right now: No llms-full.txt alongside the index
Generate an llms-full.txt that inlines every linked page. Community convention rather than spec, but assistants with a large context window take the whole thing in one request.
Where: Your docs build, output at /llms-full.txt
- Concatenate the markdown of every page listed in llms.txt into one file.
- Keep the heading structure: a client uses those headings to navigate a multi-megabyte file.
- Regenerate it in the same build step that publishes the docs, so it cannot drift.
- Note that llms-full.txt is a community convention, not part of the proposal — useful, but optional.
-
Right now: 9 of 31 list items are plain text, not links
A file list needs `- [Title](url): description`. A plain line gives a model something to read but nowhere to go — it cannot follow it, quote it, or check it.
Where: Every "- " line in llms.txt
- Turn each plain line into a markdown link: "- [Title](https://your-site/page.md): description".
- A line without a URL gives a model something to read but nowhere to go — it cannot follow, quote or verify it.
- If a fact has no page behind it (an address, a phone number), put it in the free-text body above the sections, not in a file list.
- Note that "#" is a heading in markdown, not a comment — lines starting with # become H1/H2 headings.
In your file
line 39- Fullstack AI Engineer at SeriAI (07.2026 — Present · Remote): Fullstack on an enterprise AI platform — one workspace where a company runs assistants over swappable models on its own infrastructure instead of renting a single provider. Mostly the Next.js side of the product, plus the AI layer on top of the Vercel AI SDK: the skills and tool calls the assistants run.
- [Fullstack AI Engineer at SeriAI (07.2026 — Present · Remote)]({https://your-site/path}.md): {what this page covers}line 40- Intern Software Engineer at Colobrix (09.2025 — 07.2026 · Remote): Built a multi-tenant PRM platform that connects vendors and partners — partnership management, customer and opportunity tracking, deal registration, project management, messaging and role-based access control — plus an AI-powered company-research workflow that enriches company profiles.
- [Intern Software Engineer at Colobrix (09.2025 — 07.2026 · Remote): Built a multi-tenant PRM platform that connects vendors and partners — partnership management, customer and opportunity tracking, deal registration, project management, messaging and role-based access control — plus an AI-powered company-research workflow that enriches company profiles.]({https://your-site/path}.md): {what this page covers}line 41- Intern AI Engineer at Kafein Technology (07.2025 — 09.2025 · Istanbul, Hybrid): Developed AI-driven automation workflows on n8n, and built an n8n-style workflow platform with a FastAPI backend where users register, create their own workflows and share them.
- [Intern AI Engineer at Kafein Technology (07.2025 — 09.2025 · Istanbul, Hybrid): Developed AI-driven automation workflows on n8n, and built an n8n-style workflow platform with a FastAPI backend where users register, create their own workflows and share them.]({https://your-site/path}.md): {what this page covers}Placeholders in { } are yours to write — we do not invent text about your pages.
-
Right now: Cannot be confirmed — the server sends no Last-Modified header
Regenerate llms.txt when the docs change. A year-old index quietly points models at pages that have moved.
Where: Your build pipeline
- Regenerate llms.txt in the same step that publishes content, so it cannot go stale silently.
- Treat it as a build artifact, not a hand-edited file — hand-edited indexes drift within a quarter.
- An llms.txt with discontinued products is worse than none: a model will repeat the wrong facts confidently.
-
Right now: 1 of 5 headings are generic
Name sections after what a reader is looking for — “API reference” beats “Links”.
Where: The "## " headings in llms.txt
- Replace generic names — "Links", "Other", "Misc", "Pages" — with what is actually inside.
- Name the section after the question it answers: "API reference" beats "Links".
In your file
line 17## Pages
## {what is in this section}Placeholders in { } are yours to write — we do not invent text about your pages.
-
Right now: No Last-Modified header — clients cannot tell when this changed
Let the server send Last-Modified on llms.txt. Without it a client has to re-download the whole file to notice a change.
Where: Your web server configuration
- Serve llms.txt as a real file on disk so the server can derive Last-Modified from its mtime.
- If it is generated by an application route, set the header yourself from the generation time.
- Without it a client has to re-download the whole file to notice a change, and cannot answer "is this current?".
Instead ofHTTP/1.1 200 OK\nContent-Type: text/plain
Do thisHTTP/1.1 200 OK\nContent-Type: text/plain\nLast-Modified: Wed, 10 Sep 2026 08:14:00 GMT
-
Right now: No llms-full.txt exists to link to
Mention llms-full.txt inside llms.txt. Guessing the filename works often enough to be tempting and not often enough to rely on.
Where: Inside llms.txt
- Mention the full file in llms.txt itself, as a link or a line of context.
- Guessing the filename works often enough to be tempting and not often enough to rely on.
Do thisFull inlined text: https://acme.example/llms-full.txt
This score is Devsly’s own heuristic, not an official standard — llms.txt has no scoring body. It measures how well a file serves an AI assistant, and it does not predict whether any assistant will cite the site. The reading is a snapshot from 13 October 2026; run it again for the current state, or check a different site.
Other recently scored sites
Every scan that finds an llms.txt gets a score card. Cards link back to the full report here, not out to the site.