A modular, plugin-driven platform for loading, visualizing, and analyzing graphs in the browser.
📖 Full documentation: nessie-docs
Nessie Graph Explorer is an open-source developer tool for graph visualization and analysis. It is built around a plugin system — every piece of functionality (loading data, rendering the UI, filtering, visualizing nodes and edges) is provided by a Python plugin that registers handlers for named actions.
- Connect any data source — SQLite databases, npm registries, Python AST, CSV files, or your own API
- Multiple visualizers — swap between rendering styles without reloading
- Attribute filtering — filter nodes by any attribute with
==,!=,>,>=,<,<=operators - Full-text search — search across all node attributes simultaneously
- Multi-workspace — open multiple graphs side by side in tabs
- In-browser CLI — create, edit, and delete nodes and edges live from the console panel
- D3-powered force layout — interactive, draggable, zoom-pannable graphs
- CLI tooling — npm-based CLI for project setup, plugin management, and server startup
# Install the CLI
npm install -g @nessie-org/cli
# Create a project (scaffolds venv, clones core, installs plugins)
nessie setup my-project
# Start the Flask web server
cd my-project
nessie start flaskOpen http://localhost:8000 — click + to load your first graph.
┌──────────────────────────────────────────────────────────┐
│ Web Server (Flask or Django) │
├──────────────────────────────────────────────────────────┤
│ Datasource │ Visualizer │ Manipulation │ Plugins
│ load_graph │ visualise_graph │ filter_graph │
│ Nessie Web │ nessie-cli │ ··· │
├──────────────────────────────────────────────────────────┤
│ Platform: PluginManager · WorkspaceManager │
│ Context │
├──────────────────────────────────────────────────────────┤
│ nessie-api: Graph · Node · Edge · Action · Plugin │
└──────────────────────────────────────────────────────────┘
Plugins communicate through named actions. The PluginManager discovers all installed plugins via Python entry points at startup — no manual wiring.
| Repo | Description |
|---|---|
nessie-api |
Shared models: Graph, Node, Edge, Plugin, Action, FilterExpression, Context protocol |
Nessie |
Platform runtime: PluginManager, WorkspaceManager, Context implementation |
| Repo | Description |
|---|---|
@nessie-org/cli |
npm CLI — project setup, plugin management, server start |
| Repo | Description |
|---|---|
flask-web-nessie |
Flask HTTP server |
django-web-nessie |
Django HTTP server |
| Repo | Action | Description |
|---|---|---|
nessie-web |
render |
Web UI renderer — D3 graph, sidebar, minimap, console, filters |
nessie-relationaldb-datasource-plugin |
load_graph |
SQLite → Graph (tables = nodes, FK = edges) |
nessie-npm-dependencies-plugin |
load_graph |
npm dependency tree crawler |
nessie-python-datasource-plugin |
load_graph |
Python AST → Graph (classes, functions, call edges) |
nessie-graph-manipulation-plugin |
filter_graph |
Attribute filters + full-text search |
nessie-simple-visualizer-plugin |
visualise_graph |
Circle-based SVG visualizer |
neisse-graph-visualiser-block |
visualise_graph |
Block/card SVG visualizer showing all attributes |
nessie-cli |
cli_execute |
In-browser graph editing CLI (textX grammar) |
Any Python package that declares a nessie_plugins entry point and handles one or more actions is a Nessie plugin. The minimum viable plugin:
from nessie_api.models import Graph, GraphType, plugin, Action, SetupRequirementType
from nessie_api.protocols import Context
def load_graph(action: Action, context: Context) -> Graph:
path = action.payload["File Path"]
# ... build and return a Graph object ...
@plugin("My Datasource")
def my_plugin():
return {
"handlers": {"load_graph": load_graph},
"requires": [],
"setup_requires": {"File Path": SetupRequirementType.STRING},
}# pyproject.toml
[project.entry-points."nessie_plugins"]
my_plugin = "my_package:my_plugin"All Nessie repositories are licensed under Apache 2.0 or MIT.
Copyright © 2026 Nessie-org