WEBVTT

00:00:00.020 --> 00:00:03.100
<v Michael Kennedy>Coding agents have gotten really good at one kind of work.

00:00:03.440 --> 00:00:06.760
<v Michael Kennedy>You scope a feature, edit some files, run the test, ship it.

00:00:07.260 --> 00:00:08.380
<v Michael Kennedy>It all happens on disk.

00:00:08.920 --> 00:00:10.780
<v Michael Kennedy>But that is not how data work feels.

00:00:11.100 --> 00:00:14.180
<v Michael Kennedy>You load something, you look at it, you run a cell, you watch how it responds,

00:00:14.450 --> 00:00:17.580
<v Michael Kennedy>you decide the next move from whatever is sitting in memory.

00:00:18.200 --> 00:00:20.760
<v Michael Kennedy>And until now, your agent couldn't see any of that.

00:00:20.940 --> 00:00:23.380
<v Michael Kennedy>They only saw files, never the live state.

00:00:24.000 --> 00:00:26.220
<v Michael Kennedy>On this episode, that wall comes down.

00:00:26.580 --> 00:00:32.980
<v Michael Kennedy>Marimo pair drops a coding agent right inside a running notebook with full access to every variable Python is holding in memory.

00:00:33.610 --> 00:00:35.500
<v Michael Kennedy>The notebook becomes a shared canvas.

00:00:35.990 --> 00:00:37.720
<v Michael Kennedy>You point, it runs the code.

00:00:38.100 --> 00:00:41.320
<v Michael Kennedy>You tell it to zoom in on a graphic and the chart just updates.

00:00:41.920 --> 00:00:49.200
<v Michael Kennedy>No MCP tools to wire up, no schema to describe, just Python and an agent that can finally see what you see.

00:00:49.880 --> 00:00:53.120
<v Michael Kennedy>Trevor Manz from Marimo is back to walk us through it.

00:00:53.560 --> 00:00:59.360
<v Michael Kennedy>This is Talk Python To Me, episode 555, recorded June 30th, 2026.

00:01:17.560 --> 00:01:22.140
<v Michael Kennedy>Welcome to Talk Python To Me, the number one Python podcast for developers and data scientists.

00:01:22.660 --> 00:01:24.040
<v Michael Kennedy>This is your host, Michael Kennedy.

00:01:24.480 --> 00:01:27.960
<v Michael Kennedy>I'm a PSF fellow who's been coding for over 25 years.

00:01:28.620 --> 00:01:29.720
<v Michael Kennedy>Let's connect on social media.

00:01:30.040 --> 00:01:33.200
<v Michael Kennedy>You'll find me and Talk Python on Mastodon, BlueSky, and X.

00:01:33.390 --> 00:01:35.320
<v Michael Kennedy>The social links are all in your show notes.

00:01:36.080 --> 00:01:39.600
<v Michael Kennedy>You can find over 10 years of past episodes at talkpython.fm.

00:01:39.780 --> 00:01:43.020
<v Michael Kennedy>And if you want to be part of the show, you can join our recording live streams.

00:01:43.340 --> 00:01:43.800
<v Michael Kennedy>That's right.

00:01:43.990 --> 00:01:47.260
<v Michael Kennedy>We live stream the raw uncut version of each episode on YouTube.

00:01:47.660 --> 00:01:52.260
<v Michael Kennedy>Just visit talkpython.fm/youtube to see the schedule of upcoming events.

00:01:52.520 --> 00:01:56.140
<v Michael Kennedy>Be sure to subscribe there and press the bell so you'll get notified anytime we're recording.

00:01:56.880 --> 00:01:58.460
<v Michael Kennedy>This episode is brought to you by Sentry.

00:01:59.220 --> 00:02:02.220
<v Michael Kennedy>You know Sentry for the error monitoring, but they now have logs too.

00:02:02.460 --> 00:02:05.220
<v Michael Kennedy>And with Sentry, your logs become way more usable,

00:02:05.740 --> 00:02:09.580
<v Michael Kennedy>interleaving into your error reports to enhance debugging and understanding.

00:02:10.119 --> 00:02:13.280
<v Michael Kennedy>Get started today at talkpython.fm/sentry.

00:02:14.660 --> 00:02:16.460
<v Michael Kennedy>Trevor, welcome back to Talk Python.

00:02:16.680 --> 00:02:17.340
<v Michael Kennedy>Great to have you back.

00:02:17.620 --> 00:02:18.660
<v Michael Kennedy>Yeah, thanks for having me again.

00:02:19.040 --> 00:02:24.120
<v Michael Kennedy>We'll probably talk about notebooks, data science, maybe a little bit of AI in the mix.

00:02:24.560 --> 00:02:29.520
<v Trevor Manz>Yeah, definitely. We've been doing a lot at Marimo and thinking about how agents can play nice with notebooks.

00:02:30.100 --> 00:02:35.140
<v Michael Kennedy>I think it's a little bit of an extra challenge, so it's going to be fun to see what you all have in mind.

00:02:35.600 --> 00:02:39.800
<v Michael Kennedy>Now, before we get into that, it's been a year since you've been on the show to talk about AnyWidget.

00:02:40.060 --> 00:02:43.740
<v Michael Kennedy>Just give us a quick introduction for folks who maybe didn't listen to that episode.

00:02:43.960 --> 00:02:50.120
<v Trevor Manz>Yeah, AnyWidget is both a specification and a toolkit for making interactive UI elements

00:02:50.440 --> 00:02:53.740
<v Trevor Manz>that deeply integrate into your interactive programming environments,

00:02:54.080 --> 00:02:55.700
<v Trevor Manz>and specifically Python environments.

00:02:56.920 --> 00:02:59.720
<v Trevor Manz>It has deep integration into Marimo, which is the company that I work at now,

00:03:00.580 --> 00:03:02.960
<v Trevor Manz>where we build a new kind of reactive Python notebook.

00:03:03.360 --> 00:03:05.960
<v Michael Kennedy>I'm a fan of Marimo. I don't do that much stuff in notebooks,

00:03:06.620 --> 00:03:09.380
<v Michael Kennedy>but if I did, I would be using Marimo most of the time.

00:03:09.760 --> 00:03:10.880
<v Michael Kennedy>It's kind of like that Dos Equis.

00:03:11.880 --> 00:03:12.500
<v Michael Kennedy>Yeah, yeah.

00:03:13.090 --> 00:03:17.160
<v Trevor Manz>I like to, depending on the ilk of user that we have,

00:03:17.380 --> 00:03:19.260
<v Trevor Manz>I like to make the joke that there are often

00:03:19.520 --> 00:03:24.280
<v Trevor Manz>a certain group of folks that have plenty of notebook friends

00:03:24.480 --> 00:03:25.960
<v Trevor Manz>but don't really use notebooks themselves.

00:03:26.500 --> 00:03:29.400
<v Trevor Manz>And I'd like to at least pitch why I think Marimo

00:03:30.000 --> 00:03:31.820
<v Trevor Manz>scratches the itch of many more software developers

00:03:31.990 --> 00:03:34.060
<v Trevor Manz>and represents more traditional software

00:03:34.320 --> 00:03:36.740
<v Trevor Manz>than traditional computational notebooks.

00:03:37.280 --> 00:03:40.739
<v Michael Kennedy>I think it also kind of is special for people

00:03:41.080 --> 00:03:47.640
<v Michael Kennedy>We were more on the software development side because it's a little more Python focused instead of special tool focused in that.

00:03:47.800 --> 00:03:49.080
<v Michael Kennedy>We'll talk about Marimo in a second.

00:03:49.280 --> 00:03:53.780
<v Michael Kennedy>But like, for example, instead of having IPY and B files, it has just Python files.

00:03:54.180 --> 00:03:56.280
<v Trevor Manz>Yeah, we are hyper focused on Python.

00:03:56.640 --> 00:04:04.280
<v Trevor Manz>So we're from all the way from the, you know, our file format down to the way that we understand the relationships between yourselves.

00:04:04.640 --> 00:04:06.500
<v Trevor Manz>It's all oriented around the Python ecosystem.

00:04:07.120 --> 00:04:10.060
<v Michael Kennedy>Yeah, that's probably going to pay off a little bit when we talk about this project here.

00:04:10.140 --> 00:04:11.400
<v Trevor Manz>Yeah, definitely.

00:04:12.380 --> 00:04:12.700
<v Trevor Manz>Definitely.

00:04:13.500 --> 00:04:18.660
<v Michael Kennedy>All right, well, actually, let's do a quick refresher on just what Marimo is.

00:04:19.060 --> 00:04:19.579
<v Michael Kennedy>Am I saying that right?

00:04:19.700 --> 00:04:19.980
<v Michael Kennedy>Marimo?

00:04:20.140 --> 00:04:21.459
<v Michael Kennedy>Sorry, I should be saying Marimo, right?

00:04:21.760 --> 00:04:22.440
<v Trevor Manz>Yep, it's Marimo.

00:04:22.820 --> 00:04:22.880
<v Trevor Manz>Yep.

00:04:23.400 --> 00:04:23.580
<v Michael Kennedy>Okay.

00:04:24.080 --> 00:04:26.140
<v Michael Kennedy>Give us a quick refresher for people who don't know.

00:04:26.360 --> 00:04:30.060
<v Michael Kennedy>You know, it's sort of in the realm of JupyterLab, but also different.

00:04:30.560 --> 00:04:30.780
<v Trevor Manz>Yeah.

00:04:31.440 --> 00:04:36.780
<v Trevor Manz>Marimo is spiritually a computational notebook, much similar to something like Jupyter or Google

00:04:36.920 --> 00:04:38.180
<v Trevor Manz>Colab, if folks have used that before.

00:04:38.800 --> 00:04:43.160
<v Trevor Manz>But as we just mentioned earlier in the show, we're hyper-focused on the Python ecosystem.

00:04:43.700 --> 00:04:49.180
<v Trevor Manz>And we are also a special kind of notebook in that we are a reactive Python notebook.

00:04:49.560 --> 00:04:55.400
<v Trevor Manz>So what that means is that the order in which Marimo understands your notebook is not in the

00:04:55.500 --> 00:04:58.620
<v Trevor Manz>order that you wrote the cells, but the actual data flow between the cells.

00:04:58.960 --> 00:05:03.060
<v Trevor Manz>And so we understand the relationships between your cells based off of the variables they

00:05:03.100 --> 00:05:04.780
<v Trevor Manz>declare and where those variables are used.

00:05:05.120 --> 00:05:11.500
<v Trevor Manz>And then we know how to automatically re-execute the notebook to ensure that you don't get to some sort of inconsistent state in your notebook.

00:05:11.890 --> 00:05:19.320
<v Trevor Manz>So you can really think of Marimo as you are incrementally building a Python program rather than sort of a scratch pad or a set of logs of like some code that ran.

00:05:19.600 --> 00:05:24.440
<v Michael Kennedy>It sounds like a minor feature, this reactive bit, but it's not so minor.

00:05:24.740 --> 00:05:33.460
<v Michael Kennedy>I'll tell you what, like I'm sure people who've done a lot of work with notebooks have had the experience where they're iterating, iterating, going back, editing, making changes.

00:05:33.580 --> 00:05:37.460
<v Michael Kennedy>and maybe go back three cells, edit something, rerun that cell,

00:05:37.880 --> 00:05:39.620
<v Michael Kennedy>go down back to where they were and continue.

00:05:39.840 --> 00:05:40.740
<v Michael Kennedy>Like, why is this?

00:05:40.930 --> 00:05:42.500
<v Michael Kennedy>It doesn't seem to do anything.

00:05:43.100 --> 00:05:45.180
<v Michael Kennedy>Or this is not what I expected or whatever.

00:05:45.700 --> 00:05:48.660
<v Michael Kennedy>And then you realize, oh, because I didn't run the two cells

00:05:49.200 --> 00:05:52.420
<v Michael Kennedy>or the one cell in the middle that actually used that value,

00:05:52.530 --> 00:05:54.580
<v Michael Kennedy>which then flowed on to the next, right?

00:05:54.960 --> 00:05:56.960
<v Michael Kennedy>And basically what you're saying with this Reactive Notebooks

00:05:57.030 --> 00:05:58.940
<v Michael Kennedy>is unless you overwrite it or something,

00:05:59.440 --> 00:06:01.020
<v Michael Kennedy>that can't happen with Marimo.

00:06:01.440 --> 00:06:03.560
<v Trevor Manz>Yeah, it's essentially when you're working

00:06:03.580 --> 00:06:04.660
<v Trevor Manz>something like a Jupyter notebook,

00:06:05.460 --> 00:06:07.500
<v Trevor Manz>you, the user, have to do a form of bookkeeping

00:06:07.660 --> 00:06:11.020
<v Trevor Manz>to make sure that whatever state exists in the kernel

00:06:11.600 --> 00:06:14.160
<v Trevor Manz>is representative of whatever cells you have on the screen.

00:06:14.720 --> 00:06:17.740
<v Trevor Manz>And discipline doesn't really scale necessarily,

00:06:17.920 --> 00:06:19.680
<v Trevor Manz>or it becomes hard to do that bookkeeping yourself.

00:06:20.100 --> 00:06:22.440
<v Michael Kennedy>Come on, I don't buy it because look,

00:06:22.680 --> 00:06:30.040
<v Michael Kennedy>when you go into Jupyter, it says like 27, 34, 57, 58, and then 90.

00:06:30.280 --> 00:06:31.140
<v Michael Kennedy>And if you see one of those,

00:06:31.300 --> 00:06:32.840
<v Michael Kennedy>if you're not doing your bubble sorting,

00:06:32.960 --> 00:06:37.060
<v Michael Kennedy>that's out of order. You know you've got to go back and run it. I mean, we all keep track of this.

00:06:37.880 --> 00:06:42.880
<v Trevor Manz>Yeah, but essentially the moment that you get to some sort of complex notebook and state,

00:06:43.280 --> 00:06:48.440
<v Trevor Manz>that becomes a lot of cognitive overhead that you as the user sort of have to keep in mind in order

00:06:48.600 --> 00:06:52.660
<v Trevor Manz>to ensure that what you're doing is representative, such that when you hand off your notebook to

00:06:52.790 --> 00:06:57.100
<v Trevor Manz>someone else, they're able to confidently reproduce that execution that you had in front of you and get

00:06:57.110 --> 00:06:59.740
<v Michael Kennedy>back to that state. And so with Maremo, we offload that.

00:06:59.840 --> 00:07:00.740
<v Michael Kennedy>It's just about that, right?

00:07:00.820 --> 00:07:02.080
<v Michael Kennedy>Like that's obviously a problem.

00:07:02.800 --> 00:07:02.900
<v Trevor Manz>Yeah.

00:07:03.320 --> 00:07:07.360
<v Trevor Manz>And so at Marimo, you essentially offload that bookkeeping to a system,

00:07:07.820 --> 00:07:10.460
<v Trevor Manz>which we do this dependency tracking of your variables

00:07:10.720 --> 00:07:12.280
<v Trevor Manz>and where they're declared and where they're used.

00:07:13.240 --> 00:07:16.360
<v Trevor Manz>And essentially we can provide guarantees that if you try to do something like

00:07:16.960 --> 00:07:20.000
<v Trevor Manz>rerun a cell, we will rerun all descendant cells of that cell.

00:07:20.140 --> 00:07:22.320
<v Trevor Manz>Or if you try to redeclare a variable, we'll tell you,

00:07:22.360 --> 00:07:26.840
<v Trevor Manz>hey, you already declared this variable and eliminate this problem of hidden state.

00:07:27.160 --> 00:07:29.660
<v Trevor Manz>such that when you do end up working on a team

00:07:29.690 --> 00:07:30.640
<v Trevor Manz>with more than one individual

00:07:30.730 --> 00:07:32.780
<v Trevor Manz>and you want to hand off that artifact to someone,

00:07:33.130 --> 00:07:34.400
<v Trevor Manz>they can confidently run the notebook

00:07:34.660 --> 00:07:36.940
<v Trevor Manz>and reproduce the execution results

00:07:37.680 --> 00:07:38.660
<v Trevor Manz>that you were looking at

00:07:38.670 --> 00:07:39.800
<v Trevor Manz>when you ran that notebook earlier.

00:07:40.100 --> 00:07:41.940
<v Michael Kennedy>Yeah, it pretty much guarantees ordering.

00:07:42.320 --> 00:07:42.440
<v Michael Kennedy>Yep.

00:07:42.790 --> 00:07:42.900
<v Michael Kennedy>Okay.

00:07:43.560 --> 00:07:47.820
<v Michael Kennedy>Also, it's got a really nice modern UI feel, I think.

00:07:49.040 --> 00:07:50.100
<v Michael Kennedy>It looks good.

00:07:50.270 --> 00:07:51.040
<v Michael Kennedy>It feels fresh.

00:07:51.419 --> 00:07:52.780
<v Michael Kennedy>And I don't know, for some people,

00:07:52.960 --> 00:07:54.080
<v Michael Kennedy>maybe that doesn't matter.

00:07:54.540 --> 00:07:56.200
<v Michael Kennedy>But to me, I'm working on stuff.

00:07:56.440 --> 00:08:01.360
<v Michael Kennedy>I just feel better if it's a nice UI and it looks polished instead of old school.

00:08:01.900 --> 00:08:05.400
<v Trevor Manz>Yeah, and because we are hyper-focused on the Python ecosystem,

00:08:05.740 --> 00:08:10.000
<v Trevor Manz>we've been able to think about common data structures and objects that are in the Python ecosystem

00:08:10.180 --> 00:08:14.260
<v Trevor Manz>and then really have polished user experiences for inspecting and understanding those objects.

00:08:14.400 --> 00:08:18.760
<v Trevor Manz>So inside of a Marimo notebook, if you load a data frame, whether that's a Polars data frame

00:08:18.800 --> 00:08:23.820
<v Trevor Manz>or a Pandas data frame or an IBIS table or anything that implements this data frame protocol,

00:08:24.120 --> 00:08:25.880
<v Trevor Manz>which is a standard in the Python ecosystem,

00:08:26.400 --> 00:08:28.200
<v Trevor Manz>we can represent and render

00:08:28.260 --> 00:08:29.940
<v Trevor Manz>in a really nice interactive table.

00:08:30.380 --> 00:08:31.820
<v Trevor Manz>And so we're able to do that

00:08:32.039 --> 00:08:34.140
<v Trevor Manz>because we're tailored around this Python ecosystem

00:08:34.520 --> 00:08:36.760
<v Trevor Manz>and we're able to polish both the user experience

00:08:36.979 --> 00:08:38.580
<v Trevor Manz>on the front end side

00:08:38.760 --> 00:08:40.719
<v Trevor Manz>as well as all the way down to the kernel

00:08:41.099 --> 00:08:42.580
<v Trevor Manz>in terms of being able to share

00:08:42.640 --> 00:08:44.120
<v Trevor Manz>these reproducible notebook documents.

00:08:44.540 --> 00:08:46.040
<v Michael Kennedy>Okay, yeah, I love it.

00:08:46.200 --> 00:08:47.480
<v Michael Kennedy>All right, so that's Marimo.

00:08:47.960 --> 00:08:49.200
<v Michael Kennedy>And what we're talking about today

00:08:49.380 --> 00:08:50.700
<v Michael Kennedy>is not exactly Marimo,

00:08:51.120 --> 00:08:56.820
<v Michael Kennedy>but more AI plus notebooks in a particular tool, agent skill.

00:08:56.870 --> 00:08:57.100
<v Michael Kennedy>I don't know.

00:08:57.700 --> 00:08:59.240
<v Michael Kennedy>We're going to get into that, what it is.

00:08:59.400 --> 00:09:03.340
<v Michael Kennedy>But before we do, let's just talk about how do people,

00:09:03.980 --> 00:09:09.240
<v Michael Kennedy>like what do people do with, say, either Marima or Jupyter or JupyterLab today

00:09:10.060 --> 00:09:11.620
<v Michael Kennedy>without a tool like Marima pair?

00:09:12.100 --> 00:09:16.180
<v Trevor Manz>Yeah, I'd say that the software as I've known it over the past year

00:09:16.180 --> 00:09:18.840
<v Trevor Manz>has changed quite a bit for traditional software development.

00:09:19.580 --> 00:09:22.420
<v Trevor Manz>And as we started working more and more on Marimo,

00:09:22.920 --> 00:09:26.920
<v Trevor Manz>we were using agents to perform more of our traditional software development.

00:09:27.260 --> 00:09:28.780
<v Trevor Manz>And many of our users were asking,

00:09:29.680 --> 00:09:31.580
<v Trevor Manz>what's the best way to use Marimo with agents?

00:09:31.760 --> 00:09:32.860
<v Trevor Manz>Because they've been using Marimo.

00:09:33.380 --> 00:09:35.660
<v Trevor Manz>And I think that many different,

00:09:36.480 --> 00:09:40.520
<v Trevor Manz>if you'd ever tried out of the box to use one of these coding agents with notebooks,

00:09:40.740 --> 00:09:45.420
<v Trevor Manz>whether it be Marimo or JupyterLab or Jupyter or Google Colab,

00:09:46.340 --> 00:09:51.000
<v Trevor Manz>there kind of felt like this difference or like awkwardness in that user experience in terms of

00:09:51.750 --> 00:09:57.340
<v Trevor Manz>being able to drive that interactive environment in a way that I think was very sort of unsettling

00:09:57.450 --> 00:10:02.580
<v Trevor Manz>or unfulfilling compared to traditional software development because you're able to sort of like

00:10:02.720 --> 00:10:07.180
<v Trevor Manz>put off your agent on these long-lived software tasks and then come back and have it run the test

00:10:07.210 --> 00:10:13.220
<v Trevor Manz>and let it get in these type loops to be able to autocorrect and do this sort of like traditional

00:10:13.220 --> 00:10:14.580
<v Trevor Manz>programming and software development.

00:10:15.120 --> 00:10:17.280
<v Trevor Manz>But when you tried to apply it to a data problem,

00:10:18.400 --> 00:10:20.140
<v Trevor Manz>things would happen where you edit the file

00:10:20.360 --> 00:10:22.420
<v Trevor Manz>and then you could get to some inconsistent state

00:10:22.620 --> 00:10:23.200
<v Trevor Manz>inside the notebook,

00:10:24.180 --> 00:10:25.760
<v Trevor Manz>or the agent couldn't actually see the actions

00:10:25.840 --> 00:10:27.340
<v Trevor Manz>that it performed inside that notebook.

00:10:27.820 --> 00:10:30.640
<v Trevor Manz>And it wasn't really able to get inside those tight loops.

00:10:30.820 --> 00:10:33.380
<v Trevor Manz>And so we really started thinking from the bottom up,

00:10:33.420 --> 00:10:35.260
<v Trevor Manz>how can we open up Marimo in such a way

00:10:35.320 --> 00:10:36.620
<v Trevor Manz>that it's actually useful to an agent

00:10:36.820 --> 00:10:39.899
<v Trevor Manz>rather than just this data source that it can query

00:10:39.900 --> 00:10:45.880
<v Trevor Manz>and really try to extend that agent's working environment with notebooks the same way that,

00:10:45.930 --> 00:10:49.040
<v Trevor Manz>you know, humans have used notebooks for working on data tasks.

00:10:49.300 --> 00:10:55.940
<v Michael Kennedy>I think notebooks are particularly tricky for AI to work with because many people know,

00:10:55.940 --> 00:10:56.880
<v Michael Kennedy>but probably not everyone.

00:10:57.370 --> 00:11:03.120
<v Michael Kennedy>When you look at a Jupyter notebook, the IPY in B file, you've got your cell definition

00:11:03.310 --> 00:11:05.580
<v Michael Kennedy>with code or markdown or whatever's in there.

00:11:06.020 --> 00:11:11.340
<v Michael Kennedy>But also, and this is the part that makes it tricky part of the part, is that all the output.

00:11:11.920 --> 00:11:21.280
<v Michael Kennedy>So if you've got something that lists out a thousand rows, that's just embedded in the JSON that defines that notebook file, right?

00:11:21.500 --> 00:11:26.340
<v Michael Kennedy>And so as a Claude Code or a codex or whatever that's going to go through and try to understand it,

00:11:26.480 --> 00:11:30.720
<v Michael Kennedy>it's got to skim through all of that output, determine most of it is irrelevant to me.

00:11:31.060 --> 00:11:31.840
<v Michael Kennedy>Some of it is relevant.

00:11:32.400 --> 00:11:33.780
<v Michael Kennedy>Maybe it was run in the wrong order.

00:11:34.080 --> 00:11:37.860
<v Michael Kennedy>So if it does try to look at the output, it's actually, right, there's no enforcement of an order.

00:11:37.960 --> 00:11:43.100
<v Michael Kennedy>And so if it's run in the wrong order, the output might be present and they might want to use it,

00:11:43.140 --> 00:11:47.200
<v Michael Kennedy>but it's actually wrong because it was run, it's stale from what's actually in there.

00:11:47.340 --> 00:11:51.160
<v Michael Kennedy>There's a lot of issues, right, to just work directly on the file format.

00:11:51.520 --> 00:11:56.060
<v Trevor Manz>Yeah, I think, you know, as we started thinking about this problem, I think that we, you know,

00:11:56.440 --> 00:12:00.779
<v Trevor Manz>even ourselves at Marimo started to realize that for notebooks, these file formats are more the

00:12:00.800 --> 00:12:06.620
<v Trevor Manz>artifact of the work rather than the source necessarily of the code. And really, it's the

00:12:07.140 --> 00:12:12.200
<v Trevor Manz>editor combined with the state, which is how you are authoring these notebooks in this live,

00:12:12.440 --> 00:12:17.740
<v Trevor Manz>interactive environment. And that by just allowing agents to use their tools out of the box and edit

00:12:17.790 --> 00:12:23.860
<v Trevor Manz>those artifacts on disk, they're missing a lot of the context in which those files are actually

00:12:24.160 --> 00:12:28.459
<v Trevor Manz>authored. And they're also, in what you just mentioned, they are polluted with additional

00:12:28.460 --> 00:12:32.780
<v Trevor Manz>context that's not necessarily useful to like performing a coding task on behalf of the user.

00:12:33.520 --> 00:12:37.220
<v Michael Kennedy>Yeah, it's like, hey, Claude, work on this. And by the way, here's 10,000 lines of stuff that may

00:12:37.280 --> 00:12:40.580
<v Michael Kennedy>either help you or harm you depending on stuff you can't determine really.

00:12:41.280 --> 00:12:47.240
<v Trevor Manz>Yeah, exactly. So I think we started to think about this as more, you know, humans, like,

00:12:48.200 --> 00:12:52.160
<v Trevor Manz>you know, out of the box, these coding agents are equipped with sort of like the ability to read

00:12:52.160 --> 00:12:57.119
<v Trevor Manz>and write files and run bash scripts. And those tools really fit like the tasks of traditional

00:12:57.140 --> 00:13:01.860
<v Trevor Manz>software development because that type of like the way that our command line tools and work that we

00:13:01.960 --> 00:13:06.740
<v Trevor Manz>do for traditional software development work or that the file system is really the source of truth

00:13:07.040 --> 00:13:11.260
<v Trevor Manz>and then you like make changes to those files and then you run sort of these like stateless commands

00:13:11.640 --> 00:13:16.460
<v Trevor Manz>that like run your tests or basically take those changes and apply them and see if like what effect

00:13:16.460 --> 00:13:22.340
<v Trevor Manz>that those have had and humans you know for data tasks have have sort of gone beyond the tools of

00:13:22.380 --> 00:13:26.139
<v Trevor Manz>reading and writing and editing files and running batch scripts and instead we use these really like

00:13:27.120 --> 00:13:31.300
<v Trevor Manz>interactive repls or sort of live programming environments for working with data because they

00:13:31.310 --> 00:13:37.320
<v Trevor Manz>give us this ability to like iterate on intermediate results and values. So it's not like you run a

00:13:37.480 --> 00:13:40.820
<v Trevor Manz>script, maybe you made an error, you have to run that script again from scratch. Instead, we can

00:13:40.870 --> 00:13:45.720
<v Trevor Manz>like load a data set into memory and then sort of inspect those values and sort of iterate on them

00:13:45.770 --> 00:13:51.600
<v Trevor Manz>in memory. And so like the usefulness of those sort of interactive environments like Excel or

00:13:51.620 --> 00:13:58.760
<v Trevor Manz>Jupyter or Marimo or even something like RStudio is that they're stateful. And one problem is that

00:13:58.790 --> 00:14:04.860
<v Trevor Manz>these agents weren't really good at accessing those stateful environments. And so that's exactly what

00:14:05.200 --> 00:14:09.100
<v Trevor Manz>made it hard for us to open up those environments to agents. And I think there are many different

00:14:09.360 --> 00:14:14.360
<v Trevor Manz>approaches that folks have taken. And even we took originally to try to make Marimo a useful tool.

00:14:14.570 --> 00:14:18.380
<v Trevor Manz>And it took us a little while to figure out what were the ergonomics that work well for agents.

00:14:19.220 --> 00:14:25.220
<v Michael Kennedy>Sure. So what you're saying is basically, instead of running on the file system,

00:14:25.780 --> 00:14:29.080
<v Michael Kennedy>like the coding agents do now for, say, my code, I guess,

00:14:29.560 --> 00:14:32.100
<v Michael Kennedy>what instead they need is they need to run in the kernel,

00:14:32.640 --> 00:14:35.980
<v Michael Kennedy>kind of looking at the state of things in the kernel as it's working

00:14:36.560 --> 00:14:38.940
<v Michael Kennedy>more than, say, regular programming code.

00:14:39.380 --> 00:14:43.240
<v Trevor Manz>Exactly. Yeah. Because, you know, when we, as humans have adopted these tools,

00:14:43.260 --> 00:14:45.620
<v Trevor Manz>the reason we adopt them is because it's not just the code,

00:14:45.720 --> 00:14:49.180
<v Trevor Manz>it's the values and the in-memory representations of those data

00:14:49.280 --> 00:14:54.840
<v Trevor Manz>So it's not just that I have this data frame on disk or this file on disk that has my data,

00:14:55.200 --> 00:14:59.080
<v Trevor Manz>it's that I want to look at the table and I want to see what those values are. And that may determine

00:14:59.200 --> 00:15:04.640
<v Trevor Manz>the next step that I'm going to take with that data of what plots I'm going to do or what validations

00:15:04.740 --> 00:15:09.180
<v Trevor Manz>I'm going to run on these data. And so really we had to sort of invert that thinking and think more

00:15:09.340 --> 00:15:15.420
<v Trevor Manz>about how do we extend these agents with a useful tool, which is a notebook for doing this sort of

00:15:15.440 --> 00:15:18.200
<v Trevor Manz>data work and iterating on those intermediate values.

00:15:20.000 --> 00:15:22.480
<v Michael Kennedy>This portion of Talk Python To Me is brought to you by Sentry.

00:15:22.930 --> 00:15:26.460
<v Michael Kennedy>You know Sentry for their great error monitoring, but let's talk about logs.

00:15:27.000 --> 00:15:27.800
<v Michael Kennedy>Logs are messy.

00:15:28.380 --> 00:15:32.280
<v Michael Kennedy>Trying to grep through them and line them up with traces and dashboards just to understand

00:15:32.460 --> 00:15:33.900
<v Michael Kennedy>one issue isn't easy.

00:15:34.480 --> 00:15:36.520
<v Michael Kennedy>Did you know that Sentry has logs too?

00:15:37.200 --> 00:15:39.160
<v Michael Kennedy>And your logs just became way more usable.

00:15:39.700 --> 00:15:44.699
<v Michael Kennedy>Sentry's logs are trace connected and structured, so you can follow the request flow and filter

00:15:44.720 --> 00:15:49.780
<v Michael Kennedy>by what matters. And because Sentry surfaces the context right where you're debugging, the trace,

00:15:50.080 --> 00:15:55.600
<v Michael Kennedy>relevant logs, the error, and even the session replay all land in one timeline. No timestamp

00:15:55.740 --> 00:15:59.640
<v Michael Kennedy>matching, no tool hopping. From front end to mobile to back end, whatever you're debugging,

00:15:59.900 --> 00:16:05.200
<v Michael Kennedy>Sentry gives you the context you need so you can fix the problem and move on. More than 4.5 million

00:16:05.440 --> 00:16:10.239
<v Michael Kennedy>developers use Sentry, including teams at Anthropic and Disney+. Get started with Sentry

00:16:10.260 --> 00:16:16.880
<v Michael Kennedy>logs and error monitoring today at talkpython.fm/sentry. Be sure to use our code talkpython26.

00:16:17.560 --> 00:16:21.120
<v Michael Kennedy>The link is in your podcast player show notes. Thank you to Sentry for supporting the show.

00:16:22.740 --> 00:16:29.680
<v Michael Kennedy>Maybe good time to introduce Marimo pair. What is this? Yeah, so Marimo pair is an agent skill

00:16:30.180 --> 00:16:36.459
<v Trevor Manz>that drops an agent inside of an active Marimo kernel. And it allows basically it's a single tool

00:16:36.540 --> 00:16:39.380
<v Trevor Manz>that allows the agent to run Python code inside of that kernel

00:16:39.620 --> 00:16:42.760
<v Trevor Manz>to inspect and perform any sort of understanding

00:16:42.880 --> 00:16:44.660
<v Trevor Manz>what sort of intermediate values you have

00:16:44.770 --> 00:16:46.000
<v Trevor Manz>inside of your kernel environment,

00:16:46.290 --> 00:16:48.800
<v Trevor Manz>but then also drive the authorship of the notebook itself

00:16:48.970 --> 00:16:50.300
<v Trevor Manz>and run and execute cells.

00:16:50.710 --> 00:16:52.620
<v Trevor Manz>So basically it allows the agent to do anything

00:16:52.690 --> 00:16:54.140
<v Trevor Manz>you could do in a Marimo notebook

00:16:55.339 --> 00:16:58.820
<v Trevor Manz>and extend your analysis with an agent

00:16:59.040 --> 00:17:01.720
<v Trevor Manz>by giving the agent the ability to drive the exploration

00:17:02.410 --> 00:17:03.200
<v Trevor Manz>of a Marimo notebook.

00:17:03.500 --> 00:17:03.860
<v Michael Kennedy>Interesting.

00:17:04.339 --> 00:17:06.800
<v Michael Kennedy>Okay, so how does it get inside the notebook?

00:17:07.290 --> 00:17:07.740
<v Michael Kennedy>You know what I mean?

00:17:07.839 --> 00:17:10.540
<v Michael Kennedy>Do you have to change your code or something like that?

00:17:11.140 --> 00:17:12.060
<v Michael Kennedy>Do you have to include something?

00:17:13.040 --> 00:17:15.699
<v Trevor Manz>Yeah, so the setup is essentially an agent skill

00:17:15.810 --> 00:17:17.260
<v Trevor Manz>that you can install either from,

00:17:17.579 --> 00:17:18.819
<v Trevor Manz>if you're using something like Claude Code,

00:17:18.870 --> 00:17:20.420
<v Trevor Manz>you can install it from the Cloud Marketplace.

00:17:20.630 --> 00:17:23.199
<v Trevor Manz>You can install from Codex from a Marketplace as well.

00:17:23.510 --> 00:17:28.459
<v Trevor Manz>Or you can use an NPX command to install a skill from GitHub.

00:17:28.980 --> 00:17:31.620
<v Trevor Manz>And that skill teaches the agent how to use a single tool,

00:17:31.960 --> 00:17:33.580
<v Trevor Manz>which is essentially just run Python.

00:17:34.180 --> 00:17:39.700
<v Trevor Manz>And that single tool call allows the agent to run any kind of Python it wants to in the running Marimo kernel.

00:17:40.400 --> 00:17:44.100
<v Trevor Manz>So inside that kernel environment, it can do things like list variables that are in the notebook.

00:17:44.420 --> 00:17:48.120
<v Trevor Manz>It can inspect the cells of the notebook and look at the outputs of the notebook.

00:17:48.360 --> 00:17:55.920
<v Trevor Manz>But then it can also perform sort of user tasks in the notebook as well, like installing packages inside of Marimo or creating cells or running cells.

00:17:57.000 --> 00:18:03.960
<v Trevor Manz>But as it's performing those tasks using that tool, the agent gets instant feedback of what went wrong or what went right inside of that kernel.

00:18:04.340 --> 00:18:07.920
<v Trevor Manz>and is able to get back into these agentic loops for doing these tasks.

00:18:08.200 --> 00:18:11.720
<v Trevor Manz>But using Marimo as sort of the workspace for performing your data tasks

00:18:11.900 --> 00:18:13.680
<v Trevor Manz>rather than editing the file system.

00:18:14.060 --> 00:18:15.300
<v Michael Kennedy>Yeah, okay, that makes sense.

00:18:15.580 --> 00:18:20.640
<v Michael Kennedy>And I guess there's some kind of API or something that the agent can use to talk to the running notebook.

00:18:21.040 --> 00:18:26.980
<v Trevor Manz>Yeah, so we sort of hide an API within Marimo that's called code mode.

00:18:27.340 --> 00:18:30.499
<v Trevor Manz>And what code mode is essentially is this semi-private API

00:18:30.500 --> 00:18:34.080
<v Trevor Manz>that's just meant for agents that are running Python inside of that kernel.

00:18:34.740 --> 00:18:38.280
<v Trevor Manz>And with that API, the agent can grab the current notebook state

00:18:38.420 --> 00:18:40.120
<v Trevor Manz>and talk to Marimo directly.

00:18:40.460 --> 00:18:43.140
<v Trevor Manz>So it can do things like toast notifications in the UI that say,

00:18:43.340 --> 00:18:46.100
<v Trevor Manz>hey, I'm connected to your notebook session.

00:18:46.820 --> 00:18:48.600
<v Trevor Manz>It can do things like I mentioned before,

00:18:49.120 --> 00:18:53.420
<v Trevor Manz>like list out variables or inspect what cells declare different variables.

00:18:53.940 --> 00:18:56.360
<v Trevor Manz>But then also it has these sort of mutation APIs

00:18:56.720 --> 00:18:59.760
<v Trevor Manz>where I want to say create cell, edit cell, run cell.

00:19:00.100 --> 00:19:04.260
<v Trevor Manz>And because it's all Python and not individual something like MCP tools,

00:19:05.400 --> 00:19:07.100
<v Trevor Manz>the agent has the ability to write Python code

00:19:07.200 --> 00:19:11.560
<v Trevor Manz>that really does complex composition of those primitives as well.

00:19:11.610 --> 00:19:14.120
<v Trevor Manz>So it can create multiple cells at the same time

00:19:14.260 --> 00:19:17.600
<v Trevor Manz>just by calling create cell five times inside of some sort of loop.

00:19:18.560 --> 00:19:20.380
<v Trevor Manz>Because we're giving it Python as the tool

00:19:20.630 --> 00:19:22.180
<v Trevor Manz>rather than sort of a JSON API.

00:19:22.480 --> 00:19:26.199
<v Michael Kennedy>I'll say, for me, it kind of boggles the mind

00:19:26.420 --> 00:19:30.640
<v Michael Kennedy>how much Claude Code just relies on grep to understand projects.

00:19:30.880 --> 00:19:33.500
<v Michael Kennedy>And it seems super inefficient to me.

00:19:33.740 --> 00:19:37.440
<v Michael Kennedy>I mean, Claude Code was created in two weeks, something like that.

00:19:37.440 --> 00:19:40.640
<v Michael Kennedy>It feels very much JavaScript-y in that regard.

00:19:40.880 --> 00:19:41.800
<v Michael Kennedy>Like, look what you built.

00:19:42.200 --> 00:19:44.360
<v Michael Kennedy>Also, look at the missing pieces a little bit.

00:19:44.780 --> 00:19:49.860
<v Michael Kennedy>And as impressive as it is, it seems like if it could ask the question,

00:19:50.220 --> 00:19:52.380
<v Michael Kennedy>where is this symbol used throughout my project?

00:19:53.100 --> 00:19:54.660
<v Michael Kennedy>What is the value of this variable?

00:19:55.180 --> 00:19:55.720
<v Michael Kennedy>Things like that.

00:19:55.840 --> 00:19:56.760
<v Michael Kennedy>What is the type of it?

00:19:57.240 --> 00:20:03.140
<v Michael Kennedy>Without reading and jumping around 100,000, a million lines of code all the time, it would

00:20:03.140 --> 00:20:03.880
<v Michael Kennedy>be way more efficient.

00:20:04.000 --> 00:20:07.760
<v Michael Kennedy>And it sounds a little bit like that's how it interacts with your notebook through Marimo

00:20:07.960 --> 00:20:08.140
<v Michael Kennedy>Pair.

00:20:08.480 --> 00:20:08.740
<v Trevor Manz>Yeah.

00:20:08.980 --> 00:20:13.440
<v Trevor Manz>So within that code execution point where it can run Python code, the agent has the ability

00:20:13.500 --> 00:20:17.780
<v Trevor Manz>to look at the source of those cells, but then also can look at the in-memory values

00:20:18.400 --> 00:20:19.480
<v Trevor Manz>of those cells as well.

00:20:19.860 --> 00:20:24.080
<v Trevor Manz>And therefore, it can, like you were just saying, it can look at the type, it can look at the

00:20:24.400 --> 00:20:24.700
<v Trevor Manz>values.

00:20:25.880 --> 00:20:29.760
<v Trevor Manz>and this type of runtime inspection of values

00:20:30.060 --> 00:20:31.440
<v Trevor Manz>really does change model behavior

00:20:31.650 --> 00:20:33.880
<v Trevor Manz>in terms of, like I mentioned before,

00:20:34.260 --> 00:20:35.940
<v Trevor Manz>allowing them to get into these loops

00:20:36.680 --> 00:20:38.180
<v Trevor Manz>and efficiently get to some sort of problem,

00:20:38.960 --> 00:20:41.320
<v Trevor Manz>resolution to some task or problem inside the notebook

00:20:41.530 --> 00:20:43.240
<v Trevor Manz>because it's able to course correct

00:20:43.550 --> 00:20:46.040
<v Trevor Manz>and ask a lot richer information about your values.

00:20:46.960 --> 00:20:48.720
<v Trevor Manz>Because if you're looking at a source code on disk,

00:20:49.080 --> 00:20:51.240
<v Trevor Manz>maybe for a file that loads a data frame,

00:20:51.550 --> 00:20:52.880
<v Trevor Manz>you just have a single line that says,

00:20:53.680 --> 00:20:57.340
<v Trevor Manz>you know, load, Polars read CSV or pandas read CSV.

00:20:57.800 --> 00:21:01.640
<v Trevor Manz>And then the agent would actually have to go look at that CSV to understand what's in that CSV

00:21:02.300 --> 00:21:04.060
<v Trevor Manz>and combining that with the source code.

00:21:04.280 --> 00:21:07.040
<v Trevor Manz>But if you pair that with a live REPL like we have inside of Marimo,

00:21:07.560 --> 00:21:11.760
<v Trevor Manz>the agent could just say, you know, the agent now has a data frame that it can look at.

00:21:11.940 --> 00:21:15.140
<v Trevor Manz>And that's a much richer representation of that static file on disk.

00:21:15.440 --> 00:21:16.820
<v Trevor Manz>And then the agent can ask about the schema.

00:21:17.020 --> 00:21:20.800
<v Trevor Manz>It could ask about, yeah, the different columns, the data types of the columns.

00:21:20.900 --> 00:21:22.340
<v Trevor Manz>It could figure out the number of rows.

00:21:23.000 --> 00:21:35.420
<v Trevor Manz>So essentially when you ask a question of, you know, I want to plot the quantitative axes of these data in a pair plot, you no longer have to specify what those axes are because the agent can just go off and look at the schema to figure that out.

00:21:35.580 --> 00:21:50.200
<v Trevor Manz>And I think that that provides this really rich experience when you're trying to get something done with your data because you can be a little bit more declarative about like, I want to look at these subsets or these things without having to actually go down and figure out the APIs to plot those things out.

00:21:50.680 --> 00:21:53.200
<v Michael Kennedy>What's the token economics of this?

00:21:54.120 --> 00:21:57.200
<v Michael Kennedy>Is it more efficient on tokens because it doesn't have to search around so much?

00:21:57.240 --> 00:21:58.900
<v Michael Kennedy>Or have you noticed a difference?

00:21:59.460 --> 00:22:00.500
<v Trevor Manz>Yeah, that's a great question.

00:22:00.740 --> 00:22:07.400
<v Trevor Manz>I think from the skill itself is a pretty slim markdown file that just teaches the agent

00:22:08.200 --> 00:22:12.560
<v Trevor Manz>what this tool is and how to use this tool, which is run Python in the running kernel.

00:22:13.180 --> 00:22:18.940
<v Trevor Manz>And then the agent is able to, maybe before the agent would read the entire notebook file

00:22:19.000 --> 00:22:20.500
<v Trevor Manz>to figure out what you want to do.

00:22:20.840 --> 00:22:24.580
<v Trevor Manz>but instead off of disk because it had to orient itself

00:22:24.740 --> 00:22:25.840
<v Trevor Manz>where you are inside the notebook.

00:22:26.460 --> 00:22:28.360
<v Trevor Manz>Versus if I asked the agent,

00:22:28.500 --> 00:22:30.920
<v Trevor Manz>we're focusing on this cell right now inside the notebook.

00:22:31.240 --> 00:22:34.320
<v Trevor Manz>The agent doesn't have to print off all the other cells into context.

00:22:34.460 --> 00:22:36.860
<v Trevor Manz>It can just focus on that one cell or that one variable

00:22:36.980 --> 00:22:38.760
<v Trevor Manz>that we're talking about in the kernel.

00:22:38.980 --> 00:22:41.720
<v Trevor Manz>So we haven't done anything formal to compare those things.

00:22:41.940 --> 00:22:44.740
<v Trevor Manz>But essentially when you're able to extend the environment

00:22:45.260 --> 00:22:46.700
<v Trevor Manz>with variables and values,

00:22:47.100 --> 00:22:50.540
<v Trevor Manz>then you give the agent the ability to offload context

00:22:50.560 --> 00:22:53.080
<v Trevor Manz>into Python rather than bringing that as extra context

00:22:53.240 --> 00:22:55.440
<v Trevor Manz>that fills up your context buffer.

00:22:55.720 --> 00:22:58.500
<v Michael Kennedy>Yeah, my impression is that first estimate

00:22:58.640 --> 00:23:00.260
<v Michael Kennedy>is it would be way more efficient, honestly.

00:23:00.820 --> 00:23:03.280
<v Michael Kennedy>Like a lot of times I'll see Claude Code or something

00:23:03.280 --> 00:23:05.840
<v Michael Kennedy>and go like, okay, I need to understand what this does.

00:23:06.000 --> 00:23:08.100
<v Michael Kennedy>Let me write a little Python script

00:23:08.220 --> 00:23:10.920
<v Michael Kennedy>and execute it with a dash C or what,

00:23:10.940 --> 00:23:12.820
<v Michael Kennedy>you know, or I can just pass it as a string effectively.

00:23:13.080 --> 00:23:15.080
<v Michael Kennedy>And it's recreating all these things

00:23:15.420 --> 00:23:16.800
<v Michael Kennedy>instead of just like print X

00:23:17.160 --> 00:23:19.100
<v Michael Kennedy>or just give me the value of X, right?

00:23:19.480 --> 00:23:19.820
<v Trevor Manz>Yeah, exactly.

00:23:20.490 --> 00:23:23.120
<v Trevor Manz>And actually you can think of each invocation of the tool

00:23:23.580 --> 00:23:24.760
<v Trevor Manz>that we provide to the agent

00:23:25.200 --> 00:23:27.020
<v Trevor Manz>as essentially running Python-C,

00:23:27.500 --> 00:23:30.920
<v Trevor Manz>except picking up wherever you left off inside of your notebook.

00:23:31.440 --> 00:23:35.380
<v Trevor Manz>So it has the ability in that string that it passes to Python

00:23:35.640 --> 00:23:37.820
<v Trevor Manz>to just reference variables that you currently have in memory.

00:23:38.240 --> 00:23:41.320
<v Trevor Manz>And it doesn't have to perform something high up in that script

00:23:41.690 --> 00:23:44.840
<v Trevor Manz>that might be costly to reload a data set or mangle it

00:23:44.840 --> 00:23:47.760
<v Trevor Manz>to get to some later state to print it out.

00:23:47.960 --> 00:23:51.720
<v Trevor Manz>Instead, it can kind of pick up where you are currently in your notebook session, you

00:23:51.720 --> 00:23:52.760
<v Trevor Manz>know, and tell me about my data frame.

00:23:52.890 --> 00:23:56.100
<v Trevor Manz>And it can run a bunch of queries on the thing that you currently have in memory to tell

00:23:56.110 --> 00:23:56.560
<v Trevor Manz>you about it.

00:23:56.700 --> 00:23:56.960
<v Michael Kennedy>Sure.

00:23:57.380 --> 00:23:57.480
<v Michael Kennedy>Okay.

00:23:57.940 --> 00:23:58.540
<v Michael Kennedy>Super interesting.

00:24:00.800 --> 00:24:05.840
<v Michael Kennedy>And let's talk just really quickly about this distributing as a skill.

00:24:05.970 --> 00:24:10.580
<v Michael Kennedy>I mean, there've been other attempts for notebooks that I've seen that are kind of like, we're

00:24:10.680 --> 00:24:15.640
<v Michael Kennedy>going to embed an LLM or at least an LLM integration in the notebook.

00:24:16.160 --> 00:24:23.200
<v Michael Kennedy>And it's interesting to see you shipping this as a skill plus a capability that's just in Maremo.

00:24:23.610 --> 00:24:27.540
<v Michael Kennedy>So on one hand, it's easy to think, well, that doesn't seem very useful.

00:24:27.850 --> 00:24:39.380
<v Michael Kennedy>But then again, there's always the what is now well-known SaaSpocalypse because Claude shipped 13 markdown files, which wiped $285 billion off of the stock market, right?

00:24:40.020 --> 00:24:41.760
<v Michael Kennedy>So there's something to these markdown files.

00:24:41.810 --> 00:24:44.240
<v Michael Kennedy>I really think it's quite powerful.

00:24:44.600 --> 00:24:48.180
<v Michael Kennedy>but how'd you come around to this distribution model?

00:24:48.640 --> 00:24:50.900
<v Trevor Manz>Yeah, so Marimo, and I should be clear,

00:24:51.080 --> 00:24:53.320
<v Trevor Manz>Marimo today still has a chat integration

00:24:53.720 --> 00:24:55.060
<v Trevor Manz>that you can bring your own LLM

00:24:56.620 --> 00:24:59.200
<v Trevor Manz>and actually drive an agent interface from there.

00:24:59.460 --> 00:25:03.300
<v Trevor Manz>And even you can actually use the Marimo pair tools

00:25:03.680 --> 00:25:05.820
<v Trevor Manz>inside of that chat interface as well.

00:25:06.060 --> 00:25:08.300
<v Trevor Manz>But increasingly we had users that were asking about,

00:25:08.520 --> 00:25:10.340
<v Trevor Manz>how do I use Claude Code with Marimo?

00:25:10.420 --> 00:25:12.020
<v Trevor Manz>Or how do I use Codex with Marimo?

00:25:12.540 --> 00:25:14.560
<v Trevor Manz>And what we started to realize is that

00:25:14.560 --> 00:25:20.400
<v Trevor Manz>These coding agents, we're building a tool that we'd like our users to spend a lot of time in.

00:25:20.780 --> 00:25:26.720
<v Trevor Manz>But these coding agents outside of Marimo have a lot of access to things that aren't ever going to be inside of the Marimo user interface,

00:25:26.890 --> 00:25:34.640
<v Trevor Manz>such as the different skills or MCPs or things that they've enabled for their main driver of doing development on their machine.

00:25:35.220 --> 00:25:38.760
<v Trevor Manz>And we want to make sure that Marimo is a useful tool in that context as well.

00:25:38.970 --> 00:25:44.240
<v Trevor Manz>And so increasingly, many of the folks on our team are using Claude Code for the actual development of Marimo.

00:25:44.680 --> 00:25:46.900
<v Trevor Manz>and we started to feel this friction

00:25:47.030 --> 00:25:48.780
<v Trevor Manz>of when we wanted to work on a notebook

00:25:48.930 --> 00:25:50.540
<v Trevor Manz>that we couldn't just start up the notebook

00:25:50.610 --> 00:25:52.620
<v Trevor Manz>and get it running from Claude

00:25:52.620 --> 00:25:53.240
<v Trevor Manz>and then edit it.

00:25:53.750 --> 00:25:56.180
<v Trevor Manz>Instead, it felt like we were jumping between tools.

00:25:56.940 --> 00:25:58.700
<v Trevor Manz>At least initially, we were thinking

00:25:59.270 --> 00:26:01.740
<v Trevor Manz>how do we make Maremo notebooks

00:26:01.870 --> 00:26:03.120
<v Trevor Manz>a useful tool for agents?

00:26:03.700 --> 00:26:05.960
<v Trevor Manz>Then we started to look at best practices

00:26:06.090 --> 00:26:06.740
<v Trevor Manz>for doing that.

00:26:08.420 --> 00:26:09.820
<v Trevor Manz>Simply a bare bones MCP

00:26:10.000 --> 00:26:11.480
<v Trevor Manz>was one approach that you could go with.

00:26:12.140 --> 00:26:13.480
<v Trevor Manz>When we started to look at skills

00:26:13.500 --> 00:26:17.520
<v Trevor Manz>was I think around the fall slash December last year

00:26:18.170 --> 00:26:20.160
<v Trevor Manz>when these models started to get quite good,

00:26:21.510 --> 00:26:25.000
<v Trevor Manz>the skills started to become a very useful vector

00:26:25.150 --> 00:26:29.660
<v Trevor Manz>I think for packaging up reusable instructions

00:26:29.790 --> 00:26:34.560
<v Trevor Manz>for how to effectively use a particular command line tool or skill.

00:26:35.090 --> 00:26:36.700
<v Trevor Manz>And so if you actually look at our skill today,

00:26:37.380 --> 00:26:41.760
<v Trevor Manz>it doesn't really tell you much about how the internals of Maremo works

00:26:41.820 --> 00:26:43.560
<v Trevor Manz>or how that tool works.

00:26:43.670 --> 00:26:45.880
<v Trevor Manz>And instead it just teaches the agent

00:26:46.160 --> 00:26:47.440
<v Trevor Manz>about where that tool exists

00:26:47.620 --> 00:26:48.660
<v Trevor Manz>and how to use that tool.

00:26:49.080 --> 00:26:50.000
<v Trevor Manz>But then if it wants to learn

00:26:50.090 --> 00:26:51.220
<v Trevor Manz>about how to invoke that tool

00:26:51.420 --> 00:26:53.200
<v Trevor Manz>and the different capabilities that it has

00:26:53.330 --> 00:26:54.320
<v Trevor Manz>within that active kernel,

00:26:54.720 --> 00:26:56.360
<v Trevor Manz>it actually uses the help command.

00:26:56.440 --> 00:26:58.000
<v Trevor Manz>We instruct it to use the help command

00:26:58.010 --> 00:26:59.640
<v Trevor Manz>to print off the doc strings for itself

00:27:00.020 --> 00:27:01.400
<v Trevor Manz>and then learn in that session

00:27:01.610 --> 00:27:03.200
<v Trevor Manz>how to effectively drive Marimo.

00:27:03.550 --> 00:27:05.400
<v Trevor Manz>And so this actually has a sort of decoupling

00:27:05.570 --> 00:27:07.920
<v Trevor Manz>between our skill and Marimo's internals

00:27:08.030 --> 00:27:09.480
<v Trevor Manz>because we don't actually publish anything

00:27:09.500 --> 00:27:12.920
<v Trevor Manz>in the skill that talks about the API that it will be using.

00:27:13.100 --> 00:27:17.280
<v Trevor Manz>And instead we'd say, hey, go find that when you load the skill to figure out what capabilities

00:27:17.460 --> 00:27:19.160
<v Trevor Manz>that you actually have inside the active kernel.

00:27:19.520 --> 00:27:20.060
<v Michael Kennedy>That's interesting.

00:27:20.340 --> 00:27:23.640
<v Michael Kennedy>That way, if you want to change it, you don't have to get people to update the skill, which

00:27:23.760 --> 00:27:24.440
<v Michael Kennedy>is always tricky.

00:27:24.980 --> 00:27:25.380
<v Trevor Manz>Exactly.

00:27:25.500 --> 00:27:30.600
<v Trevor Manz>This was the thing that we became very conscious of quite early is that updating Marimo and

00:27:30.700 --> 00:27:32.240
<v Trevor Manz>updating the skill could get out of sync.

00:27:32.320 --> 00:27:37.820
<v Trevor Manz>And we just wanted to make sure that our users didn't get into the state where they're having

00:27:37.840 --> 00:27:41.220
<v Trevor Manz>a really poor experience using their agents because they upgraded Marimo and they hadn't

00:27:41.380 --> 00:27:45.860
<v Trevor Manz>upgraded their skill. And so the skill isn't so prescriptive about exactly what the agent should

00:27:45.980 --> 00:27:51.420
<v Trevor Manz>do, just more, hey, these are tools. And this is sort of the mental model of how you could drive

00:27:51.700 --> 00:27:56.820
<v Trevor Manz>Marimo. And then should you want to drive Marimo, here's where you go find how to do that inside of

00:27:56.920 --> 00:28:00.920
<v Trevor Manz>the active Marimo that you have in your session. Michael, I can't, I might have lost.

00:28:01.090 --> 00:28:06.419
<v Michael Kennedy>Sorry. So skills have been changing over time about how they're structured and they used to be

00:28:06.440 --> 00:28:12.140
<v Michael Kennedy>commands and then i don't know just the layout of these things is a little bit a little bit funky

00:28:12.560 --> 00:28:18.220
<v Michael Kennedy>um i mean i guess you could manage it from marimo like have it say like hey skill update available

00:28:18.700 --> 00:28:24.120
<v Michael Kennedy>push this button to reinstall it or something but it sounds pretty bare bones in terms of like just

00:28:24.460 --> 00:28:29.720
<v Michael Kennedy>go talk here and then you'll figure it out when you get there sounds sounds good yeah exactly and

00:28:29.880 --> 00:28:34.860
<v Trevor Manz>you know some of these like agents have the ability like for instance in Claude Code and codex

00:28:35.420 --> 00:28:39.280
<v Trevor Manz>If you have this marketplace.json file where you have your skill,

00:28:39.500 --> 00:28:41.920
<v Trevor Manz>you can subscribe for auto-updates of that skill

00:28:42.060 --> 00:28:44.280
<v Trevor Manz>so you don't have to re-sync that file.

00:28:44.540 --> 00:28:47.000
<v Trevor Manz>Or if you use one of these command-line tools for installing from GitHub,

00:28:47.200 --> 00:28:48.100
<v Trevor Manz>you can install the latest.

00:28:50.060 --> 00:28:53.600
<v Trevor Manz>If our users got out of sync, it's quite hard to figure out what version they have,

00:28:53.660 --> 00:28:55.500
<v Trevor Manz>and maybe we'd need to do some runtime inspection.

00:28:55.660 --> 00:28:58.600
<v Trevor Manz>So by really trying to have this decoupling of the skill

00:28:58.820 --> 00:29:01.020
<v Trevor Manz>from the capabilities that we have inside of Marimo,

00:29:01.500 --> 00:29:05.080
<v Trevor Manz>we can ensure that there's sort of a baseline of user experience.

00:29:05.310 --> 00:29:08.540
<v Trevor Manz>And then should folks want to upgrade to latest skill or upgrade Marimo,

00:29:09.210 --> 00:29:10.620
<v Trevor Manz>hopefully both those things should, should,

00:29:10.890 --> 00:29:12.620
<v Trevor Manz>should improve that experience over time.

00:29:12.960 --> 00:29:13.500
<v Michael Kennedy>Yeah, for sure.

00:29:15.040 --> 00:29:17.780
<v Michael Kennedy>This portion of Talk Python is brought to you by us.

00:29:18.740 --> 00:29:22.560
<v Michael Kennedy>I want to give you a quick bit of news about the courses side of Talk Python.

00:29:23.280 --> 00:29:23.440
<v Michael Kennedy>Now,

00:29:23.920 --> 00:29:28.240
<v Michael Kennedy>every single course at Talk Python training has full subtitles in German,

00:29:28.680 --> 00:29:30.060
<v Michael Kennedy>Spanish, and Portuguese.

00:29:30.380 --> 00:29:36.180
<v Michael Kennedy>That's all 283 hours completely translated, not just a couple of flagship courses.

00:29:36.730 --> 00:29:41.580
<v Michael Kennedy>Just click the CC button in your player, pick your language, and you can even resize and

00:29:42.020 --> 00:29:44.580
<v Michael Kennedy>reposition the captions so they don't cover the code.

00:29:44.890 --> 00:29:49.720
<v Michael Kennedy>If Deutsch, Espanol, or Portuguese is your first language, this one's for you.

00:29:50.200 --> 00:29:52.200
<v Michael Kennedy>Check it out at talkpython.fm.

00:29:52.420 --> 00:29:55.720
<v Michael Kennedy>Just click courses in the nav bar, log in, or create an account.

00:29:56.200 --> 00:30:00.440
<v Michael Kennedy>Even the free courses now come with subtitles in four different languages.

00:30:01.600 --> 00:30:05.340
<v Michael Kennedy>Let's walk through installing this and maybe a quick start story.

00:30:05.420 --> 00:30:07.960
<v Michael Kennedy>So first, installing it, how do we do?

00:30:08.140 --> 00:30:11.480
<v Trevor Manz>Yeah, so whether or not you have a tool called...

00:30:11.880 --> 00:30:15.420
<v Trevor Manz>So first of all, a skill is a folder of some files,

00:30:15.820 --> 00:30:17.340
<v Trevor Manz>and there's a file called skill.md.

00:30:17.520 --> 00:30:19.040
<v Trevor Manz>This is like an official specification

00:30:20.080 --> 00:30:22.860
<v Trevor Manz>that you put somewhere on your file system for your agent to find.

00:30:23.320 --> 00:30:26.160
<v Trevor Manz>And then there are a handful of tools that exist in open source

00:30:26.180 --> 00:30:30.160
<v Trevor Manz>adding those files. And like I mentioned just a moment ago, being able to sort of upgrade those

00:30:30.330 --> 00:30:37.940
<v Trevor Manz>files easily, either based off of Git syncing or by installing with one of these marketplaces. So

00:30:38.110 --> 00:30:42.100
<v Trevor Manz>the way that we publish our skills, we have this repo, it's called marimoteam, marimopair.

00:30:42.980 --> 00:30:47.720
<v Trevor Manz>The code that we publish there, we version over time. And you can either use, if you have the

00:30:48.000 --> 00:30:54.700
<v Trevor Manz>npm package manager, you can use npxskillsadd marimoteam slash marimopair. That will start up

00:30:54.700 --> 00:30:58.560
<v Trevor Manz>the command line tool to add those files to your file system. You can either install them locally

00:30:58.680 --> 00:31:04.140
<v Trevor Manz>in a folder, globally on your system. If you don't have npm installed, you can actually use UV

00:31:04.600 --> 00:31:11.360
<v Trevor Manz>and do uvx Dino A npm skills. And this will sort of shell out to Dino to actually install those for

00:31:11.520 --> 00:31:16.520
<v Michael Kennedy>you, but you can drive it through uv. If you have pod code. I've seen this so much. I'm like,

00:31:16.780 --> 00:31:23.940
<v Michael Kennedy>oh man, why are we stuck on NPM? I do have these things. So I'll put the uvx Dino dash A NPM

00:31:24.500 --> 00:31:27.660
<v Michael Kennedy>I feel like that could be a sweet new alias,

00:31:27.690 --> 00:31:29.380
<v Michael Kennedy>just UVNPM.

00:31:33.800 --> 00:31:34.720
<v Michael Kennedy>I think that'd be nice.

00:31:34.920 --> 00:31:35.880
<v Michael Kennedy>I'm going to find a way to do that.

00:31:36.120 --> 00:31:36.680
<v Trevor Manz>Yeah, definitely.

00:31:38.740 --> 00:31:41.960
<v Trevor Manz>Short tangent, I actually got the Dino name for the Dino folks

00:31:42.030 --> 00:31:43.520
<v Trevor Manz>so we could transfer over that package.

00:31:45.600 --> 00:31:47.280
<v Trevor Manz>Being able to share packages between ecosystems

00:31:47.690 --> 00:31:49.900
<v Trevor Manz>without having to reinstall a new package manager

00:31:50.010 --> 00:31:51.700
<v Trevor Manz>I think is really important

00:31:51.700 --> 00:31:55.120
<v Trevor Manz>because both the Python ecosystem and the npm ecosystem

00:31:55.200 --> 00:31:56.020
<v Trevor Manz>are growing so much.

00:31:57.080 --> 00:31:58.740
<v Trevor Manz>But it's a lot to ask of users to make sure

00:31:58.740 --> 00:31:59.980
<v Trevor Manz>that they have both these things installed,

00:32:00.300 --> 00:32:01.640
<v Trevor Manz>especially if someone considers themselves

00:32:02.740 --> 00:32:04.800
<v Trevor Manz>a node person versus a Python person.

00:32:05.160 --> 00:32:06.500
<v Trevor Manz>Let's just make sure that everyone has access.

00:32:06.960 --> 00:32:09.360
<v Michael Kennedy>It could be an offense to have to install npm.

00:32:09.440 --> 00:32:09.880
<v Michael Kennedy>I'm not just kidding.

00:32:11.340 --> 00:32:14.640
<v Michael Kennedy>So you're responsible for getting Dino as a PyPI package?

00:32:15.280 --> 00:32:15.860
<v Trevor Manz>Yes, yeah.

00:32:16.220 --> 00:32:18.240
<v Trevor Manz>I've collaborated a little bit with the Dino folks over the years.

00:32:19.180 --> 00:32:23.900
<v Trevor Manz>I went through a very formal process with PyPy to request that name and then turn it over to them.

00:32:24.480 --> 00:32:25.340
<v Michael Kennedy>Oh, that's super cool.

00:32:25.560 --> 00:32:30.300
<v Michael Kennedy>So tell people real quick about Dino because they're like, well, what does that have to do with Node?

00:32:31.240 --> 00:32:35.180
<v Trevor Manz>Yeah, so the creator of Dino was the same creator of Node.

00:32:35.560 --> 00:32:41.740
<v Trevor Manz>And sort of the basis of Dino was, at least from the perspective of the Dino creators,

00:32:42.120 --> 00:32:45.080
<v Trevor Manz>was to fix some of the things that had happened in the Node ecosystem.

00:32:45.440 --> 00:32:49.440
<v Trevor Manz>And so Dino is a similar type of server-side JavaScript runtime,

00:32:50.520 --> 00:32:54.600
<v Trevor Manz>but brings over a lot of functions a lot more similarly

00:32:54.690 --> 00:32:56.260
<v Trevor Manz>to the way that the browser has.

00:32:56.270 --> 00:32:57.840
<v Trevor Manz>So it has a lot more fine-grained permissions

00:32:58.070 --> 00:33:00.800
<v Trevor Manz>baked into when you're trying to do something

00:33:00.810 --> 00:33:02.480
<v Trevor Manz>like read the file system or read variables,

00:33:03.150 --> 00:33:07.380
<v Trevor Manz>you have to actually explicitly opt into those capabilities

00:33:07.919 --> 00:33:09.440
<v Trevor Manz>while you're executing the script

00:33:10.180 --> 00:33:13.580
<v Trevor Manz>to allow that runtime to access those things.

00:33:13.980 --> 00:33:15.060
<v Michael Kennedy>Okay, yeah, very nice.

00:33:15.540 --> 00:33:19.980
<v Michael Kennedy>Now, do you have a preference here if I npx it or uvx it,

00:33:20.380 --> 00:33:23.400
<v Michael Kennedy>or is it better to do the marketplace type of thing?

00:33:24.020 --> 00:33:27.460
<v Trevor Manz>Yeah, so this starts to come down to your agent of choice.

00:33:28.060 --> 00:33:32.000
<v Trevor Manz>So the npx skills is a command line tool that's published.

00:33:32.820 --> 00:33:35.180
<v Trevor Manz>Skills is a package that's on the npm registry

00:33:35.740 --> 00:33:38.220
<v Trevor Manz>that installs skills on your system

00:33:38.500 --> 00:33:40.480
<v Trevor Manz>and sort of has a little CLI walkthrough

00:33:40.840 --> 00:33:43.140
<v Trevor Manz>where you can pick multiple agents,

00:33:43.380 --> 00:33:46.080
<v Trevor Manz>like if you use Codex or use Claude Code or maybe OpenCode,

00:33:46.980 --> 00:33:50.060
<v Trevor Manz>where it will install them to universal directories for those things.

00:33:51.030 --> 00:33:54.440
<v Trevor Manz>So if you are someone that likes to play with a lot of different agent harnesses,

00:33:54.680 --> 00:33:58.280
<v Trevor Manz>I'd probably recommend using NPX or uvx Dino.

00:33:59.500 --> 00:34:01.480
<v Trevor Manz>Those are semantically equivalent.

00:34:02.590 --> 00:34:04.960
<v Trevor Manz>They just eventually will trigger the same CLI.

00:34:05.080 --> 00:34:08.460
<v Trevor Manz>It's just the package manager that's doing it is different.

00:34:08.860 --> 00:34:11.399
<v Michael Kennedy>Right, it's more npm versus plugin, exactly.

00:34:11.919 --> 00:34:13.700
<v Trevor Manz>Yeah, and then the plugin is more,

00:34:14.060 --> 00:34:16.540
<v Trevor Manz>that's a specific install instruction to Claude Code.

00:34:17.260 --> 00:34:19.560
<v Trevor Manz>And also I believe that Codex has something quite similar.

00:34:20.179 --> 00:34:23.060
<v Trevor Manz>And there you can register what's called a marketplace

00:34:23.560 --> 00:34:25.320
<v Trevor Manz>for our Marimo team,

00:34:25.840 --> 00:34:27.360
<v Trevor Manz>such that when we publish updates,

00:34:28.639 --> 00:34:30.159
<v Trevor Manz>when you boot up Claude Code one day,

00:34:30.379 --> 00:34:32.200
<v Trevor Manz>maybe it'll ask you if you'd like to upgrade our plugin.

00:34:32.899 --> 00:34:34.440
<v Trevor Manz>So that will sort of keep it in sync.

00:34:35.220 --> 00:34:36.500
<v Trevor Manz>So if you are a Claude Code user,

00:34:36.940 --> 00:34:38.220
<v Trevor Manz>I think I'd generally recommend,

00:34:38.540 --> 00:34:39.740
<v Trevor Manz>and mostly a Claude Code user,

00:34:39.899 --> 00:34:41.879
<v Trevor Manz>I'd generally recommend installing from the marketplace

00:34:42.280 --> 00:34:43.679
<v Trevor Manz>versus if you're someone that's flipping around

00:34:43.820 --> 00:34:44.580
<v Trevor Manz>between a lot of tools,

00:34:45.440 --> 00:34:46.720
<v Trevor Manz>the MPX skills does a good job

00:34:46.820 --> 00:34:48.320
<v Trevor Manz>and you can MPX skills upgrade

00:34:49.360 --> 00:34:50.720
<v Trevor Manz>the Marimo pair skill as well.

00:34:50.919 --> 00:34:53.100
<v Michael Kennedy>Okay, that sounds really good.

00:34:53.120 --> 00:34:55.720
<v Michael Kennedy>I guess, yeah, the one is general, right?

00:34:55.820 --> 00:34:56.419
<v Michael Kennedy>And the one, the other,

00:34:56.800 --> 00:34:58.780
<v Michael Kennedy>the plugin one is really Claude Code.

00:34:58.920 --> 00:35:00.660
<v Michael Kennedy>Although I suspect if you put it into Codex,

00:35:00.720 --> 00:35:02.620
<v Michael Kennedy>it might just give you a little bit of snark

00:35:02.740 --> 00:35:03.340
<v Michael Kennedy>and install it.

00:35:04.440 --> 00:35:05.480
<v Trevor Manz>Yeah, yeah, definitely.

00:35:05.740 --> 00:35:08.960
<v Trevor Manz>I've accidentally invoked the skill with the four,

00:35:09.040 --> 00:35:09.820
<v Trevor Manz>I think in Codex,

00:35:09.920 --> 00:35:11.860
<v Trevor Manz>it's the dollar sign to invoke skills

00:35:11.880 --> 00:35:13.580
<v Trevor Manz>and it's Claude, it's like this forward slash

00:35:13.900 --> 00:35:15.000
<v Trevor Manz>and it figures it out.

00:35:15.620 --> 00:35:16.560
<v Michael Kennedy>Yeah, yeah, exactly.

00:35:17.180 --> 00:35:18.500
<v Michael Kennedy>You must be confused.

00:35:20.000 --> 00:35:20.920
<v Michael Kennedy>This doesn't even make sense.

00:35:21.060 --> 00:35:23.720
<v Michael Kennedy>What you meant to type was such and such.

00:35:24.220 --> 00:35:24.940
<v Michael Kennedy>Yeah, okay.

00:35:25.560 --> 00:35:28.780
<v Michael Kennedy>So is there like a getting started example

00:35:28.910 --> 00:35:31.220
<v Michael Kennedy>or something like that on one of your pages

00:35:31.380 --> 00:35:32.920
<v Michael Kennedy>I can sort of point at?

00:35:33.200 --> 00:35:36.220
<v Trevor Manz>Yeah, so if you have the skill installed,

00:35:36.740 --> 00:35:39.740
<v Trevor Manz>the best thing you can do is just spin up a Marimo session.

00:35:40.420 --> 00:35:43.540
<v Trevor Manz>So you could even prompt, starting from your agent of choice,

00:35:43.670 --> 00:35:46.420
<v Trevor Manz>say, start a Marimo notebook using the Marimo pair skill.

00:35:47.000 --> 00:35:53.500
<v Trevor Manz>And then everything needed to actually start you pairing with Marimo

00:35:53.710 --> 00:35:55.400
<v Trevor Manz>is baked into that skill.

00:35:55.490 --> 00:35:57.360
<v Trevor Manz>So after you've run that uvx command,

00:35:57.970 --> 00:36:00.220
<v Trevor Manz>you should be able to spin up a notebook

00:36:00.590 --> 00:36:01.740
<v Trevor Manz>and then connect to it with your agent

00:36:01.850 --> 00:36:03.200
<v Trevor Manz>and just start talking about some data

00:36:03.430 --> 00:36:05.300
<v Trevor Manz>or talking about a notebook that you already have.

00:36:05.780 --> 00:36:08.839
<v Michael Kennedy>I guess, what are some of the use cases or whatever

00:36:09.320 --> 00:36:10.560
<v Michael Kennedy>that you might go through with this.

00:36:11.680 --> 00:36:13.020
<v Michael Kennedy>How do you find it to be useful?

00:36:13.060 --> 00:36:14.080
<v Michael Kennedy>What are you all doing with it?

00:36:14.280 --> 00:36:17.440
<v Trevor Manz>Yeah, I'd say Marimo pair is increasingly the main way

00:36:17.560 --> 00:36:20.740
<v Trevor Manz>that our users that prefer to author code with agents

00:36:20.900 --> 00:36:23.740
<v Trevor Manz>are starting to create and share Marimo notebooks.

00:36:24.480 --> 00:36:27.100
<v Trevor Manz>And so I think there are a lot of different use cases,

00:36:27.220 --> 00:36:28.280
<v Trevor Manz>but the way I like to think of it

00:36:28.420 --> 00:36:31.300
<v Trevor Manz>is that it really ranges from a more hands-on

00:36:31.420 --> 00:36:33.520
<v Trevor Manz>versus hands-off approach to authoring notebooks.

00:36:33.820 --> 00:36:37.400
<v Trevor Manz>So a more hands-on approach would be the workflow

00:36:37.420 --> 00:36:41.520
<v Trevor Manz>that I just described where you spin up a notebook session, maybe you have a data set and you want to

00:36:41.520 --> 00:36:49.360
<v Trevor Manz>be hands-on looking at that data, making plots, more exploratory data analysis or more iterative

00:36:49.520 --> 00:36:53.100
<v Trevor Manz>where you're hands-on working with the agent. But rather than writing the code, you're sort of

00:36:53.280 --> 00:36:56.560
<v Trevor Manz>prompting the code with the agent and looking at the outputs and deciding where to go next.

00:36:56.980 --> 00:37:01.420
<v Trevor Manz>So that's more on the head, the interactive or hands-on approach. And then we also have a set

00:37:01.420 --> 00:37:07.380
<v Trevor Manz>of users that are driving Marimo, using Marimo pair and a more headless version as well, where

00:37:07.380 --> 00:37:10.240
<v Trevor Manz>they might spin off many different Marimo pair sessions

00:37:10.450 --> 00:37:11.520
<v Trevor Manz>to work on a similar problem.

00:37:12.150 --> 00:37:14.220
<v Trevor Manz>And at the end, they'll have these notebooks that are running

00:37:14.380 --> 00:37:16.400
<v Trevor Manz>that then they can connect to and sort of check and see

00:37:16.400 --> 00:37:18.580
<v Trevor Manz>what the agent was working on inside of that session.

00:37:19.020 --> 00:37:22.260
<v Trevor Manz>So essentially, when you want to start a task with data,

00:37:22.410 --> 00:37:24.620
<v Trevor Manz>you can open up your agent and spin up Marimo

00:37:24.810 --> 00:37:28.180
<v Trevor Manz>and then start prompting towards working on that problem.

00:37:28.600 --> 00:37:29.140
<v Michael Kennedy>I see.

00:37:29.280 --> 00:37:32.480
<v Michael Kennedy>So maybe this headless story, like I have this data

00:37:32.890 --> 00:37:35.380
<v Michael Kennedy>and I know I want some kind of description,

00:37:36.180 --> 00:37:41.300
<v Michael Kennedy>exploration summary of it. So, Hey, Claude, just create a notebook and just from scratch,

00:37:41.610 --> 00:37:44.820
<v Michael Kennedy>just do what you want to do to build it up. And then I'll go look at it. Right.

00:37:45.220 --> 00:37:49.640
<v Michael Kennedy>Yeah. And the other ones may be more like a coding, like a data coding sort of story. Yeah,

00:37:50.000 --> 00:37:54.760
<v Trevor Manz>exactly. Yeah. And the, I think the nuance there of like why the more headless approach

00:37:55.260 --> 00:37:59.980
<v Trevor Manz>like works quite well with Mareem L'Apair is that if, if you've had any experience with trying to

00:38:00.040 --> 00:38:05.540
<v Trevor Manz>like one shot a program or one shot a notebook in the past, the agent doesn't really have a way of

00:38:05.480 --> 00:38:10.640
<v Trevor Manz>verifying what it's doing or that like that whole notebook that it created works well or maybe just

00:38:10.800 --> 00:38:14.300
<v Trevor Manz>at the end can like try to run the notebook and then we'll have to go back and fix cell by cell

00:38:14.680 --> 00:38:19.840
<v Trevor Manz>versus marimo pair driving from marimo pair sort of forces the agent to build up the notebooks a

00:38:20.040 --> 00:38:23.560
<v Trevor Manz>similar way that you would where you would actually go cell by cell so the first thing i have to do is

00:38:23.620 --> 00:38:28.460
<v Trevor Manz>like load my data the second thing i have to do is you know inspect look at my nulls and if there

00:38:28.470 --> 00:38:32.619
<v Trevor Manz>are errors in any of those steps the agent will correct them there rather than sort of generating

00:38:32.640 --> 00:38:36.440
<v Trevor Manz>the whole notebook and then running it from scratch. And so we found that you get much

00:38:36.910 --> 00:38:41.460
<v Trevor Manz>higher quality outputs when you are actually at the time of looking at the notebook, because

00:38:41.880 --> 00:38:46.400
<v Trevor Manz>the process in which the agent had to go to create the notebook sort of guarantees that it has to run

00:38:46.660 --> 00:38:51.520
<v Trevor Manz>because it adheres to the Marimo's constraints versus just generating the artifact and then

00:38:51.570 --> 00:38:56.020
<v Trevor Manz>saying like, hey, I'm done and didn't really check the outputs at all. Right, exactly. It just could

00:38:56.040 --> 00:38:59.580
<v Michael Kennedy>be some well-formed but meaningless notebook, right?

00:38:59.920 --> 00:39:00.000
<v Michael Kennedy>Yeah.

00:39:00.500 --> 00:39:04.860
<v Michael Kennedy>What if I'm now we're, we're pushing up to the limits of my Marimo knowledge.

00:39:05.200 --> 00:39:09.060
<v Michael Kennedy>Cause I've not tried this, but what if I got a Marimo notebook and I say, open

00:39:09.220 --> 00:39:14.460
<v Michael Kennedy>up that project and VS Code, like for example, maybe I have a regular

00:39:14.720 --> 00:39:20.160
<v Michael Kennedy>programming project that's VS Code that has the Claude Code installed in it, like

00:39:20.160 --> 00:39:20.960
<v Michael Kennedy>the extension or whatever.

00:39:21.460 --> 00:39:24.420
<v Michael Kennedy>And inside there, part of it is a Marimo notebook.

00:39:25.420 --> 00:39:28.500
<v Michael Kennedy>Can I say open up that notebook in Marimo,

00:39:28.760 --> 00:39:31.360
<v Michael Kennedy>but then also have Marimo pair,

00:39:31.680 --> 00:39:33.380
<v Michael Kennedy>but from within the VS Code,

00:39:33.900 --> 00:39:34.420
<v Michael Kennedy>Claude Code,

00:39:34.500 --> 00:39:35.840
<v Michael Kennedy>or do I have got to go to the terminal?

00:39:36.460 --> 00:39:38.300
<v Michael Kennedy>What is this interoperability story?

00:39:38.640 --> 00:39:38.900
<v Trevor Manz>Sure.

00:39:39.640 --> 00:39:42.280
<v Trevor Manz>At Marimo, I'm responsible for our VS Code extension,

00:39:42.840 --> 00:39:44.080
<v Trevor Manz>which is integrated.

00:39:44.880 --> 00:39:46.680
<v Trevor Manz>If you've ever tried to open up a Jupyter notebook

00:39:46.860 --> 00:39:47.700
<v Trevor Manz>inside of VS Code,

00:39:48.320 --> 00:39:51.620
<v Trevor Manz>VS Code or Cursor have a built-in UI for notebooks.

00:39:52.140 --> 00:39:54.180
<v Trevor Manz>We have a built-in UI for notebooks

00:39:54.240 --> 00:39:57.860
<v Trevor Manz>that reuses that sort of the VS Code native view,

00:39:58.560 --> 00:39:59.980
<v Trevor Manz>except replacing with Maremo outputs.

00:40:00.920 --> 00:40:02.300
<v Trevor Manz>And the latest thing I've been working on

00:40:02.370 --> 00:40:05.700
<v Trevor Manz>is getting the ability to have your agent inside of VS Code

00:40:06.320 --> 00:40:08.080
<v Trevor Manz>drive those notebook outputs as well.

00:40:08.170 --> 00:40:09.400
<v Trevor Manz>So that's something we should ship

00:40:09.450 --> 00:40:10.880
<v Trevor Manz>in probably the next week or so.

00:40:11.080 --> 00:40:13.820
<v Michael Kennedy>And there's, of course, I guess because of economics

00:40:14.330 --> 00:40:16.420
<v Michael Kennedy>or lock-in or I don't know, whatever,

00:40:17.040 --> 00:40:19.020
<v Michael Kennedy>there's always, in all these editors,

00:40:19.960 --> 00:40:21.360
<v Michael Kennedy>yes, even in Cursor,

00:40:21.820 --> 00:40:25.420
<v Michael Kennedy>There are like first class built-in ways to do agents.

00:40:26.020 --> 00:40:29.480
<v Michael Kennedy>Say in VS Code, there's like the chat thing on the right.

00:40:29.620 --> 00:40:32.260
<v Michael Kennedy>Those I think is probably what they intend you to do.

00:40:32.720 --> 00:40:36.460
<v Michael Kennedy>But then you can get the VS Code Claude or Codex extension,

00:40:37.200 --> 00:40:40.300
<v Michael Kennedy>which is a totally different UI, but still in VS Code.

00:40:40.680 --> 00:40:45.080
<v Michael Kennedy>Or you could go to the terminal and you could type Claude or Codex.

00:40:45.500 --> 00:40:50.000
<v Michael Kennedy>And that's a third sort of thing, which can sort of have links back in there.

00:40:50.560 --> 00:40:51.960
<v Michael Kennedy>Do some of these work and some of them don't?

00:40:51.960 --> 00:40:52.780
<v Michael Kennedy>Are they all the same?

00:40:53.240 --> 00:40:53.800
<v Michael Kennedy>What's the story?

00:40:54.120 --> 00:40:56.400
<v Trevor Manz>Yeah, so if you're launching from the terminal

00:40:56.840 --> 00:40:58.620
<v Trevor Manz>or the integrated VS Code,

00:40:59.220 --> 00:41:02.980
<v Trevor Manz>sorry, the Claude Code extension from VS Code today,

00:41:04.000 --> 00:41:06.920
<v Trevor Manz>that will likely start Marimo's command line tool

00:41:07.160 --> 00:41:09.440
<v Trevor Manz>and then open up a web view inside of VS Code,

00:41:09.500 --> 00:41:11.360
<v Trevor Manz>which is like our Marimo editor.

00:41:11.780 --> 00:41:12.900
<v Trevor Manz>If you use the chat,

00:41:13.140 --> 00:41:16.460
<v Trevor Manz>which is sort of the built-in agents panel inside of VS Code,

00:41:16.700 --> 00:41:19.660
<v Trevor Manz>that would drive the usage of the more integrated view

00:41:19.760 --> 00:41:20.800
<v Trevor Manz>inside of VS Code.

00:41:22.300 --> 00:41:25.100
<v Michael Kennedy>But all three are possible, I guess, yeah?

00:41:25.400 --> 00:41:26.100
<v Trevor Manz>Yeah, exactly.

00:41:26.650 --> 00:41:28.060
<v Trevor Manz>You can start a Marimo pair session

00:41:28.290 --> 00:41:30.180
<v Trevor Manz>from any of those panels.

00:41:30.700 --> 00:41:32.780
<v Trevor Manz>It's just a matter of what the visual

00:41:32.890 --> 00:41:34.020
<v Trevor Manz>that you're looking at is,

00:41:34.070 --> 00:41:37.160
<v Trevor Manz>if that's going to be the native VS Code editor

00:41:37.330 --> 00:41:42.660
<v Trevor Manz>for the notebook versus a web view

00:41:42.880 --> 00:41:44.180
<v Trevor Manz>of the Marimo notebook UI.

00:41:44.540 --> 00:41:48.380
<v Michael Kennedy>Yeah, and my sort of huff at this before was like,

00:41:48.620 --> 00:41:56.560
<v Michael Kennedy>This is only here because Claude Code won't allow you to use your subscription in the other one.

00:41:56.740 --> 00:41:59.600
<v Michael Kennedy>It's got to be, you know, in certain circumstances, right?

00:41:59.800 --> 00:42:03.260
<v Michael Kennedy>Like, oh, if you use the official extension, you can use your subscription.

00:42:03.730 --> 00:42:10.280
<v Michael Kennedy>But if you use this other way, then you've like, say in Cursor, you use your Cursor credits, not your Claude Code subscription.

00:42:10.660 --> 00:42:23.940
<v Michael Kennedy>And then PyCharm, you've got the sort of duality as well, where if you use the AI chat section that uses your JetBrains AI credits, whereas like if you use the terminal, it's clawed and just it's kind of a mess, honestly.

00:42:24.320 --> 00:42:34.360
<v Trevor Manz>Yeah, I think there's a lot of fragmentation in the ability to, and who owns that interface for where you're typing into that box and driving these tools.

00:42:34.920 --> 00:42:42.960
<v Trevor Manz>And so from our perspective, we think there will likely be a continued amount of drift between these different tools.

00:42:43.220 --> 00:42:48.820
<v Trevor Manz>And we don't necessarily want Marimo to be a tool that people are kind of deciding whether or not they're going to use our chat bar.

00:42:48.960 --> 00:42:53.420
<v Trevor Manz>but we do think Marimo as an environment for working with your data should be accessible from

00:42:53.590 --> 00:42:58.440
<v Trevor Manz>whatever tool that you choose. And so on our side, we just want to make sure that you're able to

00:42:58.490 --> 00:43:02.700
<v Trevor Manz>connect to and drive a Marimo notebook from your agent harness and tool of choice.

00:43:03.060 --> 00:43:11.500
<v Michael Kennedy>I think in maybe some kind of idealistic, non-realistic world where all the frontier

00:43:12.020 --> 00:43:16.240
<v Michael Kennedy>foundation coding models, you could just tell it your subscription or tell it whatever,

00:43:16.400 --> 00:43:17.880
<v Michael Kennedy>and it's the same billing everywhere,

00:43:18.420 --> 00:43:21.980
<v Michael Kennedy>it might be better to have some kind of built-in panel

00:43:22.170 --> 00:43:24.560
<v Michael Kennedy>into Marimo or little pop-ups or something.

00:43:25.060 --> 00:43:27.840
<v Michael Kennedy>But given all the weird restrictions and stuff,

00:43:28.220 --> 00:43:29.720
<v Michael Kennedy>it seems like a really good plan

00:43:29.730 --> 00:43:33.340
<v Michael Kennedy>to just have Marimo good at talking to any agent

00:43:33.660 --> 00:43:36.360
<v Michael Kennedy>through this way and however people want to run it,

00:43:36.660 --> 00:43:37.660
<v Michael Kennedy>they can just talk to it, right?

00:43:37.920 --> 00:43:38.220
<v Trevor Manz>Yeah.

00:43:39.740 --> 00:43:42.340
<v Trevor Manz>It's been challenging because we spend a lot of time

00:43:42.640 --> 00:43:44.120
<v Trevor Manz>on that UI and thinking about that UI

00:43:44.470 --> 00:43:46.360
<v Trevor Manz>that we own inside of Marimo

00:43:46.380 --> 00:43:47.960
<v Trevor Manz>how this should work with these agents.

00:43:48.780 --> 00:43:50.580
<v Trevor Manz>But the reality is that there's a lot of friction.

00:43:51.220 --> 00:43:53.180
<v Trevor Manz>And if we would have tried to build around

00:43:53.940 --> 00:43:54.920
<v Trevor Manz>Claude Max like a year ago,

00:43:55.160 --> 00:43:56.660
<v Trevor Manz>that would have been a lot of wasted effort

00:43:56.820 --> 00:43:59.020
<v Trevor Manz>because of the way that these platforms are changing.

00:43:59.940 --> 00:44:02.480
<v Trevor Manz>So as these tools become increasingly sticky

00:44:02.560 --> 00:44:05.240
<v Trevor Manz>and folks get entrenched into their agents of choice,

00:44:05.720 --> 00:44:07.160
<v Trevor Manz>I think from our perspective,

00:44:08.240 --> 00:44:10.700
<v Trevor Manz>making sure Marimo remains a useful tool

00:44:11.240 --> 00:44:13.300
<v Trevor Manz>to any agent is really our priority.

00:44:13.560 --> 00:44:15.660
<v Trevor Manz>And if there is some sort of...

00:44:15.720 --> 00:44:20.920
<v Trevor Manz>yeah, future day where we can own that UI again, then I think we will certainly have a story there.

00:44:21.240 --> 00:44:26.800
<v Michael Kennedy>Yeah, I think I totally agree with you, but I want to share a little graph with you from the

00:44:26.940 --> 00:44:32.520
<v Michael Kennedy>Pragmatic Engineer newsletter. Yeah, I guess newsletter. So if you, there's this one that was

00:44:32.770 --> 00:44:38.920
<v Michael Kennedy>AI tooling for software engineers in 2026. So you scroll down till we see a graph. There we go.

00:44:38.980 --> 00:44:43.980
<v Michael Kennedy>If you look at what people are using, it's Claude Code.

00:44:44.380 --> 00:44:52.620
<v Michael Kennedy>And then quite a ways back, we get Google Copilot, which I think is really, I don't know, maybe I live in some kind of sheltered world.

00:44:52.720 --> 00:45:01.500
<v Michael Kennedy>But I feel like this is primarily used because companies have Microsoft 365 subscriptions and they've got 10,000 employees.

00:45:01.540 --> 00:45:03.740
<v Michael Kennedy>And they're like, you can use Copilot because it's approved.

00:45:04.020 --> 00:45:08.080
<v Michael Kennedy>I don't know that that's necessarily what people are seeking out as their top choice.

00:45:08.560 --> 00:45:09.300
<v Michael Kennedy>I don't know, I could be wrong.

00:45:09.440 --> 00:45:11.460
<v Michael Kennedy>Sorry if I got that wrong, Copilot folks.

00:45:11.640 --> 00:45:14.200
<v Michael Kennedy>But, and then maybe about half is Cursor

00:45:14.500 --> 00:45:16.460
<v Michael Kennedy>and that's kind of its own world and then it goes Codex.

00:45:16.620 --> 00:45:18.560
<v Michael Kennedy>So like, I feel like if you're trying to,

00:45:19.200 --> 00:45:21.960
<v Michael Kennedy>this is like Claude Code was way behind a year ago.

00:45:22.320 --> 00:45:23.340
<v Michael Kennedy>It's crazy.

00:45:23.560 --> 00:45:26.000
<v Michael Kennedy>So I feel like if you're building a tool,

00:45:26.240 --> 00:45:28.420
<v Michael Kennedy>especially for developers that says,

00:45:28.860 --> 00:45:30.400
<v Michael Kennedy>let's pretend you don't want this.

00:45:30.960 --> 00:45:33.860
<v Michael Kennedy>Let us give you our version of something that's like it.

00:45:34.180 --> 00:45:35.840
<v Michael Kennedy>I just don't think that that's a road for success.

00:45:36.220 --> 00:45:37.880
<v Michael Kennedy>I think you're fighting against like,

00:45:38.020 --> 00:45:42.060
<v Michael Kennedy>everyone's like, you know what, we're in Claude Code and it works really well. Why am I going to

00:45:42.080 --> 00:45:46.300
<v Michael Kennedy>go put that away and use your thing? As opposed to what you guys built, which is like, well, here's

00:45:46.300 --> 00:45:51.900
<v Michael Kennedy>how you use the top three of those things to talk to what you're already doing. I think that's a good

00:45:52.020 --> 00:45:58.520
<v Trevor Manz>choice. Yeah, I think for us, it was the realization that the effectiveness of agents on a particular

00:45:58.760 --> 00:46:03.859
<v Trevor Manz>task is a combination of like, I think an agent is by definition is like a model, the tools that you

00:46:03.780 --> 00:46:09.320
<v Trevor Manz>equip that model with and then its environment or the loop that it runs in to perform that task.

00:46:09.800 --> 00:46:13.620
<v Trevor Manz>And so its effectiveness is going to be limited by whatever tools you give that agent.

00:46:13.970 --> 00:46:18.540
<v Trevor Manz>And so if we didn't make Marimo a useful tool for the agent, then if you give a data problem

00:46:18.610 --> 00:46:22.240
<v Trevor Manz>to the agents, it's going to use the tools that it has at hand, which are reading and writing files

00:46:22.290 --> 00:46:26.040
<v Trevor Manz>and running bash scripts. If you run that script a bunch of times or you ask the same data question

00:46:26.340 --> 00:46:30.260
<v Trevor Manz>using those tools, you might get a folder with a lot of different scripts and things and maybe a

00:46:30.280 --> 00:46:35.440
<v Trevor Manz>result. And so by giving agents, or really thinking of Marimo as a tool for agents,

00:46:36.420 --> 00:46:40.120
<v Trevor Manz>then we don't have to think so much about the interface for the agent, but rather just how to

00:46:40.240 --> 00:46:44.620
<v Trevor Manz>expose our environment to agents. And then when you ask for those data tasks, the thing that you

00:46:44.940 --> 00:46:49.440
<v Trevor Manz>generate at the end is this reproducible Python program that is a Marimo notebook, but you can

00:46:49.520 --> 00:46:54.920
<v Trevor Manz>drive that for many of these UIs of choice. And I look at these bars here, there's going to be

00:46:55.100 --> 00:47:00.240
<v Trevor Manz>jumping back and forth between these, depending on what the providers dictate in terms of their

00:47:01.300 --> 00:47:04.040
<v Michael Kennedy>Who gets blocked by the US government, who doesn't?

00:47:04.640 --> 00:47:04.880
<v Trevor Manz>Exactly.

00:47:05.740 --> 00:47:09.920
<v Trevor Manz>For us at Marimo, as long as we can make sure that regardless of what agent you use,

00:47:09.950 --> 00:47:12.220
<v Trevor Manz>you will have notebooks as a useful tool.

00:47:13.300 --> 00:47:15.920
<v Trevor Manz>Then at the end of the day, you're still just generating Marimo notebooks.

00:47:16.200 --> 00:47:19.420
<v Trevor Manz>Even if you turn off your agent, you have this reproducible artifact

00:47:19.670 --> 00:47:22.020
<v Trevor Manz>that is useful for communicating your data results

00:47:22.110 --> 00:47:24.700
<v Trevor Manz>or something about what happened in that session while you're working with data.

00:47:26.260 --> 00:47:27.320
<v Trevor Manz>That's our goal at Marimo,

00:47:27.520 --> 00:47:30.900
<v Trevor Manz>to make sure that whether you knew how to write Python code

00:47:30.930 --> 00:47:32.280
<v Trevor Manz>or you don't know how to write Python code,

00:47:32.610 --> 00:47:35.000
<v Trevor Manz>you're able to produce this reproducible artifact

00:47:35.550 --> 00:47:36.960
<v Trevor Manz>for your data analysis.

00:47:37.660 --> 00:47:38.060
<v Michael Kennedy>Okay.

00:47:38.530 --> 00:47:41.660
<v Michael Kennedy>You also talked about open code AI.

00:47:42.820 --> 00:47:44.620
<v Michael Kennedy>This is somewhat new to me.

00:47:44.630 --> 00:47:46.200
<v Michael Kennedy>What is this open code thing?

00:47:46.650 --> 00:47:48.000
<v Trevor Manz>Yeah, so open code is similar.

00:47:48.580 --> 00:47:51.460
<v Trevor Manz>I think Claude Code had the first form factor

00:47:51.570 --> 00:47:54.740
<v Trevor Manz>of being one of these terminal CLIs that you spin up.

00:47:54.960 --> 00:47:57.540
<v Trevor Manz>but just with the Anthropic models.

00:47:58.060 --> 00:48:00.700
<v Trevor Manz>And then OpenCode is a similar,

00:48:00.940 --> 00:48:03.300
<v Trevor Manz>like it feels very similar to using Claude Code,

00:48:03.700 --> 00:48:05.800
<v Trevor Manz>but it allows you to configure a lot of different models

00:48:05.940 --> 00:48:09.140
<v Trevor Manz>that have the ability to configure API endpoints.

00:48:09.680 --> 00:48:10.820
<v Trevor Manz>So for a while,

00:48:11.640 --> 00:48:14.660
<v Trevor Manz>I believe you can still configure all the different providers.

00:48:15.020 --> 00:48:18.080
<v Trevor Manz>It's just like the type of subscription models

00:48:18.080 --> 00:48:20.080
<v Trevor Manz>that you can use with OpenCode change quite a bit,

00:48:20.220 --> 00:48:24.580
<v Trevor Manz>similar to what you were just mentioning inside of VS Code.

00:48:24.940 --> 00:48:30.400
<v Michael Kennedy>Yeah, for example, it looks like you can use your Codex subscription, but not your Claude subscription.

00:48:31.680 --> 00:48:32.620
<v Trevor Manz>Yeah, exactly.

00:48:32.840 --> 00:48:38.940
<v Trevor Manz>So it should have a very similar form factor to when you type in Claude and you pop up that thing inside of your terminal.

00:48:39.480 --> 00:48:41.260
<v Trevor Manz>If you type in OpenCode, you'll get a window.

00:48:41.340 --> 00:48:42.260
<v Trevor Manz>You can start prompting.

00:48:43.040 --> 00:48:48.960
<v Trevor Manz>You can also install skills for OpenCode as well, the same way that you install for any of these harnesses.

00:48:50.740 --> 00:48:53.780
<v Trevor Manz>But we had some users that use OpenCode because of the open models.

00:48:53.900 --> 00:48:55.340
<v Trevor Manz>We have some users that are using Claude Code.

00:48:55.370 --> 00:48:57.680
<v Trevor Manz>We have some users that are using codex or VS Code.

00:48:58.120 --> 00:49:01.160
<v Trevor Manz>And like I mentioned, we just want to make sure that anyone can drive a Marimo notebook.

00:49:02.010 --> 00:49:07.680
<v Michael Kennedy>So it must be tough to be supporting AI stuff in this space, given how much flux it's under.

00:49:08.460 --> 00:49:14.220
<v Trevor Manz>Yeah, I think by inverting the problem in so far is that we are no longer like, you know,

00:49:14.320 --> 00:49:19.880
<v Trevor Manz>by moving some of this ability to drive Marimo outside of the Marimo UI, we don't have to

00:49:19.890 --> 00:49:22.720
<v Trevor Manz>keep up as much with all the fluctuation in the new models.

00:49:22.900 --> 00:49:31.500
<v Trevor Manz>And instead, the thing that we can focus on is the skill and making sure that that interface for controlling Marimo is really good from any agent of choice.

00:49:31.970 --> 00:49:46.380
<v Trevor Manz>And then as these different UIs compete for sort of where the users are going to be in terms of driving their agents, again, we can just sort of sit there with Marimo and just make sure Marimo is a really good tool for any of these agents.

00:49:46.780 --> 00:49:47.820
<v Michael Kennedy>Sure, sure, sure.

00:49:48.160 --> 00:49:52.900
<v Michael Kennedy>So having this, how does this change how people use notebooks?

00:49:53.540 --> 00:49:54.820
<v Michael Kennedy>I know how it's changed coding.

00:49:55.100 --> 00:49:57.760
<v Michael Kennedy>It's changed it quite a bit in some ways and not at all in others.

00:49:58.080 --> 00:49:59.020
<v Michael Kennedy>But how about for data?

00:49:59.380 --> 00:50:00.220
<v Trevor Manz>That's a really good question.

00:50:00.540 --> 00:50:05.420
<v Trevor Manz>So I mentioned earlier that part of the value of these environments

00:50:05.780 --> 00:50:08.220
<v Trevor Manz>like a Marimo notebook or like a Jupyter or Excel

00:50:08.780 --> 00:50:10.420
<v Trevor Manz>is the statefulness of those environments.

00:50:10.620 --> 00:50:12.960
<v Trevor Manz>And so it's really like there's a lot of, you know,

00:50:13.920 --> 00:50:15.020
<v Trevor Manz>when you're using an agent,

00:50:15.560 --> 00:50:18.960
<v Trevor Manz>it's able to gather things and put it from your file system

00:50:19.010 --> 00:50:21.540
<v Trevor Manz>to bring that into context or from the web

00:50:21.870 --> 00:50:23.460
<v Trevor Manz>to be able to, when you ask a prompt,

00:50:24.200 --> 00:50:26.420
<v Trevor Manz>perform a task that hopefully fulfills that

00:50:26.750 --> 00:50:28.020
<v Trevor Manz>to some sufficient level.

00:50:28.500 --> 00:50:31.400
<v Trevor Manz>And prior to having an integration like Marimo pair,

00:50:31.900 --> 00:50:33.940
<v Trevor Manz>that statefulness could be,

00:50:34.500 --> 00:50:36.120
<v Trevor Manz>basically the values that are in memory

00:50:36.460 --> 00:50:38.760
<v Trevor Manz>could be extra context to helping the agent

00:50:40.800 --> 00:50:41.680
<v Trevor Manz>answer some question,

00:50:42.030 --> 00:50:43.800
<v Trevor Manz>but you'd sort of have to babysit the model

00:50:43.800 --> 00:50:45.680
<v Trevor Manz>or tell it something like, oh, I copied this output,

00:50:45.920 --> 00:50:46.380
<v Trevor Manz>here's the output.

00:50:46.760 --> 00:50:48.900
<v Trevor Manz>And now when you say, what's in this data frame,

00:50:49.200 --> 00:50:51.100
<v Trevor Manz>it can look at those columns for you.

00:50:51.460 --> 00:50:55.840
<v Trevor Manz>Or for example, if I'm doing something like EDA type of analysis

00:50:56.120 --> 00:50:59.400
<v Trevor Manz>inside of Marimo, I can circle on a plot and make a selection.

00:50:59.720 --> 00:51:01.600
<v Trevor Manz>And I can say, what did I just select here?

00:51:01.900 --> 00:51:05.020
<v Trevor Manz>And the agent can go take that indice selection that I made,

00:51:05.080 --> 00:51:06.160
<v Trevor Manz>compare it against the data frame,

00:51:06.340 --> 00:51:07.700
<v Trevor Manz>and come back to me with some answer.

00:51:07.940 --> 00:51:11.780
<v Trevor Manz>So I think these types of questions that maybe felt tedious

00:51:11.780 --> 00:51:16.480
<v Trevor Manz>to ask before, like, because you'd have to type out a lot of code to do that.

00:51:16.800 --> 00:51:20.640
<v Trevor Manz>Now you can really either use the agent to help you write code or actually ask you questions

00:51:20.830 --> 00:51:22.120
<v Trevor Manz>about the state inside that notebook.

00:51:22.610 --> 00:51:26.900
<v Trevor Manz>And you're really extending the agent's, you know, environment with the intermediate values

00:51:27.220 --> 00:51:29.020
<v Trevor Manz>that, you know, as a human might find interesting.

00:51:29.540 --> 00:51:31.940
<v Trevor Manz>But now the agent can also use that as potential context.

00:51:32.340 --> 00:51:35.240
<v Michael Kennedy>One of the things I think is super useful.

00:51:35.640 --> 00:51:40.840
<v Michael Kennedy>A lot of times I feel like people maybe miss this and maybe, maybe more people than I realize

00:51:40.860 --> 00:51:46.500
<v Michael Kennedy>know about it, but in VS Code or PyCharm or cursor, I think cursor might be best as I'm not

00:51:46.600 --> 00:51:52.640
<v Michael Kennedy>entirely sure these days, but anyway, if I've got a file, maybe I've got hundreds of files in my

00:51:52.750 --> 00:51:57.340
<v Michael Kennedy>project, but a particular file I'm interested in, if I have that file open and I ask questions,

00:51:57.800 --> 00:52:02.920
<v Michael Kennedy>it's automatically included as context, just by virtue of having it be the last focused file.

00:52:03.420 --> 00:52:08.300
<v Michael Kennedy>But even better is you can highlight parts of a line or three lines or whatever and go,

00:52:08.700 --> 00:52:09.880
<v Michael Kennedy>what's wrong with this?

00:52:10.240 --> 00:52:11.120
<v Michael Kennedy>It's all you got to say.

00:52:11.240 --> 00:52:12.760
<v Michael Kennedy>And it goes, oh yeah, I see the function

00:52:12.910 --> 00:52:13.560
<v Michael Kennedy>that you're talking about,

00:52:13.660 --> 00:52:14.720
<v Michael Kennedy>the part that you've highlighted,

00:52:14.810 --> 00:52:16.100
<v Michael Kennedy>like boom, off it goes.

00:52:16.460 --> 00:52:17.560
<v Michael Kennedy>Is there some mechanism?

00:52:17.740 --> 00:52:19.300
<v Michael Kennedy>It sounds a little bit like there is,

00:52:19.440 --> 00:52:20.860
<v Michael Kennedy>but is there a mechanism in Marimo

00:52:21.080 --> 00:52:24.140
<v Michael Kennedy>that it communicates back what's active,

00:52:24.440 --> 00:52:25.100
<v Michael Kennedy>what you're working with?

00:52:25.240 --> 00:52:27.260
<v Trevor Manz>Yeah, so we have, you know,

00:52:27.300 --> 00:52:28.780
<v Trevor Manz>as the agent is running things,

00:52:28.910 --> 00:52:30.680
<v Trevor Manz>we can communicate, you know,

00:52:30.760 --> 00:52:31.740
<v Trevor Manz>what cells have changed

00:52:31.960 --> 00:52:33.420
<v Trevor Manz>or like if there are values

00:52:33.620 --> 00:52:34.380
<v Trevor Manz>that have changed in the notebook

00:52:34.510 --> 00:52:36.440
<v Trevor Manz>and then the agent can go and ask questions

00:52:36.680 --> 00:52:37.780
<v Trevor Manz>about those things that have changed.

00:52:38.140 --> 00:52:41.560
<v Trevor Manz>We have some folks in our team that are working on creating these sort of,

00:52:41.840 --> 00:52:43.000
<v Trevor Manz>like I think to what you're mentioning,

00:52:43.420 --> 00:52:46.180
<v Trevor Manz>imagine you highlight a line of code and you want to feed that back

00:52:46.220 --> 00:52:48.440
<v Trevor Manz>as potential context of here's where I'm focusing.

00:52:49.340 --> 00:52:52.960
<v Trevor Manz>Inside of a notebook, if you're using actually the integrated browser

00:52:53.360 --> 00:52:56.960
<v Trevor Manz>inside a VS Code or cursor, you can actually click on a plot

00:52:57.380 --> 00:52:59.460
<v Trevor Manz>and it'll take that screenshot and it'll add it as context

00:53:00.080 --> 00:53:00.960
<v Trevor Manz>to what you're going to ask.

00:53:01.340 --> 00:53:04.340
<v Trevor Manz>And so now you're having this interaction where it's not just the values

00:53:04.520 --> 00:53:07.220
<v Trevor Manz>but also the outputs and the visual outputs that you can say,

00:53:07.400 --> 00:53:08.500
<v Trevor Manz>hey, this is a little bit weird.

00:53:08.730 --> 00:53:09.860
<v Trevor Manz>I see this, this, and this.

00:53:10.200 --> 00:53:11.700
<v Trevor Manz>So we're definitely thinking that direction

00:53:11.960 --> 00:53:13.580
<v Trevor Manz>where, yeah, it's not just the line of code,

00:53:13.680 --> 00:53:15.240
<v Trevor Manz>but the value of the code

00:53:15.240 --> 00:53:16.620
<v Trevor Manz>and the representation of the code

00:53:16.760 --> 00:53:17.640
<v Trevor Manz>that could actually feed back

00:53:17.760 --> 00:53:18.840
<v Trevor Manz>to these multimodal models

00:53:18.970 --> 00:53:21.180
<v Trevor Manz>and help you sort of come to better understanding

00:53:21.400 --> 00:53:22.060
<v Trevor Manz>quickly with your data.

00:53:22.460 --> 00:53:23.100
<v Michael Kennedy>Yeah, awesome.

00:53:23.330 --> 00:53:23.680
<v Michael Kennedy>I love it.

00:53:24.280 --> 00:53:25.840
<v Michael Kennedy>It's so nice because instead of trying

00:53:26.060 --> 00:53:26.760
<v Michael Kennedy>to just like describe,

00:53:26.970 --> 00:53:29.200
<v Michael Kennedy>okay, and the third function called this,

00:53:29.640 --> 00:53:31.060
<v Michael Kennedy>there's a part where there's an if,

00:53:31.210 --> 00:53:33.520
<v Michael Kennedy>you know, just like highlight and go this, right?

00:53:33.680 --> 00:53:34.060
<v Michael Kennedy>It's great.

00:53:34.360 --> 00:53:34.540
<v Trevor Manz>Exactly.

00:53:35.000 --> 00:53:36.519
<v Trevor Manz>There's a certain level of interactions

00:53:36.520 --> 00:53:38.320
<v Trevor Manz>or feeding back of...

00:53:38.580 --> 00:53:40.480
<v Trevor Manz>I think when I started to realize

00:53:40.680 --> 00:53:42.280
<v Trevor Manz>that these agents could be very powerful

00:53:42.540 --> 00:53:44.740
<v Trevor Manz>was when coding tasks started to feel a lot cheaper.

00:53:45.060 --> 00:53:46.920
<v Trevor Manz>Like maybe these what-if ideas

00:53:47.040 --> 00:53:48.480
<v Trevor Manz>of something I wanted to try with software,

00:53:48.920 --> 00:53:51.200
<v Trevor Manz>I could, rather than that taking up a whole weekend

00:53:51.600 --> 00:53:53.340
<v Trevor Manz>or several weeks to try out,

00:53:53.500 --> 00:53:55.180
<v Trevor Manz>it's like maybe an afternoon I could try that out.

00:53:55.320 --> 00:53:56.960
<v Trevor Manz>And I think the experience that we want to provide

00:53:57.040 --> 00:53:58.700
<v Trevor Manz>for our users inside of Marimo Notebooks

00:53:58.780 --> 00:54:00.980
<v Trevor Manz>is that these kind of what-if questions with your data

00:54:01.480 --> 00:54:03.000
<v Trevor Manz>also feel very cheap.

00:54:03.280 --> 00:54:04.100
<v Trevor Manz>So you say, what is that?

00:54:04.220 --> 00:54:11.260
<v Trevor Manz>And now that like starts a conversation or starts a new part of your analysis that, you know, you maybe would have had to be very convinced to go down that route before.

00:54:11.410 --> 00:54:15.340
<v Trevor Manz>And now you can just like start to ask those questions and hopefully get to insight more quickly.

00:54:15.720 --> 00:54:22.820
<v Michael Kennedy>I think another thing that that's really nice for is, you know, hat tip to the name here is like pair, like pair programming, right?

00:54:23.080 --> 00:54:27.660
<v Michael Kennedy>If you were actually paired programming, you could just highlight something on the screen and go, what do you think about this?

00:54:28.060 --> 00:54:32.940
<v Michael Kennedy>Right. Where's sort of the traditional, I don't know, Claude code just in the terminal.

00:54:33.400 --> 00:54:35.980
<v Michael Kennedy>You've got to describe it a lot, talk about the file, right?

00:54:36.240 --> 00:54:39.080
<v Michael Kennedy>Like you can't just have it sort of ambiently there.

00:54:40.260 --> 00:54:44.240
<v Michael Kennedy>And if you're sitting there working with these tools, these agentic tools all day,

00:54:45.020 --> 00:54:47.680
<v Michael Kennedy>especially if you're not doing a lot of programming with other people, like it's

00:54:47.840 --> 00:54:52.200
<v Michael Kennedy>primarily the, you're sort of coding partner, you know, your paired programmer or

00:54:52.320 --> 00:54:56.520
<v Michael Kennedy>whatever, the more you've kind of got to artificially step out and say, yeah,

00:54:56.720 --> 00:54:59.640
<v Michael Kennedy>over on this file at dah, dah, dah, dah, try to find the file.

00:54:59.760 --> 00:55:01.560
<v Michael Kennedy>And then you're talking about this, right?

00:55:01.640 --> 00:55:05.980
<v Michael Kennedy>It breaks this flow and this idea of this thing is here to help me.

00:55:06.020 --> 00:55:09.340
<v Michael Kennedy>It's like, I'm just sending stuff to this dumb machine

00:55:09.460 --> 00:55:10.880
<v Michael Kennedy>that can't really figure out what's going on.

00:55:11.520 --> 00:55:12.320
<v Michael Kennedy>So I really like it.

00:55:13.460 --> 00:55:14.720
<v Michael Kennedy>This concept you're talking about.

00:55:14.880 --> 00:55:18.100
<v Trevor Manz>I had this experience where I was actually trying to help my dad

00:55:18.160 --> 00:55:19.600
<v Trevor Manz>look at some data that he had in Excel.

00:55:20.820 --> 00:55:23.980
<v Trevor Manz>Notoriously, that's very annoying to load an Excel file in Python

00:55:24.100 --> 00:55:25.840
<v Trevor Manz>because you end up writing your own little parser

00:55:25.880 --> 00:55:27.960
<v Trevor Manz>to figure out the different subsets of the tables.

00:55:28.700 --> 00:55:31.620
<v Trevor Manz>At the end of the day, what I really wanted were a couple data frames

00:55:31.620 --> 00:55:37.080
<v Trevor Manz>plot inside of the notebook. And being able to just drag from my UI the Excel file over into

00:55:37.200 --> 00:55:41.220
<v Trevor Manz>Marimo pair and saying, hey, can you just load these three tables inside the notebook and let

00:55:41.380 --> 00:55:45.300
<v Trevor Manz>the agent chug away in the notebook at trying to figure out how to create those plots for me?

00:55:46.200 --> 00:55:50.140
<v Trevor Manz>Maybe that would have taken me an hour to do on my hand from before. And it took a couple minutes

00:55:50.280 --> 00:55:54.240
<v Trevor Manz>for the agent or maybe even a minute for the agent. And then I got to focus on the exciting

00:55:54.420 --> 00:55:58.620
<v Trevor Manz>part was how to make these plots and communicate something with the data. So automating those pieces

00:55:58.640 --> 00:56:02.160
<v Trevor Manz>that are very bespoke and kind of annoying of like, how do you get data formats into the notebook is

00:56:02.160 --> 00:56:07.040
<v Trevor Manz>now something you can sort of, you know, task the agent on for a little bit. Right. I'm not a fan of

00:56:07.160 --> 00:56:12.860
<v Michael Kennedy>vibe coding really, but I do think this provides really interesting onboard, like on ramps for

00:56:12.980 --> 00:56:18.920
<v Michael Kennedy>people to get into notebooks and programming and so on. Cause maybe they can ask decent questions

00:56:19.110 --> 00:56:23.400
<v Michael Kennedy>about data, but they can't necessarily go, okay, I'm going to get the pie X amount, the XML,

00:56:24.180 --> 00:56:28.460
<v Michael Kennedy>XLS writer or whatever it is. Right. As you can tell, I don't remember exactly the name of it.

00:56:28.520 --> 00:56:29.200
<v Michael Kennedy>So there you go.

00:56:29.500 --> 00:56:30.260
<v Michael Kennedy>All right, that kind of thing.

00:56:30.260 --> 00:56:32.340
<v Michael Kennedy>And just like load this up and then let's talk about it.

00:56:32.400 --> 00:56:33.620
<v Michael Kennedy>Like I know what a data frame is,

00:56:33.780 --> 00:56:37.540
<v Michael Kennedy>but I really need to know how to like select the third sheet in Excel.

00:56:38.300 --> 00:56:39.160
<v Michael Kennedy>Yes, exactly.

00:56:39.280 --> 00:56:41.820
<v Trevor Manz>Do I need to know that API to like get my tasks done

00:56:41.900 --> 00:56:43.220
<v Trevor Manz>with these data inside the notebook?

00:56:43.680 --> 00:56:46.760
<v Trevor Manz>And I think, you know, for in this context as well,

00:56:47.820 --> 00:56:49.460
<v Trevor Manz>because Marimo has this, you know,

00:56:49.700 --> 00:56:51.680
<v Trevor Manz>this deterministic execution order,

00:56:52.180 --> 00:56:54.660
<v Trevor Manz>you can sort of collaborate on building, you know,

00:56:54.860 --> 00:56:57.560
<v Trevor Manz>this like this reproducible like workflow

00:56:57.560 --> 00:56:58.940
<v Trevor Manz>of how you got to that notebook.

00:56:59.070 --> 00:57:01.520
<v Trevor Manz>So you can, instead of vibe coding the whole thing,

00:57:01.550 --> 00:57:03.900
<v Trevor Manz>you can maybe allow someone to kind of vibe code

00:57:03.910 --> 00:57:05.740
<v Trevor Manz>the first bit of how do we get the data into memory?

00:57:06.130 --> 00:57:07.720
<v Trevor Manz>And then the things that really require attention

00:57:07.870 --> 00:57:11.280
<v Trevor Manz>about cleaning up the data and plotting the data

00:57:11.600 --> 00:57:13.480
<v Trevor Manz>and running some modeling on that data,

00:57:14.280 --> 00:57:15.320
<v Trevor Manz>now you've sort of freed up your time

00:57:15.370 --> 00:57:16.760
<v Trevor Manz>to focus on those bits as well.

00:57:17.060 --> 00:57:18.060
<v Michael Kennedy>Yeah, 100%.

00:57:18.130 --> 00:57:20.200
<v Michael Kennedy>It lets you focus on the parts that actually matter,

00:57:20.760 --> 00:57:23.360
<v Michael Kennedy>not just silly file formats and stuff like that, right?

00:57:23.620 --> 00:57:23.760
<v Trevor Manz>Yeah.

00:57:24.230 --> 00:57:26.380
<v Trevor Manz>And we're lucky because Python's such a Swiss army knife

00:57:26.380 --> 00:57:28.540
<v Trevor Manz>to all that has such a rich ecosystem

00:57:28.630 --> 00:57:30.440
<v Trevor Manz>of ingesting data and working with data

00:57:31.080 --> 00:57:34.820
<v Trevor Manz>that you can lean on that ecosystem

00:57:35.120 --> 00:57:36.800
<v Trevor Manz>plus the agent inside of the notebook

00:57:37.160 --> 00:57:39.000
<v Trevor Manz>to get your data into a format that is useful.

00:57:39.390 --> 00:57:41.860
<v Trevor Manz>But then that's the point that you step in

00:57:41.860 --> 00:57:43.720
<v Trevor Manz>and start to direct more about what direction

00:57:43.720 --> 00:57:44.680
<v Trevor Manz>you want to take that analysis.

00:57:45.100 --> 00:57:45.540
<v Michael Kennedy>Totally.

00:57:45.990 --> 00:57:47.740
<v Michael Kennedy>So a couple of final questions

00:57:48.040 --> 00:57:49.460
<v Michael Kennedy>to wrap up our conversation here.

00:57:49.760 --> 00:57:51.820
<v Michael Kennedy>Tips and tricks for people like,

00:57:52.070 --> 00:57:53.760
<v Michael Kennedy>okay, you've got the skill, you've got Marimo.

00:57:54.460 --> 00:57:57.880
<v Michael Kennedy>Are there interesting things you've all discovered you can do

00:57:58.160 --> 00:57:59.300
<v Michael Kennedy>that maybe are non-obvious?

00:57:59.570 --> 00:58:00.200
<v Michael Kennedy>Tips and tricks.

00:58:00.850 --> 00:58:02.760
<v Trevor Manz>Honestly, my recommendation would be to,

00:58:02.910 --> 00:58:04.880
<v Trevor Manz>if there is some data set that you have in mind,

00:58:05.880 --> 00:58:08.360
<v Trevor Manz>like the example I mentioned with an Excel file,

00:58:08.760 --> 00:58:11.240
<v Trevor Manz>it's a very fun task to just drag in a data set and say,

00:58:11.380 --> 00:58:12.920
<v Trevor Manz>please load this for me inside the notebook

00:58:13.170 --> 00:58:15.200
<v Trevor Manz>and let's start making some plots or something.

00:58:15.680 --> 00:58:17.540
<v Trevor Manz>And I think very quickly you'll realize

00:58:18.240 --> 00:58:20.320
<v Trevor Manz>how quickly this runtime inspection

00:58:20.550 --> 00:58:23.000
<v Trevor Manz>really shapes this user experience

00:58:23.220 --> 00:58:25.600
<v Trevor Manz>where I think I went from being very hands-on

00:58:25.700 --> 00:58:26.400
<v Trevor Manz>with working in notebooks

00:58:26.600 --> 00:58:29.000
<v Trevor Manz>to being able to sit back a little bit more

00:58:29.000 --> 00:58:31.480
<v Trevor Manz>and think cell-by-cell about what I want to do.

00:58:31.880 --> 00:58:35.380
<v Trevor Manz>So I just encourage folks to try it out with their data

00:58:36.120 --> 00:58:37.580
<v Trevor Manz>and let us know what they run into.

00:58:37.860 --> 00:58:38.860
<v Michael Kennedy>Okay, yeah, that makes a lot of sense.

00:58:39.040 --> 00:58:41.000
<v Michael Kennedy>One thing that I've done before,

00:58:41.460 --> 00:58:42.280
<v Michael Kennedy>just playing around with data,

00:58:42.360 --> 00:58:43.920
<v Michael Kennedy>is I've asked Claude,

00:58:44.260 --> 00:58:46.780
<v Michael Kennedy>like, hey, here's the data, here's the scenario.

00:58:47.480 --> 00:58:49.600
<v Michael Kennedy>What are some interesting questions

00:58:49.840 --> 00:58:51.300
<v Michael Kennedy>we should be asking about it?

00:58:51.720 --> 00:58:54.540
<v Michael Kennedy>here's what I think is interesting, but what am I missing?

00:58:55.060 --> 00:58:58.120
<v Michael Kennedy>Are there trends in the data that I don't see that maybe you can pull out

00:58:58.120 --> 00:59:01.840
<v Michael Kennedy>and just kind of have it just cruise around and just think about it a little bit?

00:59:01.840 --> 00:59:03.060
<v Michael Kennedy>And it was really good.

00:59:03.200 --> 00:59:06.600
<v Trevor Manz>Yeah, and I think you can imagine extending that.

00:59:07.400 --> 00:59:10.340
<v Trevor Manz>Typically when you're maybe asking those questions back and forth with Claude,

00:59:10.440 --> 00:59:14.220
<v Trevor Manz>it's giving you some tables and numbers and distributions in the data.

00:59:14.780 --> 00:59:17.160
<v Trevor Manz>But because when you're connected to a Marimo kernel,

00:59:17.680 --> 00:59:20.700
<v Trevor Manz>now you can ask for plots or different visual representations

00:59:20.700 --> 00:59:22.240
<v Trevor Manz>that might be able to show those trends.

00:59:22.420 --> 00:59:24.080
<v Trevor Manz>So if the agent is telling you

00:59:24.110 --> 00:59:24.900
<v Trevor Manz>that there is this difference,

00:59:25.050 --> 00:59:26.400
<v Trevor Manz>you could say, hey, make a bar chart

00:59:26.510 --> 00:59:29.940
<v Trevor Manz>or a box plot for me to understand that information.

00:59:30.820 --> 00:59:32.760
<v Trevor Manz>Because you do just have this much richer canvas

00:59:33.380 --> 00:59:34.320
<v Trevor Manz>for talking about your data

00:59:34.590 --> 00:59:36.700
<v Trevor Manz>rather than just the ASCII output in your terminal.

00:59:37.040 --> 00:59:38.020
<v Michael Kennedy>Right, the first thing that I got

00:59:38.020 --> 00:59:40.620
<v Michael Kennedy>was a bunch of data frames and heads

00:59:40.770 --> 00:59:43.600
<v Michael Kennedy>or stats or something like that.

00:59:43.600 --> 00:59:44.800
<v Michael Kennedy>And I'm like, this is great,

00:59:45.000 --> 00:59:47.260
<v Michael Kennedy>but describe this in pictures.

00:59:47.430 --> 00:59:48.380
<v Michael Kennedy>And then I had a bunch of graphs.

00:59:48.690 --> 00:59:50.100
<v Michael Kennedy>And I'm like, okay, that was cool.

00:59:50.340 --> 00:59:50.920
<v Michael Kennedy>That was really cool.

00:59:51.650 --> 00:59:52.740
<v Michael Kennedy>Maybe people could try that, right?

00:59:53.060 --> 00:59:53.140
<v Michael Kennedy>Definitely.

00:59:53.860 --> 00:59:54.920
<v Michael Kennedy>All right, roadmap.

00:59:55.560 --> 00:59:56.080
<v Michael Kennedy>Where are things going?

00:59:56.380 --> 00:59:57.500
<v Trevor Manz>Yeah, so as I mentioned,

00:59:57.700 --> 00:59:59.780
<v Trevor Manz>we are currently building a tighter integration

01:00:00.060 --> 01:00:01.900
<v Trevor Manz>with our native editor inside of VS Code.

01:00:02.340 --> 01:00:04.660
<v Trevor Manz>So essentially our direction with Marimo Pair

01:00:04.710 --> 01:00:06.820
<v Trevor Manz>is to try to think of all the places

01:00:06.990 --> 01:00:08.900
<v Trevor Manz>in which folks are trying to drive agents

01:00:09.280 --> 01:00:10.820
<v Trevor Manz>that maybe we could have the ability

01:00:11.080 --> 01:00:12.240
<v Trevor Manz>to spin up a Marimo notebook

01:00:12.520 --> 01:00:13.560
<v Trevor Manz>and allow folks to collaborate

01:00:13.710 --> 01:00:16.600
<v Trevor Manz>on these reproducible artifacts.

01:00:17.460 --> 01:00:19.360
<v Trevor Manz>So right now that looks a lot like

01:00:19.520 --> 01:00:20.860
<v Trevor Manz>more terminal oriented workflows.

01:00:21.120 --> 01:00:22.180
<v Trevor Manz>We have some integration now

01:00:22.340 --> 01:00:23.500
<v Trevor Manz>inside the Marimo editor itself,

01:00:23.780 --> 01:00:24.260
<v Trevor Manz>like I mentioned,

01:00:24.420 --> 01:00:25.440
<v Trevor Manz>where you can open up the chat

01:00:25.500 --> 01:00:26.640
<v Trevor Manz>and start using Marimo pair.

01:00:27.020 --> 01:00:29.500
<v Trevor Manz>We'll have a further integration into VS Code.

01:00:30.060 --> 01:00:30.860
<v Trevor Manz>And I think down the line,

01:00:30.900 --> 01:00:31.560
<v Trevor Manz>we'll have eventually,

01:00:32.040 --> 01:00:33.160
<v Trevor Manz>you know, if you're using Cloud Desktop

01:00:33.480 --> 01:00:35.100
<v Trevor Manz>or Codex Desktop,

01:00:35.300 --> 01:00:37.120
<v Trevor Manz>that maybe you can start your little chat there.

01:00:37.280 --> 01:00:39.440
<v Trevor Manz>And that could also drive a Marimo notebook as well.

01:00:39.700 --> 01:00:41.620
<v Michael Kennedy>I feel like that's an entirely missing piece

01:00:41.840 --> 01:00:43.560
<v Michael Kennedy>of this whole agentic AI world,

01:00:44.100 --> 01:00:47.180
<v Michael Kennedy>like the Google Docs CoLab equivalent, right?

01:00:47.300 --> 01:00:49.340
<v Michael Kennedy>Like I've started up Claude Code

01:00:49.360 --> 01:00:50.220
<v Michael Kennedy>or something like that.

01:00:50.330 --> 01:00:52.440
<v Michael Kennedy>And now, why don't you join my session?

01:00:52.600 --> 01:00:55.100
<v Michael Kennedy>We'll all talk to Claude and, you know, have it go.

01:00:55.410 --> 01:00:56.360
<v Michael Kennedy>I don't know, maybe someday.

01:00:56.900 --> 01:00:58.660
<v Trevor Manz>Yeah, or maybe Maremo can serve.

01:00:58.930 --> 01:01:00.100
<v Trevor Manz>Like, you know, we will have,

01:01:00.400 --> 01:01:02.860
<v Trevor Manz>we are currently working on some real-time collaboration features

01:01:03.130 --> 01:01:03.740
<v Trevor Manz>inside of Maremo.

01:01:04.200 --> 01:01:05.500
<v Trevor Manz>And maybe there's some way that, you know,

01:01:05.740 --> 01:01:08.100
<v Trevor Manz>multiple people have multiple agents that are talking to the same

01:01:08.700 --> 01:01:09.160
<v Michael Kennedy>Maremo kernel.

01:01:09.440 --> 01:01:12.840
<v Michael Kennedy>Each person with their agent buddy are all in there.

01:01:12.880 --> 01:01:15.580
<v Michael Kennedy>That seems totally reasonable as long as it's, you know, aware.

01:01:16.580 --> 01:01:17.740
<v Michael Kennedy>What about remote?

01:01:18.260 --> 01:01:21.440
<v Michael Kennedy>So I'm running Marimo, I'm not on my machine,

01:01:21.780 --> 01:01:24.220
<v Michael Kennedy>but on some server or some cloud service or whatever,

01:01:24.680 --> 01:01:27.660
<v Michael Kennedy>but I've got my cloud local and I want to have those things work together.

01:01:28.000 --> 01:01:31.260
<v Trevor Manz>Yeah, so the way that behind the scenes,

01:01:31.480 --> 01:01:34.460
<v Trevor Manz>like how the tool call works inside of Marimo,

01:01:34.700 --> 01:01:36.640
<v Trevor Manz>it's a bash script that's called execute code.

01:01:37.200 --> 01:01:40.320
<v Trevor Manz>That allows you to swap in a URL, whether that's on local host

01:01:40.330 --> 01:01:42.060
<v Trevor Manz>or something remotely with some authentication.

01:01:42.840 --> 01:01:44.800
<v Trevor Manz>And therefore you can connect your local cloud

01:01:45.180 --> 01:01:47.120
<v Trevor Manz>to some remote Marimo kernel as well.

01:01:47.320 --> 01:01:50.500
<v Trevor Manz>And then you have a sandbox that's not running on your machine at all, but somewhere in the cloud.

01:01:51.440 --> 01:01:53.040
<v Trevor Manz>But you're driving that from your local machine.

01:01:53.920 --> 01:01:58.600
<v Michael Kennedy>Some big machine with GPUs or whatever, that's a better place to run your code.

01:01:58.800 --> 01:01:59.340
<v Trevor Manz>Yeah, exactly.

01:02:00.980 --> 01:02:04.700
<v Trevor Manz>At Marimo, we have a cloud-hosted version of Marimo Notebooks that's called Molab

01:02:04.710 --> 01:02:10.100
<v Trevor Manz>that we recently released on CoreWeave Infrastructure, where we have some GPUs for our community.

01:02:10.660 --> 01:02:14.080
<v Trevor Manz>And you can actually today go inside that UI and click pair with an agent,

01:02:14.560 --> 01:02:16.280
<v Trevor Manz>And you can copy a little cloud command

01:02:16.910 --> 01:02:18.920
<v Trevor Manz>and connect that to your Claude Code or your codex.

01:02:19.780 --> 01:02:22.140
<v Trevor Manz>And then you can start pair programming locally

01:02:22.400 --> 01:02:24.100
<v Trevor Manz>with that remote sandbox in the cloud.

01:02:24.560 --> 01:02:25.560
<v Michael Kennedy>I love it. That's awesome.

01:02:25.960 --> 01:02:26.820
<v Michael Kennedy>All right, final call to action.

01:02:27.260 --> 01:02:29.200
<v Michael Kennedy>People are like, Marimo pair sounds cool.

01:02:29.640 --> 01:02:30.640
<v Michael Kennedy>What do you tell them? How do they get started?

01:02:30.900 --> 01:02:34.560
<v Trevor Manz>Yeah, so I'd recommend going to marimo.io slash pair,

01:02:35.300 --> 01:02:38.140
<v Trevor Manz>grabbing the skill and spinning up a notebook of your own

01:02:38.190 --> 01:02:40.360
<v Trevor Manz>and just trying to do tasks that you do with data.

01:02:41.160 --> 01:02:42.300
<v Trevor Manz>Traditionally, maybe in a notebook

01:02:42.300 --> 01:02:44.660
<v Trevor Manz>or maybe if things haven't been going well inside that notebook.

01:02:46.100 --> 01:02:47.020
<v Trevor Manz>We haven't put up the site yet.

01:02:47.820 --> 01:02:49.300
<v Michael Kennedy>That's right, it's coming soon.

01:02:49.780 --> 01:02:51.060
<v Michael Kennedy>I totally forgot you said that.

01:02:51.720 --> 01:02:53.440
<v Michael Kennedy>By the time this episode comes out, that will be there.

01:02:53.880 --> 01:02:55.960
<v Trevor Manz>If you're watching the live stream, maybe give it a few days.

01:02:56.420 --> 01:02:59.320
<v Trevor Manz>By the time this episode comes out, check out marimo.io.

01:03:00.240 --> 01:03:02.900
<v Trevor Manz>Or go to our GitHub for marimo pair, install the skill,

01:03:03.260 --> 01:03:05.640
<v Trevor Manz>and show us what you build with Marimo,

01:03:06.400 --> 01:03:07.920
<v Trevor Manz>regardless of if you're driving it with agents.

01:03:08.080 --> 01:03:10.780
<v Trevor Manz>But we'd love to hear if you start using out agents

01:03:10.800 --> 01:03:13.360
<v Trevor Manz>where the skill falls short

01:03:13.580 --> 01:03:15.780
<v Trevor Manz>and how we can really improve that user experience.

01:03:16.400 --> 01:03:16.760
<v Michael Kennedy>Cool.

01:03:16.980 --> 01:03:18.480
<v Michael Kennedy>Well, it seems like a really neat idea.

01:03:18.900 --> 01:03:20.660
<v Michael Kennedy>I think you're going to have a lot of success with it.

01:03:20.820 --> 01:03:21.840
<v Michael Kennedy>So thanks for coming on the show

01:03:22.020 --> 01:03:22.680
<v Michael Kennedy>and sharing it with everyone.

01:03:23.000 --> 01:03:24.200
<v Trevor Manz>Yeah, thanks so much for having me, Michael.

01:03:24.580 --> 01:03:25.060
<v Michael Kennedy>Yeah, you bet.

01:03:25.340 --> 01:03:25.400
<v Michael Kennedy>Bye.

01:03:27.520 --> 01:03:29.640
<v Michael Kennedy>This has been another episode of Talk Python To Me.

01:03:30.020 --> 01:03:30.740
<v Michael Kennedy>Thank you to our sponsors.

01:03:30.990 --> 01:03:32.240
<v Michael Kennedy>Be sure to check out what they're offering.

01:03:32.450 --> 01:03:33.800
<v Michael Kennedy>It really helps support the show.

01:03:34.900 --> 01:03:36.440
<v Michael Kennedy>This episode is brought to you by Sentry.

01:03:37.180 --> 01:03:38.600
<v Michael Kennedy>You know Sentry for the air monitoring,

01:03:38.830 --> 01:03:40.200
<v Michael Kennedy>but they now have logs too.

01:03:40.520 --> 01:03:43.200
<v Michael Kennedy>And with Sentry, your logs become way more usable,

01:03:43.720 --> 01:03:47.580
<v Michael Kennedy>interleaving into your error reports to enhance debugging and understanding.

01:03:48.100 --> 01:03:51.300
<v Michael Kennedy>Get started today at talkpython.fm/sentry.

01:03:51.960 --> 01:03:53.840
<v Michael Kennedy>If you or your team needs to learn Python,

01:03:54.000 --> 01:03:57.460
<v Michael Kennedy>we have over 270 hours of beginner and advanced courses

01:03:57.620 --> 01:04:01.180
<v Michael Kennedy>on topics ranging from complete beginners to async code,

01:04:01.320 --> 01:04:04.100
<v Michael Kennedy>Flask, Django, HTML, and even LLMs.

01:04:04.320 --> 01:04:06.700
<v Michael Kennedy>Best of all, there's no subscription in sight.

01:04:07.160 --> 01:04:08.940
<v Michael Kennedy>Browse the catalog at talkpython.fm.

01:04:09.620 --> 01:04:13.000
<v Michael Kennedy>And if you're not already subscribed to the show on your favorite podcast player,

01:04:13.640 --> 01:04:14.300
<v Michael Kennedy>what are you waiting for?

01:04:15.080 --> 01:04:16.720
<v Michael Kennedy>Just search for Python in your podcast player.

01:04:16.880 --> 01:04:17.700
<v Michael Kennedy>We should be right at the top.

01:04:18.140 --> 01:04:20.900
<v Michael Kennedy>If you enjoy that geeky rap song, you can download the full track.

01:04:21.120 --> 01:04:23.020
<v Michael Kennedy>The link is actually in your podcast player show notes.

01:04:23.860 --> 01:04:25.180
<v Michael Kennedy>This is your host, Michael Kennedy.

01:04:25.480 --> 01:04:26.640
<v Michael Kennedy>Thank you so much for listening.

01:04:26.840 --> 01:04:27.640
<v Michael Kennedy>I really appreciate it.

01:04:28.080 --> 01:04:28.780
<v Michael Kennedy>I'll see you next time.

01:04:41.820 --> 01:04:43.460
Thank you.