About this project
Teams that keep a product spread across several repositories (web, api, mobile, infrastructure…) end up repeating 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.
Switchyard — the rail yard where trains are sorted and dispatched — puts all of that in one place:
- Web panel (Next.js) bound to
localhost, for those who prefer clicking. sydCLI (Go), with--jsonoutput and non-interactive flags, designed to be driven by AI agents too.- A single
switchyard.yamldescribes the project: repositories, launch 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 is being turned into a generic project, with nothing specific to a client.
Modules
| Module | What it does |
|---|---|
| Dev Launcher | Starts each repository’s services and watches the configured ports |
| Git panel | Status of every repo, batch update, joint checkout, branch and lock cleanup |
| Azure Boards | Starts a task (moves the card and creates the branch), linked commits, code review and rework, with the board phases defined in the configuration |
| GitHub | Team PRs, CI checks and workflow dispatch |
| E2E tests | Discovers and runs the target repository’s Playwright tests against the chosen environment, with live logs and history |
| Mocks | Local HTTP servers with fixed per-route responses to simulate external integrations |
| Database | Connection profiles and a catalog of diagnostic queries |
| Cloud logs | Search and live tail of Azure Container Apps logs |
| Setup | Diagnoses and installs the required tools, secrets kept outside the repository |
Configuration
name: Acme Platformrepos: - name: web path: acme-web launch: { command: npm run dev, port: 3000 }azureBoards: organization: acme project: Acme Platform team: Acme Team branchPattern: "{type}/AB#{id}-{slug}" phases: - { name: In Development, role: start } - { name: Code Review, role: review } - { name: Ready for Testing, role: test }