blog·3 min read

8 bugs we only found by using it ourselves

What went wrong when we started using our Claude assistant in DirectAdmin ourselves. From vanishing buttons to 1 GB of forgotten processes.

The tests passed and the screenshots looked good. Then we started using the assistant ourselves on real websites. Within a few hours we had this list. They're all fixed now, but each one is a lesson for anyone building something similar.

1. "Allow" was there, but you couldn't see it

A long chat, an approval card, and no buttons. The cards sat in a flex column with overflow: hidden. As soon as the conversation got longer than the screen, every card shrank to a thin line. You never see that in short test conversations.

Lesson: put flex-shrink: 0 on the items of a scrolling flex column, and test with a long conversation.

2. Everything appeared twice

Text streamed in live, word by word. Then the complete answer appeared a second time. The full message arrived before the last pieces of the stream.

Lesson: as soon as the complete text block is in, ignore any pieces that arrive after it.

3. "Claude is working…", but Claude was waiting for you

The status line said "Running: wp core check-update" while a card was waiting for approval. Because of bug 1, you couldn't see that card either. The result: everyone was waiting for each other.

Lesson: make the status say it's waiting for you, and scroll the question into view.

4. A multiple-choice question became a yes/no question

Claude asked "What should the new price be?" with three options. Our interface showed "Allow / Deny". After "allow" Claude still knew nothing, and asked the question again in text. The answer to such a question has to go back through updatedInput.answers. Details in Claude Agent SDK: approvals and questions.

5. The chat got wider than the screen

One long line of code in a diff, and the entire chat column became 1868 pixels wide inside a 1020-pixel box. Everything on the right fell off, including the options of a question.

Lesson: grid and flex items have a minimum width equal to their content by default. Put min-width: 0 on the column.

6. 1 GB of processes nobody used anymore

With every update of the background service, the running assistant processes of some accounts kept going. Their connection was gone, but the process simply waited for the next question. After an evening of development there were four of them, together over 1 GB of memory.

Lesson: make a process exit when its input closes, and clean up leftover processes at startup.

7. Logged in according to the check, logged out in reality

The connect page said "connected", but the first instruction failed with "OAuth session expired". The status check only looked at whether there was a token, not whether that token still worked.

Lesson: recognise the error in the conversation and let the user reconnect straight away.

8. A homepage was mistaken for a default page

When connecting a GitHub repository, the system moved every existing index.html aside, assuming it was DirectAdmin's placeholder. It was a real page. Safely kept and quickly restored, but not what we intended. The full story is in from git push to live in 3 seconds.

What we learned

Automated tests found zero of these eight. They all surfaced through real use: long conversations, real WordPress sites with quirky plugins, a service restarting while someone is working. Using what you build yourself is still the best test.

MK
Maarten Keizer

Founder of Invoker. Over twenty years in hosting, system administration and web development; builds the Claude hosting himself and tests everything on our own servers first.

about maarten