Interactive notebook for March — Livebook-style in the browser.
Notebooks are plain Markdown files (.scrollmd) with fenced March code blocks. Open them in the browser, run cells interactively, and save changes back to disk.
A March toolchain new enough to contain these fixes — without them scroll builds but misbehaves, in ways that do not always look like a toolchain problem:
- Registry deps for archive tasks (march#133) — required as of scroll
0.1.4, which declares
bastionas a registry dependency. Older forge gave an archive task no search path for a registry dep, soforge check/build/testpassed and thenforge scroll.servefailed withUnknown module Router/Middleware/Static. The same fix also makesforge depsfetch a registry package's own dependencies (bastion→depot), without which the build fails withModule Pool not found. forge testtransitive dependency resolution (march#127) — scroll reachesbastion's own dependency (depot) throughbastion. Older forge resolved that forcheck/buildbut nottest, so tests failed withUnknown module Pool.- The
(-led-statement parser fix (march#129) — a line holding only()used to be glued onto the previous line as a call.
forge toolchain list shows what you have installed.
Scroll is a forge tool: installing it adds the scroll.serve command. It's
listed on the forge registry at https://forgepm.org/packages/scroll.
Install directly from the GitHub source:
forge install https://github.com/march-language/scrollOr from a local checkout:
git clone https://github.com/march-language/scroll
forge install ./scrollDependencies are fetched explicitly — forge check does not fetch them, so
a fresh clone must resolve first or every bastion module reads as unknown:
git clone https://github.com/march-language/scroll
cd scroll
forge deps # clones bastion (and its own dep, depot) into ~/.march/cas
forge test# Open an existing notebook
forge scroll.serve mynotebook.scrollmd
# Create a new notebook (opens a blank one in the browser)
forge scroll.serve
# Specify a port (default: 4040)
forge scroll.serve mynotebook.scrollmd --port 8080A .scrollmd file is standard Markdown. Code cells use fenced March blocks:
# My Notebook
Some prose here.
```march
let x = 6 * 7
```
```march
x
```- Markdown cells — rendered as HTML in the browser
- Code cells — run in sequence; each cell sees bindings from earlier cells
letbindings are silent (no auto-print), just like a REPL assignment- Plain expressions auto-print their value if non-unit
Long-running processes (HTTP servers, background workers) use the march:server fence:
```march:server
HttpServer.start(3000)
```Server cells run as background processes with Start/Stop controls in the UI.
cd /path/to/scroll
# Unit tests (149 tests)
MARCH_LIB_PATH=lib march test test/test_scroll.march
# End-to-end tests over the notebook WebSocket protocol
python3 test/test_scroll.pyNote:
forge testcurrently fails to link the compiled test binary due to three upstream march toolchain bugs (nested-namespace name mangling in the linker, a module init-order bug in the interpreter, and a hang in compiled test binaries on arm64 macOS). Usemarch testin interpreter mode instead — it runs the same 117 unit tests without those issues.
After editing lib/scroll.march, changes are live immediately — no reinstall needed when installed as a path archive (forge install scroll@./).