The Stack After Two Years

building-in-public

Summer is quiet. Client work, bookkeeping, the usual mid-year business rhythm. Not much engineering work happening, which makes it a good time to take stock of what we’ve built and where we stand.

Two years ago this month, Wave CI was our first internal tool, a CI server because nothing on the market fit how we deploy. Since then we’ve added Meera for project management, Journey for story mapping, Sirius2 as a design system, and HERB as a template language. That’s a lot of moving parts for a small team.

What’s pulling its weight

Meera is the clear winner in terms of daily impact. We live in it. Every project, every task, every sprint. The LDAP integration means nobody thinks about account management. The board-local IDs (STORY-42, BUG-17) show up in commit messages, Slack conversations, client emails. It’s become invisible infrastructure. That’s the highest compliment for an internal tool.

Wave CI just works. Builds run, deployments happen, rollbacks are there when we need them. The zero-config discovery is still the thing I’m happiest about. Most of our projects don’t have a wave-ci.yml because the defaults handle it. The real-time output streaming via Turbo Streams has been rock solid.

Sirius2 is maturing nicely. Around thirty components, semantic tokens throughout, and the products genuinely look consistent. The Atlassian problem we set out to solve, four products looking different despite shared components, is solved. When we build a new page in any product, it looks like a KUY.io page automatically.

HERB has transformed how we write views. Dogfooding it in Sirius2 proved the concept. Writing <Card title="Settings"> instead of ERB render calls is one of those changes where going back feels impossible. We’re already talking about converting Journey’s views next.

Reflections

You can’t have the design system without the products. It’s tempting to think “we should have built Sirius2 first.” But we couldn’t have. Building Wave CI and Meera showed us how important design consistency is. You have to build the products to understand what the design system needs to encode. The order was right, it just means there’s retrofit work as the system matures.

LDAP everywhere. Every tool that has users needs to integrate with Active Directory. We learned this with Meera’s LDAP integration, which is the feature that made Meera a real internal tool. Now it’s a requirement for everything we build. Individual user databases are a non-starter.

Component documentation vs. design documentation. Sirius2’s components are documented: props, slots, examples. What’s missing is the design language documentation: color philosophy, depth system, layout principles, voice and tone. The components tell you how to use them. Nothing yet tells you why the design decisions were made the way they were. That’s the gap we need to fill.

What’s next

The biggest gap in our stack is artifact management. We’re still running Nexus for gems and Docker images.

Our Bitbucket is also on borrowed time. Atlassian isn’t patching it anymore, and the API deprecation issues are going to get worse. We need a plan for source code hosting.

Right now, our stack is solid. Four products, all running in production, all doing their jobs. The tools we’ve built are tools we use every day. That’s the validation that matters.