Ben Ming. vm0'da ürün tasarımının yanı sıra içerik yönetimi de benim işim ve beklediğimden çok daha fazlası çıktı: iş akışı tasarımı, illüstrasyonlar, görsel üretimi, CMS işleri, çeviriler. Bunları adım adım nasıl hallettiğim şöyle.
İçerik burada yaptığım işlerden biri
vm0'da günümün çoğu ürün tasarımı ve Next.js kod tabanımız arasında bölünüyor. Ama içerik yönetimi de bana ait ve başladığımda, iyi performans gösteren bir blogun ne kadar çok şey gerektirdiğini fark ettim. Tutarlı çıktı, gerçek anahtar kelime araştırması, marka ile uyumlu görseller, düzgün meta açıklamaları ve desteklediğimiz dört dile çeviri gerekiyor.
Bu işi ciddiye almaya başladığımda, her gönderi neredeyse bir günümü alıyordu. Yazı kısmı bunun küçük bir parçasıydı. Asıl zaman, yazının etrafındaki üretim işlerine gidiyordu: doğru anahtar kelimeleri bulmak, kapak görseli yapmak, CMS'de alanları doğru doldurmak, her dil için tekrar yapmak.
Bu yüzden, bu sürecin mümkün olduğunca fazlasını kendi günlük işlerim etrafında Zero üzerinde kurduğum Lucas adlı bir AI pazarlama ajanına aktardım. Lucas, "Pazarlama yöneticisi" olarak yapılandırıldı ve kapsamı pazarlama ile ilgili her şey: blog üretimi şu anda en gelişmiş parçası ve zamanla ona yeni yetenekler ve bağlayıcılar ekledikçe büyüyor.
Şu anda Lucas'ın Strapi headless CMS'imize, Ahrefs hesabımıza, ekip Slack'imize, web sohbetimize, marka ile uyumlu illüstrasyonlar için dahili bir draw yeteneğine ve yazı mekanikleri için standart copywriting yeteneğine erişimi var.
Aşağıda, bu AI blog otomasyonunun pratikte nasıl çalıştığını anlatacağım: Lucas belirsiz bir istemi nasıl alıyor, konuyu ve anahtar kelimeleri nasıl ayırıyor, bir gönderi taslağı hazırlıyor, kapak çiziyor, metni doğal bir şekilde çeviriyor ve dört dilde taslakları headless CMS'imize nasıl aktarıyor. Sonra buraya nasıl geldiğimi ve insanlara (çoğunlukla hâlâ bana) kasıtlı olarak bıraktığım işleri anlatacağım.
Lucas'ı nasıl kullanıyorum: web uygulaması ve Slack

Lucas ile çoğunlukla vm0'ın web sohbeti üzerinden çalışıyorum. Taslak çıkarma, yazma, kapak revizyonları ve düzenlemeler sırasında onunla birlikte oturduğum derin çalışma arayüzü bu. Uzun diyaloglar, uzun bağlam, bir sohbet kanalında garip olacak türden ileri geri konuşmalar.
Lucas ayrıca ekip Slack'imize de bağlı, ortak bir giriş noktası olarak. Oraya telefondan hızlı istemler bırakıyorum ve ekipten diğerleri de ona ulaşabiliyor. Blog sırası kimdeyse gönderiyi aynı şekilde başlatıyor. Aynı ajan, her iki arayüzde de aynı bağlam.
Tipik bir istem nasıl görünüyor
Lucas'a verdiğim istemler genellikle kısa. En fazla üç cümle. Temsili bir örnek:
Lucas, etkili haftalık toplantıların yürütülmesiyle ilgili bir eğitim yaz: toplantı yapısı, yaygın tuzaklar ve uzaktan ekiplerin nasıl motive tutulacağına değin. Eğitim tarzında, SEO dostu, sonunda Zero kullanmaya çağrı ekle. Sadece taslak bağlantısı, yayınlama.
Tüm brifing bu kadar. Tek mesaj. Ne bir taslak, ne anahtar kelime listesi, ne tasarım brifi, ne de uzunluk hedefi. Gerisini Lucas hallediyor.
Bu formata ulaşmam biraz zaman aldı. Başlarda, ajanın her şeyi açıkça bilmesi gerektiğini varsayarak çok daha uzun brifler yazıyordum, sonra anladım ki asıl bağlam onun kalıcı talimatlarında ve yeteneklerinde olmalı, her istemde değil. İstem bir tetikleyici; asıl yükü yapılandırma taşıyor.
Lucas konuyu ve anahtar kelimeleri nasıl analiz ediyor

Lucas'ın ilk hamlesi, belirsiz bir istemden yapı çıkarmak. Yukarıdaki gibi bir istek için çalışma notları şöyle görünüyor:
- Konu: etkili haftalık toplantıların yürütülmesi
- Format: eğitim → numaralı adımlar, somut örnekler, "bunu yapın" dili
- Örtük hedef kitle: ekip liderleri, uzaktan yöneticiler, kurucular
- Gerekli bölümler: toplantı yapısı, yaygın tuzaklar, uzaktan motivasyon
- CTA: okuyucuları Zero'ya yönlendirmek
- Kısıt: sadece taslak URL, yayınlama yok
Sonra anahtar kelimeyi seçiyor. İçerik pazarlamasında en az sezgim olan kısım buydu, bu yüzden Lucas'a anahtar kelime çalışması için her seferinde uyguladığı bir rutin verdim. Bu, onun kendi başına çalıştırdığı bir yetenek değil, sadece güvenerek teslim ettiğim bir dizi adım:
- Adayları Ahrefs'ten çek. Konu ifadesiyle Ahrefs API'sini çağırıyor, aylık arama hacmi, anahtar kelime zorluğu (KD), üst konu ve SERP amacı ile uzun kuyruk varyasyonlarını döndürüyor.
- Zorluğa göre filtrele. Ona kesin bir kural verdim: KD < 30. vm0 nispeten yeni bir alan adı ve otoritesi sınırlı, bu yüzden yüksek KD anahtar kelimelerin peşinden gitmek şu an için mantıklı değil. Uzun kuyruk erken kazandırır.
- Strapi dizinimizle çapraz kontrol et. CMS'mizden Strapi REST API ile tüm yayınlanmış slug'ları çekiyor ve zaten kapsadığımız anahtar kelimeleri çıkarıyor. Kendi içimizde rekabet yok.
- Amacı ürünle eşleştir. Bir anahtar kelimenin amacı, kullanım senaryosu kütüphanemizle uyumlu olmalı. "Etkili haftalık toplantı nasıl yürütülür" → operasyonlar / ekip yönetimi → uygun. "Tokyo'daki en iyi ramen" → uygun değil, hacmi ne olursa olsun.
- Birini seç. Filtrelenmiş listeden en yüksek hacimli olanı seçiyor ve gönderinin omurgası olarak kullanıyor. Örneğin, uzaktan haftalık toplantı en iyi uygulamaları.
Sayfa içi SEO için basit bir kural uyguluyor: hedef anahtar kelime başlıkta, en az bir H2'de ve ilk 100 kelimede geçmeli. Eşanlamlılar ve ilgili ifadeler doğal şekilde serpiştiriliyor. Uygun olan yerlere iki-üç ilgili gönderiye dahili bağlantı. Sonrası: doğal yazmak, anahtar kelime doldurma yok.
Gönderinin yapısı (altı-yedi H2, her adım altında bir "İpucu:" kutusu, kapanışta bir CTA) birkaç gönderide örnekleyerek oluşturduğum bir eğitim şablonundan geliyor.
Kapak nasıl çiziliyor
Kapak, blog üretiminde en çok önemsediğim kısım; hem tasarımcı olduğumdan hem de okuyucuların ilk gördüğü şey olduğundan. Ayrıca gönderiler X veya LinkedIn'de paylaşıldığında Open Graph görseli oluyor ve blog dizinimizin stok fotoğraf duvarı gibi değil, bir yayın gibi görünmesini sağlıyor.
İstediğim görünüm için stok fotoğraflar uygun değildi ve illüstrasyonları tek tek briflemek gönderi başına üretim maliyetini yönetilemez hale getirirdi. Bu yüzden draw adında bir Zero yeteneği geliştirdim. 200 satırlık bir Python betiği ve beş şey yapıyor:
- İki girdi alıyor: bir metafor (ne çizilecek) ve bir renk (dostça bir isim ve bir hex kodu).
- Bunları sabit bir istem şablonuna yerleştiriyor; kompozisyonun geri kalanı kilitli: sıcak gri arka plan
#eeeeee, seçilen renkte tuvalin ortasında sulu boya leke, üstte elle çizilmiş mürekkep eskizi, vm0 logosu (25, 25) sol üstte. - Oluşturulan istemi fal.ai'nin
nano-banana-promodeline 16:9 adresinden gönderiyor. - PNG'yi indiriyor. Neredeyse beyaz pikselleri tam
#eeeeee'ye normalize ediyor, böylece arka plan asla kaymıyor. 1600×900 boyutuna ölçekliyor. Şeffaf vm0 logosunu üstte alfa-birleştiriyor. - Sonucu vm0'ın CDN'ine yüklüyor ve URL'yi yazdırıyor.
Tipik bir çağrı şöyle görünüyor:
python draw.py \
--metaphor "a tilted hourglass with sand draining into a small open notebook, a sparkle near the rim" \
--color-name "dusty rose" \
--color-hex "#e08b96" \
--upload
İki girdi ve markanın geri kalanı tutarlı kalıyor. Genellikle gönderinin temasına uygun bir renk seçiyorum. Daha sıcak eğitim tarzı yazılar için mercan veya adaçayı, daha teknik olanlar için mavi veya lavanta, duyurular için hardal sarısı. Birkaç tekrar eden renk, blog dizinini yavaşça tanınabilir bir palete dönüştürüyor.
Zor yoldan öğrendiğim şey, asıl farkın modelde değil, şablonda olduğu. Modele kompozisyon, palet ve yerleşimi serbest bırakınca her kapak farklı bir marka gibi görünüyor. Bunları sabitleyip sadece metaforu seçmesine izin vermek, görünümü gönderiden gönderiye tutarlı kılıyor.
illustration adında bir kardeş yetenek de var; yazı içi küçük illüstrasyonlar için (bu yazıda bölümler arasında gördüğünüz küçük çizimler). Aynı fikir: sabit stil, sadece metafor ve renk değişiyor. Sadece kare 1024×1024 illüstrasyonlara, 16:9 kapaklar yerine ayarlı.
Görsel SEO ile ilgili küçük bir not: aynı kapak görseli gönderinin Open Graph ve Twitter Card varlığı olarak atanıyor, böylece sosyal paylaşımlar sorunsuzca onu alıyor. Strapi yükleme sırasında otomatik olarak dört yeniden boyutlandırılmış varyant üretiyor (küçük resim, küçük, orta, büyük), ancak henüz makale gövdesini srcset üzerinden bunları yükleyecek şekilde bağlamadım. Küçük bir ön yüz TODO. Satır içi illüstrasyonlara Lucas gömünce açıklayıcı alt metin yazıyor; kapağın kendi alternativeText alanını Strapi'de doldurmak ise hâlâ yapmak istediğim bir şey.
Yazı nasıl hazırlanıyor

Konu, anahtar kelime ve kapak sabitlenince, taslak hazırlama çoğunlukla mekanik bir iş. Lucas:
- Önce taslak çıkarıyor. Altı-yedi H2, her birinin net bir görevi var: sorun çerçevesi, adım adım talimatlar, "İpucu:" kutuları, özet, CTA.
- Her H2'yi
copywritingyeteneğiyle düz yazıya genişletiyor. Üslup (kısa cümleler, somut örnekler, uygun yerlerde ikinci şahıs, arada kuru mizah) Lucas'ın kalıcı talimatlarından geliyor, yeteneğin kendisinden değil. - Her adımın altına pratik "İpucu:" kutuları ekliyor. Eğitimlerde faydalı çünkü çoğu okuyucu göz gezdiriyor ve bu kutular uzun içerikte yol gösteriyor.
- Gönderinin
descriptionalanını yazıyor. Strapi bunu 80 karakterle sınırlandırıyor, bu yüzden kısa ve insan eli değmiş gibi okunuyor. Makale alt başlığı ve OG/Twitter kartı açıklaması olarak kullanılıyor. - Ürünü adlandıran ve ücretsiz bir çalışma alanına bağlantı veren bir CTA ile bitiriyor.
İlk taslak genellikle istemden iki-üç dakika sonra geliyor. Okuyorum, üslup yanlışsa ton ayarı istiyorum ve Lucas istediğim yere gelene kadar yineleme yapıyor. İlk taslak nadiren doğrudan yayınlanabilir oluyor. Genellikle büyük ölçüde hazır ama biraz eksik oluyor ve en çok zamanımı burada harcıyorum.
Taslak Strapi'ye nasıl aktarılıyor

Headless CMS olarak Strapi kullanıyoruz. articles içerik tipinde bir cover (medya), author ve category (ilişkiler), locale (dize) ve gövdenin bulunduğu bir blocks dinamik alanı var.
Lucas'ın CMS senkronizasyon akışı:
- Kapağı PNG olarak
/api/uploadadresine POST et. DönendocumentId'yi kaydet. - Başlık, açıklama (≤80 karakter; Strapi bunu zorunlu kılar), slug, dil, kapak/yazar/kategori ilişkileri (sayısal ID olarak) ve markdown gövdesini içeren tek bir
shared.rich-textblok ile/api/articles?status=draftadresine POST et. - Kritik:
publishedAtalanını gönderme. Strapi null'u taslak durumu olarak kabul eder. - vm0'ın taslak URL desenini kullanarak bir önizleme bağlantısı döndür:
https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft.
Strapi v5 için bir uyarı: genel REST API bazı içerik tiplerinde publishedAt alanını geçersiz kılabiliyor, yani API ile oluşturduğunuz bir "taslak" sessizce yayına alınabilir. Çözüm, taslak yazımlarında bu alanı kaldıran küçük bir veritabanı migrasyonu.
Slug stratejisi SEO için de önemli. Dört dilde de tek bir kanonik slug kullanıyoruz, çeviri yapmıyoruz. /de/blog/posts/remote-weekly-meeting-best-practices adresindeki bir okuyucu, /en adresindekiyle aynı URL yapısını görüyor ve backlink profilimiz çeviriler arasında bölünmüyor. Bu dil ilişkilerinden hreflang bağlantı etiketleri üretmek küçük bir ön yüz TODO. Henüz göndermiyoruz.
i18n çeviri nasıl çalışıyor

vm0 dört dilde yayınlanıyor: İngilizce, Almanca, Japonca, İspanyolca. Gönderileri Google Translate'ten geçirmiyoruz. Ucuz yol üslubu yok ediyor; doğru yol deyimleri uyarlamak.
Lucas önce EN taslağını oluşturuyor, dönen documentId'yi kaydediyor, ardından doğal şekilde çevrilmiş içeriklerle üç ek PUT /api/articles/{documentId}?locale=de (ve ?locale=ja, ?locale=es) çağrısı yapıyor. Strapi bunları aynı kanonik belgenin dil varyantları olarak kabul ediyor, böylece dört sürüm hem yönetici panelinde hem de ön yüzdeki dil değiştiricide bağlı kalıyor.
Ona verdiğim çeviri kuralları, çoğunlukla yanlış çıktılarla karşılaşıp düzelttiklerimden:
- Hedef dilde zaten İngilizce ödünç kelime olan teknik terimleri çevirmeyin. "API", "CMS", "agent" ve "prompt" JA ve DE'de İngilizce kalıyor. Çevrilince her iki dilde de tuhaf oluyor.
- Deyimleri doğal şekilde uyarlayın. "Cuma'nı öldürür" ifadesinin Almancaya kelimesi kelimesine çevirisi anlamsız; aynı metaforun ana dildeki hali ise oturuyor.
- CTA'ları dile göre yeniden ayarlayın. Almancada emir kipleri daha itici geliyor, bu yüzden yumuşatıyorum; Japoncada genellikle kibar bir davete dönüyor.
- Başlıkları uzunluğa göre yeniden ayarlayın. Almanca başlıklar İngilizce karşılıklarından ~30% daha uzun olma eğiliminde. Japonca başlıklar genellikle daha kısa. Lucas başlıkları her dilde 60 karakterlik SERP kesme sınırının altında tutuyor.
Çok dilli içerik yayını iş akışında en çok zaman alan kısımdı. Şimdi ise aynı ajan çalışmasının son adımı.
Otomatikleşmeyenler
Kısa ama önemli bir bölüm. Bu iş akışında her şey kasıtlı olarak otomatik değil:
- Stratejik düzeyde konu seçimi. Lucas, bir konu içinde anahtar kelime seçiyor ama konunun kendisi benden geliyor; genellikle ürün lansmanları, müşteri görüşmeleri veya yol haritası değişikliklerinden.
- Son editoryal kontrol. Her taslağı yayına çıkmadan önce okuyorum. Özellikle EN sürümünü. Üslup, teknik iddiaların doğruluğu, ürün bağlamına yapılan göndermeler insan gözü gerektiriyor.
- Akıcı konuşmadığım dillerde ana dil kontrolü. Almanca'yı akıcı konuşmuyorum. DE taslağı yayından önce ana dilde bir gözden geçiriciye gidiyor.
- Tanıtım. X'te paylaşmak, abonelere göndermek, topluluklarda paylaşmak şimdilik hâlâ manuel.
Amaç beni döngüden çıkarmak değil. Gerçekten bana ihtiyaç duyulmayan kısımlardan çıkarmak.
Bu iş akışına nasıl ulaştım
Bir hafta sonu oturup bunu tasarlamadım. Her gönderiyle, hangi adımların zamanımı yediğini fark ederek birikti.
Fark ettiğim şey: otomasyona değer olan kısımlar yaratıcı olanlar değil, bağlayıcı olanlardı: anahtar kelime çekmek, kapak oluşturmak, yükleme çağrıları, dil varyantı oluşturmak, önizleme URL'si biçimlendirmek. Dürüstçe takip ettiğimde, asıl yazıdan çok lojistiğe zaman harcadığımı gördüm.
Bu yüzden lojistiği yavaşça ajana aktardım. Model yazıyor; ajan işleri taşıyor. Ne yazılacağına ve nasıl bir üslup olacağına hâlâ ben karar veriyorum, sadece artık parçaları birleştiren ben değilim.
Benim için içerik otomasyonu pratikte "AI blogu yazıyor" olmadı. "AI yazının etrafındaki her şeyi yapıyor, ben de gerçekten yazıya bakmaya zaman buluyorum" oldu.
Benzer bir şey denemek isterseniz
Benzer bir durumdaysanız, içerik de dahil birden fazla şapka takıyorsanız, bunların çoğu tekrarlanabilir:
- Ajana kalıcı rol ve yetenekler verebileceğiniz bir ajan platformu (bizde Lucas'ın yaşadığı Zero).
- Mevcut araçlarınıza bağlayıcılar: CMS'iniz, anahtar kelime araştırma aracınız, görsel üreticiniz, Slack'iniz.
- Markanıza özel küçük bir yetenek seti (bizde kapak için
drawve üslup içincopywriting). - Bağlamı taşıyan kalıcı talimatlar, böylece istemler kısa kalabiliyor.
Ücretsiz bir Zero çalışma alanı başlatın →
Ya da kaydolmadan önce daha fazla ajan iş akışı görmek isterseniz, kullanım senaryosu kütüphanemizde mühendislik, ürün, pazarlama ve operasyonlarda 19 kopyalanmaya hazır otomasyon var.
Özellikle Lucas'ı klonlamak isterseniz: bir ajan oluşturun, ona Pazarlama yöneticisi rolünü verin, Strapi (veya CMS'iniz) + Ahrefs + bir görsel üretici bağlayın, sizinkine göre modellenmiş bir draw yeteneği ve marka üslubunuzu yakalayan bir copywriting yeteneği ekleyin. Gerisini ilk isteminizden çözecektir.





