Blog
Notes from a fractional tech lead: software architecture, code reviews, AI harnesses, design systems and leading small dev teams.
A vibe-coded product isn't done at the first deploy
PHP and Next.js flaws, 1,094 Microsoft fixes, 95,000 CVEs in 2026: a vibe-coded product is never done, and its maintenance starts on the day you deploy.
Your next side project should be an unsexy business
Most side projects launched by developers fail because they are pure tech projects. Pick an unsexy business instead, with partners from that field.
Using AI to code a music video engine from scratch
My wife is a singer and her music videos are a headache. Instead of a shoot or an AI-generated video, I coded a custom engine that renders each video.
What if we're collectively using AI the wrong way?
Rebuilding the Adobe suite with AI just redoes what exists, faster. The real winners will use AI to do new things and do better, not just go faster.
AI code review: the referee has to be you
An AI reviewing its own code says it is fine; reviewing another agent's, it always finds fault. The verdict depends on the question, so you must be the judge.
Building a program: the questions AI can't settle for you
Subdomains, bounded contexts, architecture, data, scale, security, prod: the questions to ask when you build a program, which AI alone cannot settle.
"Co-Authored-By: Claude": the three camps of the debate
Keep or remove "Co-Authored-By: Claude" from your commits? Honesty, a metric, visual noise, free advertising: the arguments of the debate, summed up.
"Co-Authored-By: Claude" in my commits? 100%
Working flat out with AI and hiding every trace of it makes no sense. Co-authored changes nothing: the commit is still my responsibility.
Have an AI analyse your bounded contexts
Relationships, changes, language, maintenance: AI sub-agents analysing your bounded contexts can surface deep design problems before they cost you weeks.
Have Claude record the demo video of your feature
To get a finished local feature signed off: Claude writes a test scenario, plays it in the browser and records it as a captioned video.
Bounded contexts: why designing them well matters
Well-designed bounded contexts protect your models' language, ease organisational constraints and, through the context map, guide your technical choices.
Subdomains vs bounded contexts: the problem and the solution
In DDD, subdomains and bounded contexts are often confused. The first exist in the business; the second are designed to organise the software solution.
My agentic workflow: worktrees, TDD, reviews and a master
5-6 parallel sessions, one worktree per task, an advanced harness, enforced TDD, 8 review agents and a master session: my current agentic workflow.
With AI, you can learn faster than ever
Does AI stop us from learning? Not if you ask it to teach you how to do things instead of doing them for you. With a bit of effort, it is a real catalyst.
My AI review workflow: specialised agents in a loop
Specialised review agents, a skill that reruns them in fresh sessions over several rounds, then a final artifact that presents the work that was done.
Review GitHub PRs in a logical reading order, not alphabetical
GitHub sorts PR files alphabetically. A skill that orders the diff into logical blocks and a Chrome extension that reorders the review: 15 minutes to vibe-code.
The outbox pattern: consistency outside the aggregate
An aggregate keeps one business unit consistent. For what lies outside, like emailing the invoice, the outbox pattern guarantees it eventually happens.
The DDD aggregate: a consistency boundary for your invariants
In tactical DDD, an aggregate groups related objects behind a single root so your invariants always hold, including at the moment they are persisted.
Core, supporting, generic: the three kinds of subdomains
Analysing the business domain reveals three kinds of subdomains: core, supporting and generic. Mapping them tells you where to spend your time and effort.
Worn out by the pace of AI? Go back to the fundamentals
Releases, workflows, tools: with AI, every developer now feels the fatigue JS developers know well. My remedy: the fundamentals, stable and lasting.
Todos and human-todos: staying focused while AI codes
Two markdown files at the repo root: AI notes what it spots, I list what only I can do, and background sessions clear the todos while I stay on task.
The Result Pattern: telling bugs from business errors
Your cancelOrder() can fail in many predictable ways. The Result Pattern separates the business error you return from the bug that goes to Sentry.
Software architecture and craftsmanship in the AI era
Transaction Script, DDD, Clean Architecture, CQRS, TDD, SOLID, Big Ball of Mud: working on software architecture has never been more useful or accessible.
Maintenance effort = Integration strength × Distance × Volatility
Vlad Khononov's formula from DDD Europe: maintenance effort is strength times distance times volatility, and zeroing just one dimension collapses it.
The next big IT purchase for SMEs? A mini data center
Local models are finally credible, and the US CLOUD Act is real: an SME's next big IT purchase might be a machine instead of a cloud AI subscription.
Strict TDD with AI agents: slower, pricier, and better
Forcing AI agents into strict TDD gives a better design and sturdier tests, at the cost of speed and money. And beyond the prompt, what about hooks?
A good AI harness lets you use much cheaper models
On a codebase with broken import rules, Opus fixes it alone, Haiku falls for it, until an ESLint rule corrects it for 4 to 5 times less money.
Where the value of a tech project really lives
Business rules, not technology, hold 80% of a tech project's value. Yet most projects start with code choices or the first screens instead.
Full remote, freelance: the only team I would hire
If I had to hire a team tomorrow, it would be freelance and full remote only: that is where the best talent actually is, not within a 30-minute commute.
ADRs give AI agents the history your code can't tell
README, CLAUDE.md and AGENTS.md only describe the current state of the code. ADRs add the missing history: why that decision, which alternatives were ruled out.
The first week without writing a line of code
On any project, greenfield or brownfield, leave the keyboard alone the first week: understand, challenge the architecture, model the business.
Reaching 10x in the agentic era starts by going 0.3x
To ship 10x faster with AI agents, you first have to slow down: a solid harness, clean parallelisation and mastered CI/CD before you accelerate.
The boy scout rule: clean up a codebase without a big rewrite
Updating a codebase's conventions without a big bang rewrite: every time you touch a file, you apply the latest rules the team agreed on.
Orca: one glance at every repo, worktree and agent
An ADE that shows every repo and its worktrees, with the status of each agent at a glance: with 3 to 6 parallel sessions, visibility changes everything.
My support offer for SMEs that build tools with AI
AI-built internal tools getting out of control, insecure, fragile? Here is how I help small businesses get them back on track, progressively, at their own pace.
ALL-CAPS Driven Development: shouting at AI does not work
Shouting in capital letters at an AI to enforce an architecture rule does not work: a deterministic tool can check it for you instead.
As many developer setups as there are developers
IDE, ADE, terminal, keyboard or voice, one or ten agents: ways of coding have exploded with AI. My current setup, and a call to compare yours.
Harness Engineer: the developer job of tomorrow?
When you barely write code by hand, the real guardrail for AI is the harness. A portrait of the Harness Engineer, the ultimate senior of the agentic era.
Zero hand-written code: my harness engineering experiment
I set myself the challenge of writing a program without typing a single line myself, pushing the AI harness to its limit, inspired by an OpenAI experiment.
AI harnesses: a fresh, observable local instance
AGENTS.md and skills are not enough: to verify its work at runtime, an agent must run the complete program locally and observe all of it.
AI harnesses: scripts, the underused deterministic tool
A skill tells the AI how to create files; a script does it for the AI, deterministically. Cheaper and more robust: a concrete example with a git-based CMS.
Why I ask for an ADR before every architecture decision
An ADR fits on one page: context, decision, consequences. Michael Nygard's 2011 idea hasn't aged, and it doubles as a free guide for AI reading the repo.
Opinionated frameworks are an AI harness
AdonisJS is famously opinionated. A talk with Jonathan Serra (AI2H) on why that rigidity gives an AI an extra harness, and an open question.
Multi-tenancy: the four levels of data isolation
A SaaS handling sensitive data has to keep each customer’s data apart. Four levels, from a tenant_id column to dedicated infra, and the one I usually pick.
Why I am going all in on the one-day-a-week developer
In a few weeks, five near-identical profiles asked me for the same thing: a developer who watches their back, but not full-time. I am making it my job.
With AI you go faster. Above all, you can do better
AI makes you faster, but the real game is elsewhere: doing better. Average projects will drown; those that use AI to raise the bar will go far.
The developer market is shifting
Large dev teams are shrinking because of AI. Meanwhile, small businesses are starting to build their own internal tools and will need experts a few days a month.
What is a "Model"? Two things that have nothing in common
"Model" means both an ORM Model and the DDD domain model. Confusing them makes you think you modelled your business when you only described your tables.
Functional Core, Imperative Shell: the end of mocks everywhere
Gary Bernhardt's 2012 talk Boundaries is still some of the best testing advice around: separate decisions from actions, and pass only values between them.
Sound architecture, poor features: you'll survive
Sound architecture with poor features, you survive. Shaky architecture with correct features, everything is a fight. And it is the hardest part of the job.
Experience-based daily rates no longer measure anything
Daily rate grids were built on years of experience because the keyboard capped the gap between good and bad developers. With AI, that bottleneck is gone.
dependency-cruiser: a computational sensor for your AI agents
dependency-cruiser maps imports and fails CI when a boundary is violated. A sensor for AI agents that only works if the architecture is clear enough to describe.
AI harnesses: guides and sensors, the four boxes to fill
A harness is everything in an agent that is not the model. Two axes, four boxes, and a painful conclusion about the harnessability of a codebase.
Building a product is easy. Distribution is the hard part.
Developers often forget that building a product depends on them. Selling, onboarding and keeping customers does not. A simple plan for technical founders.
Your tests are green, but that proves nothing: mutation testing
Coverage measures lines run through, not lines verified. Mutation testing measures whether tests detect bugs, essential once agents write the tests.
The part-time senior developer: a new freelancing model
In companies where the product only supports the business, vibe-coding hits a wall fast. A senior developer a few days a month is often enough to lift it.
Vertical Slice Architecture: organise code by request
When adding one field touches six files in four folders, the feature lives nowhere. Jimmy Bogard's Vertical Slice Architecture flips the way code is organised.
The next bottleneck in software development is RAM
AI moved the bottleneck from writing to reviewing. The next one is hardware: running five agents in parallel needs a machine not everyone will have.
How many of your architecture rules break the build?
With AI, a standardised architecture becomes an asset: every rule a machine can verify is a constraint. The others are only intentions.
Dummy, stub, spy, mock, fake: five test doubles, one question
The five kinds of test doubles are easy to mix up. One question asked of the double, borrowed from Meszaros, is enough to tell them apart for good.
Three questions to pick the right tool for your next test
Pure unit test, integration test, a Fake, or a double that records calls: a simple three-question strategy for choosing without hesitation.
"A depends on B": what exactly are we talking about?
A dependency can be seen by the compiler, by a test, or by nobody. Three questions to stay precise, with developers and with an AI.
What is a "layer" in software architecture?
Abstraction, technical role, call flow, dependencies, deployment: "layer" names five ways of slicing a program, and yours probably has all of them.
Clean Architecture is one rule: the Dependency Rule
What Robert C. Martin extracted in 2012 from Hexagonal, Onion and friends: a single rule you can verify in the code, the Dependency Rule.
Onion Architecture: business code at the centre
What Jeffrey Palermo proposed in 2008 with Onion Architecture: a single dependency rule so that business code stops paying for every technology change.
Parnas and Cockburn: how their two visions fit together
Cockburn's Ports & Adapters is one tactical application of Parnas's strategy: each Port/Adapter pair is a module that hides a technology choice.
Hexagonal Architecture: Cockburn's Ports & Adapters pattern
Alistair Cockburn, 2005: think of a program as a business inside and an outside plugged in through ports and adapters, rather than as layers.
Parnas, 1972: what criterion for splitting code into modules?
In 1972, David Parnas proposed decomposing a program not by flowchart steps but so that each module hides something difficult or likely to change.
The time AI saves you: spend it on quantity or quality?
Two ways to use the time AI saves you: ship more MVPs, sites and features, or ship the same amount at higher quality. Why I lean towards quality.
Scaling a vibe-coded MVP: when heavy operations blow up
A heavy operation the AI runs in memory holds up in a prototype, then blows up as users pile in. Without queues or observability, good luck finding why.
Learning efficiently: the dev skill nobody talks about
With AI, a developer's value lies in architecture and the business. You still have to learn them: rephrase, summarise, cross-check, take your time.
Building an MVP is easy. Everything else is hard.
With AI, building an MVP has never been easier. What's actually hard is the good idea, distribution, product-market fit, churn and quality over time.
With AI, less secure code and more confident developers
A Stanford study: developers using AI wrote less secure code and felt more confident about it. The fix: have an AI with a fresh context audit the code.
AI does what you tell it, and only what you tell it
Security, consistency with existing code, upcoming needs: what you never ask AI for gives an app that looks perfect on the surface but is riddled with problems.
IDOR: the security hole AI leaves in your routes
AI builds a route that returns an invoice by its id, but forgets to check who owns it. Here is the 3-step test to spot an IDOR in your own app.
Your secret API keys might be visible to everyone
AI puts keys wherever they work: in the bundle, so on everyone's machine. Here is how to check whether your secret API keys are visible on your website.
Supabase and RLS: the 2-minute check
AI sometimes forgets to enable RLS on Supabase tables created via SQL, and then anyone can read your database. Here is how to check it in 2 minutes.
A CVE on Lovable apps: the real cost of vibe coding
An official CVE on Lovable apps: with no data access rules, anyone can read the database. The app works, the demo looks great, and the door is wide open.
Forcing a return to the office is a management aberration
Forcing a return to the office in 2026 means losing resilience when it matters most, and losing the best people, the ones who can choose to stay remote.
Claude Code: a TODOS.md file for off-topic details
A warning, an ignored pattern, a bit of debt mid-feature? One CLAUDE.md instruction has Claude Code note them in a TODOS.md file for later cleanup.
The best AI harness is a codebase with a rigorous architecture
DDD, TDD, hexagonal or in-house conventions: it does not matter. A rigorous codebase is the best harness to get an AI to follow your way of working.
UX matters far more than UI
UX is too often sacrificed for UI, because UI is what people see. Yet an ugly but functional site stays in use far longer than a gorgeous one that fights you.
Good code looks simple, bad code looks clever
Writing clever code that looks simple is one of the hardest things in development: behind it lie a clean split, the right abstractions and invisible choices.
Why 9 out of 10 side projects die after the MVP
Once the MVP is done, developers drop operations, observability, sales, support and maintenance. Better to finish 2 projects than do 25% of 8.
The developer isn't dead: Claude deleted its own .claude folder
Mid-feature, Claude deleted the .claude folder: skills and agents gone. Reading the git diff before pushing saved me. A warning for fully automated pipelines.
The dream all-AI-agent dev pipeline… and its weak spot
Agents that do everything, from specs to production, with no human supervision and 100% on Claude. Until the day Anthropic botches an update.
Full remote freelance, but [CITY] only?
Requiring a full remote freelancer to live in a given city or country makes no sense. A legal framework or working hours, at a stretch, can.
Writing code is easy now. Building a system is not.
With AI, writing code has become as easy as learning to write as a child. Building a complex, coherent system that lasts is still as hard as a masterpiece.
The best feature for a SaaS: adding nothing
Past a certain point, the best feature for a SaaS is adding nothing: polish and simplify what exists rather than piling up features that blur the tool.
Five types of coupling, from most acceptable to worst
External, common, control, stamp, content: five types of coupling ranked from the most acceptable to the worst, and how to keep each one in check in a codebase.
The worst thing in a codebase is coupling
Slightly rotten modules with clear interfaces will be fine. Optimised modules coupled in every direction quickly become an unmaintainable hell.
Alright, I'll say it: I like daily stand-ups every morning
Not for the "I did this, I'll do that" part, but because in a full remote team the daily lets you see and talk with your colleagues at least once a day.
AI will shrink the number of developers… or the opposite
AI only cuts the number of developers if projects stay flat. My bet is the opposite: far more projects, of better quality, so even more developers needed.
DDD + Clean Architecture: my take after 3 intense months
Three months of DDD and Clean Architecture applied to the letter on a production codebase: the pros, the cons, and why I would struggle to go without.
Stay employable: ask Claude what it is bad at
A Claude Code tip to stay employable: ask it what it will stay mediocre at for a while, then work hard on exactly those skills to get ready for what's next.
Claude Code: check that it really read your CLAUDE.md
A Claude Code trick to check it has read both your personal and project CLAUDE.md: have it greet you by your first name at the start of every conversation.