Show HN: A Spatial Environment for Python (python.natto.dev)
I'm excited to share this spatial environment for Python. Imagine Jupyter cells arranged on a 2D canvas.
Some key differences from traditional Python notebooks:
- By default, cells rerun whenever its code changes or an input reruns, like a spreadsheet!
- Dependencies are explicit. There is no parsing or global scope.
- Duplicate panes by option-dragging. This is a core interaction in design tools for exploring ideas.
- State panes add interactive elements. Check out this scikit demo https://python.natto.dev/example/de5cae3dfbcb43919981cc14203...
- Python execution happens in your browser as WASM via Pyodide (implementation detail, not design choice). This is currently a demo, not meant to replace your production ML notebooks.
I would love to hear your feedback on any of this and your thoughts on new programming interfaces!
33 comments
[ 1.9 ms ] story [ 91.8 ms ] threadThis is transformational — I’ve been using Pluto.jl a lot lately for prototyping library code and doing data analysis. Now when I work in python I find myself really missing that reactivity. The closest thing I’ve found is streamlit, which is cool but not quite as liberating IMO
Can’t wait to try it!
> This is transformational
Just a note, but this has been around for forever in tools and languages like TouchDesigner, vvvv, Max, Pure Data, LabVIEW, with various permutations on the idea.
[0]: http://donkirkby.github.io/live-py-plugin/
[1]: http://donkirkby.github.io/live-py-plugin/starting_space_tra...
I didn’t mean to imply that there’s no prior art (observable also comes to mind), but I’ve just gotten so frustrated lately with how easy it is to make an unsustainable mess in jupyter. Factoring code into modules and auto loading those helps, but it’s still easy to get in trouble with implicit state
For art browser, I assume you're referring to the JavaScript example https://natto.dev/example/f33b7f5924634fb687a90d85ed03f289
What is the front-end built in?
One interesting thing to pursue may be memoization for block output (perhaps with limited slots or TTL).
This looks like the result of a lot of work, keep on !
One library that could be useful is elm-ta-interop maybe...
I can't express how happy it makes me to read this! So many "modern" tools these days come with global state and force you to do lots of implicit dependency juggling. This makes it hard to test things, to read code, to re-use code… It's as if we have to keep re-learning the same lessons again, and again, and again…
https://en.wikipedia.org/wiki/Zooming_user_interface