Darwin USB network interface configurator for management access to network devices
Project description
Darwin Management NIC Configurator
Configure a USB Ethernet adapter for out-of-band management without letting it take over normal Wi-Fi or tailnet connectivity.
darwin-nic is aimed at bastion and bench workflows where a Mac needs a
temporary management link to network gear while keeping its primary network
path intact.
Status
- macOS is the primary supported platform.
- Linux support is experimental and currently limited.
- Release artifacts are PyPI distributions, GitHub Release wheel/source files, Nix packages, and FlakeHub releases.
- The PyInstaller spec is retained for manual builds, but standalone binaries are not the primary release artifact yet.
- Public docs are built with MkDocs and published at https://transscendsurvival.org/DarwinNicUtil/.
Quick Start
# Recommended CLI install
uv tool install darwin-mgmt-nic-configurator
darwin-nic status
darwin-nic init-config
darwin-nic configure --profile homelab --preserve-wifi
# Run without installing, using the stable FlakeHub release
nix run "https://flakehub.com/f/Jesssullivan/DarwinNicUtil/v2.1.2" -- status
For a one-off setup without a saved profile:
darwin-nic configure \
--device-ip <device-ipv4> \
--laptop-ip <usb-nic-ipv4> \
--mgmt-network <cidr> \
--preserve-wifi
Install
| Path | Use When | Command |
|---|---|---|
| PyPI | You want the normal CLI on your PATH | uv tool install darwin-mgmt-nic-configurator |
| FlakeHub | You want a stable Nix release | nix profile install "https://flakehub.com/f/Jesssullivan/DarwinNicUtil/v2.1.2" |
| GitHub flake | You want the current repository flake | nix profile install github:Jesssullivan/DarwinNicUtil |
| Source checkout | You are developing or testing local changes | uv sync --extra dev && uv run darwin-nic status |
Wheel and source distribution files are attached to GitHub Releases and published to PyPI. Standalone binary downloads are not supported yet.
Home Manager and System Manager modules are available under nix/modules/.
For the release shape and productionization summary, see
docs/project-spec.md.
Commands
| Command | Description |
|---|---|
darwin-nic setup |
Interactive guided setup wizard |
darwin-nic configure |
Configure a USB NIC |
darwin-nic status |
Show interfaces, routes, and bastion diagnostics |
darwin-nic dashboard |
Show network monitoring status |
darwin-nic test |
Run basic connectivity checks |
darwin-nic restore |
Restore saved network service order |
darwin-nic config |
Show resolved settings and profiles |
darwin-nic profiles |
List available profiles |
darwin-nic init-config |
Create a starter config file |
Configuration
Settings are loaded in this order, with later sources overriding earlier ones:
| Location | Purpose |
|---|---|
/etc/darwin-nic/config.toml |
System-wide defaults |
~/.config/darwin-nic/config.toml |
User defaults |
~/.darwin-nic.toml |
Legacy user config |
./.darwin-nic.toml |
Directory-local override |
./darwin-nic.toml |
Alternate directory-local override |
DARWIN_NIC_* |
Environment overrides |
Example:
default_profile = "homelab"
[defaults]
preserve_wifi = true
[profiles.homelab]
device_ip = "192.168.88.1"
laptop_ip = "192.168.88.100"
mgmt_network = "192.168.88.0/24"
device_name = "Lab Management Device"
device_type = "network"
See examples/config.toml for a fuller profile example.
Bastion Notes
For a generic tailnet -> bastion host -> USB OOB NIC -> managed network device flow:
- keep
mgmt_networkaligned with the real management subnet; - use
darwin-nic statusbefore making privileged changes; - use
--dry-runto preview interface and route changes; - pre-authenticate with
sudo -vfor non-interactive wrappers; - check
statuswhen raw or link-layer tools work but ordinary sockets fail.
On macOS, status includes scutil --nwi, Tailscale system-extension state,
and recent NECP socket-drop hints when available.
Device-specific hostnames, credentials, OOB MAC addresses, and switch policy belong in downstream operator repositories, not in this generic tool.
Safety
- Protected interfaces such as Wi-Fi, loopback, and system virtual links are not modified.
--preserve-wifikeeps the primary network path ahead of the USB NIC.- Dry-run mode previews intended changes without applying them.
- The emergency restore helper is available at
scripts/emergency-restore.sh.
Requirements
- Python 3.14+ for source and uv installs.
- Nix for flake-based package usage.
- A USB-to-Ethernet adapter.
- macOS for the full current feature set.
Development
just dev
just check
just test
just docs-build
uv build
Run just with no arguments to see all recipes.
Artifacts
Current release artifacts are:
- PyPI distribution for
darwin-mgmt-nic-configurator; - GitHub Release wheel and source distribution files;
- Nix flake package outputs, including FlakeHub
v2.1.2; - MkDocs site artifacts from the docs workflow.
GitHub Release, PyPI, FlakeHub, and docs workflows are present for tag-based publication. Standalone binary distribution remains a tracked release follow-up.
Public artifact URLs:
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 darwin_mgmt_nic_configurator-2.1.2.tar.gz.
File metadata
- Download URL: darwin_mgmt_nic_configurator-2.1.2.tar.gz
- Upload date:
- Size: 135.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
791340a6b26a98da1f850a37c7c5f937f7f5b51ee9151ecbf6c686c37c37ff90
|
|
| MD5 |
657e0e5392881c6cd0b2969e5790f193
|
|
| BLAKE2b-256 |
100088f05fca6683a8b05113576e3e9baca1c0f28c078d7a345b09f366718260
|
Provenance
The following attestation bundles were made for darwin_mgmt_nic_configurator-2.1.2.tar.gz:
Publisher:
release.yml on Jesssullivan/DarwinNicUtil
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
darwin_mgmt_nic_configurator-2.1.2.tar.gz -
Subject digest:
791340a6b26a98da1f850a37c7c5f937f7f5b51ee9151ecbf6c686c37c37ff90 - Sigstore transparency entry: 1384231735
- Sigstore integration time:
-
Permalink:
Jesssullivan/DarwinNicUtil@1c9f85237961df4682c02c656590cd330961634b -
Branch / Tag:
refs/tags/v2.1.2 - Owner: https://github.com/Jesssullivan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1c9f85237961df4682c02c656590cd330961634b -
Trigger Event:
push
-
Statement type:
File details
Details for the file darwin_mgmt_nic_configurator-2.1.2-py3-none-any.whl.
File metadata
- Download URL: darwin_mgmt_nic_configurator-2.1.2-py3-none-any.whl
- Upload date:
- Size: 63.2 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 |
ba47ce7e858131ad7d8645759b57192c9c481b88f85a1e9c90f1ab8a7c170f06
|
|
| MD5 |
2b0813a4efbc207ca3182c240f123d6f
|
|
| BLAKE2b-256 |
06eec94e9d69debbd40155780c9161652d1e2c421ac5bfa4e1a2d635cc3e183d
|
Provenance
The following attestation bundles were made for darwin_mgmt_nic_configurator-2.1.2-py3-none-any.whl:
Publisher:
release.yml on Jesssullivan/DarwinNicUtil
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
darwin_mgmt_nic_configurator-2.1.2-py3-none-any.whl -
Subject digest:
ba47ce7e858131ad7d8645759b57192c9c481b88f85a1e9c90f1ab8a7c170f06 - Sigstore transparency entry: 1384231801
- Sigstore integration time:
-
Permalink:
Jesssullivan/DarwinNicUtil@1c9f85237961df4682c02c656590cd330961634b -
Branch / Tag:
refs/tags/v2.1.2 - Owner: https://github.com/Jesssullivan
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@1c9f85237961df4682c02c656590cd330961634b -
Trigger Event:
push
-
Statement type: