← Back to posts

Every AI Coding Tool: A Solo Developer's 14-Month Odyssey (Part 1)

· 11 min read

The Commit Log Doesn’t Lie

I recently ran git shortlog -sn on my platform repo and stared at the output for longer than I should have:

3667  Filipe Estacio
  13  Cursor Agent
   6  OpenCode Assistant
   2  tessl-app[bot]

3,667 commits over 14 months. One developer. And a rotating cast of AI pair-programming partners, each arriving with ceremony and departing without a goodbye.

This is the story of trying every AI coding tool I could get my hands on while building a SaaS platform from scratch. Not a review. Not a comparison chart. Just an honest account of what happened when a solo developer treated AI tools like dating apps - always convinced the next one would be The One.

Part 1 covers the early era, before Claude Code changed everything. Part 2 will cover the Claude Code adoption and where things stand today.

The Before Times (March - July 2025)

The project started on March 11, 2025, with the most optimistic commit message in software engineering: “Initial commit from Create Next App.”

For the first five months, it was just me and a basic copilot autocomplete. The commit messages from this period tell their own story:

add cdk backend
added middy to functions
cleanup
progress in solving DNS resolver bug

Terse. Human. Occasionally desperate. No AI agents, no specification systems, no structured workflows. Just a developer, a monorepo, and a growing suspicion that there had to be a better way to move faster.

By August, the platform had grown into a proper CDK-backed multi-stack architecture with DynamoDB, API Gateway, WAF, and a Lambda factory pattern. I was building faster than I could maintain context. Every time I switched from infrastructure to frontend to API design, I’d lose 20 minutes just remembering where I left off.

I needed a pair programmer. A tireless one. One that wouldn’t judge my variable names.

Cursor AI (August 2025)

Cursor arrived like a revelation. On August 26, 2025, I committed what felt like a turning point:

feat(infrastructure): complete CDK multi-stack Phase 1 and add Cursor rules system

I created a .cursor directory with comprehensive rules for infrastructure development. The rules file was detailed, opinionated, and - in hindsight - adorably naive. I was essentially writing a personality profile for my new AI colleague: here’s how we name things, here’s how we structure CDK constructs, here’s our testing philosophy.

The branch names from this era are museum pieces. Cursor auto-generated them with the model name embedded:

cursor/refactor-github-actions-workflow-for-readability-claude-4.5-sonnet-thinking-a8df
cursor/separate-user-portal-unit-tests-to-vitest-project-claude-4.5-sonnet-thinking-6cad
cursor/fix-marketing-app-linting-issues-claude-4.5-sonnet-thinking-60ad

Imagine explaining those to a future code archaeologist. “Yes, the branch name includes the AI model that wrote the code, and yes, we thought that was useful at the time.”

On November 29, Cursor Agent went on a spree - 13 commits in a single day, all refactoring CI workflows and test configurations. The commit messages were fluent and descriptive, a stark contrast to my own terse style:

feat: Implement PR checks workflow and add testing
Refactor: Modularize NX affected pipelines workflow
fix: Correct GitHub Actions conditional expressions in PR checks workflow
docs: Add root cause analysis for PR checks workflow fix
fix: Add extensive debugging for NX JSON parsing issues

“Add extensive debugging for NX JSON parsing issues.” The agent was doing what I do at 2 AM, except it documented the process. That was genuinely useful. But it was also my first taste of a pattern I’d see repeatedly: the AI could produce a lot of work very quickly, but the review burden shifted entirely to me. Thirteen commits touching CI workflows meant thirteen diffs I needed to verify before merging.

What Cursor taught me: AI agents can absolutely do substantial refactoring work. But an agent that makes 13 commits in a day needs a human who can review 13 commits in a day. The bottleneck wasn’t code generation - it was code comprehension.

Kiro (September 2025)

While Cursor was handling the broad strokes, I discovered Kiro - AWS’s AI coding agent. I was building Herald, an internal changelog system backed by CodeBuild and CodeStar connections, and Kiro seemed like a natural fit for AWS-heavy work.

The evidence in the git log is slim - a single commit on September 3:

update kiro tasklist

That’s it. One commit. Kiro used a task-list approach to development: you’d define what you wanted, and it would work through the list methodically. The idea was sound, but in practice, it felt like managing a junior developer’s todo list. I was spending more time writing task descriptions than I would have spent writing the code.

Herald itself got built - the pipeline, the GitHub integration, the content schemas. But by mid-September, there’s no more trace of Kiro in the commit history. Herald was eventually removed entirely in November (“Remove Herald/Changelog and clean up GitHub connection from staging account”). So both the tool and the project it helped build are gone.

What Kiro taught me: Task-list driven development only works when the tasks are well-defined. For exploratory work - building something you’ve never built before - the overhead of specifying tasks precisely enough for an AI to execute is often higher than just doing it yourself.

Warp AI and the Birth of AGENTS.md (September - October 2025)

Around the same time, I started using Warp terminal’s AI features. On September 8:

feat: add agent configuration and enhance email DNS setup

This was the creation of WARP.md - a configuration file that told Warp’s AI agent about the project structure, conventions, and constraints. It was my first attempt at writing a “how to work on this codebase” document aimed at an AI reader rather than a human one.

But then something more interesting happened. On September 20:

refactor: replace direct communication with AI-mediated question system

This was a real product feature, not a developer workflow thing. Our platform is a marketplace, and we needed a way to mediate communication between parties. Instead of building a traditional messaging system, we built an AI-mediated question flow where requests between parties went through an AI layer that could structure, validate, and route them intelligently.

Looking back, this was one of the first times the AI tooling influenced the product itself. Building with AI every day made AI-mediated features feel natural rather than exotic.

On October 19, the WARP.md file got a significant upgrade:

refactor(project): Standardize agent workflow and rename WARP.md to AGENTS.md

This was a pivotal moment, even if I didn’t recognise it at the time. By renaming from WARP.md (tool-specific) to AGENTS.md (tool-agnostic), I was acknowledging something I hadn’t consciously decided yet: I was going to keep switching tools. The configuration shouldn’t be married to any single one.

What Warp taught me: The real value wasn’t the AI features - it was the act of writing down “here’s how this codebase works” in a machine-readable way. AGENTS.md would survive every tool change that followed. The tools were temporary; the documentation was permanent.

OpenSpec (October - November 2025)

By mid-October, I’d grown frustrated with the ad-hoc nature of AI-assisted development. Tasks would start without clear specifications, meander through half-formed ideas, and produce code that solved yesterday’s version of the problem.

Enter OpenSpec - a task-driven specification system. On October 17:

move to openspec

OpenSpec introduced a formal structure: you’d write a specification first (SPEC-1-1, SPEC-2-3, etc.), then implement against it. The commit messages from this period show the system in action:

feat: complete SPEC-1-1 Backend API Development for global user management
task: create openspec to fix react query periodic requests

There’s something satisfying about this approach. Write the spec. Implement the spec. Check the spec items off. It imposed discipline on a process that had been chaotic.

But discipline has a cost. In early November, I can see the overhead creeping in:

fix: improve token management and refresh error handling
    - Update openspec tasks to mark Phase 3 completion

The fix itself was a few lines of token validation logic. But the commit message is half-implementation, half-bookkeeping. When you’re a solo developer, every minute spent updating task trackers is a minute not spent shipping features. By November 13, the verdict was in:

refactor: remove deprecated OpenSpec and old agent support

Six weeks. Installed in October, removed in November.

What OpenSpec taught me: Specifications are valuable. Specification systems that require you to maintain parallel tracking infrastructure are not - at least not when you’re a team of one. The specification discipline stayed with me; the tooling didn’t.

OpenCode (November 2025)

Fresh off removing OpenSpec, I immediately installed something new. On November 19:

feat: integrate Backlog.md with OpenCode configuration

OpenCode was a terminal-based AI coding tool that worked with a backlog-driven workflow. It had its own email identity (opencode@...), its own configuration directory, and its own way of doing things.

The six commits from OpenCode Assistant tell a focused story - all from November 9-10, all about enum standardisation:

fix: standardize infrastructure enums to lowercase format
fix: restore vitest-dynamodb-lite-config.ts and update test mocks
feat: complete Tasks 2.3-2.4 - standardize enum usage in Lambda handlers
feat: standardize account and user status enums across frontend components
feat: complete enum standardization for filters and Storybook stories
feat: complete comprehensive enum standardization across monorepo

Six commits across two days, systematically standardising enums across the entire monorepo. This was OpenCode’s specialty: mechanical, codebase-wide refactoring with a clear specification. Give it a well-defined task and it would methodically work through every file.

But by January 31, 2026, the traces disappear:

Remove .opencode and backlog folders (moved to workspace repo)
Add .opencode and backlog to .gitignore (moved to workspace)

Moved, then ignored. The pattern was becoming familiar.

What OpenCode taught me: Terminal-based AI tools have a lower context-switching cost than IDE-based ones. I didn’t have to leave my workflow to use it. That insight would prove important later.

The BMAD Method (November 2025 - January 2026)

And now we arrive at the most dramatic example of the install-remove-install-remove cycle. The BMAD Method - a structured approach to sprint planning with Epics, Stories, and a formal workflow system.

The timeline speaks for itself:

DateEvent
Nov 27, 2025install bmad method
Nov 27, 2025Add backlog tasks for Epic 1-3 and update BMAD/OpenCode configs
Dec 7, 2025cleanup: remove BMAD workflow system and update test configurations
Jan 6, 2026Merge pull request from bmad-install
Jan 21, 2026remove BMAD Method

Installed November 27. Removed December 7. Ten days.

Reinstalled January 6. Removed January 21. Fifteen days.

I can actually trace what happened during the second BMAD era. The commit messages from January are full of epic/story references:

feat(epic-5.1): implement impersonation token + context middleware
feat(epic-5.2): implement Act-As UI and integrate backend impersonation
chore(epic-5): mark 5-1 done and set 5-2 in-progress in sprint-status.yaml
docs: complete Epic 4 retrospective and plan Epic 5

There’s a sprint-status.yaml being maintained. There are retrospectives. For a solo developer. I was running sprints, retrospectives, and formal epic planning for a team of one.

On January 21, the second removal happened, and this time it stuck. No third installation. The BMAD Method taught its final lesson.

What BMAD taught me: Solo developers don’t need sprint ceremonies. The overhead of maintaining epic hierarchies, sprint statuses, and retrospective documents is justified when you need to coordinate across a team. When the team is just you, all that coordination overhead is pure waste. I didn’t need a sprint retrospective to know what went wrong - I was there for all of it.

The Pattern

Looking at this timeline from the other side, a clear pattern emerges:

  1. Encounter new tool (excitement, setup, configuration)
  2. Productive honeymoon (the tool handles its sweet spot well)
  3. Overhead creeps in (maintenance burden exceeds the productivity gain)
  4. Remove tool (usually within 4-8 weeks)
  5. Keep the lesson (the useful concept survives the tool)

Each tool left behind something valuable:

  • Cursor proved that AI agents could do real refactoring work
  • Kiro showed that task-list approaches need well-defined tasks
  • Warp produced AGENTS.md, which would outlive every tool that followed
  • OpenSpec taught me to specify before implementing
  • OpenCode demonstrated the value of terminal-native AI workflows
  • BMAD confirmed that process overhead must scale with team size

But the git log also reveals something less comfortable: I spent a non-trivial amount of my solo development time installing, configuring, learning, and removing tools. Every .cursor/rules file, every WARP.md, every openspec task definition, every sprint-status.yaml was time not spent shipping features.

The question I kept circling back to was this: is there a tool that provides the productivity gain without the configuration overhead? One that reads AGENTS.md and just… works?

In Part 2, I’ll cover what happened when Claude Code entered the picture - and why, for the first time, the install-remove cycle stopped.