Surveyor is a TLS-first cryptographic inventory and migration-readiness tool.
It is built for a narrow, practical question set:
- what transport-facing endpoints exist
- what does a TLS service actually present today
- where do classical certificate and PKI dependencies still exist
- what should a team look at first for migration readiness or change risk
Surveyor is not trying to collapse that work into a vague “PQ score”. It is trying to produce a defensible inventory and a clear next-action surface.
- Status
- What Surveyor Is
- What Surveyor Is Not
- Install
- Quick Start
- Command Surface
- Remote Scope
- Import Adapters
- Reports and Analysis
- Documentation
- Development
- Contributing
- Governance
- Support
- Code of Conduct
- Discussions
- Security
- Licence
- Changelog
Surveyor is in early development.
The current shipped surface includes:
- explicit TLS inventory through
surveyor scan tls - local discovery and local audit
- remote discovery and remote audit
- structured imported inventory through
--inventory-file - platform-specific import adapters for Caddy and Kubernetes Ingress v1
- saved-report diffing for compatible
tls_scanandauditreports - current-report prioritisation for compatible
tls_scanandauditreports - workflow grouping and filtering for inventory-backed audit diff and prioritisation views
Published releases appear here:
https://github.com/steadytao/surveyor/releases
Surveyor currently aims to be:
- a TLS-first cryptographic inventory tool
- a local and remote discovery tool for explicitly declared scope
- an audit tool that chains discovery into the existing TLS scanner conservatively
- a report generator with canonical JSON and derived Markdown
- a narrow decision-support layer for diffing and prioritisation
Surveyor is not currently:
- a general-purpose vulnerability scanner
- a post-quantum cryptography implementation
- a PKI replacement system
- a dashboard or storage platform
- a live connector platform
- a policy engine
- a multi-protocol scanner
It also does not scan undeclared address ranges or silently widen scope.
You may install our builds at: https://github.com/steadytao/surveyor/releases
OR
Published releases include checksums.txt, a Sigstore bundle for that checksum
manifest, plus per-archive SPDX SBOMs and matching Sigstore bundles. See
docs/releases/README.md for release verification
guidance.
You can build Surveyor from source:
git clone https://github.com/steadytao/surveyor.git
cd surveyor
go build -o surveyor ./cmd/surveyorOn Windows, use .\surveyor.exe instead of ./surveyor.
Explicit TLS inventory:
surveyor scan tls -c examples/targets.yaml -o report.md -j report.jsonLocal discovery and audit:
surveyor discover local -o discovery.md -j discovery.json
surveyor audit local -o audit.md -j audit.jsonRemote dry run inside declared scope:
surveyor discover remote --cidr 10.0.0.0/24 --ports 443,8443 --dry-run
surveyor audit remote --targets-file examples/approved-hosts.txt --ports 443 --dry-runAdapter-backed remote audit:
surveyor audit remote --inventory-file examples/ingress.yaml --adapter kubernetes-ingress-v1 -o audit-kubernetes.md -j audit-kubernetes.json
surveyor audit remote --inventory-file Caddyfile --adapter-bin /path/to/caddy -o audit-caddy.md -j audit-caddy.jsonAnalysis:
surveyor diff baseline.json current.json -o diff.md -j diff.json
surveyor prioritize current.json --profile migration-readiness -o priorities.md -j priorities.jsonCanonical commands:
surveyor scan tls
surveyor discover local
surveyor discover remote
surveyor audit local
surveyor audit remote
surveyor diff
surveyor prioritizeCompatibility aliases:
surveyor discover subnetsurveyor audit subnetsurveyor prioritise
Primary docs and examples should use the canonical forms. The aliases remain for compatibility and usability, not as separate features.
Current command examples:
surveyor discover remote --cidr 10.0.0.0/24 --ports 443,8443
surveyor discover remote --targets-file examples/approved-hosts.txt --ports 443
surveyor discover remote --inventory-file examples/inventory.yaml
surveyor discover remote --inventory-file examples/caddy.json --adapter caddy
surveyor audit remote --cidr 10.0.0.0/24 --ports 443,8443
surveyor audit remote --targets-file examples/approved-hosts.txt --ports 443
surveyor audit remote --inventory-file examples/inventory.yaml
surveyor audit remote --inventory-file examples/ingress.yaml --adapter kubernetes-ingress-v1
surveyor diff baseline.json current.json
surveyor prioritize current.json --profile change-riskRemote commands require exactly one of:
--cidr--targets-file--inventory-file
CIDR is the standard notation for an IP range, for example:
192.168.1.0/24for a typical subnet10.0.0.5/32for a single host
discover subnet and audit subnet exist because many operators recognise
“subnet” more readily than “CIDR”. They are plain-language aliases for the
CIDR-backed remote path.
Current rules:
--portsis required for--cidrand--targets-file--portsoverrides per-entry ports when--inventory-fileis used--dry-runperforms no network I/O and prints an execution plan- remote IP-literal TLS results are literal connection-path observations, not hostname-validation or virtual-host coverage claims
Surveyor supports generic imported inventory through --inventory-file, plus
the first stable adapter layer on top of that path.
Current adapter surface:
--adapter caddyfor Caddy JSON and Caddyfile input- auto-detected
caddyadapter forCaddyfileand*.caddyfile --adapter kubernetes-ingress-v1for Kubernetes Ingress v1 manifests--adapter-bin PATHwhen the selected adapter needs an external executable
Current limits remain deliberate:
- no live cloud or CMDB connectors
- no generic Kubernetes parser
- no second import command family
JSON is Surveyor’s canonical output. Markdown is derived from the same model.
Current report kinds:
tls_scandiscoveryauditdiffprioritization
Current analysis boundaries:
- diffing supports compatible
tls_scanandauditreports only - prioritisation supports current
tls_scanandauditreports only - workflow grouping and filtering apply only to inventory-backed audit diff and prioritisation views
- discovery is a shipped report kind, but not currently a supported diff or prioritisation input
The current schema_version line is 1.x. Within 1.x, contract changes
should be additive. Removals, renames, semantic changes, requiredness changes
and identity-key changes should require a breaking schema bump.
Start here for the docs map:
Key documents:
- docs/commands/README.md
- docs/adapters/README.md
- docs/contracts/README.md
- docs/architecture/README.md
- docs/reference/README.md
- docs/releases/README.md
The main verification commands are:
go build ./cmd/surveyor
go vet ./...
go test ./...Representative local checks:
./surveyor discover local -o discovery.md -j discovery.json
./surveyor audit local -o audit.md -j audit.json
./surveyor discover remote --cidr 10.0.0.0/24 --ports 443,8443 --dry-run
./surveyor audit remote --inventory-file examples/inventory.yaml --dry-run
./surveyor diff baseline.json current.json -o diff.md -j diff.json
./surveyor prioritize current.json --profile migration-readiness -o priorities.md -j priorities.json
./surveyor scan tls -c examples/targets.yaml -o report.md -j report.jsonWell-scoped contributions are welcome.
Please start with CONTRIBUTING.md. For larger changes, open an issue first so scope and direction can be discussed before implementation starts.
For questions, broader feedback, and open-ended design discussion, instead use GitHub Discussions.
All commits must be signed off under the DCO. See DCO.md. Repository-side enforcement should come from the GitHub DCO app when that control is enabled.
Surveyor is maintainer-led.
See GOVERNANCE.md for the current governance model and MAINTAINERS.md for the current maintainer list.
See SUPPORT.md for the support posture and support channels.
See CODE_OF_CONDUCT.md.
Use GitHub Discussions for:
- questions about usage
- broader feedback on the repo, docs, or command surface
- design ideas and feature suggestions
- discussion around use cases and workflow fit
Use Issues for concrete bugs, release blockers and things that need tracked implementation work.
If you believe you have found a security issue in Surveyor itself, do not open a public issue.
See SECURITY.md for reporting instructions.
Surveyor is licensed under the Apache License 2.0. See LICENSE.
See CHANGELOG.md.