{"_id":"@afterpython/nbm","_rev":"5-b1fc038ede8413f1d883b258bde3cf37","name":"@afterpython/nbm","dist-tags":{"latest":"0.1.7"},"versions":{"0.1.0":{"name":"@afterpython/nbm","version":"0.1.0","keywords":["notebook","jupyter","marimo","pluto","cli"],"author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"license":"Apache-2.0","_id":"@afterpython/nbm@0.1.0","maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"homepage":"https://github.com/softwareentrepreneer/nbm","bugs":{"url":"https://github.com/softwareentrepreneer/nbm/issues"},"os":["darwin","linux"],"bin":{"nbm":"bin/nbm.js"},"cpu":["arm64","x64"],"dist":{"shasum":"fe2314a9a9d0a28ca0510faa9f43b3109f8111ef","tarball":"https://registry.npmjs.org/@afterpython/nbm/-/nbm-0.1.0.tgz","fileCount":2,"integrity":"sha512-QPhCCVVHFVp3y8vm5aPWyN+W3steMHr2wnKdV590V8hcD1xxQWsxIEPsGoY+r2sbKHZFJe0iXQeF7zyOSnwdnQ==","signatures":[{"sig":"MEQCIHknQZCohgyrNafDi+46XouyqDubY+GsFqKKexn/0/JHAiACgaZTplS3z44o0MrHo7e8MTNDlvLx5C3InrSLyR2a2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2284},"engines":{"node":">=18"},"gitHead":"bb4b15acc58b38555e6247509c983b1885696e02","_npmUser":{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"},"repository":{"url":"git+https://github.com/softwareentrepreneer/nbm.git","type":"git"},"_npmVersion":"11.11.1","description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","directories":{},"_nodeVersion":"25.8.2","_hasShrinkwrap":false,"optionalDependencies":{"@afterpython/nbm-cli-linux-x64":"0.1.0","@afterpython/nbm-cli-darwin-x64":"0.1.0","@afterpython/nbm-cli-darwin-arm64":"0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/nbm_0.1.0_1778278288442_0.15183897722829443","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@afterpython/nbm","version":"0.1.4","keywords":["notebook","jupyter","marimo","pluto","cli"],"author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"license":"Apache-2.0","_id":"@afterpython/nbm@0.1.4","maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"homepage":"https://github.com/AfterPythonOrg/nbm","bugs":{"url":"https://github.com/AfterPythonOrg/nbm/issues"},"os":["darwin","linux"],"bin":{"nbm":"bin/nbm.js"},"cpu":["arm64","x64"],"dist":{"shasum":"699b2bcc85871ae8c191f02c3c82bbd7daaf5f2d","tarball":"https://registry.npmjs.org/@afterpython/nbm/-/nbm-0.1.4.tgz","fileCount":4,"integrity":"sha512-JlRx9sJGV7L2WhsqwRFTioR8CI+xTLdeXQ1F02TeIdUmTcXQoCCZrD3WWpFoV4scFX9TCTzvvuXa4w6jEocwAg==","signatures":[{"sig":"MEUCIQCDVGOH7/OESrzklL+GchxBNil7S4p4aom2JXsxY2RkAgIgNCdh2efWYJpMDhnz3YeYpeppjgPp6R7pQZvLVPm0Uu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afterpython%2fnbm@0.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20460},"engines":{"node":">=18"},"gitHead":"2b30e582ed18fe18ee5922acf822d584b2e258c0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c75e02-ade3-455a-aed8-bfb851a564da"}},"repository":{"url":"git+https://github.com/AfterPythonOrg/nbm.git","type":"git"},"_npmVersion":"11.11.0","description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@afterpython/nbm-cli-linux-x64":"0.1.4","@afterpython/nbm-cli-darwin-arm64":"0.1.4"},"_npmOperationalInternal":{"tmp":"tmp/nbm_0.1.4_1778281112490_0.31256983930222715","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@afterpython/nbm","version":"0.1.5","keywords":["notebook","jupyter","marimo","pluto","cli"],"author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"license":"Apache-2.0","_id":"@afterpython/nbm@0.1.5","maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"homepage":"https://github.com/AfterPythonOrg/nbm","bugs":{"url":"https://github.com/AfterPythonOrg/nbm/issues"},"os":["darwin","linux"],"bin":{"nbm":"bin/nbm.js"},"cpu":["arm64","x64"],"dist":{"shasum":"7ac11c7d701f0e808a3e3a7999e201164046ced2","tarball":"https://registry.npmjs.org/@afterpython/nbm/-/nbm-0.1.5.tgz","fileCount":4,"integrity":"sha512-NGCz4MVsrUZToFAQXyqLRWLbFeTnmo1eJwAXjw5grEBQ5uw5oTofEFKpKEoOhqy+ijgjIjYHYJeBKOCr3JOlLQ==","signatures":[{"sig":"MEUCIQChuuYze3GXGrIO5gJX6c0wzVnzYxMTL51UEp+NjxiLmAIgJ4pfMHFb1skBQ9u3GMKZgj3LmchGAbquup+cT1ijbng=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afterpython%2fnbm@0.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20460},"engines":{"node":">=18"},"gitHead":"29daf966caee39ae238ba73f8aef1de4c6127970","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c75e02-ade3-455a-aed8-bfb851a564da"}},"repository":{"url":"git+https://github.com/AfterPythonOrg/nbm.git","type":"git"},"_npmVersion":"11.11.0","description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@afterpython/nbm-cli-linux-x64":"0.1.5","@afterpython/nbm-cli-darwin-arm64":"0.1.5"},"_npmOperationalInternal":{"tmp":"tmp/nbm_0.1.5_1778381534181_0.4285254127989304","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@afterpython/nbm","version":"0.1.6","keywords":["notebook","jupyter","marimo","pluto","cli"],"author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"license":"Apache-2.0","_id":"@afterpython/nbm@0.1.6","maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"homepage":"https://github.com/AfterPythonOrg/nbm","bugs":{"url":"https://github.com/AfterPythonOrg/nbm/issues"},"os":["darwin","linux"],"bin":{"nbm":"bin/nbm.js"},"cpu":["arm64","x64"],"dist":{"shasum":"414c94ab81df54132a0ccce4fc7151f8813ddd0b","tarball":"https://registry.npmjs.org/@afterpython/nbm/-/nbm-0.1.6.tgz","fileCount":4,"integrity":"sha512-dyjs/lvyg9Ui0NpvtAGsPsiVzX8LTsNEaoJ9o6T/jr9sCDtx/vE9hsrAtSgfisJU2t6lo63yKssm0Y4nWDOkuA==","signatures":[{"sig":"MEQCIFUka5GjmoHI+f0YWJz/lpiRzh4u2h3HLzEDKV7Q3XsPAiB/DZpxwc84GcTfhRLsLJQ32VTuBbE1rNa9AFbz2hoWLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afterpython%2fnbm@0.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":20460},"engines":{"node":">=18"},"gitHead":"0bbe87cb15a31315a8e6def940eee00c793426bc","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c75e02-ade3-455a-aed8-bfb851a564da"}},"repository":{"url":"git+https://github.com/AfterPythonOrg/nbm.git","type":"git"},"_npmVersion":"11.11.0","description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","directories":{},"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"optionalDependencies":{"@afterpython/nbm-cli-linux-x64":"0.1.6","@afterpython/nbm-cli-darwin-arm64":"0.1.6"},"_npmOperationalInternal":{"tmp":"tmp/nbm_0.1.6_1778382407412_0.33864206590049384","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@afterpython/nbm","version":"0.1.7","description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","bin":{"nbm":"bin/nbm.js"},"engines":{"node":">=18"},"os":["darwin","linux"],"cpu":["arm64","x64"],"optionalDependencies":{"@afterpython/nbm-cli-darwin-arm64":"0.1.7","@afterpython/nbm-cli-linux-x64":"0.1.7"},"repository":{"type":"git","url":"git+https://github.com/AfterPythonOrg/nbm.git"},"homepage":"https://github.com/AfterPythonOrg/nbm","license":"Apache-2.0","author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"keywords":["notebook","jupyter","marimo","pluto","cli"],"gitHead":"23c236343a756362010451794ba6ca02daa215b5","_id":"@afterpython/nbm@0.1.7","bugs":{"url":"https://github.com/AfterPythonOrg/nbm/issues"},"_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-sIKLpAPaabxmMBGoVlOEtfR2qgZNCR/YL7NmAxKgL+LyPH2Y7oT5FMIY5mMt3r+Lw8tpnii2LwStvhBige8eUA==","shasum":"64e29ecfa1456a8d20f28d8bda32510fbbaa0b37","tarball":"https://registry.npmjs.org/@afterpython/nbm/-/nbm-0.1.7.tgz","fileCount":4,"unpackedSize":20460,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@afterpython%2fnbm@0.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDYgZ5/hU+bceqpwbW/SJSSS6aAM0I1jEbYUs+seAiUjwIgY5A7Mqu3k0vuoioUTIrznEqkG+pMkKxLOv4hN4cW+vc="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45c75e02-ade3-455a-aed8-bfb851a564da"}},"directories":{},"maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nbm_0.1.7_1780501749965_0.6266741494165429"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-08T22:11:28.326Z","modified":"2026-06-03T15:49:10.380Z","0.1.0":"2026-05-08T22:11:28.584Z","0.1.4":"2026-05-08T22:58:32.620Z","0.1.5":"2026-05-10T02:52:14.309Z","0.1.6":"2026-05-10T03:06:47.550Z","0.1.7":"2026-06-03T15:49:10.082Z"},"bugs":{"url":"https://github.com/AfterPythonOrg/nbm/issues"},"author":{"name":"Stephen Yau","email":"softwareentrepreneer@gmail.com"},"license":"Apache-2.0","homepage":"https://github.com/AfterPythonOrg/nbm","keywords":["notebook","jupyter","marimo","pluto","cli"],"repository":{"type":"git","url":"git+https://github.com/AfterPythonOrg/nbm.git"},"description":"Notebook Manager — a unified CLI and web dashboard for running Jupyter, Marimo, and Pluto notebooks.","maintainers":[{"name":"softwareentrepreneer","email":"softwareentrepreneer@gmail.com"}],"readme":"# Notebook Manager (`nbm`)\n\nA unified CLI and web dashboard for running and managing Jupyter, Marimo, and Pluto notebooks.\n\n> *everything is vibe-coded including this README, No Quality Assurance*\n\n## Features\n\n- One tool for **Jupyter**, **Marimo**, and **Pluto** — engine picked from the file extension\n- Organize notebooks into **workspaces**\n- **Notebook explorer** — browse notebooks across workspaces, preview their code cells without running them, and double-click any notebook to start it\n- **Per-notebook runtime memory** — nbm remembers which Python/Julia executable each notebook was created with, so you don't have to `cd` into the right project or activate the right env every time. `nbm start your_notebook.py` is enough.\n- **Embedded** mode — run multiple notebooks inside one nbm UI and switch between them — or **standalone** mode, where each notebook runs on its own as usual\n- Tracks running sessions; clean start/stop/remove\n\n## Installation\n\n```sh\nnpm install -g @afterpython/nbm\n```\n\nSupported platforms: macOS arm64, macOS x64, Linux x64.\n\nExternal requirements (one or more, depending on which notebook engines you use):\n\n- `python` with `marimo` (for `.py`) and/or `jupyter` (for `.ipynb`)\n- `julia` with `Pluto` (for `.jl`)\n\n`nbm` finds these on `PATH` at runtime; it doesn't bundle them.\n\n## Quick start\n\n```sh\nnbm ui  # start the web UI\nnbm start notebook.py                       # start a Marimo notebook\nnbm start notebook.jl --workspace research  # start a Pluto notebook in the \"research\" workspace\nnbm start notebook.ipynb -w experiment      # start a Jupyter notebook in the \"experiment\" workspace\n```\n\nThe notebook engine is chosen from the file extension:\n\n| Extension | Engine  |\n|-----------|---------|\n| `.py`     | Marimo  |\n| `.ipynb`  | Jupyter |\n| `.jl`     | Pluto   |\n\n## Passing flags to the notebook engine\n\nAnything you put after `--` on `nbm start` is forwarded verbatim to the underlying engine (`marimo edit` / `jupyter notebook`):\n\n```sh\nnbm start notebook.py -- --port 8765           # marimo edit ... --port 8765\nnbm start notebook.ipynb -- --ServerApp.token=''  # jupyter notebook ... --ServerApp.token=''\n```\n\nPluto doesn't take CLI flags this way, so `--` is effectively a no-op for `.jl` notebooks.\n\n## Modes\n\n`nbm` has two display modes (set with `nbm config set mode <value>`):\n\n- **`embedded`** (default) — All running notebooks live **inside** the nbm UI. Start `nbm ui` first in another terminal, then run `nbm start` for each notebook; each running notebook gets its own tab in the sidebar, and you can cycle between them with `Alt+J` / `Alt+K`. Under the hood each notebook is rendered in its own iframe.\n\n  > Rebind those shortcuts with `nbm config set nextRunningKeybinding <combo>` and `nbm config set previousRunningKeybinding <combo>` — e.g. `nbm config set nextRunningKeybinding Ctrl+Shift+J`. On macOS, `Alt` is the Option key.\n- **`standalone`** — Notebooks run as their own normal web apps (just like running Jupyter/Marimo/Pluto by hand). `nbm ui` is optional and is only useful as a central overview.\n\nIf a notebook misbehaves in embedded mode (some notebook frontends don't love being framed), switch to standalone:\n\n```sh\nnbm config set mode standalone\n```\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `nbm ui [-p, --port <port>]` | Start the web dashboard in the foreground (Ctrl+C to stop). Port auto-picks if omitted. |\n| `nbm start <notebook> [-w, --workspace <name>] [--no-open] [-- <extra args>]` | Start (or create + start) a notebook. In embedded mode, `nbm ui` must already be running. In standalone mode, `--no-open` suppresses browser opening. Anything after `--` is passed through to the notebook runner. |\n| `nbm stop <name\\|id> [-w, --workspace <name>]` | Stop a running notebook. |\n| `nbm stop all` | Stop every running notebook session. |\n| `nbm stop ui` | Stop the embedded web UI. |\n| `nbm list [-a, --all] [-w, --workspace <name>] [-t, --type <marimo\\|jupyter\\|pluto>]` (alias `ls`) | Table of id / name / type / workspace / status. By default only running notebooks are shown; pass `--all` to include stopped ones. `--workspace` and `--type` filter the list and compose with `--all`. |\n| `nbm remove <name\\|id> [-w, --workspace <name>]` (alias `rm`) | Stop the notebook, delete its registry entry and on-disk files. |\n| `nbm config list \\| get <key> \\| set <key> <value>` | View or change configuration. |\n| `nbm runtime set <workspace/name\\|id> --binary <abs-path> [--project <abs-path>]` | Pin a Python/Julia binary to a notebook. The notebook must be stopped. `--project` is Pluto-only. |\n\nWhen you omit `-w`, the workspace defaults to `default`.\n\n## Runtime\n\nWhen you first `nbm start` a notebook, nbm records the Python (or Julia) executable that's active in your shell at that moment and pins it to the notebook. Every later `nbm start` for that notebook reuses the same executable — no need to re-activate a venv, `cd` into the project, or remember which env it belongs to.\n\nTo change a notebook's runtime later (for example, to point a Marimo notebook at a different Python env):\n\n```sh\nnbm runtime set notebook.py --binary /abs/path/to/another/python\n```\n\nTo target a notebook in a non-default workspace, use the `workspace/notebook` form (this slash syntax is **specific to `nbm runtime set`** — other commands use `--workspace` instead):\n\n```sh\nnbm runtime set research/notebook.py --binary /abs/path/to/another/python\n```\n\nFor Pluto notebooks, you can also pin a Julia project directory:\n\n```sh\nnbm runtime set notebook.jl --binary /abs/path/to/julia --project /abs/path/to/JuliaProject\n```\n\nNotes:\n- Paths must be absolute.\n- The notebook must be stopped first (`nbm stop notebook.py`).\n- You can also pass a notebook id instead of a name.\n\n## Configuration\n\n```sh\nnbm config list\n```\n\n| Key | Default | Description |\n|-----|---------|-------------|\n| `mode` | `embedded` | `embedded` or `standalone` (see above). |\n| `nextRunningKeybinding` | `Alt+J` | Shortcut to switch to the next running notebook in the sidebar. |\n| `previousRunningKeybinding` | `Alt+K` | Shortcut to switch to the previous running notebook. |\n\nOn macOS, `Alt` is the Option key.\n\n## Developers\n\n- Stack: Deno CLI (Cliffy) + SvelteKit web dashboard, pnpm workspace, shared `@nbm/core` package.\n- Layout: `apps/cli`, `apps/web`, `packages/core`.\n- Requirements: pnpm 10+, Deno.\n- Scripts (from [package.json](package.json)):\n  - `pnpm dev:web` — run the web dashboard in dev mode\n  - `pnpm dev:cli` — run the CLI in dev mode\n  - `pnpm check` — type-check all packages\n  - `pnpm lint` / `pnpm format`\n\n### Releasing\n\nEvery release is one command — bump the version:\n\n```sh\n./scripts/release.sh 0.1.1\n./scripts/release.sh 0.2.0\n```\n\nThe script tags and pushes; CI builds the binaries and publishes the four\nnpm packages. See [RELEASING.md](RELEASING.md) for architecture and recovery.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}