My workflow for building is radically simple nowadays. I send an email, and expect a pull request back. If there’s room for improvement, I request changes via code review or email. The effect has been transformative, as my GitHub contributions graph shows:
The first email exchange with Claude Code took place on January 12. Since then, I’ve built almost exclusively over email, resulting in over 1000 pull requests across thousands of emails. My favorite places to work from have been the gym (quick emails between sets) and long flights. As Claude summarized at the end of one HEL-DFW:
20 PRs merged in the last 10 hours with +11,535 / -324 lines (net +11,211).
Highlights from your flight:
- Big ones: e2e tests for reconcile.py (+8,887 lines), fingerprint uniqueness CI check (+600), inter-entity transfer fix (+596)
- Data imports: [redacted] accounts for 2025
- Various categorizations and reclassifications
- Email service improvements (SMTP fix, failed tool call highlighting)
Productive flight!
The system that allows this is Airut. I’ve written about Airut before, but to give an idea: Airut is a service that manages sandboxed Claude Code sessions, connecting them to email or Slack. That is the accurate technical description. But what it really does is to turn Claude Code into an agent that just is out there, ready to work as soon as you bother to type an email or Slack message.
The model also extends to other tasks. Beyond building Airut itself, I’ve used it to apply Claude to domains outside of software engineering.
Accountant
Airut originally branched off from a personal plain-text accounting system. I wanted to migrate from spreadsheets to a proper double-entry system, and chose Beancount plain-text accounting. Plain-text accounting is a perfect technology for the age of text-native LLMs. While Claude could just read and edit the books directly, over time I’ve (or rather Claude has) built a ton of custom tooling and reporting on top of the Beancount core.
Nowadays, I import new data into the system by simply emailing receipts, bank statements, or credit card bills to Claude. Back comes a PR, with links to generated reports and content-aware diffs. A custom DAG-based tax reporting engine computes my tax liability with full transparency, making everything traceable to the ledger and statements.
One morning I realized that LinkedIn Pro that I accidentally let renew itself last year might be tax-deductible, so I emailed Claude “I paid for LinkedIn Pro at some point last year.” asking it to check if it is deductible. It returned:
Done. Here’s what I did:
Transaction found: 317.29 EUR on 2025-10-18 for “LINKEDIN.COM, IE” on [redacted] Visa, previously in
Expenses:Personal:Uncategorized.Changes made:
- Recategorized the transaction to
Expenses:Personal:Tax:Ded:Earned:Tools– the Finnish tax-deductible work tools account (tulonhankkimiskulu)- Added a reusable categorization rule so future LinkedIn charges get auto-categorized
- Updated TY2025 residual tax opening balance to reflect the reduced tax liability from the additional 317.29 EUR deduction (net tax impact: -160.58 EUR)
It also noted that since the estimated residual tax had already been paid, I should expect a refund once I file for taxes. I pressed it to check if all of this was correct, and it confirmed with a detailed explanation citing vero.fi and other sources.
What I’ve built is an accountant that reads email 24/7, and not only does bookkeeping, but also develops the tooling to do so efficiently.
Support Engineer
At Varjo, I deployed Airut as an agent that analyzes customer diagnostics and helps our customer-facing teams dive deeper into issues without resorting to R&D escalations.
Beyond deploying Airut, all it took was asking Claude to develop a workflow in the form of a Markdown file. If the prompt asks for deep analysis, CLAUDE.md would instruct Claude Code to follow a specific workflow: download the diagnostics, analyze them using automated tooling, check out the right version of product source code, and then dive deeper into logs to correlate observed behavior against the software and firmware source code.
We had an existing pipeline for log analysis that created LLM summaries based on output from a sophisticated pattern matcher. This agentic version quickly surpassed the earlier pipeline, enabling our solutions engineering to diagnose, for example, how an enterprise endpoint management software was breaking firmware updates by blocking a specific USB VID/PID that a certain headset component used only during the firmware update process.
The findings from the deeper agentic analysis feed back into improving the pattern matcher pipeline, resulting in ongoing enhancements that deliver results more quickly and at a lower cost.
Here Airut enabled Claude to become an R&D engineer that our customer-facing teams could tap on demand to do deep analysis of issues, without having to know how to spin up Claude Code.
Editor & Publisher
This website and blog are built over email. While I write most of the content myself, I use Claude as an editor and a web developer. This blog post was authored by emailing Claude and then iterating on the content through emails and code review comments. As you would with someone managing your website.
I also set up Airut so my SO could manage her online presence via email. Her website is in a GitHub repo, with a workflow to deploy it to Cloudflare Pages. She sends a message to make an edit, and back comes a preview link and a PR to approve. The part of the workflow that was not intuitive to her was figuring out how to approve the PR in GitHub.
Airut
Airut is now 35k lines of Python, featuring 100% unit test coverage and 200 integration tests (totaling 93k lines of test code, a 2.7x test/implementation ratio). It supports Slack in addition to email – another feature I recall developing on a flight. Airut also focuses on security. I’ve learned a lot about the challenges of securing agentic AI while developing Airut (e.g., Sandboxing GitHub Actions). Most recently I added a web UI for configuring Airut, which should lower the barrier to getting started.
Email, a highly accessible medium optimized for threaded asynchronous communication, mixes perfectly with Claude Code’s agentic loop. This combination works not only for building software, but also solving other tasks. I open-sourced Airut to make the case for agents to be available over existing communication tools, and that email is perhaps the best fit among them. Rather than spending the effort to capture the interface, we should focus on making the agents useful and secure.