Two Python packages for the General Modeling Network Specification (GMNS), developed under the Zephyr Foundation.
| Package | What it is | PyPI name | Docs |
|---|---|---|---|
netstead |
GMNS toolkit — build, load, validate, scope, edit GMNS networks, explore in a browser Workbench | netstead (release pending; install from GitHub) |
e-lo.github.io/netstead/netstead/ |
corral |
Generic Frictionless Data Package engine that netstead builds on |
dbcorral (release pending) |
e-lo.github.io/netstead/corral/ |
Most users only install netstead. corral comes as a transitive dependency.
We're shipping the v1.0 rewrite as a public beta. If you can spare half an hour to try it on a real network, your feedback shapes GA.
The packages were renamed from gmnspy / datagrove in October 2026 and the first PyPI release under
the new names is pending, so install the beta from GitHub (both packages, in one command):
uv init --bare
uv add \
"dbcorral @ git+https://github.com/e-lo/netstead.git@main#subdirectory=packages/corral" \
"netstead[all] @ git+https://github.com/e-lo/netstead.git@main#subdirectory=packages/netstead"
uv run netstead doctorRun it in a new, empty folder: uv init --bare makes the folder a uv project, which uv add needs (skip it
inside a project you already have), and uv run netstead doctor confirms the install. pip install takes the
same two package arguments, inside an activated virtual environment. Once netstead 1.0.0b2 is on PyPI this
becomes uv add 'netstead[all]==1.0.0b2'.
- 📖 Beta program details — what's in scope, how to report
- 🐛 File a beta-feedback issue
- 📝 Migration from v0.3.x
import netstead
from netstead.fixtures import leavenworth # bundled example network
net = netstead.read(leavenworth.csv_dir()) # auto-detect format
report = netstead.validate(net) # structural + schema + FK + sync
print(f"{net.links.count()} links, {len(report.issues)} validation issues")
report.to_html("report.html") # interactive single-file HTMLMore: the 5-minute quickstart.
netstead builds on a generic Frictionless engine (corral) extracted up front. The intent: future spec toolkits (GTFSpy, etc.) reuse the engine instead of reimplementing it. Both packages release independently; CI tests them together.
netstead/
├── packages/
│ ├── corral/ # generic engine — PyPI package
│ └── netstead/ # GMNS toolkit on top — PyPI package
├── skills/ # Claude Code Skills (copy into a project's .claude/skills/)
├── docs/ # umbrella landing page only — real docs are per-package
└── .github/ # CI/CD, issue templates, release-drafter
Workspace managed via uv. One command installs both packages with all extras editable:
git clone https://github.com/e-lo/netstead.git
cd netstead
uv sync --all-packages --all-extras
uv run netstead --help # CLI
uv run pytest packages -n auto # fast test tier (full: add -m ""; see CONTRIBUTING.md)Full contributor workflow: CONTRIBUTING.md.
zephyr-data-specs/GMNS— upstream spec.- Zephyr Foundation — project home.
- See CONTRIBUTORS.md.