Multi-vendor network config translator with a verifiable cross-vendor audit
Reason this release was yanked:
bad release
Project description
Netcanon
Multi-vendor network config translator with a verifiable cross-vendor audit.
Translates running-config between Cisco IOS-XE, Juniper Junos, Aruba
AOS-S, Arista EOS, FortiGate, MikroTik RouterOS, and OPNsense.
Per-field capability declarations and a cross-mesh audit catch silent
translation errors before they ship. Explicit Tier-3 boundary on
firewall / NAT / VPN / QoS — see
docs/CAPABILITIES.md. See also
docs/COMPARISON.md for positioning vs Batfish /
Capirca / NAPALM and the rest of the network-automation landscape.
Two concerns, one FastAPI application:
- Backup — pull
running-config(or vendor equivalent) from network devices over SSH / NETCONF / REST, store verbatim inconfigs/<hostname>.<ext>. Runs on a schedule or on demand. - Migration — translate a stored backup from one vendor's config grammar to another through a shared canonical intent tree. Cisco IOS-XE → Aruba AOS-S, FortiGate → OPNsense, etc.
Ships on two platforms kept at strict feature parity:
| Platform | Package | Entry point |
|---|---|---|
| Web (browser) | netcanon/ |
uvicorn netcanon.main:app |
| Desktop (Windows) | netcanon_desktop/ |
python -m netcanon_desktop |
Quickstart
pip install -e ".[dev]"
uvicorn netcanon.main:app --host 127.0.0.1 --port 8000
# -> http://127.0.0.1:8000 (UI)
# -> http://127.0.0.1:8000/docs (Swagger)
Desktop shell:
pip install -e ".[desktop]"
python -m netcanon_desktop
Run the test suite:
pytest # unit + integration + desktop (fast)
pytest -m e2e # Playwright browser tests (slower)
Tests run across four layers: unit (pure functions, no I/O — the real-capture validation harness lives here as a unit subset), integration (TestClient + mocked SSH), e2e (Playwright against a live Uvicorn), and desktop (PySide6 + pystray mocked). CI output is the source of truth for pass counts.
Where to go next
| You want to… | Start here |
|---|---|
| Understand the architecture | ARCHITECTURE.md — four-layer model, canonical bridge, codec types |
| Follow the contributor rules | CLAUDE.md — hard rules, parity checklist, gotchas |
| Look up project jargon | docs/glossary.md — canonical, codec, mesh, ship-before-wire, target profile, etc. |
| Read the canonical model overview | netcanon/migration/canonical/README.md — Tier 1 / 2 / 3 fields and promotion rules |
| Add or change an HTTP route | netcanon/api/routes/README.md — frozen pipeline-stage signatures, endpoint inventory |
| Add a new codec (vendor parser/renderer) | netcanon/migration/codecs/README.md |
| Add a new device definition / target profile | definitions/README.md — layered definitions (family base + os_version / model overlays), target-profile module-variant schema |
| Add a new canonical field | docs/adding-a-canonical-field.md — MTU as a worked example |
| Add a new target-profile YAML | docs/adding-a-target-profile.md — flat-port + module-variant shapes, fit-check propagation |
| Ship a feature across web + desktop | docs/feature-parity-walkthrough.md — SNMPv3 USM rename as a worked example |
| See what's shipped recently / current state | CHANGELOG.md — authoritative per-wave shipping log |
| Read the slower-changing architectural sketch | translator-plans.txt — dense, grep-friendly long-term roadmap; most R / GAP / Phase items now [SHIPPED] |
| Check codec certification tiers | tests/fixtures/real/RESULTS.md |
| Manually exercise recent changes | HUMAN_TESTING.md |
| Write tests | tests/README.md |
| Review the security model | SECURITY.md — threat model, controls, known limitations |
| Look up what Netcanon translates and what it doesn't | docs/CAPABILITIES.md — operator-facing capabilities, per-codec unsupported/lossy paths, Tier-3 boundary, notification surfaces |
Layout
netcanon/ FastAPI application (shared by both platforms)
├── api/routes/ HTTP endpoints (backups, migration, configs, …)
├── collectors/ SSH/NETCONF/REST fetchers — one factory,
│ one mock-point (`get_collector`)
├── migration/ Cross-vendor translation pipeline
│ ├── canonical/ CanonicalIntent model + shared transforms
│ ├── codecs/ Per-vendor parse/render implementations
│ └── ...
├── services/ Plain-function orchestrators (pipeline, detect, …)
├── storage/ FileConfigStore
└── templates/ Jinja2 templates (every interactive element
must carry a data-testid — see CLAUDE.md)
netcanon_desktop/ Windows tray/webview shell around the same server
definitions/ Device definition YAMLs (shared with backup layer)
tests/unit/ Pure-function tests, no I/O
tests/integration/ FastAPI TestClient tests, SSH mocked at get_collector
tests/e2e/ Playwright browser tests against a live Uvicorn
tests/desktop/ PySide6/pystray-mocked desktop shell tests
tests/fixtures/real/ Real-capture validation corpus (see RESULTS.md)
scripts/ One-off utilities (Aruba template renderer, …)
Certification status
Per-codec certainty (read from CanonicalCodec.certainty at module load,
surfaced via GET /api/v1/migration/adapters). See
tests/fixtures/real/RESULTS.md for
the live per-codec status — RESULTS.md is the source of truth and this
README intentionally omits per-codec counts to avoid drift.
License
See SECURITY.md for responsible-disclosure policy.
Project licence is per-file (most files are MIT; third-party fixtures
keep their upstream licences — see
tests/fixtures/real/NOTICE.md).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netcanon-0.1.0.tar.gz.
File metadata
- Download URL: netcanon-0.1.0.tar.gz
- Upload date:
- Size: 480.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
21401922ccffa6cd74b62cbe463a925d541804cb055093e13ca4d6977a85887e
|
|
| MD5 |
d30600a0323fe8bd381ffa3aae082303
|
|
| BLAKE2b-256 |
24e870185ff9d603f01d42a06a34ae68b1c5fc8918c9c8bd49447b0b5ff8590f
|
Provenance
The following attestation bundles were made for netcanon-0.1.0.tar.gz:
Publisher:
pypi-publish.yml on netcanon/netcanon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netcanon-0.1.0.tar.gz -
Subject digest:
21401922ccffa6cd74b62cbe463a925d541804cb055093e13ca4d6977a85887e - Sigstore transparency entry: 1469181141
- Sigstore integration time:
-
Permalink:
netcanon/netcanon@93e711b77f79c799fa740884f083433b8c45682e -
Branch / Tag:
refs/tags/v0.1.0-rc1 - Owner: https://github.com/netcanon
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@93e711b77f79c799fa740884f083433b8c45682e -
Trigger Event:
push
-
Statement type:
File details
Details for the file netcanon-0.1.0-py3-none-any.whl.
File metadata
- Download URL: netcanon-0.1.0-py3-none-any.whl
- Upload date:
- Size: 553.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8a69b996e75223131c35f3ae8850dea4eb83b5bb249e216b0557e9da979ec26d
|
|
| MD5 |
e34c63987e67be9a2e61ebfa618f388a
|
|
| BLAKE2b-256 |
d79a13614b8e57491a4779b4e9d13f519f020a61c6daa6b3ab5791c337999f56
|
Provenance
The following attestation bundles were made for netcanon-0.1.0-py3-none-any.whl:
Publisher:
pypi-publish.yml on netcanon/netcanon
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
netcanon-0.1.0-py3-none-any.whl -
Subject digest:
8a69b996e75223131c35f3ae8850dea4eb83b5bb249e216b0557e9da979ec26d - Sigstore transparency entry: 1469181319
- Sigstore integration time:
-
Permalink:
netcanon/netcanon@93e711b77f79c799fa740884f083433b8c45682e -
Branch / Tag:
refs/tags/v0.1.0-rc1 - Owner: https://github.com/netcanon
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@93e711b77f79c799fa740884f083433b8c45682e -
Trigger Event:
push
-
Statement type: