Principles
Draugr is a security orchestration engine, but the hard part of security at most teams isn't running scanners — it's making their output usable by the people who have to act on it. Draugr is built around two values, and when a design choice is in tension, these are how it's resolved.
1. Great UX#
Security tooling earns its keep only if people actually run it and read what it says. Draugr treats the developer experience as a feature, not an afterthought.
- Zero-config start, sensible defaults.
draugr scan .scans the current repo with no descriptor — Draugr picks a reasonable set of controls and gets out of your way. You add a Saga when you want to describe more of your app, not to get started. See the Quickstart. - Describe what, not how. The Saga is declarative: you describe your app's surface and which controls must pass; Draugr figures out which scanners to run, in what order, with caching and parallelism. You don't wire tools together by hand.
- One tool, one mental model. The same descriptor and the same verdict drive a local run, a GitHub Action, a GitLab pipeline, an Azure template, and a PR diff. What you see locally is what CI enforces — and a platform's own dashboards get the format they read, rather than the one Draugr would rather emit.
2. Human-readable by default#
Draugr's output is meant to be read by a person first. The readable, colorized presentation is the default; machine-readable formats are always available, but you opt into them — never the other way around.
- Readable and colorized out of the box. The scan summary leads with a verdict, priority
counts, and a ranked table of what to fix first (with a header and a column naming both the control
and the scanner behind each finding). Logs render the same way —
HH:MM:SS LEVEL message key=value— so diagnostics are legible at a glance. Color appears only on an interactive terminal and honorsNO_COLOR; piped or redirected output stays plain text. - Machine formats are the opt-in. Structured output is one flag away —
--format json/--format sariffor reports,--log-format jsonfor logs — for CI and observability pipelines. Draugr never makes a person read JSON just to see what happened.
3. A low learning curve for people new to security#
You should not need to already be a security expert to get value from Draugr. Every choice that lowers the barrier for a newcomer — without dumbing things down for a professional — is worth making.
- Recognized industry terms, not invented jargon. Controls use the names practitioners
already know (
sca,sast,secrets,dast, …) so the tool is easy to learn and respected by security professionals. Draugr's Norse names are flavor, never something you must learn to use it — see Naming & control taxonomy. - Plain-language definitions. The security glossary defines every category in plain language, so the whole team shares the vocabulary — no prior security background assumed.
- It tells you what to fix first. Findings are ranked into P1–P4 from exposure, criticality, and severity, so a newcomer isn't handed an undifferentiated wall of results and left to guess what matters.
- Gentle on-ramps.
draugr initscaffolds a starter Saga, and the surveyors can discover your app's surface and write one for you — so the first useful scan is minutes away, not a research project. - Actionable evidence. Each finding carries where it is, how serious it is, and which scanner reported it, so "what do I do about this" has an answer without deep tooling knowledge.
What this means in practice#
These aren't only user-facing promises; they constrain how Draugr is built. A new control or flag should have a sensible default and read clearly in the console before it grows knobs. New output is readable first — a machine format is added as an explicit option, not the default. A new term gets a plain-language glossary entry. Output that a newcomer can't act on is a bug, not a detail. When two designs are otherwise equal, the one that a person new to security can pick up faster wins.