Skip to content

Jupyter Notebook Viewer

Drop a .ipynb file to read it the way Jupyter shows it, with its charts, tables and maths, without installing anything. Save it as a PDF, a web page, a Python script or Markdown. The notebook is read on this device and never uploaded.

v2026.10.16

Key facts

  • A .ipynb file is plain JSON: a list of cells, and every code cell keeps the outputs it printed the last time it ran, so a notebook can be read without running it again.

Open a Jupyter notebook

No Jupyter, no install, no upload.

Sample

bike-rides.ipynb

Python 3 (ipykernel)Python 3.12.4nbformat 4.512 cells · 154 words · 1 picture

Bike rides and rain: a short walkthrough

A week of made-up numbers from a small town's bike-share scheme. It shows what a notebook can hold: Markdown, code, a table, a chart, maths, a warning and, at the end, an error.

In [1]
import pandas as pd
import matplotlib.pyplot as plt
In [2]
rides = pd.DataFrame({
    "day": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
    "trips": [412, 438, 395, 451, 288, 230],
    "rain_mm": [0.0, 1.2, 4.5, 0.0, 9.8, 14.1],
}).set_index("day")
rides
Out [2]
trips rain_mm
day
Mon 412 0.0
Tue 438 1.2
Wed 395 4.5
Thu 451 0.0
Fri 288 9.8
Sat 230 14.1

How busy was the week?

The mean number of trips per day is

xˉ=1n∑i=1nxi\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i

where nn is the number of days and xix_i is the number of trips on day ii.

In [3]
mean = rides["trips"].mean()
print(f"Mean trips per day: {mean:.1f}")
print(f"Busiest day: {rides['trips'].idxmax()}")
Mean trips per day: 369.0
Busiest day: Thu
In [4]
import warnings

if rides["rain_mm"].max() > 10:
    warnings.warn("Saturday had over 10 mm of rain; the gauge reads high in storms.")
/tmp/ipykernel_4120/2715331896.py:4: UserWarning: Saturday had over 10 mm of rain; the gauge reads high in storms.
  warnings.warn("Saturday had over 10 mm of rain; the gauge reads high in storms.")

Rain and riding

Fewer people rode on wet days. Pearson’s correlation coefficient measures how closely two columns move together, from −1 to 1:

r=∑i(xi−xˉ)(yi−yˉ)∑i(xi−xˉ)2 ∑i(yi−yˉ)2r = \frac{\sum_i (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_i (x_i - \bar{x})^2}\,\sqrt{\sum_i (y_i - \bar{y})^2}}

In [5]
fig, ax = plt.subplots(figsize=(6.4, 3.6))
ax.bar(rides.index, rides["trips"], color="#4878d0")
ax.set_ylabel("Trips")
ax.set_title("Bike-share trips per day")
plt.show()
Image output of cell 8
In [6]
round(rides["trips"].corr(rides["rain_mm"]), 3)
Out [6]
-0.979

A day that isn’t there

There is no Sunday in the data, so asking for it raises a KeyError. This is what a traceback looks like:

In [7]
rides.loc["Sun"]

KeyError: 'Sun'

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
Cell In[7], line 1
----> 1 rides.loc["Sun"]

File ~/.venv/lib/python3.12/site-packages/pandas/core/indexes/base.py:3812, in Index.get_loc(self, key)
   3810     return self._engine.get_loc(casted_key)
   3811 except KeyError as err:
-> 3812     raise KeyError(key) from err

KeyError: 'Sun'

What next

  • Load a week of rides
  • Chart them
  • Add the weekend’s weather from the town’s own gauge

Made-up data, made for this example. Any resemblance to a real town is a coincidence.

Your notebook is read on this device and never uploaded. Check it yourself

How this works: Method, 4 sources, Checked against 7 worked examples,

How this works

Method

The .ipynb file is read in the browser as the nbformat JSON it is: every cell, its last outputs and its attachments. Markdown is drawn with GitHub Flavored Markdown and maths with KaTeX, code is coloured by the notebook’s language, and each output shows its richest format, as JupyterLab chooses. All HTML from the notebook is sanitised first and nothing from other sites is loaded. PDF comes from the browser’s print engine; HTML, script and Markdown files are written in the page.

How it’s tested

7 worked examples for this page are checked by automated tests before every release: given the inputs, the tool must show the expected answer.

Privacy

On your device. Nothing you enter or open leaves this browser. About privacy labels

Changes

  • First published: open a .ipynb file with its outputs, maths and colours, and save it as PDF, HTML, a script or Markdown.

Every change on What’s new

How we make toolsReport a mistake

Reading a notebook without Jupyter

A Jupyter notebook mixes writing, code and results in one file. Someone writes a few lines of explanation, runs a block of Python, and the table or chart it makes is saved under the code. When the notebook is sent to you, all of that travels inside the .ipynb file, so you don’t need Python, Jupyter or the data to see what it showed on the author’s screen.

The usual ways to look at one ask something of you first. nbviewer opens notebooks that already sit at a public address. GitHub shows them only from a repository. Colab wants a Google account and copies the file to Google Drive. Opening it in Jupyter means installing Python and a few hundred megabytes of packages. For a homework file from a classmate or a report from a colleague that is a lot of setup just to read it.

This viewer reads the file in your browser. It draws Markdown with tables, task lists and LaTeX maths, colours the code by its language (Python, R and Julia), and shows each output the way JupyterLab picks it: HTML tables, pictures, text, JSON, maths and tracebacks with their colours. Widgets and JavaScript charts need a running kernel, so they get a short note instead, or the still picture the notebook saved beside them.

Notebooks can be written by anyone, so everything HTML in one is cleaned before it reaches the page: scripts, event handlers, forms and frames are removed, and pictures from other sites are not loaded. You see a note with their address instead, because loading them would tell that site you opened the file.

Good to know

How to open a Jupyter notebook without Jupyter3 steps, all on your device
  1. Open the notebook. Drop a .ipynb file on the card, choose it from your device, or paste the notebook’s JSON. Notebooks from Jupyter, JupyterLab, VS Code, Google Colab and Kaggle all open.
  2. Read it. Every cell is shown with its last outputs. Jump around with the contents, fold the code or the outputs, or turn on Hide code to read it like an article.
  3. Save a copy. Export it as a PDF, a standalone HTML page, a script or Markdown. Each file is made in your browser and saved straight to your device.

Frequently Asked Questions

Is my notebook uploaded anywhere?

No. The file is read by code running in this tab and nothing is sent anywhere, not even pictures the notebook links to on other sites. You can check it in your browser’s network panel: open a notebook and watch that no request leaves. Nothing is saved either; close the tab and it is gone.

Do I need Python or Jupyter installed?

No. A notebook stores the results of its last run, so reading it needs no Python at all. The code is shown but not run; the tables, charts and printed text are the ones the author saw when they saved it.

Why are some outputs a grey note instead of a chart?

Interactive outputs, such as ipywidgets sliders and some Plotly or Bokeh charts, are small programs that need a running kernel. A notebook often saves only the program, not a picture, so there is nothing to show without running it in Jupyter. When the notebook did save a still picture beside it, that picture is shown.

Can I open a notebook from a link?

Not in this version. Fetching a link would mean contacting another site for you, and most sites don’t let a page in your browser read their files anyway. Download the .ipynb first, then drop it here. For a notebook on GitHub, use the Download raw file button.

Which notebooks open?

Any .ipynb in the current format (nbformat 4), from Jupyter, JupyterLab, VS Code, Colab, Kaggle or Databricks exports, and older nbformat 3 files too. Large notebooks open as well: the cells are drawn as you reach them, and very long outputs show their first lines with a button to show the rest.

“Jupyter” is a trademark of Project Jupyter, used here only to say which files this viewer opens. Binary Decimal is not affiliated with or endorsed by Project Jupyter.