🏠 DOM (Życie Codzienne)
Automatyzacja w domu oszczędza czas na powtarzalne zadania jak płatności rachunków, przypomnienia o lekach, backup zdjęć do chmury, czy monitoring promocji w sklepach. Możesz też automatyzować smart home (światła, ogrzewanie) lub zbierać dane o pogodzie/cenach benzyny do codziennych decyzji.
💼 PRZEDSIĘBIORCA (Biznes)
W biznesie automatyzacja eliminuje ręczną pracę przy fakturowaniu, mailingu, social media postach, raportach sprzedaży czy obsłudze klienta przez chatboty. System może sam generować leady z LinkedIn, wysyłać oferty, śledzić konkurencję i przypominać o follow-upach – oszczędzając dziesiątki godzin tygodniowo.
📚 NAUKA/STUDENT
Automatyzacja pomaga w organizacji materiałów (auto-segregacja notatek, tworzenie fiszek z PDF-ów) i monitoringu deadlines (przypomnienia o zaliczeniach, auto-kalendarz z planem zajęć). Możesz też automatyzować research (zbieranie artykułów naukowych, tłumaczenia, streszczenia) oszczędzając czas na naukę zamiast administracji.
🏥 ZDROWIE/FITNESS
Automatyzacja śledzi Twoje postępy (sync danych z wearables do arkuszy, wykresy wagi/kroków/kalorii) i przypomina o nawykach (picie wody, leki, treningi). System może też automatycznie zamawiać suplementy kiedy się kończą lub wysyłać cotygodniowe raporty zdrowotne.
💰 FINANSE OSOBISTE
Automatyczne kategoryzowanie wydatków z kart bankowych, alerty o dużych transakcjach, tracking subskrypcji i powiadomienia o zbliżających się płatnościach. System może też monitorować kursy walut, ceny akcji i automatycznie generować miesięczne raporty budżetowe.
🎨 KREATYWNOŚĆ/CONTENT
Automatyzacja publikacji na wszystkich platformach jednocześnie (blog→social media→newsletter), generowanie wariantów grafik/postów przez AI, scheduling contentu na cały miesiąc. Możesz też auto-repurposować content (artykuł→thread→shorts→infografika) maksymalizując zasięg przy minimalnej pracy.
Jeżeli nie masz na to czasu, bądź nie czujesz się dobrze w pisaniu kodów i „dłubaniu przy komputerze” to dobrze trafiłeś. Rozwiąże Twój problem i z chęcią stworzę dla Ciebie automatyzację, która oszczędzi Tobie godziny powtarzalnej pracy, którą codziennie wykonujesz.
Mój Ostatni Prywatny Projekt
Jakiś czas temu wpadłem na pomysł, aby stworzyć portal o ciekawostkach, ale w języku angielskim. Ciekawostki ze świata, historyczne, fun facty itp. Tak powstało:
FACTANDFUN.COM
Pisanie artykułów zabiera masę czasu, a mam go bardzo mało ze względu na dużą liczbę zleceń. Pomyślałem, że jako pasjonat sztucznej inteligencji i automatyzacji mogę potraktować tą stronę jak piaskownicę i przetestować automatyzację wpisów blogowych w WordPressie.
Wtedy pomyślałem: „Skoro AI potrafi pisać, a narzędzia typu n8n potrafią automatyzować… to może da się to połączyć?”
I tak powstał system, który:
- ✅ Automatycznie generuje tematy artykułów (bez powtórek)
- ✅ Przeprowadza research w internecie
- ✅ Pisze kompletne artykuły z optymalizacją SEO
- ✅ Tworzy grafiki AI dopasowane do treści
- ✅ Publikuje na WordPress z tagami i kategoriami
- ✅ Działa 24/7 bez mojego udziału
Rezultat? Nie opublikowałem ręcznie ani jednego artykułu od dłuższego czasu. System robi to za mnie kiedy go odpalę. Obecnie włączam go sporadycznie w celu ulepszenia workflow i obserwacji zmian. Natomiast niebawem chciałbym go zautomatyzować w 100%.
W tym artykule pokażę Ci dokładnie jak to zbudowałem – krok po kroku, bez tajemnic, razem z kosztami i problemami które napotkałem po drodze. Nie zamieszczam wszystkich nodów w pełnej długości, ponieważ są zbyt rozbudowane, ale pokażę workflow i sposób myślenia na których możecie się wzorować.

Dlaczego w Ogóle Zacząłem Automatyzować?
Problem: Content Marketing Jest Niesamowicie Czasochłonny
Prowadząc stronę o ciekawostkach i faktach, musiałbym:
- Wymyślać tematy (30 min) – co ciekawego napisać dziś?
- Research (60 min) – szukanie źródeł, faktów, danych
- Pisanie artykułu (90 min) – 1000-1500 słów z optymalizacją SEO
- Tworzenie grafiki (30 min) – featured image w Canva
- Publikacja (15 min) – formatowanie, tagi, kategorie
Razem: 3-4 godziny na JEDEN artykuł.
A chciałem publikować regularnie – przynajmniej 10 artykułów dziennie, a najlepiej więcej.
Próby Rozwiązania (które nie zadziałały)
Próbowałem:
- ❌ Outsourcing do copywriterów – drogie (50-150 zł/artykuł) i niska jakość
- ❌ ChatGPT w przeglądarce – trzeba było ręcznie kopiować, formatować, publikować
- ❌ WordPress Auto-Post pluginy – generowały śmieci, nie było kontroli
Moment „Eureka”
Wtedy pomyślałem o n8n – narzędzie do automatyzacji workflow (jak Zapier, ale dużo potężniejsze i self-hosted).
I pomyślałem: „Co jeśli połączę n8n + Claude AI + Brave Search + Google Sheets + Replicate + WordPress API?”
Okazało się że to możliwe.
Architektura Systemu: Jak To Działa?
Zanim wejdę w szczegóły techniczne, zobaczmy big picture.

Komponenty Systemu
- n8n (self-hosted) – „mózg” systemu, workflow automation
- Claude AI API (Anthropic) – generowanie treści
- Brave Search API – research i wyszukiwanie faktów
- Replicate API – generowanie grafik AI (FLUX model)
- WordPress REST API – automatyczna publikacja
- Google Sheets – tracking i monitoring
Jak To Wygląda w Praktyce?
[Schedule: co 30 min]
↓
[Wybierz najmniej używaną kategorię z Google Sheets]
↓
[Pobierz ostatnie tytuły artykułów z tej kategorii]
↓
[Wygeneruj 3 losowe search queries dla tej kategorii]
↓
[Brave Search - zbierz research (3x parallel)]
↓
[Format Search Results → połącz wyniki]
↓
[Claude Stage 1: Zaproponuj unikalny temat]
↓
[Parse Topic Response → wyciągnij JSON]
↓
[Check Topic Uniqueness → porównaj z istniejącymi]
↓
[Claude Stage 2: Deep Research → pogłębiony analysis]
↓
[Parse Research Response → wyciągnij structured data]
↓
[Claude Stage 3: Write Article → pełny artykuł + SEO + image metadata]
↓
[Parse Article Response → validate + extract]
↓
[Prepare Image Data → metadata z fallbacks]
↓
[Replicate: Generate Image → FLUX model]
↓
[Upload to WordPress Media Library]
↓
[Update Image Metadata → alt, title, caption, description]
↓
[Extract Article Data → prepare WP payload]
↓
[Publish to WordPress → categories + tags]
↓
[Log to Google Sheets → tracking]
↓
[Update Category Last Used → rotation]
Co 30 minut ten cykl się powtarza. 48 razy dziennie = 1 artykuł na 30 minut.
Faza 1: System Rotacji Kategorii i Unikania Duplikatów
Problem: Powtarzające Się Tematy
Na początku miałem problem – AI generowało ciągle artykuły o tym samym (np. 5 artykułów o ośmiornicach w ciągu tygodnia).
Rozwiązanie: Category Rotation + Uniqueness Checking
Krok 1: Google Sheets z Kategoriami
Stworzyłem arkusz z rotacją kategorii:

Krok 2: Wybór Najmniej Używanej Kategorii
n8n automatycznie wybiera kategorię która była najdawniej użyta:
const items = $input.all();
// Znajdź najstarszą datę "Last Used"
let selectedItem = null;
let oldestDate = new Date();
for (const item of items) {
const lastUsed = item.json['Last Used'];
// Priorytet: puste "Last Used"
if (!lastUsed || lastUsed === '') {
selectedItem = item;
break;
}
const date = new Date(lastUsed);
if (date < oldestDate) {
oldestDate = date;
selectedItem = item;
}
}
return {
json: {
mainCategory: selectedItem.json['Main Category'],
subcategory: selectedItem.json['Subcategory'],
wpCategoryId: selectedItem.json['WP Category ID'],
wpSubcategoryId: selectedItem.json['WP Subcategory ID'],
rowNumber: selectedItem.json['row_number']
}
};
Krok 3: Pobierz Istniejące Tytuły z Google Sheets
Zamiast odpytywać WordPress API za każdym razem, system pobiera listę istniejących artykułów z Google Sheets:
Google Sheets node konfiguracja:
- Document: [Twój arkusz tracking]
- Sheet: „Articles”
- Operation: Get Row(s)
- Range: A:D (kolumny z datą, kategorią, tytułem)
Dlaczego Google Sheets zamiast WordPress?
- ✅ Szybsze – cache w Sheets vs. database query w WP
- ✅ Bardziej niezawodne – nie obciąża WordPress API
- ✅ Dodatkowe metadata – data publikacji, status, kategoria
- ✅ Łatwy monitoring – widzisz wszystko w jednym miejscu
Każdy opublikowany artykuł jest automatycznie logowany do tego arkusza (ostatni krok workflow), więc baza tytułów jest zawsze aktualna.
Dzięki temu system sprawdza duplikaty tylko w ramach tej samej kategorii:
- ✅ Artykuł o algach w „Science” jest OK nawet jeśli był w „Food”
- ✅ Każda kategoria ma swoją „przestrzeń”
- ✅ Eliminacja fałszywych duplikatów
Krok 4: Similarity Checker – Unikanie Duplikatów
Po zaproponowaniu tematu przez Claude, system sprawdza czy nie jest zbyt podobny do istniejących artykułów w tej samej kategorii:
const proposedTopic = $input.first().json.proposed_topic.toLowerCase();
const category = $('Select Next Category').first().json;
// Pobierz artykuły tylko z tej kategorii
const allArticles = $('Get Existing Titles').all();
const categoryTitles = allArticles
.filter(item => {
const cats = item.json[0].toLowerCase();
return cats.includes(category.mainCategory.toLowerCase());
})
.map(item => item.json[1].toLowerCase());
// Wyciągnij kluczowe słowa (bez clickbait)
const getKeyWords = (text) => {
const stopWords = [
'the', 'and', 'shocking', 'mind', 'blowing',
'scientists', 'discovered', /* ... więcej */
];
return text
.split(/\s+/)
.filter(w => w.length > 3 && !stopWords.includes(w));
};
const proposedWords = getKeyWords(proposedTopic);
// Sprawdź podobieństwo
for (const title of categoryTitles) {
const titleWords = getKeyWords(title);
const commonWords = proposedWords.filter(w => titleWords.includes(w));
// 3+ wspólne słowa = za podobne
if (commonWords.length >= 3) {
throw new Error(`Too similar to: "${title}"`);
}
}return { json: $input.first().json };
Jak to działa:
- Ekstraktuje kluczowe słowa z zaproponowanego tematu (bez clickbait words)
- Porównuje z tytułami z tej samej kategorii
- Liczy wspólne słowa – jeśli 3+ słowa są takie same → REJECT
- Loguje podobieństwo – pokazuje najbardziej podobny artykuł
Faza 2: Zautomatyzowany Research z Brave Search
Dlaczego Research Jest Kluczowy?
Claude (jak każde AI) ma knowledge cutoff. Mój blog porusza aktualne tematy, więc potrzebuję świeżych danych.
Generowanie Search Queries
Dla każdej kategorii mam 15-25 różnych search queries, które są losowo wybierane przy każdym uruchomieniu workflow. To zapewnia maksymalną różnorodność researchu.
Node „Generate Search Queries” (Code):
const category = $('Select Next Category').item.json.subcategory;
// Helper - losuj queries
const getRandomQueries = (queries, count = 3) => {
return [...queries]
.sort(() => Math.random() - 0.5)
.slice(0, count);
};
// Query templates per category
const queryTemplates = {
'Animals': [
'animal communication vocalizations',
'endangered species conservation',
'animal intelligence cognition',
// ... 20 więcej queries
],
'History': [
'ancient civilizations discoveries',
'historical figures untold stories',
// ... 20 więcej
],
// ... więcej kategorii
};
const queries = queryTemplates[category] || [
`${category} recent discoveries`
];
const selected = getRandomQueries(queries, 3);
return {
json: {
query1: selected[0],
query2: selected[1],
query3: selected[2]
}
};
Dlaczego tyle queries dla każdej kategorii?
- ✅ Różne aspekty (np. Food: science, culture, health)
- ✅ Rotacja zapobiega powtarzalności
- ✅ Świeże perspektywy = unikalne artykuły
Split Into Items – Parallel Execution
Node „Split into Items” rozdziela 3 queries na osobne egzekucje dla równoległego wykonania:
const queries = $input.first().json;
return [
{ json: { query: queries.query1 } },
{ json: { query: queries.query2 } },
{ json: { query: queries.query3 } }
];
To pozwala n8n wykonać 3 requesty do Brave Search jednocześnie, oszczędzając czas.
Brave Search API
Używam Brave Search (nie Google) bo:
- ✅ Darmowe – 2,000 searches/miesiąc za darmo
- ✅ Tańsze po limicie – $3/1000 searches (vs. Google $5/1000)
- ✅ Bez limitów rate-limiting
- ✅ Świeże wyniki
- ✅ JSON API (łatwa integracja)
Konfiguracja Brave Search node:
- Method: GET
- URL:
https://api.search.brave.com/res/v1/web/search - Authentication: Header Auth (X-Subscription-Token)
- Query Parameters:
q:={{ $json.query }}count:10freshness:pm(past month – świeże wyniki)
Co zwraca Brave Search:
- Tytuły artykułów
- Descriptions (snippets)
- URLs (do cytowania)
- Dates (świeżość)
- Ranking (relevance)
Format Search Results
Po wykonaniu 3 parallel searches, node „Format Search Results” merguje i formatuje wyniki:
const items = $input.all();
const searchResults = [];
for (const item of items) {
const results = item.json.web?.results || [];
for (const result of results) {
searchResults.push({
title: result.title,
url: result.url,
description: result.description
});
}
}
return {
json: {
searchResults: searchResults,
totalResults: searchResults.length
}
};

Faza 3: 3-Stopniowy Pipeline Claude AI
To jest serce systemu. Zamiast jednego dużego prompta, podzieliłem generowanie na 3 etapy.

Etap 1: Topic Selection
Cel: Zaproponuj unikalny, ciekawy temat na podstawie researchu.
Node „Prepare Topic Prompt” (Code):
const category = $('Select Next Category').item.json;
const searchResults = $('Format Search Results').item.json.searchResults;
const existingTitles = $('Get Existing Titles').all()
.map(item => item.json[1])
.slice(0, 20); // Last 20 titles
const prompt = `You are a content strategist for FactAndFun.com.
CATEGORY: ${category.subcategory}
RESEARCH DATA:
${JSON.stringify(searchResults, null, 2)}
EXISTING TITLES (avoid these):
${existingTitles.join('\n')}
TASK: Propose 1 unique, fascinating topic that:
- Is DIFFERENT from existing titles
- Uses research data
- Has high curiosity factor
- Is searchable (SEO-friendly)
RESPOND IN JSON:
{
"proposed_topic": "...",
"main_keyword": "...",
"uniqueness_explanation": "...",
"curiosity_hook": "..."
}`;
return {
json: {
model: "claude-sonnet-4-20250514",
max_tokens: 2000,
messages: [{ role: "user", content: prompt }]
}
};
Claude Response (przykład):
{
"proposed_topic": "Why Octopuses Have Blue Blood Defies Everything We Know",
"main_keyword": "octopus blue blood hemocyanin",
"uniqueness_explanation": "Different from existing 'marine biology' articles...",
"curiosity_hook": "Blue blood? Most people don't know this exists..."
}
Następnie node „Parse Topic Response” wyciąga JSON z odpowiedzi Claude:
const response = $input.first().json;
const content = response.content[0].text;
// Usuń markdown fences
let cleaned = content.replace(/```json\n?/g, '').trim();
const topicData = JSON.parse(cleaned);
return { json: topicData };
Potem następuje „Check Topic Uniqueness” (kod pokazany w Fazie 1).
Etap 2: Deep Research
Cel: Pogłębiony research na zatwierdzony temat.
Node „Prepare Research Prompt” (Code):
const topicData = $('Parse Topic Response').item.json;
const searchResults = $('Format Search Results').item.json.searchResults;
const prompt = `APPROVED TOPIC:
Title: ${topicData.proposed_topic}
Keyword: ${topicData.main_keyword}
TASK: Conduct comprehensive research for a 1000-1500 word article.
RESEARCH AREAS:
1. Core Facts & Data (statistics, dates, findings)
2. Context & Background (why this matters)
3. Interesting Details (surprising angles)
4. Credible Sources (academic, news, experts)
5. SEO Elements (related keywords, questions)
SOURCES:
${searchResults.map(r => `${r.title} - ${r.url}`).join('\n')}
RESPOND IN JSON:
{
"core_facts": [...],
"background_context": "...",
"interesting_angles": [...],
"key_sources": [...],
"seo_keywords": {...},
"outline": [...]
}`;
return {
json: {
model: "claude-sonnet-4-20250514",
max_tokens: 8000,
messages: [{ role: "user", content: prompt }]
}
};
Claude zwraca structured research data, który jest parsowany przez „Parse Research Response” (analogiczny kod do Stage 1).
Etap 3: Writing Article + SEO + Image Metadata
Cel: Napisz kompletny, gotowy do publikacji artykuł.
To najważniejszy prompt w całym systemie. Pełen kod znajdziesz w załączonym dokumencie, ale oto kluczowe fragmenty:
Node „Prepare Article Prompt” (Code) – fragment:
const topicData = $('Parse Topic Response').item.json;
const researchData = $('Parse Research Response').item.json;
const prompt = `You are a professional content writer for FactAndFun.com.
APPROVED TOPIC: ${topicData.proposed_topic}
MAIN KEYWORD: ${topicData.main_keyword}
RESEARCH DATA:
${JSON.stringify(researchData, null, 2)}
TASK: Write complete article in HTML with DIVERSE clickbait title.
🔥 TITLE REQUIREMENTS:
- Use category-appropriate formula (History → historical, Animals → animal)
- ROTATE formulas (avoid "Scientists Just Discovered..." repeatedly)
- 50-70 characters, include main keyword
- Create curiosity gap
WRITING GUIDELINES:
- Style: Informative, engaging, accessible
- Hook: Start with shocking fact/question
- Structure: Intro + 4-6 H2 sections + Conclusion
- SEO: 1-2% keyword density, 3-5 external links
- Length: 1000-1500 words
🖼️ IMAGE METADATA (5 DIFFERENT FIELDS):
1. image_prompt - Technical for AI generation (150-250 chars)
2. image_alt_text - SEO + accessibility (MAX 125 chars, include keyword)
3. image_title - File naming (MAX 60 chars)
4. image_caption - SHORT, punchy for readers (MAX 100 chars)
5. image_description - LONG, educational (150-200 chars)
CRITICAL: caption SHORT (80-100), description LONG (150-200), both DIFFERENT!
RESPOND IN JSON:
{
"title": "...",
"meta_description": "...",
"html_content": "
…
...",
"main_keyword": "...",
"tags": [...],
"word_count": 1250,
"image_prompt": "...",
"image_alt_text": "...",
"image_title": "...",
"image_caption": "...",
"image_description": "..."
}`;
return {
json: {
model: "claude-sonnet-4-20250514",
max_tokens: 16000,
messages: [{ role: "user", content: prompt }]
}
};
JSON Response (przykład):
{
"title": "Why Octopuses Have Blue Blood Defies Everything We Know",
"meta_description": "Octopuses use copper-based hemocyanin...",
"html_content": "<p>Hook...</p><h2>Section 1</h2>...",
"main_keyword": "octopus blue blood hemocyanin",
"tags": ["science", "marine-biology", "animals"],
"word_count": 1247,
"image_prompt": "Photorealistic underwater macro shot...",
"image_alt_text": "Octopus tentacle showing blue blood...",
"image_title": "Octopus Blue Blood Hemocyanin",
"image_caption": "Blue hue from copper-based hemocyanin",
"image_description": "Detailed view of octopus blood colored by hemocyanin, copper-based oxygen carrier evolved for cold ocean depths..."
}
Node „Parse Article Response” (Code):
const response = $input.first().json;
let content = response.content[0].text;
// Clean JSON
let clean = content.trim().replace(/```json\n?/g, '');
const article = JSON.parse(clean);
// Validate required fields
const required = [
'title', 'html_content', 'main_keyword', 'tags',
'image_prompt', 'image_alt_text', 'image_title',
'image_caption', 'image_description'
];
for (const field of required) {
if (!article[field]) {
console.warn(`⚠️ Missing: ${field}`);
}
}
console.log('✅ ARTICLE PARSED');
console.log('Title:', article.title);
console.log('Word count:', article.word_count);
console.log('Tags:', article.tags.length);
return { json: article };

Faza 4: Generowanie Grafik AI z Replicate
Dlaczego AI Images?
Szukanie stock photos zabiera czas. AI generuje custom grafiki dopasowane idealnie do treści.
Replicate + FLUX Model
Używam FLUX.1-schnell przez Replicate API:
Dlaczego FLUX?
- ✅ Szybki (5-10 sekund)
- ✅ Fotorealistyczny
- ✅ Dobry z tekstem i szczegółami
- ✅ Tani ($0.003/image)
Prepare Image Data – Smart Fallbacks
Przed wygenerowaniem obrazu, system przygotowuje metadata z inteligentnymi fallbackami:
Node „Prepare Image Data” (Code):
const article = $input.first().json;
// Use Claude metadata with fallbacks
const altText = article.image_alt_text ||
`Image: ${article.main_keyword}`;
const titleText = article.image_title ||
article.title.substring(0, 60);
let caption = article.image_caption ||
`Visual: ${article.main_keyword}`;
let description = article.image_description ||
article.meta_description;
// Fix placeholders
if (caption.includes('#image')) {
caption = `Visual insight: ${article.main_keyword}`;
}
// Fix if identical
if (caption === description && description.length > 100) {
caption = description.split('.')[0].trim();
}
// Smart truncation na kompletnym zdaniu
if (description.length > 195) {
const truncated = description.substring(0, 195);
const lastPeriod = truncated.lastIndexOf('.');
if (lastPeriod > 150) {
description = description.substring(0, lastPeriod + 1);
}
}
return {
json: {
image_prompt: article.image_prompt,
alt_text: altText.substring(0, 125),
title_text: titleText.substring(0, 60),
caption: caption.substring(0, 150),
description: description
}
};
Generate Image z Replicate
Node „Prepare Image Request” (Code):
const article = $input.first().json;
const imagePrompt = article.image_prompt;
return {
json: {
version: "5599ed30...", // FLUX schnell version ID
input: {
prompt: imagePrompt,
num_outputs: 1,
aspect_ratio: "16:9",
output_format: "jpg",
output_quality: 90
}
}
};
Replicate HTTP Request node:
- Method: POST
- URL:
https://api.replicate.com/v1/predictions - Authentication: Bearer Token
- Body: JSON z góry

Upload do WordPress Media Library
Po wygenerowaniu obrazu, system uploaduje go do WordPress:
WordPress HTTP Request node:
- Method: POST
- URL:
https://factandfun.com/wp-json/wp/v2/media - Authentication: Basic Auth (WordPress credentials)
- Body: Binary image data
- Headers:
Content-Disposition: attachment; filename="image.jpg"Content-Type: image/jpeg
WordPress zwraca media ID, który jest używany jako featured_media w artykule.
Update Image Metadata
Po uploadzie, system aktualizuje metadata obrazu w WordPress:
WordPress HTTP Request node:
- Method: POST
- URL:
https://factandfun.com/wp-json/wp/v2/media/{{ $json.id }} - Body JSON:
{ "alt_text": "{{ $('Prepare Image Data').item.json.alt_text }}", "title": "{{ $('Prepare Image Data').item.json.title_text }}", "caption": "{{ $('Prepare Image Data').item.json.caption }}", "description": "{{ $('Prepare Image Data').item.json.description }}" }

Faza 5: Publikacja na WordPress
Extract Article Data
Przed publikacją, system przygotowuje payload dla WordPress API:
Node „Extract Article Data” (Code):
const articleData = $('Parse Article Response').first().json;
const categoryData = $('Select Next Category').first().json;
const imageId = $input.first().json.id;
const categories = [categoryData.wpCategoryId];
if (categoryData.wpSubcategoryId) {
categories.push(categoryData.wpSubcategoryId);
}
return {
json: {
title: articleData.title,
content: articleData.html_content,
excerpt: articleData.meta_description,
status: "publish",
featured_media: imageId,
categories: categories,
tags_input: articleData.tags,
author: 2 // Editor, nie Admin!
}
};
WordPress REST API – Publikacja
WordPress ma świetne API. Publikacja = jeden POST request:
WordPress HTTP Request node:
- Method: POST
- URL:
https://factandfun.com/wp-json/wp/v2/posts - Authentication: Basic Auth (username: Editor, nie Admin!)
- Body: JSON z góry
Przykładowy request:
POST /wp-json/wp/v2/posts
{
"title": "Why Octopuses Have Blue Blood...",
"content": "<p>HTML content...</p>",
"excerpt": "Octopuses use copper-based...",
"status": "publish",
"featured_media": 1234,
"categories": [5, 12],
"tags_input": ["science", "marine-biology"],
"author": 2
}

Log to Google Sheets
Na końcu, system loguje opublikowany artykuł do Google Sheets:
Google Sheets node:
- Operation: Append Row
- Sheet: „Articles”
- Data:
- Date:
{{ $now }} - Title:
{{ $('Parse Article Response').item.json.title }} - Category:
{{ $('Select Next Category').item.json.subcategory }} - URL:
{{ $json.link }} - Status: „Published”
- Date:
Update Category Last Used
Ostatni krok – zaktualizuj datę „Last Used” w arkuszu rotacji kategorii:
Google Sheets node:
- Operation: Update Row
- Sheet: „Categories”
- Row Number:
{{ $('Select Next Category').item.json.rowNumber }} - Column: „Last Used”
- Value:
{{ $now.format('YYYY-MM-DD') }}
To zamyka pętlę – następnym razem ta kategoria będzie na końcu kolejki.

Problemy Które Napotkałem (i Jak Je Rozwiązałem)
Problem 1: Strona Zamuliła Się Po Dodaniu Posta
Objaw: WordPress ładował się 30+ sekund, czasem 504 timeout.
Przyczyna: Konto Administrator triggerowało ciężkie operacje (rebuilding cache, notifications, etc.).
Rozwiązanie: Użyj konta Editor zamiast Admin!
// WordPress credentials w n8n
username: "n8n-publisher" // ← Editor, NIE Admin
role: "Editor"
Po tej zmianie: strona działa szybko, zero problemów.
Problem 2: Caption i Description Były Identyczne
Objaw: WordPress zapisywał to samo w obu polach, co psuje SEO.
Przyczyna: Claude czasem generował identyczne wartości lub placeholder #image_title.
Rozwiązanie: Dodaj wykrywanie placeholderów + smart differentiation:
// W "Prepare Image Data"
if (caption === '#image_title' || caption.includes('#image')) {
caption = `Visual insight: ${article.main_keyword}`;
}
if (caption === description && description.length > 100) {
const firstSentence = description.split('.')[0];
caption = firstSentence.trim();
}
Problem 3: Claude Powtarzał Te Same Style Tytułów
Objaw: 10 artykułów zaczynało się od „Scientists Just Discovered…”
Rozwiązanie: Dodałem do prompta:
- 15+ różnych title formulas per category
- Explicit rotation rules
- Warning: „NEVER use 'Scientists Just Discovered…’ more than once per 10 articles”
- Category-specific formulas (History → historical style, Animals → animal style)
Efekt: Teraz tytuły są znacznie bardziej zróżnicowane.
Problem 4: Brave Search Czasem Zwracał Mało Wyników
Objaw: Dla rzadkich tematów tylko 2-3 wyniki zamiast 10.
Rozwiązanie: Dodaj fallback queries + broader search terms:
// W "Generate Search Queries"
const queries = queryTemplates[category] || [
`${category} recent discoveries`,
`${category} fascinating facts`,
`${category} scientific research`
];
Koszty: Ile To Wszystko Kosztuje?
Transparentnie – oto realne koszty mojego systemu:
Koszty Per Artykuł

Rezultaty i MetrykiProdukcja Contentu
- Artykuły/dzień: 48 (co 30 min)
- Artykuły/miesiąc: ~1440
- Czas mojej pracy: 0 (tylko monitoring i ulepszenia)
- Uptime: 99.8% (pojedyncze błędy API)
Jakość Contentu
- Word count: 1000-1500 słów/artykuł
- SEO score: 75+/100 (All in One SEO)
- Originality: Każdy artykuł unikalny (similarity checker)
- Readability: Flesch Reading Ease ~60-70
Wyzwania
- ~2-3% artykułów wymaga ręcznej edycji (drobne błędy faktyczne)
- ~1% obrazów jest off-topic (AI hallucination w Replicate)
- Czasem Brave Search zwraca mało wyników (rzadkie tematy)
- Konieczność monitorowania kosztów API (szczególnie Claude)
Jak Możesz To Zbudować? (Przewodnik Krok po Kroku)Wymagania WstępneUmiejętności:
- ✅ Podstawowa znajomość WordPress
- ✅ Umiejętność czytania JSON
- ✅ Gotowość do eksperymentowania
- ❌ NIE musisz umieć programować
Narzędzia:
- n8n (self-hosted lub cloud)
- WordPress blog
- Claude API key (Anthropic)
- Brave Search API key
- Replicate API key
- Google Sheets (do trackingu)
Krok 1: Setup n8nOpcja A: Self-hosted(docker) (tańsze, więcej kontroli)
Opcja B: n8n Cloud (łatwiejsze, $20/mo)Zarejestruj się na n8n.io i masz gotowe środowisko.Krok 2: Załóż API Keys
- Claude AI: https://console.anthropic.com
- Model: claude-sonnet-4-20250514
- Limit: $100-200/mo (w zależności od skali)
- Brave Search: https://brave.com/search/api/
- Free tier: 2,000 searches/miesiąc
- Paid: $5/1000 dodatkowych
- Replicate: https://replicate.com
- FLUX model: ~$0.003/image
- Pay-as-you-go
Krok 3: Zbuduj Workflow w n8nStart małym prototypem:
- Schedule trigger (co 30 min)
- Select category from Google Sheets
- Generate 1 search query
- Brave Search
- Claude: Generate topic
- Claude: Write article
- Publish to WordPress
Potem dodawaj kolejne warstwy:
- Uniqueness checking
- 3-stage Claude pipeline
- Image generation
- Metadata handling
- Error handling i logging
Krok 4: Testuj i IterujNie oczekuj perfekcji od razu! Mój system powstawał przez kilka tygodni iteracji:
- Tydzień 1: Podstawowy workflow (publish działa)
- Tydzień 2: Similarity checker + category rotation
- Tydzień 3: 3-stage Claude + image metadata
- Tydzień 4+: Bug fixing, optimization, monitoring
Krok 5: Monitoruj i UlepszajCo monitoruję:
- Google Sheets: Każdy opublikowany artykuł
- n8n execution logs: Errory i performance
- WordPress: Czy artykuły wyglądają OK
- Koszty API: Tracking w Anthropic/Replicate dashboard
Najczęstsze PytaniaCzy To Legalne?TAK. Używasz API zgodnie z Terms of Service:
- ✅ Claude API pozwala na commercial use
- ✅ WordPress REST API jest publiczne
- ✅ Generujesz original content (nie kopiujesz)
Czy To Nie Jest Spam?NIE, jeśli:
- ✅ Content jest wartościowy i unikalny
- ✅ Publikujesz na swoim blogu (nie spam innych)
- ✅ Masz disclosure (opcjonalne: „Content assisted by AI”)
Co z Google i SEO?Google oficjalnie mówi: „AI-generated content is OK if it’s helpful.”Klucz: Content musi być:
- ✅ Unikalny (nie duplicate)
- ✅ Wartościowy (nie thin content)
- ✅ Faktycznie poprawny (fact-checked)
Mój blog nie został ukarany przez Google. Wręcz przeciwnie – traffic rośnie stabilnie.
Podsumowanie: Czy Warto?Dla Kogo To Ma Sens?✅TAK, jeśli:
- Prowadzisz blog treściowy (facts, how-to, listicles)
- Potrzebujesz regularnego contentu
- Masz budżet $200-300/mo
- Lubisz automation i eksperymenty
- Możesz zainwestować czas w setup (2-3 tygodnie)
❌NIE, jeśli:
- Piszesz personal blog (opinie, doświadczenia)
- Content wymaga deep expertise (medycyna, prawo)
- Nie masz czasu na setup i monitoring
- Budżet <$100/mo
- Oczekujesz 100% perfekcji bez nadzoru
Moja PerspektywaNie jestem programistą. Nie mam wykształcenia technicznego. Jestem fanem sztucznej inteligencji który:
- Lubi automatyzację
- Nie boi się eksperymentować
- Umie czytać dokumentację
- Ma cierpliwość do debugowania
I zbudowałem system który działa.Nie chcę udawać że to proste – spędziłem dziesiątki godzin na troubleshootingu, czytaniu API docs, i testowaniu promptów.Ale:
- ✅ Nie musiałem pisać ani linii „prawdziwego” kodu (poza JavaScript snippets w n8n)
- ✅ Wszystko to visual programming (drag & drop nodes)
- ✅ Korzystałem z gotowych API i narzędzi
- ✅ Claude pomógł mi z większością problemów
Chcesz To Dla Siebie?💼 Custom Setup (Done-For-You)Zbuduję dla Ciebie custom automation system:
- ✅ Konsultacja (60 min) – zrozumienie Twoich potrzeb
- ✅ Custom workflow setup w n8n
- ✅ Integracja z Twoim WordPress
- ✅ Prompt engineering dla Twojej niszy
- ✅ Category rotation setup
- ✅ 30 dni support po wdrożeniu
Cena: Indywidualna wycena (zależnie od złożoności i skali)👉 KONTAKT: kontakt@zacznijodzera.pl
Inne AutomatyzacjeTo jedna z wielu automatyzacji, które tworzyłem. Przedstawiłem Wam realny przykład, który sam wdrożyłem i który działa. Pamiętaj że finalne workflow musi być dostosowane do Ciebie i do Twoich potrzeb – nie ma jednego uniwersalnego rozwiązania.Skontaktuj się ze mną, jeżeli chcesz zaoszczędzić czas. W perspektywie miesięcy to spora oszczędność, którą możesz wykorzystać na inne realizacje, rodzinę czy odpoczynek.
Końcowe MyśliAutomatyzacja contentu to nie jest „ściema” ani „oszukiwanie systemu”.To po prostu leveraging dostępnych narzędzi żeby robić więcej, szybciej, i lepiej.Kiedyś copywriterzy pisali na maszynach. Potem przyszły komputery. Potem internet. Teraz AI.Każda nowa technologia była krytykowana. „To zabierze pracę!” „To obniży jakość!”Ale prawda jest taka: technologia zmienia JAK pracujemy, nie CZY pracujemy.Mój system nie zastąpił mnie. Pozwolił mi skupić się na strategii, dystrybucji, rozwoju biznesu.Content to już nie bottleneck. Mogę eksperymentować, testować, skalować.I Ty też możesz.
Pytania? Skomentuj poniżej lub napisz: kontakt@zacznijodzera.plPS: Tak, ten artykuł był pisany przez człowieka z pomocą Claude. Claude pomógł mi z research, strukturą i kodem, ale każde słowo przeszło przez moje ręce i sprawdzenie. Ironic, isn’t it? 😉
Zobacz również: AI dla początkujących – kompletny przewodnik [2026]



Dodaj komentarz