# Build the Docker image
make build
# Start an interactive shell with local code mounted (edits reflect immediately)
make devRun make help to see all targets. The key ones:
| Target | Description | Example |
|---|---|---|
build |
Build the Docker image | make build |
rebuild |
Rebuild without cache | make rebuild |
dev |
Interactive shell with code mounted | make dev |
test |
Run the test suite | make test |
lint |
Run ruff linter | make lint |
fmt |
Auto-format with ruff | make fmt |
dns |
Run DNS discovery | make dns DOMAIN=example.com |
ports |
Run port scan | make ports TARGETS=10.0.0.1 PORTS=80,443 |
certs |
Run certificate discovery | make certs DOMAIN=example.com MODE=all |
db-list |
List stored scans | make db-list TOOL=dns |
db-latest |
Show latest scan result | make db-latest TOOL=dns DOMAIN=example.com |
Tools can also be invoked directly via ssx.sh:
./ssx.sh dns -d example.com
./ssx.sh ports -t 10.0.0.1 -p 80,443
./ssx.sh certs -d example.com --mode allstackshield/
├── apps/ # CLI entry points -- one folder per tool
│ └── web/ # Web UI backend (FastAPI)
│ ├── server.py # ASGI entry point
│ ├── routers/ # REST + WebSocket endpoints
│ └── services/ # Pipeline runner, tool runner
├── web/ # Web UI frontend (React + TypeScript + Vite)
│ └── src/
│ ├── pages/ # Route-level components (Dashboard, Pipelines, etc.)
│ ├── components/# Shared UI components (pipeline builder, result panels)
│ └── api/ # API client
├── lib/ # Shared business logic
│ ├── common/
│ │ ├── entities/ # Pydantic data models shared across all tools
│ │ └── db/ # Persistence layer (ScanStore interface + backends)
│ └── <tool_name>/
│ └── services/ # Business logic for that specific tool
├── rules/ # Coding and operational standards
├── Makefile # Build, test, lint, and tool shortcuts
├── Dockerfile # Kali-based Docker image
└── ssx.sh # Unified CLI wrapper (runs tools in Docker)
- Entities live in
lib/common/entities/-- all Pydantic models shared across services go here. - Persistence lives in
lib/common/db/-- abstractScanStoreinterface, SQLite default backend, and factory/config logic. - Service logic lives in
lib/<tool>/services/-- each file wraps a CLI tool or external source. - CLI entry points live in
apps/<tool>/-- responsible only for arg parsing and orchestration. - Web backend lives in
apps/web/-- FastAPI server with routers for pipelines, scans, targets, and tool execution. Pipeline runner orchestrates multi-tool workflows with WebSocket progress. - Web frontend lives in
web/-- React + TypeScript + Vite app with TailwindCSS. Runnpm run devfromweb/for local development. - All output goes to stdout as JSON. Logs, warnings, and errors go to stderr.
- Everything runs in Docker via
ssx.sh. No tool should require local installation.
- Create
apps/<tool_name>/with a CLI entry point (e.g.certs.py) - Create
lib/<tool_name>/services/with service files wrapping external tools - Add new entities to
lib/common/entities/if they are shared; otherwise keep them local to the service - Add a new
casetossx.shmapping the subcommand to the Python file - Add a
maketarget in the Makefile under the Tool Shortcuts section - Update the root
README.mdtools table with the new subcommand - Add a
README.mdinapps/<tool_name>/documenting Quick Start and Output Schema - Add
--save/--no-saveflags and persistence support (see existing tools for the pattern)
To add a persistence backend beyond SQLite:
- Create
lib/common/db/<backend>_store.pyimplementing theScanStoreABC fromlib/common/db/base.py - Register the class path in the
_BACKENDSdict inlib/common/db/__init__.py - Add a
[store.<backend>]section to the default config template inlib/common/db/__init__.py - Add the backend's dependencies to
pyproject.toml
- Python conventions: see rules/python.md
- Docker conventions: see rules/docker.md
- General tool conventions: see rules/general.md