file2markdown

Convert Jupyter Notebook (IPYNB) to Markdown

Turn a Jupyter notebook (.ipynb) into clean Markdown: markdown cells as you wrote them, code in fenced blocks labelled with the notebook's language, and each cell's saved output underneath, from printed text to DataFrame tables and error tracebacks. Ready to paste into Claude, ChatGPT or a RAG pipeline.

Open the converter to upload your .ipynb file

Free, no account required. Get clean Markdown in seconds.

Open converter →

Why convert Jupyter Notebook (IPYNB) to Markdown?

  • Hand a notebook to Claude or ChatGPT for review, outputs included
  • Share analysis results as a readable document
  • Index notebooks in a RAG pipeline without JSON noise
  • Turn a tutorial notebook into a blog post draft

What you get from a notebook

A .ipynb file is JSON: every cell, its outputs and a lot of metadata. The converter keeps the cells in order. Markdown cells come through as written, except for images pasted into them (see below). Code cells become fenced code blocks labelled with the notebook's language (python, r, julia and so on, read from the notebook's kernel information). Raw cells become plain code blocks, and empty code cells are skipped.

Under each code cell, an "Output:" line is followed by what the cell produced the last time it ran: printed text, results, Markdown output and error tracebacks, with terminal colour codes removed. pandas DataFrames and other HTML tables become Markdown tables. Outputs are only there if they were saved in the file, so run the notebook and save it before converting.

What is left out

Plots and images are not included. If an image output has a text label (matplotlib saves one like <Figure size 640x480 with 1 Axes>) you get that label, otherwise a short "[image output omitted]" note, never the image data. Interactive widgets and JavaScript outputs are skipped. Images attached to markdown cells keep their attachment: link, but the picture itself is not included. Images pasted straight into a markdown cell are stored in the file as long base64 text: they are replaced by their alt text, or by "[embedded image omitted]" if they have none.

Long outputs are cut so one noisy cell cannot drown out the rest: any single output over 60 lines or 6,000 characters keeps its beginning and ends with a note saying how many lines were left out.

Example: what the Markdown output looks like

A notebook cell that prints a line and shows a DataFrame, then a plot and an error, converts to:

```python
import pandas as pd
df = pd.DataFrame({'name': ['Ana', 'Bo'], 'score': [91, 78]})
print('Accuracy: 0.95')
df.head()
```

Output:

```
Accuracy: 0.95
```

|  | name | score |
| --- | --- | --- |
| 0 | Ana | 91 |
| 1 | Bo | 78 |

```python
df.plot()
```

Output:

_[image output omitted]_

```python
df['missing']
```

Output:

```
KeyError: 'missing'
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[3], line 1
----> 1 df['missing']
KeyError: 'missing'
```

Frequently asked questions

Other formats you can convert

Ready to convert your Jupyter Notebook (IPYNB)?

Upload your file and get Markdown in seconds. Free and private.

Start converting →