Vendor-agnostic network discovery and Neo4j graph ingestion pipeline
Project description
MeshOptixIQ Network Discovery
Vendor-agnostic network discovery and graph ingestion pipeline. Collects CLI output from network devices via Netmiko over SSH, parses it into canonical Pydantic models, normalizes and deduplicates the data, and ingests it into Neo4j or PostgreSQL.
┌─────────────┐ ┌──────────────┐ ┌────────────┐ ┌───────────────┐ ┌──────────┐
│ Inventory │────▶│ Netmiko │────▶│ Vendor │────▶│ Normalization │────▶│ Neo4j / │
│ (YAML) │ │ Collector │ │ Parsers │ │ & Dedup │ │ Postgres │
└─────────────┘ └──────────────┘ └────────────┘ └───────────────┘ └──────────┘
│ │ │
▼ ▼ ▼
Raw CLI Output Canonical Models Validated Facts
(JSON files) (Pydantic v2) (Schema v1)
Table of Contents
- Installation
- Configuration
- CLI Usage
- API Server
- Query Library
- Docker Deployment
- Cluster Mode
- Kubernetes / Helm
- Database Backends
- Supported Vendors
- Data Model
- Enterprise Features
- MCP Server
- Development
- Licensing
Installation
Local (development)
cd network_discovery
# Core install (Neo4j backend)
pip install -e ".[dev]"
# With PostgreSQL support
pip install -e ".[dev,postgres]"
# With cluster (Redis) support
pip install -e ".[dev,cluster]"
# With MCP server support
pip install -e ".[dev,mcp]"
# All enterprise features
pip install -e ".[dev,enterprise]"
After installation the meshq CLI is available on your PATH.
Docker
# From the repo root
docker build --target runtime -t meshoptixiq/meshoptixiq:latest .
docker build --target enterprise -t meshoptixiq/meshoptixiq:enterprise-latest .
Configuration
Core Environment Variables
| Variable | Default | Description |
|---|---|---|
API_KEY |
(required) | API key — server refuses to start without it |
GRAPH_BACKEND |
neo4j |
neo4j or postgres |
MESHOPTIXIQ_LICENSE_KEY |
(required by API server) | License key; CLI and MCP no longer need this — they query the local API |
MESHOPTIXIQ_API_URL |
http://localhost:8000 |
Local API server URL used by CLI + MCP for plan resolution |
DEVICE_PASSWORD |
(none) | Default SSH password for collection |
CORS_ORIGINS |
(empty — denied) | Comma-separated allowed CORS origins |
Neo4j
| Variable | Default | Description |
|---|---|---|
NEO4J_URI |
bolt://localhost:7687 |
Bolt connection URI |
NEO4J_USER |
neo4j |
Username |
NEO4J_PASSWORD |
(empty) | Password (required in production) |
PostgreSQL
| Variable | Default | Description |
|---|---|---|
POSTGRES_DSN |
postgresql://postgres:postgres@localhost:5432/network_discovery |
Connection string |
POSTGRES_POOL_MIN |
2 |
Minimum pool connections |
POSTGRES_POOL_MAX |
10 |
Maximum pool connections |
Clustering (Redis)
| Variable | Default | Description |
|---|---|---|
REDIS_URL |
(none) | Activates cluster mode when set |
Authentication & RBAC
| Variable | Default | Description |
|---|---|---|
AUTH_MODE |
api_key |
api_key, oidc, or both |
OIDC_DISCOVERY_URL |
(none) | OIDC provider discovery URL |
OIDC_CLIENT_ID |
(none) | OIDC client ID |
RBAC_POLICY_FILE |
(none) | Path to YAML RBAC policy file (hot-reloaded every 30 s) |
RBAC_POLICY |
(none) | Inline YAML RBAC policy string |
RBAC_RELOAD_INTERVAL |
30 |
Seconds between RBAC file mtime checks |
Inventory File
# inventory.yaml
devices:
- hostname: core-sw-01
host: 192.168.1.1
vendor: cisco_ios
username: admin
password_env: DEVICE_PASSWORD # reads from environment variable
- hostname: fw-01
host: 10.0.0.1
vendor: paloalto_panos
username: netops
key_file: ~/.ssh/id_rsa # SSH key auth
CLI Usage
meshq ingest — Full pipeline
meshq ingest --source inventory.yaml [--output-dir ./output] [--dry-run] [--workers N] [-v]
| Flag | Description |
|---|---|
--source PATH |
Inventory YAML file (required) |
--output-dir DIR |
Directory for raw JSON output (default: output/) |
--dry-run |
Collect, parse, normalize but skip database writes |
--workers N |
Concurrent SSH threads (default: 10) |
-v |
Debug logging |
Pipeline stages: API license check → collect → parse → normalize → ingest.
meshq collect — Collection modes
# Standard: collect all devices in inventory
meshq collect --source inventory.yaml
# Dispatch: push device list to Redis queue, then exit
meshq collect --source inventory.yaml --dispatch
# Worker: pop devices from queue, collect, ingest, repeat
meshq collect --worker [--poll-interval 5]
| Flag | Description |
|---|---|
--source PATH |
Inventory YAML (required for standard + dispatch) |
--dispatch |
Push all devices to Redis queue and exit |
--worker |
Pop-collect-ingest loop (requires REDIS_URL) |
--poll-interval N |
Idle seconds between pops in --worker mode (default: 5) |
meshq parse — Parse existing raw files
meshq parse --raw-dir output/raw/
meshq export — Export Ansible inventory
meshq export --format ansible [--output inventory.json]
meshq export --format ansible --output inventory.ini # legacy INI format
meshq sync — NetBox sync
meshq sync --target netbox [--direction push|pull|both] [--dry-run]
meshq status / meshq version
meshq status # Check backend connectivity
meshq version # Print version (no license required)
API Server
Starting the server
# Local
uvicorn network_discovery.api.main:app --host 0.0.0.0 --port 8000
# Docker
docker run -d -p 8000:8000 \
-e NEO4J_URI=bolt://host.docker.internal:7687 \
-e NEO4J_PASSWORD=secret \
-e API_KEY=changeme \
meshoptixiq/meshoptixiq:latest
Interactive Swagger docs: http://localhost:8000/docs
Endpoints
Health
| Method | Path | Auth | Description |
|---|---|---|---|
GET |
/health |
No | Process alive check |
GET |
/health/ready |
No | Backend reachability; includes pool_available for postgres |
GET |
/health/redis |
No | Redis cluster connectivity |
GET |
/health/license |
No | License plan tier, expiry date, and days remaining |
Queries
| Method | Path | Auth | Description |
|---|---|---|---|
GET |
/queries/ |
Yes | List all 25 queries with metadata |
GET |
/queries/{name} |
Yes | Query details |
POST |
/queries/{name}/execute |
Yes | Execute with parameters |
Collection Queue (cluster mode)
| Method | Path | Auth | Description |
|---|---|---|---|
GET |
/collect/status |
Yes | Queue depth + in-flight count |
POST |
/collect/dispatch |
Yes | Push device list to queue |
POST |
/collect/recover |
Yes | Re-queue stale in-flight devices |
Admin
| Method | Path | Auth | Description |
|---|---|---|---|
GET |
/admin/config |
Yes | Sanitized runtime config (admin role) |
POST |
/admin/rbac/reload |
Yes | Force RBAC policy reload + broadcast |
Other
| Method | Path | Auth | Description |
|---|---|---|---|
GET |
/auth/me |
Yes | Current user context |
GET |
/events |
Yes | SSE stream (30 s keepalive) |
GET |
/history/snapshots |
Yes | Historical metric snapshots |
GET |
/history/diff |
Yes | Compare two snapshots by timestamp (?from_ts=…&to_ts=…) |
POST |
/graph/whatif |
Yes | Simulate proposed NetworkFacts against current state (pro+ only) |
GET |
/inventory/ansible |
Yes | Ansible dynamic inventory (?format=ini) |
Authentication
API_KEY is required. Pass via X-API-Key header or ?api_key= query parameter (for SSE EventSource):
curl -H "X-API-Key: $API_KEY" http://localhost:8000/queries/
Query Library
25 queries across 7 categories, each with Cypher (Neo4j) and SQL (PostgreSQL) implementations.
Topology
| Query | Parameters | Description |
|---|---|---|
device_neighbors |
device_name |
Devices directly connected to a given device |
interface_neighbors |
device_a, device_b |
Interfaces connecting two devices |
topology_edges |
(none) | All edges in the topology graph |
topology_summary |
(none) | Device and link count summary |
all_devices |
(none) | All known devices |
topology_neighborhood |
device, depth |
N-hop neighborhood subgraph around a focal device |
Endpoints
| Query | Parameters | Description |
|---|---|---|
locate_endpoint_by_ip |
ip, vrf (optional) |
Find endpoint by IP address; filter by VRF |
locate_endpoint_by_mac |
mac |
Find endpoint by MAC address |
endpoints_on_interface |
device, interface |
Endpoints on a specific interface |
Blast Radius
| Query | Parameters | Description |
|---|---|---|
blast_radius_interface |
device, interface |
Endpoints impacted by interface failure |
blast_radius_device |
device |
Endpoints impacted by device failure |
blast_radius_vlan |
vlan |
Endpoints in a VLAN |
blast_radius_subnet |
cidr |
Endpoints in a subnet |
Addressing
| Query | Parameters | Description |
|---|---|---|
ips_in_subnet |
cidr, vrf (optional) |
IPs allocated in a subnet; filter by VRF |
subnets_on_device |
device |
Subnets present on a device |
orphaned_ips |
(none) | IPs with no known subnet |
Hygiene
| Query | Parameters | Description |
|---|---|---|
devices_without_neighbors |
(none) | Isolated devices |
interfaces_without_ips |
(none) | Interfaces missing IP assignments |
endpoints_without_location |
(none) | Endpoints with no physical port |
Firewall
| Query | Parameters | Description |
|---|---|---|
firewall_rules_by_device |
device_name |
All rules for a firewall, ordered by precedence |
firewall_rules_by_zone_pair |
src_zone, dst_zone |
Rules between a source/destination zone pair |
path_analysis |
src_ip, dst_ip |
Rules matching traffic between two IPs |
all_firewall_devices |
(none) | All devices with collected firewall rules |
deny_rules_summary |
(none) | All deny/drop/reject rules across every firewall |
Inventory
| Query | Parameters | Description |
|---|---|---|
update_device_metadata |
(none) | Pull nb_site/tenant/rack from NetBox onto Device nodes |
Example:
curl -X POST http://localhost:8000/queries/blast_radius_device/execute \
-H "Content-Type: application/json" \
-H "X-API-Key: changeme" \
-d '{"parameters": {"device": "core-sw-01"}}'
Docker Deployment
# API + Neo4j
docker run -d -p 8000:8000 \
-e NEO4J_URI=bolt://host.docker.internal:7687 \
-e NEO4J_PASSWORD=secret \
-e API_KEY=changeme \
meshoptixiq/meshoptixiq:latest
# Collection job (API server must be running; CLI resolves plan from it)
docker run --rm \
-e NEO4J_URI=bolt://host.docker.internal:7687 \
-e NEO4J_PASSWORD=secret \
-e MESHOPTIXIQ_API_URL=http://host.docker.internal:8000 \
-v $(pwd)/configs:/app/configs \
meshoptixiq/meshoptixiq:latest \
meshq ingest --source /app/configs/inventory.yaml
Cluster Mode
Multiple API pods share state via Redis. Set REDIS_URL to enable:
export API_KEY=secret
docker compose -f docker-compose.cluster.yml up --build
The cluster stack runs 3 API instances, 2 collection workers, a dispatcher, Redis, Neo4j, and nginx.
How device distribution works
meshq collect --dispatch → meshq:collect_queue (Redis List)
│ LPOP (atomic)
┌───────────────┼───────────────┐
worker-1 worker-2 worker-N
(SSH → parse → ingest)
Each device is claimed by exactly one worker per collection cycle via LPOP. Stale in-flight items are re-queued automatically via POST /collect/recover.
Queue Redis keys
| Key | Type | Purpose |
|---|---|---|
meshq:collect_queue |
List | Pending device JSON blobs |
meshq:collect_processing |
Hash | hostname → {device_json, started_at} |
meshq:collect_results |
Sorted Set | hostname → unix-ms of last success |
meshq:collect_lock |
String (NX TTL=60s) | One dispatcher at a time |
Kubernetes / Helm
helm lint helm/meshoptixiq
helm install meshoptixiq helm/meshoptixiq \
--set api.key=secret \
--set neo4j.uri=bolt://neo4j:7687 \
--set neo4j.password=secret \
--set redis.url=redis://redis:6379 \
--set collector.inventoryConfigMap=my-inventory
The chart deploys:
- API Deployment + HPA (CPU 70%, min 2 / max 10)
- Collector worker Deployment (2 replicas,
meshq collect --worker) - Dispatcher CronJob (
concurrencyPolicy: Forbid) - SSE-safe nginx Ingress
- ConfigMap + Secret (no inline secrets in Deployment)
Database Backends
Neo4j (default)
Set GRAPH_BACKEND=neo4j. Uses MERGE for idempotent ingestion and native graph relationships.
PostgreSQL
Set GRAPH_BACKEND=postgres. Install the extra:
pip install -e ".[postgres]"
The provider uses a ConnectionPool (psycopg-pool) with configurable min/max size:
POSTGRES_POOL_MIN=2 # default
POSTGRES_POOL_MAX=10 # default
Tables are auto-created from graph/postgres/schema.sql on first connection. All writes use INSERT ... ON CONFLICT upserts inside explicit transactions.
Supported Vendors
| Vendor | Key | Topology | Firewall Policies |
|---|---|---|---|
| Cisco IOS | cisco_ios |
Interfaces, ARP, CDP, VLANs, MACs | — |
| Juniper JunOS | juniper_junos |
Interfaces, ARP, LLDP | Security policies, address book |
| Arista EOS | arista_eos |
Interfaces, ARP, LLDP | — |
| Aruba OS | aruba_os |
Interfaces, ARP | — |
| Palo Alto PAN-OS | paloalto_panos |
— | Security policies, address objects, service objects |
| Fortinet FortiGate | fortinet |
— | Firewall policies, address objects |
| Cisco ASA | cisco_asa |
— | ACLs, object groups |
| Cisco FTD | cisco_ftd |
— | Policies |
| CheckPoint GAIA | checkpoint_gaia |
— | Policies |
Adding a New Vendor
- Create
vendors/<vendor_key>/commands.yamlwith CLI commands. - Create parser classes under
parsers/<vendor_key>/inheriting fromBaseParser. - Decorate with
@registerfor auto-registration. - Import in
parsers/<vendor_key>/__init__.py.
Data Model
Core Entities
| Model | Key Fields | Description |
|---|---|---|
DeviceModel |
hostname |
Network device |
InterfaceModel |
device_hostname + name |
Physical or logical interface |
IPAddressModel |
address + vrf |
IPv4/IPv6 address on an interface; vrf=None treated as global routing table |
SubnetModel |
network_address + vrf |
IP subnet; supports M&A multi-tenant isolation via vrf + tenant fields |
VLANModel |
device_hostname + vlan_id |
VLAN membership |
MACModel |
address |
Layer-2 MAC address |
EndpointModel |
mac_address + ip_address |
Host inferred from ARP + MAC tables |
Firewall Entities
| Model | Key Fields | Description |
|---|---|---|
FirewallRuleModel |
device_hostname + rule_id |
Security policy rule |
AddressObjectModel |
device_hostname + name |
Named address object |
ServiceObjectModel |
device_hostname + name |
Named service/port object |
Graph Relationships
| Relationship | From → To | Description |
|---|---|---|
HAS_INTERFACE |
Device → Interface | Device owns this interface |
HAS_IP |
Interface → IPAddress | IP assigned to interface |
IN_SUBNET |
IPAddress → Subnet | IP belongs to subnet |
TAGGED_IN |
Interface → VLAN | Interface participates in VLAN |
CONNECTED_TO |
Interface → Interface | Physical link (CDP/LLDP) |
LEARNED_ON |
MAC → Interface | MAC seen on this port |
USES_IP |
Endpoint → IPAddress | Endpoint uses this IP |
USES_MAC |
Endpoint → MAC | Endpoint uses this MAC |
HAS_FIREWALL_RULE |
Device → FirewallRule | Device owns this rule |
HAS_ADDRESS_OBJECT |
Device → AddressObject | Device owns this address object |
HAS_SERVICE_OBJECT |
Device → ServiceObject | Device owns this service object |
Enterprise Features
Install the enterprise extras:
pip install -e ".[enterprise]"
| Feature | Config |
|---|---|
| OIDC authentication | AUTH_MODE=oidc, OIDC_DISCOVERY_URL, OIDC_CLIENT_ID |
| RBAC policy | RBAC_POLICY_FILE or RBAC_POLICY (hot-reloaded every 30 s; instant cross-pod via Redis Pub/Sub) |
| Audit logging | AUDIT_LOG_ENABLED=true → Splunk, Elasticsearch, OpenSearch, webhook |
| Secrets management | SECRETS_PROVIDER=vault|aws|azure|gcp |
| Distributed tracing | Auto-detected: Datadog → New Relic → OTLP |
| NetBox sync | meshq sync --target netbox |
| SOAR webhooks | SOAR_RULES JSON + SOAR_WEBHOOK_URL |
| Ansible inventory | GET /inventory/ansible or meshq export --format ansible |
MCP Server
Exposes the network graph to AI assistants (Claude Desktop, Claude Code, any MCP client) without HTTP.
pip install -e ".[mcp]"
GRAPH_BACKEND=neo4j \
NEO4J_URI=bolt://localhost:7687 \
NEO4J_PASSWORD=password \
MESHOPTIXIQ_API_URL=http://localhost:8000 \
meshq-mcp
23 tools across 7 categories (topology, endpoints, blast_radius, addressing, hygiene, firewall, inventory). Requires pro+ license (resolved from local API).
Claude Desktop config:
{
"mcpServers": {
"meshoptixiq": {
"command": "meshq-mcp",
"env": {
"GRAPH_BACKEND": "neo4j",
"NEO4J_URI": "bolt://localhost:7687",
"NEO4J_PASSWORD": "your-password",
"MESHOPTIXIQ_API_URL": "http://localhost:8000"
}
}
}
}
Development
Running Tests
cd network_discovery
pytest tests/ -v
# 1346 tests — unit, integration, e2e
Neither psycopg/psycopg_pool nor a real database are required for the test suite — all database interactions are mocked.
Project Structure
network_discovery/
├── network_discovery/
│ ├── api/
│ │ ├── main.py # FastAPI app, lifespan, middleware
│ │ ├── auth.py # API key + OIDC authentication
│ │ ├── cluster.py # Redis client factory
│ │ ├── collect_queue.py # Redis work queue (dispatch/pop/complete)
│ │ ├── dependencies.py # DB provider injection
│ │ ├── snapshot_store.py # Metric ring buffer (local + Redis)
│ │ └── routes/
│ │ ├── queries.py # /queries/* endpoints
│ │ ├── health.py # /health/* endpoints
│ │ ├── admin.py # /admin/* endpoints
│ │ ├── collect.py # /collect/* endpoints
│ │ ├── events.py # SSE /events endpoint
│ │ ├── history.py # /history/snapshots + /history/diff endpoints
│ │ ├── whatif.py # /graph/whatif endpoint (what-if impact analysis)
│ │ └── inventory.py # /inventory/ansible endpoint
│ ├── collectors/
│ │ └── netmiko_collector.py # SSH collection + --worker loop
│ ├── enterprise/
│ │ ├── auth/
│ │ │ ├── oidc.py # OIDC JWT validation
│ │ │ └── rbac.py # RBAC policy loader (mtime + pub/sub)
│ │ ├── audit/logger.py # Splunk/ES/webhook audit
│ │ ├── integrations/
│ │ │ ├── netbox.py # NetBox sync
│ │ │ └── soar.py # SOAR webhook dispatcher
│ │ ├── observability/tracing.py # DD/NR/OTLP tracing
│ │ └── secrets/resolver.py # Vault/AWS/Azure/GCP secrets
│ ├── graph/
│ │ ├── provider.py # Abstract GraphProvider interface
│ │ ├── neo4j_provider.py # Neo4j MERGE-based ingestion
│ │ └── postgres_provider.py # PostgreSQL pool + ON CONFLICT
│ ├── mcp/
│ │ └── server.py # MCP server (23 tools)
│ ├── parsers/
│ │ ├── base.py # BaseParser ABC
│ │ ├── registry.py # @register decorator + dispatch
│ │ ├── cisco_ios/
│ │ ├── juniper_junos/
│ │ ├── arista_eos/
│ │ ├── paloalto_panos/ # security policies, address/service objects
│ │ ├── fortinet/ # firewall policies, address objects
│ │ ├── cisco_asa/ # ACLs, object groups
│ │ ├── cisco_ftd/
│ │ └── checkpoint_gaia/
│ ├── normalization/
│ │ ├── models.py # Canonical Pydantic models (incl. firewall)
│ │ └── normalize.py # Dedup, subnet derivation, integrity
│ ├── queries/
│ │ ├── registry.yaml # 25 query definitions
│ │ └── v1/ # Cypher + SQL per query
│ ├── licensing/
│ │ ├── verifier.py # License client (Cython-compiled)
│ │ └── gates.py # Plan feature gating (Cython-compiled)
│ ├── local_api_client.py # get_license_status() — CLI + MCP license helper
│ ├── cli.py # meshq entry point
│ ├── ingest.py # Ingestion orchestrator
│ └── scanner.py # CIDR TCP scanner
├── tests/ # 1346 tests (unit + integration + e2e)
├── pyproject.toml
└── README.md
Code Quality
ruff check .
mypy network_discovery/
Licensing
Only the API server requires a license key. The CLI and MCP resolve their plan tier by calling GET /health/license on the local API, so a single key on the API server covers all tools.
# Set on the API server
export MESHOPTIXIQ_LICENSE_KEY=your-key
# Persistent file on the API server host
mkdir -p ~/.meshoptixiq
echo "your-key" > ~/.meshoptixiq/license.key
chmod 600 ~/.meshoptixiq/license.key
Point the CLI and MCP at the API server if it is not running locally:
export MESHOPTIXIQ_API_URL=http://api-server:8000
| Tier | Devices | Network Devices | API Queries | Firewall Queries | MCP Server |
|---|---|---|---|---|---|
| Community | 1 | 1 | — | — | — |
| Starter | 1 | 100 | — | — | — |
| Pro | 5 | 750 | ✅ | ✅ | ✅ |
| Enterprise | Unlimited | Unlimited | ✅ | ✅ | ✅ |
Check the current plan and expiry at any time:
meshq license # shows plan, expiry, feature flags
curl http://localhost:8000/health/license
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 Distributions
Built Distributions
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 meshoptixiq_network_discovery-0.25.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 792.8 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67f890a0e2eb652acb79d41c1bf2efea110faf36a2a511eba390d60aeeeb2117
|
|
| MD5 |
ef3adcea9ea02339da52c397197a02d4
|
|
| BLAKE2b-256 |
9fdcdd01f01609ea79733452f26b33974c29e18052ef3a752154899a65a5b7f1
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1cfcd6cfc1798ce69be9ec4fa5c3c55000b771567c1b247b6f456933be24d1f8
|
|
| MD5 |
5b2efcaae4bda2b69e7fd70c96449c62
|
|
| BLAKE2b-256 |
d56ba4649891237b71bd66afede900d8d324cd14cd8014a3270ef7b9101947d9
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efadc4e58f739c751edcb8747ecbd7d0b281a463500d276ce296ce4f2673f503
|
|
| MD5 |
e555c87fcf110b5b9addd672d7a6b60b
|
|
| BLAKE2b-256 |
fb12672911c4612e6d3a80d7a1e4673f301ce60be38c9a6a6bbcd65537a50863
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 811.8 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
533d8c7f1237b13ae7094ab172f1f9e9731fbc9bc8ffeeae0c7392ee131ddd03
|
|
| MD5 |
40b48afee46628b4456fb8f751ad6630
|
|
| BLAKE2b-256 |
1fa29bc2c73e125cdd9388658450fa5c6f603bea4113694bb18e413a2de43d14
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl
- Upload date:
- Size: 816.1 kB
- Tags: CPython 3.12, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2498403b589f8a6ac75df52654cb306646f31ddbde448a3334b50ad5d53ad08
|
|
| MD5 |
94cb232e397b0e3b6c9820b43b6add8f
|
|
| BLAKE2b-256 |
d8ce5dc584d3073ee95d3dd5d415d3fe96719e18fc230aec1af58da97be5cc0f
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 800.7 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d97deb5e0455a0944cef03717b91648b9eb5886a21f9d545bd380a57203a027
|
|
| MD5 |
7e3c3da72630d4c0ec9404ec9eaa1014
|
|
| BLAKE2b-256 |
af60b81ef7bc86b267a0fedd9850307380c13302cc7042b7cbd9d10c182b1aca
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e30ccc0124dcc546bd209fd556613db89c30f4cbc4fe6cba217c3a609ec195c0
|
|
| MD5 |
7a1b8d84dcae0414b48da7b3f1b8d3dd
|
|
| BLAKE2b-256 |
3ca146c875a9f5240224142c9863ad8404b2956068575ac1ff091d01e3382c25
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.6 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd4baaddc15fcb318b1184732df0f24725eb7a2fe5a80d8e34b12e9a6f3eeb71
|
|
| MD5 |
257c21b15e74d1c17140ab9812eff7d6
|
|
| BLAKE2b-256 |
0b9fad9cfd857530088b512cc59fb3d77e54eabd7d274ea8de4db6b7ae191271
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 812.0 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2ebb321935933cf4c39b38e1296fbf2ddc6b82280c43b0aca364b3a004498bea
|
|
| MD5 |
02e417b4a7164669d99004bfcd970876
|
|
| BLAKE2b-256 |
0220572effbdba7397aec5cb516a3f59719c6d3dbfd836f3d6cf6dc0b699dbb4
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 821.5 kB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8dd0e108e887566aeb925b118cfa178735e8c66530badc5358dd5f19d5123f5a
|
|
| MD5 |
fed591ec9f3936645d82f2470489a9e5
|
|
| BLAKE2b-256 |
ffb7e6e8f3a23e103bd49b9a870077051fb28b4372adfccedf70981d680edd90
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 798.8 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d6fbc4db879ea29f6ca666b95c641e0e4312d4037e727c9464c6f623124ec7b
|
|
| MD5 |
76e40dfa387f56d632ddb50a1a228284
|
|
| BLAKE2b-256 |
ba8be31275c723e4542c24b1452ca76fd9735ac1c7c7f3d83ef0ef559e00f73a
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c9a1bd3bbe8508a09abbfe3f0323f19264a211f64040091c8e15af66c3d1f4aa
|
|
| MD5 |
dddf59851e9d471fe41233d62ebd286a
|
|
| BLAKE2b-256 |
1796d451be8c89af35c4e478c2f2137bdee6dc6c19d011838a94396167abcc95
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.5 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f0bd5a242a9b6b170cda864c511ffab5af23de52bd750a17f7dfa454eb3914d6
|
|
| MD5 |
8cdb5ae28913aabf60a1003c8791624a
|
|
| BLAKE2b-256 |
f203127823ba5ebbf7ae2d64871257b58146a254ee18a47849a50662b63dc1c0
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 813.5 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8532d82dba2d2b94c06fa2586b11329d6c2ba78d49cb908ea4d0b624396a3b4c
|
|
| MD5 |
a8090cfd9b3ccd0cc873a280095cef6d
|
|
| BLAKE2b-256 |
aa0f12634722d590dd1920e75bd73671e5c2e05f923f27ad6f6969fdb4f2cd67
|
File details
Details for the file meshoptixiq_network_discovery-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl.
File metadata
- Download URL: meshoptixiq_network_discovery-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl
- Upload date:
- Size: 823.0 kB
- Tags: CPython 3.10, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a291610cb0dafdabd2f1897717536e4029d58a8115e2f3e7cff5489a2ea0ed1b
|
|
| MD5 |
2446fda84d0ca02e586a5ca9843f0947
|
|
| BLAKE2b-256 |
9ea219b5415d1af91b26de7ce5cf32577a7b365ae05031f29262928c5d44e533
|