canna713 downloadsOpen marimo (.py) and Jupyter (.ipynb) notebooks as interactive embedded views.
An Obsidian plugin that opens marimo (.py) and Jupyter (.ipynb) notebooks as interactive embedded views directly inside Obsidian panes.
Desktop only. This plugin spawns native processes and is not available on mobile.
.py): launches marimo edit in headless mode and embeds the live UI in an Obsidian pane..ipynb): launches jupyter notebook or jupyter lab and embeds the interface in an Obsidian pane..py or .ipynb file in the file explorer opens it as an embedded notebook instead of a plain text editor..py or .ipynb file and choose Open as notebook.| Requirement | Notes |
|---|---|
| Obsidian ≥ 1.0.0 | Desktop only |
| marimo | Required for .py notebooks |
Jupyter (notebook or lab) |
Required for .ipynb notebooks |
| Python environment with the above installed | Make sure the executables are on PATH or configure their full paths in settings |
Install the notebook servers with pip:
pip install marimo
pip install notebook # classic Jupyter interface
# or
pip install jupyterlab # JupyterLab interface
Verify the installations:
marimo --version
jupyter --version
main.js, manifest.json, and styles.css from the latest release.<vault>/.obsidian/plugins/obsidian-notebooks/.If marimo or jupyter are not on the PATH that Obsidian sees (common when using pyenv, conda, or virtual environments), supply the full path in settings.
Find the paths in your terminal:
which marimo # e.g. /Users/you/.pyenv/shims/marimo
which jupyter # e.g. /Users/you/.pyenv/shims/jupyter
Paste the output into Settings → Notebooks → Marimo → Executable and Settings → Notebooks → Jupyter → Executable.
Go to Settings → Notebooks → Watched folders and add vault-relative folder paths, one per line:
notebooks
research/data
Files inside these folders open automatically as notebook views when clicked. Leave the field empty to open all .py and .ipynb files as notebooks automatically.
| Method | How |
|---|---|
| Click | Click any .py or .ipynb file in the file explorer |
| Right-click | Open as notebook in the context menu |
| Command palette | Notebooks: Open as notebook |
| Setting | Default | Description |
|---|---|---|
| Executable | marimo |
Path to the marimo binary. Use the full path if marimo is not on Obsidian's PATH. |
| Base port | 2718 |
Port for the first marimo server. Additional open notebooks use consecutive ports. |
| Extra arguments | (empty) | Flags appended to every marimo edit invocation. --headless and --no-token are always included automatically. |
| Setting | Default | Description |
|---|---|---|
| Executable | jupyter |
Path to the jupyter binary. Use the full path if jupyter is not on Obsidian's PATH. |
| Interface | notebook |
Choose notebook (classic) or lab (JupyterLab). |
| Base port | 8888 |
Port for the first Jupyter server. Additional open notebooks use consecutive ports. |
| Extra arguments | (empty) | Flags appended to every jupyter invocation. --no-browser, token disable, and XSRF disable are always included automatically. |
| Setting | Default | Description |
|---|---|---|
| Extra PATH directories | (empty) | Newline-separated directories prepended to PATH for all notebook servers. Useful when Obsidian's inherited PATH is missing your Python environment (e.g. pyenv shims or a virtualenv). |
| Watched folders | (empty) | Newline-separated vault-relative folder paths. When non-empty, only .py and .ipynb files inside these folders open automatically as notebooks. Leave empty to auto-open all matching files. |
Obsidian inherits a minimal PATH that may not include your Python environment. Fix with one of:
/Users/you/.pyenv/shims)./usr/local/bin/marimo).Run which marimo or which jupyter in a terminal to find the correct path.
--no-token automatically. If the login page appears, make sure you have not added conflicting token flags in Extra arguments.--ServerApp.token= --ServerApp.disable_check_xsrf=True automatically. If you have old values like --NotebookApp.token= in Extra arguments, remove them — those flags are rejected by Jupyter ≥ 7..py or .ipynb.marimo uses Node.js for its GitHub Copilot integration. Add the directory containing node to Settings → Notebooks → Extra PATH directories, e.g.:
/Users/you/.nvm/versions/node/v22.0.0/bin
The server working directory is set to the folder containing the notebook, so imports relative to the notebook file should resolve correctly. If they fail, check that the imported files are in the same directory as the notebook.
The plugin waits up to 20 seconds for the server to accept connections. A Retry button appears on timeout. If your machine or notebook is slow, click Retry once the server has had more time to start.
Servers are stopped automatically when their pane is closed. If Obsidian crashes, orphaned processes may remain. Kill them with:
pkill -f "marimo edit"
pkill -f "jupyter notebook"
pkill -f "jupyter lab"
git clone https://github.com/Canna71/obsidian-notebooks
cd obsidian-notebooks
npm install --legacy-peer-deps
npm run dev # watch mode — rebuilds on every save
npm run build # production build
Symlink or copy the plugin folder into your test vault's .obsidian/plugins/ directory. Install the Hot-Reload plugin for automatic plugin reloading during development.
Source layout:
| File | Purpose |
|---|---|
src/main.ts |
Plugin entry point, settings, command and event registration |
src/MarimoView.ts |
ItemView that hosts the embedded iframe |
src/ProcessManager.ts |
Spawns and tracks marimo / Jupyter server processes |
src/MarimoSettingTab.ts |
Settings UI |