Back to all posts

Jak automatyzuję produkcję naszego bloga od A do Z

Jak automatyzuję produkcję naszego bloga od A do Z

Jestem Ming. Oprócz projektowania produktu w vm0, prowadzę też nasz content, a okazało się, że to znacznie więcej niż się spodziewałem: projektowanie workflow, ilustracje, produkcja obrazów, praca w CMS, tłumaczenia. Oto jak stopniowo to ogarniam.


Content to jedna z moich ról tutaj

Większość mojego dnia w vm0 dzielę między projektowanie produktu a nasz kod Next.js. Ale prowadzenie contentu też jest na mojej głowie i gdy zacząłem, zrozumiałem, ile faktycznie potrzeba, by blog działał. Potrzebujesz regularnych publikacji, prawdziwego researchu słów kluczowych, spójnych z marką grafik, dobrych opisów meta i tłumaczeń na cztery obsługiwane języki.

Gdy zacząłem robić to na poważnie, każdy wpis zajmował mi prawie cały dzień. Pisanie okazało się najmniejszą częścią. Najwięcej czasu pochłaniała produkcja wokół tekstu: szukanie słów kluczowych, tworzenie okładki, poprawne wypełnianie pól w CMS, powtarzanie tego dla każdej wersji językowej.

Stopniowo więc przenosiłem jak najwięcej z tego procesu do Lucasa, agenta AI do marketingu, którego zbudowałem w Zero wokół mojej codziennej pracy. Ma rolę „Marketing manager” i zajmuje się wszystkim, co związane z marketingiem: produkcja bloga to dziś najbardziej rozbudowany element, a z czasem dodaję mu kolejne umiejętności i konektory.

Obecnie Lucas ma dostęp do naszego headless CMS Strapi, konta Ahrefs, zespołowego Slacka, czatu webowego, wewnętrznej umiejętności draw do ilustracji spójnych z marką oraz standardowej umiejętności copywriting do mechaniki pisania.

Poniżej opisuję, jak ta automatyzacja bloga działa w praktyce: jak Lucas bierze ogólny prompt, rozbija go na temat i słowa kluczowe, szkicuje wpis, rysuje okładkę, tłumaczy tekst naturalnie i umieszcza cztery wersje językowe w naszym headless CMS. Potem opowiem, jak do tego doszedłem i co celowo zostawiam ludziom (wciąż głównie sobie).


Jak korzystam z Lucasa: aplikacja webowa i Slack

Najczęściej pracuję z Lucasem przez czat webowy vm0. To interfejs do głębokiej pracy, gdzie wspólnie robimy konspekt, szkic, iteracje okładki i poprawki. Długie wątki, szeroki kontekst, taki rodzaj współpracy, który byłby niezręczny w kanale czatu.

Lucas jest też podpięty do naszego Slacka zespołowego jako wspólny punkt wejścia. Wrzucam tam szybkie prompty z telefonu, a reszta zespołu też może go pingować. Każdy, kto jest na rotacji blogowej, zaczyna wpis w ten sam sposób. Ten sam agent, ten sam kontekst w obu interfejsach.


Jak wygląda typowy prompt

Moje prompty do Lucasa są zwykle krótkie. Maksymalnie trzy zdania. Przykładowy:

Lucas, napisz tutorial o prowadzeniu efektywnych cotygodniowych spotkań: omów strukturę spotkania, typowe pułapki i sposoby angażowania zespołów zdalnych. Styl tutorialu, przyjazny SEO, zakończ CTA do użycia Zero. Tylko link do szkicu, nie publikuj.

To cały brief. Jedna wiadomość. Bez konspektu, listy słów kluczowych, wytycznych do grafiki czy limitu długości. Lucas przejmuje dalej.

Zajęło mi trochę czasu, by dojść do tego formatu. Na początku pisałem dłuższe briefy, bo zakładałem, że agent potrzebuje wszystkiego rozpisanego, a potem zrozumiałem, że większość kontekstu powinna być w jego stałych instrukcjach i umiejętnościach, nie w każdym promptcie. Prompt to wyzwalacz; reszta konfiguracji niesie ciężar.


Jak Lucas analizuje temat i słowa kluczowe

Pierwszy ruch Lucasa to wydobycie struktury z ogólnego promptu. Dla takiego zlecenia jego notatki robocze wyglądają tak:

  • Temat: prowadzenie efektywnych cotygodniowych spotkań
  • Format: tutorial → numerowane kroki, konkretne przykłady, język „zrób to”
  • Domyślna grupa docelowa: liderzy zespołów, menedżerowie zdalni, założyciele
  • Wymagane sekcje: struktura spotkania, typowe pułapki, angażowanie zdalnych
  • CTA: skierować czytelników do Zero
  • Ograniczenie: tylko URL szkicu, nie publikować

Następnie wybiera słowo kluczowe. To część content marketingu, do której miałem najmniej intuicji, więc dałem Lucasowi rutynę do przechodzenia za każdym razem, gdy proszę go o pracę ze słowami kluczowymi. To nie jest umiejętność, którą uruchamia autonomicznie, tylko sekwencja, której mu ufam:

  1. Pobierz kandydatów z Ahrefs. Wywołuje API Ahrefs na frazie tematu, zwraca warianty long-tail z miesięczną liczbą wyszukiwań, trudnością słowa (KD), tematem nadrzędnym i intencją SERP.
  2. Filtruj po trudności. Dałem mu twardą regułę: KD < 30. vm0 to stosunkowo nowa domena z ograniczonym autorytetem, więc gonienie za trudnymi słowami nie ma sensu. Long-tail wygrywa na starcie.
  3. Porównaj z naszym indeksem Strapi. Pobiera wszystkie opublikowane slugi z CMS przez Strapi REST API i usuwa słowa, które już pokrywamy. Bez kanibalizacji.
  4. Dopasuj intencję do produktu. Intencja słowa musi pasować do naszej biblioteki use case’ów. „Jak prowadzić efektywne cotygodniowe spotkania” → operacje / zarządzanie zespołem → pasuje. „Najlepszy ramen w Tokio” → nie pasuje, niezależnie od wolumenu.
  5. Wybierz jedno. Z przefiltrowanej listy wybiera opcję o najwyższym wolumenie i używa jej jako osi wpisu. Przykład: remote weekly meeting best practices.

Dla SEO na stronie stosuje prostą heurystykę: słowo kluczowe w tytule, w co najmniej jednym H2 i w pierwszych 100 słowach. Synonimy i powiązane frazy naturalnie wplecione. Linki wewnętrzne do dwóch-trzech powiązanych wpisów tam, gdzie pasują. Poza tym: naturalne pisanie, bez upychania słów kluczowych.

Struktura wpisu (sześć-siedem H2, pod każdym krokiem callout „Wskazówka:”, CTA na końcu) pochodzi z szablonu tutorialu, który wypracowałem na kilku wpisach.


Jak powstaje okładka

Okładka to część produkcji bloga, na której zależy mi najbardziej – po części dlatego, że jestem projektantem, a po części dlatego, że to pierwsze, co widzi czytelnik. To także obraz Open Graph przy udostępnianiu wpisów na X czy LinkedIn i to on sprawia, że nasz indeks bloga wygląda jak publikacja, a nie ściana stockowych zdjęć.

Stocki nie wchodziły w grę dla efektu, na którym mi zależało, a zlecanie ilustracji pojedynczo podniosłoby koszt produkcji wpisu do nieakceptowalnego poziomu. Dlatego zbudowałem umiejętność Zero o nazwie draw. To 200-linijkowy skrypt w Pythonie, który robi pięć rzeczy:

  1. Przyjmuje dwa wejścia: metaforę (co narysować) i kolor (przyjazna nazwa plus hex).
  2. Wstawia je do sztywnego szablonu promptu, który blokuje resztę kompozycji: ciepłe szare tło #eeeeee, akwarelowa plama wycentrowana w wybranym kolorze, ręcznie rysowany szkic tuszem na górze, logo vm0 w (25, 25) lewy górny róg.
  3. Wysyła złożony prompt do modelu fal.ai nano-banana-pro pod 16:9.
  4. Pobiera PNG. Normalizuje prawie białe piksele do dokładnie #eeeeee, by tło nie odpływało. Skaluje do 1600×900. Nakłada przezroczyste logo vm0 na wierzch metodą alpha-compositing.
  5. Wgrywa wynik na CDN vm0 i drukuje URL.

Typowe wywołanie wygląda tak:

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

Dwa wejścia, reszta marki pozostaje spójna. Zwykle wybieram kolor pasujący do tematu wpisu. Koral lub szałwia do cieplejszych tutoriali, niebieski lub lawenda do technicznych, musztardowy żółty do ogłoszeń. Kilka powtarzających się kolorów powoli buduje rozpoznawalną paletę bloga.

To, czego nauczyłem się na własnych błędach, to że przewaga nie leży w modelu, tylko w szablonie. Pozwalając modelowi swobodnie wybierać kompozycję, paletę i układ, każda okładka wyglądała jak inna marka. Zablokowanie tych elementów i pozwolenie na wybór tylko metafory utrzymuje spójność wizualną wpisów.

Jest też bliźniacza umiejętność illustration do ilustracji wewnątrz artykułu (mniejsze rysunki między sekcjami tego wpisu). Ten sam pomysł: stały styl, zmienia się tylko metafora i kolor. Po prostu dostrojona do kwadratowych 1024×1024 grafik zamiast 16:9 okładek.

Mała uwaga o SEO obrazów: ta sama okładka jest podpięta jako Open Graph i Twitter Card wpisu, więc udostępnienia w social mediach działają bez problemu. Strapi automatycznie generuje cztery przeskalowane warianty przy wgrywaniu (miniatura, mały, średni, duży), choć jeszcze nie podpiąłem ładowania ich w treści przez srcset. To drobne zadanie front-endowe. Ilustracje w tekście dostają opisowy alt w markdownie, gdy Lucas je osadza; własne alternativeText okładki w Strapi to coś, co jeszcze chcę uzupełnić.


Jak powstaje wpis

Gdy temat, słowo kluczowe i okładka są ustalone, szkicowanie to już głównie mechanika. Lucas:

  1. Najpierw robi konspekt. Sześć-siedem H2, każda z jasną rolą: zarys problemu, instrukcje krok po kroku, callouty „Wskazówka:”, podsumowanie, CTA.
  2. Rozwija każdą H2 w prozę używając umiejętności copywriting. Styl (krótkie zdania, konkretne przykłady, druga osoba tam, gdzie pasuje, czasem suchy humor) wynika z reguł w stałych instrukcjach Lucasa, nie z samej umiejętności.
  3. Dodaje praktyczne callouty „Wskazówka:” pod każdym krokiem. Przydatne w tutorialach, bo większość czytelników skanuje tekst, a callouty prowadzą przez dłuższe treści.
  4. Pisze pole description wpisu. Strapi ogranicza je do 80 znaków, więc jest krótkie i brzmi naturalnie. Służy jako podtytuł artykułu i opis OG/Twitter card.
  5. Kończy CTA z nazwą produktu i linkiem do darmowego workspace.

Pierwszy szkic wraca zwykle po dwóch-trzech minutach od promptu. Czytam go, proszę o korekty tonu, gdy styl nie pasuje, i Lucas iteruje aż do skutku. Pierwszy szkic rzadko nadaje się do publikacji. Zwykle jest prawie gotowy, ale trochę nie taki – tu spędzam najwięcej czasu na recenzji.


Jak szkic trafia do Strapi

Używamy Strapi jako headless CMS. Typ treści articles ma pole cover (media), author i category (relacje), locale (string) oraz dynamiczną strefę blocks, gdzie jest treść.

Przepływ synchronizacji CMS Lucasa:

  1. POST okładki PNG do /api/upload. Zapisz zwrócone documentId.
  2. POST do /api/articles?status=draft z tytułem, opisem (≤80 znaków; Strapi tego pilnuje), slugiem, lokalizacją, relacjami okładka/autor/kategoria jako ID numeryczne i jednym blokiem shared.rich-text z markdownem.
  3. Krytycznie: pomiń publishedAt. Strapi traktuje null jako stan szkicu.
  4. Zwróć URL podglądu wg wzoru szkicu vm0: https://www.vm0.ai/{locale}/blog/posts/{slug}?status=draft.

Uwaga do Strapi v5: publiczne REST API może nadpisać publishedAt dla niektórych typów treści, co oznacza, że „szkic” utworzony przez API może cicho się opublikować. Rozwiązaniem jest mała migracja DB usuwająca to pole przy zapisie szkicu.

Strategia slugów też jest ważna dla SEO. Używamy jednego kanonicznego sluga dla wszystkich czterech wersji językowych zamiast tłumaczyć go. Czytelnik na /de/blog/posts/remote-weekly-meeting-best-practices widzi tę samą strukturę URL co na /en, a nasz profil backlinków nie rozbija się na tłumaczone adresy. Emitowanie tagów hreflang z tych relacji lokalizacyjnych to drobne zadanie front-endowe. Jeszcze ich nie publikujemy.


Jak działa tłumaczenie i18n

vm0 działa w czterech wersjach językowych: angielskiej, niemieckiej, japońskiej, hiszpańskiej. Nie wrzucamy wpisów do Google Translate. Tania droga niszczy styl; właściwa adaptuje idiomy.

Lucas tworzy najpierw szkic EN, zapisuje zwrócone documentId, potem wykonuje trzy kolejne wywołania PUT /api/articles/{documentId}?locale=de (oraz ?locale=ja, ?locale=es) z naturalnie przetłumaczonymi danymi. Strapi traktuje je jako warianty językowe tego samego dokumentu kanonicznego, co utrzymuje powiązanie czterech wersji w panelu admina i na przełączniku języków na froncie.

Zasady tłumaczenia, które mu ustawiłem, głównie po własnych poprawkach:

  • Nie tłumacz terminów technicznych będących już zapożyczeniami z angielskiego w danym języku. „API”, „CMS”, „agent” i „prompt” zostają po angielsku w JA i DE. Tłumaczenie brzmi nienaturalnie w obu językach.
  • Adaptuj idiomy naturalnie. Dosłowne tłumaczenie „kills your Friday” na niemiecki to bełkot; natywna wersja tej metafory działa.
  • Dopasuj CTA do języka. Tryb rozkazujący jest bardziej nachalny w DE, więc go łagodzę; wersja JA zwykle przechodzi w uprzejme zaproszenie.
  • Dopasuj długość tytułów. Niemieckie tytuły są zwykle o ~30% dłuższe niż angielskie odpowiedniki. Japońskie są krótsze. Lucas pilnuje limitu 60 znaków dla SERP w każdej wersji.

Publikacja treści wielojęzycznej była kiedyś najbardziej czasochłonną częścią workflow. Teraz to po prostu ostatni krok tego samego uruchomienia agenta.


Co nie jest automatyzowane

Krótka, ważna sekcja. Nie wszystko w tym workflow jest zautomatyzowane – celowo:

  • Wybór tematu na poziomie strategicznym. Lucas wybiera słowa kluczowe w ramach tematu, ale sam temat pochodzi ode mnie, zwykle z premier produktu, rozmów z klientami lub zmian w roadmapie.
  • Ostateczna korekta redakcyjna. Czytam każdy szkic przed publikacją. Zwłaszcza wersję EN. Ton, poprawność techniczna, odniesienia do kontekstu produktu wymagają ludzkiego oka.
  • Natywna korekta dla języków, których nie znam biegle. Nie czytam płynnie po niemiecku. Szkic DE trafia do natywnego recenzenta przed publikacją.
  • Promocja. Wrzucanie na X, wysyłka do subskrybentów, udostępnianie w społecznościach – to nadal ręcznie.

Nie chodzi o to, by mnie wyeliminować z procesu. Chodzi o to, by wyeliminować mnie z tych części, które naprawdę mnie nie potrzebują.


Jak doszedłem do tego workflow

Nie zaprojektowałem tego w jeden weekend. To narastało, wpis po wpisie, gdy zauważałem, które kroki pochłaniają mój czas.

Zauważyłem: to, co warto automatyzować, to nie kreatywne części. To te łączące: pobieranie słów kluczowych, generowanie okładek, uploady, rozdzielanie na wersje językowe, formatowanie URL podglądu. Gdy uczciwie to policzyłem, więcej czasu schodziło mi na logistykę niż na samo pisanie.

Stopniowo więc przenosiłem logistykę do agenta. Model pisze; agent zajmuje się przenoszeniem rzeczy. Nadal to ja decyduję, o czym pisać i jak ma to brzmieć, ale już nie ja zszywam wszystko w całość.

Dla mnie automatyzacja contentu w praktyce nie oznaczała „AI pisze bloga”. Oznaczała „AI robi wszystko wokół pisania, żebym miał czas naprawdę spojrzeć na tekst”.


Jeśli chcesz spróbować czegoś podobnego

Jeśli jesteś w podobnej sytuacji, masz na głowie więcej niż byś chciał, a content to jedna z tych rzeczy, większość z tego da się powtórzyć:

  • Platforma agentów pozwalająca nadać agentowi stałą rolę i umiejętności (u nas to Zero, gdzie mieszka Lucas).
  • Konektory do Twoich narzędzi: CMS, narzędzia do słów kluczowych, generatora obrazów, Slacka.
  • Mały zestaw umiejętności dopasowanych do Twojej marki (u nas draw do okładek i copywriting do tonu).
  • Stałe instrukcje niosące kontekst, by prompty mogły być krótkie.

Załóż darmowy workspace Zero →

A jeśli wolisz najpierw zobaczyć więcej workflow agentów, nasza biblioteka use case’ów ma 19 gotowych do skopiowania automatyzacji dla inżynierii, produktu, marketingu i operacji.

Jeśli chcesz sklonować Lucasa: utwórz agenta, nadaj mu rolę Marketing manager, połącz Strapi (lub swój CMS) + Ahrefs + narzędzie do generowania obrazów, dodaj umiejętność draw wzorowaną na swojej i umiejętność copywriting oddającą ton Twojej marki. Resztę rozgryzie od pierwszego promptu.

Stay in the loop

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