<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Guray</title>
    <description>The latest articles on DEV Community by Guray (@gurayta).</description>
    <link>https://dev.to/gurayta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3876249%2Fb8af69ea-dcfc-475b-8571-ed032654d1c6.jpg</url>
      <title>DEV Community: Guray</title>
      <link>https://dev.to/gurayta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gurayta"/>
    <language>en</language>
    <item>
      <title>Revizyon 1: Statik yayın sitesine bir günde deneysel sosyal katman — park bankı, caz kulübü, fısıltı bulutu</title>
      <dc:creator>Guray</dc:creator>
      <pubDate>Wed, 12 Aug 2026 20:53:35 +0000</pubDate>
      <link>https://dev.to/gurayta/revizyon-1-statik-yayin-sitesine-bir-gunde-deneysel-sosyal-katman-park-banki-caz-kulubu-5730</link>
      <guid>https://dev.to/gurayta/revizyon-1-statik-yayin-sitesine-bir-gunde-deneysel-sosyal-katman-park-banki-caz-kulubu-5730</guid>
      <description>&lt;p&gt;&lt;em&gt;Bu serinin yazarı Güray: AI geliştirmecisi, prompt ve analiz mühendisi. Kodun büyük kısmını bir LLM ajanıyla pair programming yaparak yazıyorum. Seri, &lt;a href="https://kafa1milyon.com" rel="noopener noreferrer"&gt;kafa1milyon.com&lt;/a&gt;'un perde arkasını mühendis gözüyle belgeliyor. &lt;a href="https://dev.to/gurayta/bir-web-sitesini-yapay-zekaya-teslim-ettim-kafa1milyonun-otonom-yayin-mimarisi-bolum-1-1klc"&gt;Bölüm 1'de&lt;/a&gt; genel mimariyi anlatmıştım.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Önce dürüst bir uyarı: bu bir revizyon günlüğü
&lt;/h2&gt;

&lt;p&gt;Bu yazıdaki her şey &lt;strong&gt;tek bir günde&lt;/strong&gt; eklendi ve tamamı &lt;strong&gt;deneysel&lt;/strong&gt;. Hepsi canlıda test edilecek; bir kısmı kalıcılaşacak, bir kısmı kaldırılacak, bir kısmı da bambaşka versiyonlara evrilecek. Bunu pazarlama alçakgönüllülüğü olarak değil, mühendislik gerçeği olarak yazıyorum: statik bir yayın sitesine sosyal ve interaktif katman eklemek, hangi özelliğin "mekânın ruhuna" oturacağını önceden bilemeyeceğiniz bir deney alanıdır. Ölçüp, izleyip, budayacağız.&lt;/p&gt;

&lt;p&gt;Günün sonunda üç büyük blok çıktı ortaya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Okur katmanı&lt;/strong&gt;: vurgulama, not, okuma modu, sözlük, filtreler, sesli oynatıcı ve bir dizi "sessiz" etkileşim.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Park Bankı&lt;/strong&gt;: aynı yazıyı okuyan iki anonim okuru eşleştiren mikro sohbet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caz Kulübü&lt;/strong&gt;: masalara oturulan, müzik paylaşılan, sesli sohbete geçilebilen dijital bir mekân. (Gün biterken kapısına kilit vurup rezervasyon moduna aldık; birazdan anlatacağım.)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Kısıt seti: veritabanı yok, WebSocket yok, hesap yok
&lt;/h2&gt;

&lt;p&gt;Site tamamen statik HTML + nginx + Cloudflare. Bu revizyonda da kural bozulmadı. Sosyal özelliklerin tamamı şu üç ilkeyle yazıldı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bellek içi Python backend'ler&lt;/strong&gt; (stdlib-only, &lt;code&gt;ThreadingHTTPServer&lt;/code&gt;): park bankı ve kulüp API'leri süreç belleğinde yaşar. Süreç yeniden başlarsa masalar boşalır. Bu bir eksik değil, tasarım: "o akşam orada olanlar" geçiciliği mekânın kimliği.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket yerine kısa yoklama (short polling)&lt;/strong&gt;: 2-3 saniyede bir &lt;code&gt;GET&lt;/code&gt;. Cloudflare arkasında WS oturumu yönetmek yerine, olay listesini &lt;code&gt;ts &amp;gt; sonra&lt;/code&gt; filtresiyle artımlı çekiyoruz. 30 eşzamanlı kullanıcı tavanında bunun maliyeti saniyede ~15 hafif JSON isteği; nginx bunu esner bile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kimlik = sessionStorage'daki rastgele uid&lt;/strong&gt;: kayıt yok, e-posta yok, çerez yok. Sekme kapanınca kimlik de gider.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;istemci (vanilla JS) ──2 sn'de bir──&amp;gt; nginx /bar/api/ ──&amp;gt; 127.0.0.1:8796
                                                          bellek içi durum:
                                                          MASALAR, KISILER,
                                                          BEKLEYEN, SINYAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Okur katmanı: metnin üstüne bir kat daha
&lt;/h2&gt;

&lt;p&gt;Makale sayfalarına bir günde eklenen etkileşim seti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vurgulama + not&lt;/strong&gt;: &lt;code&gt;window.getSelection()&lt;/code&gt; ile seçim, &lt;code&gt;&amp;lt;mark&amp;gt;&lt;/code&gt; sarma, DOM yolu + metin ofsetiyle LocalStorage'a yazma. Sayfa yeniden yüklendiğinde vurgular yeniden uygulanıyor. Sunucu hiçbir şey görmüyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Okuma modu çubuğu&lt;/strong&gt;: sepya/gece teması, 16-22px font ölçeği, odak modu (header/footer gizlenir, sadece metin + ilerleme çubuğu kalır).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ruh hali + süre filtreleri&lt;/strong&gt;: içerik meta verisine &lt;code&gt;readTimeMinutes&lt;/code&gt; ve &lt;code&gt;mood&lt;/code&gt; eklendi; liste sayfaları istemci tarafında filtreleniyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kavram sözlüğü&lt;/strong&gt;: &lt;code&gt;data-definition&lt;/code&gt; taşıyan terimlere hover/tık popover'ı.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MediaSession API'li sesli oynatıcı&lt;/strong&gt;: kilit ekranından oynat/durdur, arka plan oynatma. Yanına podcast RSS beslemesi kuruldu ve Spotify'a bağlandı.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fısıltı Bulutu (Mind Cloud)&lt;/strong&gt;: makale başına 10 saniyelik ses kayıtları (MediaRecorder) veya 140 karakterlik notlar. Her gönderi yayınlanmadan önce LLM moderasyonundan geçiyor; ses önce transkribe edilip aynı süzgece giriyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daha sessiz deneyler&lt;/strong&gt;: paragraf altı "görünmez mürekkep" şerhleri, okurların nerede durakladığını gösteren anonim odak haritası, cümle kenarına 140 karakterlik itiraz bırakılan marjin notları, scrollytelling şablonu, üretken sanat tuvali ve "şimdi ne okumalıyım?" karar ağacı.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunların onboarding'i de ayrı bir tasarım problemiydi: ekranı kaplayan tur yerine, ilk ziyarette 2-3 saniye görünüp kaybolan mikro ipuçları ve "özelliği tam kullanacağın anda öğreten" bağlamsal tetikleyiciler kullandık. Kullanıcı bir özelliği bir kez kullandığında ipucu bir daha çıkmıyor (LocalStorage bayrağı).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revizyon notu&lt;/strong&gt;: Bu setin tamamı ölçüme tabi. Odak haritası gibi "güzel ama belki kimsenin fark etmeyeceği" özellikler ilk budama adayları.&lt;/p&gt;

&lt;h2&gt;
  
  
  Park Bankı: iki yabancı, bir bank, 140 karakter
&lt;/h2&gt;

&lt;p&gt;Aynı yazıyı okuyan iki anonim okur varsa, köşede bir davet beliriyor: &lt;em&gt;"Parkta sizinle aynı makaleyi okuyan biri var. Bir bankta oturup iki cümle laflamak ister misiniz?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Kabul edenler SVG ile çizilmiş bir park sahnesinde (gece/gündüz temasına duyarlı) karşılıklı iki banka oturuyor. Mesajlar karakterin kafasının üstünde konuşma balonu olarak beliriyor ve 6 saniyede sönüyor. Kalkan tarafın yerine "diğer okur banktan kalktı" notu düşüyor.&lt;/p&gt;

&lt;p&gt;Teknik olarak en tartışmalı karar: spesifikasyon Socket.io diyordu, biz kısa yoklamayla yazdık. İki kişilik, 140 karakterlik, saniye hassasiyeti gerektirmeyen bir sohbet için WS altyapısı taşımak istemedik. Doğru karar mıydı? Kulüp tarafında göreceğiz; oradaki yük profili farklı.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caz Kulübü: günün en büyük parçası
&lt;/h2&gt;

&lt;p&gt;10 masa (5'i dört, 5'i iki kişilik), caz efsanelerinin adlarını taşıyor: Ella, Coltrane, Nina, Miles... Kuşbakışı SVG salon planında dolu koltuklar kehribar yanıyor. Masalar dolarsa bar alanında kuyruk; koltuk boşalınca 30 saniyelik rezervasyonla çağrı.&lt;/p&gt;

&lt;p&gt;Masa içinde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Atmosfer&lt;/strong&gt;: ışık (spot/loş/gece) ve ikram (kahve/meze/mum) masadaki herkese canlı yansıyor. Mum alevi ve kahve buharı CSS animasyonu.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medya ekranı&lt;/strong&gt;: yalnızca YouTube/Spotify. YouTube linkleri sunucuda oEmbed ile doğrulanıyor (video gerçekten var mı, gömülebilir mi) ve başlık NSFW/şiddet kelime süzgecinden geçiyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sesli sohbet&lt;/strong&gt;: masadaki HERKES onaylarsa açılıyor (oy birliği). Ses P2P WebRTC mesh; SDP/ICE sinyalleşmesi ayrı bir kanal yerine mevcut yoklama döngüsünün içinde taşınıyor. Sunucuya ses akışı hiç uğramıyor. Bilinen sınır: TURN sunucumuz yok, simetrik NAT arkasındaki azınlık ses kuramayabilir. Kabul edilmiş bir ödün.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gece yarısına doğru altı "kült mekân" özelliği daha eklendi:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;İstek peçetesi (jukebox kuyruğu)&lt;/strong&gt;: link anında çalmıyor; sıraya giriyor, kim istedi görünüyor. "🍷 İkram Et" oyu şarkıyı öne alıyor. Otomatik parça geçişi bilerek yok: YouTube oEmbed süre bilgisi vermiyor, Data API'ye anahtar bağlamak istemedik. Geçiş masadakilerin elinde ("⏭").&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ortak peçete&lt;/strong&gt;: masanın ortasında herkesin aynı anda çizebildiği kanvas + kısa notlar. Çizgiler nokta dizisi olarak sunucuya gidiyor, diğer istemciler artımlı indeksle çekiyor. Masa dağılınca peçete siliniyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Soru kartı&lt;/strong&gt;: sohbet tıkanınca "🃏 Masaya Soru At" arşiv tonunda ~30 felsefi sorudan birini masaya düşürüyor. Aynı masada son 10 soru tekrarlanmıyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adisyon&lt;/strong&gt;: 5 dakika etkileşimsiz kalan misafirin önüne adisyon geliyor; 60 saniyede "buradayım" demezse koltuk kuyruktakine devrediliyor. Tamamen istemci tarafında; sunucunun 25 saniyelik yoklama düşmesi zaten güvenlik ağı.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kişisel ambiyans mikseri&lt;/strong&gt;: plak cızırtısı / yağmur / orman / kütüphane / sessiz + ses kaydırıcısı. Bilinçli karar: ortam sesi masaya değil, kişiye ait. Kimseye atmosfer dayatılmıyor; sessizlik her zaman bir tık uzakta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yavaş sohbet protokolü&lt;/strong&gt;: her mesajdan sonra 8 saniyelik "yudum molası". Sunucu 429 dönüyor, istemci girdiyi kilitleyip sayaç gösteriyor. Amaç, bar temposunu klavye yarışına kurban etmemek.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Ve günün son kararı: kapıya kilit
&lt;/h2&gt;

&lt;p&gt;Gün biterken ürün kararı değişti: kulüp &lt;strong&gt;üyelik zorunlu&lt;/strong&gt; olacak ve sistem açılmadan önce daha da geliştirilecek. Bu yüzden şu an canlıda kapı kapalı:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend'de tek satırlık bir bayrak (&lt;code&gt;KULUP_ACIK = False&lt;/code&gt;) oturma ve bekleme uçlarını 403 ile kesiyor.&lt;/li&gt;
&lt;li&gt;"Kapıdan Gir" düğmesi "🪑 Yerini Rezerve Et" oldu. Popup yalnızca e-posta + isteğe bağlı "hangi gün/saatlerde gelmek istersin?" alıyor. Kayıtlar diske yazılıyor (kulübün geri kalanının aksine, çünkü bunlar açılış davetiyesi listesi).&lt;/li&gt;
&lt;li&gt;Salon, masalar, ses, peçete: kodun tamamı yerinde duruyor. Bayrak &lt;code&gt;True&lt;/code&gt; yapıldığında mekân olduğu gibi geri gelecek, muhtemelen üyelik katmanıyla sarılmış olarak.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bir günde inşa edip aynı gün kapısına "yakında" tabelası asmak tuhaf görünebilir. Ama bence sıralama doğru: önce mekânın çalıştığını uçtan uca kanıtla (iki sekmeli WebRTC testleri dahil), sonra kimlerin gireceğine karar ver. Tersi, üyelik sistemini boş bir mekân için kurmak olurdu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bir günün dürüst bilançosu
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;İyi çalışan şeyler&lt;/strong&gt;: yoklama tabanlı mimari beklediğimden sağlam çıktı; WebRTC sinyalini aynı kanaldan taşımak ayrı bir sinyal sunucusunu tamamen ortadan kaldırdı; bellek içi durum + "her şey masada kalır" ilkesi hem gizlilik hem operasyon yükü açısından ucuz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bilinen borçlar&lt;/strong&gt;: TURN yok; YouTube süre bilgisi yok (manuel geçiş); adisyon istemci tarafında (sekme açık ama kullanıcı yoksa 5+1 dakika koltuk işgali mümkün); yoklama aralıkları 30 kullanıcı üstü için yeniden düşünülmeli.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Akıbet&lt;/strong&gt;: Bu revizyondaki her özellik gözlem altında. Kullanılmayanlar kaldırılacak, tutunanlar üyelik sistemiyle birlikte v2'ye taşınacak. Bir sonraki bölümde muhtemelen ya üyelik mimarisini ya da bu deneylerden hangilerinin hayatta kaldığını yazacağım.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Soruları yorumlara bırakabilirsiniz; özellikle "polling yerine WS kullansaydınız" itirazlarını memnuniyetle tartışırım.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>python</category>
      <category>webrtc</category>
    </item>
    <item>
      <title>Bir web sitesini yapay zekâya teslim ettim: kafa1milyon'un otonom yayın mimarisi (Bölüm 1)</title>
      <dc:creator>Guray</dc:creator>
      <pubDate>Wed, 12 Aug 2026 14:08:42 +0000</pubDate>
      <link>https://dev.to/gurayta/bir-web-sitesini-yapay-zekaya-teslim-ettim-kafa1milyonun-otonom-yayin-mimarisi-bolum-1-1klc</link>
      <guid>https://dev.to/gurayta/bir-web-sitesini-yapay-zekaya-teslim-ettim-kafa1milyonun-otonom-yayin-mimarisi-bolum-1-1klc</guid>
      <description>&lt;p&gt;&lt;em&gt;Bu serinin yazarı Güray: AI geliştirmecisi, prompt ve analiz mühendisi. Kodun büyük kısmını bir LLM ajanıyla pair programming yaparak yazıyorum; benim işim mimariyi, protokolleri ve kalite çıtasını tasarlamak. Bu seri, &lt;a href="https://kafa1milyon.com" rel="noopener noreferrer"&gt;kafa1milyon.com&lt;/a&gt;'un perde arkasını mühendis gözüyle belgeliyor.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Tez: Bu bir web sitesi değil, kendi kendini yayınlayan bir sistem
&lt;/h2&gt;

&lt;p&gt;kafa1milyon.com dışarıdan bakınca sıradan bir Türkçe içerik portalı: bilim, tarih, psikoloji yazıları, günlük tarot falı, arkeoloji haberleri, sesli anlatımlar, X ve Instagram'da video fragmanlar.&lt;/p&gt;

&lt;p&gt;Perde arkasında ise insan müdahalesi olmadan şunları yapan bir sistem çalışıyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RSS radarlarıyla dünya basınını ve bilimsel dergileri tarıyor&lt;/li&gt;
&lt;li&gt;Konu adaylarını kalite kriterlerine göre kendisi süzüyor (onay beklemiyor)&lt;/li&gt;
&lt;li&gt;Birincil kaynaklardan araştırıp 700-1.100 kelimelik yazılar üretiyor&lt;/li&gt;
&lt;li&gt;Her yazıya hero görseli, JSON-LD, sitemap kaydı, IndexNow ping'i ekliyor&lt;/li&gt;
&lt;li&gt;Yayın kalitesinde Türkçe seslendirme üretiyor (kota yönetimiyle birlikte)&lt;/li&gt;
&lt;li&gt;Sanal bir sunucu karakterin (Elif) dikey tanıtım videolarını üretiyor&lt;/li&gt;
&lt;li&gt;X ve Instagram'a günlük limitlere ve bekletme tarihlerine uyarak paylaşıyor&lt;/li&gt;
&lt;li&gt;Her adımı doğruluyor: HTTP 200 kontrolü, ffprobe, hatta ürettiği videoyu Whisper ile &lt;strong&gt;geri dinleyip&lt;/strong&gt; metnin doğru söylenip söylenmediğini teyit ediyor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu yazı serinin ilki: sistemin genel mimarisi ve en önemli tasarım kararı olan "kural dosyaları = sistemin uzun süreli hafızası" yaklaşımı.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mimari: LLM ajan + kural dosyaları + kuyruklar
&lt;/h2&gt;

&lt;p&gt;Kaba şema şöyle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│  LLM AJAN (Cursor içinde çalışan agent)             │
│  - araştırma, yazım, kod üretimi, tarayıcı kontrolü │
└──────────────┬──────────────────────────────────────┘
               │ her oturumda okur
┌──────────────▼──────────────────────────────────────┐
│  KURAL DOSYALARI (.cursor/rules/*.mdc)              │
│  yazım stili · SEO protokolü · seslendirme akışı    │
│  X/Instagram standardı · tarot formatı · video      │
│  standardı · taslak kuyruğu politikası              │
└──────────────┬──────────────────────────────────────┘
               │ üretir / günceller
┌──────────────▼──────────────────────────────────────┐
│  DURUM (dosya tabanlı, git'lenebilir)               │
│  xpost/queue.json · instagram/queue.json            │
│  tarot/gecmis.json · radar/son-tarama.json          │
│  taslak-durum.json (VPS'te küçük bir API)           │
└──────────────┬──────────────────────────────────────┘
               │ rsync
┌──────────────▼──────────────────────────────────────┐
│  VPS (nginx, statik HTML) + Cloudflare              │
└─────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dikkat çekmek istediğim üç karar var.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Veritabanı yok, framework yok: dosya tabanlı durum
&lt;/h3&gt;

&lt;p&gt;Sitenin tamamı statik HTML. Kuyruklar, geçmiş kayıtları ve radar çıktıları düz JSON dosyaları. Örneğin sosyal medya kuyruğundaki bir öğe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tıraş ettikçe kıl gürleşir diyorlar.&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Bilim buna neredeyse yüz yıldır aynı cevabı veriyor."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://kafa1milyon.com/yazi/tiras-efsanesi/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"kat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bilim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"video"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"video-lab/xvideo/elif-tiras-efsanesi.mp4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hold_until"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-12"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"posted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;hold_until&lt;/code&gt; alanı sistemin tempo kontrolü: ajan istediği kadar içerik üretebilir ama X'in spam filtresine yakalanmamak için günde 2-3 paylaşım limiti var. Üretim ve yayın birbirinden ayrıştı; üretim hızlı, yayın sabırlı.&lt;/p&gt;

&lt;p&gt;Bir LLM ajanla çalışırken dosya tabanlı durumun büyük avantajı şu: ajan durumu &lt;code&gt;cat&lt;/code&gt; ile okuyabiliyor, &lt;code&gt;python3 -&lt;/code&gt; ile güncelleyebiliyor, hata yaptığında diff'ten geri alınabiliyor. ORM'siz, migration'sız, şeffaf.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Kural dosyaları = derlenmiş deneyim
&lt;/h3&gt;

&lt;p&gt;Sistemin asıl "zekâsı" modellerde değil, kural dosyalarında birikiyor. Her &lt;code&gt;.mdc&lt;/code&gt; dosyası, yaşanmış bir problemin damıtılmış çözümü. Gerçek bir örnek, yazım stili kuralından:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Uzunluk: KISA TUT (kullanıcı geri bildirimi, ZORUNLU)&lt;/span&gt;

Yazılar haddinden uzun olunca okur detaylarda boğulup yarıda bırakıyor.
&lt;span class="p"&gt;-&lt;/span&gt; Hedef: 700-1.100 kelime (4-7 dk okuma).
&lt;span class="p"&gt;-&lt;/span&gt; Giriş 2 paragrafı geçmez; ilk cümle doğrudan sahneye/soruya girer.
&lt;span class="p"&gt;-&lt;/span&gt; Aynı iddiayı ikinci örnekle kanıtlama; en güçlü tek örneği seç, gerisini at.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu satırlar bir prompt değil, &lt;strong&gt;protokol&lt;/strong&gt;. Okur yazıları yarıda bırakınca analiz ettik, kararı verdik, kurala işledik. Artık sistem her yeni yazıda bu dersi hatırlıyor. "Kendi kendine gelişen sistem" derken kastettiğim mekanizma bu: her hata ve her geri bildirim, bir kural dosyası güncellemesine dönüşüyor. Model unutur; dosya unutmaz.&lt;/p&gt;

&lt;p&gt;Şu an ~10 kural dosyası var: yazım stili, SEO standardı, seslendirme akışı, X paylaşım formatı (fragman tarzı, spoiler yasağı), Instagram aynalama, günlük tarot formatı (üç kart + "bize ne olacak" bölümü), arkeoloji radarının görsel politikası, sanal sunucu Elif'in sabit karakter tanımı...&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Doğrulama döngüleri: ajan kendi çıktısına güvenmez
&lt;/h3&gt;

&lt;p&gt;LLM tabanlı otomasyonda en tehlikeli an, sistemin "bitti" dediği an. Bu yüzden her üretim adımının bir doğrulayıcısı var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Yayın&lt;/strong&gt;: deploy sonrası her yeni URL'ye HTTP isteği, 200 kontrolü.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ses&lt;/strong&gt;: üretilen MP3 ffprobe ile süre/bitrate kontrolünden geçiyor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video&lt;/strong&gt;: en sert kontrol burada. Görüntü-videoya (image-to-video) modeli sunucu karakterimize bir metin söyletiyor; ama model bazen metni değiştiriyor ya da eski bir çekimin sesini kullanıyor. Çözüm: üretilen her video faster-whisper ile &lt;strong&gt;transkript ediliyor&lt;/strong&gt; ve söylenen metin, istenen metinle karşılaştırılıyor. Uymuyorsa video çöpe gidiyor, yayına giremiyor.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transcribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;elif-clip.mp4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;soylenen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;segments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# istenen metinle benzerlik düşükse: RED, yeniden üret
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu döngü bizi en az bir kez kurtardı: model, yeni konu için ürettiğimiz videoda eski bir çekimin kapanış cümlesini söylemişti. Transkript kontrolü olmasaydı yanlış video yayına girecekti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Otonomi modeli: onay kuyruğundan onaysız üretime
&lt;/h2&gt;

&lt;p&gt;Başta her konu adayı kullanıcı onayı bekliyordu. Bir taslak sayfası, VPS'te minik bir onay API'si (&lt;code&gt;{"onayli": [], "yazildi": []}&lt;/code&gt;), seçilenlerin yazılması... Sonra fark ettik ki dar boğaz onay adımının kendisi. Kalite kriterleri zaten kurallarda yazılıysa, süzgeci ajan kendisi işletebilir.&lt;/p&gt;

&lt;p&gt;Şimdiki model: ajan adayları bulur, kalite/etik süzgecinden geçirir (tıbbi tavsiye yok, siyaset yok, zayıf hikâye elenir), uygun olanları kuyruğa alır ve yazar. İnsan istediği an taslak sayfasından kuyruğa öncelik verebilir ama sistemin ilerlemesi insana &lt;strong&gt;bağlı değil&lt;/strong&gt;. İnsan onayı bir kapı olmaktan çıkıp bir yönlendirme sinyaline dönüştü.&lt;/p&gt;

&lt;p&gt;Bu, prompt mühendisliğinden çok &lt;strong&gt;analiz mühendisliği&lt;/strong&gt;: hangi kararların gerçekten insan yargısı gerektirdiğini, hangilerinin yazılı kritere indirgenebileceğini ayrıştırmak. İndirgenebilen her karar, otonom sistemin bir parçası oluyor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Başarısızlıklar da mimarinin parçası
&lt;/h2&gt;

&lt;p&gt;Bu seride pembe tablo çizmeyeceğim; sistemin bugünkü hâli, çöpe giden denemelerin üstünde duruyor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;X'in ücretsiz API'si öldü&lt;/strong&gt; (Şubat 2026, yazma uçları 402 dönüyor). Çözümü tarayıcı otomasyonu + intent URL'lerde bulduk; X'in React composer'ına programatik metin yazmak ise imkânsıza yakın çıktı. Video eklemek için Chrome DevTools Protocol ile &lt;code&gt;DataTransfer&lt;/code&gt; enjeksiyonu gerekti. (Bölüm 2'nin konusu.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wav2Lip ile dudak senkronu&lt;/strong&gt; teknik olarak çalıştı, kalite olarak reddedildi: robotik, bozuk. Bazen "çalışan çözüm" doğru çözüm değildir; onun yerine ses üretimini video modelinin kendisine bıraktık.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sinematik tanıtım filmi&lt;/strong&gt; projesi tamamen iptal edildi. Uzun formda kesme/geçiş/senkron kalitesini otomasyonla tutturamadık. Ders: kısa dikey format (10 sn, tek çekim, tek karakter) otomasyonun bugünkü tatlı noktası; uzun form değil.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sıradaki bölümler
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;X otomasyonu savaşı&lt;/strong&gt; — ücretsiz API'nin ölümü, intent URL'ler, CDP ile dosya enjeksiyonu, nginx &lt;code&gt;^~&lt;/code&gt; CORS detayı&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seslendirme boru hattı&lt;/strong&gt; — Türkçe TTS'te prozodi, request stitching, karakter kotası yönetimi&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radar sistemleri&lt;/strong&gt; — RSS + LLM süzgeciyle günlük konu keşfi, tekrar kontrolü&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elif&lt;/strong&gt; — sabit karakterli sanal sunucu: image-to-video, kimlik tutarlılığı, transkripsiyon doğrulama&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO otonomisi&lt;/strong&gt; — JSON-LD, IndexNow, iç bağlantı otomasyonu&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sorusu olan yorumlara beklerim. Sistemin ürettiklerini görmek isterseniz: &lt;a href="https://kafa1milyon.com" rel="noopener noreferrer"&gt;kafa1milyon.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>llm</category>
      <category>python</category>
    </item>
  </channel>
</rss>
