Building an Intern
I’ve been building Junior for the last four months. The short version: it’s an intern in Slack.
Originally it started as a joke, it’s my junior, but only in the sense that I’m grounded in what models are and aren’t capable of. I describe it as an intern because I think that’s a pretty literal concept here. You give them information, you review their work, and you steer them in the right direction.
My goal was pretty straightforward:
perform basic tasks within Slack
keep the runtime as secure as is practical
avoid running infrastructure
It seemed easy at first. I wrote about the early version in Building a Slack Agent with Pi on Vercel. It worked, but you were quick to spot things that could be improved in the UX and limitations of using stateless compute.
I spent the next four months iterating on my ideas and bringing some sense of stability to the harness. Frankly it was a lot more effort than I had expected. It’s now around 100,000 lines of TypeScript before you count tests, evals, docs, and the all-important lockfiles. I mention this because I want people to understand software isn’t free, and if you want to turn an idea into a good product, it’s still a large (and often ongoing) time commitment. This project probably amplified that.
The code is open source at github.com/getsentry/junior, and the docs live at junior.sentry.dev.
#I don’t want another agent
Every vendor is building an agent now. Sentry has one. So does Datadog, GitHub, Linear, and everyone else under the sun. They’re fine, but they’re constrained. They know their product better than an MCP and a set of skills, and they often add value here and there due to their specialization. They just don’t hit for me. I don’t work with one product, nor do I work with the concepts and playbooks that any given vendor decides matter for me.
I have conversations - mostly in Slack - where in any given moment I want to answer a question from any given source of material, turn that into an action-now or action-later task, and I don’t want to worry about which of N bots I need to cross-collaborate with to do that. More importantly, I also don’t want to jump into something like Chat or Claude to answer these concerns.
This is what I am addressing with Junior. In the same way any other generalized agent would do it, but one built for us.
Instead of asking a PM how some part of Sentry works, you can ask Junior. Not because Junior already knows, because it usually doesn’t. Because it can (and will!) go look: search the repo, trace the code path, and answer from code instead of ignoring your question or only doing a half-ass job.
Junior answering a Slack question about how access to private code actually works.
The first early win truly was GitHub issues for me. We already had Linear in Slack and folks regularly used it to quickly create issues (albeit, not great versions), but we were missing this kind of productivity boost for GitHub. So many times I’d find myself working on a project, having a conversation, just wishing I had an agent right there that I could tag, have it summarize it, and open the ticket. Now I do. Even more so, I can have Junior go deeper than any of these other tools would: do the gap analysis, create an RCA, and really give a solid starting point for just summarizing a few sentences of text. Unlike the rest of us, it doesn’t get lazy halfway through.
Visual QA was another one. Junior does this with Vercel’s agent-browser. Someone can ask it to open a feature, click around, take screenshots or videos, and write up the rough edges in the same thread where the team is already talking about the work. We’re still early here, but my hope is we can get the agent automatically QA’ing most Sentry frontend changes since the experience here is really great.
Junior doing visual QA. Not perfect, obviously: I still had to ask where the files went.
The collaborative part was almost accidental. I mostly wanted access to these tools from Slack, but as soon as that worked, everyone else saw the value. There was a bit of a push on our end (“waste the robots’ time instead of humans, please”), but broadly speaking I think it’s hard to not recognize the value once you experience it. Junior quickly went from getting tagged here and there to being used quite frequently throughout the day.
#Junior is not trying to win the agent race
Junior is a harness more than it is a finished agent, and it isn’t going to be the best at everything.
I know the comparison people will make: OpenClaw, Hermes, or whatever other slop is popular this week. I don’t pay them much attention other than looking for inspiration here and there. I’m trying to solve Sentry’s problem: a secure agent in Slack that has access to as much of our workflow toolchain as it can. One that increases in value over time, and one where we won’t create liability that is otherwise avoidable.
My best example is coding tasks. Junior can do them, but it’s absolutely garbage...