This release improves marimo's code intelligence with runtime completions, expands notebook conversion capabilities, and includes several UI/UX improvements and bug fixes.
✨ Highlights
Dynamic key completion
marimo now offers runtime key completions for dictionaries, dataframes, and other subscriptable objects (#5618). Unlike static LSP completions, these suggestions come from inspecting objects in memory, enabling completions that are only knowable at runtime.
When you type dataframe["
, marimo suggests column names. When accessing dictionary keys, you'll see all available keys as completions. This works with:
- Dictionary keys -
my_dict["
shows all available keys - DataFrame columns -
df["
suggests column names - Custom objects - Any object implementing
_ipython_key_completions_()
py:percent support in marimo convert
marimo convert
now supports converting py:percent format (#5686). Convert your py:percent notebooks directly to marimo notebooks:
# Requires jupytext
uvx --with=jupytext marimo convert pypercent_notebook.py -o notebook.py
The converter also works for ingesting regular Python scripts. If you try to open a non-marimo Python script with marimo edit
, you'll now be prompted to convert it first.
Column layout improvements
Keyboard navigation is now supported with column layouts! You can move between columns using the arrow keys in command mode (or h
/l
for Vim users) (#5760). We've also redesigned the column layout UI (#5772).
Console output text wrapping
Long console outputs are now easier to read with the new text wrapping toggle (#5739). A button appears on hover in the top-right corner of console outputs, letting you toggle between wrapped and unwrapped text.
🚨 Breaking changes
-
Vim keybindings now require
Ctrl+Escape
(orCmd+Escape
on macOS) to enter command mode (#5815, #5837).Previously, pressing Escape from Vim normal mode would enter Command Mode, but this caused confusing behavior and accidental mode switches for Vim users. Adding this extra modifier prevents unintended exits from normal mode while letting you choose whether to use Command Mode at all.
✨ Enhancements
- Add duckdb dialect for codemirror (#5786)
- Prevent accidental overwrites and converter for non-marimo Python scripts (#5686)
- Expand hidden code on go-to-definition (#5803)
- Bypass delete confirmation for empty cells (#5804)
- Migrate LSP from
@sourcegraph/vscode-ws-jsonrpc
tovscode-ws-jsonrpc
(#5798) - Better icon caching (#5791)
- Revamp column UI with kanban-inspired design (#5772)
- Support keyboard navigation across columns in command mode (#5760)
- Add copy button in console, and fix ctrl-a to copy all (#5765)
- Don't persist minimap state open/closed state between page reloads (#5757)
- Add text wrapping toggle for console output (#5739)
- Add deployment doc on how to schedule marimo (#5728)
- Move cell left/right in edit mode (#5808)
- Dynamic SQL keyword completion based on dialect (#5775)
- Improve AI prompt to not comment on the code (#5822)
- Better formatting for google docstrings (#5750)
- Better jupyter widget warning for unsupported (#5785)
- Identify ddl, dmls and run clickhouse.command instead of query (#5824)
- Experimental backend aggregations in table charts (#5704)
- Interactive key completion (#5618)
🐛 Bug fixes
- Cache invaliadation for external decorators (#5758)
- don't show sql bottom panel when cell is hidden (#5826)
- Fix cell movement shortcuts on non-Mac keyboards (#5759)
- Move cell delete ops inside
setState
callback to prevent race condition (#5813) - Conditionally show tip for invalid status in interactive terminal (#5790)
- Copy-paste cell mime-type (#5789)
- Cache invaliadation for external decorators (#5758)
- Mo.plain_text rendering (#5764)
- Change columns in place for mo.ui.dataframe and add tests (#5763)
- Altair's code gen with comment (#5767)
- Restrict
Shift+Delete
in edit mode to empty cells only (#5766) - Allow marimo to open the markdown file format over http (#5742)
- Deemphasize unreferenceable cells in minimap when no cell is selected (#5754)
- chore/fix: parse correct message for anywidget (#5741)
- Ensure cell connections render above unselected cells in minimap (#5732)
- Allow partial chatModelConfig (#5749)
📚 Documentation
- Change vim mode command entry from
Shift+Escape
toCtrl/Cmd+Escape
(#5837) - Molab (#5809)
- Update documentation with
Shift+Enter
command mode vim bindings (#5816) - Document Python script conversion support (#5795)
- Fix file upload docs (#5788)
- Add "Understanding dataflow" user guide (#5737)
- Make gifs consisent width on docs landing page (#5735)
- Remove dead link (#5729)
- Add zh-tw translation section for sharing cloud notebooks (#5821)
- Two tiny fixes to tutorial text. (#5812)
🔬 Preview features
📝 Other changes
- Check for missing cursor for sqlalchemy native output (#5823)
- Update base-url on remote healthy (#5787)
- Add suspense for vega charts (#5770)
- Add binary handling in tables (#5762)
- Skip broken datetime tests (#5753)
New Contributors
Full Changelog: 0.14.13...0.14.14