# Contributing cfzt is built to keep Cloudflare Zero Trust setup deterministic and predictable. If you want to contribute - keep it simple and aligned with that goal. Before submitting a PR that touches tunnel lifecycle, Docker port detection, the manifest, or Windows service management, run through [docs/manual-testing.md](docs/manual-testing.md) - those scenarios need a live Docker daemon and Cloudflare account, so they aren't covered by CI. ## Getting started * Fork the repo * Clone it * Make your changes * Open a PR ## What makes a good contribution * Removes complexity, not adds it * Keeps behavior deterministic * Avoids hidden state and magic * Works in both local and CI environments If your change makes the system harder to reason about - it will likely be rejected. ## Code style No strict rules, but: * Keep it readable * Prefer explicit over clever * Avoid unnecessary abstractions * Small, focused changes > big rewrites ## Issues If something is broken or unclear: * Describe what you did * What you expected * What actually happened Logs and configs help. Screenshots don’t. ## Pull Requests Before opening a PR: * Make sure it builds * Keep changes scoped * Explain *why* the change is needed PRs without context are hard to review. ## Discussions Use Discussions for: * ideas * architecture questions * trade-offs Issues are for bugs. Discussions are for thinking. ## Final note This is not a framework. It’s a tool to make a messy process predictable. Keep it that way.