Your CI tasks have dependencies. Not all of them need to wait.
DxCore reads your build system's task graph and distributes work across multiple agents. Open-source coordinator and CLI, with an optional managed service in beta.
How It Works
-
1Export your task graph
-
Your build system already knows task dependencies. DxCore reads that.
turbo run lint test build --dry=json # or: nx run-many --graph=stdout
-
2Submit to the coordinator
-
The coordinator receives the graph and figures out which tasks can run now and which are waiting on dependencies.
turbo run lint test build --dry=json | dxcore dispatch \ --coordinator http://localhost:4000 \ --session-id $SESSION_ID --token $TOKEN
-
3Agents pick up work
-
Each agent pulls the next available task, executes it, and reports back. As tasks complete, their dependents become available. Multiple agents work simultaneously.
# Run as many agents as you have runners dxcore agent \ --coordinator http://localhost:4000 \ --agent-id agent-1 \ --session-id $SESSION_ID --token $TOKEN
Self-Host or Use the Managed Service
The coordinator is the hub that connects dispatchers and agents. Run it yourself, or let us handle it.
OSS Coordinator
Free
Self-hosted, open source forever
- Open source on GitHub
- Start via GitHub Action or self-host
- FIFO task scheduling
- In-memory state, per-run
- Free, forever
SaaS Coordinator
Free during beta
Managed — no infrastructure to run
- Managed — no infrastructure to run
- Profile-aware task scheduling
- Persistent run history & dashboard
- Simple API token setup
- No network configuration needed
- Free during beta
Infrastructure
Capabilities
Availability
| OSS Coordinator | SaaS Coordinator | |
|---|---|---|
| Infrastructure | ||
| Self-hosted | ||
| Managed service | ||
| GitHub Action setup | ||
| Network config required | Yes | No |
| Capabilities | ||
| Task scheduling | FIFO | Profile-aware |
| Run history & dashboard | ||
| Persistent state | ||
| Task sharding | Planned | |
| Availability | ||
| Cost | Free forever | Free (beta) |
| Source code | Open | Closed |
Set Up in GitHub Actions
Five composable actions for self-hosted, or just two with the managed service.
jobs: coordinator: runs-on: ubuntu-latest steps: - uses: tailscale/github-action@v4 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: tag:ci hostname: coord-${{ github.run_id }} - run: sudo tailscale serve --bg --http 80 http://localhost:4000 - uses: join-with/dxcore-coordinator-action@v1 with: token: ${{ secrets.DXCORE_TOKEN }} dispatcher: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: tailscale/github-action@v4 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: tag:ci hostname: dispatch-${{ github.run_id }} - uses: join-with/dxcore-dispatch-action@v1 with: coordinator-url: http://coord-${{ github.run_id }} command: npx turbo run build test lint --dry=json token: ${{ secrets.DXCORE_TOKEN }} agents: runs-on: ubuntu-latest strategy: fail-fast: false matrix: agent: [1, 2, 3] steps: - uses: actions/checkout@v4 - uses: tailscale/github-action@v4 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: tag:ci hostname: agent-${{ matrix.agent }}-${{ github.run_id }} - uses: join-with/dxcore-agent-action@v1 with: coordinator-url: http://coord-${{ github.run_id }} token: ${{ secrets.DXCORE_TOKEN }} cleanup: needs: [dispatcher] if: always() runs-on: ubuntu-latest steps: - uses: tailscale/github-action@v4 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: tag:ci hostname: cleanup-${{ github.run_id }} - uses: join-with/dxcore-shutdown-action@v1 with: coordinator-url: http://coord-${{ github.run_id }} token: ${{ secrets.DXCORE_TOKEN }}
jobs: dispatch: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: join-with/dxcore-dispatch-action@v1 with: coordinator-url: https://dxcore.dev token: ${{ secrets.DXCORE_TOKEN }} command: turbo run lint test build --dry=json - if: always() uses: join-with/dxcore-finish-action@v1 with: coordinator-url: https://dxcore.dev token: ${{ secrets.DXCORE_TOKEN }} agents: runs-on: ubuntu-latest strategy: fail-fast: false matrix: agent: [1, 2, 3] steps: - uses: actions/checkout@v4 - uses: join-with/dxcore-agent-action@v1 with: coordinator-url: https://dxcore.dev token: ${{ secrets.DXCORE_TOKEN }}
Get Started with the Beta
The managed service is free during beta. No credit card, no commitment — just sign up and point your agents at the coordinator URL.
- Free while in beta — pricing will be announced before any charges
- No uptime SLA yet — self-host the OSS coordinator for production-critical workloads
- No enterprise support — but we're responsive on GitHub issues
- Building in the open — the OSS coordinator and CLI are the stable foundation