{"id":44987026,"url":"https://github.com/airlock-hq/airlock","last_synced_at":"2026-04-01T18:29:05.391Z","repository":{"id":340396723,"uuid":"1166037395","full_name":"airlock-hq/airlock","owner":"airlock-hq","description":"Vibe code in. Clean PR out.  Airlock is where every git push turns into a slop-free PR.","archived":false,"fork":false,"pushed_at":"2026-03-02T03:06:01.000Z","size":8291,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-02T15:34:59.084Z","etag":null,"topics":["agentic-engineering","agents","ai","ci","cicd","claude-code","codex","local"],"latest_commit_sha":null,"homepage":"https://airlockhq.com","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/airlock-hq.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-24T20:13:47.000Z","updated_at":"2026-03-02T03:05:57.000Z","dependencies_parsed_at":"2026-03-01T12:09:29.175Z","dependency_job_id":null,"html_url":"https://github.com/airlock-hq/airlock","commit_stats":null,"previous_names":["airlock-hq/airlock"],"tags_count":17,"template":false,"template_full_name":null,"purl":"pkg:github/airlock-hq/airlock","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airlock-hq%2Fairlock","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airlock-hq%2Fairlock/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airlock-hq%2Fairlock/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airlock-hq%2Fairlock/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/airlock-hq","download_url":"https://codeload.github.com/airlock-hq/airlock/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/airlock-hq%2Fairlock/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30048370,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T10:53:31.691Z","status":"ssl_error","status_checked_at":"2026-03-03T10:53:22.041Z","response_time":61,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agentic-engineering","agents","ai","ci","cicd","claude-code","codex","local"],"created_at":"2026-02-18T20:01:09.658Z","updated_at":"2026-04-01T18:29:05.372Z","avatar_url":"https://github.com/airlock-hq.png","language":"Rust","readme":"# Airlock\n\n[![CI](https://github.com/airlock-hq/airlock/actions/workflows/ci.yml/badge.svg)](https://github.com/airlock-hq/airlock/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/airlock-hq/airlock?filter=airlock-*\u0026label=release)](https://github.com/airlock-hq/airlock/releases/latest)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Platform: macOS](https://img.shields.io/badge/platform-macOS-lightgrey.svg)]()\n[![Website](https://img.shields.io/badge/web-airlockhq.com-black.svg)](https://airlockhq.com)\n[![X](https://img.shields.io/badge/follow-@Airlock__HQ-black.svg?logo=x)](https://x.com/Airlock_HQ)\n\nAll slop must die. Airlock is where every git push turns into a slop-free PR.\n\nAirlock is a local Git proxy that intercepts `git push`, runs your code through a customizable validation pipeline, and lets you approve before anything is pushed to remote. Think of it as an airlock between your local repo and the outside world.\n\n```mermaid\nflowchart LR\n  subgraph before[\" Before \"]\n    direction TB\n    A[\"Local Repo\"] -- \"git push\" --\u003e B[\"Remote Branch\"]\n    B -- \"dirty pull request\" --\u003e C[\"CI + Code Review\"]\n    C -- \"fail / request changes\" --\u003e A\n  end\n  subgraph after[\" After \"]\n    direction TB\n    D[\"Local Repo\"] -- \"git push\" --\u003e E[\"Airlock\"]\n    E -- \"lint, test, review, fix\" --\u003e F[\"Remote Branch\"]\n    F -- \"clean pull request\" --\u003e G[\"Merge\"]\n  end\n  before ~~~ after\n```\n\n## Install\n\n```bash\nbrew install --cask airlock-hq/airlock/airlock\n```\n\nmacOS only for now. More platforms coming soon.\n\nDocumentation: [https://airlockhq.com/docs](https://airlockhq.com/docs).\n\n## Quick Start\n\n```bash\ncd your-project\nairlock init      # sets up local git gate\ngit push origin feature-branch   # triggers the pipeline\n```\n\nThat's it. Airlock intercepts the push, runs your pipeline, and opens a **Push Request** in the desktop app for self-review. When you approve, it forwards to your upstream and creates a PR/MR (GitHub, GitLab, or Bitbucket Cloud).\n\n![Airlock Push Request — Overview with architecture diagram](assets/screenshot1-overview-diagram.png)\n\n`airlock init` creates or overwrites `.airlock/workflows/main.yml` with the default workflow. You can customize the approval mode (`require-approval: true | false | if_patches`) by editing the workflow file directly.\n\nTo bypass Airlock at any time: `git push bypass-airlock main`\n\n## What It Does\n\nYour agents are writing a ton of code, fast. How do you review and merge the code at the same pace, with confidence?\n\nAirlock handles the basic review, validation and clean up, so you can focus on more important decisions.\n\n| Before            | After                         |\n| ----------------- | ----------------------------- |\n| Lint errors       | All lints pass                |\n| No tests          | Tests generated \u0026 passing     |\n| No docs           | Functions documented          |\n| No PR description | Rich summary with walkthrough |\n| Hardcoded secrets | Flagged for review            |\n\n![Rebase with merge conflict auto-resolved](assets/screenshot2-overview-rebase.png)\n_The rebase step detected a merge conflict in `src/routes/api.ts` and resolved it automatically._\n\n![Test results — all 247 tests passing](assets/screenshot3-overview-tests.png)\n_Full test suite ran after changes — 247 tests passing, including 12 new tests the agent wrote for the auth module._\n\n![Critique comments](assets/screenshot4-overview-critique.png)\n_The critique step found a real bug (milliseconds vs seconds in token expiry) and flagged it before the code ever left your machine._\n\n## How It Works\n\n1. `airlock init` reroutes your `origin` remote to a local bare repo (a \"gate\")\n2. When you `git push`, a daemon picks up the push and runs your pipeline\n3. Pipeline jobs run in a temporary worktree — lint, test, describe, critique, review\n4. Results appear as a **Push Request** you can review in the Airlock desktop app\n5. You review and approve the change to exit the airlock, get pushed upstream and become a clean PR\n\n### Pipeline\n\nDefined in `.airlock/workflows/main.yml` using a familiar YAML workflow syntax with parallel jobs:\n\n```yaml\njobs:\n  rebase:\n    steps:\n      - name: rebase\n        uses: airlock-hq/airlock/defaults/rebase@main\n  critique:\n    needs: rebase\n    steps:\n      - name: critique\n        uses: airlock-hq/airlock/defaults/critique@main\n  test:\n    needs: rebase\n    steps:\n      - name: test\n        uses: airlock-hq/airlock/defaults/test@main\n  gate:\n    needs: [critique, test]\n    steps:\n      - name: review\n        run: |\n          # Pause for human approval if tests fail or critical issues found\n          airlock exec await\n  deploy:\n    needs: gate\n    steps:\n      - name: lint\n        uses: airlock-hq/airlock/defaults/lint@main\n        apply-patch: true\n      - name: push\n        uses: airlock-hq/airlock/defaults/push@main\n      - name: create-pr\n        uses: airlock-hq/airlock/defaults/create-pr@main\n```\n\nJobs declare dependencies via `needs:` and run in parallel when possible. Steps with `apply-patch: true` auto-commit any patches they produce.\n\nSteps can be inline shell commands or reusable definitions loaded via `uses:` — from Git repos (`owner/repo/path@version`) or local files (`./path`).\n\nThe desktop app runs from the system tray: closing the window hides it, and new pushes trigger an OS notification.\n\n## Architecture\n\n```\ncrates/\n├── airlock-cli/      # CLI binary\n├── airlock-daemon/   # Background daemon (watches for pushes)\n├── airlock-core/     # Core library (git ops, config, pipeline)\n├── airlock-app/      # Desktop app (Tauri + React)\n└── airlock-fixtures/ # Test fixtures\ndefaults/             # Built-in reusable pipeline steps\npackages/\n└── design-system/    # Shared UI components\n```\n\nBuilt with Rust + TypeScript. Desktop app uses Tauri.\n\n## Development\n\n```bash\nmake dev      # Start desktop app with hot reload\nmake build    # Build everything\nmake test     # Run all tests\nmake check    # Clippy + format + lint checks\n```\n\nRun `make help` for all available commands.\n\n## Status\n\nAlpha. Expect rough edges. We're building in the open.\n\n## License\n\n[MIT](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairlock-hq%2Fairlock","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fairlock-hq%2Fairlock","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairlock-hq%2Fairlock/lists"}