Convert IPYNB to Markdown
Paste a Jupyter notebook JSON file and export a clean Markdown document: markdown cells verbatim, code as fenced blocks, and stored outputs rendered inline. Choose whether to keep code, outputs, prompts, and image data. Runs entirely in your browser.
Export a Jupyter notebook as Markdown
Paste the JSON contents of an .ipynb file and this tool turns the notebook into a
single Markdown document. Markdown cells are emitted as Markdown, code cells become
fenced code blocks using the notebook language, and stored outputs can be rendered
below the cell just like a notebook export.
Use it when you want a clean README, blog draft, lab note, or documentation page
from a notebook without installing Python or running nbconvert locally.
What gets converted
- Markdown/raw cells are copied verbatim, including headings, lists, and links.
- Code cells become fenced blocks such as
```python. - Stream outputs (
stdout/stderr) and plain results are rendered in text fences. - Rich results prefer Markdown, then images, then HTML tables, then LaTeX, then plain text.
- Errors are rendered as stripped tracebacks so ANSI colors do not leak into the Markdown.
- Image outputs and attachments can be embedded as inline
data:URIs, replaced with a short placeholder, or omitted.
Worked example
A notebook with one markdown cell and one code cell:
{"cells":[
{"cell_type":"markdown","source":["# Demo\n","Some notes"]},
{"cell_type":"code","execution_count":1,
"source":["print(2 + 2)"],
"outputs":[{"output_type":"stream","name":"stdout","text":["4\n"]}]}
],"metadata":{"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":5}
becomes:
# Demo
Some notes
```python
print(2 + 2)
```
```
4
```
Turn off Include code cells to get a no-input export that keeps outputs, or turn off Include stored outputs for a code-only notebook-to-Markdown conversion.
FAQ
Is this the same as converting a notebook to a Python script?
No. A script export focuses on runnable code and usually drops notebook outputs.
This tool is a document export: it preserves markdown cells and, by default,
renders stored outputs such as stdout, rich results, errors, and images. Use
ipynb-to-script when you want a .py; use this when you want a readable .md.
What happens to plots and image outputs?
By default, image outputs are embedded as inline data: URIs so the Markdown is a
single self-contained string. If you do not want large base64 blocks, set Image
handling to placeholder for *[image output]* notes or omit to drop image
outputs entirely. A sidecar _files/ image directory is not produced because this
tool returns one Markdown value.
Can it keep outputs but hide the code?
Yes. Turn off Include code cells and leave Include stored outputs on. That matches the common no-input export shape: prose plus outputs, without the source code that produced them.
Does it execute the notebook?
No. It reads the JSON already stored in the .ipynb file. Only outputs that are
present in the notebook are rendered. If a notebook was saved after clearing its
outputs, this converter cannot recreate them.
Why are some rich outputs rendered as HTML?
Notebook outputs can carry many MIME representations. Markdown is chosen first, then images, then HTML, then LaTeX, then plain text. Keeping HTML is useful for DataFrame tables and other rich displays because raw HTML is valid inside Markdown.
Limits & edge cases
- Input must be valid Jupyter notebook JSON with a
cellsarray (nbformat v4 is the primary target; legacy v3 markdown cells are tolerated). - The tool does not run code, fetch external files, or evaluate widgets.
- Very large embedded images can produce large Markdown because base64 image data
is included inline when
image_mode=embed. - Binary sidecar files from
nbconvertare represented as inline data URIs, placeholders, or omitted; no ZIP or_files/directory is generated. - Unknown cell types are ignored, and empty cells are skipped.
Developer & Automation Access
Run it from the terminal
Same engine as this page, headless — via the gizza CLI:
gizza tool ipynb-to-markdown '{"cells":[{"cell_type":"markdown","source":["# Title\n"]},{"cell_type":"code","execution_count":1,"source":["print(2 + 2)"],"outputs":[{"output_type":"stream","name":"stdout","text":["4\n"]}]}],"metadata":{"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":5}'New to the CLI? Get gizza →
Open it by URL
Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:
https://gizza.ai/tools/ipynb-to-markdown/?notebook=%7B%22cells%22%3A%5B%7B%22cell_type%22%3A%22markdown%22%2C%22source%22%3A%5B%22%23%20Title%5Cn%22%5D%7D%2C%7B%22cell_type%22%3A%22code%22%2C%22execution_count%22%3A1%2C%22source%22%3A%5B%22print%282%20%2B%202%29%22%5D%2C%22outputs%22%3A%5B%7B%22output_type%22%3A%22stream%22%2C%22name%22%3A%22stdout%22%2C%22text%22%3A%5B%224%5Cn%22%5D%7D%5D%7D%5D%2C%22metadata%22%3A%7B%22language_info%22%3A%7B%22name%22%3A%22python%22%7D%7D%2C%22nbformat%22%3A4%2C%22nbformat_minor%22%3A5%7D&include_code=true&include_outputs=true&include_markdown=true&show_prompts=true&image_mode=embedMachine-readable descriptor: tool.json — title + parameters JSON Schema for agents.
