
I write for my own blog, post on LinkedIn and Facebook, run a YouTube channel, and plan blog and LinkedIn content for two client brands. That is seven content streams, and for a long time the plan for all of them lived in a mix of spreadsheets, notes apps and my own head. These days it all lives in Nextcloud Deck.
What fixed it was not a new SaaS subscription. It was Deck, a kanban app that was already sitting on my self-hosted Nextcloud, plus an AI agent that can read and write cards on it. This post covers how the boards are set up, how the AI plugs in, the one rule that stops the whole thing turning into a mess, and the gotchas I hit along the way.
Want a content planning setup like this?
If you want help setting up Nextcloud Deck, connecting AI to your content planning, or building AI workflows for your marketing, I am happy to talk it through.
Email me Know more about meWhat Nextcloud Deck is
Nextcloud Deck is a free, open source kanban board that runs inside Nextcloud. If you have used Trello, you already know how it works: boards, columns (Deck calls them stacks), and cards you drag between them. Cards have descriptions in Markdown, labels, due dates, assignees, comments and attachments, and there are mobile apps for checking the board on the go.
The difference from Trello is where it lives. Deck runs on your own server, alongside your files, calendar and contacts. Nobody else holds the data, there is no per-seat bill, and there is a REST API you can point your own tools at.
Why Nextcloud Deck instead of Trello, Notion or ClickUp
I looked at the usual content planning tools before settling on this. Notion is flexible but I end up building a database for every small job. ClickUp does everything, which is the problem: content planning should take less effort than the content. Trello is the closest match, but if you want a self-hosted Trello alternative, you are choosing between projects you have to install and maintain separately.
I already ran Nextcloud. Deck was one click away in the app store, it is simple enough that I actually use it, and its API is open. For a solo operator that combination beats a better-funded product I would have to pay for and still could not fully automate.
The board structure
I keep one board per brand and channel:
- Reuben – Blog Ideas
- Reuben – Social Media Ideas
- Reuben – YouTube Ideas
- BoomSoftware – Blog Ideas
- BoomDisplay – Blog Ideas
- BoomSoftware – LinkedIn Articles
- BoomDisplay – LinkedIn Articles
Splitting by channel rather than by month matters. A blog post, a LinkedIn article and a YouTube video on the same idea need different angles, different keyword work and different formats. One board per channel keeps each list honest about what it actually needs.
Three columns, everywhere
Every board has the same three stacks: Ideas, In Progress and Completed.
I tried more. Drafting, Review, Scheduled, Published. In practice, cards sat in the wrong column because moving them was one more job, and the board stopped telling the truth. With three columns there is only one decision to make: am I working on this or not? It is the same lesson that came up again and again when I wrote about marketing mistakes to avoid: taking things out usually helps more than adding them.
The Ideas column is a backlog, not a commitment. When I pick something to write, I drag it to In Progress. That drag is also the signal for the next step, which I will come back to.
What goes on a card
A card is not just a title. Every blog card carries the same small table at the top:
| Field | What it holds |
|---|---|
| Primary keyword | The one search term the post targets |
| Secondary keyword | A second term the post can also rank for |
| Supporting keywords | Phrases to work into headings and copy |
| Slug and full URL | Decided before writing, not after |
| SEO title tag | With the character count |
| Meta description | With the character count |
Below that sits an outline and a line on why the topic is worth doing. When it is time to write, the brief is already there. When the post is done, the card holds the draft too.
Connecting AI to the boards
This is where it gets useful. I wanted an AI agent to do the slow part of content planning: coming up with ideas grounded in what I actually work on, and doing the keyword legwork, without me copying and pasting between windows.
The setup has three pieces:
- An app password in Nextcloud, so the agent never touches my main login and I can revoke it on its own.
- The Deck REST API, which exposes boards, stacks, cards and labels over plain HTTP.
- A small MCP server. MCP (Model Context Protocol) is the standard Claude uses to talk to outside tools. I wrote a lightweight server in TypeScript that wraps the Deck API in a handful of tools: list boards, get a board, create, update, move and archive cards, create labels and apply them.
Once that is registered, I can ask Claude in plain English to “add ten blog ideas to my blog board based on what I have been working on this month” and it reads the board, checks what is already there, and writes the new cards in the same format as mine.
The rule that makes it work: label every AI idea
The first thing I set up after connecting the AI was a purple label called Claude idea, on every board. Every card the agent creates gets it. My own cards never do.
That sounds like a small thing. It is the reason the system works. Without it, after two or three sessions I could no longer tell which ideas came from me and which came from the machine, and I stopped trusting the board. With the label, I can filter the AI ideas in one click, judge them as a batch, and keep my own thinking separate.
If you take one thing from this post, take that. Whatever AI you connect to your content planning, mark its output.
Grounding the ideas in real data
Generic AI topic lists are useless. “10 Content Marketing Tips for 2026” is not an idea, it is filler.
What made the ideas worth keeping was what the agent had access to. Because the same agent is also connected to my CRM and my existing content plans, it could pull ideas from real things: the cold email campaign that sent 1,298 emails for one reply, link scanners faking unsubscribes in my campaign data, the prospecting workflow I run every week. Those are posts only I can write, because they come from my own numbers.
It also checks what is already published, so the Ideas column does not fill up with things I have already covered.
Picking keywords: why the AI shows options instead of choosing
The first time round, the agent filled in the keyword fields on every card itself. When I moved two cards to In Progress and asked for search volumes, the numbers told a story. On one card, the primary keyword it had guessed had no measurable search volume at all. Nobody searches for it. It read like a keyword, but it was not one.
So the step changed. When I move a card to In Progress, the agent now pulls a list of real keyword options from Ubersuggest with monthly volume and SEO difficulty, adds it to the card as a table, and recommends a pick. I make the final call. For this post, that meant “nextcloud deck” as the primary keyword (1,900 searches a month) and “content planning tools” as the secondary.
The lesson is general: let AI do the research, but keep the decisions where you can see them.
What I kept and what I binned
Not every AI idea survives. Roughly, the ones I keep are those tied to something I have done and can show. The ones I bin are the ones that would need me to pretend to an expertise I do not have, or that duplicate a post I have already written under a different title.
Even the ideas I keep usually need a human edit to the angle. The agent is good at spotting that a topic exists. It is less good at knowing which part of it is interesting to my readers. That edit is my job, and it takes a minute per card rather than an hour per brainstorm.
Gotchas if you build this yourself
A few things cost me time:
- Cloudflare blocking the API. My Nextcloud sits behind Cloudflare, which rejected requests from non-browser user agents such as Python’s default HTTP client. Sending a browser-style User-Agent header fixed it.
- The OCS-APIRequest header. Some Nextcloud endpoints refuse requests without
OCS-APIRequest: true. Set it on every call and stop thinking about it. - Updates replace the whole card. Updating a card through the API is a full replace, not a patch. Send only the description and you can wipe the title. Read the card first, merge your change, then write it back.
How to copy the setup
If you want to run content planning the same way:
- Install Deck from the Nextcloud app store.
- Create one board per channel or brand, each with the same three stacks: Ideas, In Progress, Completed.
- Agree a card template: keywords, slug, title tag, meta description, outline.
- Create a distinct “AI idea” label on every board before you connect anything.
- Generate an app password and connect your AI through the Deck API, either with an MCP server or a simple script.
- Ask for ideas grounded in your own data, and make the agent show you keyword options instead of picking for you.
The tools are free and the setup takes an afternoon. The payoff is a content plan that stays current without me having to remember to update it, and an AI that adds to my thinking instead of quietly replacing it.


Pingback: Agentic AI for Marketing: Hermes + LM Studio on a Laptop
Pingback: Marketing Project Management Software: Why I Use OpenProject