Local CI Gateway

Stop waiting for
cloud CI to fail

Gait intercepts git push, runs your pipeline locally, and only forwards to the remote when all checks pass. Catch failures in seconds, not minutes.

Terminal
$ git push origin main
Gait: running pipeline for main (a3f2c91)...
 
  adapter: github-actions
   lint
   typecheck
   test-unit
     FAIL src/auth/session.test.ts — Expected 200, got 401
   test-integration skipped
 
Gait: pipeline failed — push blocked

Every push blocked by Gait is 3–10 minutes saved waiting for cloud CI to fail.

Everything you need to run CI locally

Drop-in support for your existing CI config. No rewrites required.

Multi-Platform CI Support

Reads your existing GitHub Actions, GitLab CI, Buildkite, Jenkins, or native Gait configs. Zero migration required.

Parallel DAG Execution

Topological scheduler runs independent jobs concurrently while respecting dependency chains. Fast by default.

Transparent Skip Reporting

Cloud-only features like marketplace actions are skipped and reported clearly. You always know exactly what ran and what didn't.

Diff-Aware Execution

Only runs jobs affected by your changes. Docs-only commits skip test suites automatically. Smart path-matching with glob patterns.

Container Execution

Set a default_image and every job runs in a Linux container via Lima, just like cloud CI. Override per job or opt out with execution: host.

Build Caching

Automatic cache detection for 12+ package managers — npm, yarn, pnpm, Go, Cargo, pip, Bundler, Composer, and more. SHA-256 validated.

Desktop App & TUI

Native macOS app with multi-repo monitoring, job logs, and deploy controls. Or run gait watch for a live terminal dashboard.

Secrets & Artifacts

Load secrets from .gait-secrets with automatic log masking. Collect build artifacts via glob patterns, persisted per run.

Webhooks & Notifications

Fire HTTP webhooks or shell scripts on pipeline completion. Get notified of pass/fail with full run context including job results and duration.

Matrix Expansion

Define matrix strategies in your config and Gait expands them into parallel job combinations — just like cloud CI matrix builds.

Services Support

Spin up databases, caches, and other services alongside your pipeline. Automatic health checks ensure services are ready before jobs run.

Intelligent Job Filtering

Automatically detects and skips dangerous jobs like deploys, publishes, and notifications. Configurable skip/include overrides.

A desktop app that stays out of your way

Monitor pipelines across multiple repos, inspect jobs, view artifacts, and trigger deploys from a native macOS app. Or use gait watch for a live terminal TUI.

Gait — ~/projects/acme-app
github-actions 4 jobs daemon hook docker
Run
runs pipeline
Runs
24
21✓ 3✗
Pass Rate
87%
Avg Time
4.2s
Blocked
3
Recent Runs
main
a3f2c91 · 4.2s · now
✓ Passed
feat/auth
7b1e4d8 · 3.4s · 12m ago
✗ Failed
main
e9d1f32 · 5.1s · 1h ago
✓ Passed
fix/deploy
4c8a5e1 · 2.8s · 3h ago
✓ Passed
main ✓ Passed
a3f2c91 4.2s now
copy sha
Jobs Artifacts Deploy
lint 1.2s
typecheck 0.8s
test-unit 2.1s
test-integration 3.4s

Gait Desktop App — macOS (midnight theme)

gait watch
Gait v0.1.0 — watching acme-app (github-actions · 4 jobs)
  ────────────────────────────────────────────────
 ● passed  hook:  container: docker
  ────────────────────────────────────────────────
 Recent:
   feat/auth         7b1e4d8  3.4s  12m ago  ← push blocked
   main             e9d1f32  5.1s  1h ago
   fix/deploy       4c8a5e1  2.8s  3h ago
   main             a3f2c91  4.2s  now
 
  ────────────────────────────────────────────────
  Runs: 24 · 21 passed · 3 failed · 87% pass rate
 Waiting for git push...
 enter:details  g:run  r:retry  /:filter  q:quit

Terminal TUI — gait watch

Two ways to monitor

Use whichever fits your workflow. Both read from the same local SQLite database with per-run history and retention.

  • Desktop app — native macOS app with multi-repo sidebar, job logs, deploy controls, and artifact browsing
  • Terminal TUI — run gait watch for a live dashboard with hook and container status. Press enter for run details, r to retry failed runs
  • Multi-repo — add multiple repos and switch between them. Each repo gets its own daemon on a dedicated port

How Gait works

A lightweight pre-push hook and local daemon. Nothing leaves your machine until checks pass.

1

You run git push

Gait's pre-push hook intercepts the push before anything reaches the remote.

2

Pipeline runs locally

The daemon loads your CI config, builds a dependency graph, and runs jobs in parallel inside Linux containers — the same environment as cloud CI. Results stream back in real-time.

3

Pass? Push. Fail? Fix.

If all checks pass, the push continues to the remote. If any fail, the push is blocked and you get instant feedback with the exact error.

git push
gait hook
gait daemon
remote

Works with your CI provider

Gait reads your existing CI configs directly. No translation layer, no vendor lock-in.

GitHub Actions
.github/workflows/*.yml
run steps, env, needs, matrix, services
GitLab CI
.gitlab-ci.yml
stages, needs, variables, before_script
Buildkite
.buildkite/pipeline.yml
steps, dependencies, docker plugin
Jenkins
Jenkinsfile
stages, steps, environment
Gait Native
gait.yml
full local support

Gait runs your shell commands, env vars, and dependency chains locally — the stuff that catches most failures.
Cloud-only features like marketplace actions and conditional expressions are skipped and clearly reported per run.

Get started

Choose the CLI for your terminal workflow, or the desktop app for a full GUI.

CLI
Terminal & TUI
1. Install via Homebrew
brew install nstalgic/tap/gait
2. Initialize in your repo
cd your-project && gait init
3. Push as usual
git push origin main
Desktop App
macOS native

Native macOS app with multi-repo monitoring, pipeline visualization, deploy controls, and artifact browsing. Includes the CLI automatically.

Download for macOS Requires macOS 13+ · Apple Silicon & Intel

Both include a 14-day free trial with full feature access. No credit card required.

Deploy when your pipeline passes

Add a deploy section to gait.yml and Gait will deploy locally after a successful push.

gait.yml
pipeline: default_image: node:20 # all jobs run in this container jobs: - name: lint command: npm run lint - name: test command: npm test depends_on: [lint] timeout: 60s - name: notify command: ./scripts/notify.sh execution: host # runs on macOS, not in container deploy: on: pass # deploy after pipeline passes mode: manual # or "auto" for auto-deploy targets: - name: staging type: rsync source: ./dist/ destination: deploy@staging:/var/www/app - name: docker type: docker-compose file: docker-compose.yml gate: pass: forward # push to remote on pass fail: block # block push on failure

Full pipeline + deploy in one file

Define a default_image and every job runs in a Linux container via Lima — just like cloud CI. Override per job with docker_image, or opt out with execution: host for macOS-native scripts.

When your pipeline passes, trigger deploys to local or remote targets from the desktop app. Images are pre-pulled and cached automatically.

8 deploy target types:
script Shell command
copy Local file copy
rsync SSH sync
docker-compose Compose up
docker-export Build + save
docker-remote SCP + SSH load
docker-push Registry push
kubernetes kubectl / Helm

Pricing

Gait will require a license key. Pricing details coming soon.

Free Trial
$0
14 days · no credit card
  • All 5 CI platforms supported
  • Parallel DAG execution & build caching
  • Diff-aware execution & matrix builds
  • Desktop app & terminal TUI
  • Secrets, artifacts & webhooks
Start Free Trial

Frequently Asked Questions

Everything you need to know about Gait.

Does Gait replace my cloud CI?

No. Gait is a complement to cloud CI, not a replacement. It catches the most common failures locally so you waste less time waiting for remote builds. Cloud CI still runs the full pipeline with everything Gait can't replicate locally.

What CI platforms are supported?

Gait supports GitHub Actions, GitLab CI, Buildkite, Jenkins, and its own native gait.yml format. It reads your existing config files directly — no translation or migration needed.

What gets skipped locally?

Cloud-only features like marketplace actions (uses: steps in GitHub Actions), GitHub Environments, and conditional expressions are skipped. Shell commands, environment variables, dependencies, matrix builds, and services all run locally. After each run, Gait reports exactly what was skipped so there are no surprises.

Can I bypass Gait for a push?

Yes. Set the environment variable before your push: GAIT_SKIP=1 git push. This bypasses the local pipeline and pushes directly to the remote.

How does local execution work?

Set default_image in your gait.yml and every job runs inside a Linux container via Lima (Apple's Virtualization.framework), matching cloud CI. Jobs can specify their own image to override the default, or use execution: host to run natively. Images are pre-pulled before the pipeline starts, and cached automatically for subsequent runs. Cloud-only features like marketplace actions are skipped and reported after each run.

What is diff-aware execution?

Gait checks which files changed in your commit and skips jobs that aren't affected. For example, if you only changed markdown files, test suites are automatically skipped. Jobs can declare paths patterns to control when they run. This makes repeat pushes even faster.

What are deploy targets?

Gait supports 8 deploy target types: shell scripts, local copy, rsync, docker-compose, docker-export, docker-push, docker-remote, and Kubernetes (kubectl/helm). Deployments can be triggered manually from the desktop app or set to auto-deploy when a pipeline passes.

Does Gait cache build dependencies?

Yes. Gait automatically detects lock files for 12+ package managers (npm, yarn, pnpm, Go, Cargo, pip, Bundler, Composer, and more) and caches resolved dependencies. Caches are validated with SHA-256 hashes and cleaned up based on configurable retention.