Back to all posts

Jak automatizuji naši blogovou produkci od začátku do konce

Jak automatizuji naši blogovou produkci od začátku do konce

Jsem Ming. Kromě produktového designu ve vm0 mám na starosti i náš obsah, a ukázalo se, že je toho mnohem víc, než jsem čekal: návrh workflow, ilustrace, tvorba obrázků, práce v CMS, překlady. Takhle jsem to postupně začal zvládat.


Obsah je jednou z věcí, které tu dělám

Většinu dne ve vm0 rozděluji mezi produktový design a naši Next.js codebase. Ale i obsah je na mém seznamu, a když jsem s tím začal naplno, uvědomil jsem si, kolik práce vlastně blog, který funguje, obnáší. Potřebujete konzistentní výstupy, skutečný keyword research, vizuály v souladu se značkou, slušné meta popisy a překlady do čtyř jazyků, které podporujeme.

Když jsem to začal dělat vážně, každý článek mi zabral většinu dne. Samotné psaní byla jen malá část. Většina času padla na produkční práci kolem psaní: hledání správných klíčových slov, tvorba titulního obrázku, správné vyplnění polí v CMS, opakování pro každou jazykovou verzi.

Postupně jsem tedy co nejvíc z tohoto procesu přesunul do Lucase, AI marketingového agenta, kterého jsem postavil na Zero podle své každodenní práce. Je nastavený jako "Marketing manager" a jeho záběr je vše, co souvisí s marketingem: produkce blogu je dnes nejrozvinutější část a postupně přibývají další dovednosti a konektory.

Aktuálně má Lucas přístup k našemu headless CMS Strapi, účtu Ahrefs, týmovému Slacku, webovému chatu, interní dovednosti draw pro ilustrace v souladu se značkou a standardní dovednosti copywriting pro psaní.

Níže ukážu, jak tato AI automatizace blogu funguje v praxi: jak Lucas vezme vágní zadání, rozloží ho na téma a klíčová slova, připraví návrh článku, vytvoří titulní obrázek, přeloží text přirozeně do čtyř jazykových verzí a uloží drafty do našeho headless CMS. Pak popíšu, jak jsem se k tomu dostal a co záměrně nechávám na lidech (stále hlavně na sobě).


Jak používám Lucase: webová aplikace a Slack

S Lucasem pracuji hlavně přes webový chat vm0. Je to rozhraní pro hlubokou práci, kde s ním řeším osnovu, návrh, iterace titulního obrázku a úpravy. Dlouhé vlákna, dlouhý kontext, typ výměny, která by byla v běžném chatu nepohodlná.

Lucas je také napojený na náš týmový Slack jako sdílený vstupní bod. Rychlá zadání tam posílám z mobilu a může ho oslovit i zbytek týmu. Kdokoliv má zrovna blog na starosti, spustí článek stejným způsobem. Stejný agent, stejný kontext v obou rozhraních.


Jak vypadá typické zadání

Moje zadání pro Lucase jsou obvykle krátká. Maximálně tři věty. Typické například:

Lucasi, napiš návod na vedení efektivních týdenních porad: pokryj strukturu schůzky, běžné chyby a jak udržet zapojení vzdálených týmů. Styl návodu, vhodné pro SEO, zakonči výzvou k vyzkoušení Zero. Jen odkaz na návrh, nepublikovat.

To je celé zadání. Jedna zpráva. Žádná osnova, žádný seznam klíčových slov, žádné zadání pro design, žádný cíl délky. Lucas si s tím poradí.

Chvíli mi trvalo, než jsem na tento formát přišel. Ze začátku jsem psal mnohem delší zadání, protože jsem předpokládal, že agent potřebuje vše přesně popsat, ale pak jsem zjistil, že většina kontextu patří do jeho trvalých instrukcí a dovedností, ne do každého zadání. Zadání je spouštěč; zbytek konfigurace nese hlavní váhu.


Jak Lucas analyzuje téma a klíčová slova

První krok Lucase je vytáhnout strukturu z vágního zadání. U požadavku jako výše vypadají jeho pracovní poznámky takto:

  • Téma: vedení efektivních týdenních porad
  • Formát: návod → očíslované kroky, konkrétní příklady, jazyk "dělejte toto"
  • Předpokládané publikum: vedoucí týmů, manažeři na dálku, zakladatelé
  • Požadované sekce: struktura schůzky, běžné chyby, zapojení vzdálených týmů
  • CTA: přivést čtenáře k Zero
  • Omezení: pouze návrh URL, nepublikovat

Pak vybírá klíčové slovo. To je část obsahového marketingu, na kterou jsem měl na začátku nejmenší cit, takže jsem Lucasovi dal rutinu, kterou projde vždy, když ho požádám o práci s klíčovými slovy. Není to dovednost, kterou by spouštěl autonomně, jen sekvence, které věřím:

  1. Stáhni kandidáty z Ahrefs. Zavolá Ahrefs API na zadané téma, vrátí long-tail varianty s měsíčním objemem hledání, obtížností klíčového slova (KD), nadřazeným tématem a záměrem SERP.
  2. Filtruj podle obtížnosti. Dal jsem mu pevné pravidlo: KD < 30. vm0 je relativně nová doména s omezenou autoritou, takže honit se za těžkými klíčovými slovy pro nás zatím nemá smysl. Long-tail vyhrává na začátku.
  3. Porovnej s naším indexem ve Strapi. Stáhne všechny publikované slugs z našeho CMS přes Strapi REST API a odstraní klíčová slova, která už pokrýváme. Žádná kanibalizace.
  4. Porovnej záměr s produktem. Záměr klíčového slova musí odpovídat naší knihovně use case. "Jak vést efektivní týdenní porady" → provoz / řízení týmu → sedí. "Nejlepší ramen v Tokiu" → nesedí, bez ohledu na objem.
  5. Vyber jedno. Z filtrovaného seznamu vybere možnost s nejvyšším objemem a použije ji jako páteř článku. Například nejlepší postupy pro týdenní porady na dálku.

Pro on-page SEO používá jednoduchou heuristiku: cílové klíčové slovo v titulku, alespoň v jednom H2 a v prvních 100 slovech. Synonyma a související fráze přirozeně rozprostřené v textu. Interní odkazy na dva až tři související články, kde to dává smysl. Dále: psát přirozeně, žádné přeplňování klíčovými slovy.

Struktura článku (šest nebo sedm H2, pod každým krokem "Tip:", CTA na závěr) vychází ze šablony návodu, kterou jsem si postupně vytvořil na základě několika článků.


Jak vzniká titulní obrázek

Titulní obrázek je část blogové produkce, na které mi záleží nejvíc – částečně proto, že jsem designér, a částečně proto, že je to první, co čtenář uvidí. Je to také Open Graph obrázek při sdílení na X nebo LinkedIn a dává našemu blogu vzhled publikace místo zdi stock fotografií.

Stock fotky pro vzhled, který jsem chtěl, nebyly možností, a zadávat ilustrace jednotlivě by znamenalo neúnosné náklady na článek. Proto jsem vytvořil Zero dovednost draw. Je to 200-řádkový Python skript, který dělá pět věcí:

  1. Bere dva vstupy: metaforu (co nakreslit) a barvu (přátelské jméno plus hex kód).
  2. Vloží je do pevné šablony promptu, která uzamkne zbytek kompozice: teplé šedé pozadí #eeeeee, akvarelová skvrna uprostřed plátna ve zvolené barvě, ručně kreslená inkoustová skica nahoře, logo vm0 v (25, 25) vlevo nahoře.
  3. Odešle složený prompt do modelu fal.ai nano-banana-pro na 16:9.
  4. Stáhne PNG. Normalizuje téměř bílé pixely zpět na přesně #eeeeee, aby pozadí nikdy neujelo. Zvětší na 1600×900. Překryje průhledné logo vm0 navrch pomocí alfa kanálu.
  5. Nahraje výsledek na CDN vm0 a vypíše URL.

Typické spuštění vypadá takto:

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

Dva vstupy a zbytek značky zůstává konzistentní. Barvu obvykle vybírám podle tématu článku. Korálová nebo šalvějová pro teplejší návody, modrá nebo levandulová pro techničtější, hořčicově žlutá pro oznámení. Několik opakujících se barev postupně promění blog v rozpoznatelnou paletu.

Na co jsem přišel těžkou cestou: páka není v modelu, ale v šabloně. Když model volně vybíral kompozici, paletu a rozvržení, každý titulní obrázek vypadal jako z jiné značky. Uzamčením těchto prvků a ponecháním volby jen pro metaforu zůstává vzhled článků konzistentní.

Existuje sesterská dovednost illustration pro ilustrace uvnitř článku (menší kresby mezi sekcemi tohoto článku). Stejný princip: pevný styl, mění se jen metafora a barva. Jen je laděná na čtvercové 1024×1024 obrázky místo 16:9 titulních.

Malá poznámka k SEO obrázků: stejný titulní obrázek je nastaven jako Open Graph a Twitter Card asset článku, takže sdílení na sociálních sítích funguje bez problémů. Strapi při nahrání automaticky generuje čtyři předem zmenšené varianty (náhled, malý, střední, velký), i když zatím nemám článek nastavený tak, aby je načítal přes srcset. To je malý front-end úkol. Ilustrace vkládané do textu dostávají popisný alt text přímo do markdownu, když je Lucas vkládá; vlastní alternativeText titulního obrázku ve Strapi bych ještě rád doplnil.


Jak vzniká článek

Jakmile jsou téma, klíčové slovo a titulní obrázek dané, návrh je převážně mechanický. Lucas:

  1. Nejprve vytvoří osnovu. Šest nebo sedm H2, každá s jasným účelem: vymezení problému, postupné kroky, tipy, shrnutí, CTA.
  2. Rozvine každé H2 do textu pomocí dovednosti copywriting. Styl (krátké věty, konkrétní příklady, druhá osoba, kde to sedí, občas suchý humor) vychází z pravidel, která mám v Lucasových trvalých instrukcích, ne z dovednosti samotné.
  3. Přidá praktické tipy pod každý krok. U návodů užitečné, protože většina čtenářů skenuje a tipy jim dávají cestu dlouhým obsahem.
  4. Napíše pole description článku. Strapi ho omezuje na 80 znaků, takže zůstává krátké a působí lidsky. Používá se jako podtitul článku a popis pro OG/Twitter kartu.
  5. Zakončí CTA, které jmenuje produkt a odkazuje na free workspace.

První návrh obvykle přijde dvě až tři minuty po zadání. Přečtu ho, požádám o úpravy tónu, pokud styl nesedí, a Lucas iteruje, dokud to není ono. První návrh je málokdy rovnou publikovatelný. Většinou je téměř hotový, ale něco mu chybí, a právě tam trávím nejvíc času při revizi.


Jak se návrh uloží do Strapi

Používáme Strapi jako headless CMS. Content type articles má pole cover (media), author a category (vazby), locale (string) a dynamickou zónu blocks, kde je tělo článku.

Lucasův CMS synchronizační postup:

  1. POSTne titulní PNG na /api/upload. Uloží vrácené documentId.
  2. POSTne na /api/articles?status=draft s titulkem, popisem (≤80 znaků; Strapi to vynucuje), slugem, lokalizací, vazbami na titulní obrázek/autora/kategorii jako číselné ID a jedním blokem shared.rich-text obsahujícím markdown tělo.
  3. Důležité: vynechat publishedAt. Strapi považuje null za draft.
  4. Vrátí náhledovou URL podle vm0 draft vzoru: https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft.

Pozor na Strapi v5: veřejné REST API může přepsat publishedAt u některých content typů, což znamená, že "draft" vytvořený přes API může tiše jít live. Řešením je malá DB migrace, která pole při zápisu draftu odstraní.

Strategie slugů je důležitá i pro SEO. Používáme jeden kanonický slug pro všechny čtyři jazykové verze místo překladu. Čtenář na /de/blog/posts/remote-weekly-meeting-best-practices vidí stejnou URL strukturu jako čtenář na /en a náš profil zpětných odkazů se netříští mezi překlady. Vypisování hreflang link tagů z těchto lokalizačních vazeb je malý front-end úkol. Zatím je nenasazujeme.


Jak funguje i18n překlad

vm0 je dostupné ve čtyřech jazykových verzích: anglicky, německy, japonsky, španělsky. Nepoužíváme Google Translate. Levná cesta zničí styl; správná cesta přizpůsobí idiomy.

Lucas nejprve vytvoří EN návrh, uloží vrácené documentId, pak spustí tři následné PUT /api/articles/{documentId}?locale=de (a ?locale=ja, ?locale=es) volání s přirozeně přeloženými daty. Strapi je považuje za jazykové varianty stejného kanonického dokumentu, což udržuje čtyři verze propojené v administraci i na front-end přepínači jazyků.

Překladová pravidla, která jsem mu dal, většinou na základě špatných výstupů a oprav:

  • Nepřekládat technické termíny, které jsou v cílovém jazyce už anglickými výpůjčkami. "API", "CMS", "agent" a "prompt" zůstávají v angličtině v JA a DE. Překlad působí v obou jazycích nepřirozeně.
  • Přizpůsobit idiomy přirozeně. Doslovný překlad "kills your Friday" do němčiny je nesmysl; rodilá verze stejné metafory funguje.
  • Upravit CTA podle jazyka. Rozkazy působí v DE příliš direktivně, proto je zmírňuji; JA verze je obvykle zdvořilá pozvánka.
  • Upravit délku titulků. Německé titulky bývají asi o 30% delší než anglické. Japonské bývají kratší. Lucas drží titulky pod limitem 60 znaků pro zobrazení v SERP v každém jazyce.

Publikování vícejazyčného obsahu byla část workflow, která mi dřív zabírala nejvíc času. Teď je to jen poslední krok v rámci jednoho běhu agenta.


Co se záměrně neautomatizuje

Krátká, ale důležitá sekce. Ne vše v tomto workflow je automatizované, záměrně:

  • Výběr témat na strategické úrovni. Lucas vybírá klíčová slova v rámci tématu, ale samotné téma určuji já, obvykle podle produktových novinek, rozhovorů se zákazníky nebo změn v roadmapě.
  • Finální redakční kontrola. Každý návrh čtu před publikací. Zvlášť EN verzi. Tón, přesnost technických tvrzení, odkazy na interní produktový kontext potřebují lidské oko.
  • Kontrola rodilým mluvčím u jazyků, které neovládám plynně. Německy nečtu plynně. DE návrh jde před publikací na kontrolu rodilému mluvčímu.
  • Propagace. Sdílení na X, rozesílání odběratelům, sdílení v komunitách je zatím stále ruční.

Cílem není vyřadit mě z procesu. Cílem je vyřadit mě z částí procesu, kde mě není opravdu potřeba.


Jak jsem k tomuto workflow dospěl

Nesestavil jsem to za víkend. Vznikalo to postupně, článek po článku, když jsem si všímal, které kroky mi zabírají nejvíc času.

Zjistil jsem, že automatizovat se vyplatí ne kreativní části, ale ty spojovací: tahání klíčových slov, generování titulních obrázků, uploady, rozdělení do jazykových verzí, formátování náhledových URL. Když jsem to poctivě sledoval, trávil jsem víc času logistikou než samotným psaním.

Postupně jsem tedy logistiku přesunul do agenta. Model píše; agent řeší přesuny dat. Stále rozhoduji, o čem psát a jak má článek znít, jen už nemusím ručně spojovat jednotlivé části.

Pro mě v praxi automatizace obsahu neznamenala "AI píše blog". Znamenala "AI dělá vše kolem psaní, abych měl čas věnovat se samotnému psaní".


Pokud chcete zkusit něco podobného

Pokud jste v podobné situaci a máte na starosti obsah mezi dalšími rolemi, většinu z toho lze zopakovat:

  • Platforma pro agenty, která umožní agentovi trvalou roli a dovednosti (my používáme Zero, kde Lucas běží).
  • Konektory na vaše stávající nástroje: CMS, nástroj na klíčová slova, generátor obrázků, Slack.
  • Malý set dovedností šitých na míru vaší značce (u nás draw pro titulky a copywriting pro tón).
  • Trvalé instrukce, které nesou kontext, takže zadání mohou být krátká.

Založte si free Zero workspace →

Nebo pokud chcete nejdřív vidět více workflow s agenty, naše knihovna use case obsahuje 19 hotových automatizací pro engineering, produkt, marketing i provoz.

Pokud chcete klonovat přímo Lucase: vytvořte agenta, dejte mu roli Marketing manager, propojte Strapi (nebo vaše CMS) + Ahrefs + generátor obrázků, přidejte dovednost draw podle svého vzoru a dovednost copywriting, která zachytí hlas vaší značky. Zbytek zvládne od prvního zadání.

Stay in the loop

// Get the latest insights on AI teammates and collaboration.