Introducing Millwright, a loop-based orchestrator for async agents
Say hello to Millwright — a free, open source orchestration layer that lets async agents take care of development tasks in the background, on infrastructure you own.
Say hello to your newest team member, Millwright. Millwright takes care of development tasks in the background, while your team focuses on the highest value work.
It’s free, open source and available now: github.com/njcameron/Millwright.
Millwright uses the tools you already have (GitHub, GitLab, Linear, Slack, Discord, Telegram), on infrastructure you own (DO, AWS, Hetzner), independent of any one developer, across all your projects.
The technical bit
Millwright is a loop-based orchestration layer for async agents (e.g. Claude Code). It’s lightweight, written in Ruby and runs on any VPS. Out of the box it supports GitHub issues, GitHub repos, Claude Code and Slack. It’s fully extensible through different adaptors for tickets, code, agent and notifications.
How it works
Millwright has two ways of working.
- Continuous development. A backlog is checked for tickets that are ready to work on. If required, it will create a plan, post it to the issue, and then refine that plan based on comments. Once development is complete, Millwright creates a PR and then responds to any comments, fixing the code when required.
- Routines. Out of the box, it ships with two routines: a weekly security scan of specified repos which checks for broken access control, auth gaps, hardcoded secrets, security config and more; and a weekly product digest for each repo that creates a customer / stakeholder ready update of everything that was shipped in the past week.
How I’ve been using Millwright
I typically find myself working across multiple repos: ResponseHub, the RH Chrome extension, the RH marketing site, Pentest.fyi, my personal site, and Millwright itself. Millwright is set up to work on all of these.
- One customer call might result in 3 or 4 small improvements or bug fixes. Millwright works on these in the background.
- Blog posts and articles are added as GitHub issues, either from dictation or a webhook from Evatype. Millwright uses a Claude Skill which takes care of frontmatter and finding incoming and outgoing internal links for the new post.
- New listings and updates to Pentest.fyi are added as GitHub issues, and Millwright + a Claude Skill with specific instructions on updating the JSON handles the rest.
- SEO research is handled in its own repo. I create a GitHub issue with an instruction like “Do keyword research around the term ‘security questionnaire automation’” and Millwright handles the rest. A simple
CLAUDE.mdfile ensures that the Claude SEO skills and DataForSEO MCP are used for all queries. Original DataForSEO data is saved as JSON files and a findings document is saved as an MD file. Millwright then creates a PR with all of this for me to review.
The roadmap
There are three improvements I’d like to see.
- The first is providing more support for coding agents. Right now it relies on a Claude subscription. Ideally I’d like to see it working with an open source harness like OpenCode or Pi.
- This opens the door for the second improvement: task-based model routing. The era of tokenmaxxing is over and we’re about to enter the era of tokenthrifting. Millwright could enable this by routing complex tasks to frontier models and simpler tasks to cheap, open source models.
- Lastly, Millwright is currently set up for my own stack of tools and routines. I think there is a ton of potential for building out support for other tools like Jira, Linear, GitLab and Telegram, and other routines like static code analysis, TODO/FIXME harvest or error log triage.
Get Millwright for your team
Millwright is free, open source and available right now. As part of my work helping organisations automate their ops and workflows, I’ll be providing support getting Millwright set up and building custom adaptors. If you’d like to see how Millwright could help your team, drop me a message.