Skip to content
VellumOpen Vellum

Run code in 25 languages, right inside a page.

A fenced code block in a page becomes a cell you can run. The code stays plain Markdown; outputs, tables and charts are saved with the page. Everything runs in a sandbox on your device.

A Vellum page with a JavaScript cell that shares a table and a SQL cell that sums it, next to the page’s Markdown.
A Vellum page with a JavaScript cell that shares a table and a SQL cell that sums it, next to the page’s Markdown.

Code that lives in your pages

Write a fenced code block with a language, as you would on GitHub or in Obsidian. In the reading or split view it becomes a cell with a Run button. The code stays in the page’s Markdown, so pages stay portable; what a cell prints, the tables it returns and the charts it draws are saved with the page and come back when you reopen it.

```python
import pandas as pd
runs = pd.DataFrame({"month": ["Jan", "Feb", "Mar"], "km": [42, 51, 63]})
runs.describe()
```

25 languages, on your device

JavaScript, TypeScript, Python, SQL, Lua, Shell (emulated), Ruby, PHP, R, Perl, Go, Rust, C, C++, OCaml, Haskell, Zig, C#, F#, Java, Clojure, Elixir, Erlang, Scheme, Prolog.

Each language downloads the first time you run it (from a few hundred kilobytes for Lua or JavaScript to a few dozen megabytes for Rust), then works offline. Settings → Code runtimes downloads them ahead of time, for planes and trains.

Code runs in a sandboxed frame with one worker per page and language. It can’t read the app, your other pages or the network: cells have no network access unless you allow it for that page.

Work like a notebook

Share data between languages

Cells in one page can pass data to each other across languages: share(name, value) in one, use(name) in another. Tables arrive as tables: share rows from JavaScript, then query them in SQL.

```js
share("runs", [{ month: "Jan", n: 4 }, { month: "Feb", n: 7 }])
```

```sql
select sum(n) as total from runs;
```

Input, files and packages

Run your first code cell in Vellum

  1. Open a page

    Create a page, or open any page you already have.

  2. Write a code block

    Type three backticks and a language name, for example ```python, then your code, then three backticks to close it.

  3. Run it

    Switch to the reading or split view and press Run on the cell (or Shift+Enter in the cell editor). The language downloads the first time.

  4. Keep the result

    The output is saved with the page. Open the cell menu for Run all, Variables and the other notebook commands.

In the app

Questions

Is it a replacement for Jupyter?

For many notebooks, yes: it opens and exports .ipynb files and keeps outputs. It runs WebAssembly builds of each language in the browser, so heavy computation, GPUs and some native packages still need Jupyter. See Vellum and Jupyter.

Does my code have internet access?

Not unless you allow it. A cell that tries to reach the web asks first (once, always for this page, or never), and every request is logged under the cell.

Does it work offline?

Yes. Each language downloads once, the first time you use it, and is then kept on your device. You can download all of them ahead of time in Settings.