Scorecard: NangoHQ/nango

Public GitHub Actions data, last 30 days. Updated 6/26/2026, 10:01:59 PM.

Data sourced from public GitHub. GitSpider is not affiliated with or endorsed by this repository's owners. Request removal.

489 min/mo
recoverable — ~35% of CI time · across 39 patterns · ≈$3/mo
Rough estimate from wall-clock run time at standard Linux pricing — matrix/parallel jobs and your actual runners will differ.
1.4%
failure rate, 30d
2m
mean time to recover
24 workflows · 500 runs (16.7/day) · 1,383 CI-min (wall-clock) · ≈$8 at paid-Linux rates (30d)

Waste detected

Biggest wins first — each with the exact config fix.

Missing dependency cache — Run Unit & Integration Tests

~112 min/mo · ≈$1/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Missing dependency cache — CLI Publish & Verify

~84 min/mo · ≈$1/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Workflow runs on both push and pull_request — Run Unit & Integration Tests

~51 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

Workflow runs on both push and pull_request — CLI Publish & Verify

~39 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

Workflow runs on both push and pull_request — [Release] Build unified Docker image

~36 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

No concurrency control — [Release] Build unified Docker image

~27 min/mo

Add a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

Missing dependency cache — Lint

~25 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Missing dependency cache — Run Client Tests

~25 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Missing dependency cache — Yaml Validation

~16 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Missing dependency cache — Preview Deploy — Webapp

~13 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Workflow runs on both push and pull_request — Lint

~11 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

Workflow runs on both push and pull_request — Run Client Tests

~11 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

Workflow runs on both push and pull_request — Docker Check

~9 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

Workflow runs on both push and pull_request — Yaml Validation

~8 min/mo

Pushing to a branch and opening a PR triggers two runs. Pick one (usually `pull_request`) and exclude branch pushes for non-default branches.

on:
  push:
    branches: [main]
  pull_request:

No concurrency control — Lint

~8 min/mo

Add a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

No concurrency control — Run Client Tests

~8 min/mo

Add a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

Missing dependency cache — [Release] Deploy service

~3 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

Missing dependency cache — Cache Warmup

~2 min/mo

Set `cache: 'npm'` (or `'pip'`, `'yarn'`, etc.) on your setup-* action, or add `actions/cache@v4` for the install dir.

- uses: actions/setup-node@v4
  with:
    node-version: 20
    cache: 'npm'

No concurrency control — Lint PR

~1 min/mo

Add a `concurrency:` block keyed on branch to cancel superseded runs when devs push twice quickly.

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

No job timeout — Yaml Validation

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Yaml Validation

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Docker Check

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Docker Check

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Run Unit & Integration Tests

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Run Unit & Integration Tests

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — [Release] Deploy service

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No job timeout — [Release] Build unified Docker image

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — [Release] Build unified Docker image

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — CLI Publish & Verify

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — CLI Publish & Verify

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Lint

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Lint

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Lint PR

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Lint PR

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Run Client Tests

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No path filters on triggers — Run Client Tests

~0 min/mo

Runs on every push/PR with no `paths:` filter, so docs-only changes still trigger full CI. Add a `paths:` filter if that's common.

on:
  pull_request:
    paths:
      - 'src/**'
      - 'package.json'

No job timeout — Auto-Approve Docs PRs

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No job timeout — Preview Deploy — Webapp

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

No job timeout — Cache Warmup

~0 min/mo

No job sets `timeout-minutes`, so a hung step can run to GitHub's 6-hour default. Add `timeout-minutes` to each job.

jobs:
  build:
    runs-on: ubuntu-latest
    timeout-minutes: 15

Want this on every push?

This scorecard is a one-time snapshot. Install the free GitHub App to track this repo continuously — new regressions caught as they land, trends over time, on your public and private repos. Team adds the offending commit on the PR + Slack alerts.

Install & monitor this repo →

Not ready to install? Get this report by email. No spam — unsubscribe anytime.

Share this scorecard: https://gitspider.com/scan/NangoHQ/nango
Add the badge to your README

Live CI-health badge → GitSpider badge

[![GitSpider](https://gitspider.com/badge/NangoHQ/nango.svg)](https://gitspider.com/scan/NangoHQ/nango)