About this project
Teams that maintain a product spread across several repositories (web, api, mobile, infrastructure…) repeat the same ritual every day: update each repo, start the right servers on the right ports, move the card on the board, create the branch with the agreed name, open the PR, run the E2E tests against the right environment, check the cloud logs.
Deck (as in a command deck: one place to steer everything) brings all of that into one place:
- A single binary,
deck(Go), which is both the CLI and the web panel. - CLI with
--jsonoutput and non-interactive flags, also designed to be driven by AI agents. - Web panel (
deck ui) for those who prefer to click, served by the binary itself on127.0.0.1only. - A single
deck.yamldescribes the project: repositories, start commands, environments, board and phases, mocks, databases and tests. Switching projects (or boards) means switching the file, not the code.
It started as an internal tool for one team and was turned into a generic project, with nothing specific to a client.
Principles
| Principle | What it means in practice |
|---|---|
| Everything local | Execution happens on the machine, where the repositories, git, the CLIs (az, gh, docker) and the secrets live. There is no hosted backend and no cloud account. |
| No data leaves the machine | Config, command output, database data and logs are never sent anywhere. The public demo uses fictitious data. |
| One binary, two interfaces | CLI and panel are the same deck. The panel reimplements nothing: every button runs a CLI command. |
| Nothing project-specific in the code | Repositories, URLs, board, phases and databases come from deck.yaml. |
| Secure by construction | The browser never sends command-line flags; the server builds each command from typed parameters. |
How it works, in one picture
The panel is a set of static pages embedded in the binary. When you click “move card”, the page calls /api/boards
on the same deck ui, which validates the request and runs deck boards-move-card --id 1234 --state "Code Review" as a
child process. The result comes back to the screen as JSON.
Modules
| Module | Panel | CLI |
|---|---|---|
| Dev Launcher and Docker Compose | /launcher | deck launch, deck compose up <stack> |
| Multi-repo git dashboard | /git-dashboard | deck git-dashboard --json |
| Azure Boards and branch/PR workflow | /boards | deck git-workflow-start-dev, deck boards-move-card |
| GitHub: PRs, checks and workflows | /github-prs | deck prs-manage --json |
| Azure Repos, Pipelines and Sonar | — | deck azure-prs, deck azure-pipelines, deck sonar check |
| E2E tests (Playwright) and history | /testes, /historico | deck tests run <ID> --env <environment> |
| Code coverage | /cobertura | deck coverage-status --json |
| HTTP mocks | /mocks | deck mocks |
| Database | /database | deck db query -p <profile> --sql "..." |
| Cloud logs (Azure Container Apps) | /cloud-logs | deck logs-search, deck logs-follow |
| Environment setup and secrets | /setup-env | deck diag, deck setup all, deck secrets set <NAME> |
| AI agent skills | /skills | — |
Getting started
# 1. Download the binary from the latest release (macOS, Linux or Windows) and put it on your PATH as `deck`deck --version
# 2. Describe your projectcp deck.example.yaml deck.yaml # adjust repositories, environments, board...
# 3. Open the paneldeck ui # http://localhost:4004If you prefer the terminal, skip the panel: deck --help lists the commands and deck --schema prints the full catalog
as JSON.
Documentation
| Page | What it covers |
|---|---|
| Architecture | How the binary serves the panel and the API and runs commands |
| Security | The threat model and each layer of protection |
| Modules | What each screen and command does |
| Configuration | deck.yaml and secrets reference |
| CLI and AI agents | Non-interactive use, --json, --schema |
| Development and releases | Contributing, testing, publishing and updating |
| Architecture decisions | Why local-first, and what was discarded along the way |