Thanks for your interest in improving this unofficial Swift client for the Tailscale LocalAPI! This project is maintained by David E. Weekly and is not affiliated with Tailscale Inc.
- Be respectful and follow the Code of Conduct.
- Keep discussions and contributions focused on the library; CLI tooling intentionally remains out of scope.
- Make sure all public-facing docs (README, DocC, commit messages) preserve the project's unofficial disclaimer.
- Fork and clone the repository.
- Create a feature branch off
main. - Run the formatter and tests before opening a pull request:
To check formatting without modifying files:
swift format --in-place --recursive Sources Tests swift testswift format lint --recursive Sources Tests
- If you have Tailscale installed locally, you may run integration tests against a live daemon:
These tests should not run in CI by default.
TAILSCALE_INTEGRATION=1 swift test --filter TailscaleClientIntegrationTests - Update documentation and changelog entries relevant to your changes.
- Submit a pull request describing the motivation, changes, and testing performed.
- Swift 6 strict concurrency; actors for shared mutable state.
- Public types must be
Sendablewhere applicable. - Use
Codablemodels for JSON payloads; include fixture-backed tests for each model. - Avoid adding external dependencies unless absolutely necessary.
- Update DocC articles and README examples when APIs change.
- Include doc comments for all public APIs describing usage, error cases, and concurrency notes.
If you encounter bugs or have feature requests, open an issue with:
- Expected vs actual behavior
- Steps to reproduce (including tailscaled version, if relevant)
- Any logs or JSON payloads (with sensitive data redacted)
Thanks for helping make swift-tailscale-client useful for the community!