- stdout: JSON only. Tools emit a single JSON object at the end of execution.
- stderr: Logs, warnings, and errors. Users may redirect stdout without interference.
- Exit codes:
0on success (even with partial data), non-zero on unrecoverable failure (e.g. missing required argument, Docker error).
Tools must produce output even when some steps fail. A partial result is better than no result:
- If WHOIS fails, emit
nullforwhois_info. - If a subdomain's DNS resolution fails, emit empty
dns_records. - Never abort the entire run because one sub-task failed.
Tools are designed to compose via JSON piping. The output of one tool may become the input of another. Keep output schemas stable and well-documented.
Every tool in apps/<tool>/ must have a README.md with the following sections:
- Overview — what the tool does and why
- Quick Start — exact command to run (using
ssx.sh) - Build — one-time Docker build command
- Output Schema — description of the JSON structure with an example
- Flags — all CLI flags with descriptions
- Subcommands in
ssx.shuse short, lowercase names:dns,ports,cloud, etc. - Python files in
apps/<tool>/are named after the subcommand:dns.py,ports.py. - Service files in
lib/<tool>/services/are named<service>_service.py.
Each tool follows the monorepo version in pyproject.toml. Breaking changes to output schemas increment the minor version.