Resources

How marimo adds reactivity to your Quarto documents

Jeroen Janssens talks with Vincent Warmerdam about marimo and the Quarto plugin that was recently released. Links: - https://quarto.org - https://marimo.io/ - https://docs.marimo.io/ - https://github.com/marimo-team/quarto-marimo - https://github.com/koaning/wigglystuff - https://anywidget.dev/ 00:00 Introduction 01:19 Getting started with marimo 35:34 ScatterWidget 42:45 Data sources 53:24 Marimo plugin for Quarto

Jun 27, 2025
1h 21min

image: thumbnail.jpg

Transcript#

This transcript was generated automatically and may contain errors.

Hey everybody Thanks for joining me today, my name is Jeroen, I do DevRel at Posit and we're joined here today by Vincent Warmerdam Vincent. Hiya. Hi

Yeah, nice to be here. It's um, like I've always been an RStudio fan back in the day So it's nice to sort of see the evolution and you know, we're calling it Posit now But yeah, it's nice to be here

yeah, so Vincent you're a you're an engineer at marimo and That's actually what we're going to talk about today about marimo and also this this cool plug-in that yeah We we tend to ship. Yeah, we ship a lot of things and recently we ship the thing for Quarto as well

Believe it or not. It was actually if you look on YouTube It was the number one feature for months like people wanted to have marimo support inside of Quarto So we were too busy hiring to be able to work on it. We then Got the guy hired as they did the work for it and it's out now people can go ahead and start playing with it

It does help if you can appreciate what marimo does under the hood and that's also kind of the point of today we're gonna talk a bit about marimo and then also use that as a staging point for moving on to the plug-in, but yeah We're super like the first feedback we've gotten so far has been extremely positive. So we're definitely keen to talk more about that

Getting started with marimo

I'm very excited. So why don't we dive straight into it? I have my terminal so I'm typing and yep. It's up to you what we can go anywhere. We we want and So I have my my terminal open right now, but that's not where we need to start Why don't you tell us a little bit about marimo?

Yeah, so what I think will be the easiest that you've got UV installed. I'm assuming right? Yes, that's correct So what one thing you could do is you could start a virtual environment here and immediately call and like we can install marimo what you can also do is just type UVX and then marimo that should also work and Then do dash dash help at the end

Yeah, the benefit of it. Yes, so that that should work, right? So this allows you to run marimo without a virtual environment because you can just immediately call marimo It goes to see that there's like a bunch of commands there

Yeah, right at the bottom so You can convert Jupyter notebooks or mockdown files into the format that we like to use over a marimo. There's config There's all sorts of things But there are two verbs that are going to be important for us right now One of them is the edit command and one of them is the run command

The idea here is that when you can run a notebook in edit mode Which means that you can edit it kind of similar to what you would do with a Jupyter notebook But once you're done editing you can also deploy it as a web app in that case you want to run it in run mode Well run mode. I think we call it app mode internally actually But those are the two modes that I think would be fun to maybe explore first

And while we're at it, what we're also going to do is we're gonna build a Python notebook first where everything is nicely sandboxed So we're gonna go with UVX marimo edit all right, and so I Heard the word notebook in there, right? So marimo is all about notebooks marimo is a Python notebook That's the the best way to describe it and Python is the first-class citizen. We do also support SQL and markdown we'll get to that in a bit, but it's definitely a Python notebook

So what you can do is you can type edit indeed then you have to do dash dash sandbox I'm gonna come back to that why that's relevant. Mm-hmm and Then we can give a name to the file we want to store the notebook in Everything in marimo is stored in a Python file. So you could just type notebook that pie We don't do the thing that Jupyter does with the JSON. We do everything in a Python file basically So just notebook that pie will be good here. All right

So a bunch of stuff is installing and we see The marimo notebook has spun up and it's opened the browser for us and it was really fast It was I just want to say that thanks to UV and everything is installed very fast It's UV is definitely doing the heavy lifting on the speed there. That is definitely true

But yes, this is a notebook and it's in a lot of ways similar to Jupyter because we've got cells and stuff But it's also very different in a lot of ways, too So what you'll notice is there's a lot of buttons. There's like a side panel on the left But I think the easiest way for me to explain just what makes marimo different is to just immediately start typing in a cell All right, we'll get to all the fancy buttons in a bit But let's also maybe zoom in a bit because people might be seeing this on their mobile phone

All right. Yeah, something like that feels appropriate What you can do now is you can hit tab and that first line will autocomplete This will load all the marimo utilities And if you can now hit like shift enter you're gonna run that cell a new cell below should appear And you can also move the mouse cursor in there and just as a base example Let's just type a is equal to one

Yep, and then the new cell below that So you can run it and then B is equal to two and that's also like we're just gonna do basic Python variables here Right, nothing overly scary. And then let's do one more cell below that and we can do a plus B

But it's also very different in a lot of ways, too You have like keyboards Yeah Collection at this point what you can also do now is just can you hit command K? So that'll bring up the command palette and if you type shortcut in here Then you're gonna be able to see all the keyboard shortcuts that we've got if you hit enter now You are gonna see all the shortcuts so we can look in here. But most of all is also edit buttons

Yeah, so shift enter there you go, but you can also change all of these so if you wanted to make a change here That's also something you could do. Yeah, so if you do shift enter now, yeah, there you go I think it's the same in Jupiter, but now you can type a plus B

Yep, and nothing scary is happening here, but there are like a few notable differences of Jupiter, right? So one thing that's different is that we render on top instead of below Yes, so notice how the three is rendering on top of instead of below it that's a setting you could change But there's a reason why we do this

So just for fun if you hover your mouse over the cell that has a is equal to one and If you now look at the right-hand side of the cell, you're gonna see zero milliseconds and you're gonna see those six dots Yes, can you grab that and scroll it down? Down here and you can yep, and you can do the same thing with B is equal to 2 and you can do the same thing with the import statement Like in marimo the order of the cells doesn't necessarily matter

Marimo will figure out in what order the cells have to run in order for them to actually go ahead and run So what you could do now is just refresh the notebook So hit command R on top of my mind It's like the browser refresh window thing Yep, and then you can hit restart on the right-hand side of that little no no on the blue cell There's a restart I can on the right hand. Yep that one that's gonna restart the entire notebook we start and You're gonna notice this thing just still runs without you having to do anything and without even without having to do like shift enter through All the cells and again, that's because marimo can figure out in what order things have to run. Yeah, that's very nice

All the cells and again, that's because marimo can figure out in what order things have to run. Yeah, that's very nice

I mean, that's something that I believe a lot of notebook users run into is that at a certain point? What you have on the screen is not really what is going on under the hood, right? So what's in memory or what's on screen tends to be like you don't have that guarantee in Jupiter But what we can do now just for shits and giggles. Could you just remove that line? It says a is equal to one just have a blank cell there

Now hit enter like run that cell OOP, it's immediately in your face telling you like oh, there's a variable missing in Jupiter this would have been different right because Even if you remove that statement a is equal to 1 a is equal to 1 is still in memory And if you remove the cell, I mean someone else might would not be able to run the notebook But we can kind of be in your face about it

And the reason why this works is because marimo under the hood is actually doing a forward pass over all the code It is looking at all the different cells And it's in this case saying oh, there's a cell a that contains a plus B we need to look for a cell that defines a and we're looking for a cell that defines B and We're able to sort of build a DAG of operations in a way So if you go back and like add a is equal to 1 to that cell again

Yeah, so this is An entirely new pop-up so to speak Yeah, so it's popping up in the cell where we detect that a is missing. Yeah, so but if I not say a is 1 again I'll run it the error goes away and now we can do something interesting like if you go to the to the side panel on the left and then 1 2 3 4th icon from the top the one of the graph

Yes Yeah, you can click that and then click vertical tree So then you can you can actually see the DAG like this is something that people always find kind of interesting So you can actually see what cells depend on each other so you can actually see that marimo has figured out Oh, there's a cell zero that has a plus B in it and it depends on these two other cells and in this case is like Crazy simple if you have a more complex notebook, you can actually see really complex DAGs appear over here. Yeah

Oh, wow, but but I'd like to emphasize this is actually what's happening under the hood So in a like one way of describing what's happening here is marimo is like almost a compiler it looks at all the cells and then And depending on what it sees in the cells that determines the order of in which operations actually happen. So there's like a It's not the same as compilation obviously, but it's like almost a compilation step Like there's a thing that we do before we actually run anything. Mm-hmm. Yeah. Yeah

Reactivity and the DAG

So, I think I mean I Have to think of the term reactive here. Yep What would happen now if we were to change the value of either A or B So let's let's just show it. So the yeah, it's sort of pick whatever value 42 or think of seven Good. Why do it 42, of course?

Or 41 so that the answer now in the first cell it's 42 Yes, and if you look back at the DAG that we've got right? Mm-hmm Marimo can actually do something kind of clever here because we noticed Oh B is equal to 41 now. Oh, so then there's a child that needs to update But I don't have to update the cell that has A is equal to 1 So it can be very picky about what parts of the DAG have to actually update. So oh, there's one cell changed over here Okay, let's look at all the children in the graph and those need an update and that's like Pretty convenient also from like a oh, I don't want to rerun code. That doesn't have to be run Like I don't want to read the whole CSV file again like that that kind of stuff is also nicely Captured by having it in a DAG form sunset. Yes

Wow and Like a lot of stuff in Marimo might feel a bit strange if you use the Jupiter But as long as you understand this phenomenon Like oh, it's reactive and this is the thing that's happening under the hood. A lot of things do fall into place

And there's a few things we could do at this point like we could explore the UIs But one thing I kind of want to do now is also just show you a consequence of this because if you're a Python user There is this one aspect of having a reactive framework like this. That is a constraint So could you write down A is equal to A plus 1 for example?

Plus one. Yeah. So what would you expect to happen when you run this? By the way, you're introducing it. It sounds like this Yields an error Yeah, so feel free to run it It definitely does an error and the DAG is actually kind of giving you a hint. So if you look at the DAG visualization you can kind of see that You kind of have to make an assumption that A equals A plus 1 but that has to happen before A plus B Yeah, but we totally have to make an assumption in order for that to work and we don't like assumptions We want you to be quite explicit

And so, you know the DAG does show it in this particular case But there's a mechanism inside of Marimo that says okay We don't want you to do this because the moment that we have a lot of this mutable state Then it's very hard for us to understand in what order things have to actually run You lose that benefit of oh the order of the cells doesn't matter anymore and we value that more than being able to overwrite globals

Actually, if you're not careful and like if you know your way around Python, there are ways around this But none of those would be things I would recommend just to be Explicit like if you know what you're doing, you can't still muff around but In a lot of data analysis There's a reason why in place is true is sort of being phased out in pandas, right? Like there's a reason why all these in place operations. They kind of turn out to be a bad idea for data pipelines

If you're used to writing Python scripts, though, there is this one thing you can do so if you copy that line a is Equal to a plus one if you copy that one line and then feel free to just remove the cell Yeah, what you can do within the same cell you can you can definitely exactly right exactly so if you Yeah So what we care about is that a variable is defined and created in one cell and only in one cell And you are totally allowed to do that. That's totally fine by us

What you're also able to do is if you'll make variables that you only use Like you have a for loop Let's say like for I in range 10 or something like that and technically I would be Declared in that for loop. Mm-hmm So what you can do for moments like that is you can add a prefix so you can do something like underscore for underscore I in range hmm It's like Two or something as and then like prints I guess or whatever. Yep

So technically underscore I is now a variable and like theoretically you could say, okay, you can't use it anymore But because you add an underscore in front of it There's a convention inside of marimo that we know like, okay That's very variable should only for all intents and purposes only exists in that one cell and if it's redefined elsewhere It'll always be constrained within that one cell. That's the assumption. Oh good. Yeah. I mean this is related to the convention that Variables that start with an underscore considered private

Markdown cells and UI elements

So these are all code cells Yeah, we also have other kinds of cells and we move totally so if you let's make a new cell So let's let's close that pane on the left hand side, by the way Like we don't really need it at this point And then in the new cell you see at the bottom by the way You can see that we've got Python markdown or sequel, right? We support mark. Let's make a markdown cell for now because we don't have a data set just yet but like you can start typing in markdown there, so

Headers and yeah, this is a header And you can also add code cells there so like stuff with Python and you should see autocompletion stuff happen there as well But it wouldn't execute this oh This is just static. Yeah, so it's not being executed. Yeah. Oh nice good code syntax highlighting nice

Here I see like oh, yeah, I guess that you're used to from From markdown basically. Yeah. What was the reason again? Why the output is being rendered above the code, right? So well, so to be explicit you can't change that right? So if you if you're really more comfortable that it's showing below then that's Also totally fine I think where it came from is partially the convention that observable does it the other way around so observable is this JavaScript notebook?

The thing that is kind of nice is if you're dealing with stuff that's highly visual Then the code actually matters less than the cell output So for example, oh, I want to show a slider. Well, the sliders like the important bit But the way like it becomes a little bit more clear if you were now to sort of press command H That's the shortcut for hiding the code in the case of Markdown. Oh, it's it's really clear that the code doesn't matter. I just want to see the markdown itself. Absolutely and You will have a similar thing. We haven't shown that yet. But Marina also comes with a bunch of user interface elements

If you render those and it also kind of becomes clear that I'm declaring a UI element over here Well, then the UI element matters not the code. So the UI element should go first Yeah We have a look at those you I Less so that's also why at the top we imported that marimba library, by the way So the mo module that also contains all the UI elements and one thing that's also just good to mention It is actually kind of normal in a marimba notebook to move all of those library imports to the bottom

Yeah, so and again, it's like people have might have different conventions But like it's not the most like the import is usually not the important part of the analysis So say so why start with that? You can also just move it down especially because we understand the order of the cells in execution You can the order of cells can actually be a bit more skewed towards presentation as opposed to code execution. Yeah

Having said that what we can do now is we can add another cell Add one anywhere All right Yeah, and then if you go to mm remos module mo dot UI We get to the user interface module and a slider. I think is the easiest example to go for so let's just go with slider

If you were to run this now, you should already see a slider up here and you can already move it around Yeah, so this generates a slider However, that slider has some state and we'd like to store that state into something So let's maybe come up with a variable name for it X X sure, why not? If you were to run the cell now, the slider is going to disappear by the way, that's because we're not returning The slider itself so I have to like end with X at the bottom. Yes. Yeah need

Okay, so we have a variable that's all well and good and one thing we could now do is you could go to that Yeah, so that will be a place to put it and you can do something like plus X dot value Right, you have to be you you cannot you you cannot just do a plus X Well, because you cannot add an integer to a slider objects just like you cannot add one to a data frame objects in Python Yeah, it makes sense But if the value property of that slider that I do think is an integer in this case And now if you move the slider around again, because everything is reactive we detect. Oh, there's one cell has updated Therefore all the children have to update. Yeah, etc, etc, etc

super super smooth and The thing that is really interesting here is this is just a slider, right? But we can really start dreaming a little bit about different widgets and different user interface elements that we can add There is a standard called any widget and that like that deserves a podcast on its own that whole library Yeah, but there is now a standard between Notebook environments when it comes to making widgets. So if you follow the any widget spec, it'll work in marimo It'll work in Jupyter. It'll work in colab. It'll work in VS code There is now a standard way to write a widget once and it should work in all the notebook environments

ScatterWidget demo

That's nice. Um, so one thing I think will be fun to do here because I also want to start talking about data friends at Some point. Mm-hmm is Let's actually show what it's like to have a widget that can live Update a whole data frame and just sort of see how that way is and we can go a step further than just the slider So let's just start a new One thing we yeah, so let's just start a new cell All we can just import there. It's fine. So there's a library called draw data. So from the from draw data I would do in this case Import and there's this widget called the scatter widget scatter with a capital S and widget with a capital W Yep, and what before running this? What do you think should happen when you run this?

I'm guessing again that it's gonna error because we haven't installed raw data into our virtual environment You're warm, but actually no, that's not what's gonna happen. Hit play. All right, let's do it So it's the it's indeed throwing an error but Remo is picking up at oh the reason is because there's this library that's missing So in this case marina can say like hey, would you like to install this and it brings you a pop-up? Oh, and you can also you can also decide what version and it auto detects that we're in UV. We are in UV Yes, please keep it there And you could now go ahead and install

So, okay, this is this is quite nice, right but before moving on Could you go back to the terminal because I want to have a look at the Python file Sure. Yeah, so feel free to yeah, so just yeah, there's a notebook in there. Let's have a look Notice at the top there. Oh, yeah, it says it's a Python script It has a Python version attached, but there are also dependencies This is a thing that's made popular by UV, but it's a Python pep that I think is general I think pip could also deal with it You're able to just declare the dependencies of a Python file in the Python file itself And that also means as a side effect marimba notebooks are really reproducible. This is super nice. This is

Because I recently gave a tutorial on creating command-line tools there. Oh, yeah self-contained, right? Yeah, it's amazing for that use case too. Yeah, we can also if you want to create a command-line app from Remo in a bit by the way But goosebumps right now, yeah, it's a fun trick. But anyway, like the main thing that's important to understand here is okay Yes, it is It is a Python file that comes with a benefit that if UV does something cover for Python it automatically translates to marimo

another thing that's also just good to just briefly show is If you scroll down you'll see that the cells that we defined are actually Python functions under the hood. Yeah, and oh, there's that markdown Cell that we've made it's actually still a Python cell. It's just that we we've wrapped Marimo's markdown utility around it. Hmm and what you can also spot if you go to the top You can actually see that The first cell it imports marimo and notice how it returns it Yes, then if you go to the cell below, you'll notice that that cell actually takes marimo's input and it emits X

Oh Is that because we're using the marimo? Yes So library here. So yeah, so this is the mechanism So what you're seeing at work here is kind of a mechanism that detects what are the inputs of the cell and what are the? Outputs that children use the later children will use

So it's also reactive in the sense on on the modules that you use how Could you rephrase that? Well, so a common common issue that I run into when using Jupyter notebook is when I'm working on a notebook and A module that I'm creating myself or some external script That is being imported into the notebook. And when I update module, yeah, is that is that what's Yeah, well that it Sort of so what you're seeing here is so what you're seeing here in scope is a little bit more How does marimo deal with it internally but a very similar mechanism if we now go back to the notebook by the way

So if you look at the bottom bar the footer you're gonna notice that there's a couple of buttons on the left-hand side so Are you gonna? Yeah, so we've an errors pane We've got a terminal as well, but then there's the on startup then on cell change and then on module change. Oh So yes, so what you can determine here like, okay when the notebook starts do I auto run? Yes, no, or do I want to do it in a lazy way? The lazy way is there such that if you have this one cell that is importing like gigabytes of data You don't want that to automatically rerun every single time So we offer a setting that says okay auto run or don't run at all or do it in a lazy way

Yeah Lazy means manual control kind of Jupyter style, but you'll notice that you're able to do that on cell changes But also on module changes so the pattern that you've described you have a separate Python file That's your let's say that you're importing that yeah, we can actually watch for changes in that file Wow, that is really nice like I use a pattern all over the place I will say you can actually go a step further Because what you can also do from a marimba notebook again because it's a Python file You can also declare functions that then other Python files import that is also something you can do

hmm So I've got a couple of these web apps that are doing something super machine learning specific There's like this one part of the app that is really doing The app is called like remember dot cards. It is for like making flashcards, and there's like There's a mechanism on like okay, you just practice this card you got it right and how many days do I have to? Sort of bring back the card for you to practice it again Like the rest of the app is like a normal web app But this is one function that I need it does a lot of machine learning That I've defined in a marimba notebook and because it's a Python file I can just add it to the web app natively and I can import it when I need it but I can still debug it with charts around if I need that to I guess also like a Very interesting secret use case for marimo because it's a Python file. You can have it be part of your normal Python, whatever

I Want to go back to the Python file? Just sure just a moment. Yeah. I was curious. How is the the markdown cell? Okay. Yeah, so it that's also a Python function and It returns a markdown Yeah, you'll notice that the deck the decorator it says hide code equals true like because the code was hidden We specified that what you could do though is you could kind of just copy that it says mo.md So there's a markdown function on the marimo sub module and you can also call that from inside of marimo Yeah in a Python cell and it will run on the same thing So technically the markdown cell is more a little bit of UI sugar under the hood. It's still a Python exactly cell and this Returns I guess a markdown Object that has a display method or something a wrapper

yeah, so the the sort of we we kind of reuse the Jupiter convention so a lot of objects that have Underscore wrapper underscore HTML underscore like that's a function that the Jupiter really likes to use However, there are these moments When maybe you want to be marimo specific, so there's also the underscore display method that you can implement as well Yeah, as far as marimo is concerned the if the display thing is implemented We will go ahead and use that because that's a signal that someone took the effort of doing something very marimo specific And because what you could do is you could return marimo objects that we know how to render right so that that's the thing that You could do However, we will also pick up on the Jupiter standard if there's a library that implemented pretty Visualization things for Jupiter then that's a very easy way for us to also make sure it works in marimo. Yeah. Yeah, very nice

I mean this One thing that of course is a downside of Jupiter notebooks Is that when you whenever you change something and you you commit it you get these huge diffs? Because it's all yeah, I mean so it There are like I don't want to be like in fairness to Jupiter, right? I mean there are tools to help you with that situation and a lot of those tools come with some pretty good ideas like okay Let's remove the outputs and there are these like pre commit hooks that you could use And you know those are not bad ideas. They're actually quite great

Yeah, however, the the one thing that you should also shouldn't forget is that Jupiter was designed not just to do Python So Jew pie turn like Julia Python and are those kind of the design inception thing? Yeah And with that you also have to make some some choices and like a really convenient thing for us is that we were able to Say no like pythons gonna be the primary citizen and I'm sure we'll do sequel and we'll do markdown But it's gonna be Python and that allows us to just do everything from Python files Jupiter couldn't ever really do because that's not what it was designed to do. That's that's a very that's a fair statement. Yeah. Yeah

Two-dimensional notebook layout

Because we were working on the scatter widget and that's kind of cool But I think we're the notebook is kind of getting a little bit crowded. So let's do a party trick Could you go to the? hamburger icon on the upper right hand side Yeah, sorry the cog I mean the cog that's next to it. Yeah. Yeah, so there's a display part of the menu there Yeah, could you yeah click it and could you go to columns instead?

So a thing that we can do because again the order of oh you actually that's that's the yeah I thought that yeah, right. No worries. No worries. Could you zoom out a bit now, I guess In the browser Yes, so you notice there's a plus icon there now, right So you can add a column So you can do left right swiping and like this is also the thing that it takes a while to get used to but your notebook Can't actually be two-dimensional So something I really like to do in teaching is I have like one column that has all the imports and setting stuff up Then there's a column with like boilerplate then there's a column with helper functions and then there's this other column where all the action is like all the widgets and like the Final output and it's up to you to decide where do you want to you want to move that left or right? But you can start thinking about a notebook more in a two-dimensional fashion if that makes sense

So in this case, we just imported the scatter widget. Let's now make a column That's all about doing something with a scatter widget So what you can do now is you can just yeah, so loads the scatter widget just to clarify. It's still the same notebook Yep, right. It's not like I have two notebooks open next to each other All right, same same same same notebook and the same mechanism we again Holistically look at all the different cells one thing you can do if you zoom out it one more time again

But anyway, what we can do now is like use the scatter widget in that cell on the right. Yeah Yeah, tell me what to type Scatter widget so ST and then tab completion should take over. Yeah, and we can run this now And lo and behold now we might need to make it wider actually for this thing to properly fit But this is this is the widget that we want All right. So The idea behind the widget is you can draw around Yeah, okay this is good enough so you can draw around you can draw data points and the idea here is that these data points Can actually then be turned into a data frame. So you've got that famous I could learn image of all the different classifiers We're thinking what this widget was. Oh, you might want to be able to draw that widget yourself And this is the way to do it. However, this is now in any widget and we would like to Do something such that any widget can really deal with it in a nice way. So what you would do if you would go to the code at this point and where we declare scatter widget and we're gonna Actually assign the scatter widget on here. Yes. Yeah, so we got to assign it to a variable. That's like the first thing we got to do

Yep, and then also show the variable at the bottom because otherwise it won't render exactly. Yeah, right Okay, so that's that's step one step two is we got to wrap that scatter widget with a marino function so mo dot ui dot any widget I think Yep Let's move scatter widget in there and Visually, it will all look the same. But now when you run this What you can do? Yeah, you should be able to access the value

Data sources

And like a nice thing about this is we have a data frame widget as well that people Sometimes miss out on so a data frame that we see which it could also be a table from a SQL database It could be polars. It could be pandas. We we use narwhals under the hood But the thing that we really like is having giving you something that's a bit more interactive than just like a static HTML table element so There's pagination you can move left and right

There's one feature I kind of really want to brag about that was added recently for a scroll down so You'll notice that there's buttons on that widget so you can paginate you can go left and right you can set the the size You will also notice there's a download button there So if this widget was used in a web app and this was for a business user The business user can just copy this to clipboard to get it into Excel for example if that's something they're interested in or they can Download it and open it up in whatever thing that they like to use

But if you now scroll to the right on the same height you're gonna see a magnifying glass Yes, yeah, yeah, this brings up a search pane so now if you were to type in a number at 2 8 2 for example There it is. It's up here. Yeah. Yeah Which number I think 2 8 2 actually I'm not sure if it does numbers But yeah, so any road that has the number 2 8 2 appear anywhere We are now filtering life. That's basically what's happening here nice

So that's definitely kind of a nice thing what you can also do is just remove the filter You can also select the columns if you want to do filtering by the way that's also something that you can do so you can see the types for example, but you can like do all sorts of sorting and Copy the names and The stuff you would like to have around that's definitely there one of the coolest features that's almost kind of hidden is if you go to the right of the magnifying glass Right. Yeah. Yeah So that's the rove. That's yeah that one you want if when you click a little column X Yes, so this shows summaries of columns So if you were interested in I don't know checking the distribution of X you can click it

another thing I want to mention about this data frame that I think is also good to show is if you go to the Left-hand panel one more time like all the the buttons you're gonna see this database icon Yep, so our data sources. Yeah Yes, let's now assign that data frame to a variable so we can do something DF equals data as polars. Oh

Now the data frame is Special citizen. It's we've only yeah. Yes. It's a data source. So It's we already keep track of all the functions and variables that you've got. So Right above the database icon on the left sidebar. You're gonna see this thing with F Those are all the variables that are around. Those are all the objects Kind of like I think our studio always had that MATLAB always had that so like that pain is definitely there No, but a data source is special Because what you can do is you can go there and one thing you could do is you could hit the plus icon so if you hover over the data frame itself and no, yeah, and then hit plus you can add the table to the notebook and so like You can immediately get like a view

Started and in the case of the data frame that we made ourselves is not that relevant But and that is the plus I can you just hit and you can also add a data source as in Oh, I've got a database of lots of tables or I've got a patchy iceberg or something like that So if you now go back to the to the panel and you hit the plus icon on top Then you can add a connection to whatever Thing where your data is Redshift got added this week, by the way, so we tend to add a lot of these things now

So one thing you could do for example just for fun, let's have sequel light if you go to the top I think we have a sequel light thing. Yeah, let's just add a random database path. I Think sequel lights dot DB Well, it doesn't exist. It will just make an empty file. I think so that that's that's usually why I see. Yeah. Okay, okay

So it's going to detect that that's a sequel alchemy Type of variable and now if you run that cell It detects that we need sequel alchemy. Yeah worries Yep. Okay, and then you can close that with pain, but you do see there's a database that's now been added and You can also see that there's no tables in it But what you can do is like if you had a large database with lots of tables You can you can still do the plus icon and get like tables moved in very quickly You can also talk sequel to these tables if you wanted to

But the real cherry on top here if you go to the to this left sidebar one more time You're gonna see that there's a little robot icon. So it's kind of in the middle. Yeah chat with AI So you need to edit AI settings here, which we're not gonna do Once you've once you've configured your keys and all of that What you can do is you can write at and then name of data frame or name of data source And then we will add the schema information to the prompt for you So you can do things like oh, I want to have this table I want you to generate the sequel for this table that does this and then Chat TPT or whatever LLM you've got is going to be made aware of like, okay And that table has these columns with these types. Here's examples of it that are going to help it write the right query for you Wow

It can also generate the Altair and Polar's stuff for you, by the way, but this is why I want to emphasize We are got we are working on extra features for like good prompt engineering within this notebook as well Schemas really matter also for like LLMs basically, so that's also why You want to be aware of the data frames that you've got and it's also why marimo has like a special case citizen situation for them

Wow, I must say Vincent, I'm Very impressed and also a little bit overwhelmed already Now before we dive into The Quarto plug-in. Yeah, we should move to that. You've been creating before we go into that What are some good ways for people to find out more about marimo? If they want to get started with this

Revisit the different features that we've just discussed So I mean, I think this video is already a pretty good starting point. It's like we are going over all the Is there some documentation? Yeah. Yeah. So if you if you go to marimo.io, you're gonna see the big website Few things and like this is a little bit of marketing material, right? But there's a docs page that you can go to on top. We also have a blog We also have a discord link up there if you're interested But this doc this doc really contains a whole lot. There's tons of examples. There's tons of guides There's even a guide for like hey, I'm used to Jupiter How do I like acquaint myself with marimo as quickly as possible without hitting my head too much Because you know a few things are definitely different

So like the docs are big is what I what I can say on that one Yeah, besides that some people like to watch videos instead of looking at docs all day So we've also got like a pretty big YouTube channel at this point We tend to release between 8 and 10 videos a week. Most of them are YouTube shorts like just clear on that But Ones that are relevant Yeah, so the thing that we do like we use the YouTube shorts to have like a daily It's the thing that's working out surprisingly well for us So we have so many features that like making a video that has all of them is gonna end up being super long So what we have with the shorts if you follow us on YouTube You're basically gonna get this one video a day of like a feature in marimo And half of those features will be new and the other half will just be stuff that people keep on asking us questions about So that can also be a nice way to get like a little trickle of oh, here's a feature Here's a feature without it being like overly overwhelming. Basically nice. We'll add a link in the description

Marimo plugin for Quarto

Okay, all right, so we're gonna move to the quarto thing there's one thing I want to mention Before getting there that's important to understand perhaps Could you go to a github repository But github repository is going to help explain what we're doing on the quarto side of thing because we're doing something as a bit unconventional One no one that I've got in my mind, so could you go to github slash coning, which is my Coning with ko a n ing. That's my username and then slash and I think mo talk would be a good one Mo mo talk. Yeah

Right, right try we're gonna do something so this contains a widget that you can use in marimo But the thing that's interesting here is not so much the code. It's actually the github pages. Could you go there?