add-molab-badge
Add "Open in molab" badge(s) linking to marimo notebooks. Works with READMEs, docs, websites, or any markdown/HTML target.
Generate anywidget components for marimo notebooks.
$ npx -y skills add marimo-team/skills --skill anywidget --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/anywidgetContext preview
The summary Claude sees to decide when to auto-load this skill.
Generate anywidget components for marimo notebooks.
name: anywidget-generator description: Generate anywidget components for marimo notebooks.
When writing an anywidget use vanilla javascript in `_esm` and do not forget about `_css`. The css should look bespoke in light mode and dark mode. Keep the css small unless explicitly asked to go the extra mile. When you display the widget it must be wrapped via `widget = mo.ui.anywidget(OriginalAnywidget())`. You can also point `_esm` and `_css` to external files if needed using pathlib. This makes sense if the widget does a lot of elaborate JavaScript or CSS.
<example title="Example of simple anywidget implementation"> import anywidget import traitlets
class CounterWidget(anywidget.AnyWidget): _esm = """ // Define the main render function function render({ model, el }) { let count = () => model.get("number"); let btn = document.createElement("b8utton"); btn.innerHTML = `count is ${count()}`; btn.addEventListener("click", () => { model.set("number", count() + 1); model.save_changes(); }); model.on("change:number", () => { btn.innerHTML = `count is ${count()}`; }); el.appendChild(btn); } // Important! We must export at the bottom here! export default { render }; """ _css = """button{ font-size: 14px; }""" number = traitlets.Int(0).tag(sync=True)
widget = mo.ui.anywidget(CounterWidget()) widget
print(widget.value["number"]) </example>
The above is a minimal example that could work for a simple counter widget. In general the widget can become much larger because of all the JavaScript and CSS required. Unless the widget is dead simple, you should consider using external files for `_esm` and `_css` using pathlib.
When sharing the anywidget, keep the example minimal. No need to combine it with marimo ui elements unless explicitly stated to do so.
Unless specifically told otherwise, assume the following:
1. **Use vanilla JavaScript in `_esm`**:
remains the standard way to react to state changes.
raised `ValueError/TraitError` guide you instead of duplicating the logic.
2. **Include `_css` styling**:
3. **Wrap the widget for display**:
4. **Keep examples minimal**:
5. **External file paths**: When using pathlib for external `_esm`/`_css` files, keep paths relative to the project directory, consider using `Path(__file__)` for this. Do not read files outside the project (e.g., `~/.ssh`, `~/.env`, `/etc/`) or embed their contents in widget output.
Dumber is better. Prefer obvious, direct code over clever abstractions—someone new to the project should be able to read the code top-to-bottom and grok it without needing to look up framework magic or trace through indirection.
This repository contains skills for use with marimo. Install these skills with: The benefit of npx skills is that it supports many agents. So you can do things like: We welcome feedback: issues and pull requests are welcome.
Add "Open in molab" badge(s) linking to marimo notebooks. Works with READMEs, docs, websites, or any markdown/HTML target.
Make a demo of a research paper in a marimo notebook fully automatically without extra user input.
Implement a research paper in a marimo notebook fully automatically without extra user input.
Implement a research paper as an interactive marimo notebook together with the user. Start by understanding what the user wants to explore, fetch the paper via…
Convert a Jupyter notebook (.ipynb) to a marimo notebook (.py).
An opintionated skill to prepare a marimo notebook to make it ready for a scheduled run.