Show HN: Marimo – an open-source reactive notebook for Python
448 points| akshayka | 2 years ago |github.com
GitHub repo: https://github.com/marimo-team/marimo
In marimo, a notebook’s code, outputs, and program state are always consistent. Run a cell and marimo reacts by automatically running the cells that reference its declared variables. Delete a cell and marimo scrubs its variables from program memory, eliminating hidden state. Our reactive runtime is based on static analysis, so it’s performant. If you’re worried about accidentally triggering expensive computations, you can disable specific cells from auto-running.
marimo comes with UI elements like sliders, a dataframe transformer, and interactive plots that are automatically synchronized with Python [3]. Interact with an element and the cells that use it are automatically re-run with its latest value. Reactivity makes these UI elements more useful and ergonomic than Jupyter’s ipywidgets.
Every marimo notebook can be run as a script from the command line, with cells executed in a topologically sorted order, or served as an interactive web app, using the marimo CLI.
We’re a team of just two developers. We chose to develop marimo because we believe that the Python community deserves a better programming environment to do research and communicate it; experiment with code and share it; and learn computational science and teach it. We’ve seen lots of research start in Jupyter notebooks (much of my own has), only to fail to reproduce; lots of promising prototypes built that were never made real; and lots of tutorials written that failed to engage students.
marimo has been developed with the close input of scientists and engineers, and with inspiration from many tools, including Pluto.jl and streamlit. We open-sourced it recently because we feel it’s ready for broader use. Please try it out (pip install marimo && marimo tutorial intro). We’d appreciate your feedback!
[1] https://github.com/marimo-team/marimo
[+] [-] simonw|2 years ago|reply
You've solved that incredibly well!
I also really like that the Marimo file format is just Python. Here's an example saved file from playing around with the intro: https://gist.github.com/simonw/e6e6e4b45d1bed9fc1482412743b8...
Nice that it's Apache 2 licensed too.
Wow, I just found the GitHub Copilot feature too!
[+] [-] mscolnick|2 years ago|reply
We are thrilled to see you have such a strong positive reaction. It means a lot coming from you - I initially learned web development using Django and landed my first contracting gig with Django.
I drifted away from writing Python and towards Typescript - but marimo has brought me back to writing Python.
[+] [-] LoulouMonkey|2 years ago|reply
I'm a big fan of your work, and as I've learnt a lot from reading your blog posts over the years, I'd be curious to know a bit more about typical use cases for wanting to work with Observable notebooks.
The only reason why I'm using A JavaScript notebook tool (Starboard.gg) is to be able to access cool visualisation packages like Anychart or Highcharts.
Given the hype around Observable notebooks, I feel that I'm missing something.
What makes you decide to start something in an Observable notebook rather than in Jupyter?
Thanks!
[+] [-] bluish29|2 years ago|reply
This does to address directly the second problem. It does however by sacrificing flexibility. I might need to change a cell just to test a new thing (without affecting the other cells) but thats a trade off if you focus on reproducibility.
I know that requirements.txt is the standard solution to the other problem. But generating and using it is annoying. The command pio freeze will list all the packages in bloated way (there is better ways) but I always hoped to find a notebook system that will integrate this information natively and have a way to embed that into a notebook in a form that I can share with other people. Unfortunately I can't see support for something in any of the available solutions (at least up to my knowledge).
[+] [-] akshayka|2 years ago|reply
It's a bit challenging because Python has so many different solutions for package management. If you have any ideas we'd love to hear them.
[+] [-] 331c8c71|2 years ago|reply
It comes with costs and the gpu-related stuff is especially tricky e.g. https://www.canva.dev/blog/engineering/supporting-gpu-accele...
[+] [-] BerislavLopac|2 years ago|reply
[+] [-] Micoloth|2 years ago|reply
Since I've thought about this for a long time (I've actually even made a very simplified version last year [1]), I want to contribute a few thoughts:
- cool that you have a Vscode extension, but I was a little disappointed that it opens a full browser view instead of using the existing, good Notebook interface of Vscode. (I get you want to show the whole Frontend- But I'd love to be able to run the Reactive Kernel within the full Vscode ecosystem.. Included Github Copilot is cool, but that's not all)
- As other comments said, if you want to go for reproducibility, the part about Package Management is very important. And it's also mostly solved, with Poetry etc...
- If you want to go for easy deployment of the NB code to Production, another very cool feature would be to extract (as a script) all the code needed to produce a given cell of output! This should be very easy since you already have the DAG.. It actually even existed at some point in VSCode Python extension, then they removed it
Again, great job
[1] https://github.com/micoloth/vscode-reactive-jupyter
[+] [-] smacke|2 years ago|reply
nbgather used static slicing to get all the code necessary to reconstruct some cell. I actually worked with Andrew Head (original nbgather author) and Shreya Shankar to implement something similar in ipyflow (but with dynamic slicing and a not-as-nice interface): https://github.com/ipyflow/ipyflow?tab=readme-ov-file#state-...
I have no doubt something like this will make its way into marimo's roadmap at some point :)
[+] [-] paddy_m|2 years ago|reply
1. Can you describe your interactive widget story? I see that you integrated altair, and there is some custom written react code around it [0] [1]. I'd be interested in porting my table widget to your platform at some point.
2. How much, if any does this depend on the jupyter ecosystem?
3. How does this interact with the jupyter ecosystem?
[0] https://github.com/marimo-team/marimo/blob/b52faf3caf9aa73f4... [1] https://github.com/marimo-team/marimo/blob/b52faf3caf9aa73f4...
[+] [-] akshayka|2 years ago|reply
2. marimo was built from scratch, it doesn't depend on Jupyter or IPython at all.
3. marimo doesn't interact with the Jupyter ecosystem. We have brainstormed the possibility of a compatibility layer that allows Jupyter widgets to be used as marimo plugins, but right now that's just an idea.
[+] [-] ingenieroariel|2 years ago|reply
Congrats, this looks very useful and awesome.
[+] [-] wisty|2 years ago|reply
Both of these solve the most important part of this problems in iPython - horrible git interaction, horrible programming practice to discouraging writing library files, though Jupyter fixes most of the weird non-deterministic behaviour by forcing you to rerun the script every time you load it (rather than reactive techniques). State is OK for power users but it's known to be a massive pain for people who are just learning programming, and an issue in large projects or with interaction.
With this new project having reactive updates I think it's definitely going to be great for beginners, or in gnarly projects.
I wonder if it runs on pyodide (a cPython compiled to run in the browser, with matplotlib and scipy bundled).
[+] [-] smacke|2 years ago|reply
[+] [-] nnx|2 years ago|reply
I guess it's still very early but the onboarding for Mario VSCode is not great at the moment, no idea how to actually start writing a Marimo notebook (no "Create: New Marimo notebook" option like Jupyter's).
Then I then tried clone the cookbook repo, and get "module not found" errors that are even less friendly than when it happens on Jupyter: have to figure out which cell the error actually comes from to even know which module is missing.
[+] [-] SushiHippie|2 years ago|reply
Have you looked into WASM? Something like a jupyterlite [0] alternative for marimo?
And are there plans to integrate linting and formatting with ruff? [1]
[0] https://jupyterlite.readthedocs.io/en/stable/
[1] https://github.com/astral-sh/ruff (ruff format is almost 100% compatible with black formatting)
[+] [-] akshayka|2 years ago|reply
A ruff integration is a great idea. I'll add it to the roadmap.
[+] [-] yowlingcat|2 years ago|reply
[+] [-] peter_l_downs|2 years ago|reply
https://soltech.com/blogs/blog/how-to-care-for-your-marimo-m...
[+] [-] rossjudson|2 years ago|reply
[+] [-] hedgehog|2 years ago|reply
[+] [-] noahlt|2 years ago|reply
Having an excellent cache might reduce spurious re-running of cells, but I wonder if it would be sufficient.
[+] [-] zengid|2 years ago|reply
[+] [-] JayCeeM|2 years ago|reply
[+] [-] oakhaven|2 years ago|reply
I wonder if the state/data in the generated app are stored server-side of sent to browser.
I went through the slider example in the intro and I noticed that when I change the icon, the slider position goes back to 1. I tried to fix it so that the slider-selected value is preserved over icon changes, but didn't manage, it doesn't seem straightforward.
[+] [-] Onawa|2 years ago|reply
[+] [-] TtjM|2 years ago|reply
I have yet to try Marimo but synchronised code cells are what seems to set it apart. Quarto + jupyter-cache [1] was the closest I have managed to get to that experience but that approach has its constraints.
[1]: https://github.com/executablebooks/jupyter-cache
[+] [-] bsdz|2 years ago|reply
[+] [-] akshayka|2 years ago|reply
[+] [-] robsh|2 years ago|reply
[+] [-] bitsrat|2 years ago|reply
I am thinking of Jupyter as all the components in this diagram - https://docs.jupyter.org/en/latest/projects/architecture/con...
Sorry did not get to look into the codebase yet
[+] [-] mscolnick|2 years ago|reply
[+] [-] rrr_oh_man|2 years ago|reply
I swear it's the bane of my existence whenever doing anything inside Jupyter. Coming from RStudio it always feels like operating in a vacuum.
[1] https://rstudioblog.files.wordpress.com/2015/02/s3.png
[+] [-] mscolnick|2 years ago|reply