The 25-Year Argument

We met at 13. Every Counter-Strike clan needed a website back then. You couldn't be taken seriously without one. Somewhere to show off your team photo, your match results, your clan tag in a font that looked vaguely military.

So Bernhard picked up a book about HTML. I found a pirated copy of Photoshop. That was the beginning. Nobody decided who would do what. It just happened. He was immediately drawn to the code. I went straight for the visual side.

Twenty-five years later, we're still doing exactly that.

What stayed the same

The lines never blurred. I tried learning to code and have a graveyard of programming books, none of them read past page 20. Bernhard never tried the other direction. His UIs still look like they were designed by someone who actively dislikes the people who will use them.

We never overlapped. Which sounds like it would make things easier, but it doesn't.

After collaborating on dozens of projects over the years, what kept us together was never the work itself. It was what we both wanted from it. A company built on our own terms. No outside capital, no external pressure. Lots of freedom for everyone involved. That shared conviction is what led to appointmed and it also kept us in the same room through all the highs and lows.

Where we clash

For years we ran the company like Bernhard had learned at his previous jobs. Jira, sprints, daily standups. The full playbook of how professional software teams are supposed to work. With three developers.

I hated it. It might be the right process for a team of a hundred engineers at Meta, not three developers who already knew exactly what they were doing. He resisted every suggestion to change it. “That's just how professional programmers work” was the standard response.

For years I pushed back half-heartedly and got nowhere. There was always something more urgent to deal with just to keep the company alive. Eventually, I spent weeks building an alternative approach from scratch and made the whole team sit through an hour-long presentation. We replaced every synchronous meeting with writing and async processes. More autonomy, less overhead, better decisions. Finally, I won everyone over, including Bernhard.

That's the shape of most of our clashes. He defaults to how things are done at scale. I default to how things should work for us, right now, with the team we have.

What it looks like in practice

It can get loud. We had arguments drag on for days, in one case even weeks. Team members who joined us in recent years were genuinely shocked the first time they saw it. Two people who've been building things together since they were teenagers, going at it like the other one just suggested burning the company down.

The module service is a good example of what unchecked complexity costs. It controls which features each customer can access. We rebuilt it multiple times because Bernhard kept finding a cleaner, more scalable architecture. Each version was technically better than the last. Testing it after every iteration became a frustrating exercise for the whole team. Each rebuild cost us months. The product didn't visibly improve. Customers didn't notice. Only we knew.

Running a company together for this long is like a long marriage. You learn how the other person works. You develop a feel for when to push and when to let it go. You find the compromise not because it's perfect, but because the alternative is worse.

It's more civil now. Not because the philosophical gap closed. It hasn't. But back when we had 50 customers, every disagreement felt existential. The company's survival was genuinely on the line. At 3,500+, the foundation is solid enough that we can argue about the walls without worrying they'll fall.

What I didn't expect

Last week, we were talking about what it would look like to rebuild the entire product from scratch. What we'd do differently. How we'd approach it now.

Bernhard brought up agentic coding. And then he said something I've been arguing for, in one form or another, for most of our working lives: we could use it to dramatically simplify the codebase.

Not scale it. Not make it more powerful. Simplify it.

The argument I couldn’t win in ten years of conversations became obvious to him in one morning, after his AI agents reviewed the current codebase. I’m not sure how to feel about that. It felt vindicating and deflating at the same time.

But here's what I keep coming back to: we wouldn't be where we are today without the tension. Without the compromises along the way.

His instinct toward complexity pushed us to build something that actually scales. We handle sensitive patient health data with a team of three developers. That's no small feat. His technical instincts are a big part of why we're still standing. Mine toward simplicity kept it at a level real people could use. Neither of us would have built appointmed alone. Not this version of it.

Two 13-year-olds split the work with a book and a pirated Photoshop copy, and spent the next 25 years arguing about everything that came after.

Turns out the argument was the point.