/...` URLs.
- Do not hand-edit generated API pages under `src/pages/ipa/resources`.
- Use `npm install` instead of `npm ci` only when intentionally changing dependencies and updating `package-lock.json`.
Preview every changed route at desktop and narrow widths. Check heading order, links, copied commands, tables, light and dark themes, and whether every required instruction remains understandable without a screenshot.
## Mobile clients
Use the platform project files and CI versions in the target repository instead of assuming that core Go commands apply.
- [`netbirdio/android-client`](https://github.com/netbirdio/android-client) is an Android project. Check its current project files and workflows before selecting the JDK, Gradle task, emulator, or device matrix.
- [`netbirdio/ios-client`](https://github.com/netbirdio/ios-client) uses Xcode and a `netbird-core` submodule. Clone with submodules, follow the current build scripts, and check signing and physical-device requirements before choosing a target.
Test VPN lifecycle behavior on the affected platforms where possible: fresh install, sign-in, connect, disconnect, reconnect after sleep or a network change, and upgrade from a previous release. Keep accounts, setup keys, signing material, and device identifiers out of logs and screenshots.
## Kubernetes operator
The [`netbirdio/kubernetes-operator`](https://github.com/netbirdio/kubernetes-operator) contribution guide and `Makefile` define the current workflow. Its main checks are:
```bash
make lint
make generate
make test-unit
```
Run the end-to-end suite for changes to reconciliation, finalizers, networking, installation, upgrades, or external integration:
```bash
make test-e2e
```
`make test-unit` uses an in-memory Kubernetes control plane. The end-to-end target builds an operator image and runs against a cluster, so use a disposable cluster and clean up namespaces, NetBird peers, setup keys, images, and other temporary resources afterward.
After API-type changes, review generated deepcopy and apply-configuration code, CRDs, chart CRDs, RBAC or manifests where affected, reference documentation, and test fixtures. Edit the API source and markers, not generated output.
## Terraform provider
The [`netbirdio/terraform-provider-netbird`](https://github.com/netbirdio/terraform-provider-netbird) repository documents its commands in `AGENTS.md` and `GNUmakefile`:
```bash
make fmt
make lint
make test
make build
make generate
```
`make test` runs the Go unit and integration tests without Docker or the Terraform CLI. Acceptance tests compile the `e2e`-tagged harness, start a NetBird deployment through Docker, and can create or change resources:
```bash
make testacc
```
The target sets `TF_ACC=1` and the `e2e` build tag itself. Use an isolated environment, keep credentials out of source and logs, and inspect the NetBird deployment for resources left by a failed test.
## Generated and synchronized files
Generated output belongs in review, but edit its source definition and use the repository's documented generator.
| Area | Edit | Regenerate and review |
|---|---|---|
| Core protocol definitions | `.proto` source files | Generated Go bindings and affected consumers |
| Core management API | API implementation and schema sources | OpenAPI output, API clients, mocks, and dependent docs |
| Dashboard API client | Its configured OpenAPI source | Generated client code and types |
| Kubernetes APIs | `api/` types and markers | Deepcopy and apply-configuration code, CRDs, chart files, docs, and test fixtures |
| Terraform reference docs | Provider schemas and examples | Generated files under `docs/` |
| Documentation API pages | The core OpenAPI source and docs generator | `src/pages/ipa/resources` and API navigation changes |
Do not invoke an underlying tool with guessed flags. Generated changes should be reproducible from the same source revision as the pull request.
## Test cross-repository behavior
A passing build in one repository does not cover a contract shared with another. For related pull requests:
1. State the dependency and intended merge order in each pull request.
2. Test compatible source revisions together.
3. Record the versions or commits used without exposing credentials or private environment details.
4. Verify backward compatibility when one side may ship first.
5. Update user-facing documentation in the same release window as the behavior.
The [repository map](/contribute/repositories#changes-that-cross-repository-boundaries) lists common boundaries.
## Keep privileged tests contained
Prefer a VM, disposable CI runner, short-lived cluster, or isolated account for work that needs root, `NET_ADMIN`, host networking, TUN devices, firewall access, kernel modules, signing credentials, or real cloud resources.
Before a host-networking test, record the existing routes, DNS configuration, firewall state, interfaces, and active NetBird process. Keep a recovery path outside the NetBird connection. After the test, stop local clients, restore the original host configuration, remove temporary resources, and verify normal connectivity from a separate terminal or host.
## Review the final diff
Before handing off the work, follow the full [pull request review checklist](/contribute/pull-requests#review-the-final-diff), including repository status, generated output, credentials, verification evidence, and documentation.