Skip to main content

Exploring the aider AI Coding Assistant in a Non-Trivial Codebase

·5 mins
Michael Hönnig
Author
Michael Hönnig
Until autumn 2027 only available for consulting engagements with a small number of hours – remote, in German and English.

While most AI code generation examples show how to quickly bootstrap a new web application, I was curious how far an AI coding assistant can take me in an existing, non-trivial codebase – one with a Java backend, automated tests, APIs (OpenAPI), PostgreSQL database migrations (Liquibase). I decided to explore the open-source AI tool aider, applying it to one of my projects: hsadmin-NG.

How to Use aider AI Coding Assistant
#

aider is an open source command-line tool for coding with LLMs (Large Language Models) such as GPT (OpenAI), Claude (Anthropic), or Gemini (Google) and others.

aider allows you to easily analyze and edit code files by chatting with an AI in your terminal. It works across languages, and lets you iteratively build, refactor, and fix code. And it’s surprisingly effective — if you know how to guide it.

Warning

aider sends your code to the selected LLM provider. If you’re working on proprietary or sensitive code, make sure you understand what that means.

In my case, the project is open source, so this isn’t a blocker. For more details, see the aider privacy policy.

Installation
#

Assuming you have Python 3 and pipx installed:

pipx install aider-chat

To use OpenAI’s vision models or other advanced capabilities:

pipx inject aider-chat openai --include-apps

To use Google’s Gemini:

pipx inject aider-chat google-generativeai --include-apps

Configuration
#

You need to provide your API key depending on the model:

OpenAI

export OPENAI_API_KEY="your-api-key-here"

Google Gemini

export GEMINI_API_KEY="your-api-key-here"

These can be added to your .bashrc or .zshrc.

Basic Workflow
#

Before you start, it’s suggested having a CONVENTIONS.md file in your project. This files contains rules for the aider AI coding agent, see .aider.conf.yaml.

Find my CONVENTIONS.md for this project in my git repository..

  1. Go to the project root

  2. Run the AI agent

    aider
  3. Add files you want aider to work with:

    /add path/to/file.java another/file.yaml
  4. Chat with the AI, e.g., “Add field X to entity Y and update the DB schema”

  5. Let aider propose changes. You can confirm or skip each diff.

  6. Exit with /quit

For more commands seen aider’s usage documentation.

Example Session: Adding a Field to an Existing Entity
#

My use case is adding a notes field to the partner_details table and related code (Java entity, patcher, Liquibase, OpenAPI, tests).

I initially tried to just ask aider to figure it all out, e.g. like this:

$ aider
/ask
My use case is adding a `notes` field to the `partner_details` table and related code (Java entity, patcher, Liquibase, OpenAPI, tests).
Where do I need to add field `notes`?

That didn’t work too well. Even with advanced models like GPT-4 or DeepSeek’s reasoning model, it missed files or proposed unnecessary ones. Of course, I tried different ways of phrasing my question - nothing worked well enough.

So I pre-selected all relevant files using good old grep:

aider `grep -rl registrationOffice src/main/java/ src/test/java/ src/main/resources/api-definition src/main/resources/db/`

Then I told aider:

I want to add a text field notes to the database table hs_office.partner_details and related files. Files to amend have already been added to aider AI. Please apply all required changes for Java production+test-code, add the Liquibase changeset and amend the OpenAPI-Spec.

— aider

After letting aider propose and apply all changes, I ran the tests (using my custom test alias gw-test) and found one issue: The field was added in test data, but not asserted anywhere. I asked aider:

Please doublecheck if you followed all conventions. Any other amendments necessary to support the new field notes in the partner details?

— aider

It suggested more changes, some useful, some not so useful. Eventually, I decided to just revert some test data changes with git and re-ran the tests. All tests passed now.

The resulting changes can be found in this git commit.

Determinism and Randomness
#

Keep in mind that LLMs operate with a parameter called temperature which introduces randomness. So the AI might not always produce the same result for the same input.

Sometimes that’s helpful. Sometimes it’s annoying. Be prepared.

Security: What Does aider Access?
#

I wanted to know which files aider actually opens. So I traced it with strace:

strace -f -t -e trace=file -o build/aider.strace aider ...

In a second terminal:

tail -f build/aider.strace | grep -oP '"\K[^\n"]+(?=")'

All accessed files made sense. Of course, there’s no guarantee — it’s still a local app running with your user permissions.

There is a Docker image, but it’s pretty restricted. If you need advanced features (like vision or Gemini), you might need to rebuild the image with extra support.

Summary
#

aider is a promising tool for LLM-driven development. Though, it won’t yet fully understand the domain logic or large code base structures — but if you provide the right files and instructions, it can save a lot of time.

It acts somewhat like an entry level programmer, as it needs a senior to provide some rules and guidance.

I’m definitely looking forward how aider and the LLMs will improve in the future. But I also think they’ll always need somebody who knows how to guide them to read the intended goal. Anyway, the software development industry is at the brim of a disruptive change.

Any comments about this article are welcome on X.