Skip to main content
Open Source

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

1
Export 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
2
Submit 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
3
Agents 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
View on GitHub

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
Try the Beta

Infrastructure

Self-hosted
OSS
SaaS
Managed service
OSS
SaaS
GitHub Action setup
OSS
SaaS
Network config required
OSS
Yes
SaaS
No

Capabilities

Task scheduling
OSS
FIFO
SaaS
Profile-aware
Run history & dashboard
OSS
SaaS
Persistent state
OSS
SaaS
Task sharding
OSS
SaaS
Planned

Availability

Cost
OSS
Free forever
SaaS
Free (beta)
Source code
OSS
Open
SaaS
Closed

Set Up in GitHub Actions

Five composable actions for self-hosted, or just two with the managed service.

OSS Workflow Self-hosted
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 }}
SaaS Workflow Managed
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