Latent Space: The AI Engineer Podcast
Hosted by Alessio Fanelli
Original podcast
Watch the full show on YouTube: https://www.youtube.com/watch?v=7HJCa-pHfSQ
4,750 words · 3 speakers
Speaker names marked ? are inferred from speaking time and the show’s known hosts — they are not voice-verified.
Hey everyone, welcome back to another Late and Space Lightning Pod. This is Alessio, partner and CTO at Decibl. And today I have Akshay Agrawal from Marimo on the studio. Welcome.
Thanks Alessio, really happy to be here.
Yeah, thanks to Samuel Calvin from Pydantic for the introduction. You know, we saw him at the AI Engineer Summit in New York and he was like, "You should have these guys on the pod." So, and we've had previously, you know, Brian Bishop from Hacks, who is now at TRVC, so we cover notebooks in the past. And I think there's now a resurgence of AI plus previous data you access. We have a quadratic episode on the spreadsheet side. So, welcome to the show and maybe give people an introductions on Marimo and what you guys do.
Yeah, definitely. So, Marimo is an open source notebook for Python. That's built entirely from scratch, so it has no dependencies on Jupiter. And it's designed specifically for AI and data work. So, some of the main things that are different from like traditional notebooks is that Marimo has like reactive execution. So, you run a cell, Marimo knows what other cells need to run. And also has built-in UI elements. Like the upshot of these things is that it lets you work with data and AI models in entirely new ways.
And it like really puts your data front and center in a way that sort of you don't see in traditional notebooks. And these things are a lot easier to demo, so we'll jump into a few demos in a bit. But I guess a couple of other things I'll say about Marimo and sort of the things that are fueling sort of the strong traction that we're seeing is that not only are they really good for rapid prototyping, they also let you go from prototype to production. So, they're like stored as pure Python, so you can version them with Git. You can share them as data apps, you can execute them as scripts or pipeline. You can, they have SQL built in and you can connect to your own databases or data lakes. So you can think of it as a modern replacement for not only Jupiter, but also Streamlit, Gradio,
Papermill. And yeah, so we are seeing pretty strong traction this year. I think last I checked, over 300,000 monthly downloads on PyPI, more GitHub stars than Jupiter Notebook for whatever that's worth. And we're used at companies like OpenAI, Hugging Face, Cloudflare, BlackRock, universities like Stanford and Berkeley. That's the high level overview.
Yeah. How did you decide on the notebook shape? I think there is many critiques of Jupiter notebooks from the kernel and like the way it interacts with AI models and IDEs. What was kind of like the initial idea maze that got you here?
Yeah, so I started working on Murimo after, so I was at Google Brain. It was a while ago, but I was an engineer on TensorFlow. And then after that, I did a PhD at Stanford in machine learning research. And you know, one thing I noticed, and even for myself too, is that like people have a lot of complaints about Jupiter notebooks. And you know, I did too, which is sort of why I'm working on Murimo today. But at the same time, they, they provided something that was really invaluable for people who work with data and AI, which is the ability to, to write code and like interact with the output of the code, interact with your data in an iterative way. And I think one thing that's constant, like, you know, back then it was machine learning. Now it's more generative AI.
The thing that's, that has been true is that you got to look at your data. And notebooks are like really good for that, even though they, they have traditionally had like a lot of problem, other problems like hidden state, reproducibility issues, the file format, making it, you know, unable to version with Git.
So after finishing my PhD, I noticed that look, not only does a lot of data work, start in notebooks, you know, with, you know, the rise of AI. So at that time, that was end of 2021. So ChatGPT, you know, was just bursting onto the scene. I think it became clear, clear to me that people were going to spend even more time working with data, evaluating model outputs and stuff. So I thought. I wanted to design something that kept the interactivity that notebooks are really great for, but that had sort of the guardrails that like regular software has, like reproducibility, no hidden state. You can actually reuse your notebooks as apps, as scripts. And yeah, so that's sort of, that was the genesis of the idea.
Cool. Yeah, let's jump into a demo. I think, you know, most of the audience is technical, so feel free to keep it engineering focused.
Awesome. So let me share my screen.
Cool.
So I can share a few demos. So this is an example of a Merima notebook.
You have cells of Python code. You have some markdown and then you have some visual outputs. So this is, we're going to start with classical machine learning with MNIST dataset, and then we'll go to some generative AI applications. So over here, we're looking at a scatter plot of a 2D embedding of MNIST, which is a dataset of numerical digits. And so each different color in this scatter plot corresponds to a different digit. So one thing that is immediately different between how a Jupiter notebook works and a Merima notebook works is that this notebook is going to react to my UI interactions and also my code interactions. So what I'm going to do here is I'm going to hide the code.
I'm going to click this button and then I get a app view sort of of my notebook.
One thing that I can do is that I can actually make a selection in the scatter plot. And as I make this, you can see down below, I'm getting a live preview of the underlying images that have been embedded into 2D.
And workflows like this are like, one, I think really important whenever you work with data. Like you actually really need to see your data. And two, like, very painful to like get working in traditional notebooks that are sort of based on Jupiter. And in contrast, like if you look at the code for this notebook, it's really quite simple. Just a few lines of code, you create an Alt+Air chart, and then you just wrap it in one special Meremo function. And that that makes this thing totally interactive. And then what's happening behind the scenes is that I have this chart object, it has a value property, and that value is just the data that's been selected. So if I select here,
you'll see that a data frame gets sent back to Python, and you can see a visualization of it.
And then you have downstream code that can manipulate that data in any way. And so that's what I mean by reactive. I interact with a notebook, and then Meremo knows how to automatically update outputs.
And this is a one-to-one compatible with notebooks? So if I already have a notebook, I can just kind of copy paste the cells over? Or what's the process?
Almost. So our file format is different.
But yeah, you can copy paste the files or the cells over. Or we have a command line utility. Meremo convert my notebook that IP and B to my notebook that PY, and it'll do the conversion. There are some restrictions on the kind of code that Meremo lets you write. Because Meremo does have a dependency graph basically on your cells. That's how it knows what cells to run. You can't redefine variables across multiple cells. But our conversion tool will fix that up for you. And we have things like local variables and other things that sort of make that work.
Awesome.
Yeah. And so I have these other little UI widgets here. I can click this widget, for example, and it changes the embedding. Again, like if you were doing this in a Jupiter notebook, you would probably have copy pasted that all like six cells like multiple times. And then you wouldn't even have this sort of drill down interactivity. So that's one way that Meremo brings data to life in sort of a more classical sort of machine learning context. Can look at another demo. This one is pretty fun. It was made by Vincent Warmerdom, who is Murimmo's resident creative genius. And so this one, okay, so if you're looking at this, first thing you might notice is, okay, wait a minute. Notebooks are traditionally linear.
You're looking at some columns here on the screen. We have three columns of code and outputs. Murimmo is actually pretty flexible in like the way you can arrange your code. And we recognize that like, hey, monitors are wide and you might want to use that screen real estate. So you can configure it to show things in columns. And the way that the order of execution works is just based on variable declarations and references, kind of like Excel in some sense, right? You can have columns, things just kind of execute in the right way. So this notebook is kind of fun. So what we have here, we have a few cells. We have a little custom widget that Vincent vibe coded. It's Microsoft Paint in a Murimmo notebook.
And so what I'm going to do here is I'm going to draw in this widget. And first thing you see, as I'm drawing, my image is being rendered here on the right, and that's based on that reactivity. I'm going to draw a little graph. And then this graph is going to be used as part of the input to a query that I'm going to make to a multimodal model. And I'll ask Jim and I to give me a representation as a mermaid. Okay, there we go. So I have the markdown code for the mermaid graph. And like, this is the kind of thing that you really don't think, if you think Jupiter notebook,
you don't envision yourself being able to make workflows like this for yourself. But like, so I, I, I hope like a demo like this shows like how Murimmo really makes you rethink what a notebook can do and really sort of brings your data to life in new ways.
Do you, do you have any kind of like AI native utilities to call these models? Or are people just writing like all the API calling code? Or do you think that's kind of like an interesting direction?
Yeah, so we do have some AI native capabilities to write these, call these models. So I guess it's in.
A couple of modalities. And so right now, this notebook is just calling the client API.
If you want to, you can just generate code. So speaking of um, a recent podcast that y'all did for on quadratic, the AI spreadsheet. You know, there we saw a lot that you could use natural language to generate code. And actually, Marimo lets you do similar things. So like I could.
There's a generate with AI button here at the bottom, right? So I could write some code. I can tag data frames and other things that I have.
And uh, I'm actually not sure what I want to ask it to to show here, but I could say, you know,
create.
Map plot the plot of a sine curve.
And I can just do that. I'm missing some packages here that I'll need to install. And then we can try again.
Yeah. How do you do on the packaging? Is it, there's like a requirements, a TXT file, just like you would in a.
Actually, it's. Yeah, it's a little cooler actually than that. So let's see this time. So one thing that you'll notice that when I tried to run a generate with AI code button, and I didn't have a package installed, there was like a little toast that like, say, hey, we can install this package for you. And it just kind of did it. So we actually have a tight integration with the UV package manager from Astral. So we can actually store dependencies in line in the notebook file itself in like the notebook header. And this is something that UV supports. So then you can just actually ship a notebook file around and it contains all its dependencies. That's like kind of opt in, but that's one way thing that like really.
Makes notebooks a lot more reproducible. And so we'll see again, we don't have the packages, but I can install them. And then there we go, they're installed, the cell reran and I have sort of my output.
Yeah. So when you're asking AI to generate, I mean, AI generated cell can kind of like, doesn't have to think about the broader requirements of the project.
Yeah, that's right. And the AI has context to sort of like all the data frames, all the variables that you already have imported into your notebook as well. But yeah, it can, it can readily use other modules and will just sort of do the right thing. I have another fun demo, also made by the one and only Vincent Warmerdam that I kind of want to show. And this is a demo, sort of in the vein of bringing sort of data to life and like really working with your data. This is like a data annotation demo. And one thing that you'll notice, actually, so in my hands here, I've got a PS5 controller.
Yeah.
And you'll see this little thing here, moped widget, and it says gamepad connected. And I'm moving around my mouse and you see some like inputs changing here. And so like to really drive home how interactive Marimo is and like how many different ways we can use to sort of interact. Like not only can you use your mouse to change UI interactions, you can build custom extensions to control your applications you make in a Marimo notebook with anything, including a PS5 controller. So this demo here, we have like a bunch of papers from archive and we've indexed them using ChromaDB into like a basic vector database. And now what we're going to do is we're going to make a query
to get a bunch of papers related to data quality. And there's two embedding models and the goal is to compare like which embedding model do we prefer? So the embedding model embeds the query and then, you know, uses vector search to pull related papers. So if I submit this. I get a summary of the paper. In this case, it says, we provide an overview of the standard data resources for training multilingual reasoning and language models. That seems sort of related to data quality, so I'm going to accept this. And I could accept it by clicking this button, but I can also accept it by pushing X on the gamepad. So I push X here.
Oh, way more fun.
Yeah. You see, that goes through. You see that I have this editable data frame thing here that shows me the annotation result. And I can just keep going. I don't know, this one also seems sort of related to data quality. So maybe I'll say accept.
This doesn't seem as related, so I'll say reject. And what's happening over here is that I'm plotting the beta distribution of the two models to sort of get a belief of which model is better. And I can just kind of jam this quite quickly in a way that, you know, would be really annoying if I were using my mouse and I would just quickly get carpal tunnel syndrome. So another way that like, Murimo really brings your day to the life and really makes your work a lot more interactive than it might be otherwise.
That's great. Can we maybe talk about the blank canvas AI use cases? So, you know, I want to do some data analysis.
I like the notebook-like UI. How do I start from scratch?
Yeah, that's actually perfectly T'd up. That was the next demo. So this is how you start from scratch. This is an empty Murimo notebook. I can zoom in a bit. And so there is a code cell and there's this generate with AI button. So to get started, I will just like populate this with some data.
And I'm going to use Vega data sets. Import a data frame about cars. Okay, so I have a data frame. And I'm saying I'm kind of new to Polars. I don't really know the syntax, but I kind of know what I want to do. So you can click this generate with AI button and you can just start typing. So maybe the first thing I want to do is get a histogram, maybe, of one of these columns. It's just so I can see it sort of in more detail. So I can say something like, generate a histogram of miles per gallon, maybe.
From and then I can give the data frame as context to whatever model I have connected. So I can just tag it with at and you'll see here that if I did write tag at DF, it actually is going to pass in all these columns and their data types as context to the language model. If I do that, I hit enter. It's going to churn a little bit, generate some code. I can edit it a little bit to sort of clean it up.
Don't need to convert it to pandas, then I can accept and just run it and then boom. So you have your code. And so that that kind of
really accelerates rapid prototyping. And you don't really have to leave your tab and go to chat GPT. You can just do it entirely in here and you can like just sort of vibe code your way through your entire analysis in this way. And I guess like one thing that's kind of interesting to talk about that maybe is kind of subtle. But like, if you think about doing something like this,
I don't know, in cursor or chat GPT or something like this. What's unique about doing it in Meremo is the fact that not only does Meremo see your code, but it sees all the variables in memory and it can also see your database connections, et cetera. So it can really provide rich
rich completions. So like it knows the name of the columns, for example.
Oh, how are you doing the context formatting? Like when you do at DF, are you showing that to the to the model when you send it over?
We like, basically, I think we do like DF dot head to just like get like a preview of the columns, the data types, and then like a few sample rows. And just kind of shove that into the context window. Yeah, so let's see, I can ask like another query, like maybe I can say something like.
So this data set has cars by a bunch of different countries as well. And maybe I want to understand sort of average statistics by country of cars. Like are US cars more efficient or less efficient than cars from Japan, et cetera? So I can say something like.
Let me understand. Uh, average statistics for
for DF
across
origin column, which is the country. And then boom, it starts writing again. What's kind of cool is that you'll see it knows all the column names here.
And then again, I can fix up the code a little. Except try it out. And there it is. Um, a lot faster than going to, to the API docs.
And we have other workflows too for, for working with AI. So you can also, there's like a chat bar here where if you don't necessarily, if you want to sort of a multi-turn conversation, you can execute it here as well. And you, we have a bring your own keys model. So right now I'm using an open AI key, but you can also use local models with Ollama. Or anything that you like, really.
Sorry for jumping in late here. I think you probably guys, yeah, you guys probably discussed this earlier, uh, but this is all running a web assembly, right?
Um, actually not, not entirely. But Marimo's actually, this is running just on my laptop, but we can run it with Assembly. So I guess similar to a Jupiter notebook, Marimo is an open source package that you can just install and run wherever you like. So pip install marimo, run it on your laptop, run it on a cloud server, wherever you like. But to make Marimo really easy to share, we've also made it possible to run it entirely in Web Assembly. So actually, if you go to marimo dot new, this opens a little notebook playground in your browser and this is running entirely in Web Assembly.
So you can just.
Yeah, I was, I was just kind of curious if there's any part of the Python ecosystem that, you know, is not compatible with this. I'm not aware of what the restrictions are.
Yeah, no, so that's a great question. So if you're using Marimo, just the local library on your laptop, on the cloud server, you can use any Python package you want. If you're using it in Web Assembly, so for example, in this playground, there are restrictions. So you try to import torch. It's not going to work. It's not going to be able to install it. But there are certain packages that just don't work. And actually, for that reason, so whereas I think the WebAssembly really like democratizes interactive computing to a large extent, it doesn't totally. So for that reason, our team has actually been really hard at work building a cloud-hosted Colab-like notebook that we're going to give away to our community
for free, and we're calling it MoLab. This is like a preview of the page and-
Great name.
Yeah, it's a funny story. So Mo for Marino, and it's at moLab.Marino.
It's a pretty simple service. You can create a new notebook, you can import a notebook locally or from GitHub, and these run in cloud instances. Currently, they're running on Modal. And so here you can use any package you like. But you can have configurable CPU and RAM. You can also upload your own data and restore them in CloudFlare R2 buckets.
You know, the name, I mean, one thing that's actually kind of funny for the origin story of this is that a lot of our users were asking us for something like Colab but based on Marino. Actually, if you go to Google Colab's GitHub issues page, they have one, and sort by thumbs up, we are like, I guess, the sixth or seventh most upvoted issue, support Marino in Google Colab. And I don't think Google was ever going to do that anytime soon, so we decided to kind of just do something like that on our own. So that's sort of the origin for where MoLab came from. Yeah, it's a funny, the issue was open in June of last year. It was one of our users who we've communicated with over GitHub for some time. Yeah.
Amazing.
What's kind of like missing here in your mind as you think about other things that you want to add to it, like features or like maybe trying to break out of old habits? I think you've done a great job of keeping the familiarity of like cell-based execution by adding things like column and things like that. Yeah, what do you think is next?
Yeah, so a bunch of, there could be a bunch of things. So in terms of like breaking out of old habits-
And we talked a little bit about how Marimo has some restrictions on the kind of codes you write. And actually, that ends up leading to much better code. Because you can't reuse, you can't redefine variables. You kind of have to write things in a functional way. So in that sense,
it does sort of break some old, maybe bad habits. One of our users called this gentle parenting. And another way of breaking out of the notebook that we actually do have. So I mentioned notebooks are stored as pure Python. So if I go, I can open a notebook file and we can take a look at what it actually looks like. Oops. You'll see it has a py extension. I'm embedding MNIST.py.
I'm going to zoom in and you'll see it's just pure Python. And this is generated for the user, but you can also edit it yourself. Every cell is decorated in app cell decorator. And there is an app run sort of at the bottom, which suggests you can run this as a script. And like, indeed, you can. So if I go to my terminal and I can just use uvrun embedding MNIST.py.
It just starts executing as a script. It loaded a cache data, so it did some other stuff that didn't print to the terminal. So that's, that's one way that we help folks break out of a notebooking workflow. The other way is you can actually run any Marimo notebook as a data app, similar to Streamlit. So I can say Marimo run embedding MNIST.py. And then it'll run it as a read only web app in my browser that you can also deploy and share with other,
other users or maybe non-technical folks.
Do you see a world in which you made this right too?
So when I meant read only, it just means that the consumer of the app can't change the code. But yeah, you can have like, you can write to databases from the application and things like that. So definitely you can have write back. Yeah.
Yeah. Other things that we're working on besides MoLab.
We do talk about improving, like going further with the AI assistance that we have. You know, agents are obviously sort of a natural thing to think about. There's actually a really cool project by a PhD student at Stanford where they, they work in genomics. And they actually forked Marimo. They have a project called Marimo Agents and they added a new type of cell, an agent cell where you can type English and then it kicks off an agent that generates your Python code and then adds it to your notebook and then you have a record of the prompt. So things like that we're looking into exploring too.
Nice.
Awesome. I thought this was great. Any cut to action for folks? Are you hiring? Are you looking for obviously more users? Anything?
Yeah, we're always looking for more users. So if you want to try Marimo, easiest way to get started on your own machine is to pip install it. And then just write Marimo tutorial intro, pip install Marimo, Marimo tutorial intro will get you, get you going.
Try out MoLab if you want a cloud hosted experience of being able to use any package, sharing notebooks with links like just like you would with Colab. So that'll be at molab.murimo.
Otherwise, we love contributors. We have over 100 open source contributors. Come follow us on socials. We're Marimo underscore I O on Twitter.
I think this, this mission is great.
And I think notebooks are still underrated by a lot of people and like requires a dedicated team with like a strong vision like you have to reinvent one of the core workflows of most research scientists and engineers.
Appreciate it.
Awesome, Maxi. Thank you so much.
Thank you, guys.
Page updated October 26, 2026 · transcript and summary are machine-generated