Chris Collins

Tools · dev

Compose, Kubernetes, and cron checker

Check docker-compose.yml and Kubernetes manifests for mistakes that break deployments — unknown keys, bad references, port clashes, selector mismatches, removed API versions, invalid quantities — and convert crontabs to systemd timers.

Added · updated 28 October 2026

Works with

How to use it

Paste YAML (or open a file); findings appear as you type, with the line each refers to. Errors will stop the deployment; warnings are likely mistakes; tips (hidden until ticked) are reliability and security suggestions.

  • Docker Compose — top-level and service keys against the Compose Specification, with "did you mean" suggestions for typos (depend_on, enviroment); every service has an image or build; depends_on names real services, service_healthy only waits on services with a healthcheck, and there are no cycles (the start order is shown); named volumes, networks, secrets, and configs are declared; host ports don’t clash; port and duration syntax; restart policies. It also flags :latest and untagged images, fixed container_name with replicas, databases published on all interfaces, secrets written into environment, unquoted YAML booleans like DEBUG: true, the YAML 1.1 base-60 trap in short port strings, the Docker socket mounted into a container, and privileged.

  • Kubernetes — several documents separated by ---. Required fields; names in the right DNS format; label values; API versions removed from Kubernetes (for example extensions/v1beta1 Ingress) and the current one to use; workload selectors that don’t match the pod template labels (the API server rejects these); container images, resource quantities (256MB is invalid — use 256Mi), requests above limits, env values that must be strings, volume mounts without volumes; Services whose selector matches no workload or whose targetPort isn’t a container port; Ingress pathType and backends; ConfigMap and Secret references. Tips cover requests and limits, probes, runAsNonRoot, and privilege escalation.

  • cron → systemd — paste crontab -l (or an /etc/cron.d file with a user column) and get a .service and .timer for each job with install commands. Schedules become OnCalendar= expressions (/15 * * * * → -- *:00/15:00, 1-5 → Mon..Fri); @reboot becomes OnBootSec=; VAR=value lines become Environment=; shell syntax is wrapped in /bin/sh -c; % is escaped. It warns where meanings differ: cron runs when the day of month or the weekday matches but systemd needs both (so such jobs get two OnCalendar= lines), cron’s % means newline, and MAILTO has no equivalent. Check schedules with systemd-analyze calendar '…'.

These checks catch common mistakes; they are not a full schema validation. For Kubernetes, kubectl apply --dry-run=server against your cluster is the final word. YAML is parsed in the browser with js-yaml.

Sharing

Share link copies a URL that opens this tool exactly as you have it. Hand-written links work too: Docker Compose ?compose=…, Kubernetes ?k8s=…, cron → systemd ?crontab=…&system=1&user=1&persistent=0&delay=60. For example ?crontab=0%203%20*%20*%20*%20%2Fusr%2Flocal%2Fbin%2Fbackup#cron.

Runs entirely in your browser; nothing you type leaves this page.