This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Dagu is a self-contained, single-binary workflow orchestration engine. Workflows are defined as DAGs (Directed Acyclic Graphs) in YAML. It requires no external databases or message brokers — all data is stored locally in files. It supports local, queue-based, and distributed (coordinator/worker) execution modes.
| Command | Description |
|---|---|
make build |
Build frontend UI + Go binary |
make bin |
Build Go binary only (output: .local/bin/dagu) |
make ui |
Build frontend only (cleans node_modules, installs, webpack builds) |
make run |
Run frontend server + scheduler (requires built UI assets) |
make run-server |
Run backend server only |
make test |
Run all tests (gotestsum with race detection) |
make test TEST_TARGET=./internal/core/... |
Run tests for a specific package |
make test-coverage |
Run tests with coverage, opens HTML report |
make lint |
Run golangci-lint |
make fmt |
Auto-format: go fix + go fmt + golangci-lint --fix |
make check |
CI-style check: formatting + linting without modifications |
make api |
Generate server code from OpenAPI spec (api/v1/api.yaml) |
make api-validate |
Validate OpenAPI spec |
make protoc |
Generate gRPC code from proto files |
Frontend dev server: cd ui && pnpm install && pnpm dev (runs on port 8081, backend on 8080).
core/— DAG and step definitions, validation, status types. The DAG spec is rich (~100 fields) supporting schedules, lifecycle hooks, container specs, parameters, and three execution types:graph,chain,agent.core/exec/— Interfaces for DAG run tracking, queue, and process stores (DAGRunStore,QueueStore,ProcStore,Dispatcher).runtime/— Execution engine.runner.goorchestrates parallel execution with dependency resolution.node.gomanages individual step execution with retry logic.manager.gocoordinates the overall lifecycle.runtime/builtin/— 18+ built-in executor implementations:command,docker,http,ssh,jq,mail,sql,redis,s3,dag(sub-DAG),chat(LLM),router,agentstep, etc.runtime/executor/— Executor factory pattern with global registry. Executors implementRun(ctx) errorwith stdout/stderr/kill support.persis/— File-based persistence layer. Each store type (filedag,filedagrun,filequeue,fileproc,fileuser,filesession,fileaudit, etc.) follows the same pattern: file I/O with structured data marshaling.service/frontend/— HTTP server using Chi router. REST API v1 with 43+ endpoint handlers, SSE for real-time updates, static asset serving. API handlers are inapi/v1/.service/scheduler/— Cron scheduling with timezone support, zombie detection, queue processing, distributed coordination.service/coordinator/— gRPC server for distributed execution and service registry.service/worker/— Polls coordinator for work, executes DAGs locally, reports status.auth/— Authentication with RBAC roles (admin, manager, operator, viewer, developer). Supports Basic, OIDC, and built-in JWT auth.cmn/— Shared utilities: config loading, expression evaluation, file operations, structured logging, secret management, OpenTelemetry, backoff strategies.agent/— LLM-powered agent for workflow generation with session/skill/memory management.cmd/— CLI command implementations (Cobra). ~20 commands:start,stop,server,scheduler,coord,worker,validate,dry, etc.
React 19 + TypeScript with Webpack 5. Uses Tailwind CSS 4, Radix UI/shadcn components, Monaco editor for YAML, xterm.js for terminal, SWR for data fetching, and openapi-fetch for typed API calls. API types generated from OpenAPI spec via pnpm gen:api.
CLI/API/UI → Command Handler (cmd/) → DAG Loader & Validator (core/)
→ Runtime Engine (runtime/runner.go) → Node Execution (runtime/node.go)
→ Executor (runtime/builtin/*) → File Storage (persis/)
→ SSE → Web UI
For distributed mode: Scheduler → Queue → Coordinator (gRPC) → Worker → Report back.
- REST API: OpenAPI spec at
api/v1/api.yaml→ generated Go server code viaoapi-codegen. Runmake api. - gRPC: Proto files at
proto/coordinator/v1/→ generated Go code viaprotoc. Runmake protoc. - Frontend API types:
cd ui && pnpm gen:apigenerates TypeScript types from the OpenAPI spec.
- All storage is behind interfaces (in
core/exec/) with file-based implementations (inpersis/). - Executors follow the factory pattern — registered globally, instantiated dynamically by type name.
- DAGs can compose hierarchically — a step can invoke another DAG via the
dagexecutor. - Configuration uses
DAGU_*environment variables, with fallback to~/.config/dagu/config.yaml. - Go commit message guidelines apply. Run
make fmtbefore committing. - License: GPL v3. License headers on source files managed via
make addlicense.
- Go 1.26, Chi router, Cobra CLI, gRPC, SQLite (modernc), pgx, go-redis
- Frontend: React 19, TypeScript, pnpm, Webpack 5, Tailwind CSS 4, Vitest
- Linting: golangci-lint v2 (errcheck, govet, staticcheck, gosec, revive, etc.)
- Testing: gotestsum with race detection, stretchr/testify assertions