cd /news/developer-tools/turn-one-devlog-into-posts-for-every… · home topics developer-tools article
[ARTICLE · art-58521] src=dev.to ↗ pub= topic=developer-tools verified=true sentiment=↑ positive

Turn one devlog into posts for every channel with n8n + AI

A solo game developer automated social media posting by building an n8n workflow that uses Google Gemini to rewrite a single devlog into drafts for Twitter, Reddit, Discord, and a newsletter, saving them to Notion for manual review. The workflow runs locally via Docker and outputs structured JSON drafts, keeping the process authentic and compliant with each platform's rules.

read3 min views1 publishedJul 14, 2026

If you're a solo game developer, you know the drill: you ship an update, write a devlog… and then you have to rewrite it four times. A punchy tweet. A longer Reddit post that doesn't sound like an ad. A casual Discord ping. A newsletter blurb. By the third rewrite you've lost the will to post at all.

I automated the rewriting with n8n, Google Gemini, and Notion. I write the devlog once, hit run, and get channel-ready drafts waiting in Notion. It doesn't auto-post, it makes drafts I review and send myself, which keeps everything authentic and inside each platform's rules.

Here's a short demo of the finished workflow:

👉 https://www.loom.com/share/f108f0a003b448b2bc414a8be742d772

For one devlog you paste in, it:

The flow looks like this:

Manual Trigger
  → Devlog Input
  → AI Reformat (Gemini)
  → Parse Drafts
  → Save Drafts to Notion
docker volume create n8n_data

docker run -d --name n8n \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  docker.n8n.io/n8nio/n8n

Open http://localhost:5678 and create your account.

Add a Code node where you write your update once. Keeping it in a Code node means you just edit two variables each time:

const devlog_title = "Update 0.3 — Online Co-op";
const devlog_body = `We just shipped online co-op for up to 4 players,
fixed the save-corruption bug, and added 2 new levels.
Next up: controller support and a Steam demo.`;

return [{ json: { devlog_title, devlog_body } }];

(Later you can swap this for a Form Trigger so you get a little web form, or a Notion Trigger that fires when you add a devlog page.)

Add the Google Gemini node. The trick is to make it return strict JSON so the next node can split it cleanly:

You are a social media manager for a solo indie game developer.

Here is a devlog update:
Title: {{ $json.devlog_title }}
Body: {{ $json.devlog_body }}

Rewrite it for each channel. Return ONLY valid JSON (no markdown,
no code fences, no text outside the JSON) with these exact keys:
{
  "twitter": "280 characters max, punchy, 1-2 relevant hashtags",
  "reddit": "friendly longer post for r/IndieDev, first person, no hashtags, no hard selling",
  "discord": "casual short announcement for a community server, 1-2 emojis ok",
  "newsletter": "2-3 sentence email blurb"
}

LLMs sometimes wrap JSON in code fences, so a small Code node cleans and parses it, with a fallback so you never lose output:

const raw = ($json.content?.parts?.[0]?.text) || "";

// \x60 is a backtick (char code 96). This strips a code fence
// if the model wraps its JSON output in one.
let clean = raw.trim()
  .replace(/^\x60{3}json\s*/i, "")
  .replace(/^\x60{3}\s*/, "")
  .replace(/\x60{3}$/, "")
  .trim();

let parsed;
try {
  parsed = JSON.parse(clean);
} catch (e) {
  parsed = { twitter: "", reddit: raw, discord: "", newsletter: "" };
}

const input = $('Devlog Input').item.json;

return [{
  json: {
    devlog_title: input.devlog_title,
    twitter: parsed.twitter || "",
    reddit: parsed.reddit || "",
    discord: parsed.discord || "",
    newsletter: parsed.newsletter || "",
  }
}];

Create a Notion database called Devlog Drafts with these properties: Name (title), Twitter (text), Reddit (text), Discord (text), Newsletter (text), Status (text), Created (date).

Create an internal integration at notion.so/my-integrations, connect it to the database, then map the fields in n8n's Notion node. Set the title to {{ $json.devlog_title }}

and each channel field to its matching value ({{ $json.twitter }}

, etc.).

Run the workflow and you'll get a new row with four drafts - review, tweak, and post whenever you like.

I packaged this, plus a Steam competitor-tracking workflow - into an importable pack with setup guides, the AI prompts, troubleshooting, and example screenshots:

👉 https://shrisab.gumroad.com/l/indie-launch-ops/LAUNCH

Either way, write the devlog once, and stop dreading the four rewrites. Questions welcome in the comments.

── more in #developer-tools 4 stories · sorted by recency
── more on @n8n 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
Live at https://your-agent.zahid.host
Get free account → Pricing
from €0/mo · no card required
LIVE [news/turn-one-devlog-into…] indexed:0 read:3min 2026-07-14 ·