Security & Permissions
Deploying a DAG from a UI is, fundamentally, shipping arbitrary code into your Airflow environment — the same trust boundary as any other way of getting a .py file into the DAGs folder. DagSmith is designed around that fact rather than around it.
Deploy is off by default
Writing .py files is disabled until an administrator sets deploy_enabled = True. Without it, DagSmith works purely in read-and-draft mode: no file on disk ever changes.
Authorization on every endpoint
Every API route except /api/v1/health is authorized through the Airflow Auth Manager. Draft writes require edit permission; deploy additionally requires the deployers role, on top of the global deploy_enabled flag. See Teams & Git Deploy for how this narrows further per directory.
Isolated execution
DagSmith never runs eval, exec, or dynamic importlib imports on your DAG source inside the api-server process. Import validation — the step that actually loads your DAG the way the scheduler would — always happens in a separate, time-limited subprocess.
Path safety
Every file path that arrives in a request is resolved and checked against the DAG bundle root. Nothing outside that root is reachable, and symlinks that would escape it are rejected. Writes are atomic (write to a temp file, then os.replace) and preceded by a backup.
Audit trail
Deploys, git pushes, and team/file ownership changes are recorded to an append-only JSONL audit log, viewable in the UI for anyone with edit permission.
Dag