AI Engineer World's Fair 2025
Software Development Agents: What Works and What Doesn't
Read the talk
Software Development Agents: What Works and What Doesn't
Coding agents can take over the write–run loop, but effective delegation still depends on precise tasks, useful feedback, bounded permissions and human ownership.
From a talk by Robert Brennan
Before you start: Familiarity with pull requests, automated tests, command-line tools and basic web development will help you follow the examples.
Less typing, more engineering
Which parts of software development can you hand off, and which still need your judgment? Coding agents make that question practical: some tasks work remarkably well, while others demand repeated intervention. Robert Brennan brings the perspective of more than a decade building open-source developer tools and his team's work on OpenHands, formerly OpenDevin.
In this 2025 talk, Brennan describes a profession already different from two years earlier and likely to change again over the next two. His prediction is that developers will spend much less time writing code, without software engineering disappearing. The shift is from leaning forward and squinting into an IDE to sitting back and asking what users want, what the organization needs and which architecture will support the future.
The write–run loop is a good target for automation; deciding what deserves to be built remains an engineering responsibility. An agent can repeatedly write code, execute it and respond to the result. That does not give it the same grasp of users or business objectives as the people responsible for the product. Fewer keystrokes should leave more room for thinking, imagination and creativity.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
From autocomplete to delegated work
An agent has agency because it can act outside the model. For software development, that means access to familiar tools: an editor to navigate and modify files, a terminal to run code, and a browser to consult documentation or find examples on Stack Overflow. Together, these let the agent participate in the development loop rather than merely suggest its next line.
| Tool style | Unit of assistance | Developer interaction |
|---|---|---|
| GitHub Copilot autocomplete | Two or three lines at the cursor | Developer drives each edit |
| AI-powered IDE | Several development steps | Developer intervenes between runs |
| Devin or OpenHands | A task described in one or two sentences | Agent works asynchronously and returns a result |
Brennan describes the last category as working independently for five, ten or fifteen minutes. That changes how work can be organized: dispatch several agents, then communicate with coworkers—or browse Reddit—while they work. The benefit comes from delegating a stretch of activity instead of supervising every keystroke.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
The action and feedback loop
Understanding the machinery helps explain both successful delegation and failure. At the center is a loop between a large language model and the external world:
- Give the model its goal and the information accumulated so far.
- Ask it to choose the next action that moves toward that goal.
- Execute the action: read a file, make an edit, run a command or inspect a webpage.
- Return the observed result to the model for its next decision.
The model supplies the next step; the surrounding system performs it and supplies feedback. File contents, command output and webpage contents become evidence for the next turn. An agent's effectiveness therefore depends on the tools and observations around the model as well as on the model itself.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Editing without rewriting everything
The simplest editor interface would send the old file to the model and ask for a complete replacement. But changing one line in a file containing thousands of lines would require generating all the unchanged content again. That spends output tokens on material the agent did not need to modify.
Targeted edits keep the operation proportional to the change. Find-and-replace editors let the model identify existing text and supply its replacement. Diff-based editors express the lines to remove and add. Both avoid reproducing the entire file for a small modification.
Editing is only part of the problem. Agents also need to locate relevant code. An abstract syntax tree, or another structured navigation facility, can help them explore a codebase more effectively before choosing what to change.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Terminals and browsers need more than text input
A terminal appears to be a simple text-in, text-out interface until commands stop behaving like short function calls. A long-running command may produce no standard output: should the system kill it, or let the model wait? Other tasks require parallel commands or background processes. Starting a server and then running curl against it requires the server to remain alive while the next command executes. These are process-lifecycle decisions that the agent's terminal tool must support.
Browser tools introduce another problem: how much of a page should the model see? Returning raw HTML is straightforward, but it includes substantial markup and other material irrelevant to the task. Brennan describes several alternatives:
- Accessibility trees expose a structured representation of the page.
- Markdown conversion provides readable content with less markup.
- Scrolling lets the agent inspect a large page in portions.
Interaction adds another layer. The agent can write JavaScript against the page, or receive a screenshot with labeled nodes and identify the element it wants to click. The representation must support both understanding the page and choosing an action on it.
Brennan reports that a contribution roughly a month before the talk doubled OpenHands' web-browsing accuracy. He does not identify the benchmark, baseline, model or evaluation conditions, so the figure describes a reported project improvement without establishing a general browsing success rate.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Bound the agent's reach
Autonomous execution makes sandboxing essential. Brennan describes OpenHands agents running in Docker containers by default, separated from the developer's workstation. His example is preventing an agent from applying rm -rf to the host home directory. That protection depends on configuration: the maintained OpenHands v0 Docker documentation warns that agents can modify or delete host files mounted writable into their workspace. A container does not make those mounts untouchable.
External credentials create a separate boundary. A GitHub token or access to an AWS account lets an agent affect resources outside its container. Least privilege means tightly scoping those credentials to the operations the task requires. Workstation isolation and service permissions must both be considered when granting autonomy.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Start small, then make the instructions precise
The best starting task fits in a single commit and has a clear definition of done. The agent needs a completion signal—tests passing or merge conflicts resolved—and the engineer needs an easy way to check that the work is complete and correct. A pull request with one failing test, lint errors or merge conflicts supplies exactly this kind of bounded chore.
Task size can grow as you learn how to communicate with the agent and recognize its strengths. Brennan estimates that 90% of his code goes through an agent, with a return to the IDE needed perhaps 10% of the time. This is his personal account of an established workflow, reached through practice rather than an expectation for someone's first task.
Specify how the work should be done as well as what should change. Name the framework, request test-driven development if that is the desired approach, and point to relevant files or functions. An exact file reference reduces the exploration required before editing. Better instructions can therefore improve the result while also reducing elapsed time, token use and inference cost.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Keep useful context; discard a bad direction
Cheap code generation changes the economics of experimentation. Brennan describes giving OpenHands voice instructions on his walk to work and finding a pull request waiting when he arrives. In Brennan's walk-to-work prototyping anecdote, he discards 50% of the resulting pull requests and merges 50%. The point is the freedom to try an idea without committing to salvage every implementation.
A failed attempt leaves two useful choices:
- Close to correct: continue in the same conversation, where the agent already has relevant context.
- Far off target: discard the work and start a fresh conversation with a better prompt informed by what went wrong.
Throwing away tens of thousands of generated lines can feel wasteful to someone accustomed to code being expensive. But preserving a bad direction simply because it produced a large diff defeats the advantage of inexpensive experimentation.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Review the result and give it a human owner
Generated code still needs review. Brennan has seen organizations run into trouble by automatically merging AI output into production applications. Without scrutiny, the codebase accumulates duplicate implementations and technical debt. Pull the changes and run them locally or in an ephemeral environment; verify that they solve the requested problem. Experience can build confidence in an agent's recurring strengths, but confidence does not replace checking the result.
OpenHands' early pull-request workflow exposed a subtler failure. Generated PRs appeared under OpenHands, with the hands logo as their owner. The person who initiated the work could then approve the bot-owned PR, bypassing the team's requirement for another human reviewer. The separation between requester and nominal author weakened the intended review control.
Those PRs also lacked an obvious person responsible for moving them forward. A failing unit test could leave one languishing, and a merged change that broke something offered no clear human owner to approach. Brennan describes changing the workflow so that the initiating user's face appears on the PR. That person is responsible for getting it merged and for any later breakage. Delegating implementation does not delegate accountability.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Pull-request maintenance and small fixes
Agents are generalists, but their broad capabilities become easier to use when work is broken into bite-sized steps. Merge conflicts are Brennan's favorite starting point. In the fast-moving OpenHands repository, his PRs frequently encounter conflicts. A comment such as @OpenHands, fix the merge conflicts on this PR delegates the comparison of earlier changes, the current PR's changes and the intent behind each.
Brennan says OpenHands resolves his merge-conflict chores 99% of the time. He supplies no evaluation denominator, task-selection criteria or measurement period. Reviewer feedback is another useful input because someone has already articulated the requested change: @OpenHands, do what that guy said points the agent at that specification. In his React example, a front-end engineer used terminology Brennan did not know well, but the agent understood the instructions and implemented the requested changes.
Small UI bugs can be delegated without the overhead of locating the file yourself. Brennan's example is an input rendered as text that should have been numeric. The essential change can be illustrated in JSX:
jsx
export function QuantityInput() {
return (
<label>
Quantity
<input name="quantity" type="number" />
</label>
);
}
Here, the relevant correction is changing type="text" to type="number"; the surrounding component provides a concrete example. Brennan recalls requesting his fix directly from Slack by referring OpenHands to the issue they had just discussed. He did not need to open his IDE or manually find the implementation.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Infrastructure, migrations and tests
Infrastructure changes often involve specialized syntax that is tedious to retrieve. For Terraform, the model may already know the syntax; otherwise, its browser can retrieve the documentation. Brennan describes an operational trigger as simple as an out-of-memory exception appearing in Slack, followed by a request for OpenHands to increase memory.
Database migrations are another task where conventions matter. Brennan admits that he sometimes neglects appropriate indexes or foreign keys and finds that LLMs tend to follow those migration practices well. The appeal is assistance with routine implementation details that are easy for a busy developer to overlook.
| Test task | Starting point | Agent's assignment |
|---|---|---|
| Repair a failing test | A nearly complete PR has a unit test broken by an API change | Resolve the failure |
| Expand coverage | A specific area has little test coverage | Add tests for that area |
The first task finishes work already close to completion. The second improves a neglected part of the codebase without requiring a new product feature. Brennan describes passing coverage additions as generally safe to merge, making them an attractive early task within the review discipline established earlier.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Building internal applications from scratch
Greenfield applications are appealing because the agent can produce an entire working surface quickly. Brennan repeats his warning against turning unreviewed generated code into a production application, then describes a different tradeoff for internal tools. His team built a web application for debugging OpenHands trajectories and sessions. Because it served internal needs rather than end users, they accepted lighter review instead of inspecting every line.
That internal debugging tool illustrates the business value of quickly building a small application for a specific need. The accompanying slide shows a separate, visible app result: an empty Todo List interface with an input, an Add button, All, Active and Completed filters, and a Clear completed control, alongside agent conversation screenshots. It is an example of the greenfield interface on screen, not a view of the trajectory debugger.
Brennan closes by inviting developers to build with the OpenHands community on GitHub, Slack and Discord. The practical opportunity is to turn well-bounded needs—including internal tools that might otherwise stay on a backlog—into reviewable working software.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Source code, setup instructions and contribution information for the software development agent.
Further reading
The foundational paper describing OpenHands tools, sandboxed execution and evaluation framework.
The 2025 launch announcement explains GitHub mentions, pull-request assistance and parallel agent sessions.
Research on extending coding agents with visual browsing, web search and multimodal file access.
Updates since the talk
Maintained v0 runtime guidance covering filesystem mounts, permissions and Docker hardening.
Read the complete timestamped transcript
- 0:00
[on hold music] Today, I'm gonna talk a little bit about, uh, coding agents and, uh, how to use them effectively, really.
- 0:20
Um, if you're anything like me, you found that, uh, you found a lot of things that work really well and a lot of things that, uh, don't work very well.
- 0:27
Um, so a little bit about me. Uh, my name is Robert Brennan. I've been building, uh, open source development tools for, for over a decade now. Uh, and my team and I, uh, have created, uh, an open source, uh, software development agent called OpenHands, formerly known as OpenDevin.
- 0:45
So to, to state the obvious, in twenty twenty-five, software development is changing. Uh, our jobs are, are very different now than they were two years ago, uh, and they're gonna be very different two years from now.
- 0:56
Uh, and the thing I wanna convince you of is that coding is going away. Uh, we're gonna be spending a lot less time actually writing code. Uh, but that doesn't mean that software engineering is going away.
- 1:05
Uh, we're paid not to, to type on our keyboard, but to actually think critically about the problems that are in front of us. Uh, and so if we do AI-driven development correctly, um, it'll mean we spend less time actually, like, leaning forward and squinting into our IDE and more time kinda sitting back in our chair and thinking,
- 1:22
you know, what does the user actually want here? Uh, what are we actually trying to build? What, what problems are we trying to solve as an organization? Uh, how can we architect this in a way that sets us up for the future?
- 1:32
Uh, the AI is very good at that, at that inner loop of development, the write code, run the code, write code, run the code. It's not very good at those kind of big picture tasks that have to take into account, um, that have to, like, empathize with the end user, uh, take into account business level objectives, uh,
- 1:46
and that's where we come in as, as software engineers.
- 1:52
Uh, so let's talk a little about, uh, what actually a, a coding agent is. Uh, I think this word agent gets thrown around a lot these days. Uh, the meaning has started to, to drift over time, uh, but at the core of it is this, this concept of agency.
- 2:04
Um, it's this idea of, of taking action out in the real world. Um, and these are, these are the main tools of a software engineer's job, right? We have a, a code editor to actually modify our code base, navigate our code base.
- 2:17
Uh, you have a terminal, uh, to help you actually run the code that you're, that you're writing. Uh, and you need a web browser in order to look up documentation and maybe copy and paste some code from Stack Overflow.
- 2:27
So these are kind of the core tools of the job, and these are the tools that we give to our agents to let them do their whole, uh, development loop.
- 2:35
I also wanna contrast, uh, you know, coding agents from some more tactical codegen tools that are out there. Um, you know, we kinda started a couple years ago with things like, uh, GitHub Copilot's auto-complete feature where, you know, it's literally wherever your cursor is pointed in the code base right now, it's just filling out two or three
- 2:51
more lines of code. Um, and then over time, things have gotten more and more agentic, more and more asynchronous, right? Uh, so we got, like, AI-powered IDEs that can maybe take a few steps at a time without, uh, a developer interfering.
- 3:04
And then, uh, now you've got these tools like Devin and OpenHands where you're really giving an agent, you know, one or two sentences describing what you want it to do.
- 3:12
It goes off and works for five, ten, fifteen minutes on its own and then comes back to you with a solution. This is a much more powerful way of working.
- 3:19
You can get a lot done. Uh, you can send off multiple agents at once. Um, you know, you can focus on communicating with your coworkers or goofing off on Reddit while these agents are, are working for you.
- 3:31
Um, and it's, uh, it's just-- it's a, it's a very different way of working, but it's a much more powerful way of working.
- 3:38
Uh, so I wanna talk a little bit about how these agents work under the hood. I feel like, uh, once you understand what's happening under the surface, uh, it really helps you build an intuition for how to use agents effectively.
- 3:50
Uh, and at its core, um, an agent is this loop between a large language model and the, and the external world. So, uh, the large language model kinda serves as the brain, uh, and then we have to repeatedly take actions in the external world, get some kind of feedback from the world, and pass that back into the
- 4:06
LLM. Um, uh, so basically at every, every step of this loop, we're asking the LLM, "What's the next thing you wanna do in order to get one step closer to your goal?"
- 4:15
Uh, it might say, "Okay, I wanna read this file. I wanna make this edit. I wanna run this command. I wanna look at this webpage." Uh, we go out and take that action in the real world, get some kind of output, whether it's the contents of a webpage, uh, or the output of a command, and then stick
- 4:28
that back into the LLM for the next turn of the loop.
- 4:33
Uh, just to talk a little bit about kind of the core tools that are at the agent's disposal. Uh, the first one, again, is a, is a code editor.
- 4:40
Um, you might think this is, this is really simple. It actually turns out to be a fairly, uh, interesting problem. Uh, the naive solution would be to just, like, give the old file to the LLM, uh, and then have it output the entire new file.
- 4:51
That's not a very efficient way to work though. If you've got a thousand line, uh, thousand line of-- thousands of lines of code and you wanna just change one line, uh, you're gonna waste a lot of tokens printing out all the lines that are staying the same.
- 5:03
So most, uh, contemporary, um, agents use, uh, like a, a find and replace type editor or a diff-based editor to allow the LLM to just make tactical edits inside the file.
- 5:15
Uh, a lot of times they'll also provide, uh, like an abs- abstract syntax tree or some kind of way to allow the agent to navigate the code base more effectively.
- 5:25
Uh, next up is the terminal, and again, you would think text in, text out should be pretty simple, but there are a lot of questions that pop up here.
- 5:31
You know, what do you do when there's a long-running command that has no standard out for a long time? Do you kill it? Do you let the LLM wait?
- 5:37
Uh, what happens if you wanna run multiple commands in parallel, run commands in the background? Maybe you wanna start a server and then run curl against that server. Uh, lots of really interesting, uh, problems that crop up, uh, when you have an agent interacting with the terminal.
- 5:51
Uh, and then probably the most complicated tool is the web browser. Again, there's a naive solution here where you just-- uh, the agent just gives you a URL, and you give it a bunch of HTML.
- 6:00
Um-
- 6:00
That's, uh, very expensive because there's a bunch of cruft inside that HTML that the, the LLM doesn't really need to see. Uh, we've had a lot of luck passing it, uh, accessibility trees or converting to Markdown and passing that to the LLM, um, or allowing the LLM to maybe scroll through the webpage if there's a ton of
- 6:15
content there. Um, and then also if you start to add interaction, things get even more complicated. Uh, you can let the LLM, uh, write JavaScript against the page, uh, or we've actually had a lot of luck basically giving it a screenshot of the page with labeled nodes, and it can say what it wants to click on.
- 6:31
Uh, this is an area of active research. Uh, we just had a contribution about a month ago that doubled our accuracy on web browsing. Uh, I would say this is, uh, this is definitely a space to watch.
- 6:43
Uh, and then I also wanna talk about, about sandboxing. Uh, this is a really important thing for agents because if they're gonna run autonomously for several minutes on their own without you watching everything they're doing, you wanna make sure that they're not doing anything dangerous.
- 6:56
Uh, and so all of our agents run inside of a Docker container by default. Um, they're, they're totally separated out from your workstation, so there's no chance of it running rm -rf on your home directory.
- 7:07
Um, increasingly though, we're giving agents access to third-party APIs, right? So you might give it, uh, access to a GitHub token or access to your AWS account. Super, super important to make sure that those credentials are tightly scoped and that you're following, uh, the principle of least privilege as you're granting agents access to do these things.
- 7:27
All right, I wanna move into some best practices.
- 7:31
Uh, my, my biggest advice for folks who are just getting started is to start small. Um, the best tasks are things that can be completed pretty quickly, you know, a single commit, uh, where there's a clear definition of done.
- 7:42
You know, you want the agent to be able to verify, okay, the tests are passing. I must have done it correctly. Um, or, you know, the merge conflicts have been solved, et cetera.
- 7:51
Um, and tasks that are easy for you as an engineer to verify, uh, were done completely and, and correctly. Um, I like to tell people to start with small chores.
- 7:59
Uh, very frequently you might have a pull request where there's, you know, one test that's failing or there's some lint errors or there's merge conflicts, uh, bits of toil that you don't really like doing as a developer.
- 8:08
Those are great tasks to just shove off to the AI. They tend to be, tend to be very rote. Uh, the AI does, does them very well. Um, but as your intuition grows here, as you get used to working with an agent, you'll find that you can give it bigger and bigger tasks.
- 8:20
Uh, you'll, you'll understand how to communicate with the agent effectively. Um, and I would say for, for me, for my co-founders, and for our, for our biggest power users, uh, for me, like 90% of my code now goes through the agent, and it's only maybe 10% of the time that I have to drop back into my IDE
- 8:35
and kinda get my hands dirty in the code base again.
- 8:40
Uh, being very clear with the agent about what you want is super important. Uh, I specifically like to say, you know, you need to tell it not just what you want, but you t- need to tell it how you want it to do it.
- 8:48
You know, mention specific frameworks that you want it to use. Uh, if you want it to do like a test-driven development strategy, tell it that. Uh, mention any specific files or function names that it can, that it can go for.
- 8:59
Um, this not only, uh, helps it be more accurate and, uh, you know, more clear as to what exactly you want the output to be, um, it also makes it go faster, right?
- 9:08
It doesn't have to spend as long exploring the code base if you tell it, "I want you to edit this exact file."
- 9:14
Um, this can save you, uh, a bunch of time and energy, and it can save, uh, a lot of, a lot of tokens, a lot of actual like inference costs.
- 9:22
Uh, I also like to remind folks that in an AI-driven development world, code is cheap. Um, you can throw code away. You can, you can experiment and prototype. Uh, I love if I, if I have an idea like on my walk to work, I'll just like, uh, you know, tell OpenHands with my voice like, "Do X, Y,
- 9:38
and Z," and then when I get to work I'll, I'll have a PR waiting for me. 50% of the time I'll just throw it away. It didn't really work.
- 9:44
50% of the time it looks great and I just merge it and it's, and it's awesome. Um, it's, uh, it's really fun to be able to just rapidly prototype using AI-driven development.
- 9:53
Um, and I would also say, you know, if you, if you try to, try to work with the agent on a particular task and it gets it wrong, maybe it's close and you can just keep iterating within the same conversation and it's already built up some context.
- 10:05
If it's way off though, just throw away that work. Start fresh with a new prompt based on, uh, what you learned from the last one. Um, it's really, really, uh, I think, uh, it's a new, new sort of muscle memory you have to develop to just throw things away.
- 10:18
Sometimes it's, uh, hard to throw away tens of lines, tens of thousands of lines of code that, uh, have been generated 'cause you're used to that being a very expensive, uh, bunch of code.
- 10:28
Uh, these days it's, it's very easy to kind of just start from scratch again.
- 10:34
This is probably the most important bit of advice, uh, I can give folks. Uh, you need to review the code that the AI writes. Uh, I've seen more than one organization run into trouble, uh, thinking that they could just vibe code their way to a production application, uh, and just, you know, automatically merging everything that came out
- 10:49
of the AI. Um, but, uh, if you just, you know, don't review anything, you'll find that your code base just grows and grows with this tech debt. You'll find duplicate code everywhere.
- 11:00
Uh, things get out of hand very quickly. Uh, so make sure you're reviewing the code that it outputs and make sure you're pulling the code and running it on your workstation or running it inside of an ephemeral environment, uh, just to make sure that, you know, the agent has actually solved the problem that you asked it to
- 11:12
solve. Uh, and I like to say, you know, trust but verify. You know, as you work with agents over time, you'll build an intuition for, for what they do well and what they don't do well, and you can generally trust them to, to, um, you know, operate the same way today that they did yesterday.
- 11:28
Um, but you really, you really do need a human in the loop. Um, you know, one of our big learnings, uh, with OpenHands, in the early days if you opened up a pull, pull request with OpenHands, uh, the, that pull request would show up as owned by OpenHands.
- 11:42
It would be the little hands logo, uh, next to the pull request, uh, and that caused two problems. One, it meant that the human who had triggered that pull request could then approve it and basically bypass our whole code review system.
- 11:53
You didn't need a second human in the loop to, uh, before merging. Uh, and two, oftentimes those pull requests would just languish. Uh, nobody would really take ownership for them.
- 12:02
Uh, if there was, like, a failing unit test, nobody was, like, jumping in to make sure the test passed. Um, and those, they would just kind of, like, sit there and not get merged.
- 12:10
Or if they did get merged and something went wrong, the code didn't actually work, we didn't really know who to go to and be like, you know, "Who caused this?"
- 12:16
There was nobody we could hold accountable for that breakage. Um, and so now if you open up a pull request with OpenHands, your face is on that pull request, you're responsible for getting it merged, you're responsible for any breakage it might cause down the line.
- 12:30
Well, and then, uh, I do wanna just close just by going through a handful of use cases. Uh, this is always kind of a tricky topic because agents are great generalists.
- 12:37
They can, they can hypothetically do anything as l- as long as you kind of, like, break things down into bite-sized steps that they can take on. Um, but in that, in that, um, in the spirit of starting small, I think there are a bunch of use cases that are, like, really great day one use cases for agents.
- 12:53
My favorite is resolving merge conflicts. This is, like, the biggest chore as a part of my job. Uh, OpenHands itself is a very fast-moving code base. Uh, I can say there's probably no PR that I make that, uh, I get away with zero merge conflicts.
- 13:06
Um, and I love just being able to jump in and say, "Add OpenHands, fix the merge conflicts on this PR." Uh, it comes in and, you know, it's such a rote task, it's usually very obvious, you know, what changed before, what changed in this PR, what's the intention behind those changes, and OpenHands knocks this out, you know,
- 13:20
99% of the time. Uh, addressing PR feedback is also a favorite. Uh, this one's great because somebody else has already taken the time to clearly articulate what they want changed, and all you have to do is say, "Add OpenHands, do what that guy said."
- 13:34
Uh, and again, uh, like you can see in this example, uh, OpenHands did exactly what this person wanted. I don't know React super well, and, uh, our front-end engineer was like, "Do X, Y, and Z," and he mentioned a whole bunch of buzzwords that I don't, I don't know.
- 13:47
OpenHands knew all of it, and, uh, was able to address his feedback exactly how he wanted.
- 13:53
Uh, fixing quick little bugs. Um, you know, you can see in this example we had, uh, an input, uh, that, you know, was a text input, should've been a number input.
- 14:00
Uh, if I wasn't lazy, I could've, like, dug through my code base, found the right file. Um, but it was really easy for me to just, like, quickly-- I think I did this one from directly inside of Slack.
- 14:09
Uh, just add OpenHands, fix this thing we were just talking about. Uh, and, uh, it's just, you know, really, I don't even have to, like, fire up my IDE.
- 14:18
Um, it's just, it's a really, really fun way to work.
- 14:22
Uh, infrastructure changes I really like. Uh, usually these involve looking up some, like, really esoteric syntax inside of, like, the Terraform docs or something like that. Um, OpenHands and, you know, the underlying LLMs tend to just, like, know, uh, the right Terraform syntax, and if not, they can, they can look up the documentation using the browser.
- 14:39
Um, so this stuff is, uh, is really great. Sometimes we'll just get, like, an out of memory exception in Slack and immediately say, "Okay, OpenHands, increase the memory."
- 14:48
Uh, database migrations are another great one. Uh, this is one where I find, uh, I often leave best practices behind. I won't put indexes on the right things. I won't set up foreign keys the right way.
- 14:58
Uh, the LLM tends to be really great about following all best practices around database migrations. So again, it's kind of like a rote task for developers. It's not very fun.
- 15:07
Um, uh, the LLM's great at it. Uh, fixing failing tests, uh, like, on a PR. Uh, if you've already got the code 90% of the way there, there's just a unit test failing because there was a breaking API change, very easy to call in an agent to just clean up the, the failing tests.
- 15:23
Uh, expanding test coverage is another one I love because, uh, it's a very, um, safe task, right? As long as the tests are passing, it's, uh, generally safe to just merge that.
- 15:33
So if you notice a spot in your code base where you're like, "Hey, we have really low coverage here," just ask, uh, ask your agent to, uh, expand your test coverage in that area of the code base.
- 15:42
Uh, it's a great quick win, uh, to make your code base a little bit safer.
- 15:47
Then everybody's favorite, building apps from scratch. Um, you know, I would say if you're shipping production code, again, don't just, like, vibe code your way to a production application.
- 15:56
Uh, but we're finding increasingly internally at our company, a lot of times there's, like, in a little internal app we wanna build. Uh, like, for instance, we built a way to, uh, debug OpenHands trajectories, debug OpenHands sessions.
- 16:08
Um, uh, we built, like, a whole web application that since it's just an internal application, we can vibe code it a little bit. We don't really need to review every line of code.
- 16:15
It's not really facing end users. Uh, this has been a really, really fun thing for our business to just be able to churn out these really quick applications, uh, just to serve our own internal needs.
- 16:25
Um, so yeah. Uh, greenfield is a great, great use case for agents. Um, that's all I've got. Uh, would love to have you all join the, the OpenHands community.
- 16:33
You can find us on GitHub, allhandsai/openhands. Um, join us on Slack, Discord. Uh, we'd love to build with you. [upbeat music]