Paste a Compose File or Dockerfile and Read It Back in English
Every line gets a one-sentence explanation, and the checks below flag the things that bite later: unpinned images, containers running as root, ports that will collide, keys Docker stopped reading. The file type is detected from the text.
What the Validator Checks
For a Compose file it reads the YAML structure (indentation based, no external parser) and walks each service. It flags the obsolete top-level version key, images without a tag or on latest, container_name (which stops you scaling a service), privileged: true, host-networked services, links (replaced by the default network years ago), bind mounts of the Docker socket, ports written without quotes where YAML would misread them, two services claiming the same host port, depends_on targets that do not exist, databases with no healthcheck and no volume, secrets written in plain text, and a missing restart policy. Named volumes used but never declared, and declared but never used, are listed too.
For a Dockerfile it explains each instruction in turn and warns about the classics: no tag on FROM, ADD where COPY would do, apt-get install without update on the same line or without cleaning the lists, pip install without --no-cache-dir, copying the whole source before installing dependencies (which defeats the layer cache), more than one CMD, a shell-form CMD that will not receive signals, no USER line, no HEALTHCHECK, EXPOSE without a matching listener, and secrets in ENV or ARG.
What it cannot do
It does not run Docker, pull images or resolve variables, so it cannot know whether myregistry/app:1.4 exists or whether your app actually listens on the port you exposed. Treat it as a careful second reader, not a build. When the finding is a design choice rather than a mistake (a container_name you rely on, a root user for a one-off tool), it says so and moves on. To produce a clean file from scratch, use the Compose generator or the Dockerfile generator; the guide explains the reasoning behind each check.