# Jupyter Notebook

> Install the Jupyter notebook app on your NOVA instance, open interactive notebooks, and prototype robot motions with the Python SDK.

Jupyter notebooks are interactive documents that combine executable Python code with rich text documentation. This makes it straightforward when it comes to describing what you are doing, adding screenshots, and executing code in one place.

Video: [/video/programming/notebook-on-local.webm#t=0.1](/video/programming/notebook-on-local.webm#t=0.1)

Running the NOVA SDK notebook locally while iterating on your app.

> **Info:** Use Markdown cells for your explanations (for example headings, bullet lists, or embedded images) and Python code cells for commands you want to run. This mix keeps your experiments reproducible and allows teammates to quickly understand and follow your work for review.

## Prerequisites

- You have a NOVA cloud instance running including a robot: create the instance in the [NOVA Cloud quickstart](/nova-cloud/quickstart), then add a robot with the [Wandelbots NOVA quickstart](/nova/latest/quickstart).
  The local development setup will interact with this instance.
- You completed the [local development setup](/developer/local-development): the NOVA CLI is installed and you created a project from the Python template.
  You won't deploy an app in this tutorial, but you still need the project in which you will use the Jupyter notebook.

## Install Jupyter notebook

Run the following command in terminal to add necessary python packages to your project.

```bash
uv add ipykernel
```

### Create a notebook

Now, in any folder in your project you can create a file with `.ipynb` extention and visual studio code will see this as a Jupyter Notebook app.
Go ahead and create a file named: `my_notebook.ipynb`

### Explore the notebook interface

1. Click `+ Markdown` to add documentation blocks and `+ Code` to insert executable Python cells.
2. Press `Shift + Enter` to run the active cell.\
   → The output appears directly underneath so you can see results immediately.

### Run some example python code

Create a short Markdown cell to describe what the notebook does, then add a code cell underneath to print a confirmation message. This pattern keeps intent next to execution.

```markdown
# My first Jupyter experiment
In the next cell I print a message to confirm the notebook runs code.
```

```python
message = "Hello from Jupyter!"
print(message)
```

### Connect to NOVA

Now eveything is ready to start writing some Python SDK code.
Let's start by connecting to NOVA.

```python
from nova import Nova

nova = Nova()
await nova.connect()
```

### List all controllers

Let's list all the robot controllers available in your cell.

```python
cell = nova.cell()
controllers = await cell.controllers()
for controller in controllers:
    print(controller.id)
```

### Let's plan a motion

Let's use a motion group and plan some robot movements.

```python
from nova.actions import ptp

motion_group = controllers[0].motion_group(motion_group_id="@ur10e")
actions = [
    ptp((724.3, -11, 564.8, -3.1414, -0.0003, 0.001)),
]

joint_trajectory = await motion_group.plan(actions, "Flange")
print(joint_trajectory)
```

### Congratulations 🎉

You have now finished this tutorial. Go ahead and try out more with Python SDK.
Check our [examples](https://github.com/wandelbotsgmbh/wandelbots-nova/tree/main/examples).
Create notebooks and share them with your colleagues.
