katman-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +13 -0
- package/README.md +160 -0
- package/dist/cli.js +71 -0
- package/dist/context.js +43 -0
- package/dist/crawlers.js +86 -0
- package/dist/index.js +25 -0
- package/dist/license.js +448 -0
- package/dist/meta.js +28 -0
- package/dist/net.js +128 -0
- package/dist/server.js +17 -0
- package/dist/state.js +81 -0
- package/dist/tools/account/account.js +64 -0
- package/dist/tools/account/cli.js +21 -0
- package/dist/tools/account/index.js +48 -0
- package/dist/tools/account/sync.js +142 -0
- package/dist/tools/account/upsell.js +290 -0
- package/dist/tools/crawl/audit/analyze.js +719 -0
- package/dist/tools/crawl/audit/bots.js +114 -0
- package/dist/tools/crawl/audit/checks.js +126 -0
- package/dist/tools/crawl/audit/html.js +382 -0
- package/dist/tools/crawl/audit/index.js +364 -0
- package/dist/tools/crawl/audit/model.js +1 -0
- package/dist/tools/crawl/audit/report.js +199 -0
- package/dist/tools/crawl/audit/robots.js +199 -0
- package/dist/tools/crawl/audit/sitemap.js +147 -0
- package/dist/tools/crawl/cli.js +106 -0
- package/dist/tools/crawl/common/advice.js +61 -0
- package/dist/tools/crawl/common/findings.js +57 -0
- package/dist/tools/crawl/common/routes.js +80 -0
- package/dist/tools/crawl/common/text.js +89 -0
- package/dist/tools/crawl/common/urls.js +64 -0
- package/dist/tools/crawl/index.js +226 -0
- package/dist/tools/crawl/indexnow.js +271 -0
- package/dist/tools/crawl/keywords.js +178 -0
- package/dist/tools/crawl/scan/framework.js +645 -0
- package/dist/tools/crawl/scan/index.js +175 -0
- package/dist/tools/crawl/scan/project.js +180 -0
- package/dist/tools/crawl/scan/routes.js +354 -0
- package/dist/tools/crawl/scan/signals.js +414 -0
- package/dist/tools/method/cli.js +42 -0
- package/dist/tools/method/core/brief.js +302 -0
- package/dist/tools/method/core/extract.js +435 -0
- package/dist/tools/method/core/generate.js +504 -0
- package/dist/tools/method/core/lint.js +556 -0
- package/dist/tools/method/core/plan.js +405 -0
- package/dist/tools/method/core/prompt.js +150 -0
- package/dist/tools/method/core/questions.js +196 -0
- package/dist/tools/method/core/report.js +182 -0
- package/dist/tools/method/core/research-run.js +148 -0
- package/dist/tools/method/core/research.js +448 -0
- package/dist/tools/method/core/snippets.js +292 -0
- package/dist/tools/method/core/start.js +277 -0
- package/dist/tools/method/data/anatomy.js +141 -0
- package/dist/tools/method/data/appendices.js +202 -0
- package/dist/tools/method/data/cloudflare.js +192 -0
- package/dist/tools/method/data/evidence.js +137 -0
- package/dist/tools/method/data/geo-jobs.js +128 -0
- package/dist/tools/method/data/index.js +19 -0
- package/dist/tools/method/data/landing.js +67 -0
- package/dist/tools/method/data/lessons.js +127 -0
- package/dist/tools/method/data/measurement.js +142 -0
- package/dist/tools/method/data/method.js +141 -0
- package/dist/tools/method/data/offsite.js +148 -0
- package/dist/tools/method/data/pages.js +167 -0
- package/dist/tools/method/data/prompts.js +633 -0
- package/dist/tools/method/data/publish.js +113 -0
- package/dist/tools/method/data/render.js +117 -0
- package/dist/tools/method/data/research.js +131 -0
- package/dist/tools/method/data/roadmap.js +105 -0
- package/dist/tools/method/data/traps.js +74 -0
- package/dist/tools/method/data/verify.js +88 -0
- package/dist/tools/method/data/viral-list.js +39 -0
- package/dist/tools/method/index.js +209 -0
- package/dist/tools/method/lib/calls.js +53 -0
- package/dist/tools/method/lib/framework.js +525 -0
- package/dist/tools/method/lib/l10n.js +17 -0
- package/dist/tools/method/lib/routes.js +118 -0
- package/dist/tools/method/lib/state.js +454 -0
- package/dist/tools/method/lib/text.js +165 -0
- package/dist/tools/method/mcp/prompts.js +79 -0
- package/dist/tools/method/mcp/resources.js +50 -0
- package/dist/tools/visibility/analyze.js +463 -0
- package/dist/tools/visibility/cli.js +86 -0
- package/dist/tools/visibility/estimate.js +105 -0
- package/dist/tools/visibility/index.js +108 -0
- package/dist/tools/visibility/judge.js +156 -0
- package/dist/tools/visibility/manual.js +275 -0
- package/dist/tools/visibility/models.js +277 -0
- package/dist/tools/visibility/monitoring.js +165 -0
- package/dist/tools/visibility/openrouter.js +449 -0
- package/dist/tools/visibility/render.js +295 -0
- package/dist/tools/visibility/run.js +684 -0
- package/dist/tools/visibility/summary.js +164 -0
- package/dist/types.js +3 -0
- package/dist/util.js +92 -0
- package/package.json +54 -0
- package/server.json +34 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
export const MEASURE_INTRO = {
|
|
2
|
+
en: "On 22 September, when the sample site's PDFs went live, a PDF link crawler produced 704 fake sessions: USA, desktop, one page, 5 seconds, zero scrolling. Because they ran JavaScript, they looked like visitors in analytics.",
|
|
3
|
+
tr: "22 Eylül’de örnek sitenin PDF’leri yayınlanınca bir PDF link tarayıcısı 704 sahte oturum üretti: ABD, masaüstü, tek sayfa, 5 saniye, sıfır kaydırma. JavaScript çalıştırdıkları için analitikte ziyaretçi gibi görünüyorlardı.",
|
|
4
|
+
};
|
|
5
|
+
export const HUMAN_FILTER = {
|
|
6
|
+
text: {
|
|
7
|
+
en: "A session counts as human only if at least one of these happened: it scrolled the page, viewed more than 2 pages, finished the quiz, signed up, paid, or came from TikTok's or Instagram's in-app browser. 528 of the first week's 1,546 sessions passed. The filter is cautious: roughly three in ten real sessions don't pass it.",
|
|
8
|
+
tr: "Bir oturum ancak şunlardan biri varsa insan sayılır: sayfayı kaydırdı, 2’den fazla sayfa gördü, testi bitirdi, kaydoldu, ödedi ya da TikTok veya Instagram’ın uygulama içi tarayıcısından geldi. İlk haftanın 1.546 oturumundan 528’i geçti. Filtre temkinli: gerçek oturumların yaklaşık onda üçü geçemiyor.",
|
|
9
|
+
},
|
|
10
|
+
formula: "human = scroll > 0 OR pages > 2 OR quiz_finished OR signup OR payment OR in_app_browser",
|
|
11
|
+
};
|
|
12
|
+
/** Referrer hosts that mean "an AI assistant sent this visitor". */
|
|
13
|
+
export const AI_REFERRER_HOSTS = [
|
|
14
|
+
"chatgpt.com", "chat.openai.com", "perplexity.ai", "claude.ai", "gemini.google.com", "bard.google.com",
|
|
15
|
+
"copilot.microsoft.com", "grok.com", "chat.deepseek.com", "meta.ai", "chat.mistral.ai", "you.com", "phind.com", "poe.com",
|
|
16
|
+
];
|
|
17
|
+
/** utm_source substrings that mean AI (ChatGPT appends utm_source=chatgpt.com to its links). */
|
|
18
|
+
export const AI_UTM_MARKERS = ["chatgpt.com", "chatgpt", "openai", "perplexity", "claude", "gemini", "copilot", "grok", "deepseek"];
|
|
19
|
+
export const SEARCH_REFERRER_PATTERNS = [
|
|
20
|
+
"google.*", "bing.com", "yandex.*", "search.brave.com", "duckduckgo.com", "ecosia.org", "search.yahoo.com", "baidu.com", "naver.com", "seznam.cz", "yep.com",
|
|
21
|
+
];
|
|
22
|
+
export const SOCIAL_REFERRER_HOSTS = [
|
|
23
|
+
"instagram.com", "facebook.com", "fb.com", "x.com", "t.co", "twitter.com", "reddit.com", "youtube.com", "youtu.be", "tiktok.com", "linkedin.com", "lnkd.in", "pinterest.com", "threads.net", "news.ycombinator.com",
|
|
24
|
+
];
|
|
25
|
+
export const CHANNEL_RULE = {
|
|
26
|
+
text: {
|
|
27
|
+
en: "ChatGPT: referrer chatgpt.com OR utm_source=chatgpt.com in the link. 79% of the sample site's ChatGPT visitors sent no referrer; without reading the tag we'd have taken four fifths of ChatGPT traffic for “direct”. Put UTM tags on your own outbound links too (video descriptions, PDFs, e-mails).",
|
|
28
|
+
tr: "ChatGPT: referrer chatgpt.com ya da linkte utm_source=chatgpt.com. ChatGPT ziyaretçilerinin %79’u referrer göndermedi; etiketi okumasaydık ChatGPT trafiğinin beşte dördünü “doğrudan” sanacaktık. Kendi dış linklerinize (video açıklaması, PDF, e-posta) de UTM koyun.",
|
|
29
|
+
},
|
|
30
|
+
rules: `channel = 'ai' referrer chatgpt.com, perplexity.ai, claude.ai, gemini.google.com, copilot.microsoft.com… OR utm_source=chatgpt.com (or another assistant)
|
|
31
|
+
'search' referrer google.*, bing.com, yandex.*, search.brave.com, duckduckgo.com
|
|
32
|
+
'social' referrer instagram, facebook, x, reddit, youtube, tiktok…
|
|
33
|
+
'direct' none of the above`,
|
|
34
|
+
};
|
|
35
|
+
export const BOT_COUNT = {
|
|
36
|
+
text: {
|
|
37
|
+
en: "Bots don't run the analytics script in the browser: classify every request's user-agent on the server and count per day. Sample site, 21–27 September:",
|
|
38
|
+
tr: "Botlar tarayıcıdaki analitik kodunu çalıştırmaz; her isteğin user-agent’ını sunucuda sınıflandırıp günlük sayın. Örnek sitede 21–27 Eylül:",
|
|
39
|
+
},
|
|
40
|
+
sample: [
|
|
41
|
+
{ bot: "Googlebot", who: { en: "Google search", tr: "Google arama" }, requests: 778, pages: 305 },
|
|
42
|
+
{ bot: "YandexBot", who: { en: "Yandex", tr: "Yandex" }, requests: 773, pages: 341 },
|
|
43
|
+
{ bot: "ClaudeBot", who: { en: "Anthropic, training and index", tr: "Anthropic, eğitim ve dizin" }, requests: 578, pages: 379 },
|
|
44
|
+
{ bot: "GPTBot", who: { en: "OpenAI, training", tr: "OpenAI, eğitim" }, requests: 362, pages: 98 },
|
|
45
|
+
{ bot: "OAI-SearchBot", who: { en: "OpenAI, ChatGPT search index", tr: "OpenAI, ChatGPT arama dizini" }, requests: 205, pages: 176 },
|
|
46
|
+
{ bot: "ChatGPT-User", who: { en: "OpenAI, page opened during a chat", tr: "OpenAI, sohbette açılan sayfa" }, requests: 191, pages: 19 },
|
|
47
|
+
{ bot: "Claude-User", who: { en: "Anthropic, page opened during a chat", tr: "Anthropic, sohbette açılan sayfa" }, requests: 122, pages: 64 },
|
|
48
|
+
{ bot: "Bingbot", who: { en: "Microsoft, Copilot", tr: "Microsoft, Copilot" }, requests: 17, pages: 10 },
|
|
49
|
+
{ bot: "PerplexityBot", who: { en: "Perplexity", tr: "Perplexity" }, requests: 8, pages: 6 },
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
/** The question set: 12 unbranded questions + 2 diagnostic ones. */
|
|
53
|
+
export const QUESTION_SET = [
|
|
54
|
+
{
|
|
55
|
+
type: "situation",
|
|
56
|
+
range: "1–3",
|
|
57
|
+
count: 3,
|
|
58
|
+
template: { en: "“I have [situation] but [obstacle]. Is there a site that [desired result]?”", tr: "“[Durum] var ama [engel]. [İstenen sonuç] yapan bir site var mı?”" },
|
|
59
|
+
note: { en: "The type the sample site won", tr: "Örnek sitenin kazandığı tip" },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: "tool",
|
|
63
|
+
range: "4–5",
|
|
64
|
+
count: 2,
|
|
65
|
+
template: { en: "“Which AI tool does [the job]?”", tr: "“[İş]i yapan yapay zekâ aracı hangisi?”" },
|
|
66
|
+
note: { en: "Short and general", tr: "Kısa ve genel" },
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
type: "best",
|
|
70
|
+
range: "6–7",
|
|
71
|
+
count: 2,
|
|
72
|
+
template: { en: "“Best [category] 2026”", tr: "“En iyi [kategori] 2026”" },
|
|
73
|
+
note: { en: "Big brands dominate", tr: "Büyük markalar baskın" },
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
type: "alternative",
|
|
77
|
+
range: "8–9",
|
|
78
|
+
count: 2,
|
|
79
|
+
template: { en: "“[Big competitor] alternatives with [feature]”", tr: "“[Büyük rakip] alternatifleri, [özellik] ile”" },
|
|
80
|
+
note: { en: "List articles", tr: "Liste yazıları" },
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
type: "market",
|
|
84
|
+
range: "10–11",
|
|
85
|
+
count: 2,
|
|
86
|
+
template: { en: "“Best site for [job] in [language]”", tr: "“[Dil]de [iş] için en iyi site”" },
|
|
87
|
+
note: { en: "Local competitors", tr: "Yerel rakipler" },
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
type: "problem",
|
|
91
|
+
range: "12",
|
|
92
|
+
count: 1,
|
|
93
|
+
template: { en: "“How do I fix [problem]?”", tr: "“[Sorun] nasıl düzeltilir?”" },
|
|
94
|
+
note: { en: "Usually names no tool", tr: "Genelde araç anmaz" },
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
type: "diagnostic",
|
|
98
|
+
range: "T1–T2",
|
|
99
|
+
count: 2,
|
|
100
|
+
template: { en: "“What is [brand]?” · “What is [brand] ([domain])?”", tr: "“[Marka] nedir?” · “[Marka] ([alan adı]) nedir?”" },
|
|
101
|
+
note: { en: "Is there confusion; is the domain recognised?", tr: "Karışıklık var mı, alan adı tanınıyor mu" },
|
|
102
|
+
},
|
|
103
|
+
];
|
|
104
|
+
export const RECORD_RULE = {
|
|
105
|
+
en: "Record on every run: date, model, session type, whether you were mentioned, your position, who else was named, which of your pages was cited, a screenshot. A single run is a “low sample”; ask the same questions every 14 days.",
|
|
106
|
+
tr: "Her çalıştırmada kaydedin: tarih, model, oturum tipi, anıldınız mı, kaçıncı, kimler anıldı, hangi sayfanız kaynak gösterildi, ekran görüntüsü. Tek çalıştırma “düşük örnek”tir; aynı soruları 14 günde bir tekrar sorun.",
|
|
107
|
+
};
|
|
108
|
+
/** 2026 evidence: measure frequency, not rank; API answers are a proxy of the consumer apps. */
|
|
109
|
+
export const MEASURE_FREQUENCY = {
|
|
110
|
+
en: "Measure frequency, not rank: the same list repeats in under 1% of runs, while top brands appear in 55–77% of runs. Ask your 3 most important situation questions at least 3 times each (samples: 3) and report how often you're named, recommended and cited — three separate rates, not one score.",
|
|
111
|
+
tr: "Sırayı değil sıklığı ölçün: aynı liste çalıştırmaların %1’inden azında tekrar ediyor, en güçlü markalar ise çalıştırmaların %55–77’sinde görünüyor. En önemli 3 durum sorunuzu en az 3’er kez sorun (samples: 3) ve ne sıklıkla anıldığınızı, önerildiğinizi ve kaynak gösterildiğinizi raporlayın — tek bir puan değil, üç ayrı oran.",
|
|
112
|
+
};
|
|
113
|
+
export const API_PROXY_NOTE = {
|
|
114
|
+
en: "API runs are a proxy: a 2026 study found only 15–32% brand overlap between API answers and the consumer apps. Confirm your key questions in the real apps (logged out, web search on) with katman_manual_check.",
|
|
115
|
+
tr: "API ölçümleri bir vekildir: 2026’daki bir çalışma API cevaplarıyla tüketici uygulamaları arasında yalnızca %15–32 marka örtüşmesi buldu. Kilit sorularınızı gerçek uygulamalarda (oturum açmadan, web araması açık) katman_manual_check ile doğrulayın.",
|
|
116
|
+
};
|
|
117
|
+
export const INDICATORS = [
|
|
118
|
+
{ indicator: { en: "Real visitors from assistants", tr: "Asistandan gelen gerçek ziyaretçi" }, source: { en: "Your own analytics, with the human filter", tr: "Kendi analitiğiniz, insan filtresiyle" }, frequency: { en: "Daily", tr: "Günlük" } },
|
|
119
|
+
{ indicator: { en: "Share of accounts and payments from assistants", tr: "Asistandan gelen hesap ve ödeme payı" }, source: { en: "Funnel events", tr: "Huni olayları" }, frequency: { en: "Weekly", tr: "Haftalık" } },
|
|
120
|
+
{ indicator: { en: "Mention rate on the question set", tr: "Soru setinde anılma oranı" }, source: { en: "By hand or by script (katman_visibility_run, katman_manual_check)", tr: "Elle ya da betikle (katman_visibility_run, katman_manual_check)" }, frequency: { en: "Every 14 days", tr: "14 günde bir" } },
|
|
121
|
+
{ indicator: { en: "Bot requests and distinct pages read", tr: "Bot istekleri ve okunan farklı sayfa" }, source: { en: "Server-side counting", tr: "Sunucu tarafı sayım" }, frequency: { en: "Weekly", tr: "Haftalık" } },
|
|
122
|
+
{ indicator: { en: "Pages in and out of the index, non-brand impressions", tr: "Dizinde olan ve olmayan sayfa, marka dışı gösterim" }, source: { en: "Search Console, Bing Webmaster", tr: "Search Console, Bing Webmaster" }, frequency: { en: "Weekly", tr: "Haftalık" } },
|
|
123
|
+
{ indicator: { en: "AI citations reported by the engines", tr: "Motorların raporladığı yapay zekâ alıntıları" }, source: { en: "Search Console Gen-AI report; Bing Webmaster AI Performance", tr: "Search Console Gen-AI raporu; Bing Webmaster AI Performance" }, frequency: { en: "Weekly", tr: "Haftalık" } },
|
|
124
|
+
{ indicator: { en: "Lighthouse mobile, 5 pages", tr: "Lighthouse mobil, 5 sayfa" }, source: { en: "Lighthouse", tr: "Lighthouse" }, frequency: { en: "After every big change", tr: "Her büyük değişiklikten sonra" } },
|
|
125
|
+
{ indicator: { en: "Broken links, noindex, heading order, canonical", tr: "Kırık link, noindex, başlık sırası, canonical" }, source: { en: "Full crawl (P14, katman_audit_site)", tr: "Tam tarama (P14, katman_audit_site)" }, frequency: { en: "Monthly and on every template change", tr: "Aylık ve her şablon değişikliğinde" } },
|
|
126
|
+
];
|
|
127
|
+
export const FUNNEL_EVENTS = {
|
|
128
|
+
en: "Record every step as an event: page view, button click, quiz start and finish, sign-up screen, sign-up, checkout screen, checkout page, payment, file drop, a ChatGPT visitor skipping the quiz. On the sample site, inline client-side error messages didn't show up in analytics; one form error meant new users never saw the checkout. Error events are recorded now too.",
|
|
129
|
+
tr: "Her adımı bir olay olarak kaydedin: sayfa görüntüleme, düğme tıklama, test başlangıcı ve bitişi, kayıt ekranı, kayıt, ödeme ekranı, ödeme sayfası, ödeme, dosya bırakma, ChatGPT’den gelenin testi atlaması. Örnek sitede istemci tarafındaki satır içi hata mesajları analitikte görünmüyordu; bir form hatası yeni kullanıcıların ödeme ekranını hiç görmemesine yol açmıştı. Artık hata olayları da kaydediliyor.",
|
|
130
|
+
};
|
|
131
|
+
export const CF_ANALYTICS_NOTE = {
|
|
132
|
+
en: "On Cloudflare you can build a read-only bot panel from the GraphQL Analytics API. Note: Cloudflare's log can show the site's own cache writes as 504s; they aren't outages.",
|
|
133
|
+
tr: "Cloudflare kullanıyorsanız GraphQL Analytics API’den salt okunur bir bot paneli kurabilirsiniz. Not: Cloudflare kaydı sitenin kendi önbellek yazmalarını 504 gibi gösterebiliyor; bunlar kesinti değil.",
|
|
134
|
+
};
|
|
135
|
+
export const GSC_AI_NOTE = {
|
|
136
|
+
en: "Search Console's AI impressions record the position of the AI block, not of your link: an impression doesn't mean anyone saw your link.",
|
|
137
|
+
tr: "Search Console’daki yapay zekâ gösterimleri sizin linkinizin değil, yapay zekâ bloğunun konumunu kaydeder: gösterim, birinin linkinizi gördüğü anlamına gelmez.",
|
|
138
|
+
};
|
|
139
|
+
export const MEASURE_EXERCISE = {
|
|
140
|
+
en: "Write your question set into research, record the first measurement with today's date, and put the same measurement in your calendar for 14 days from now.",
|
|
141
|
+
tr: "Soru setinizi research.md’ye yazın, bugünün tarihiyle ilk ölçümü kaydedin ve takviminize 14 gün sonrası için aynı ölçümü koyun.",
|
|
142
|
+
};
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
export const BOOK = {
|
|
2
|
+
title: { en: "Get your vibe-coded site found by Google and ChatGPT", tr: "Vibe-coded sitenizi Google’a ve ChatGPT’ye tanıtın" },
|
|
3
|
+
date: "2026-09-29",
|
|
4
|
+
site: "katman.pro",
|
|
5
|
+
};
|
|
6
|
+
export const GATES = [
|
|
7
|
+
{
|
|
8
|
+
id: "read",
|
|
9
|
+
name: { en: "Read", tr: "Okunmak" },
|
|
10
|
+
summary: {
|
|
11
|
+
en: "If a bot can't reach your page (robots.txt, a CDN block, text buried in JavaScript), nothing else matters.",
|
|
12
|
+
tr: "Bot sayfanıza ulaşamıyorsa (robots.txt, CDN engeli, JavaScript’e gömülü metin) gerisinin önemi yok.",
|
|
13
|
+
},
|
|
14
|
+
checks: { en: "robots.txt, CDN/WAF bot access, SSR/SSG vs CSR, 404s, sitemap", tr: "robots.txt, CDN/WAF bot erişimi, SSR/SSG ya da CSR, 404’ler, sitemap" },
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
id: "quote",
|
|
18
|
+
name: { en: "Quote", tr: "Alıntılanmak" },
|
|
19
|
+
summary: {
|
|
20
|
+
en: "The assistant lifts one sentence from your page. That sentence has to be in the first lines: short, concrete, understandable on its own.",
|
|
21
|
+
tr: "Asistan sayfanızdan bir cümle alır. O cümle ilk satırlarda olmalı: kısa, somut, tek başına anlaşılır.",
|
|
22
|
+
},
|
|
23
|
+
checks: { en: "first paragraph, meta description, llms.txt, not-X note, schema", tr: "ilk paragraf, meta açıklama, llms.txt, “X değildir” notu, schema" },
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "fit",
|
|
27
|
+
name: { en: "Fit", tr: "Soruya uymak" },
|
|
28
|
+
summary: {
|
|
29
|
+
en: "On generic questions (“best X”) the big brands win; on questions that describe a situation, the page written for that situation wins.",
|
|
30
|
+
tr: "Genel sorularda (“en iyi X”) büyük markalar; durumu anlatan sorularda o duruma yazılmış sayfa kazanır.",
|
|
31
|
+
},
|
|
32
|
+
checks: { en: "situation pages, comparison guide, pricing page, FAQ", tr: "durum sayfaları, karşılaştırma rehberi, fiyat sayfası, SSS" },
|
|
33
|
+
},
|
|
34
|
+
];
|
|
35
|
+
export const STEPS = [
|
|
36
|
+
{
|
|
37
|
+
n: 1,
|
|
38
|
+
name: { en: "Research", tr: "Araştır" },
|
|
39
|
+
chapters: "07",
|
|
40
|
+
what: {
|
|
41
|
+
en: "What does your customer type into ChatGPT and into Google, whom does the assistant recommend today, and what are you in one sentence?",
|
|
42
|
+
tr: "Müşteriniz ChatGPT’ye ne yazıyor, Google’a ne yazıyor, asistan bugün kimi öneriyor, siz tek cümleyle nesiniz?",
|
|
43
|
+
},
|
|
44
|
+
output: { en: "research.md", tr: "research.md" },
|
|
45
|
+
tools: ["katman_research", "katman_visibility_run", "katman_manual_check", "katman_keywords"],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
n: 2,
|
|
49
|
+
name: { en: "Plan", tr: "Planla" },
|
|
50
|
+
chapters: "08–11",
|
|
51
|
+
what: {
|
|
52
|
+
en: "Which pages, at which URLs, and which blocks does each page need?",
|
|
53
|
+
tr: "Hangi sayfalar, hangi adreslerde, her sayfanın hangi blokları olacak?",
|
|
54
|
+
},
|
|
55
|
+
output: { en: "the page plan", tr: "sayfa planı" },
|
|
56
|
+
tools: ["katman_scan_code", "katman_audit_site", "katman_plan", "katman_page_brief"],
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
n: 3,
|
|
60
|
+
name: { en: "Build", tr: "Yaptır" },
|
|
61
|
+
chapters: "12",
|
|
62
|
+
what: {
|
|
63
|
+
en: "Give the prompts to your coding tool in order. Every prompt has an acceptance criterion; don't move on until it passes.",
|
|
64
|
+
tr: "Prompt’ları sırayla kod aracınıza verin. Her prompt’un bir kabul kriteri var; geçmeden sonrakine geçmeyin.",
|
|
65
|
+
},
|
|
66
|
+
output: { en: "the live site", tr: "yayındaki site" },
|
|
67
|
+
tools: ["katman_prompt", "katman_generate", "katman_lint_content"],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
n: 4,
|
|
71
|
+
name: { en: "Verify", tr: "Doğrula" },
|
|
72
|
+
chapters: "13–16",
|
|
73
|
+
what: {
|
|
74
|
+
en: "Notify Google, Bing, Brave and IndexNow; check it yourself with commands; ask the same questions again 14 days later.",
|
|
75
|
+
tr: "Google, Bing, Brave ve IndexNow’a bildirin; komutlarla kendiniz kontrol edin; 14 gün sonra aynı soruları tekrar sorun.",
|
|
76
|
+
},
|
|
77
|
+
output: { en: "the measurement table", tr: "ölçüm tablosu" },
|
|
78
|
+
tools: ["katman_audit_site", "katman_indexnow", "katman_visibility_run", "katman_manual_check", "katman_report"],
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
export const SEO_VS_GEO = {
|
|
82
|
+
seo: {
|
|
83
|
+
en: "SEO: Google and Bing finding, indexing and ranking your page. Readers: Googlebot, Bingbot. Payoff: a link in the search results.",
|
|
84
|
+
tr: "SEO: Google ve Bing’in sayfanızı bulması, dizine alması ve sıralaması. Okuyucu: Googlebot, Bingbot. Kazanç: arama sonuçlarındaki link.",
|
|
85
|
+
},
|
|
86
|
+
geo: {
|
|
87
|
+
en: "GEO: ChatGPT, Claude, Gemini and Perplexity reading you while answering a question, recognising you correctly and writing your name into the answer. Readers: OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot. Payoff: a recommendation in the answer.",
|
|
88
|
+
tr: "GEO: ChatGPT, Claude, Gemini ve Perplexity’nin bir soruyu cevaplarken sizi okuması, doğru tanıması ve adınızı cevaba yazması. Okuyucu: OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot. Kazanç: cevaptaki öneri.",
|
|
89
|
+
},
|
|
90
|
+
aeo: {
|
|
91
|
+
en: "You'll also hear AEO (answer engine optimisation): writing quotable answers for direct-answer boxes and Google AI Overviews. SEO has a ranking; an assistant has none: it writes a paragraph and names a few names. If you're not one of them, you're absent from that question.",
|
|
92
|
+
tr: "AEO (cevap motoru optimizasyonu) de duyacaksınız: doğrudan cevap kutuları ve Google AI Overviews için alıntılanabilir cevap yazmak. SEO’da bir sıra vardır; asistanda sıra yoktur: asistan bir paragraf yazar ve birkaç ad sayar. O adlardan biri değilseniz, o soruda yoksunuz.",
|
|
93
|
+
},
|
|
94
|
+
both: {
|
|
95
|
+
en: "Both are mostly won by the same work: text in the HTML, bots let in, every page answering one question. The sample site got 52 real visitors from Google search and 333 from ChatGPT in the same week; both matter, but doing one must not break the other.",
|
|
96
|
+
tr: "İkisi çoğunlukla aynı işlerle kazanılıyor: metin HTML’de, botlar içeride, her sayfa tek bir soruya cevap veriyor. Örnek sitemiz aynı haftada Google aramasından 52, ChatGPT’den 333 gerçek ziyaretçi aldı; ikisi de önemli, ama birini yaparken diğerini bozmamak gerekiyor.",
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
export const THE_RULE = {
|
|
100
|
+
en: "Never tell your coding tool “improve the rankings” or “optimise SEO”. Give it a measurable job (“a unique title on every page”) and an acceptance criterion (“no two pages share a title”). Every prompt in the book is written that way.",
|
|
101
|
+
tr: "Kod aracınıza asla “sıralamayı yükselt” ya da “SEO’yu optimize et” demeyin. Ölçülebilir bir iş verin (“her sayfaya benzersiz title”) ve bir kabul kriteri koyun (“iki sayfa aynı title’ı paylaşmıyor”). Bu kitaptaki her prompt böyle yazıldı.",
|
|
102
|
+
};
|
|
103
|
+
/** Ch. 2: the sample site (an AI-powered consumer web app, the publisher's own product; its name is deliberately not given). */
|
|
104
|
+
export const PROOF = {
|
|
105
|
+
intro: {
|
|
106
|
+
en: "Most numbers in the book come from a site launched from scratch on 21 September 2026: an AI-powered consumer web app, our own product (the company that runs katman.pro). Its name is deliberately withheld. Every number counts only sessions identified as human (528 of 1,546 sessions; rule in ch. 15).",
|
|
107
|
+
tr: "Kitaptaki sayıların çoğu, 21 Eylül 2026’da sıfırdan açtığımız bir siteden: yapay zekâ destekli bir tüketici web uygulaması, katman.pro’yu işleten şirketin kendi ürünü. Adını bilerek yazmıyoruz. Bu bölümdeki her sayı yalnızca insan olduğu anlaşılan oturumlardan (1.546 oturumun 528’i; kural 15. bölümde).",
|
|
108
|
+
},
|
|
109
|
+
facts: [
|
|
110
|
+
{ en: "Real visitors from ChatGPT in the first 7 days: 333 (63% of all human traffic)", tr: "ChatGPT’den gelen gerçek ziyaretçi, ilk 7 gün: 333 (bütün insan trafiğinin %63’ü)" },
|
|
111
|
+
{ en: "From search engines (Google, Yandex, Brave): 63 — ChatGPT sent 5.3× as many", tr: "Arama motorlarından (Google, Yandex, Brave): 63 — ChatGPT arama motorlarının 5,3 katı" },
|
|
112
|
+
{ en: "From Bing: 0 (Bing hadn't indexed a single page that week)", tr: "Bing’den: 0 (Bing o hafta sitenin tek sayfasını bile dizine almamıştı)" },
|
|
113
|
+
{ en: "First ChatGPT visitor: about 1.5 days after launch (22 Sep 2026, 23:01 UTC)", tr: "İlk ChatGPT ziyaretçisi: açılıştan yaklaşık 1,5 gün sonra (22 Eylül 2026, 23:01 UTC)" },
|
|
114
|
+
{ en: "ChatGPT visitors day by day: 0 → 4 → 43 → 40 → 80 → 76 → 90", tr: "ChatGPT ziyaretçisi, gün gün: 0 → 4 → 43 → 40 → 80 → 76 → 90" },
|
|
115
|
+
{ en: "Accounts opened that came from ChatGPT: 72 of 102 (71%)", tr: "Açılan hesapların ChatGPT’den gelen payı: 102 hesabın 72’si (%71)" },
|
|
116
|
+
{ en: "Paying customers that came from ChatGPT: 11 of 17 (65%)", tr: "Ödeme yapanların ChatGPT’den gelen payı: 17 müşterinin 11’i (%65)" },
|
|
117
|
+
{ en: "Where ChatGPT visitors landed: 59% on two situation pages", tr: "ChatGPT ziyaretçisinin indiği sayfa: %59’u iki durum sayfasına" },
|
|
118
|
+
{ en: "A single situation page brought 31 accounts and 8 paying customers", tr: "Tek bir durum sayfasının getirdiği: 31 hesap, 8 ödeme yapan müşteri" },
|
|
119
|
+
],
|
|
120
|
+
lessons: [
|
|
121
|
+
{
|
|
122
|
+
en: "ChatGPT came before Google. While Google was still building trust in the new domain, ChatGPT's own search bot read the pages and sent people — even while Bing's index was empty.",
|
|
123
|
+
tr: "ChatGPT Google’dan önce geldi. Yeni alan adında Google güven kazanırken ChatGPT’nin kendi arama botu sayfaları okudu ve insan gönderdi; Bing dizini boşken bile.",
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
en: "The assistant picks you on “situation” questions and lists the big names on “best X” questions.",
|
|
127
|
+
tr: "Asistan “durum” sorusunda sizi seçer, “en iyi X” sorusunda büyükleri sayar.",
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
en: "Write the sentence you want the assistant to say about you yourself. The sentence that stood in the same words in the page's first sentence, the meta description and llms.txt was repeated by ChatGPT almost word for word.",
|
|
131
|
+
tr: "Asistanın sizin hakkınızda söylemesini istediğiniz cümleyi siz yazın. Sayfanın ilk cümlesinde, meta açıklamada ve llms.txt’de aynı kelimelerle duran cümleyi ChatGPT neredeyse kelimesi kelimesine tekrar etti.",
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
whereAssistantsRead: [
|
|
135
|
+
{ assistant: "ChatGPT", en: "Its own index (OAI-SearchBot) plus third-party results; it can show a site Bing hasn't indexed. OAI-SearchBot doesn't run JavaScript.", tr: "Kendi dizini (OAI-SearchBot) ve üçüncü taraf sonuçlar; Bing’in dizine almadığı bir siteyi de gösterebiliyor. OAI-SearchBot JavaScript çalıştırmıyor." },
|
|
136
|
+
{ assistant: "Google AI Overviews, AI Mode, Gemini", en: "Google's index only; no special markup, llms.txt isn't used.", tr: "Yalnızca Google’ın dizini; özel bir işaretleme yok, llms.txt kullanılmıyor." },
|
|
137
|
+
{ assistant: "Copilot", en: "Bing's index. Bing Webmaster Tools has an “AI Performance” report.", tr: "Bing’in dizini. Bing Webmaster’da bir “AI Performance” raporu var." },
|
|
138
|
+
{ assistant: "Perplexity", en: "Its own index; reads about 10 pages and cites 3–5; favours fresh pages and Reddit.", tr: "Kendi dizini; yaklaşık 10 sayfa okuyup 3–5’ini alıntılıyor; taze sayfa ve Reddit ağırlıklı." },
|
|
139
|
+
{ assistant: "Claude", en: "Brave Search.", tr: "Brave Search." },
|
|
140
|
+
],
|
|
141
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
export const OFFSITE_INTRO = {
|
|
2
|
+
en: "Item 10 of the viral list is “backlink strategy”. Google expects links to come naturally over time; bought links are spam. On the assistant side, your name appearing where assistants read matters as much as links.",
|
|
3
|
+
tr: "Viral listenin 10. maddesi “backlink stratejisi”. Google linklerin zamanla doğal gelmesini bekliyor; satın alınan link spam. Asistan tarafında ise link kadar, asistanların okuduğu yerlerde adınızın geçmesi önemli.",
|
|
4
|
+
};
|
|
5
|
+
/** Desk research (24 Sep, not verified by us) + 2026 community evidence. */
|
|
6
|
+
export const OFFSITE_EVIDENCE = [
|
|
7
|
+
{
|
|
8
|
+
strength: "medium-strong",
|
|
9
|
+
text: {
|
|
10
|
+
en: "YouTube: 0.737 correlation between YouTube mentions and AI visibility — the strongest correlate. Branded web mentions 0.66–0.71; domain strength about 0.3; number of pages 0.19 (Ahrefs, May 2026).",
|
|
11
|
+
tr: "YouTube: YouTube’da anılma ile yapay zekâ görünürlüğü arasındaki korelasyon 0,737 — en güçlü ilişki. Markalı web bahsedilmeleri 0,66–0,71; domain gücü yaklaşık 0,3; sayfa sayısı 0,19 (Ahrefs, Mayıs 2026).",
|
|
12
|
+
},
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
strength: "medium",
|
|
16
|
+
text: {
|
|
17
|
+
en: "Lists: 43.8% of the URLs ChatGPT cites for “best X” questions are list articles. When the author puts itself first, its own brand is left out 43–69% of the time (Ahrefs).",
|
|
18
|
+
tr: "Listeler: “En iyi X” sorularında ChatGPT’nin alıntıladığı adreslerin %43,8’i liste yazısı. Kendini listenin başına koyan yazarın markası %43–69 oranında atlanıyor (Ahrefs).",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
strength: "medium",
|
|
23
|
+
text: {
|
|
24
|
+
en: "Most-cited domains by assistants: YouTube 10.2%, Reddit 6.4%, google.com 9.0%, Wikipedia 1.8% (LLM Pulse, Sep 2026). Reddit is volatile: ChatGPT's Reddit citations fell 86% in August 2026.",
|
|
25
|
+
tr: "Asistanların en çok alıntıladığı alan adları: YouTube %10,2, Reddit %6,4, google.com %9,0, Wikipedia %1,8 (LLM Pulse, Eylül 2026). Reddit oynak: ChatGPT’nin Reddit alıntıları Ağustos 2026’da %86 düştü.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
strength: "medium-strong",
|
|
30
|
+
text: {
|
|
31
|
+
en: "Earned media: 84% of AI citations are earned mentions (reviews, press, other people's lists and comparisons, podcasts). Sites listed on review platforms average 4.6–6.3 citations vs 1.8.",
|
|
32
|
+
tr: "Kazanılmış bahsedilme: yapay zekâ alıntılarının %84’ü kazanılmış bahsedilme (yorumlar, basın, başkalarının listeleri ve karşılaştırmaları, podcast’ler). Yorum platformlarında yer alan siteler ortalama 4,6–6,3 alıntı alıyor, diğerleri 1,8.",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
];
|
|
36
|
+
export const OFFSITE_WHAT_WE_DID = [
|
|
37
|
+
{
|
|
38
|
+
what: { en: "PDF books", tr: "PDF kitaplar" },
|
|
39
|
+
status: {
|
|
40
|
+
en: "Two PDF books from the site's content (English and Turkish). First on the site, then on Internet Archive and Calaméo; every chapter links to its page on the site.",
|
|
41
|
+
tr: "Sitedeki içerikten iki PDF kitap (İngilizce ve Türkçe). Önce sitede, sonra Internet Archive ve Calaméo’da; her bölüm sitedeki sayfasına link veriyor.",
|
|
42
|
+
},
|
|
43
|
+
note: {
|
|
44
|
+
en: "WEAK EVIDENCE: the first ChatGPT visitor came 8 hours after publishing — a sequence, not a cause. ChatGPT sent people to feature pages, not to the PDFs.",
|
|
45
|
+
tr: "ZAYIF KANIT: yayından 8 saat sonra ilk ChatGPT ziyaretçisi geldi; bu bir sıra, sebep değil. ChatGPT PDF’lere değil, özellik sayfalarına yönlendirdi.",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
what: { en: "YouTube, Instagram, TikTok", tr: "YouTube, Instagram, TikTok" },
|
|
50
|
+
status: {
|
|
51
|
+
en: "Walkthrough videos on the relevant pages as click-to-load embeds with VideoObject schema; the accounts in the Organization schema's sameAs.",
|
|
52
|
+
tr: "Anlatım videoları ilgili sayfalarda, tıklanınca yüklenen gömme olarak ve VideoObject şemasıyla; hesaplar Organization şemasının sameAs alanında.",
|
|
53
|
+
},
|
|
54
|
+
note: { en: "YouTube is the strongest signal above. Traffic from TikTok is close to 0 so far.", tr: "YouTube yukarıdaki en güçlü sinyal. TikTok’tan trafik şimdilik neredeyse 0." },
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
what: { en: "Directory texts", tr: "Dizin metinleri" },
|
|
58
|
+
status: {
|
|
59
|
+
en: "Ready: name, category, a 60-character tagline, 250- and 600-character descriptions, tags.",
|
|
60
|
+
tr: "Hazır: ad, kategori, 60 karakterlik slogan, 250 ve 600 karakterlik açıklama, etiketler.",
|
|
61
|
+
},
|
|
62
|
+
note: {
|
|
63
|
+
en: "Free directories require an account; paid ones ($99–497) await a decision.",
|
|
64
|
+
tr: "Ücretsiz dizinler hesap istiyor; ücretli olanlar (99–497 $) karar bekliyor.",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
what: { en: "Reddit plan", tr: "Reddit planı" },
|
|
69
|
+
status: {
|
|
70
|
+
en: "No fake accounts, open disclosure in every mention, 14 days of help only first, at most one post a week, UTM links, stop rules.",
|
|
71
|
+
tr: "Sahte hesap yok, her bahsedilmede açık beyan, önce 14 gün yalnızca yardım, haftada en fazla bir gönderi, UTM’li link, durdurma kuralları.",
|
|
72
|
+
},
|
|
73
|
+
note: { en: "Not started yet.", tr: "Henüz başlamadı." },
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
what: { en: "Outreach to list authors", tr: "Liste yazarlarına ulaşma" },
|
|
77
|
+
status: {
|
|
78
|
+
en: "Ask the assistant “which articles did you use?”, then send those authors a short, factual introduction.",
|
|
79
|
+
tr: "Asistana “hangi makaleleri kullandın?” diye sorup o yazarlara kısa, gerçeklere dayalı bir tanıtım.",
|
|
80
|
+
},
|
|
81
|
+
note: { en: "Not done yet. If a placement is paid, disclose it openly.", tr: "Henüz yapılmadı. Ücretli yerleşim olursa açıkça beyan." },
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
export const OFFSITE_RULES = [
|
|
85
|
+
{
|
|
86
|
+
topic: { en: "PDF books", tr: "PDF kitaplar" },
|
|
87
|
+
rule: {
|
|
88
|
+
en: "First on your own site (DigitalDocument schema), then on Internet Archive and Calaméo, under a CC BY-ND licence; every chapter returns to its page on the site with a UTM link. (Scribd and SlideShare were closed to uploads at the time.)",
|
|
89
|
+
tr: "Önce kendi sitenizde (DigitalDocument şeması), sonra Internet Archive ve Calaméo’da; CC BY-ND lisansla; her bölüm UTM’li linkle sitedeki sayfasına döner. (Scribd ve SlideShare o dönem yüklemeye kapalıydı.)",
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
topic: { en: "YouTube", tr: "YouTube" },
|
|
94
|
+
rule: {
|
|
95
|
+
en: "Long videos (walkthroughs, problem solving) on the relevant page as a click-to-load cover: nothing is requested from YouTube until it plays. Next to it a “Watch on YouTube” link and VideoObject schema. Long videos and Shorts on separate channels; AI-use disclosure set to “Yes”. Titles that answer the target questions, with chapters and a transcript.",
|
|
96
|
+
tr: "Uzun videolar (anlatım, sorun çözme) ilgili sayfada tıklanınca yüklenen bir kapak olarak: oynatılmadan YouTube’a istek gitmez. Yanında “YouTube’da izle” linki ve VideoObject şeması. Uzun videolar ve Shorts ayrı kanallarda; yapay zekâ kullanım beyanı “Evet”. Hedef soruları cevaplayan başlıklar, bölümler ve döküm (transcript).",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
topic: { en: "Directory text", tr: "Dizin metni" },
|
|
101
|
+
rule: {
|
|
102
|
+
en: "Name, category, a 60-character tagline, a 250-character short and a ~600-character long description, feature lines, tags — the one sentence word for word. Free ones (alternative-sites, product-launch sites) require an account; for paid ones (~$99–497) decide on cost and benefit first.",
|
|
103
|
+
tr: "Ad, kategori, 60 karakterlik slogan, 250 karakterlik kısa ve ~600 karakterlik uzun açıklama, özellik satırları, etiketler — tek cümle aynen. Ücretsiz olanlar (alternatif siteleri, ürün lansman siteleri) hesap istiyor; ücretli olanlar (~99–497 $) için önce maliyet ve fayda kararı.",
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
topic: { en: "Reddit", tr: "Reddit" },
|
|
108
|
+
rule: {
|
|
109
|
+
en: "No fake accounts; open disclosure in every mention; 14 days of help only first; sort forums into three tiers (can mention / help only / skip for now); at most one post a week; UTM links; watch for shadow-ban signs; write your stop rules in advance.",
|
|
110
|
+
tr: "Sahte hesap yok; her bahsedilmede açık beyan; önce 14 gün yalnızca yardım; forumları üç kademeye ayırın (bahsedilebilir / yalnızca yardım / şimdilik geç); haftada en fazla bir gönderi; UTM’li link; gölge yasak işaretlerini izleyin; durdurma kurallarınızı önceden yazın.",
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
topic: { en: "Outreach to list authors", tr: "Liste yazarlarına ulaşma" },
|
|
115
|
+
rule: {
|
|
116
|
+
en: "Ask the assistant “which articles did you use?”; send those authors a short, factual introduction. If a placement is paid, disclose it openly. The cited domains in your latest Katman run are this list.",
|
|
117
|
+
tr: "Asistana “hangi makaleleri kullandın?” diye sorun; o yazarlara kısa, gerçeklere dayalı bir tanıtım gönderin. Ücretli yerleşim olursa açıkça beyan edin. Son Katman ölçümünüzdeki alıntılanan alan adları bu listedir.",
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
];
|
|
121
|
+
/** The book's don'ts plus the 2026 spam-policy changes. */
|
|
122
|
+
export const OFFSITE_DONTS = [
|
|
123
|
+
{ en: "Buying links or exchanging links. It's in Google's spam policy.", tr: "Link satın almak, link takası yapmak. Google’ın spam politikasında." },
|
|
124
|
+
{
|
|
125
|
+
en: "Fake Reddit accounts, rewarded or filtered reviews, fake user counts or logos. The UK DMCC Act bans fake reviews; the US FTC bans fake or undisclosed insider reviews and fake social signals.",
|
|
126
|
+
tr: "Sahte Reddit hesabı, ödüllü ya da süzülmüş yorum, sahte kullanıcı sayısı ya da logo. Birleşik Krallık’ta DMCC Yasası sahte yorumu yasaklıyor; ABD’de FTC sahte ya da gizlenmiş içeriden yorumları ve sahte sosyal sinyalleri yasaklıyor.",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
en: "Opening your own Wikipedia or Wikidata entry before independent sources exist: it gets deleted and hurts trust.",
|
|
130
|
+
tr: "Bağımsız kaynaklar oluşmadan kendi Wikipedia ya da Wikidata kaydınızı açmak: silinir, güveni düşürür.",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
en: "Self-ranked “best X” lists: since the 2026 updates they backfire and carry spam-policy risk; when a brand's own list was cited, the brand was left out of the recommendation 69% of the time.",
|
|
134
|
+
tr: "Kendini birinci yazan “en iyi X” listeleri: 2026 güncellemelerinden beri ters tepiyor ve spam politikası riski taşıyor; markanın kendi listesi alıntılandığında marka %69 oranında öneriden çıkarıldı.",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
en: "Manipulating AI answers: hidden prompt injection, cloaking (showing bots different content than people) and scaled content abuse are covered by Google's spam policy since May 2026.",
|
|
138
|
+
tr: "Yapay zekâ cevaplarını manipüle etmek: gizli prompt enjeksiyonu, gizleme (botlara insanlardan farklı içerik göstermek) ve ölçekli içerik istismarı Mayıs 2026’dan beri Google’ın spam politikasında.",
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
en: "Buying Reddit posts or upvotes: short-lived and risky — Reddit removes AI-marketing spam, and a brand caught astroturfing can be banned.",
|
|
142
|
+
tr: "Reddit gönderisi ya da oy satın almak: kısa ömürlü ve riskli — Reddit yapay zekâ pazarlama spamini kaldırıyor, yakalanan marka yasaklanabiliyor.",
|
|
143
|
+
},
|
|
144
|
+
];
|
|
145
|
+
export const OFFSITE_EXERCISE = {
|
|
146
|
+
en: "Ask ChatGPT “which is the best X?” in your category, then follow up with “which articles did you use to write this answer?”. Write the articles and their authors into research: that's your first outreach list.",
|
|
147
|
+
tr: "ChatGPT’ye kategorinizde “en iyi X hangisi?” diye sorun, sonra “bu cevabı yazarken hangi makaleleri kullandın?” diye devam edin. Çıkan makaleleri ve yazarlarını research.md’ye yazın: bu sizin ilk ulaşma listeniz.",
|
|
148
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
export const PAGE_PLAN_INTRO = {
|
|
2
|
+
en: "Few but right pages. On the sample site, 59% of ChatGPT visitors landed on just two situation pages. Our working rule: 5–10 different pages a week; if a template's “crawled – currently not indexed” rate passes 30%, stop publishing new pages from it and merge.",
|
|
3
|
+
tr: "Az ama doğru sayfa. Örnek sitede ChatGPT ziyaretçilerinin %59’u yalnızca iki durum sayfasına indi. Çalışma kuralımız: haftada 5–10 farklı sayfa; “tarandı, dizine eklenmedi” oranı %30’u geçen bir şablon varsa yeni sayfa basmayı durdur, birleştir.",
|
|
4
|
+
};
|
|
5
|
+
export const PAGE_TYPES = [
|
|
6
|
+
{
|
|
7
|
+
key: "home",
|
|
8
|
+
name: { en: "Home", tr: "Ana sayfa" },
|
|
9
|
+
purpose: { en: "Says who you are in one sentence; links to every important page.", tr: "Kim olduğunuzu tek cümleyle söyler; bütün önemli sayfalara link verir." },
|
|
10
|
+
url: { en: "/", tr: "/" },
|
|
11
|
+
schema: ["Organization", "WebSite"],
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
key: "situation",
|
|
15
|
+
name: { en: "Situation pages", tr: "Durum sayfaları" },
|
|
16
|
+
purpose: {
|
|
17
|
+
en: "One page per customer situation; the answer is in the first sentence. The page type assistants quote most (59% of the sample site's ChatGPT visitors).",
|
|
18
|
+
tr: "Her müşteri durumu için bir sayfa; cevap ilk cümlede. Asistanın en çok alıntıladığı sayfa tipi (örnek sitede ChatGPT ziyaretçilerinin %59’u).",
|
|
19
|
+
},
|
|
20
|
+
url: { en: "/import-pdf-invoices", tr: "/faturami-muhasebeye-aktar" },
|
|
21
|
+
schema: ["Service", "FAQPage", "BreadcrumbList"],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: "pricing",
|
|
25
|
+
name: { en: "Pricing", tr: "Fiyat" },
|
|
26
|
+
purpose: {
|
|
27
|
+
en: "Prices in plain text; assistants answer “how much?” from here. The same figures as llms.txt.",
|
|
28
|
+
tr: "Fiyat düz metinde; asistanlar “ne kadar?” sorusunu buradan cevaplar. llms.txt ile aynı rakam.",
|
|
29
|
+
},
|
|
30
|
+
url: { en: "/pricing", tr: "/fiyatlandirma" },
|
|
31
|
+
schema: ["Service", "Offer"],
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
key: "comparison",
|
|
35
|
+
name: { en: "Comparison guide", tr: "Karşılaştırma rehberi" },
|
|
36
|
+
purpose: {
|
|
37
|
+
en: "A neutral answer to “which tools are there for X?”, competitors included (P7).",
|
|
38
|
+
tr: "“X için hangi araçlar var?” sorusunun tarafsız cevabı, rakipler dahil (P7).",
|
|
39
|
+
},
|
|
40
|
+
url: { en: "/guides/tools-for-x", tr: "/rehber/x-icin-araclar" },
|
|
41
|
+
schema: ["Article", "ItemList"],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
key: "faq",
|
|
45
|
+
name: { en: "FAQ", tr: "SSS" },
|
|
46
|
+
purpose: {
|
|
47
|
+
en: "Customers' real questions with short answers. No rich result in Google any more; question–answer pairs for the assistant.",
|
|
48
|
+
tr: "Müşterinin gerçek soruları, kısa cevaplarla. Google’da zengin sonuç yok; asistan için soru-cevap çifti.",
|
|
49
|
+
},
|
|
50
|
+
url: { en: "/faq", tr: "/sss" },
|
|
51
|
+
schema: ["FAQPage"],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
key: "about",
|
|
55
|
+
name: { en: "About", tr: "Hakkımızda" },
|
|
56
|
+
purpose: {
|
|
57
|
+
en: "Who builds it, the company, the “not-X” note, social accounts.",
|
|
58
|
+
tr: "Kim yapıyor, şirket, “X değildir” notu, sosyal hesaplar.",
|
|
59
|
+
},
|
|
60
|
+
url: { en: "/about", tr: "/hakkimizda" },
|
|
61
|
+
schema: ["AboutPage", "Organization"],
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
key: "guide",
|
|
65
|
+
name: { en: "Guide or PDF", tr: "Rehber ya da PDF" },
|
|
66
|
+
purpose: {
|
|
67
|
+
en: "Something others will want to link to; publish it on your own site first, then share it. Backlinks come from here.",
|
|
68
|
+
tr: "Başkasının link vermek isteyeceği şey; önce sitenizde yayınlayın, sonra paylaşın. Backlink buradan gelir.",
|
|
69
|
+
},
|
|
70
|
+
url: { en: "/guides/...", tr: "/rehber/..." },
|
|
71
|
+
schema: ["Article"],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
key: "contact",
|
|
75
|
+
name: { en: "Contact, privacy, terms", tr: "İletişim, gizlilik, şartlar" },
|
|
76
|
+
purpose: {
|
|
77
|
+
en: "Trust; keep the e-mail address in plain text (bots can't read an obfuscated address).",
|
|
78
|
+
tr: "Güven; e-posta adresi düz metin olsun (gizlenmiş adresi bot okuyamaz).",
|
|
79
|
+
},
|
|
80
|
+
url: { en: "/contact", tr: "/iletisim" },
|
|
81
|
+
schema: ["BreadcrumbList"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
key: "llms",
|
|
85
|
+
name: { en: "llms.txt", tr: "llms.txt" },
|
|
86
|
+
purpose: {
|
|
87
|
+
en: "A summary for assistants: the one sentence, pricing, “not-X”, the important pages (P8).",
|
|
88
|
+
tr: "Asistanlar için özet: tek cümle, fiyat, “X değildir”, önemli sayfalar (P8).",
|
|
89
|
+
},
|
|
90
|
+
url: { en: "/llms.txt", tr: "/llms.txt" },
|
|
91
|
+
schema: [],
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
key: "notfound",
|
|
95
|
+
name: { en: "404 page", tr: "404 sayfası" },
|
|
96
|
+
purpose: { en: "A real 404 status code, with links to the important pages.", tr: "Gerçek 404 durum koduyla, önemli sayfalara linkle." },
|
|
97
|
+
url: { en: "(every missing URL)", tr: "(her olmayan adres)" },
|
|
98
|
+
schema: [],
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
export const NOINDEX_RULES = {
|
|
102
|
+
en: "Login, sign-up, password reset, checkout, thank-you and on-site search pages: noindex,follow and not in the sitemap. App paths (/app, /dashboard, /api): closed in robots.txt. On katman.pro the login page is noindex; /api, /admin, /report and /dashboard are closed in robots.txt. Never close a noindex page in robots.txt: Google then can't see the noindex.",
|
|
103
|
+
tr: "Giriş, kayıt, şifre sıfırlama, ödeme, teşekkür ve site içi arama sayfaları: noindex,follow ve sitemap’te yok. Uygulama yolları (/app, /dashboard, /api): robots.txt’de kapalı. katman.pro’da giriş sayfası noindex; /api, /admin, /report ve /dashboard robots.txt’de kapalı. noindex’li bir sayfayı robots.txt’de kapatmayın: Google o zaman noindex’i göremez.",
|
|
104
|
+
};
|
|
105
|
+
export const MULTILINGUAL_RULES = {
|
|
106
|
+
en: "Give every language its own URLs (/tr/geo-nedir and /what-is-geo), written in that language. Every language version lists itself and the others with hreflang, plus an x-default. katman.pro's sitemap has 81 hreflang lines. Translate each page for real: an untranslated page that carries another language's hreflang creates a fake language cluster with duplicate titles.",
|
|
107
|
+
tr: "Her dilin kendi adresi olsun (/tr/geo-nedir ve /what-is-geo gibi), adresler o dilde yazılsın. Her dil sürümü hreflang ile kendini ve diğerlerini listelesin, bir de x-default. katman.pro’nun sitemap’inde 81 hreflang satırı var. Her sayfayı gerçekten çevirin: başka dilin hreflang’ini taşıyan çevrilmemiş sayfa ikiz title’lı, sahte bir dil kümesi yaratır.",
|
|
108
|
+
};
|
|
109
|
+
/** The sample site's architecture on 29 September (376 URLs, 7 languages). */
|
|
110
|
+
export const SAMPLE_ARCHITECTURE = [
|
|
111
|
+
{ type: { en: "Home", tr: "Ana sayfa" }, en: "1", purpose: { en: "Entity definition and the first action", tr: "Varlık tanımı ve ilk eylem" }, geoRole: { en: "“What is it?” questions", tr: "“Nedir?” sorusu" } },
|
|
112
|
+
{ type: { en: "Feature / situation pages", tr: "Özellik / durum sayfaları" }, en: "15", purpose: { en: "Solve one situation in the first sentence", tr: "Bir durumu ilk cümlede çözmek" }, geoRole: { en: "Most traffic and sales", tr: "En çok trafik ve satış" } },
|
|
113
|
+
{ type: { en: "Category pages", tr: "Kategori sayfaları" }, en: "34", purpose: { en: "The category's own data, examples, FAQ", tr: "Kategorinin kendi verisi, örnekler, SSS" }, geoRole: { en: "Long tail", tr: "Uzun kuyruk" } },
|
|
114
|
+
{ type: { en: "“Single question” pages", tr: "“Tek soru” sayfaları" }, en: "61", purpose: { en: "One question from Google autocomplete", tr: "Google’ın otomatik tamamlamasından gelen tek bir soru" }, geoRole: { en: "Long tail, topical authority", tr: "Uzun kuyruk, konu otoritesi" } },
|
|
115
|
+
{ type: { en: "Guides", tr: "Rehberler" }, en: "17", purpose: { en: "Sourced, dated answers: list guides, cost, copyright, platform rules, statistics", tr: "Kaynaklı, tarihli cevaplar: liste rehberleri, maliyet, telif, platform kuralları, istatistik" }, geoRole: { en: "“Best X” and information questions", tr: "“En iyi X” ve bilgi soruları" } },
|
|
116
|
+
{ type: { en: "Comparisons", tr: "Karşılaştırmalar" }, en: "3 + hub", purpose: { en: "An honest “us or them”", tr: "Dürüst “biz mi onlar mı”" }, geoRole: { en: "Alternative questions", tr: "Alternatif soruları" } },
|
|
117
|
+
{ type: { en: "Free tools", tr: "Ücretsiz araçlar" }, en: "3", purpose: { en: "Small, useful tools; a natural link magnet", tr: "İşe yarar küçük araçlar; doğal link mıknatısı" }, geoRole: { en: "Tool questions", tr: "Araç soruları" } },
|
|
118
|
+
{ type: { en: "Glossary", tr: "Sözlük" }, en: "1", purpose: { en: "Term definitions (DefinedTermSet)", tr: "Terim tanımları (DefinedTermSet)" }, geoRole: { en: "Term questions", tr: "Terim soruları" } },
|
|
119
|
+
{ type: { en: "Videos", tr: "Videolar" }, en: "hub + embedded", purpose: { en: "YouTube walkthroughs (VideoObject)", tr: "YouTube anlatımları (VideoObject)" }, geoRole: { en: "Being mentioned on YouTube", tr: "YouTube’da anılmak" } },
|
|
120
|
+
{ type: { en: "About, FAQ, Pricing, Contact…", tr: "Hakkımızda, SSS, Fiyatlar, İletişim…" }, en: "7", purpose: { en: "Trust and the basics", tr: "Güven ve temel bilgiler" }, geoRole: { en: "Entity and price questions", tr: "Varlık ve fiyat soruları" } },
|
|
121
|
+
{ type: { en: "Legal", tr: "Yasal" }, en: "7", purpose: { en: "Terms, privacy, refunds, usage rights", tr: "Şartlar, gizlilik, iade, kullanım hakları" }, geoRole: { en: "Trust", tr: "Güven" } },
|
|
122
|
+
];
|
|
123
|
+
/** How content is produced: many pages, but not spam. */
|
|
124
|
+
export const CONTENT_PRODUCTION = [
|
|
125
|
+
{
|
|
126
|
+
title: { en: "Question source", tr: "Soru kaynağı" },
|
|
127
|
+
text: {
|
|
128
|
+
en: "Google autocomplete (seed keyword + letter-by-letter expansion), the situation sentences people really ask ChatGPT, and the pages ChatGPT sends people to in your analytics.",
|
|
129
|
+
tr: "Google’ın otomatik tamamlaması (tohum kelime + harf harf genişletme), ChatGPT’ye gerçekten sorulan durum cümleleri, analitikte ChatGPT’nin indirdiği sayfalar.",
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
title: { en: "Draft", tr: "Taslak" },
|
|
134
|
+
text: {
|
|
135
|
+
en: "An AI draft plus a rule-based build script: no real people's names in the texts, no quality words like “best / perfect”, no made-up numbers, no “we tested it on platform X” claims.",
|
|
136
|
+
tr: "Yapay zekâ ile taslak ve kurallı bir derleme betiği: metinlerde gerçek kişi adı yok, “en iyi / mükemmel” gibi kalite kelimeleri ve uydurma sayılar yok, “şu platformda test ettik” iddiası yok.",
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
title: { en: "Human read", tr: "İnsan okuması" },
|
|
141
|
+
text: {
|
|
142
|
+
en: "A human reads every page; exaggerations are fixed in the draft. Drafts are kept, so pages can be regenerated.",
|
|
143
|
+
tr: "Her sayfayı bir insan okur; abartılar taslakta düzeltilir. Taslaklar saklanır, sayfalar yeniden üretilebilir.",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: { en: "FAQ from data", tr: "Veriden SSS" },
|
|
148
|
+
text: {
|
|
149
|
+
en: "A category page's FAQ comes from that category's own data; no made-up questions.",
|
|
150
|
+
tr: "Kategori sayfasının SSS’si o kategorinin kendi verisinden; uydurma soru yok.",
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
title: { en: "Sourced guide", tr: "Kaynaklı rehber" },
|
|
155
|
+
text: {
|
|
156
|
+
en: "Every figure is tied to a source, with its date. Information that can't be verified at its source (e.g. a ranking seen only on Wikipedia) isn't written.",
|
|
157
|
+
tr: "Her rakam bir kaynağa, tarihiyle bağlı. Kaynağında doğrulanamayan bilgi (ör. yalnızca Wikipedia’da görülen bir sıralama) yazılmaz.",
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
title: { en: "Pace", tr: "Tempo" },
|
|
162
|
+
text: {
|
|
163
|
+
en: "On a new domain, 5–10 different pages a week; grow only templates that get impressions. If a template's “crawled – currently not indexed” rate passes ~30%, merge or noindex. Google's August 2026 spam update hit template sites site-wide.",
|
|
164
|
+
tr: "Yeni alan adında haftada 5–10 farklı sayfa; yalnızca gösterim alan şablonları büyütün. Bir şablonun “tarandı, dizine eklenmedi” oranı ~%30’u geçerse birleştirin ya da noindex yapın. Google’ın Ağustos 2026 spam güncellemesi şablon sitelere site genelinde vurdu.",
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
];
|