systemd unit validator
Check systemd unit files and drop-ins for unknown or misplaced settings, bad values, ExecStart mistakes and ordering cycles, and see how the units depend on each other.
Up to 500,000 characters, 200 files and 20,000 settings in one file. Everything runs on your device in a background worker and nothing is uploaded. Downloads: JSON report, CSV findings and an SVG dependency graph. Paste one or more unit files. Start each file with ### file: and its name. Up to 500,000 characters. Review the settings before running.
Your result
How to use systemd unit validator
- Paste unit files. Start each with ### file: and its name, such as ### file: web.service or ### file: web.service.d/override.conf.
- Choose the systemd version your servers run.
- Run the check and review each finding with its file and line.
- Download the JSON report, CSV or the dependency graph image.
Useful next steps
What is checked
The settings table is written by Happytails.ai from the systemd 257 man pages (freedesktop.org, read on 16 October 2026) for [Unit], [Install], [Service], [Socket], [Timer], [Path], [Mount], [Automount], [Swap] and [Slice]. Values are checked as yes or no, time spans, numbers or fixed choices, and settings added after the version you choose are flagged. Older names that systemd still accepts, such as StartLimitBurst= in [Service] or ReadWriteDirectories=, are checked as the setting they stand for and noted.
Drop-ins and dependencies
Drop-in files are merged after their unit in name order. List settings such as ExecStart= add up and an empty assignment clears them, which is how ExecStart overrides work. The tool then checks the rules systemd uses to refuse a service (ExecStart=, ExecStop=, SuccessAction= and RemainAfterExit=, at most one ExecStart= unless Type=oneshot, and no Restart=always or on-success for Type=oneshot), Exec prefixes, timer, socket and path triggers, mount unit names, and ordering cycles built from After= and Before=.
Limits
systemd itself is not run, so files, users and implicit default dependencies are not checked and specifiers such as %i are not expanded. Settings outside the table are reported as unknown, the same way systemd logs and ignores them.