---
myst:
html_meta:
description: "See instruments and publishers as cards in Jupyter, VS Code and Colab notebooks"
---
# Notebook display
{.lead}
Instruments and publishers display as cards in Jupyter, VS Code and Colab notebooks. A card needs no setup and never talks to the hardware.
## Overview
In Jupyter, VS Code and Colab, an instrument or publisher at the end of a cell displays as a card. Outside a notebook, `repr()` gives a one-line summary.
```python
from instro import InstroPSU
from instro.drivers import VirtualPSU
psu = InstroPSU(name="bench", driver=VirtualPSU(), num_channels=2, dataset_rid="")
psu.start()
psu # shows the card
```
An instrument's card shows its driver, background daemon, publishers, default tags and, once `start()` has been called, the latest value of every channel. A card shows only what `instro` already holds in memory, so displaying an instrument never talks to the hardware.
Each publisher has a card too. A {py:class}`~instro.lib.publishers.nominal_core.NominalCorePublisher` card links its dataset in Nominal.
The [notebook display example](/examples/notebooks/notebook_display.md) shows each card and needs no hardware or Nominal credentials. From a clone of the repository, `just notebook` opens it in JupyterLab: open `notebook_display.md` with **Open With → Jupytext Notebook**.
## Display options
{py:func}`instro.lib.set_display_options` changes every card, as a call or for the length of a `with` block:
```python
from instro.lib import set_display_options
set_display_options(timezone="America/Los_Angeles", time_precision="ms")
with set_display_options(show_link=False):
psu # no request to resolve the Nominal workspace
```
| Option | Default | Effect |
| --- | --- | --- |
| `style` | `"html"` | `"text"` keeps the plain `repr` |
| `timezone` | `"UTC"` | `"local"` or an IANA name |
| `time_format` | `"iso"` | `"readable"`: `2026-11-02 09:52:57 MST` |
| `time_precision` | `"s"` | `"ms"`, `"us"` or `"ns"`. Hovering shows the full value. |
| `show_link` | `True` | Link datasets to Nominal. The first link for a client makes one request to resolve its workspace. |
| `collapse_threshold` | `10` | Sections with more items start collapsed |
| `max_items` | `50` | Items listed per section |
## Custom instruments and publishers
A custom {py:class}`~instro.lib.Instrument` subclass gets a default card automatically. To customize the card, override `_display_fields()` and return `(label, html)` pairs built from in-memory state only. Start from `super()._display_fields()` to keep the rows of the class you extend:
```python
from instro.lib import _display
from instro import InstroPSU
class BenchPSU(InstroPSU):
def _display_fields(self):
return [*super()._display_fields(), ("Location", _display.escape("bench 3"))]
```
To replace the whole card, override `_repr_html_()`.
An instrument's card describes each publisher in one line. A publisher without `_display_summary()` shows its class name. Define `_display_summary()`, returning one line of HTML, to describe it there; a subclass of a built-in publisher can extend the built-in line with `super()._display_summary()`.