I love kanban boards and track all my projects with them. I love how simple and flexible they are. Every project can have a different workflow that you represent with columns like backlog, in progress, and so on. They allow you to easily visualize the state of your project and customize workflows without dealing with complex state transition rules.

I love kanban boards so much I built my own called Skyboard (it's a web app on the AT Protocol and you can read about what makes it special here and here). It looks like this:

Screenshot of Skyboard

Skyboard is pretty neat but the thing I'm really excited about is using kanban boards to control Claude (or whatever your favorite coding agent is).

Here's how that works. First, I made a Skyboard command line app that lets you see and control your boards from the terminal:

Screenshot of formatted output from the Skyboard cli app

Claude is really good at the command line so this is perfect for managing your boards just by talking with Claude. You can ask it fun things like:

I want to implement a TodoMVC app using Tauri with a sqlite backend. Plan this out and break it into tasks on the "TodoMVC" board

and it'll do just that!

Screenshot of Skyboard showing individual cards to implement the TodoMVC app

So that's a neat way of using Claude to manage your boards but I want to control Claude with kanban. How do we do that?

The Ralph Loop

We just need to use a Ralph Wiggum loop!

A Ralph loop runs Claude repeatedly with the same prompt, each time in a fresh context, until there's no work remaining. To control Claude with a kanban board we just prompt Claude to use Skyboard to track its progress. Each turn of the loop Claude will:

  • pick a single card to work on and read its details (title, description, comments, etc.)

  • work on it

  • record its status by adding a comment

  • move the card to the next column

  • exit

The loop then starts another instance of Claude and the cycle continues.

You can watch Claude's progress as cards move between columns and comments appear. If you think of a new feature or want Claude to do something different, just add comments, move cards to a different column, or add new cards to the backlog. Claude will see and respond to your updates as it loops.

The neat thing about this technique is it solves two problems at once:

  • managing context for Claude

  • managing context for the human

Claude (and humans) get dumber the more context they keep track of simultaneously; this is why big projects need to be broken down into small tasks. The board is there for both the human and the agent to track what is being worked on now and what will be worked on in the future.

You can easily implement this technique with just a bash script but I've also integrated it into the Skyboard cli. It comes with two commands:

sb ralph init  # creates .skyboard-ralph/ config + prompt
sb ralph start # starts the loop

The ralph init command initializes a config directory with a prompt markdown file that tells Claude what columns to use and how they should work. The cli comes with a couple of preset workflows to pick between but you can easily edit the prompt file to your project's particular workflow. A prompt looks something like:

1. check the board for your next task
2. there are three columns "backlog", "in progress", "done"
3. pick the top card in "in progress", read its full details, implement the plan, and move the card to done
4. if there are no cards in progress pick the top card in the backlog and update it with a detailed plan and then move it to "in progress"
5. only work on a single card. only make a single transition and then stop

When you run sb ralph start the harness launches a non-interactive Claude session with the custom prompt. When Claude stops, the harness clears the context and starts another Claude instance and keeps looping until there are no more available cards.

The cool thing is this is super easy to configure. Want Claude to have specific stages for code review, security review, and documentation cleanup? Just add those columns and update the prompt.

How I build Skyboard with Skyboard

I've been dogfooding this process with the Skyboard project itself and one technique that works really well is using certain columns as human-in-the-loop gates. I have two columns planning and in review that Claude moves cards into but only I move them out of after I've reviewed what Claude did.

Here's the full workflow:

  • backlog - all new tasks start here.

  • planning - Claude picks the top item from the backlog column, adds a plan and moves it here. I then review all the plans, when I'm happy with it I manually move it to the in progress column. Claude never moves cards from planning.

  • in progress - Claude picks the top item from in progress, implements the plan, pushes up a PR, and when done moves the card to in review

  • in review - another human gate. I review all the PRs and if I don't like something I leave a comment and move it back to in progress otherwise I merge the PR and move the card to done. Claude never touches cards in review.

  • done - the end state nothing more needed.

You can actually see the board I've been using to develop Skyboard here.

I really like the approach of controlling everything via a kanban board rather than spreading work plans across a bazillion markdown files (somewhat fine for Claude, difficult for humans) or tracking things in disconnected issue trackers (ok for humans, no good for Claude).

Getting Started

If you want to try this out yourself, make a board on Skyboard, install the Skyboard cli (npm install -g skyboard-cli), and run sb ralph init in your project. Start with a simple three-column workflow (backlog -> in progress -> done) and customize from there. I'd love to hear what workflows work for you.