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,127 +1,16 @@
1
- export const WORKED = [
2
- {
3
- practice: { en: "Situation pages with the answer in the first sentence", tr: "Durum sayfaları ve ilk cümlede cevap" },
4
- evidence: { en: "59% of ChatGPT traffic went to two situation pages; 8 of 17 payers from a single situation page", tr: "ChatGPT trafiğinin %59’u iki durum sayfasına; 17 ödeyenin 8’i tek bir durum sayfasından" },
5
- strength: "strong",
6
- },
7
- {
8
- practice: { en: "The same sentence: first line, meta description, llms.txt", tr: "Aynı cümle: ilk satır, meta açıklama, llms.txt" },
9
- evidence: { en: "All four parts were repeated in ChatGPT answers", tr: "ChatGPT cevaplarında dört parçanın dördü tekrar edildi" },
10
- strength: "strong",
11
- },
12
- {
13
- practice: { en: "A bot-friendly robots.txt and JavaScript-free HTML", tr: "Botlara açık robots.txt ve JavaScript’siz HTML" },
14
- evidence: { en: "Over 750 OpenAI bot requests, 0 errors; OAI-SearchBot read 176 pages", tr: "OpenAI botları 750’den fazla istek, 0 hata; OAI-SearchBot 176 sayfa" },
15
- strength: "strong",
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
+ });
@@ -1,142 +1,38 @@
1
- export const MEASURE_INTRO = {
2
- en: "On 22 September, when the sample site's PDFs went live, a PDF link crawler produced 704 fake sessions: USA, desktop, one page, 5 seconds, zero scrolling. Because they ran JavaScript, they looked like visitors in analytics.",
3
- tr: "22 Eylül’de örnek sitenin PDF’leri yayınlanınca bir PDF link tarayıcısı 704 sahte oturum üretti: ABD, masaüstü, tek sayfa, 5 saniye, sıfır kaydırma. JavaScript çalıştırdıkları için analitikte ziyaretçi gibi görünüyorlardı.",
4
- };
5
- export const HUMAN_FILTER = {
6
- text: {
7
- en: "A session counts as human only if at least one of these happened: it scrolled the page, viewed more than 2 pages, finished the quiz, signed up, paid, or came from TikTok's or Instagram's in-app browser. 528 of the first week's 1,546 sessions passed. The filter is cautious: roughly three in ten real sessions don't pass it.",
8
- tr: "Bir oturum ancak şunlardan biri varsa insan sayılır: sayfayı kaydırdı, 2’den fazla sayfa gördü, testi bitirdi, kaydoldu, ödedi ya da TikTok veya Instagram’ın uygulama içi tarayıcısından geldi. İlk haftanın 1.546 oturumundan 528’i geçti. Filtre temkinli: gerçek oturumların yaklaşık onda üçü geçemiyor.",
9
- },
10
- formula: "human = scroll > 0 OR pages > 2 OR quiz_finished OR signup OR payment OR in_app_browser",
11
- };
12
- /** Referrer hosts that mean "an AI assistant sent this visitor". */
13
- export const AI_REFERRER_HOSTS = [
14
- "chatgpt.com", "chat.openai.com", "perplexity.ai", "claude.ai", "gemini.google.com", "bard.google.com",
15
- "copilot.microsoft.com", "grok.com", "chat.deepseek.com", "meta.ai", "chat.mistral.ai", "you.com", "phind.com", "poe.com",
16
- ];
17
- /** utm_source substrings that mean AI (ChatGPT appends utm_source=chatgpt.com to its links). */
18
- export const AI_UTM_MARKERS = ["chatgpt.com", "chatgpt", "openai", "perplexity", "claude", "gemini", "copilot", "grok", "deepseek"];
19
- export const SEARCH_REFERRER_PATTERNS = [
20
- "google.*", "bing.com", "yandex.*", "search.brave.com", "duckduckgo.com", "ecosia.org", "search.yahoo.com", "baidu.com", "naver.com", "seznam.cz", "yep.com",
21
- ];
22
- export const SOCIAL_REFERRER_HOSTS = [
23
- "instagram.com", "facebook.com", "fb.com", "x.com", "t.co", "twitter.com", "reddit.com", "youtube.com", "youtu.be", "tiktok.com", "linkedin.com", "lnkd.in", "pinterest.com", "threads.net", "news.ycombinator.com",
24
- ];
25
- export const CHANNEL_RULE = {
26
- text: {
27
- en: "ChatGPT: referrer chatgpt.com OR utm_source=chatgpt.com in the link. 79% of the sample site's ChatGPT visitors sent no referrer; without reading the tag we'd have taken four fifths of ChatGPT traffic for “direct”. Put UTM tags on your own outbound links too (video descriptions, PDFs, e-mails).",
28
- tr: "ChatGPT: referrer chatgpt.com ya da linkte utm_source=chatgpt.com. ChatGPT ziyaretçilerinin %79’u referrer göndermedi; etiketi okumasaydık ChatGPT trafiğinin beşte dördünü “doğrudan” sanacaktık. Kendi dış linklerinize (video açıklaması, PDF, e-posta) de UTM koyun.",
29
- },
30
- rules: `channel = 'ai' referrer chatgpt.com, perplexity.ai, claude.ai, gemini.google.com, copilot.microsoft.com… OR utm_source=chatgpt.com (or another assistant)
31
- 'search' referrer google.*, bing.com, yandex.*, search.brave.com, duckduckgo.com
32
- 'social' referrer instagram, facebook, x, reddit, youtube, tiktok…
33
- 'direct' none of the above`,
34
- };
35
- export const BOT_COUNT = {
36
- text: {
37
- en: "Bots don't run the analytics script in the browser: classify every request's user-agent on the server and count per day. Sample site, 21–27 September:",
38
- tr: "Botlar tarayıcıdaki analitik kodunu çalıştırmaz; her isteğin user-agent’ını sunucuda sınıflandırıp günlük sayın. Örnek sitede 21–27 Eylül:",
39
- },
40
- sample: [
41
- { bot: "Googlebot", who: { en: "Google search", tr: "Google arama" }, requests: 778, pages: 305 },
42
- { bot: "YandexBot", who: { en: "Yandex", tr: "Yandex" }, requests: 773, pages: 341 },
43
- { bot: "ClaudeBot", who: { en: "Anthropic, training and index", tr: "Anthropic, eğitim ve dizin" }, requests: 578, pages: 379 },
44
- { bot: "GPTBot", who: { en: "OpenAI, training", tr: "OpenAI, eğitim" }, requests: 362, pages: 98 },
45
- { bot: "OAI-SearchBot", who: { en: "OpenAI, ChatGPT search index", tr: "OpenAI, ChatGPT arama dizini" }, requests: 205, pages: 176 },
46
- { bot: "ChatGPT-User", who: { en: "OpenAI, page opened during a chat", tr: "OpenAI, sohbette açılan sayfa" }, requests: 191, pages: 19 },
47
- { bot: "Claude-User", who: { en: "Anthropic, page opened during a chat", tr: "Anthropic, sohbette açılan sayfa" }, requests: 122, pages: 64 },
48
- { bot: "Bingbot", who: { en: "Microsoft, Copilot", tr: "Microsoft, Copilot" }, requests: 17, pages: 10 },
49
- { bot: "PerplexityBot", who: { en: "Perplexity", tr: "Perplexity" }, requests: 8, pages: 6 },
50
- ],
51
- };
52
- /** The question set: 12 unbranded questions + 2 diagnostic ones. */
53
- export const QUESTION_SET = [
54
- {
55
- type: "situation",
56
- range: "1–3",
57
- count: 3,
58
- template: { en: "“I have [situation] but [obstacle]. Is there a site that [desired result]?”", tr: "“[Durum] var ama [engel]. [İstenen sonuç] yapan bir site var mı?”" },
59
- note: { en: "The type the sample site won", tr: "Örnek sitenin kazandığı tip" },
60
- },
61
- {
62
- type: "tool",
63
- range: "4–5",
64
- count: 2,
65
- template: { en: "“Which AI tool does [the job]?”", tr: "“[İş]i yapan yapay zekâ aracı hangisi?”" },
66
- note: { en: "Short and general", tr: "Kısa ve genel" },
67
- },
68
- {
69
- type: "best",
70
- range: "6–7",
71
- count: 2,
72
- template: { en: "“Best [category] 2026”", tr: "“En iyi [kategori] 2026”" },
73
- note: { en: "Big brands dominate", tr: "Büyük markalar baskın" },
74
- },
75
- {
76
- type: "alternative",
77
- range: "8–9",
78
- count: 2,
79
- template: { en: "“[Big competitor] alternatives with [feature]”", tr: "“[Büyük rakip] alternatifleri, [özellik] ile”" },
80
- note: { en: "List articles", tr: "Liste yazıları" },
81
- },
82
- {
83
- type: "market",
84
- range: "10–11",
85
- count: 2,
86
- template: { en: "“Best site for [job] in [language]”", tr: "“[Dil]de [iş] için en iyi site”" },
87
- note: { en: "Local competitors", tr: "Yerel rakipler" },
88
- },
89
- {
90
- type: "problem",
91
- range: "12",
92
- count: 1,
93
- template: { en: "“How do I fix [problem]?”", tr: "“[Sorun] nasıl düzeltilir?”" },
94
- note: { en: "Usually names no tool", tr: "Genelde araç anmaz" },
95
- },
96
- {
97
- type: "diagnostic",
98
- range: "T1–T2",
99
- count: 2,
100
- template: { en: "“What is [brand]?” · “What is [brand] ([domain])?”", tr: "“[Marka] nedir?” · “[Marka] ([alan adı]) nedir?”" },
101
- note: { en: "Is there confusion; is the domain recognised?", tr: "Karışıklık var mı, alan adı tanınıyor mu" },
102
- },
103
- ];
104
- export const RECORD_RULE = {
105
- en: "Record on every run: date, model, session type, whether you were mentioned, your position, who else was named, which of your pages was cited, a screenshot. A single run is a “low sample”; ask the same questions every 14 days.",
106
- tr: "Her çalıştırmada kaydedin: tarih, model, oturum tipi, anıldınız mı, kaçıncı, kimler anıldı, hangi sayfanız kaynak gösterildi, ekran görüntüsü. Tek çalıştırma “düşük örnek”tir; aynı soruları 14 günde bir tekrar sorun.",
107
- };
108
- /** 2026 evidence: measure frequency, not rank; API answers are a proxy of the consumer apps. */
109
- export const MEASURE_FREQUENCY = {
110
- en: "Measure frequency, not rank: the same list repeats in under 1% of runs, while top brands appear in 55–77% of runs. Ask your 3 most important situation questions at least 3 times each (samples: 3) and report how often you're named, recommended and cited — three separate rates, not one score.",
111
- tr: "Sırayı değil sıklığı ölçün: aynı liste çalıştırmaların %1’inden azında tekrar ediyor, en güçlü markalar ise çalıştırmaların %55–77’sinde görünüyor. En önemli 3 durum sorunuzu en az 3’er kez sorun (samples: 3) ve ne sıklıkla anıldığınızı, önerildiğinizi ve kaynak gösterildiğinizi raporlayın — tek bir puan değil, üç ayrı oran.",
112
- };
113
- export const API_PROXY_NOTE = {
114
- en: "API runs are a proxy: a 2026 study found only 15–32% brand overlap between API answers and the consumer apps. Confirm your key questions in the real apps (logged out, web search on) with katman_manual_check.",
115
- tr: "API ölçümleri bir vekildir: 2026’daki bir çalışma API cevaplarıyla tüketici uygulamaları arasında yalnızca %15–32 marka örtüşmesi buldu. Kilit sorularınızı gerçek uygulamalarda (oturum açmadan, web araması açık) katman_manual_check ile doğrulayın.",
116
- };
117
- export const INDICATORS = [
118
- { indicator: { en: "Real visitors from assistants", tr: "Asistandan gelen gerçek ziyaretçi" }, source: { en: "Your own analytics, with the human filter", tr: "Kendi analitiğiniz, insan filtresiyle" }, frequency: { en: "Daily", tr: "Günlük" } },
119
- { indicator: { en: "Share of accounts and payments from assistants", tr: "Asistandan gelen hesap ve ödeme payı" }, source: { en: "Funnel events", tr: "Huni olayları" }, frequency: { en: "Weekly", tr: "Haftalık" } },
120
- { indicator: { en: "Mention rate on the question set", tr: "Soru setinde anılma oranı" }, source: { en: "By hand or by script (katman_visibility_run, katman_manual_check)", tr: "Elle ya da betikle (katman_visibility_run, katman_manual_check)" }, frequency: { en: "Every 14 days", tr: "14 günde bir" } },
121
- { indicator: { en: "Bot requests and distinct pages read", tr: "Bot istekleri ve okunan farklı sayfa" }, source: { en: "Server-side counting", tr: "Sunucu tarafı sayım" }, frequency: { en: "Weekly", tr: "Haftalık" } },
122
- { indicator: { en: "Pages in and out of the index, non-brand impressions", tr: "Dizinde olan ve olmayan sayfa, marka dışı gösterim" }, source: { en: "Search Console, Bing Webmaster", tr: "Search Console, Bing Webmaster" }, frequency: { en: "Weekly", tr: "Haftalık" } },
123
- { indicator: { en: "AI citations reported by the engines", tr: "Motorların raporladığı yapay zekâ alıntıları" }, source: { en: "Search Console Gen-AI report; Bing Webmaster AI Performance", tr: "Search Console Gen-AI raporu; Bing Webmaster AI Performance" }, frequency: { en: "Weekly", tr: "Haftalık" } },
124
- { indicator: { en: "Lighthouse mobile, 5 pages", tr: "Lighthouse mobil, 5 sayfa" }, source: { en: "Lighthouse", tr: "Lighthouse" }, frequency: { en: "After every big change", tr: "Her büyük değişiklikten sonra" } },
125
- { indicator: { en: "Broken links, noindex, heading order, canonical", tr: "Kırık link, noindex, başlık sırası, canonical" }, source: { en: "Full crawl (P14, katman_audit_site)", tr: "Tam tarama (P14, katman_audit_site)" }, frequency: { en: "Monthly and on every template change", tr: "Aylık ve her şablon değişikliğinde" } },
126
- ];
127
- export const FUNNEL_EVENTS = {
128
- en: "Record every step as an event: page view, button click, quiz start and finish, sign-up screen, sign-up, checkout screen, checkout page, payment, file drop, a ChatGPT visitor skipping the quiz. On the sample site, inline client-side error messages didn't show up in analytics; one form error meant new users never saw the checkout. Error events are recorded now too.",
129
- tr: "Her adımı bir olay olarak kaydedin: sayfa görüntüleme, düğme tıklama, test başlangıcı ve bitişi, kayıt ekranı, kayıt, ödeme ekranı, ödeme sayfası, ödeme, dosya bırakma, ChatGPT’den gelenin testi atlaması. Örnek sitede istemci tarafındaki satır içi hata mesajları analitikte görünmüyordu; bir form hatası yeni kullanıcıların ödeme ekranını hiç görmemesine yol açmıştı. Artık hata olayları da kaydediliyor.",
130
- };
131
- export const CF_ANALYTICS_NOTE = {
132
- en: "On Cloudflare you can build a read-only bot panel from the GraphQL Analytics API. Note: Cloudflare's log can show the site's own cache writes as 504s; they aren't outages.",
133
- tr: "Cloudflare kullanıyorsanız GraphQL Analytics API’den salt okunur bir bot paneli kurabilirsiniz. Not: Cloudflare kaydı sitenin kendi önbellek yazmalarını 504 gibi gösterebiliyor; bunlar kesinti değil.",
134
- };
135
- export const GSC_AI_NOTE = {
136
- en: "Search Console's AI impressions record the position of the AI block, not of your link: an impression doesn't mean anyone saw your link.",
137
- tr: "Search Console’daki yapay zekâ gösterimleri sizin linkinizin değil, yapay zekâ bloğunun konumunu kaydeder: gösterim, birinin linkinizi gördüğü anlamına gelmez.",
138
- };
139
- export const MEASURE_EXERCISE = {
140
- en: "Write your question set into research, record the first measurement with today's date, and put the same measurement in your calendar for 14 days from now.",
141
- tr: "Soru setinizi research.md’ye yazın, bugünün tarihiyle ilk ölçümü kaydedin ve takviminize 14 gün sonrası için aynı ölçümü koyun.",
142
- };
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 AI_REFERRER_HOSTS = [];
4
+ export let AI_UTM_MARKERS = [];
5
+ export let API_PROXY_NOTE = {};
6
+ export let BOT_COUNT = {};
7
+ export let CF_ANALYTICS_NOTE = {};
8
+ export let CHANNEL_RULE = {};
9
+ export let FUNNEL_EVENTS = {};
10
+ export let GSC_AI_NOTE = {};
11
+ export let HUMAN_FILTER = {};
12
+ export let INDICATORS = [];
13
+ export let MEASURE_EXERCISE = {};
14
+ export let MEASURE_FREQUENCY = {};
15
+ export let MEASURE_INTRO = {};
16
+ export let QUESTION_SET = [];
17
+ export let RECORD_RULE = {};
18
+ export let SEARCH_REFERRER_PATTERNS = [];
19
+ export let SOCIAL_REFERRER_HOSTS = [];
20
+ onMethod((d) => {
21
+ if (d.AI_REFERRER_HOSTS !== undefined) AI_REFERRER_HOSTS = d.AI_REFERRER_HOSTS;
22
+ if (d.AI_UTM_MARKERS !== undefined) AI_UTM_MARKERS = d.AI_UTM_MARKERS;
23
+ if (d.API_PROXY_NOTE !== undefined) API_PROXY_NOTE = d.API_PROXY_NOTE;
24
+ if (d.BOT_COUNT !== undefined) BOT_COUNT = d.BOT_COUNT;
25
+ if (d.CF_ANALYTICS_NOTE !== undefined) CF_ANALYTICS_NOTE = d.CF_ANALYTICS_NOTE;
26
+ if (d.CHANNEL_RULE !== undefined) CHANNEL_RULE = d.CHANNEL_RULE;
27
+ if (d.FUNNEL_EVENTS !== undefined) FUNNEL_EVENTS = d.FUNNEL_EVENTS;
28
+ if (d.GSC_AI_NOTE !== undefined) GSC_AI_NOTE = d.GSC_AI_NOTE;
29
+ if (d.HUMAN_FILTER !== undefined) HUMAN_FILTER = d.HUMAN_FILTER;
30
+ if (d.INDICATORS !== undefined) INDICATORS = d.INDICATORS;
31
+ if (d.MEASURE_EXERCISE !== undefined) MEASURE_EXERCISE = d.MEASURE_EXERCISE;
32
+ if (d.MEASURE_FREQUENCY !== undefined) MEASURE_FREQUENCY = d.MEASURE_FREQUENCY;
33
+ if (d.MEASURE_INTRO !== undefined) MEASURE_INTRO = d.MEASURE_INTRO;
34
+ if (d.QUESTION_SET !== undefined) QUESTION_SET = d.QUESTION_SET;
35
+ if (d.RECORD_RULE !== undefined) RECORD_RULE = d.RECORD_RULE;
36
+ if (d.SEARCH_REFERRER_PATTERNS !== undefined) SEARCH_REFERRER_PATTERNS = d.SEARCH_REFERRER_PATTERNS;
37
+ if (d.SOCIAL_REFERRER_HOSTS !== undefined) SOCIAL_REFERRER_HOSTS = d.SOCIAL_REFERRER_HOSTS;
38
+ });
@@ -1,148 +1,16 @@
1
- export const OFFSITE_INTRO = {
2
- en: "Item 10 of the viral list is “backlink strategy”. Google expects links to come naturally over time; bought links are spam. On the assistant side, your name appearing where assistants read matters as much as links.",
3
- tr: "Viral listenin 10. maddesi “backlink stratejisi”. Google linklerin zamanla doğal gelmesini bekliyor; satın alınan link spam. Asistan tarafında ise link kadar, asistanların okuduğu yerlerde adınızın geçmesi önemli.",
4
- };
5
- /** Desk research (24 Sep, not verified by us) + 2026 community evidence. */
6
- export const OFFSITE_EVIDENCE = [
7
- {
8
- strength: "medium-strong",
9
- text: {
10
- en: "YouTube: 0.737 correlation between YouTube mentions and AI visibility — the strongest correlate. Branded web mentions 0.66–0.71; domain strength about 0.3; number of pages 0.19 (Ahrefs, May 2026).",
11
- tr: "YouTube: YouTube’da anılma ile yapay zekâ görünürlüğü arasındaki korelasyon 0,737 — en güçlü ilişki. Markalı web bahsedilmeleri 0,66–0,71; domain gücü yaklaşık 0,3; sayfa sayısı 0,19 (Ahrefs, Mayıs 2026).",
12
- },
13
- },
14
- {
15
- strength: "medium",
16
- text: {
17
- en: "Lists: 43.8% of the URLs ChatGPT cites for “best X” questions are list articles. When the author puts itself first, its own brand is left out 43–69% of the time (Ahrefs).",
18
- tr: "Listeler: “En iyi X” sorularında ChatGPT’nin alıntıladığı adreslerin %43,8’i liste yazısı. Kendini listenin başına koyan yazarın markası %43–69 oranında atlanıyor (Ahrefs).",
19
- },
20
- },
21
- {
22
- strength: "medium",
23
- text: {
24
- en: "Most-cited domains by assistants: YouTube 10.2%, Reddit 6.4%, google.com 9.0%, Wikipedia 1.8% (LLM Pulse, Sep 2026). Reddit is volatile: ChatGPT's Reddit citations fell 86% in August 2026.",
25
- tr: "Asistanların en çok alıntıladığı alan adları: YouTube %10,2, Reddit %6,4, google.com %9,0, Wikipedia %1,8 (LLM Pulse, Eylül 2026). Reddit oynak: ChatGPT’nin Reddit alıntıları Ağustos 2026’da %86 düştü.",
26
- },
27
- },
28
- {
29
- strength: "medium-strong",
30
- text: {
31
- en: "Earned media: 84% of AI citations are earned mentions (reviews, press, other people's lists and comparisons, podcasts). Sites listed on review platforms average 4.6–6.3 citations vs 1.8.",
32
- tr: "Kazanılmış bahsedilme: yapay zekâ alıntılarının %84’ü kazanılmış bahsedilme (yorumlar, basın, başkalarının listeleri ve karşılaştırmaları, podcast’ler). Yorum platformlarında yer alan siteler ortalama 4,6–6,3 alıntı alıyor, diğerleri 1,8.",
33
- },
34
- },
35
- ];
36
- export const OFFSITE_WHAT_WE_DID = [
37
- {
38
- what: { en: "PDF books", tr: "PDF kitaplar" },
39
- status: {
40
- en: "Two PDF books from the site's content (English and Turkish). First on the site, then on Internet Archive and Calaméo; every chapter links to its page on the site.",
41
- tr: "Sitedeki içerikten iki PDF kitap (İngilizce ve Türkçe). Önce sitede, sonra Internet Archive ve Calaméo’da; her bölüm sitedeki sayfasına link veriyor.",
42
- },
43
- note: {
44
- en: "WEAK EVIDENCE: the first ChatGPT visitor came 8 hours after publishing — a sequence, not a cause. ChatGPT sent people to feature pages, not to the PDFs.",
45
- tr: "ZAYIF KANIT: yayından 8 saat sonra ilk ChatGPT ziyaretçisi geldi; bu bir sıra, sebep değil. ChatGPT PDF’lere değil, özellik sayfalarına yönlendirdi.",
46
- },
47
- },
48
- {
49
- what: { en: "YouTube, Instagram, TikTok", tr: "YouTube, Instagram, TikTok" },
50
- status: {
51
- en: "Walkthrough videos on the relevant pages as click-to-load embeds with VideoObject schema; the accounts in the Organization schema's sameAs.",
52
- tr: "Anlatım videoları ilgili sayfalarda, tıklanınca yüklenen gömme olarak ve VideoObject şemasıyla; hesaplar Organization şemasının sameAs alanında.",
53
- },
54
- note: { en: "YouTube is the strongest signal above. Traffic from TikTok is close to 0 so far.", tr: "YouTube yukarıdaki en güçlü sinyal. TikTok’tan trafik şimdilik neredeyse 0." },
55
- },
56
- {
57
- what: { en: "Directory texts", tr: "Dizin metinleri" },
58
- status: {
59
- en: "Ready: name, category, a 60-character tagline, 250- and 600-character descriptions, tags.",
60
- tr: "Hazır: ad, kategori, 60 karakterlik slogan, 250 ve 600 karakterlik açıklama, etiketler.",
61
- },
62
- note: {
63
- en: "Free directories require an account; paid ones ($99–497) await a decision.",
64
- tr: "Ücretsiz dizinler hesap istiyor; ücretli olanlar (99–497 $) karar bekliyor.",
65
- },
66
- },
67
- {
68
- what: { en: "Reddit plan", tr: "Reddit planı" },
69
- status: {
70
- en: "No fake accounts, open disclosure in every mention, 14 days of help only first, at most one post a week, UTM links, stop rules.",
71
- tr: "Sahte hesap yok, her bahsedilmede açık beyan, önce 14 gün yalnızca yardım, haftada en fazla bir gönderi, UTM’li link, durdurma kuralları.",
72
- },
73
- note: { en: "Not started yet.", tr: "Henüz başlamadı." },
74
- },
75
- {
76
- what: { en: "Outreach to list authors", tr: "Liste yazarlarına ulaşma" },
77
- status: {
78
- en: "Ask the assistant “which articles did you use?”, then send those authors a short, factual introduction.",
79
- tr: "Asistana “hangi makaleleri kullandın?” diye sorup o yazarlara kısa, gerçeklere dayalı bir tanıtım.",
80
- },
81
- note: { en: "Not done yet. If a placement is paid, disclose it openly.", tr: "Henüz yapılmadı. Ücretli yerleşim olursa açıkça beyan." },
82
- },
83
- ];
84
- export const OFFSITE_RULES = [
85
- {
86
- topic: { en: "PDF books", tr: "PDF kitaplar" },
87
- rule: {
88
- en: "First on your own site (DigitalDocument schema), then on Internet Archive and Calaméo, under a CC BY-ND licence; every chapter returns to its page on the site with a UTM link. (Scribd and SlideShare were closed to uploads at the time.)",
89
- tr: "Önce kendi sitenizde (DigitalDocument şeması), sonra Internet Archive ve Calaméo’da; CC BY-ND lisansla; her bölüm UTM’li linkle sitedeki sayfasına döner. (Scribd ve SlideShare o dönem yüklemeye kapalıydı.)",
90
- },
91
- },
92
- {
93
- topic: { en: "YouTube", tr: "YouTube" },
94
- rule: {
95
- en: "Long videos (walkthroughs, problem solving) on the relevant page as a click-to-load cover: nothing is requested from YouTube until it plays. Next to it a “Watch on YouTube” link and VideoObject schema. Long videos and Shorts on separate channels; AI-use disclosure set to “Yes”. Titles that answer the target questions, with chapters and a transcript.",
96
- tr: "Uzun videolar (anlatım, sorun çözme) ilgili sayfada tıklanınca yüklenen bir kapak olarak: oynatılmadan YouTube’a istek gitmez. Yanında “YouTube’da izle” linki ve VideoObject şeması. Uzun videolar ve Shorts ayrı kanallarda; yapay zekâ kullanım beyanı “Evet”. Hedef soruları cevaplayan başlıklar, bölümler ve döküm (transcript).",
97
- },
98
- },
99
- {
100
- topic: { en: "Directory text", tr: "Dizin metni" },
101
- rule: {
102
- en: "Name, category, a 60-character tagline, a 250-character short and a ~600-character long description, feature lines, tags — the one sentence word for word. Free ones (alternative-sites, product-launch sites) require an account; for paid ones (~$99–497) decide on cost and benefit first.",
103
- tr: "Ad, kategori, 60 karakterlik slogan, 250 karakterlik kısa ve ~600 karakterlik uzun açıklama, özellik satırları, etiketler — tek cümle aynen. Ücretsiz olanlar (alternatif siteleri, ürün lansman siteleri) hesap istiyor; ücretli olanlar (~99–497 $) için önce maliyet ve fayda kararı.",
104
- },
105
- },
106
- {
107
- topic: { en: "Reddit", tr: "Reddit" },
108
- rule: {
109
- en: "No fake accounts; open disclosure in every mention; 14 days of help only first; sort forums into three tiers (can mention / help only / skip for now); at most one post a week; UTM links; watch for shadow-ban signs; write your stop rules in advance.",
110
- tr: "Sahte hesap yok; her bahsedilmede açık beyan; önce 14 gün yalnızca yardım; forumları üç kademeye ayırın (bahsedilebilir / yalnızca yardım / şimdilik geç); haftada en fazla bir gönderi; UTM’li link; gölge yasak işaretlerini izleyin; durdurma kurallarınızı önceden yazın.",
111
- },
112
- },
113
- {
114
- topic: { en: "Outreach to list authors", tr: "Liste yazarlarına ulaşma" },
115
- rule: {
116
- en: "Ask the assistant “which articles did you use?”; send those authors a short, factual introduction. If a placement is paid, disclose it openly. The cited domains in your latest Katman run are this list.",
117
- tr: "Asistana “hangi makaleleri kullandın?” diye sorun; o yazarlara kısa, gerçeklere dayalı bir tanıtım gönderin. Ücretli yerleşim olursa açıkça beyan edin. Son Katman ölçümünüzdeki alıntılanan alan adları bu listedir.",
118
- },
119
- },
120
- ];
121
- /** The book's don'ts plus the 2026 spam-policy changes. */
122
- export const OFFSITE_DONTS = [
123
- { en: "Buying links or exchanging links. It's in Google's spam policy.", tr: "Link satın almak, link takası yapmak. Google’ın spam politikasında." },
124
- {
125
- en: "Fake Reddit accounts, rewarded or filtered reviews, fake user counts or logos. The UK DMCC Act bans fake reviews; the US FTC bans fake or undisclosed insider reviews and fake social signals.",
126
- tr: "Sahte Reddit hesabı, ödüllü ya da süzülmüş yorum, sahte kullanıcı sayısı ya da logo. Birleşik Krallık’ta DMCC Yasası sahte yorumu yasaklıyor; ABD’de FTC sahte ya da gizlenmiş içeriden yorumları ve sahte sosyal sinyalleri yasaklıyor.",
127
- },
128
- {
129
- en: "Opening your own Wikipedia or Wikidata entry before independent sources exist: it gets deleted and hurts trust.",
130
- tr: "Bağımsız kaynaklar oluşmadan kendi Wikipedia ya da Wikidata kaydınızı açmak: silinir, güveni düşürür.",
131
- },
132
- {
133
- en: "Self-ranked “best X” lists: since the 2026 updates they backfire and carry spam-policy risk; when a brand's own list was cited, the brand was left out of the recommendation 69% of the time.",
134
- tr: "Kendini birinci yazan “en iyi X” listeleri: 2026 güncellemelerinden beri ters tepiyor ve spam politikası riski taşıyor; markanın kendi listesi alıntılandığında marka %69 oranında öneriden çıkarıldı.",
135
- },
136
- {
137
- en: "Manipulating AI answers: hidden prompt injection, cloaking (showing bots different content than people) and scaled content abuse are covered by Google's spam policy since May 2026.",
138
- tr: "Yapay zekâ cevaplarını manipüle etmek: gizli prompt enjeksiyonu, gizleme (botlara insanlardan farklı içerik göstermek) ve ölçekli içerik istismarı Mayıs 2026’dan beri Google’ın spam politikasında.",
139
- },
140
- {
141
- en: "Buying Reddit posts or upvotes: short-lived and risky — Reddit removes AI-marketing spam, and a brand caught astroturfing can be banned.",
142
- tr: "Reddit gönderisi ya da oy satın almak: kısa ömürlü ve riskli — Reddit yapay zekâ pazarlama spamini kaldırıyor, yakalanan marka yasaklanabiliyor.",
143
- },
144
- ];
145
- export const OFFSITE_EXERCISE = {
146
- en: "Ask ChatGPT “which is the best X?” in your category, then follow up with “which articles did you use to write this answer?”. Write the articles and their authors into research: that's your first outreach list.",
147
- tr: "ChatGPT’ye kategorinizde “en iyi X hangisi?” diye sorun, sonra “bu cevabı yazarken hangi makaleleri kullandın?” diye devam edin. Çıkan makaleleri ve yazarlarını research.md’ye yazın: bu sizin ilk ulaşma listeniz.",
148
- };
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 OFFSITE_DONTS = [];
4
+ export let OFFSITE_EVIDENCE = [];
5
+ export let OFFSITE_EXERCISE = {};
6
+ export let OFFSITE_INTRO = {};
7
+ export let OFFSITE_RULES = [];
8
+ export let OFFSITE_WHAT_WE_DID = [];
9
+ onMethod((d) => {
10
+ if (d.OFFSITE_DONTS !== undefined) OFFSITE_DONTS = d.OFFSITE_DONTS;
11
+ if (d.OFFSITE_EVIDENCE !== undefined) OFFSITE_EVIDENCE = d.OFFSITE_EVIDENCE;
12
+ if (d.OFFSITE_EXERCISE !== undefined) OFFSITE_EXERCISE = d.OFFSITE_EXERCISE;
13
+ if (d.OFFSITE_INTRO !== undefined) OFFSITE_INTRO = d.OFFSITE_INTRO;
14
+ if (d.OFFSITE_RULES !== undefined) OFFSITE_RULES = d.OFFSITE_RULES;
15
+ if (d.OFFSITE_WHAT_WE_DID !== undefined) OFFSITE_WHAT_WE_DID = d.OFFSITE_WHAT_WE_DID;
16
+ });