+
# Defined Networking Python Client
-`defined-client` provides two ways to work with the
-[Defined Networking API](https://docs.defined.net/api/defined-networking-api/):
+**One client. Two interfaces. Simple automation for Defined Networking.**
+
+[](https://www.python.org/)
+[](https://github.com/rrajpuro/defined-python-client/actions/workflows/quality.yml)
+[](docs/cli.md)
+[](docs/python.md)
+[](LICENSE.md)
+
+[Quick start](#quick-start) · [Install](#install) ·
+[CLI guide](docs/cli.md) · [Python guide](docs/python.md) ·
+[API reference](https://docs.defined.net/api/defined-networking-api/)
+
+
+
+---
+
+`defined-client` is a Python toolkit for the
+[Defined Networking API](https://docs.defined.net/api/defined-networking-api/).
+It combines a script-friendly CLI with a typed Python package and safer
+high-level services.
-- `definedcli`, a script-friendly command-line interface
-- `defined_client`, a typed Python package with low-level resources and safer
- high-level services
+| ⚡ Script-friendly CLI | 🐍 Typed Python API | 🛡️ Safer updates |
+| :---: | :---: | :---: |
+| JSON for automation and tables for humans | Inline types and a `py.typed` marker | GET–merge–PUT helpers preserve omitted fields |
-The client covers hosts, roles, routes, tags, networks, audit logs, and public
-software downloads. Python 3.13 or newer is required.
+Hosts, roles, routes, tags, networks, audit logs, and public software downloads
+are supported. Python 3.13 or newer is required.
-## Choose an interface
+> [!NOTE]
+> This is an independent project and is not affiliated with, endorsed by, or
+> sponsored by Defined Networking.
+
+
+
+
+
+## Quick start
Use the CLI for shell automation and interactive administration:
@@ -103,6 +131,22 @@ omitted fields.
Safe updates use a GET-then-PUT sequence and can still race with another writer.
+
+
+Explore the complete CLI command tree
+
+| Resource | Commands |
+| --- | --- |
+| `hosts` | `create`, `create-with-enrollment`, `list`, `get`, `get-by-name`, `find-by-name`, `update`, `replace`, `delete`, `block`, `unblock`, `debug-command`, `create-enrollment-code`, `update-tags`, `add-tag`, `remove-tag` |
+| `roles` | `create`, `list`, `get`, `update`, `replace`, `delete` |
+| `routes` | `create`, `list`, `get`, `get-by-name`, `find-by-name`, `update`, `replace`, `delete`, `update-router-host` |
+| `tags` | `create`, `list`, `get`, `find-by-key`, `update`, `replace`, `delete`, `subscribe-route`, `unsubscribe-route` |
+| `networks` | `create`, `list`, `get`, `update`, `replace` |
+| `audit-logs` | `list` |
+| `downloads` | `list` (public) |
+
+
+
## Documentation
- [CLI guide](docs/cli.md) — commands, JSON input, output, pagination, and errors
diff --git a/assets/definedcli-preview.svg b/assets/definedcli-preview.svg
new file mode 100644
index 0000000..b4985b7
--- /dev/null
+++ b/assets/definedcli-preview.svg
@@ -0,0 +1,44 @@
+
diff --git a/docs/development.md b/docs/development.md
index d7406f3..94094de 100644
--- a/docs/development.md
+++ b/docs/development.md
@@ -40,6 +40,9 @@ Apply Ruff's safe automatic fixes and formatter while developing:
.venv/bin/ruff format .
```
+The `Quality` GitHub Actions workflow runs the same lint, formatting, type, and
+test checks for every pull request and every push to `main`.
+
Run one test module while iterating:
```bash