katman-mcp 0.2.0 → 0.3.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.
Files changed (38) hide show
  1. package/README.md +48 -42
  2. package/dist/license.js +201 -12
  3. package/dist/meta.js +25 -13
  4. package/dist/plans.js +13 -6
  5. package/dist/tools/account/account.js +19 -10
  6. package/dist/tools/account/cli.js +4 -3
  7. package/dist/tools/account/index.js +1 -1
  8. package/dist/tools/account/upsell.js +156 -39
  9. package/dist/tools/crawl/audit/report.js +2 -2
  10. package/dist/tools/crawl/cli.js +18 -6
  11. package/dist/tools/crawl/index.js +39 -8
  12. package/dist/tools/crawl/scan/framework.js +4 -1
  13. package/dist/tools/method/core/lint.js +15 -1
  14. package/dist/tools/method/core/prompt.js +2 -1
  15. package/dist/tools/method/data/_store.js +17 -0
  16. package/dist/tools/method/data/anatomy.js +12 -141
  17. package/dist/tools/method/data/appendices.js +22 -202
  18. package/dist/tools/method/data/cloudflare.js +28 -192
  19. package/dist/tools/method/data/evidence.js +18 -137
  20. package/dist/tools/method/data/geo-jobs.js +8 -128
  21. package/dist/tools/method/data/landing.js +14 -67
  22. package/dist/tools/method/data/lessons.js +16 -127
  23. package/dist/tools/method/data/measurement.js +38 -142
  24. package/dist/tools/method/data/offsite.js +16 -148
  25. package/dist/tools/method/data/pages.js +16 -167
  26. package/dist/tools/method/data/prompts.js +8 -633
  27. package/dist/tools/method/data/publish.js +14 -113
  28. package/dist/tools/method/data/research.js +14 -131
  29. package/dist/tools/method/data/roadmap.js +12 -105
  30. package/dist/tools/method/data/traps.js +6 -74
  31. package/dist/tools/method/data/verify.js +12 -88
  32. package/dist/tools/method/data/viral-list.js +12 -39
  33. package/dist/tools/method/lib/prompt-lookup.js +18 -0
  34. package/dist/tools/method/mcp/resources.js +4 -3
  35. package/dist/tools/visibility/index.js +2 -2
  36. package/dist/tools/visibility/monitoring.js +3 -0
  37. package/package.json +5 -3
  38. package/server.json +3 -3
@@ -1,192 +1,28 @@
1
- export const CF_INTRO = {
2
- en: "If a CDN such as Cloudflare sits in front of your site, bots pass its rules before they ever reach your robots.txt. robots.txt is a request; the CDN's decision is the door. If a bot gets a 403, whatever robots.txt says no longer matters.",
3
- tr: "Sitenizin önünde Cloudflare gibi bir CDN varsa, botlar robots.txt’nize ulaşmadan önce onun kurallarından geçer. robots.txt bir rica; CDN’in kararı kapıdır. Bir bot 403 alırsa robots.txt’de ne yazdığının hiçbir önemi kalmaz.",
4
- };
5
- export const BOT_TYPES = [
6
- {
7
- key: "training",
8
- name: { en: "Training", tr: "Eğitim" },
9
- what: { en: "Collects pages to train models.", tr: "Model eğitmek için sayfa toplar." },
10
- bots: ["GPTBot", "ClaudeBot", "CCBot", "Bytespider"],
11
- ifBlocked: {
12
- en: "Future models can't learn about you from your site. According to OpenAI, blocking GPTBot doesn't affect ChatGPT search: “each setting is independent of the others”.",
13
- tr: "Gelecek modeller sizi sitenizden öğrenemez. OpenAI’a göre GPTBot’u engellemek ChatGPT aramasını etkilemez: “her ayar diğerlerinden bağımsız”.",
14
- },
15
- },
16
- {
17
- key: "search",
18
- name: { en: "Search", tr: "Arama" },
19
- what: {
20
- en: "Fills the assistant's search index; the pages shown in an answer are chosen from here.",
21
- tr: "Asistanın arama dizinini doldurur; cevapta hangi sayfaların gösterileceği buradan seçilir.",
22
- },
23
- bots: ["OAI-SearchBot", "Claude-SearchBot", "PerplexityBot"],
24
- ifBlocked: {
25
- en: "You don't appear in the assistant's search. OpenAI: a site that blocks OAI-SearchBot isn't shown in ChatGPT search answers (it may appear only as a bare link).",
26
- tr: "Asistanın aramasında çıkmazsınız. OpenAI: OAI-SearchBot’u engelleyen site ChatGPT arama cevaplarında gösterilmez (yalnızca adres linki olarak çıkabilir).",
27
- },
28
- },
29
- {
30
- key: "user",
31
- name: { en: "User (agent)", tr: "Kullanıcı (ajan)" },
32
- what: {
33
- en: "Opens a page during a chat because the user asked for it.",
34
- tr: "Sohbet sırasında, kullanıcı istediği için sayfayı açar.",
35
- },
36
- bots: ["ChatGPT-User", "Claude-User", "Perplexity-User"],
37
- ifBlocked: {
38
- en: "When a user gives the assistant your link, it can't read your page. OpenAI writes that robots.txt rules may not apply to this bot.",
39
- tr: "Kullanıcı linkinizi verdiğinde asistan sayfanızı okuyamaz. OpenAI bu bot için robots.txt kurallarının geçerli olmayabileceğini yazıyor.",
40
- },
41
- },
42
- ];
43
- export const PERMISSION_TOKENS_NOTE = {
44
- en: "Google-Extended and Applebot-Extended aren't bots but permission names used in robots.txt: they have no crawler of their own (Google and Apple docs), so testing them with a user-agent shows nothing. Googlebot, Bingbot and Applebot are used for both search and training — which is why the Cloudflare change below matters. Note: Google-Extended also controls Gemini grounding; blocking it removes you from Gemini answers (not from Google Search).",
45
- tr: "Google-Extended ve Applebot-Extended bot değil, robots.txt’de kullanılan izin adlarıdır: ayrı bir tarayıcıları yok (Google ve Apple belgeleri). Onları user-agent ile test etmek bir şey göstermez. Googlebot, Bingbot ve Applebot ise hem arama hem eğitim için kullanılıyor; aşağıdaki Cloudflare değişikliği bu yüzden önemli. Not: Google-Extended Gemini’nin kaynak göstermesini (grounding) de yönetir; engellerseniz Gemini cevaplarından çıkarsınız (Google aramasından değil).",
46
- };
47
- export const CF_SETTINGS = [
48
- {
49
- name: { en: "Block AI bots (legacy toggle)", tr: "Block AI bots (eski düğme)" },
50
- api: "ai_bots_protection",
51
- what: {
52
- en: "Blocks verified training bots and some unverified bots that look like them. Options: off, on every page, only on pages with ads (ad detection is per domain). Cloudflare marked this toggle for removal on 15 September 2026.",
53
- tr: "Doğrulanmış eğitim botlarını ve onlara benzeyen bazı doğrulanmamış botları engeller. Seçenekler: kapalı, her sayfada, yalnızca reklamlı sayfalarda (reklam tespiti alan adı bazında). Cloudflare bu düğmeyi 15 Eylül 2026’da kaldırılacak diye işaretledi.",
54
- },
55
- recommendation: { en: "Off. Choose the policy settings below deliberately instead.", tr: "Kapalı. Yerine aşağıdaki politika ayarını bilerek seçin." },
56
- },
57
- {
58
- name: { en: "AI bot policies (Training / Search / Agent)", tr: "AI bot politikaları (Eğitim / Arama / Ajan)" },
59
- api: "ai_training, ai_search, ai_user",
60
- what: {
61
- en: "A separate choice per type: block on every page, block on pages with ads, or allow.",
62
- tr: "Her tür için ayrı seçim: her sayfada engelle, reklamlı sayfalarda engelle ya da izin ver.",
63
- },
64
- recommendation: { en: "Search and Agent: allow. Training: your business decision (below).", tr: "Arama ve Ajan: izin ver. Eğitim: iş kararınız (aşağıda)." },
65
- },
66
- {
67
- name: { en: "Managed robots.txt", tr: "Yönetilen robots.txt" },
68
- what: {
69
- en: "Prepends Cloudflare's block to your own robots.txt: ai-train=no and Disallow: / for GPTBot, ClaudeBot, CCBot, Bytespider, Google-Extended, Applebot-Extended, Amazonbot and meta-externalagent.",
70
- tr: "Kendi robots.txt’nizin önüne Cloudflare’in bloğunu ekler: ai-train=no ve GPTBot, ClaudeBot, CCBot, Bytespider, Google-Extended, Applebot-Extended, Amazonbot, meta-externalagent için Disallow: /.",
71
- },
72
- recommendation: { en: "Off; write your own robots.txt (appendix A).", tr: "Kapalı; kendi robots.txt’nizi yazın (Ek A)." },
73
- },
74
- {
75
- name: { en: "AI Labyrinth", tr: "AI Labyrinth" },
76
- what: {
77
- en: "Adds hidden links to pages to keep rule-breaking crawlers busy in an “endless link labyrinth”; it doesn't block.",
78
- tr: "Sayfalara gizli linkler koyup kuralsız tarayıcıları “bitmeyen bir link labirentinde” oyalar; engellemez.",
79
- },
80
- recommendation: { en: "Off: it adds nothing to GEO.", tr: "Kapalı: GEO’ya katkısı yok." },
81
- },
82
- {
83
- name: { en: "AI Crawl Control (formerly AI Audit)", tr: "AI Crawl Control (eski adı AI Audit)" },
84
- what: {
85
- en: "Shows how much each AI bot visits; blocking a bot here creates a WAF rule. On the free plan bots are recognised by user-agent only. “Pay per crawl” is in closed beta.",
86
- tr: "Hangi yapay zekâ botunun ne kadar geldiğini gösterir; bir botu buradan engellemek bir WAF kuralı oluşturur. Ücretsiz planda botlar yalnızca user-agent’tan tanınır. “Taramaya ücret” (pay per crawl) kapalı betada.",
87
- },
88
- recommendation: { en: "Turn it on for read-only monitoring; don't block.", tr: "Salt okunur izleme için açın; engellemeyin." },
89
- },
90
- {
91
- name: { en: "Bot Fight Mode", tr: "Bot Fight Mode" },
92
- what: {
93
- en: "Shows a challenge to unverified bots; WAF rules can't bypass it.",
94
- tr: "Doğrulanmamış botlara meydan okuma (challenge) gösterir; WAF kurallarıyla atlanamaz.",
95
- },
96
- recommendation: { en: "If you see it leaving bots at the door, turn it off.", tr: "Botları kapıda bıraktığını görürseniz kapatın." },
97
- },
98
- {
99
- name: { en: "Email obfuscation", tr: "E-posta gizleme" },
100
- what: { en: "Hides e-mail addresses on the page with JavaScript.", tr: "Sayfadaki e-posta adresini JavaScript’le gizler." },
101
- recommendation: {
102
- en: "Off: bots and assistants should be able to read your address as text.",
103
- tr: "Kapalı: bot ve asistan adresinizi metin olarak okuyabilsin.",
104
- },
105
- },
106
- ];
107
- export const CF_DEFAULT_CHANGES = [
108
- {
109
- en: "July 2025: every domain newly added to Cloudflare is asked during setup whether to allow AI bots. Someone clicking quickly through setup may miss this question.",
110
- tr: "Temmuz 2025: Cloudflare’e yeni eklenen her alan adına, kurulum sırasında yapay zekâ botlarına izin verip vermeyeceği soruluyor. Kurulumu hızlı geçen biri bu soruya dikkat etmeyebilir.",
111
- },
112
- {
113
- en: "15 September 2026 (announced 1 July 2026): on new domains, Training and Agent bots start blocked on pages with ads, and Search bots start allowed.",
114
- tr: "15 Eylül 2026 (1 Temmuz 2026’da duyuruldu): yeni alan adlarında Eğitim ve Ajan botları reklamlı sayfalarda engelli, Arama botları açık başlıyor.",
115
- },
116
- {
117
- en: "Same announcement: anyone blocking training (legacy toggle included) will also block bots that work for both search and training; Cloudflare names Googlebot, Applebot and Bingbot as examples. There was an opt-out before 15 September. ANNOUNCEMENT: we found no record confirming it took effect — but if it did, leaving the legacy toggle on may also affect Google and Bing.",
118
- tr: "Aynı duyuruda: eğitimi engelleyen herkes (eski düğme dahil), hem arama hem eğitim için çalışan botları da engelleyecek; Cloudflare örnek olarak Googlebot, Applebot ve Bingbot’u sayıyor. 15 Eylül’den önce vazgeçme (opt-out) hakkı vardı. DUYURU: bunun devreye girdiğini doğrulayan bir kayıt bulamadık; ama doğruysa eski düğmeyi açık bırakmak Google’ı ve Bing’i de etkileyebilir.",
119
- },
120
- ];
121
- export const CF_OUR_SITE = [
122
- {
123
- en: "30 Aug 2026: the first version of our audit tool found a CRITICAL issue on our own site: Cloudflare's managed robots.txt was silently closing GPTBot, ClaudeBot, Google-Extended, CCBot and Bytespider. We turned it off.",
124
- tr: "30 Ağu 2026: denetim aracımızın ilk sürümü kendi sitemizde KRİTİK buldu: Cloudflare’in yönetilen robots.txt’si GPTBot, ClaudeBot, Google-Extended, CCBot ve Bytespider’ı sessizce kapatıyordu. Kapattık.",
125
- },
126
- {
127
- en: "29 Sep 2026: retested while writing the book. Our robots.txt allowed GPTBot, but the legacy “Block AI bots” toggle was on in “only on pages with ads” mode and the AI training policy was “disallow”. Our site has no ads; training bots still got 403 on every page. The four blocked bots match Cloudflare's “AI Crawler” list exactly. We turned the legacy toggle off the same day; Cloudflare then set the training policy to “disabled” by itself, so “disallow” was a trace of the legacy toggle, not a separate decision. 20 seconds later all ten bots got 200.",
128
- tr: "29 Eyl 2026: kitabı yazarken yeniden test ettik. robots.txt’miz GPTBot’a izin veriyordu, ama eski “Block AI bots” düğmesi “yalnızca reklamlı sayfalarda” konumunda açık, AI eğitim politikası da “disallow” idi. Sitemizde reklam yok; buna rağmen eğitim botları her sayfada 403 alıyordu. Engellenen dört bot, Cloudflare’in “AI Crawler” listesiyle birebir aynı. Eski düğmeyi aynı gün kapattık; Cloudflare eğitim politikasını da kendiliğinden “disabled” yaptı, yani “disallow” ayrı bir karar değil, eski düğmenin iziydi. 20 saniye sonra on botun onu da 200 aldı.",
129
- },
130
- ];
131
- export const CF_BEFORE_AFTER = [
132
- { bot: "GPTBot", category: "AI Crawler (training)", before: 403, after: 200 },
133
- { bot: "ClaudeBot", category: "AI Crawler (training)", before: 403, after: 200 },
134
- { bot: "CCBot", category: "AI Crawler (training)", before: 403, after: 200 },
135
- { bot: "Bytespider", category: "AI Crawler (training)", before: 403, after: 200 },
136
- { bot: "OAI-SearchBot", category: "AI Search", before: 200, after: 200 },
137
- { bot: "Claude-SearchBot", category: "AI Search", before: 200, after: 200 },
138
- { bot: "PerplexityBot", category: "AI Search", before: 200, after: 200 },
139
- { bot: "ChatGPT-User", category: "AI Assistant (user)", before: 200, after: 200 },
140
- { bot: "Claude-User", category: "AI Assistant (user)", before: 200, after: 200 },
141
- { bot: "Perplexity-User", category: "AI Assistant (user)", before: 200, after: 200 },
142
- ];
143
- export const CF_CHECK_COMMAND = `# Status code for each bot. 403 = blocked at the door. (Spoofing the user-agent only shows user-agent-based rules;
144
- # you can't impersonate IP-verified bots such as Googlebot: check Search Console for those.)
145
- for b in GPTBot/1.2 ClaudeBot/1.0 CCBot/2.0 OAI-SearchBot/1.0 Claude-SearchBot/1.0 PerplexityBot/1.0 ChatGPT-User/1.0 Claude-User/1.0; do
146
- printf "%-22s %s\\n" "$b" "$(curl -s -o /dev/null -w '%{http_code}' -A "Mozilla/5.0 (compatible; $b)" {site_url}/)"; done`;
147
- export const CF_WHERE_TO_LOOK = [
148
- {
149
- en: "Cloudflare dashboard → Security → Analytics → Events: which request was blocked by which rule (on the free plan, a sampled log of the last 24 hours).",
150
- tr: "Cloudflare paneli → Security → Analytics → Events: hangi isteğin hangi kuralla engellendiği (ücretsiz planda son 24 saatin örneklenmiş kaydı).",
151
- },
152
- { en: "AI Crawl Control → Metrics: AI bot requests and status codes.", tr: "AI Crawl Control → Metrics: yapay zekâ botlarının istekleri ve durum kodları." },
153
- {
154
- en: "Search Console → Settings → Crawl stats → By response: the 403 and “other 4xx” responses Googlebot got, with URL and date.",
155
- tr: "Search Console → Ayarlar → Tarama istatistikleri → Yanıta göre: Googlebot’un aldığı 403 ve “diğer 4xx” yanıtları, adres ve tarihiyle.",
156
- },
157
- {
158
- en: "Your own server logs: search for the bot names. If they never appear, your door may be closed (ch. 15).",
159
- tr: "Kendi sunucu kayıtlarınız: bot adlarını arayın. Hiç görünmüyorlarsa kapınız kapalı olabilir (15. bölüm).",
160
- },
161
- ];
162
- export const TRAINING_DECISION = {
163
- allow: {
164
- en: "If you allow it: models can learn you in your own words, and an assistant may know your name even when it answers without looking at the web. The sample site chose this: ai-train=yes in robots.txt, every block off on Cloudflare. In the first week ClaudeBot made 578 requests, GPTBot 362.",
165
- tr: "İzin verirseniz: modeller sizi kendi cümlelerinizle öğrenebilir; asistan web’e bakmadan cevap verdiğinde de adınızı bilebilir. Örnek site bunu seçti: robots.txt’de ai-train=yes, Cloudflare’de bütün engeller kapalı. İlk haftada ClaudeBot 578, GPTBot 362 istek yaptı.",
166
- },
167
- block: {
168
- en: "If you block it: your content stays out of training data. It doesn't stop you appearing in ChatGPT search (OpenAI). A sensible choice for publishers and paid-content sellers.",
169
- tr: "Engellerseniz: içeriğiniz eğitim verisine girmez. ChatGPT aramasında görünmeyi engellemez (OpenAI). Yayıncılar ve ücretli içerik satanlar için mantıklı bir seçim olabilir.",
170
- },
171
- conditions: {
172
- en: "Whichever you choose, three conditions: search and user bots must be open; robots.txt and the CDN must say the same thing; the decision must be made deliberately, not while clicking “next” on a setup screen. We couldn't measure a direct effect of training traffic on visitors from ChatGPT: the sample site's ChatGPT visitors came from pages the search bot had read.",
173
- tr: "Hangisini seçerseniz seçin üç şart var: arama ve kullanıcı botları açık olmalı; robots.txt ile CDN aynı şeyi söylemeli; karar bilerek verilmeli, kurulum ekranında “ileri”ye basarken değil. Eğitim trafiğinin ChatGPT’den gelen ziyaretçiye doğrudan etkisini ölçemedik: örnek sitenin ChatGPT ziyaretçileri arama botunun okuduğu sayfalardan geldi.",
174
- },
175
- };
176
- export const CF_FIX_STEPS = [
177
- { en: "Cloudflare dashboard → your domain → Security → Settings: turn off the “Block AI bots” toggle.", tr: "Cloudflare paneli → alan adınız → Security → Settings: “Block AI bots” düğmesini kapatın." },
178
- { en: "In the same place, AI bot policies: “allow” for Search and Agent; decide on Training.", tr: "Aynı yerde AI bot politikaları: Arama ve Ajan için “izin ver”; Eğitim için kararınızı verin." },
179
- {
180
- en: "Managed robots.txt, AI Labyrinth and, if needed, Bot Fight Mode: off. Email Address Obfuscation: off.",
181
- tr: "“Yönetilen robots.txt”, AI Labyrinth ve gerekirse Bot Fight Mode: kapalı. E-posta gizleme (Email Address Obfuscation): kapalı.",
182
- },
183
- { en: "Run the check command again; OpenAI says changes take about 24 hours to take effect.", tr: "Kontrol komutunu tekrar çalıştırın; OpenAI değişikliklerin yaklaşık 24 saatte yansıdığını yazıyor." },
184
- {
185
- en: "Developers: the same settings are in the API — PUT /zones/<zone>/bot_management with ai_bots_protection: \"disabled\" and ai_training according to your training decision.",
186
- tr: "Geliştiriciyseniz aynı ayarlar API’de: PUT /zones/<zone>/bot_management ile ai_bots_protection: \"disabled\" ve eğitim kararınıza göre ai_training.",
187
- },
188
- ];
189
- export const CF_EXERCISE = {
190
- en: "Run the check command on your own site. Write every bot that gets 403 into research and note next to it “deliberate?”. If it isn't deliberate, fix it today.",
191
- tr: "Kontrol komutunu kendi sitenizde çalıştırın. 403 alan her botu research.md’ye yazın ve karşısına “bilerek mi?” diye not düşün. Bilerek değilse bugün düzeltin.",
192
- };
1
+ // Filled from katman.pro at run time for a paid key (see _store.js); the package carries no method text.
2
+ import { onMethod } from "./_store.js";
3
+ export let BOT_TYPES = [];
4
+ export let CF_BEFORE_AFTER = [];
5
+ export let CF_CHECK_COMMAND = "";
6
+ export let CF_DEFAULT_CHANGES = [];
7
+ export let CF_EXERCISE = {};
8
+ export let CF_FIX_STEPS = [];
9
+ export let CF_INTRO = {};
10
+ export let CF_OUR_SITE = [];
11
+ export let CF_SETTINGS = [];
12
+ export let CF_WHERE_TO_LOOK = [];
13
+ export let PERMISSION_TOKENS_NOTE = {};
14
+ export let TRAINING_DECISION = {};
15
+ onMethod((d) => {
16
+ if (d.BOT_TYPES !== undefined) BOT_TYPES = d.BOT_TYPES;
17
+ if (d.CF_BEFORE_AFTER !== undefined) CF_BEFORE_AFTER = d.CF_BEFORE_AFTER;
18
+ if (d.CF_CHECK_COMMAND !== undefined) CF_CHECK_COMMAND = d.CF_CHECK_COMMAND;
19
+ if (d.CF_DEFAULT_CHANGES !== undefined) CF_DEFAULT_CHANGES = d.CF_DEFAULT_CHANGES;
20
+ if (d.CF_EXERCISE !== undefined) CF_EXERCISE = d.CF_EXERCISE;
21
+ if (d.CF_FIX_STEPS !== undefined) CF_FIX_STEPS = d.CF_FIX_STEPS;
22
+ if (d.CF_INTRO !== undefined) CF_INTRO = d.CF_INTRO;
23
+ if (d.CF_OUR_SITE !== undefined) CF_OUR_SITE = d.CF_OUR_SITE;
24
+ if (d.CF_SETTINGS !== undefined) CF_SETTINGS = d.CF_SETTINGS;
25
+ if (d.CF_WHERE_TO_LOOK !== undefined) CF_WHERE_TO_LOOK = d.CF_WHERE_TO_LOOK;
26
+ if (d.PERMISSION_TOKENS_NOTE !== undefined) PERMISSION_TOKENS_NOTE = d.PERMISSION_TOKENS_NOTE;
27
+ if (d.TRAINING_DECISION !== undefined) TRAINING_DECISION = d.TRAINING_DECISION;
28
+ });
@@ -1,137 +1,18 @@
1
- export const TIER_LABEL = {
2
- strongest: { en: "Strongest", tr: "En güçlü" },
3
- next: { en: "Next", tr: "Sonra" },
4
- hygiene: { en: "Hygiene, not a lever", tr: "Temizlik işi, kaldıraç değil" },
5
- };
6
- export const EVIDENCE = [
7
- {
8
- tier: "strongest",
9
- tactic: { en: "Search-bot access (robots.txt + CDN/WAF)", tr: "Arama botu erişimi (robots.txt + CDN/WAF)" },
10
- evidence: {
11
- en: "Official docs of every engine; a blocked search bot means no citation. Cloudflare has asked new domains to block AI crawlers since July 2025.",
12
- tr: "Her motorun resmî belgeleri; engellenen arama botu alıntı almaz. Cloudflare Temmuz 2025’ten beri yeni alan adlarına yapay zekâ tarayıcılarını engellemeyi soruyor.",
13
- },
14
- prompts: ["P4", "P14"],
15
- },
16
- {
17
- tier: "strongest",
18
- tactic: { en: "Server-rendered HTML (SSR, SSG or prerendering)", tr: "Sunucuda render edilen HTML (SSR, SSG ya da ön-render)" },
19
- evidence: {
20
- en: "Across 500M+ logged fetches, no major AI crawler ran JavaScript. Content, links and metadata must be in the initial HTML.",
21
- tr: "500 milyonu aşan kayıtlı istekte hiçbir büyük yapay zekâ tarayıcısı JavaScript çalıştırmadı. İçerik, linkler ve meta bilgiler ilk HTML’de olmalı.",
22
- },
23
- prompts: ["P2"],
24
- },
25
- {
26
- tier: "next",
27
- tactic: { en: "Earned third-party mentions", tr: "Kazanılmış üçüncü taraf bahsedilmeleri" },
28
- evidence: {
29
- en: "84% of AI citations are earned media (reviews, press, other people's lists and comparisons); mentions correlate at ρ≈0.66.",
30
- tr: "Yapay zekâ alıntılarının %84’ü kazanılmış medya (yorumlar, basın, başkalarının listeleri ve karşılaştırmaları); bahsedilmelerin korelasyonu ρ≈0,66.",
31
- },
32
- prompts: ["P7"],
33
- },
34
- {
35
- tier: "next",
36
- tactic: { en: "YouTube videos that answer the target questions", tr: "Hedef soruları cevaplayan YouTube videoları" },
37
- evidence: {
38
- en: "YouTube mentions correlate at ρ≈0.74 with AI visibility — the strongest single factor; YouTube is ~20–30% of AI Overview citations.",
39
- tr: "YouTube bahsedilmeleri yapay zekâ görünürlüğüyle ρ≈0,74 ilişkili — en güçlü tek etken; YouTube, AI Overviews alıntılarının ~%20–30’u.",
40
- },
41
- prompts: [],
42
- },
43
- {
44
- tier: "next",
45
- tactic: { en: "Ranking in Google", tr: "Google’da sıralama" },
46
- evidence: {
47
- en: "Feeds AI Overviews, AI Mode and Gemini: 76% of AI Overview citations rank in the top 10. But only ~12% of URLs cited by assistants rank in Google's top 10 — GEO is SEO only on Google's surfaces.",
48
- tr: "AI Overviews, AI Mode ve Gemini’yi besler: AI Overviews alıntılarının %76’sı ilk 10’da. Ama asistanların alıntıladığı adreslerin yalnızca ~%12’si Google’ın ilk 10’unda — GEO yalnızca Google yüzeylerinde SEO’dur.",
49
- },
50
- prompts: ["P3", "P10"],
51
- },
52
- {
53
- tier: "next",
54
- tactic: { en: "Intent pages: situations, /vs, /alternatives, free tools", tr: "Niyet sayfaları: durumlar, /vs, /alternatives, ücretsiz araçlar" },
55
- evidence: {
56
- en: "/vs and /alternatives pages are 34–43% of citations for “alternatives” queries; the answer belongs in the H1 and the first ~200 characters.",
57
- tr: "“Alternatif” sorgularında /vs ve /alternatives sayfaları alıntıların %34–43’ü; cevap H1’de ve ilk ~200 karakterde olmalı.",
58
- },
59
- prompts: ["P6", "P7"],
60
- },
61
- {
62
- tier: "hygiene",
63
- tactic: { en: "Schema (JSON-LD)", tr: "Schema (JSON-LD)" },
64
- evidence: {
65
- en: "No citation lift in a 1,885-page difference-in-differences study (AIO −4.6%, ChatGPT +2.2%: noise). Keep it correct for rich results and entity clarity.",
66
- tr: "1.885 sayfalık fark-içinde-fark çalışmasında alıntıda artış yok (AIO −%4,6, ChatGPT +%2,2: gürültü). Zengin sonuç ve varlık netliği için doğru tutun.",
67
- },
68
- prompts: ["P5"],
69
- },
70
- {
71
- tier: "hygiene",
72
- tactic: { en: "llms.txt", tr: "llms.txt" },
73
- evidence: {
74
- en: "No effect across 300k domains; OpenAI fetched it 7 times in 12 weeks. Cheap to ship, never sell it as a lever — and fix rendering first.",
75
- tr: "300 bin alan adında etkisi yok; OpenAI 12 haftada 7 kez çekti. Yapması ucuz, asla kaldıraç diye satmayın — ve önce render’ı düzeltin.",
76
- },
77
- prompts: ["P8"],
78
- },
79
- ];
80
- /** Where each engine gets its sources (verified, 2026). */
81
- export const ENGINE_SOURCES = [
82
- { engine: "ChatGPT", retrieval: { en: "Its own index plus OAI-SearchBot; partners Microsoft (Bing) and Shopify; Google-sourced results were also reported.", tr: "Kendi dizini ve OAI-SearchBot; ortakları Microsoft (Bing) ve Shopify; Google kaynaklı sonuçlar da bildirildi." }, implication: { en: "Allow OAI-SearchBot; use Bing Webmaster Tools + IndexNow; still rank in Google; key claim in the H1 and first ~200 characters.", tr: "OAI-SearchBot’a izin verin; Bing Webmaster Tools + IndexNow kullanın; Google’da da sıralanın; asıl iddia H1’de ve ilk ~200 karakterde." } },
83
- { engine: "Claude", retrieval: { en: "Brave Search (~79% citation overlap); Claude-SearchBot and Claude-User fetch pages.", tr: "Brave Search (~%79 alıntı örtüşmesi); Claude-SearchBot ve Claude-User sayfa çeker." }, implication: { en: "Get into Brave's index (submit URLs; Brave follows your Googlebot rules); allow Claude-SearchBot/User.", tr: "Brave dizinine girin (adres gönderin; Brave Googlebot kurallarınıza uyar); Claude-SearchBot/User’a izin verin." } },
84
- { engine: "Perplexity", retrieval: { en: "Its own index, scored per passage; PerplexityBot crawls, Perplexity-User fetches live.", tr: "Kendi dizini, paragraf bazında puanlanır; PerplexityBot tarar, Perplexity-User canlı çeker." }, implication: { en: "Allow both; write passages that stand alone; fresh pages and Reddit weigh heavily.", tr: "İkisine de izin verin; tek başına anlaşılan paragraflar yazın; taze sayfa ve Reddit ağır basar." } },
85
- { engine: "Google AI Overviews / AI Mode", retrieval: { en: "The Google index with query fan-out; pages must be indexed and snippet-eligible.", tr: "Soru dallandırmalı Google dizini; sayfalar dizinde ve snippet’e uygun olmalı." }, implication: { en: "Classic SEO; no nosnippet on pages you want cited; watch the Search Console Gen-AI report.", tr: "Klasik SEO; alıntılanmasını istediğiniz sayfada nosnippet yok; Search Console Gen-AI raporunu izleyin." } },
86
- { engine: "Gemini app", retrieval: { en: "Grounding with Google Search; blocking Google-Extended removes you from Gemini grounding (not from Search).", tr: "Google Arama ile kaynak gösterme; Google-Extended’i engellemek sizi Gemini kaynaklarından çıkarır (aramadan değil)." }, implication: { en: "Don't block Google-Extended.", tr: "Google-Extended’i engellemeyin." } },
87
- { engine: "Copilot", retrieval: { en: "Bing's index; Bing Webmaster AI Performance shows Copilot citations and grounding queries.", tr: "Bing dizini; Bing Webmaster AI Performance Copilot alıntılarını ve kaynak sorgularını gösterir." }, implication: { en: "Bing Webmaster Tools, IndexNow, Bing Places.", tr: "Bing Webmaster Tools, IndexNow, Bing Places." } },
88
- { engine: "Grok", retrieval: { en: "X search plus a web search tool (provider undisclosed).", tr: "X araması ve bir web arama aracı (sağlayıcı açıklanmıyor)." }, implication: { en: "Post on X in ways that answer the questions.", tr: "X’te soruları cevaplayan paylaşımlar yapın." } },
89
- ];
90
- export const MYTHS = [
91
- { claim: { en: "“llms.txt gets you cited”", tr: "“llms.txt alıntılanmayı sağlar”" }, verdict: { en: "Myth", tr: "Efsane" }, why: { en: "Google compared it to the keywords meta tag; bots also fetch joke files, so fetch logs prove nothing.", tr: "Google onu keywords meta etiketine benzetti; botlar şaka dosyalarını da çekiyor, yani çekilme kaydı bir şey kanıtlamaz." } },
92
- { claim: { en: "“Schema boosts AI citations”", tr: "“Schema yapay zekâ alıntısını artırır”" }, verdict: { en: "Mostly myth; keep it as hygiene", tr: "Çoğunlukla efsane; temizlik işi olarak tutun" }, why: { en: "Measured change was noise; pages with FAQ schema were cited slightly less.", tr: "Ölçülen değişim gürültüydü; SSS şemalı sayfalar biraz daha az alıntılandı." } },
93
- { claim: { en: "“Build AI-only / Markdown pages”", tr: "“Yapay zekâya özel / Markdown sayfalar yapın”" }, verdict: { en: "Myth; cloaking risk", tr: "Efsane; gizleme riski" }, why: { en: "A page no user sees gives bots nothing extra; Bing crawls both versions to compare. The same content as Markdown is fine, different content isn't.", tr: "Kullanıcının görmediği sayfa bota ek bir şey vermez; Bing iki sürümü de tarayıp karşılaştırır. Aynı içeriğin Markdown’ı sorun değil, farklı içerik sorun." } },
94
- { claim: { en: "“Show bots richer content”", tr: "“Botlara daha zengin içerik gösterin”" }, verdict: { en: "Spam", tr: "Spam" }, why: { en: "Prerendering the same content is the only safe version.", tr: "Aynı içeriği ön-render etmek tek güvenli yol." } },
95
- { claim: { en: "“Keyword-stuff for LLMs”", tr: "“LLM’ler için anahtar kelime doldurun”" }, verdict: { en: "Myth", tr: "Efsane" }, why: { en: "−8.3% in the Princeton study; keyword-heavy titles and URLs get cited less.", tr: "Princeton çalışmasında −%8,3; anahtar kelime yüklü başlık ve adresler daha az alıntılanıyor." } },
96
- { claim: { en: "Hidden prompt injection", tr: "Gizli prompt enjeksiyonu" }, verdict: { en: "Google spam since May 2026", tr: "Mayıs 2026’dan beri Google spam’i" }, why: { en: "Works in labs about half the time; defences cut it to ~6%, and it's now a spam-policy violation.", tr: "Laboratuvarda yarı yarıya işliyor; savunmalar bunu ~%6’ya indiriyor ve artık spam politikası ihlali." } },
97
- { claim: { en: "Buying Reddit posts or upvotes", tr: "Reddit gönderisi ya da oy satın almak" }, verdict: { en: "Short-lived and risky", tr: "Kısa ömürlü ve riskli" }, why: { en: "Reddit removes AI-marketing spam; the FTC bans fake or undisclosed reviews and fake social signals.", tr: "Reddit yapay zekâ pazarlama spamini kaldırıyor; FTC sahte ya da gizlenmiş yorumları ve sahte sosyal sinyalleri yasaklıyor." } },
98
- { claim: { en: "Self-ranked “best X” lists", tr: "Kendini birinci yazan “en iyi X” listeleri" }, verdict: { en: "Backfiring", tr: "Ters tepiyor" }, why: { en: "Lost visibility in the 2026 updates and carry spam-policy risk; when a brand's own list was cited, the brand was left out 69% of the time.", tr: "2026 güncellemelerinde görünürlük kaybetti ve spam politikası riski taşıyor; markanın kendi listesi alıntılandığında marka %69 oranında dışarıda kaldı." } },
99
- { claim: { en: "“Rank #1 in ChatGPT”", tr: "“ChatGPT’de 1 numara olun”" }, verdict: { en: "Myth", tr: "Efsane" }, why: { en: "The list differs in over 99% of runs: measure how often you're named, not your rank.", tr: "Liste çalıştırmaların %99’undan fazlasında farklı: sıranızı değil, ne sıklıkla anıldığınızı ölçün." } },
100
- { claim: { en: "“ChatGPT = Bing” / “= Google”", tr: "“ChatGPT = Bing” / “= Google”" }, verdict: { en: "Both partial", tr: "İkisi de kısmen" }, why: { en: "The sample site got 333 ChatGPT visitors while Bing had 0 of its pages.", tr: "Örnek site Bing’de 0 sayfası varken ChatGPT’den 333 ziyaretçi aldı." } },
101
- ];
102
- export const SPAM_POLICY_2026 = {
103
- en: "Since May 2026 Google's spam policy explicitly covers manipulating AI answers: hidden prompt injection, cloaking (bots see different content than people) and scaled content abuse (mass-produced intent pages).",
104
- tr: "Mayıs 2026’dan beri Google’ın spam politikası yapay zekâ cevaplarını manipüle etmeyi açıkça kapsıyor: gizli prompt enjeksiyonu, gizleme (botların insanlardan farklı içerik görmesi) ve ölçekli içerik istismarı (seri üretilmiş niyet sayfaları).",
105
- };
106
- /** Official AI-citation reports that now exist. */
107
- export const OFFICIAL_REPORTS = [
108
- {
109
- name: "Google Search Console — Gen-AI report",
110
- since: { en: "worldwide since 31 Aug 2026", tr: "31 Ağustos 2026’dan beri dünya genelinde" },
111
- shows: { en: "Appearances in AI Overviews and AI Mode (the block's position, not your link's).", tr: "AI Overviews ve AI Mode görünümleri (sizin linkinizin değil, bloğun konumu)." },
112
- },
113
- {
114
- name: "Bing Webmaster Tools — AI Performance",
115
- since: { en: "since Feb 2026", tr: "Şubat 2026’dan beri" },
116
- shows: { en: "Copilot citations and the grounding queries behind them.", tr: "Copilot alıntıları ve arkasındaki kaynak sorguları." },
117
- },
118
- ];
119
- /** Builder-specific rendering facts used in P2 notes. */
120
- export const BUILDER_RENDERING = {
121
- lovable: {
122
- en: "Lovable: apps created since May 2026 are server-rendered (TanStack Start); older Lovable apps are Vite + React single-page apps and need prerendering.",
123
- tr: "Lovable: Mayıs 2026’dan beri oluşturulan uygulamalar sunucuda render ediliyor (TanStack Start); eski Lovable uygulamaları Vite + React tek sayfa uygulaması ve ön-render gerektiriyor.",
124
- },
125
- bolt: {
126
- en: "Bolt apps are often Vite single-page apps: check the JS-off word count before anything else.",
127
- tr: "Bolt uygulamaları çoğunlukla Vite tek sayfa uygulaması: her şeyden önce JavaScript kapalıyken kelime sayısına bakın.",
128
- },
129
- replit: {
130
- en: "Replit apps are often Vite single-page apps: check the JS-off word count before anything else.",
131
- tr: "Replit uygulamaları çoğunlukla Vite tek sayfa uygulaması: her şeyden önce JavaScript kapalıyken kelime sayısına bakın.",
132
- },
133
- v0: {
134
- en: "v0 usually generates Next.js (App Router), which renders on the server; check that page text isn't fetched on the client.",
135
- tr: "v0 genellikle Next.js (App Router) üretir, sunucuda render eder; sayfa metninin istemcide çekilmediğini kontrol edin.",
136
- },
137
- };
1
+ // Filled from katman.pro at run time for a paid key (see _store.js); the package carries no method text.
2
+ import { onMethod } from "./_store.js";
3
+ export let BUILDER_RENDERING = {};
4
+ export let ENGINE_SOURCES = [];
5
+ export let EVIDENCE = [];
6
+ export let MYTHS = [];
7
+ export let OFFICIAL_REPORTS = [];
8
+ export let SPAM_POLICY_2026 = {};
9
+ export let TIER_LABEL = {};
10
+ onMethod((d) => {
11
+ if (d.BUILDER_RENDERING !== undefined) BUILDER_RENDERING = d.BUILDER_RENDERING;
12
+ if (d.ENGINE_SOURCES !== undefined) ENGINE_SOURCES = d.ENGINE_SOURCES;
13
+ if (d.EVIDENCE !== undefined) EVIDENCE = d.EVIDENCE;
14
+ if (d.MYTHS !== undefined) MYTHS = d.MYTHS;
15
+ if (d.OFFICIAL_REPORTS !== undefined) OFFICIAL_REPORTS = d.OFFICIAL_REPORTS;
16
+ if (d.SPAM_POLICY_2026 !== undefined) SPAM_POLICY_2026 = d.SPAM_POLICY_2026;
17
+ if (d.TIER_LABEL !== undefined) TIER_LABEL = d.TIER_LABEL;
18
+ });
@@ -1,128 +1,8 @@
1
- export const GEO_JOBS = [
2
- {
3
- n: 1,
4
- job: { en: "One name, one sentence", tr: "Tek isim, tek cümle" },
5
- did: {
6
- en: "Perplexity took us for another company's product with the same short name and confused us with a big tech company's similarly named product. A distinctive two-word name; the sentence “we're not X's product, not Y's product” in llms.txt, About, FAQ and the Organization schema (alternateName, disambiguatingDescription); the home page title states the category.",
7
- tr: "Perplexity bizi aynı kısa adı taşıyan başka bir şirketin ürünü sandı ve büyük bir teknoloji şirketinin benzer adlı bir ürünüyle karıştırdı. İki kelimelik ayırt edici ad; “X’in ürünü değiliz, Y’nin ürünü değiliz” cümlesi llms.txt, Hakkımızda, SSS ve Organization şemasında (alternateName, disambiguatingDescription); ana sayfa title’ı kategoriyi söylüyor.",
8
- },
9
- evidence: {
10
- en: "On 24 September Perplexity recognised the domain; ChatGPT describes the right product under the right name.",
11
- tr: "24 Eylül’de Perplexity alan adını tanıyordu; ChatGPT doğru adla, doğru ürünü anlatıyor.",
12
- },
13
- you: { en: "Ask “What is [your brand]?”.", tr: "“[Markanız] nedir?” diye sorun." },
14
- prompts: ["P5", "P8"],
15
- },
16
- {
17
- n: 2,
18
- job: { en: "Open the door to bots", tr: "Botlara kapıyı aç" },
19
- did: {
20
- en: "A separate robots.txt group for each of 22 bots plus one for everyone; only app, admin, API and media paths closed. On Cloudflare: AI bot block, AI Labyrinth, managed robots.txt and Bot Fight Mode off; set by script on the day the domain was connected.",
21
- tr: "robots.txt’de 22 botun her birine ayrı grup ve herkes için bir grup; yalnızca uygulama, yönetim, API ve medya yolları kapalı. Cloudflare’de AI bot engeli, AI Labyrinth, yönetilen robots.txt ve Bot Fight Mode kapalı; alan adı bağlandığı gün betikle ayarlandı.",
22
- },
23
- evidence: {
24
- en: "First 7 days: GPTBot 362, OAI-SearchBot 205, ChatGPT-User 191, ClaudeBot 578 requests; none got an error.",
25
- tr: "İlk 7 günde GPTBot 362, OAI-SearchBot 205, ChatGPT-User 191, ClaudeBot 578 istek; hiçbiri hata almadı.",
26
- },
27
- you: { en: "Ch. 6 and appendix A.", tr: "06. bölüm ve Ek A." },
28
- prompts: ["P4"],
29
- },
30
- {
31
- n: 3,
32
- job: { en: "Text in the HTML", tr: "Metin HTML’de" },
33
- did: {
34
- en: "All text rendered as HTML on the server. In the day-one audit GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot and Chrome got byte-identical pages. The quiz page was drawn with JavaScript and bots saw 27 words: an 86-word written section was added.",
35
- tr: "Bütün metin sunucuda HTML. İlk gün denetiminde GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot ve Chrome bayt bayt aynı sayfayı aldı. Test sayfası JavaScript ile çiziliyordu, botlar 27 kelime görüyordu: 86 kelimelik yazılı bölüm eklendi.",
36
- },
37
- evidence: { en: "Over 750 requests from OpenAI bots, 0 errors.", tr: "OpenAI botları 750’den fazla istek, 0 hata." },
38
- you: { en: "Open your page with JavaScript off.", tr: "Sayfanızı JavaScript kapalıyken açın." },
39
- prompts: ["P2"],
40
- },
41
- {
42
- n: 4,
43
- job: { en: "Situation pages", tr: "Durum sayfaları" },
44
- did: {
45
- en: "A page for every situation a customer would describe to the assistant (eight situations; two of them took most of the ChatGPT traffic). The answer in the first 1–3 sentences.",
46
- tr: "Müşterinin asistana anlatacağı her durum için bir sayfa (sekiz durum; ikisi ChatGPT trafiğinin çoğunu aldı). Cevap ilk 1–3 cümlede.",
47
- },
48
- evidence: {
49
- en: "59% of ChatGPT visitors landed on two situation pages; 8 of the 17 payers came from a single situation page.",
50
- tr: "ChatGPT ziyaretçilerinin %59’u iki durum sayfasına indi; 17 ödeyenin 8’i tek bir durum sayfasından.",
51
- },
52
- you: { en: "Think in situations, not your product name.", tr: "Ürün adınızı değil, durumu düşünün." },
53
- prompts: ["P6"],
54
- },
55
- {
56
- n: 5,
57
- job: { en: "The same sentence everywhere", tr: "Aynı cümle her yerde" },
58
- did: {
59
- en: "Pricing, features and claims live in a single facts file; pages, FAQ, llms.txt and llms-full.txt are generated from it. The four-part sentence: brings, we do, gets, fear is unnecessary.",
60
- tr: "Fiyat, özellik ve iddialar tek bir bilgi dosyasında; sayfalar, SSS, llms.txt ve llms-full.txt oradan üretiliyor. Dört parçalı cümle: getirir, yaparız, eline geçer, korku gereksiz.",
61
- },
62
- evidence: { en: "In two ChatGPT sessions on 28 September all four parts were repeated.", tr: "28 Eylül’deki iki ChatGPT oturumu dört parçanın dördünü de tekrar etti." },
63
- you: { en: "Write your sentence the same way in three places.", tr: "Cümlenizi üç yere aynı yazın." },
64
- prompts: ["P3", "P8"],
65
- },
66
- {
67
- n: 6,
68
- job: { en: "Honest lists", tr: "Dürüst listeler" },
69
- did: {
70
- en: "“Which tools are there for X?” lists, “[big competitor] alternatives”, a cost-per-unit comparison. Every competitor fact from the competitor's own page, dated; we didn't put ourselves first.",
71
- tr: "“X için hangi araçlar var?” listeleri, “[büyük rakip] alternatifleri”, birim başına maliyet karşılaştırması. Her rakip bilgisi rakibin kendi sayfasından, tarihli; kendimizi başa koymadık.",
72
- },
73
- evidence: { en: "The two list guides got 24 visitors from ChatGPT in the first week.", tr: "İki liste rehberi ilk hafta ChatGPT’den 24 ziyaretçi aldı." },
74
- you: { en: "Be on the list, don't be the referee.", tr: "Listede olun, hakem olmayın." },
75
- prompts: ["P7"],
76
- },
77
- {
78
- n: 7,
79
- job: { en: "Date, author, FAQ", tr: "Tarih, yazar, SSS" },
80
- did: {
81
- en: "A real dateModified on every page and the company as author; on 34 category pages a 7–8 question FAQ from each category's own data; YouTube and Instagram in the Organization schema (sameAs).",
82
- tr: "Her sayfada gerçek dateModified ve yazar olarak şirket; 34 kategori sayfasında o kategorinin verisinden 7–8 soruluk SSS; Organization’da YouTube ve Instagram (sameAs).",
83
- },
84
- evidence: { en: "In the first version all 85 pages carried the launch date; fixed.", tr: "İlk sürümde 85 sayfanın hepsi açılış tarihini taşıyordu; düzeltildi." },
85
- you: { en: "Change the date only when the words change.", tr: "Tarih yalnızca kelimeler değişince." },
86
- prompts: ["P5", "P6"],
87
- },
88
- {
89
- n: 8,
90
- job: { en: "The path to the index", tr: "Dizine alma yolu" },
91
- did: {
92
- en: "Pages stuck in “discovered – not indexed” because of missing internal links were fixed with footer links; IndexNow only for changed URLs; the Bing URL Submission API wired into the release.",
93
- tr: "İç link eksikliğinden “keşfedildi, dizine eklenmedi” olan sayfalar altbilgi linkleriyle çözüldü; IndexNow yalnızca değişen adresler; Bing URL Submission API yayına bağlı.",
94
- },
95
- evidence: { en: "New pages started getting indexed the same day.", tr: "Yeni sayfalar aynı gün dizine girmeye başladı." },
96
- you: { en: "Ch. 13.", tr: "13. bölüm." },
97
- prompts: ["P10"],
98
- },
99
- {
100
- n: 9,
101
- job: { en: "Traces outside the site", tr: "Sitenin dışında iz" },
102
- did: {
103
- en: "PDF books, YouTube, Instagram, TikTok, directory texts, a Reddit plan.",
104
- tr: "PDF kitaplar, YouTube, Instagram, TikTok, dizin metni, Reddit planı.",
105
- },
106
- evidence: { en: "Weak evidence: a correlation, causation not proven.", tr: "Kanıt zayıf; ilişki var, sebep kanıtlanmadı." },
107
- you: { en: "Ch. 14.", tr: "14. bölüm." },
108
- prompts: [],
109
- },
110
- {
111
- n: 10,
112
- job: { en: "Measure correctly", tr: "Doğru ölç" },
113
- did: {
114
- en: "A human filter, utm_source=chatgpt.com, counting bots on the server, a fixed question set.",
115
- tr: "İnsan filtresi, utm_source=chatgpt.com, botları sunucuda sayma, sabit soru seti.",
116
- },
117
- evidence: {
118
- en: "704 fake sessions filtered out; 79% of ChatGPT traffic had no referrer.",
119
- tr: "704 sahte oturum ayıklandı; ChatGPT trafiğinin %79’u referrer’sızdı.",
120
- },
121
- you: { en: "Ch. 15.", tr: "15. bölüm." },
122
- prompts: ["P13"],
123
- },
124
- ];
125
- export const GEO_JOBS_NOTE = {
126
- en: "Google retired the FAQ rich result on 7 May 2026 and HowTo in 2023. Write the FAQ not for a Google box but so the assistant can lift a question and an answer sentence.",
127
- tr: "Google SSS zengin sonucunu 7 Mayıs 2026’da kaldırdı, HowTo’yu 2023’te. SSS’yi Google kutusu için değil, asistanın bir soru ve cevap cümlesini alıp kullanabilmesi için yazın.",
128
- };
1
+ // Filled from katman.pro at run time for a paid key (see _store.js); the package carries no method text.
2
+ import { onMethod } from "./_store.js";
3
+ export let GEO_JOBS = [];
4
+ export let GEO_JOBS_NOTE = {};
5
+ onMethod((d) => {
6
+ if (d.GEO_JOBS !== undefined) GEO_JOBS = d.GEO_JOBS;
7
+ if (d.GEO_JOBS_NOTE !== undefined) GEO_JOBS_NOTE = d.GEO_JOBS_NOTE;
8
+ });
@@ -1,67 +1,14 @@
1
- export const LANDING_INTRO = {
2
- en: "Someone coming from ChatGPT arrives with the situation they described to ChatGPT. On the sample site most of them had a file they wanted to process. If the page doesn't let them do something with that file in the first minute, the visit is wasted.",
3
- tr: "ChatGPT’den gelen kişi, ChatGPT’ye anlattığı durumla gelir. Örnek sitede çoğunun elinde işlemek istediği bir dosya vardı. Sayfa o dosyayla ilk dakikada bir şey yapmasına izin vermezse ziyaret boşa gider.",
4
- };
5
- export const LANDING_STATS = [
6
- { en: "72 of 102 accounts opened in the first week first came from ChatGPT (71%).", tr: "İlk haftada açılan 102 hesabın 72’si siteye ilk kez ChatGPT’den geldi (%71)." },
7
- { en: "11 of 17 paying customers came from ChatGPT (65%).", tr: "Ödeme yapan 17 müşterinin 11’i ChatGPT’den geldi (%65)." },
8
- { en: "71% mobile, 59 countries. A ChatGPT visitor viewed 2.45 pages and stayed 198 seconds on average.", tr: "%71 mobil, 59 ülke. ChatGPT ziyaretçisi ortalama 2,45 sayfa gördü, 198 saniye kaldı." },
9
- ];
10
- export const LANDING_CHANGES = [
11
- {
12
- change: { en: "File drop box", tr: "Dosya bırakma kutusu" },
13
- why: {
14
- en: "Put on the two pages ChatGPT sent people to. The visitor drops their file and the browser reads its basic details and shows them right away; the file waits in the browser for 24 hours and moves into the app by itself after sign-up. Nothing is uploaded to the server before sign-up.",
15
- tr: "ChatGPT’nin gönderdiği iki sayfaya kondu. Ziyaretçi dosyasını bırakır, tarayıcı dosyanın temel bilgilerini hemen okuyup gösterir; dosya tarayıcıda 24 saat bekler ve kayıttan sonra uygulamaya kendiliğinden geçer. Kayıttan önce hiçbir şey sunucuya yüklenmez.",
16
- },
17
- result: { en: "Measured with events.", tr: "Olaylarla ölçülüyor." },
18
- },
19
- {
20
- change: { en: "A trial with their own file", tr: "Deneme, kendi dosyasıyla" },
21
- why: {
22
- en: "The low-priced first trial used to work with text only; people arriving with their own file were asked for the big plan, and closed the checkout within 3–6 seconds.",
23
- tr: "Düşük fiyatlı ilk deneme önce yalnızca yazıyla çalışıyordu; kendi dosyasıyla gelene büyük plan soruluyordu ve ödeme ekranı 3–6 saniyede kapatılıyordu.",
24
- },
25
- result: { en: "52 of the first 68 generations in week one used the visitor's own file.", tr: "İlk haftadaki 68 ilk üretimin 52’si ziyaretçinin kendi dosyasıyla." },
26
- },
27
- {
28
- change: { en: "Visitors from ChatGPT skip the quiz", tr: "ChatGPT’den gelen testi atlıyor" },
29
- why: {
30
- en: "The onboarding quiz lost about 40% at its first question. Someone coming from ChatGPT to a situation page has already said what they want.",
31
- tr: "Başlangıç testinin ilk sorusunda yaklaşık %40 kayıp vardı. Durum sayfasına ChatGPT’den gelen kişi ne istediğini zaten söylemişti.",
32
- },
33
- result: { en: "After sign-up, straight to the generation screen.", tr: "Kayıttan sonra doğrudan üretim ekranı." },
34
- },
35
- {
36
- change: { en: "The right plan for the intent", tr: "Niyete göre doğru plan" },
37
- why: {
38
- en: "People arriving with their own file were shown a plan that didn't accept files: four people bought the wrong plan, two of them cancelled within an hour.",
39
- tr: "Kendi dosyasıyla gelenlere dosyayı kabul etmeyen plan gösteriliyordu: dört kişi yanlış planı aldı, ikisi bir saat içinde iptal etti.",
40
- },
41
- result: { en: "The checkout opens according to intent.", tr: "Ödeme ekranı niyete göre açılıyor." },
42
- },
43
- {
44
- change: { en: "Payment that fits the audience", tr: "Kitleye uygun ödeme" },
45
- why: {
46
- en: "The audience was 71% mobile, from 59 countries. Apple Pay was on, Google Pay off; on 23 September 7 checkout pages were opened and 1 was paid.",
47
- tr: "Kitle %71 mobil ve 59 ülkeden. Apple Pay açık, Google Pay kapalıydı; 23 Eylül’de 7 ödeme sayfası açıldı, 1’i ödendi.",
48
- },
49
- result: { en: "Google Pay was switched on the same night.", tr: "Google Pay aynı gece açıldı." },
50
- },
51
- {
52
- change: { en: "The button carries the page's context", tr: "Düğme sayfanın bağlamını taşır" },
53
- why: {
54
- en: "The “Start” button at the top passes what the page knows (category, situation) into the quiz.",
55
- tr: "Üstteki “Başla” düğmesi sayfanın bildiğini (kategori, durum) teste geçirir.",
56
- },
57
- result: { en: "The quiz doesn't ask again what the page already answered.", tr: "Test, sayfanın cevapladığı soruyu tekrar sormuyor." },
58
- },
59
- ];
60
- export const LANDING_RULE = {
61
- en: "Don't ask someone coming from ChatGPT what they want again. They already described their situation. The page's job is to start solving it in the first minute.",
62
- tr: "ChatGPT’den gelen kişiye ne istediğini tekrar sormayın. Durumunu zaten anlattı. Sayfanın işi, o durumu ilk dakikada çözmeye başlamak.",
63
- };
64
- export const LANDING_EXERCISE = {
65
- en: "Open the page ChatGPT sends you (or the one you want it to send) on your phone. Without signing up, can you see within 60 seconds that the product works for your situation? If not, add P6's “try it now” block to that page.",
66
- tr: "ChatGPT’nin size gönderdiği ya da göndermesini istediğiniz sayfayı telefonda açın. Kayıt olmadan, 60 saniye içinde ürünün sizin durumunuzda işe yaradığını görebiliyor musunuz? Göremiyorsanız P6’daki “hemen deneme alanı” bloğunu bu sayfaya ekleyin.",
67
- };
1
+ // Filled from katman.pro at run time for a paid key (see _store.js); the package carries no method text.
2
+ import { onMethod } from "./_store.js";
3
+ export let LANDING_CHANGES = [];
4
+ export let LANDING_EXERCISE = {};
5
+ export let LANDING_INTRO = {};
6
+ export let LANDING_RULE = {};
7
+ export let LANDING_STATS = [];
8
+ onMethod((d) => {
9
+ if (d.LANDING_CHANGES !== undefined) LANDING_CHANGES = d.LANDING_CHANGES;
10
+ if (d.LANDING_EXERCISE !== undefined) LANDING_EXERCISE = d.LANDING_EXERCISE;
11
+ if (d.LANDING_INTRO !== undefined) LANDING_INTRO = d.LANDING_INTRO;
12
+ if (d.LANDING_RULE !== undefined) LANDING_RULE = d.LANDING_RULE;
13
+ if (d.LANDING_STATS !== undefined) LANDING_STATS = d.LANDING_STATS;
14
+ });