Skip to content
PointillViz
PointillViz

© 2026 PointillViz

Build & publish a tool

A tool is one Python file and a manifest. This page outlines the author’s loop; the full guide is in preparation.

Guide in preparation

How tools work · Docs

What a tool is

tool.py defines run(ds, params); plugin.json declares its parameters, needs and outputs.

Vector Field 1.0.0 · Xenium 5K · mouse colon · 135,232 cells
Anatomy of the Vector Field tool. Left, tool.py: run(ds, params) returns cells, vectors and series. Below it, five parameters of plugin.json with their types (select, gene, float, int, bool), each joined to the control the viewer generated for it in the tool’s form. Right, the result drawn on a Xenium 5K mouse colon section: cells coloured by the local mean of Epcam, white arrows along its gradient, the series as a small line, and the whole section with the enlarged field boxed.
tool.py: run(ds, params) returns cells, vectors and series. plugin.json: five parameters with their types, each joined to the control the viewer generated for it in the tool’s form. The result drawn on a Xenium 5K mouse colon section: cells coloured by the local mean of Epcam, white arrows along its gradient, and the whole section with the enlarged field boxed.

The author’s loop

plugin_scaffold plugin_validate plugin_pack publish

The gates run again on publish and again on install.

  1. Start from the scaffold

    plugin_scaffold writes a starter tool that already passes every gate.

  2. Write run(ds, params)

    Read the dataset through ds, and return the outputs the manifest declares.

  3. Declare the manifest

    Each typed parameter becomes a control; requirements decide which datasets offer the tool.

  4. Validate

    plugin_validate runs the nine gates locally and names the one that failed.

    Nine gates

  5. Pack

    plugin_pack writes a single .pvtool bundle.

  6. Publish Coming soon

    The store runs the gates again and lists the tool only if every required gate passes.

    Nine gates, again

  7. Install

    The viewer runs the gates once more before it installs.

    Nine gates, once more

Write one with a coding agent

A guide written for coding agents carries the contract the gates check.

Download the guide

The nine gates

What each gate checks, in the order they run.

#GateWhat it checks
1bundleThe archive’s layout, size and file types.
2manifestEvery field of plugin.json, defaults included.
3entrytool.py imports and defines run(ds, params).
4imports advisoryReports network, subprocess, file-write, dynamic-code and environment use, with file and line. Advisory: it never blocks.
5fixtureRuns on a synthetic dataset at its own defaults, within its time and memory limits.
6resultReturns the declared outputs and no others, each with values to draw.
7determinismTwo runs with the same parameters give the same result.
8edgeRuns with every parameter at its minimum, then at its maximum, without crashing.
9no_mutationWrites nothing into the dataset.

Safety

A tool is arbitrary Python; read the safety note before you install one.

Read the safety note