katman-mcp 0.1.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.
- package/README.md +56 -44
- package/dist/cli.js +27 -14
- package/dist/license.js +331 -98
- package/dist/meta.js +29 -7
- package/dist/plans.js +54 -0
- package/dist/tools/account/account.js +60 -30
- package/dist/tools/account/cli.js +5 -2
- package/dist/tools/account/index.js +7 -7
- package/dist/tools/account/sync.js +2 -2
- package/dist/tools/account/upsell.js +423 -118
- package/dist/tools/crawl/audit/report.js +2 -2
- package/dist/tools/crawl/cli.js +17 -5
- package/dist/tools/crawl/index.js +52 -18
- package/dist/tools/crawl/scan/framework.js +4 -1
- package/dist/tools/method/core/lint.js +15 -1
- package/dist/tools/method/core/prompt.js +2 -1
- package/dist/tools/method/core/start.js +1 -1
- package/dist/tools/method/data/_store.js +17 -0
- package/dist/tools/method/data/anatomy.js +12 -141
- package/dist/tools/method/data/appendices.js +22 -202
- package/dist/tools/method/data/cloudflare.js +28 -192
- package/dist/tools/method/data/evidence.js +18 -137
- package/dist/tools/method/data/geo-jobs.js +8 -128
- package/dist/tools/method/data/landing.js +14 -67
- package/dist/tools/method/data/lessons.js +16 -127
- package/dist/tools/method/data/measurement.js +38 -142
- package/dist/tools/method/data/offsite.js +16 -148
- package/dist/tools/method/data/pages.js +16 -167
- package/dist/tools/method/data/prompts.js +8 -633
- package/dist/tools/method/data/publish.js +14 -113
- package/dist/tools/method/data/research.js +14 -131
- package/dist/tools/method/data/roadmap.js +12 -105
- package/dist/tools/method/data/traps.js +6 -74
- package/dist/tools/method/data/verify.js +12 -88
- package/dist/tools/method/data/viral-list.js +12 -39
- package/dist/tools/method/index.js +27 -17
- package/dist/tools/method/lib/prompt-lookup.js +18 -0
- package/dist/tools/method/mcp/prompts.js +6 -6
- package/dist/tools/method/mcp/resources.js +21 -17
- package/dist/tools/visibility/index.js +10 -10
- package/dist/tools/visibility/monitoring.js +6 -3
- package/package.json +5 -3
- package/server.json +4 -4
|
@@ -1,137 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
+
});
|
|
@@ -1,127 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
{
|
|
18
|
-
practice: { en: "Honest list guides", tr: "Dürüst liste rehberleri" },
|
|
19
|
-
evidence: { en: "24 visitors from ChatGPT in the first week", tr: "İlk hafta ChatGPT’den 24 ziyaretçi" },
|
|
20
|
-
strength: "medium",
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
practice: { en: "A distinctive two-word name and “we're not X”", tr: "Ayırt edici iki kelimelik ad ve “X değiliz”" },
|
|
24
|
-
evidence: { en: "Perplexity recognised the domain in 2 days; ChatGPT describes it correctly", tr: "Perplexity 2 günde alan adını tanıdı; ChatGPT doğru anlatıyor" },
|
|
25
|
-
strength: "medium",
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
practice: { en: "Internal links from the footer", tr: "Altbilgiden iç link" },
|
|
29
|
-
evidence: { en: "After the “no referring page” diagnosis, new pages were indexed quickly", tr: "“Yönlendiren sayfa yok” teşhisinden sonra yeni sayfalar hızla dizine girdi" },
|
|
30
|
-
strength: "medium",
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
practice: { en: "File drop box, the right plan, skipping the quiz", tr: "Dosya kutusu, doğru plan, testi atlamak" },
|
|
34
|
-
evidence: { en: "Measured with events; the first conversions came from the situation page", tr: "Olaylarla ölçülüyor; ilk dönüşümler durum sayfasından" },
|
|
35
|
-
strength: "medium",
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
practice: { en: "Technical SEO round", tr: "Teknik SEO turu" },
|
|
39
|
-
evidence: { en: "Lighthouse performance 59 → 98, SEO 100", tr: "Lighthouse performans 59 → 98, SEO 100" },
|
|
40
|
-
strength: "lab",
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
|
-
export const DIDNT_WORK = [
|
|
44
|
-
{
|
|
45
|
-
what: { en: "Perplexity", tr: "Perplexity" },
|
|
46
|
-
observation: { en: "0 of 12 buyer questions; PerplexityBot made 8 requests", tr: "12 alıcı sorusunun 0’ında; PerplexityBot 8 istek" },
|
|
47
|
-
lesson: { en: "Perplexity likes fresh pages and Reddit; both are weak for us.", tr: "Perplexity taze sayfa ve Reddit seviyor; ikisi de bizde zayıf." },
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
what: { en: "Generic “best X” questions", tr: "Genel “en iyi X” soruları" },
|
|
51
|
-
observation: { en: "ChatGPT lists the big brands", tr: "ChatGPT büyük markaları sayıyor" },
|
|
52
|
-
lesson: { en: "You need to be in independent lists (ch. 14).", tr: "Bağımsız listelerde yer almak gerekiyor (14. bölüm)." },
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
what: { en: "Bing and Copilot", tr: "Bing ve Copilot" },
|
|
56
|
-
observation: { en: "Despite every submission, 0 pages on 24 September and 0 Copilot citations", tr: "Bütün gönderimlere rağmen 24 Eylül’de 0 sayfa, 0 Copilot alıntısı" },
|
|
57
|
-
lesson: { en: "Bing is slow on a new domain; Bing turned out not to be required for ChatGPT.", tr: "Yeni alan adında Bing yavaş; ChatGPT için Bing şart değilmiş." },
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
what: { en: "Claude", tr: "Claude" },
|
|
61
|
-
observation: { en: "Claude-User opened pages 122 times, 0 clicks", tr: "Claude-User 122 kez sayfa açtı, 0 tıklama" },
|
|
62
|
-
lesson: { en: "Being read isn't being clicked.", tr: "Okunmak, tıklanmak değil." },
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
what: { en: "PDFs", tr: "PDF’ler" },
|
|
66
|
-
observation: { en: "Cause and effect not proven", tr: "Sebep sonuç ilişkisi kanıtlanmadı" },
|
|
67
|
-
lesson: { en: "Needs a controlled test (ch. 19).", tr: "Kontrollü test gerekiyor (19. bölüm)." },
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
what: { en: "Google organic", tr: "Google organik" },
|
|
71
|
-
observation: { en: "Almost all impressions are brand searches", tr: "Gösterimlerin neredeyse tamamı marka araması" },
|
|
72
|
-
lesson: { en: "New domain: patience and mentions.", tr: "Yeni alan adı: sabır ve bahsedilme." },
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
what: { en: "Page mix", tr: "Sayfa karışımı" },
|
|
76
|
-
observation: { en: "Perplexity took us for a “template and education site”", tr: "Perplexity bizi “şablon ve eğitim sitesi” sandı" },
|
|
77
|
-
lesson: { en: "Increase the share of product pages: your page mix decides what the assistant thinks you are.", tr: "Ürün sayfası oranını artırın: sayfalarınızın dağılımı asistanın sizi ne sandığını belirler." },
|
|
78
|
-
},
|
|
79
|
-
];
|
|
80
|
-
export const MISTAKES = [
|
|
81
|
-
{ n: 1, site: "sample", mistake: { en: "Every date was launch day", tr: "Bütün tarihler açılış günü" }, what: { en: "The sitemap, the Article schema and RSS carried the same date. The assistant sees a “never updated site”.", tr: "Sitemap, Article şeması, RSS aynı tarihi taşıyordu. Asistan “hiç güncellenmemiş site” görür." }, fix: { en: "The date moves only when the page's words change.", tr: "Tarih yalnızca sayfanın kelimeleri değişince ilerliyor." } },
|
|
82
|
-
{ n: 2, site: "sample", mistake: { en: "llms.txt contradicted the page", tr: "llms.txt sayfayla çelişiyor" }, what: { en: "Two different prices and models for the same feature.", tr: "Aynı özellik için iki farklı fiyat ve model." }, fix: { en: "Pages and llms.txt are generated from one facts file.", tr: "Sayfalar ve llms.txt tek bilgi dosyasından üretiliyor." } },
|
|
83
|
-
{ n: 3, site: "sample", mistake: { en: "A claim bigger than the proof", tr: "Kanıtından büyük iddia" }, what: { en: "We said “we pick the best model for every category and language”; the test was 7 samples rated by 1 person.", tr: "“Her kategori ve dil için en iyi modeli seçiyoruz” dedik; test 1 kişinin değerlendirdiği 7 örnekti." }, fix: { en: "The claim was narrowed and the test's small size stated.", tr: "İddia daraltıldı, testin küçük olduğu yazıldı." } },
|
|
84
|
-
{ n: 4, site: "sample", mistake: { en: "Another language's hreflang on an untranslated page", tr: "Çevrilmemiş sayfaya başka dil hreflang’i" }, what: { en: "An English page carried Turkish hreflang: duplicate titles, a fake language cluster.", tr: "İngilizce sayfa Türkçe hreflang taşıyordu: ikiz title, sahte dil kümesi." }, fix: { en: "The page was actually translated.", tr: "Sayfa gerçekten çevrildi." } },
|
|
85
|
-
{ n: 5, site: "sample", mistake: { en: "Content in JavaScript", tr: "İçerik JavaScript’te" }, what: { en: "The quiz page showed bots 27 words.", tr: "Test sayfası botlara 27 kelime gösteriyordu." }, fix: { en: "An 86-word written “How it works”.", tr: "86 kelimelik yazılı “Nasıl çalışır”." } },
|
|
86
|
-
{ n: 6, site: "sample", mistake: { en: "Pages with few links weren't indexed", tr: "Az link alan sayfa dizine girmedi" }, what: { en: "Pages with 7 internal links stayed “discovered – not indexed”.", tr: "7 iç link alan sayfalar “keşfedildi, dizine eklenmedi”." }, fix: { en: "Footer links; the pages got indexed.", tr: "Altbilgiden link; sayfalar dizine girdi." } },
|
|
87
|
-
{ n: 7, site: "sample", mistake: { en: "The “Related” box always showed the first 6", tr: "“İlgili” kutusu hep ilk 6" }, what: { en: "Pages at the end of the list got a single link.", tr: "Listenin sonundaki sayfalar tek link alıyordu." }, fix: { en: "A neighbour ring: three previous, three next.", tr: "Komşu halkası: üç önceki, üç sonraki." } },
|
|
88
|
-
{ n: 8, site: "sample", mistake: { en: "Flooding IndexNow", tr: "IndexNow’u boğmak" }, what: { en: "All 173 URLs on every release, 20 times in three days.", tr: "Her yayında 173 adresin hepsi, üç günde 20 kez." }, fix: { en: "Only new or changed URLs.", tr: "Yalnızca yeni ya da değişen adresler." } },
|
|
89
|
-
{ n: 9, site: "sample", mistake: { en: "An invalid line in robots.txt", tr: "robots.txt’de geçersiz satır" }, what: { en: "The Content-Signal: line made Lighthouse report “robots.txt is not valid”.", tr: "Content-Signal: satırı Lighthouse’ta “robots.txt geçersiz”." }, fix: { en: "Turned into a comment line (appendix A).", tr: "Yorum satırına çevrildi (Ek A)." } },
|
|
90
|
-
{ n: 10, site: "sample", mistake: { en: "One fix broke something else", tr: "Bir düzeltme başka şeyi bozdu" }, what: { en: "no-transform turned off HTML compression; pages went out ~4× larger.", tr: "no-transform HTML sıkıştırmasını kapattı; sayfalar ~4 kat büyük gitti." }, fix: { en: "Lighthouse and response headers re-checked after every fix.", tr: "Her düzeltmeden sonra Lighthouse ve yanıt başlıkları yeniden kontrol." } },
|
|
91
|
-
{ n: 11, site: "sample", mistake: { en: "Heading level skips", tr: "Başlık seviyesi atlaması" }, what: { en: "387 skips while the one-H1 rule was being met.", tr: "Tek H1 kuralı sağlanırken 387 atlama." }, fix: { en: "Same look, correct tags.", tr: "Görünüm aynı, etiketler doğru." } },
|
|
92
|
-
{ n: 12, site: "sample", mistake: { en: "Taking bots for users", tr: "Botları kullanıcı sanmak" }, what: { en: "A PDF crawler produced 704 fake sessions.", tr: "Bir PDF tarayıcısı 704 sahte oturum üretti." }, fix: { en: "The human filter (ch. 15).", tr: "İnsan filtresi (15. bölüm)." } },
|
|
93
|
-
{ n: 13, site: "sample", mistake: { en: "Trusting the referrer", tr: "Referrer’a güvenmek" }, what: { en: "79% of ChatGPT visitors sent no referrer.", tr: "ChatGPT ziyaretçilerinin %79’u referrer göndermedi." }, fix: { en: "Recognised by utm_source=chatgpt.com.", tr: "utm_source=chatgpt.com ile tanıma." } },
|
|
94
|
-
{ n: 14, site: "sample", mistake: { en: "Selling the wrong plan", tr: "Yanlış plan satmak" }, what: { en: "People arriving with a file were sold a plan that doesn't accept files; 2 cancellations.", tr: "Dosyasıyla gelene dosyayı kabul etmeyen plan; 2 iptal." }, fix: { en: "Checkout by intent.", tr: "Ödeme ekranı niyete göre." } },
|
|
95
|
-
{ n: 15, site: "sample", mistake: { en: "Wrong about a competitor", tr: "Rakip hakkında yanlış" }, what: { en: "A comparison said a competitor “can't” do something it can.", tr: "Bir karşılaştırma, rakibin yapabildiği şeye “yapamaz” diyordu." }, fix: { en: "Re-verified from the competitor's own page.", tr: "Rakibin kendi sayfasından yeniden doğrulandı." } },
|
|
96
|
-
{ n: 16, site: "sample", mistake: { en: "An invisible form error", tr: "Görünmeyen form hatası" }, what: { en: "The error message wasn't in analytics; new users never saw the checkout.", tr: "Hata mesajı analitikte yoktu; yeni kullanıcı ödeme ekranını hiç görmedi." }, fix: { en: "Error events are recorded too.", tr: "Hata olayları da kaydediliyor." } },
|
|
97
|
-
{ n: 17, site: "sample", mistake: { en: "The domain's history", tr: "Alan adının geçmişi" }, what: { en: "The previous owner's 2016 sitemap was still registered in Google and Bing.", tr: "Önceki sahibin 2016 sitemap’i Google ve Bing’de kayıtlıydı." }, fix: { en: "Removed.", tr: "Silindi." } },
|
|
98
|
-
{ n: 18, site: "katman", mistake: { en: "No share card", tr: "Paylaşım kartı yok" }, what: { en: "No page had an og:image; links were shared as empty boxes.", tr: "Hiçbir sayfada og:image yoktu; linkler boş kutu olarak paylaşılıyordu." }, fix: { en: "A 1200×630 card, 40/40 pages.", tr: "1200×630 kart, 40/40 sayfa." } },
|
|
99
|
-
{ n: 19, site: "katman", mistake: { en: "Pages with no links in", tr: "Hiç link almayan sayfa" }, what: { en: "The glossary and the Turkish Cloudflare article got no link from anywhere.", tr: "Sözlük ve TR Cloudflare yazısı hiçbir yerden link almıyordu." }, fix: { en: "Links from the footer.", tr: "Altbilgiden link." } },
|
|
100
|
-
{ n: 20, site: "katman", mistake: { en: "Cloudflare turning bots away at the door", tr: "Cloudflare botları kapıda çeviriyor" }, what: { en: "In August the managed robots.txt, in September the legacy “Block AI bots” toggle: training bots got 403 while robots.txt allowed them (ch. 6).", tr: "Ağustos’ta yönetilen robots.txt, Eylül’de eski “Block AI bots” düğmesi: robots.txt izin verirken eğitim botları 403 (06. bölüm)." }, fix: { en: "Setting turned off, retested.", tr: "Ayar kapatıldı, yeniden test edildi." } },
|
|
101
|
-
{ n: 21, site: "katman", mistake: { en: "Charset came late", tr: "charset geç geliyor" }, what: { en: "On the home page the JSON-LD came before the charset tag.", tr: "Ana sayfada JSON-LD, charset etiketinden önceydi." }, fix: { en: "charset on the first line.", tr: "charset ilk satırda." } },
|
|
102
|
-
];
|
|
103
|
-
export const DELIBERATELY_NOT_DONE = [
|
|
104
|
-
{ en: "Putting ourselves first in a list we wrote.", tr: "Kendi yazdığımız listede kendimizi birinci koymak." },
|
|
105
|
-
{ en: "Publishing hundreds of pages from one template without knowing the indexing rate.", tr: "Dizine alınma oranını bilmeden tek şablondan yüzlerce sayfa basmak." },
|
|
106
|
-
{ en: "Resubmitting a page that isn't indexed over and over.", tr: "Dizine girmeyen sayfayı tekrar tekrar göndermek." },
|
|
107
|
-
{ en: "Fake Reddit accounts, paid or filtered reviews, bought links.", tr: "Sahte Reddit hesapları, ücretli ya da süzülmüş yorumlar, satın alınmış linkler." },
|
|
108
|
-
{ en: "Opening our own Wikipedia or Wikidata entry this early: without independent sources it gets deleted and hurts trust.", tr: "Bu kadar erken kendi Wikipedia ya da Wikidata kaydımızı açmak: bağımsız kaynak yokken silinir, güveni düşürür." },
|
|
109
|
-
{ en: "Calling a paid product “free”; headlines implying another brand's endorsement.", tr: "Ücretli ürüne “ücretsiz” demek; başka bir markanın onayını ima eden başlıklar." },
|
|
110
|
-
{ en: "Content that only appears when JavaScript runs.", tr: "Yalnızca JavaScript çalışınca görünen içerik." },
|
|
111
|
-
{ en: "Made-up user counts, fake testimonials, fake logos. The UK DMCC Act bans fake reviews. As “proof”: only real examples, our own test data and sourced third-party statistics.", tr: "Uydurma kullanıcı sayısı, sahte referans, sahte logo. Birleşik Krallık’ta DMCC Yasası sahte yorumu yasaklıyor. “Kanıt” olarak yalnızca gerçek örnekler, kendi test verimiz ve kaynaklı üçüncü taraf istatistikleri." },
|
|
112
|
-
{ en: "Fake urgency: a discount deadline is written as it really is.", tr: "Sahte aciliyet: indirim süresi gerçekte neyse o yazılır." },
|
|
113
|
-
{ en: "Tying a supplier's model name to the product: use your own model names and name the supplier in the legal notice.", tr: "Tedarikçinin model adını ürüne bağlamak: kendi model adlarınızı kullanın, tedarikçiyi yasal açıklamada yazın." },
|
|
114
|
-
];
|
|
115
|
-
/** Ch. 16: the same list on the sample site — 6 issues fixed the same day. */
|
|
116
|
-
export const SAME_DAY_FIXES = [
|
|
117
|
-
{ issue: { en: "HTML wasn't compressed: a Cache-Control: no-transform added the day before (to block Cloudflare's automatic analytics script) had also switched off Cloudflare's compression", tr: "HTML sıkıştırılmıyordu: bir gün önce Cloudflare’in otomatik analitik kodunu engellemek için eklenen Cache-Control: no-transform, Cloudflare’in sıkıştırmasını da kapatmıştı" }, found: { en: "Lighthouse “text compression” warning; command 9", tr: "Lighthouse “metin sıkıştırması” uyarısı; komut 9" }, fix: { en: "The Worker compresses by itself", tr: "Sıkıştırmayı Worker kendisi yapıyor" }, result: { en: "Home page 60.8 → 14.1 KB", tr: "Ana sayfa 60,8 → 14,1 KB" } },
|
|
118
|
-
{ issue: { en: "387 heading level skips (h1→h3, h2→h4)", tr: "387 başlık seviyesi atlaması (h1→h3, h2→h4)" }, found: { en: "The h1–h6 order on every page", tr: "Her sayfada h1–h6 sırası" }, fix: { en: "Same look, tags at the right level", tr: "Görünüm aynı, etiket doğru seviyede" }, result: { en: "387 → 0", tr: "387 → 0" } },
|
|
119
|
-
{ issue: { en: "6 titles over 70 characters (longest 101)", tr: "6 title 70 karakteri aşıyordu (en uzunu 101)" }, found: { en: "Title length distribution", tr: "Title uzunluk dağılımı" }, fix: { en: "Shortened; posts got a short seoTitle field", tr: "Kısaltıldı; yazılara kısa bir seoTitle alanı" }, result: { en: "6 → 0", tr: "6 → 0" } },
|
|
120
|
-
{ issue: { en: "39 pages received at most 2 internal links; the “Related” box showed the group's first 6 pages everywhere", tr: "39 sayfa en fazla 2 iç link alıyordu; “İlgili” kutusu her sayfada grubun ilk 6 sayfasını gösteriyordu" }, found: { en: "Internal links received per page", tr: "Sayfa başına gelen iç link" }, fix: { en: "Every page shows its three previous and three next neighbours", tr: "Her sayfa üç önceki ve üç sonraki komşusunu gösteriyor" }, result: { en: "39 → 2", tr: "39 → 2" } },
|
|
121
|
-
{ issue: { en: "og:image had no size or alt text", tr: "og:image’in boyutu ve alt metni yoktu" }, found: { en: "The og tag list", tr: "og etiket listesi" }, fix: { en: "og:image:width, height, alt", tr: "og:image:width, height, alt" }, result: { en: "Added", tr: "Eklendi" } },
|
|
122
|
-
{ issue: { en: "18 px tap targets on mobile", tr: "Mobilde 18 px dokunma hedefleri" }, found: { en: "Lighthouse target-size", tr: "Lighthouse target-size" }, fix: { en: "16 cells as 8 + 8 instead of one row", tr: "16 hücre tek satır yerine 8 + 8" }, result: { en: "39 px; accessibility 97 → 100", tr: "39 px; erişilebilirlik 97 → 100" } },
|
|
123
|
-
];
|
|
124
|
-
export const LESSONS_EXERCISE = {
|
|
125
|
-
en: "Write everything you've done on your own site into the two tables (worked / didn't) with its evidence next to it. Mark whatever has no evidence as “we don't know yet”, and tell your team the same.",
|
|
126
|
-
tr: "Kendi sitenizde yaptığınız her işi bu iki tabloya yazın ve yanına kanıtını koyun. Kanıtı olmayanı “henüz bilmiyoruz” diye işaretleyin; ekibinize de öyle anlatın.",
|
|
127
|
-
};
|
|
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 DELIBERATELY_NOT_DONE = [];
|
|
4
|
+
export let DIDNT_WORK = [];
|
|
5
|
+
export let LESSONS_EXERCISE = {};
|
|
6
|
+
export let MISTAKES = [];
|
|
7
|
+
export let SAME_DAY_FIXES = [];
|
|
8
|
+
export let WORKED = [];
|
|
9
|
+
onMethod((d) => {
|
|
10
|
+
if (d.DELIBERATELY_NOT_DONE !== undefined) DELIBERATELY_NOT_DONE = d.DELIBERATELY_NOT_DONE;
|
|
11
|
+
if (d.DIDNT_WORK !== undefined) DIDNT_WORK = d.DIDNT_WORK;
|
|
12
|
+
if (d.LESSONS_EXERCISE !== undefined) LESSONS_EXERCISE = d.LESSONS_EXERCISE;
|
|
13
|
+
if (d.MISTAKES !== undefined) MISTAKES = d.MISTAKES;
|
|
14
|
+
if (d.SAME_DAY_FIXES !== undefined) SAME_DAY_FIXES = d.SAME_DAY_FIXES;
|
|
15
|
+
if (d.WORKED !== undefined) WORKED = d.WORKED;
|
|
16
|
+
});
|