back to index

Containing Agent Chaos — Solomon Hykes, Dagger


Whisper Transcript | Transcript Only Page

00:00:02.000 | - Hello, hello.
00:00:22.820 | Okay, my slides are up.
00:00:29.300 | You can see them, right?
00:00:31.600 | That's me.
00:00:32.940 | Okay.
00:00:34.040 | Well, this is a very special moment for me
00:00:35.880 | because I just realized yesterday walking in,
00:00:38.380 | this is the exact same spot, the same stage, actually,
00:00:41.580 | that I stepped on almost exactly day for day 10 years ago
00:00:45.440 | to kick off DockerCon 2015.
00:00:47.460 | I thought it was pretty funny.
00:00:49.320 | I don't know if anyone was there for that.
00:00:51.360 | Maybe this audience is too young, maybe.
00:00:54.520 | I don't know.
00:00:57.360 | Okay, well, I'm here to talk about chaos,
00:01:02.140 | specifically the kind of chaos that emerges
00:01:04.060 | when you try to use coding agents.
00:01:06.760 | And I want to talk about chaos
00:01:11.900 | from the perspective of our community at Dagger,
00:01:14.580 | which is platform engineers.
00:01:16.880 | I don't know if there's any platform engineers in the room.
00:01:20.460 | Okay, it's you and me, ma'am.
00:01:26.520 | Okay, well, it is known sometimes as other things,
00:01:32.960 | but basically platform engineers have a really tough job
00:01:35.660 | because they don't get to build and ship cool software.
00:01:39.240 | they get to enable all of you to build and ship cool software
00:01:43.540 | in the most productive way possible, right?
00:01:45.940 | It's a really tough job.
00:01:47.220 | It takes range.
00:01:47.820 | It takes experience.
00:01:49.120 | It takes a lot of patience.
00:01:50.620 | But we do it for the endless gratification,
00:01:54.960 | you know, just the gratitude we get from developers.
00:01:57.160 | Just kidding.
00:01:58.020 | No one ever says, "Thank you," but it's okay.
00:02:02.000 | Someone has to do it.
00:02:03.860 | Tough job.
00:02:05.800 | Speaking of enabling, anyone here use coding agents?
00:02:10.500 | We are outnumbered.
00:02:13.900 | Okay, well, I want to say to you congratulations
00:02:17.540 | and welcome to platform engineering.
00:02:21.120 | Yeah.
00:02:22.120 | I mean, your job now is to enable robots to ship awesome software
00:02:28.080 | while you spend more and more of your time enabling them
00:02:31.320 | to do that productively, right?
00:02:34.320 | Tough job.
00:02:35.220 | I applaud you for giving up really the most fun
00:02:39.960 | and rewarding part of the job, you know?
00:02:43.400 | Very selfless.
00:02:46.260 | Yeah, so, of course, this is not completely a reality yet.
00:02:50.760 | I mean, we don't have quite yet the team of agents just kind of,
00:02:55.900 | you know, humming along, doing the job while we sit back
00:02:58.780 | and fix environments for them.
00:03:00.940 | But you can kind of see it coming, right?
00:03:02.640 | I mean, some of you are definitely doing that,
00:03:06.020 | hacking that together.
00:03:07.280 | There's a lot of cool posts out there and scripts and tools.
00:03:10.580 | So we know it's coming.
00:03:13.280 | The question is, how do we enable this to happen,
00:03:17.780 | not just for this incredibly cool and bleeding-edge crowd,
00:03:23.920 | but for everyone else?
00:03:26.620 | Like, everyone shipping software everywhere just sort of creating maximum value
00:03:31.500 | by enabling agents to do the work for them, ultimately taking their jobs.
00:03:35.560 | That is the dream, right?
00:03:40.340 | Okay.
00:03:41.340 | So, yeah.
00:03:41.840 | How do we do that and make it not too painful?
00:03:44.540 | Well, I want to go back to basics.
00:03:46.200 | What is an agent?
00:03:47.200 | The famous definition, of course, is it's an LLM that's wrecking everything in a loop on behalf of a human.
00:03:53.440 | The diagram is from Anthropic.
00:03:57.080 | Thank you, Anthropic.
00:03:57.940 | I tweaked the explanation just a little bit.
00:04:00.140 | In the context of coding agents, it looks like this.
00:04:03.720 | Oh, man, that was supposed to be animated.
00:04:08.080 | It's even better when it's animated.
00:04:09.380 | It's okay.
00:04:10.420 | Yeah, you've got one agent, and it's doing stuff in the environment is your computer.
00:04:14.100 | And it can do great work.
00:04:16.800 | It can also do very crazy things.
00:04:18.780 | So you have to kind of watch it closely, right, and approve, approve.
00:04:22.240 | No, no, don't do that.
00:04:23.140 | That's crazy.
00:04:23.680 | Yes, that's good.
00:04:25.420 | That's kind of the status quo today.
00:04:26.940 | But, of course, we want to scale it, right?
00:04:33.320 | We want a team.
00:04:34.320 | So how do we do that?
00:04:35.160 | Well, right now, I would say there are two options, both equally wonderful and fun.
00:04:41.220 | The first one I call YOLO mode, you know, I'll just run 10.
00:04:47.100 | What can happen?
00:04:50.340 | Amazingly, this diagram is not the worst case scenario, but, yeah, you know, you get the idea.
00:04:56.540 | So the whole methodology of watching it closely just kind of falls apart really quickly because
00:05:00.380 | they're all stepping on each other's toes.
00:05:02.160 | They're sharing an environment, right?
00:05:03.580 | Okay.
00:05:04.580 | Enter option two.
00:05:05.580 | Oh, don't worry about that.
00:05:06.580 | We'll run the agents.
00:05:07.580 | Right?
00:05:08.580 | We'll take care of everything.
00:05:09.580 | We've got the background mode.
00:05:10.580 | We've got the model.
00:05:11.580 | We've got the tools.
00:05:12.580 | We've got the environment.
00:05:13.580 | We've got the compute.
00:05:14.580 | We've got the secrets.
00:05:15.580 | We've got everything.
00:05:16.580 | You know, just open an issue, wait for the PR, relax, until, of course, it doesn't work,
00:05:23.340 | and then you're like, no, that's not what I meant.
00:05:27.620 | These actually work really well.
00:05:28.460 | I think, like, 10 of those launched just today and yesterday.
00:05:33.460 | And they're great.
00:05:34.460 | It's just that, you know, sometimes you just want to get in there.
00:05:38.460 | Like, okay, give me the keyboard.
00:05:40.460 | You know?
00:05:41.460 | And sometimes you just want to run it on your machine or on your favorite compute provider.
00:05:45.460 | Right?
00:05:46.460 | Use your favorite model.
00:05:47.460 | You want to mix and match.
00:05:48.460 | There are limitations to this all-in-one model.
00:05:51.100 | So the question is, is there something better?
00:05:54.520 | Is there just a scenario where I just got a team and they're working and, you know, I can
00:06:00.720 | step in or leave them alone and we're just kind of getting stuff done together?
00:06:05.120 | So this is how I would summarize it, what I would want.
00:06:08.120 | There's really four things.
00:06:10.120 | First, I want background work.
00:06:12.120 | You know, I don't want to be in there just watching every action.
00:06:16.120 | That's obvious.
00:06:18.120 | I want Rails.
00:06:19.120 | And that means I want to be able to constrain the agent to not just do things that I already
00:06:25.120 | know are not necessary.
00:06:27.120 | So obvious things like context of the project.
00:06:29.120 | What's, you know, what's our coding style?
00:06:30.120 | What tools to use?
00:06:32.120 | But also, here's how to build.
00:06:33.120 | Here's how to test.
00:06:34.120 | Here's the base image we use, right?
00:06:36.120 | You can access this secret.
00:06:37.120 | You can access that.
00:06:38.120 | So there's an easy way to do that.
00:06:40.120 | Because otherwise, I'm going to waste so many tokens just correcting as I go, right?
00:06:46.120 | The third is, inevitably, when I do need to step in, I want a really efficient and seamless
00:06:52.120 | way to do that.
00:06:53.120 | And it can't be watch every action and it can't be just wait for the PR and do co-review.
00:06:59.120 | You know, I need a middle ground here.
00:07:01.120 | And the fourth thing is I want optionality because, like I was saying before, it's a
00:07:06.120 | crazy market.
00:07:07.120 | You know, there's awesome models, awesome compute, awesome infrastructure.
00:07:13.120 | Agents are really cool.
00:07:15.120 | And as cool as they are now, I mean, one of you is probably, like, launching one right
00:07:21.120 | And then there's another one tomorrow.
00:07:22.120 | So I don't really want to lock myself into a whole package today and say no in advance
00:07:29.120 | to whatever's coming out tomorrow, right?
00:07:30.120 | Not in this market.
00:07:32.120 | So to get that, I need an environment that has properties that match this.
00:07:39.120 | It needs to be isolated, right?
00:07:41.120 | So background work works.
00:07:43.120 | It needs to be customizable so I can set up those rails.
00:07:46.120 | It needs to be multiplayer so I can, you know, go, all right, give me that.
00:07:50.120 | Let me fix this.
00:07:51.120 | Or let me check.
00:07:52.120 | Did you do it?
00:07:53.120 | You know, when the model says, I did it.
00:07:55.120 | Did you do it?
00:07:58.120 | And then, you know, it should be open.
00:08:00.120 | No shade on making money and scaling a huge cloud service.
00:08:06.120 | That's great.
00:08:07.120 | You know, we have one.
00:08:08.120 | They're great.
00:08:09.120 | But I just want choice, right?
00:08:11.120 | I want to be able to choose and get the best commodity.
00:08:15.120 | I'll just use this word.
00:08:16.120 | It's okay.
00:08:17.120 | It's okay to use it.
00:08:18.120 | It's the best commodity component for each job.
00:08:23.120 | And, you know, it could even be open source.
00:08:25.120 | Who knows?
00:08:26.120 | We could collaborate on this.
00:08:27.120 | Anyway, so unsurprisingly, maybe, I'm going to talk about containers now.
00:08:33.120 | Someone actually said, you know, you should check that they know Docker.
00:08:37.120 | They know containers.
00:08:38.120 | Okay.
00:08:39.120 | Who knows what containers are?
00:08:40.120 | Who's used containers?
00:08:41.120 | Okay.
00:08:42.120 | Cool.
00:08:43.120 | Cool.
00:08:44.120 | All right.
00:08:45.120 | Boost my confidence a little bit.
00:08:47.120 | But the point here is we have the technology.
00:08:49.120 | And it's not just about containers.
00:08:50.120 | But they do play a crucial role.
00:08:51.120 | Because it's a foundational technology.
00:08:54.120 | And it is underutilized.
00:08:56.120 | We don't fully leverage what this technology can do.
00:09:00.120 | Because we're used to the first incarnation of the tools.
00:09:03.120 | Made for humans.
00:09:05.120 | Same thing for Git.
00:09:06.120 | I see a lot of hacks involving Git work trees.
00:09:09.120 | Anyone playing with Git work trees to get stuff done?
00:09:12.120 | Okay.
00:09:13.120 | You know what I'm talking about.
00:09:14.120 | This is about that.
00:09:17.120 | And of course we have models that are incredibly smart.
00:09:19.120 | Getting smarter.
00:09:20.120 | And they can exercise these technologies really fully.
00:09:25.120 | We just need to integrate them in a native way.
00:09:27.120 | So that we really tackle the problem at hand.
00:09:32.120 | Which is giving great environments to these agents.
00:09:34.120 | Anyway.
00:09:35.120 | So if we built that native integration what would it look like?
00:09:38.120 | Well we have a take.
00:09:39.120 | Sorry.
00:09:40.120 | We a dagger.
00:09:41.120 | I forgot completely to mention my company.
00:09:43.120 | That's okay.
00:09:44.120 | It's great.
00:09:47.120 | Check it out.
00:09:48.120 | We have a take on that.
00:09:50.120 | Something we call container use.
00:09:52.120 | You know there's computer use.
00:09:53.120 | Browser use.
00:09:54.120 | These agents need container use.
00:09:56.120 | They need a way to use containers to create environments and work inside of them.
00:10:02.120 | This is not the same thing as sandboxing.
00:10:04.120 | Right?
00:10:05.120 | There are a lot of ways to execute the output of the agent in a secure sandbox.
00:10:09.120 | Very useful.
00:10:10.120 | Very cool.
00:10:11.120 | But that's not the same thing as the agent developing inside of containers entirely.
00:10:15.120 | Right?
00:10:16.120 | That's what we're talking about here.
00:10:18.120 | I asked my team.
00:10:24.120 | We've been developing this thing.
00:10:26.120 | It's open source.
00:10:27.120 | But it's not yet open source.
00:10:28.120 | Like it's not finished.
00:10:30.120 | But I asked the team.
00:10:31.120 | I should show it.
00:10:32.120 | Right?
00:10:33.120 | And they said absolutely not.
00:10:35.120 | It's not ready.
00:10:37.120 | So anyway.
00:10:38.120 | You want to demo?
00:10:39.120 | Okay.
00:10:44.120 | Just so we're clear.
00:10:45.120 | This is you agreeing to watch me stumble through a broken demo of unfinished software.
00:10:51.120 | Okay.
00:10:52.120 | So much could go wrong right now.
00:10:57.120 | Okay.
00:10:58.120 | This is my terminal.
00:11:00.120 | Can you see it?
00:11:01.120 | Okay.
00:11:02.120 | For technical reasons, I'm not going to go to full screen.
00:11:05.120 | You just got to stop me when I reach the edge.
00:11:07.120 | Oh, actually I can see it.
00:11:08.120 | Never mind.
00:11:09.120 | Okay.
00:11:10.120 | Yeah.
00:11:11.120 | Old school.
00:11:12.120 | Old school.
00:11:13.120 | Okay.
00:11:16.120 | We used to do this all the time.
00:11:19.120 | In the old days.
00:11:21.120 | Okay.
00:11:22.120 | So here's what I'm going to do.
00:11:25.120 | I'm going to just try to develop something very simple here.
00:11:30.120 | I've got an empty directory.
00:11:32.120 | I'm going to try and make a little homepage for my awesome container use project.
00:11:37.120 | And I'm going to use clod.
00:11:39.120 | Cloud code.
00:11:40.120 | I'm going to try and use a bunch of them.
00:11:42.120 | Hopefully I made something very clear.
00:11:44.120 | This is not a coding agent.
00:11:45.120 | It's environments that are portable that you can attach to any coding agent.
00:11:50.120 | That's the idea.
00:11:51.120 | So you like clod?
00:11:52.120 | Use clod.
00:11:53.120 | You like codecs?
00:11:54.120 | Use codecs.
00:11:55.120 | Et cetera, et cetera, et cetera.
00:11:56.120 | In an IDE.
00:11:57.120 | In the command line.
00:11:58.120 | Whatever.
00:11:59.120 | And also in the cloud.
00:12:01.120 | Right?
00:12:02.120 | In CI.
00:12:03.120 | Lots of cool things you can do once you're async.
00:12:05.120 | So one of the reasons the team said don't do a demo is I'm actually terrible at using cloud.
00:12:12.120 | So I have an alias for remembering the flag to disable all permissions.
00:12:17.120 | I can never remember it.
00:12:20.120 | And I have a prompt here.
00:12:22.120 | I'll read it to you in a minute.
00:12:24.120 | But it's basically make me a homepage.
00:12:27.120 | Make it a Go web app so I can know what's going on because I'm not a cool kid writing TypeScript.
00:12:33.120 | And run the app when you're done.
00:12:35.120 | So while this runs, while this maybe runs, hopefully.
00:12:38.120 | Okay.
00:12:39.120 | Okay, cool.
00:12:42.120 | So what's happening here is I configured cloud code to use, you know, with container use.
00:12:47.120 | To use containers, literally.
00:12:48.120 | Yeah, MCP.
00:12:50.120 | So it was an MCP integration.
00:12:51.120 | There are other integrations that we're working on.
00:12:54.120 | But MCP is the obvious place to start.
00:12:56.120 | And so now it has, you know, all its usual tools.
00:13:00.120 | This is vanilla cloud code.
00:13:03.120 | But now it can create an environment for itself.
00:13:05.120 | And now it's editing files in that environment, like a little sandbox.
00:13:09.120 | And it can also run commands to build it and test it and, of course, run it in ephemeral containers.
00:13:15.120 | This is not one Docker container sitting there.
00:13:18.120 | Every time an action needs to be taken, there's an ephemeral container running and then being snapshotted and returning.
00:13:24.120 | So it's just doing its thing.
00:13:29.120 | What would I want to show here?
00:13:30.120 | Okay.
00:13:31.120 | So here I'm going to first show that nothing has been polluting my workspace.
00:13:36.120 | It's happening in a little sandbox.
00:13:38.120 | And the way the sandbox works, the state of these files and the containers that are being run is actually persisted in Git.
00:13:47.120 | And a bunch of special Git objects that are kind of living alongside the repo.
00:13:53.120 | So it's right there if I need it.
00:13:54.120 | This is all local.
00:13:56.120 | But it's not polluting my workspace by default.
00:13:59.120 | So hopefully it's going to produce something soon.
00:14:01.120 | While it does that, I'm going to use this little command line.
00:14:04.120 | Is this readable?
00:14:05.120 | Okay.
00:14:06.120 | Little command line.
00:14:07.120 | See you.
00:14:08.120 | Like, go work.
00:14:09.120 | See you later.
00:14:10.120 | But no, really, it's for container use.
00:14:14.120 | And I can list environments.
00:14:16.120 | And you can see there's a new environment that's been created here with a little random name here.
00:14:21.120 | And so there's a few things I can do.
00:14:23.120 | One thing I can do is open a terminal.
00:14:26.120 | And here -- okay, this part is powered by Dagger, right?
00:14:29.120 | But we use Dagger as a sort of a toolbox.
00:14:32.120 | It has all the primitives you need.
00:14:34.120 | And so here I can see exactly what the agent sees.
00:14:40.120 | The files, but also the tools.
00:14:42.120 | So I can see, okay, what Go version did you configure for yourself?
00:14:46.120 | All right, because the agent is given the ability to figure out what environment it needs
00:14:51.120 | and then configure that, but in a repeatable containerized way.
00:14:54.120 | So here I can see -- okay, does it build?
00:14:56.120 | Okay, it builds.
00:15:01.120 | Okay, so you're done?
00:15:02.120 | What's going on?
00:15:04.120 | Okay.
00:15:05.120 | While we do that, I'm also going to show you -- actually, I have two more things to say.
00:15:09.120 | One, a really cool feature of this that I'm not going to show is secrets.
00:15:13.120 | So you can just plug in secrets from things like 1Password.
00:15:17.120 | I use 1Password.
00:15:18.120 | I don't want to use a separate password manager from an AI company.
00:15:21.120 | No offense.
00:15:22.120 | I just want to use my password manager.
00:15:24.120 | So I can just plug in and say, this environment gets this secret.
00:15:27.120 | And boom, it can use it, right?
00:15:29.120 | And then the team said, please don't show that.
00:15:32.120 | That's just -- that's going to break for sure.
00:15:34.120 | So I won't.
00:15:35.120 | And the other thing I want to say is that because it's all powered by Dagger,
00:15:39.120 | and the point here, it's containers and it's open source.
00:15:42.120 | That's what you should know.
00:15:45.120 | It's running on my machine.
00:15:46.120 | Actually, no.
00:15:47.120 | It's not running on my machine because we're at a conference,
00:15:51.120 | and there's a lot of things that can go wrong if you run containers
00:15:54.120 | and download images.
00:15:55.120 | So instead, I just have it running on my home server in my basement,
00:16:00.120 | about one mile this way.
00:16:02.120 | And it just kind of works seamlessly.
00:16:03.120 | It's string files up, string files down.
00:16:05.120 | It all just kind of works.
00:16:10.120 | Okay.
00:16:11.120 | This is the part that I cannot control, as you know.
00:16:13.120 | Okay.
00:16:14.120 | One more thing I'll show you.
00:16:15.120 | You can watch.
00:16:16.120 | So here, I can see the history.
00:16:19.120 | So behind the scenes, every snapshot of the state is like a Git log.
00:16:23.120 | It's actually using Git under the hood.
00:16:25.120 | So if I'm happy with the results, I can go and get it.
00:16:28.120 | So it's like a happy medium between the -- it's like a loop,
00:16:33.120 | a collaboration loop that's just right.
00:16:35.120 | It's not watching every tool and wrecking a shared environment,
00:16:40.120 | but it's not waiting for a pull request and, you know,
00:16:44.120 | having these long back and forth.
00:16:45.120 | It's right in the middle.
00:16:46.120 | I can see everything going on, and I can say,
00:16:48.120 | okay, give me the history of that.
00:16:49.120 | I want that.
00:16:50.120 | Okay.
00:16:51.120 | It says it's live.
00:16:52.120 | It's running.
00:16:54.120 | Pretty nice.
00:16:55.120 | Cool.
00:16:56.120 | Okay.
00:16:57.120 | So now --
00:17:02.120 | Okay.
00:17:03.120 | I appreciate it, but you guys can be honest.
00:17:04.120 | It's a little boring.
00:17:05.120 | So this design is boring.
00:17:09.120 | Make it really pop.
00:17:14.120 | Trying to impress a engineering.
00:17:18.120 | There.
00:17:19.120 | Okay.
00:17:22.120 | Okay.
00:17:23.120 | Okay.
00:17:24.120 | So the reason I'm doing that is trying to create the circumstances
00:17:27.120 | where I would need a lot of parallel experiments, right?
00:17:29.120 | Make it pop.
00:17:30.120 | What does that mean?
00:17:31.120 | It means anything.
00:17:32.120 | What if I want to try several experiments in parallel, right?
00:17:35.120 | So I'm just going to say --
00:17:37.120 | Well, hold on one second.
00:17:39.120 | Stop.
00:17:40.120 | Before I do that, I'm going to merge this, right?
00:17:47.120 | There's still nothing here, but I'm saying I like it.
00:17:49.120 | So I'm going to say, merge that environment.
00:17:53.120 | And I have it.
00:17:55.120 | It's my history.
00:17:57.120 | I can open a pull request.
00:17:58.120 | I can clean it up.
00:17:59.120 | Whatever.
00:18:00.120 | So that's a loop that I can work with, right?
00:18:04.120 | And now I can say, nah, boring.
00:18:07.120 | And then I can say, since the environment is now in this state,
00:18:11.120 | I can ask for help from a few other agents, right?
00:18:14.120 | I can say, okay, hey, Claude Yolo.
00:18:18.120 | Nope, that's not right.
00:18:21.120 | Claude Yolo, this web app looks a bit boring.
00:18:27.120 | Can you make it pop, please?
00:18:29.120 | Okay.
00:18:31.120 | And go.
00:18:35.120 | And go.
00:18:37.120 | And go.
00:18:41.120 | Okay.
00:18:42.120 | So this is where things start really going wrong.
00:18:44.120 | But as the team pointed out, they said,
00:18:49.120 | well, something's going to go wrong, right?
00:18:51.120 | They said, yeah, but you were kind of showing that if things go wrong,
00:18:54.120 | you can throw away the environment, and you're good.
00:18:56.120 | You can restart.
00:18:57.120 | I said, okay, that's cool.
00:18:58.120 | So let's say I don't like this one.
00:19:01.120 | I'm like, nope.
00:19:02.120 | Goodbye.
00:19:03.120 | That's it.
00:19:04.120 | I don't have to go clean up the mess, right?
00:19:05.120 | That's the whole point.
00:19:06.120 | Okay.
00:19:07.120 | So this is getting a little messy.
00:19:09.120 | Oh, I wanted to show Goose also.
00:19:11.120 | So Goose is a really cool open source agent.
00:19:15.120 | Whoops.
00:19:16.120 | All right.
00:19:17.120 | Hold on a second.
00:19:18.120 | Goose Yolo.
00:19:19.120 | Same thing.
00:19:20.120 | Everyone has complicated flags for disabling all these safeties
00:19:23.120 | that I don't need anymore, right?
00:19:24.120 | Because it's --
00:19:26.120 | Okay.
00:19:27.120 | Sorry.
00:19:27.120 | Okay.
00:19:28.120 | Well, I'm really taking a chance here.
00:19:36.120 | So while this is happening, one thing we've been working on,
00:19:42.120 | but it's still a work in progress, is there's a watch command.
00:19:45.120 | Oh, I showed you that already.
00:19:46.120 | But as --
00:19:48.120 | So as --
00:19:49.120 | This is a git command, right?
00:19:51.120 | Thinly wrapped git commands.
00:19:52.120 | Our UX is really --
00:19:54.120 | I cannot --
00:19:55.120 | Words cannot express how unfinished this is.
00:19:57.120 | But --
00:19:59.120 | But it'll evolve rapidly because the bones are strong.
00:20:03.120 | It's git, it's dagger, and, you know, it's your existing agent.
00:20:07.120 | Right?
00:20:08.120 | And then a little bit of glue.
00:20:10.120 | So, for example, here is literally --
00:20:13.120 | It's a git command that you can copy/paste.
00:20:15.120 | But as the agents work, you're going to see state snapshotting,
00:20:19.120 | and you're going to see these branches just kind of diverging.
00:20:22.120 | And then I can diff them and apply them, merge them, whatever I want.
00:20:27.120 | And what I really want it to show, and then I'm done,
00:20:31.120 | is I just want to see one of them run.
00:20:33.120 | So you can see when the agent runs a service,
00:20:38.120 | like in this case, go run, npm run, whatever,
00:20:42.120 | it's doing it in its containerized environment.
00:20:44.120 | And that's going to seamlessly be tunneled to my machine here
00:20:47.120 | on a different port without any conflicts, right?
00:20:50.120 | So when I say the environment's isolated,
00:20:53.120 | it's the files, it's context, it's configuration,
00:20:56.120 | and it's execution, right?
00:20:59.120 | And the cool extra thing is all of this is actually technically
00:21:02.120 | this here is running in my basement.
00:21:05.120 | So you can go crazy on the infrastructure side.
00:21:08.120 | Like you can run this on a cluster.
00:21:10.120 | We like to run this stuff from CI.
00:21:12.120 | It's just a lot of fun stuff you can do.
00:21:15.120 | And I'm getting at 30 seconds.
00:21:18.120 | Oh, Goose is running. Great. Okay.
00:21:21.120 | We did not solve prompt engineering. Do it.
00:21:27.120 | Okay, not done, not done. Oh, man. Okay.
00:21:32.120 | Well, just imagine--
00:21:34.120 | Okay, well, while this happens, because I've got 30 seconds left,
00:21:40.120 | I'm just going to say thank you.
00:21:42.120 | And there's one last thing I want to say about DockerCon.
00:21:48.120 | Ten years ago, we used to open source stuff on stage all the time.
00:21:51.120 | So if you want, I can go and open source it right now.
00:21:56.120 | Okay.
00:22:04.120 | You have been warned, though, about the not finished part, right?
00:22:08.120 | Okay.
00:22:09.120 | Okay.
00:22:10.120 | Oh, I think my--
00:22:12.120 | It would be funny if the demo failed at the clicking on GitHub part.
00:22:16.120 | Okay.
00:22:17.120 | All right.
00:22:18.120 | Goodbye.
00:22:19.120 | Goodbye.
00:22:20.120 | Next time.
00:22:21.120 | I promise it works.
00:22:22.120 | Okay.
00:22:26.120 | Haven't done this in a while.
00:22:27.120 | Wait.
00:22:31.120 | I'm almost done.
00:22:36.120 | I promise.
00:22:37.120 | Come on.
00:22:38.120 | You did so well.
00:22:39.120 | Change visibility.
00:22:43.120 | I want--
00:22:45.120 | I have read and understand.
00:22:48.120 | Oh, God.
00:22:51.120 | Oh, God.
00:23:09.120 | At Dagger, we take security very seriously.
00:23:13.120 | Okay.
00:23:14.120 | All right.
00:23:19.120 | I think it's--
00:23:19.120 | Wait.
00:23:20.120 | I think it's done.
00:23:25.120 | Okay.
00:23:26.120 | So, yeah.
00:23:29.120 | Thank you very much.
00:23:31.120 | And it's github.com/dagger/containeruse.
00:23:34.120 | Come say hi.
00:23:35.120 | Come participate.
00:23:36.120 | And thank you so much for having me.
00:23:38.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:39.120 | Thank you so much for having me.
00:23:40.120 | Thank you so much for having me.
00:23:40.120 | Thank you so much for having me.
00:23:41.120 | Thank you so much for having me.
00:23:41.120 | Thank you so much for having me.
00:23:41.120 | Thank you so much for having me.
00:23:42.120 | for having me.
00:23:43.120 | Thank you so much for having me.