Metadata-Version: 2.5
Name: whybook
Version: 0.1.0
Summary: Whybook: a question-driven view of Jupyter notebooks
Project-URL: Homepage, https://github.com/krassowski/whybook
Project-URL: Bug Tracker, https://github.com/krassowski/whybook/issues
Project-URL: Repository, https://github.com/krassowski/whybook.git
Author: Michal Krassowski
License-Expression: BSD-3-Clause AND Apache-2.0
License-File: LICENSE
License-File: whybook/sandbox/codex/LICENSE
License-File: whybook/sandbox/codex/NOTICE
Keywords: jupyter,jupyterlab,jupyterlab-extension
Classifier: Framework :: Jupyter
Classifier: Framework :: Jupyter :: JupyterLab
Classifier: Framework :: Jupyter :: JupyterLab :: 4
Classifier: Framework :: Jupyter :: JupyterLab :: Extensions
Classifier: Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Requires-Python: >=3.10
Requires-Dist: jupyter-server<3,>=2.13.0
Requires-Dist: jupyterlab-unfold>=0.3.4
Requires-Dist: jupyterlab<5,>=4.4.0
Provides-Extra: claude
Requires-Dist: claude-agent-sdk>=0.2.157; extra == 'claude'
Provides-Extra: demo
Requires-Dist: numpy; extra == 'demo'
Requires-Dist: pandas; extra == 'demo'
Requires-Dist: pyarrow; extra == 'demo'
Requires-Dist: statsmodels; extra == 'demo'
Provides-Extra: dev
Requires-Dist: jupyter-builder>=1.2.0; extra == 'dev'
Provides-Extra: docs
Requires-Dist: jupyter-book<3,>=2.1; extra == 'docs'
Provides-Extra: kernel
Requires-Dist: narwhals>=2; extra == 'kernel'
Provides-Extra: local
Requires-Dist: huggingface-hub; extra == 'local'
Requires-Dist: llama-cpp-python>=0.3.35; extra == 'local'
Provides-Extra: models
Requires-Dist: pydantic-ai-slim[anthropic,google,mistral,openrouter]<3,>=2.51; extra == 'models'
Provides-Extra: plots
Requires-Dist: ipywidgets>=8; extra == 'plots'
Requires-Dist: plotly>=6; extra == 'plots'
Requires-Dist: tqdm; extra == 'plots'
Provides-Extra: speech
Requires-Dist: moonshine-voice<0.2,>=0.1.5; extra == 'speech'
Provides-Extra: test
Requires-Dist: coverage; extra == 'test'
Requires-Dist: narwhals>=2; extra == 'test'
Requires-Dist: pandas; extra == 'test'
Requires-Dist: pytest; extra == 'test'
Requires-Dist: pytest-asyncio; extra == 'test'
Requires-Dist: pytest-cov; extra == 'test'
Requires-Dist: pytest-jupyter[server]>=0.6.0; extra == 'test'
Description-Content-Type: text/markdown

# Whybook

A question-driven view of Jupyter notebooks, as a JupyterLab extension. Open a notebook with Open With, Whybook, drag a variable or a column onto a cell, and pick one of the questions the view offers: the answer becomes an ordinary notebook cell, with its assumptions shown next to it. The notebook stays a plain `.ipynb` file that any Jupyter frontend opens.

The extension is one Python package, `whybook`: the helpers a notebook imports (`import whybook`), the server extension (`whybook.server`) and the frontend extension of the same name. Notebooks from before 25 September 2026 still work: `import epi` gives the same helpers with a deprecation warning, and the view reads their `epi` metadata and output types. It is a research prototype and is not on PyPI yet.

## Requirements

- JupyterLab 4.4 or later, in the 4.x series. On 4.6 and later, the sections of the Whybook panel can also move to the file browser.

## Install

From a clone of this repository, see [Try it](notes/try-it.md) in the spike notes:

```bash
pip install --editable ".[claude,kernel,demo,local,models]"
jupyter labextension develop . --overwrite
```

`local` builds llama-cpp-python for the local models, with the system's C++ compiler, in about 4 minutes: without a compiler, leave it out of the list. The install builds the extension. To work on Whybook itself, [CONTRIBUTING.md](CONTRIBUTING.md) adds the `dev` and `test` extras.

## Uninstall

```bash
pip uninstall whybook
```

## Troubleshoot

If you are seeing the frontend extension, but it is not working, check
that the server extension is enabled:

```bash
jupyter server extension list
```

If the server extension is installed and enabled, but you are not seeing
the frontend extension, check the frontend extension is installed:

```bash
jupyter labextension list
```

## Contributing

If you would like to contribute to this extension, please refer to the [Contributing Guide](CONTRIBUTING.md).
