{"id":51327364,"url":"https://github.com/antongulin/robin","last_synced_at":"2026-07-01T19:32:33.133Z","repository":{"id":353495807,"uuid":"1219664627","full_name":"antongulin/robin","owner":"antongulin","description":"Free AI code reviews on every pull request. Bring your own key (OpenRouter free tier works), runs in your repo as a GitHub Action - no quotas, no per-seat fees.","archived":false,"fork":false,"pushed_at":"2026-07-01T06:42:19.000Z","size":1807,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-01T08:23:10.882Z","etag":null,"topics":["ai-code-review","ai-pr-review","artificial-intelligence","automation","bot","byok","ci-cd","claude","code-review","code-review-bot","coderabbit-alternative","developer-tools","github-actions","llm","open-source","openai","openrouter","pull-request","pull-request-review","robin"],"latest_commit_sha":null,"homepage":"https://www.robinreview.dev","language":"TypeScript","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/antongulin.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"docs/ROADMAP-2.0.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["antongulin"],"custom":["https://www.anton.qa"]}},"created_at":"2026-04-24T05:19:59.000Z","updated_at":"2026-07-01T06:42:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/antongulin/robin","commit_stats":null,"previous_names":["antongulin/universal-code-reviewer","antongulin/robin"],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/antongulin/robin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antongulin%2Frobin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antongulin%2Frobin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antongulin%2Frobin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antongulin%2Frobin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/antongulin","download_url":"https://codeload.github.com/antongulin/robin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/antongulin%2Frobin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35020870,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["ai-code-review","ai-pr-review","artificial-intelligence","automation","bot","byok","ci-cd","claude","code-review","code-review-bot","coderabbit-alternative","developer-tools","github-actions","llm","open-source","openai","openrouter","pull-request","pull-request-review","robin"],"created_at":"2026-07-01T19:32:32.346Z","updated_at":"2026-07-01T19:32:33.124Z","avatar_url":"https://github.com/antongulin.png","language":"TypeScript","funding_links":["https://github.com/sponsors/antongulin","https://www.anton.qa"],"categories":[],"sub_categories":[],"readme":"# Robin\n\nFree AI code reviews for every pull request. You bring an API key; Robin reviews show up like a teammate left comments.\n\n[![Self-Test](https://github.com/antongulin/robin/actions/workflows/self-test.yml/badge.svg)](https://github.com/antongulin/robin/actions/workflows/self-test.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Node 24](https://img.shields.io/badge/runtime-node24-brightgreen.svg)](action.yml)\n\n![A Robin review on a pull request — summary, severity-tiered findings, and a teammate-style note](docs/assets/robin-review.png)\n\n## What you get\n\n- A review when you open a pull request (or when someone comments `/robin`)\n- A short summary plus inline comments on changed lines\n- Your choice of AI provider — including **free** options\n\nWhen there's nothing worth flagging, Robin says so instead of inventing nitpicks:\n\n![A clean Robin pass on a pull request — no issues found](docs/assets/robin-review-clean.png)\n\nYou are **not** signing up for a separate review bot service. The workflow runs in your repo and calls the AI URL you configure.\n\n## For AI coding agents\n\nUsing Cursor, Copilot, Claude Code, or similar? Copy this prompt after secrets are set:\n\n```text\nAdd Robin to this repository.\n- Workflow file: .github/workflows/robin.yml\n- Reusable workflow: antongulin/robin/.github/workflows/review.yml@main\n- Action ref if needed: antongulin/robin@main\n- Secrets: LLM_API_KEY, LLM_BASE_URL, LLM_MODEL\n- Do NOT use @v0 or any v0 tag\n- Do NOT use pull_request_target or synchronize on pull_request\nRead AGENTS.md in the robin repo for full rules.\n```\n\n## Quick install\n\nIn a terminal, from your project folder, run:\n\n```bash\ncurl -fsSL https://robinreview.dev/install.sh | bash\n```\n\nThis creates `.github/workflows/robin.yml` for you (it never overwrites an existing file).\nYou still need to add the three secrets — do **Steps 1 and 2** below, then commit and push.\nYou can **skip Step 3**: the script already did it.\n\nPrefer to do it by hand, or read the script first? It's\n[scripts/install.sh](scripts/install.sh) — follow the manual 3 steps instead.\n\n## Setup in 3 steps\n\n### Step 1 — Get an API key (free option)\n\nThe easiest free setup uses [OpenRouter](https://openrouter.ai/):\n\n1. Create an account at [openrouter.ai](https://openrouter.ai/).\n2. Create an API key in the dashboard.\n3. Use these values for your GitHub secrets:\n\n| Secret name | Value |\n| --- | --- |\n| `LLM_API_KEY` | Your OpenRouter key (`sk-or-...`) |\n| `LLM_BASE_URL` | `https://openrouter.ai/api/v1` |\n| `LLM_MODEL` | `openrouter/free` |\n\n\u003e [!TIP]\n\u003e `openrouter/free` picks a free model for each review — **$0 from OpenRouter**. OpenRouter rotates which model runs; **leave this secret as `openrouter/free`** — the action retries and uses provider fallbacks when a route is temporarily unavailable. You only spend [GitHub Actions](https://docs.github.com/en/billing/concepts/product-billing/github-actions) minutes while the job runs (often a few minutes per review).\n\u003e\n\u003e - **Public repos:** standard GitHub-hosted runners are free with no monthly minute cap.\n\u003e - **Private repos:** GitHub Free includes about **2,000 minutes/month**; [GitHub Pro](https://docs.github.com/en/billing/concepts/product-billing/github-actions) includes about **3,000 minutes/month** (check your plan for current limits).\n\nOther providers (OpenAI, Groq, Ollama, etc.) work too. See [Supported providers](#supported-providers) or [docs/ADVANCED.md](docs/ADVANCED.md).\n\n### Step 2 — Add secrets on GitHub\n\n1. Open **your** repository on GitHub (not this one).\n2. Go to **Settings** → **Secrets and variables** → **Actions**.\n3. Click **New repository secret** and add each name from the table above.\n\n\u003e [!WARNING]\n\u003e Never put API keys inside workflow files, pull request comments, or chat with an AI. Only use GitHub Secrets.\n\n### Step 3 — Add the workflow file\n\n\u003e [!NOTE]\n\u003e **Ran the Quick install one-liner above?** Skip this step — the script already created\n\u003e this file. Just finish Steps 1 and 2 (the secrets), then commit and push.\n\nCreate a new file in your repo:\n\n**Path:** `.github/workflows/robin.yml`\n\n**Contents:** copy this exactly:\n\n```yaml\nname: Robin\n\non:\n  pull_request:\n    types: [opened, reopened, ready_for_review]\n  issue_comment:\n    types: [created]\n\npermissions:\n  contents: read\n  pull-requests: write\n\njobs:\n  review:\n    uses: antongulin/robin/.github/workflows/review.yml@main\n    secrets:\n      LLM_API_KEY: ${{ secrets.LLM_API_KEY }}\n      LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}\n      LLM_MODEL: ${{ secrets.LLM_MODEL }}\n```\n\nCommit and push. Open a pull request — you should see a review within a few minutes.\n\n\u003e [!IMPORTANT]\n\u003e Use **`@main`** for the latest fixes, or pin a release tag (for example `@v1` or `@v1.0.0`) after [releases](https://github.com/antongulin/robin/releases) exist. Do **not** use `@v0`. See [Version pins](#version-pins) below.\n\n## Running on a self-hosted runner\n\nBy default, the reusable workflow runs on GitHub's hosted `ubuntu-latest` runner:\n\n```yaml\nwith:\n  runner: '\"ubuntu-latest\"'\n```\n\nTo run reviews on your own machine, Mac mini, home server, local Linux box, or Coolify runner, pass `runner` as valid JSON. Use a JSON string for one label or a JSON array for multiple labels.\n\nTo create a local runner, go to:\n\n```text\nRepository Settings -\u003e Actions -\u003e Runners -\u003e New self-hosted runner\n```\n\nThen add labels such as `local`, `linux`, `mac`, or `coolify`, and reference those labels through the `runner` input.\n\n### Does the runner need to run all the time?\n\nA matching self-hosted runner must be online when GitHub starts the review job. It can be a local runner process (`./run.sh`), a service (`./svc.sh start`), a Docker container, or a Coolify-managed service. Docker is optional; it is just one way to run the GitHub Actions runner.\n\nIf no matching runner is online, GitHub queues the job until one comes online. It will not fall back to `ubuntu-latest` unless you add a separate fallback job. For reliable PR reviews, keep an always-on runner available, such as a Mac mini, home server, VPS, or Coolify service. A laptop runner only works while the laptop is awake and the runner process or service is running.\n\n\u003e [!WARNING]\n\u003e Self-hosted runners can execute arbitrary workflow code.\n\u003e Do not use them for untrusted public pull requests.\n\u003e Prefer repo-owned private repos or trusted collaborators only.\n\u003e Consider ephemeral runners for stronger isolation.\n\nLocal machine runner:\n\n```yaml\njobs:\n  review:\n    uses: antongulin/robin/.github/workflows/review.yml@main\n    with:\n      runner: '[\"self-hosted\", \"local\"]'\n    secrets:\n      LLM_API_KEY: ${{ secrets.LLM_API_KEY }}\n      LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}\n      LLM_MODEL: ${{ secrets.LLM_MODEL }}\n```\n\nCoolify runner:\n\n```yaml\njobs:\n  review:\n    uses: antongulin/robin/.github/workflows/review.yml@main\n    with:\n      runner: '[\"self-hosted\", \"linux\", \"coolify\"]'\n    secrets:\n      LLM_API_KEY: ${{ secrets.LLM_API_KEY }}\n      LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }}\n      LLM_MODEL: ${{ secrets.LLM_MODEL }}\n```\n\n## Using it day to day\n\n| When | What happens |\n| --- | --- |\n| You open a PR | Review runs once automatically |\n| You push more commits | No new review (saves time and API usage) |\n| You want another review | Comment `/robin` on the PR (first line of the comment) |\n| You want a short overview only | Comment `/summary` |\n| You need help | Comment `/help` |\n\n`/review` still works as an alias for `/robin`. Only people with **write** access (or higher) on the repo can run these commands by default.\n\n## Example\n\nThe bot posts a status comment, then a review with severity counts:\n\n```md\n## 🏹 Robin\n\n🚨 **1 High** | ⚠️ **1 Medium** | 💡 **2 Suggestions**\n\n### Summary\nFocused change. Main risk: timeout errors are not handled clearly.\n\n### Findings Not Posted Inline\n**1 (`src/example.ts:24`)** — Retries exist but timeout failures lack context.\n```\n\n## Robin in your editor\n\nThe one-line installer also installs a small **companion skill** into every coding agent\non your machine (Claude Code, Cursor, Copilot, Windsurf, …) via the cross-platform\n[skills CLI](https://skills.sh) — `npx skills add https://github.com/antongulin/robin --all --global`. It\nships with Robin; there's nothing separate to sign up for. (Skip it with `ROBIN_SKILL=0`,\nor install it by hand with that command.) Once it's there, you can say things like:\n\n\u003e \"review this PR with Robin\" · \"robin this PR\" · \"fix the Robin feedback and merge\"\n\n…and the agent drives a bounded review → fix → re-review → merge loop: it waits for\nRobin's review, fixes only the findings it can verify (skipping noise from weaker free\nmodels), replies to each comment, resolves threads, and merges when green — capped at\nfive passes. Source: [skills/robin/SKILL.md](skills/robin/SKILL.md).\n\n## Supported providers\n\n| Provider | `LLM_BASE_URL` | `LLM_MODEL` example |\n| --- | --- | --- |\n| **OpenRouter (free)** | `https://openrouter.ai/api/v1` | `openrouter/free` |\n| OpenAI | `https://api.openai.com/v1` | `gpt-4o` |\n| Groq | `https://api.groq.com/openai/v1` | `llama-3.3-70b-versatile` |\n| Ollama (your server) | `http://YOUR_SERVER:11434/v1` | `llama3.2` |\n\nGitHub’s servers cannot reach `localhost` on your laptop. For Ollama at home, use a public server, a tunnel, or a [self-hosted runner](docs/ADVANCED.md#save-github-actions-minutes).\n\n## Optional: config and custom rules\n\nCopy [`.github/robin.yml.example`](.github/robin.yml.example) to `.github/robin.yml` to set `max-diff-size`, skip extra paths, and more. Details: [docs/ADVANCED.md](docs/ADVANCED.md#repository-config-file).\n\nAdd `.github/code-reviewer.md` in your repo:\n\n```md\n# Reviewer rules\n\n- Focus on bugs and security, not formatting.\n- Ask for tests when business logic changes.\n```\n\n## Something went wrong?\n\n| Problem | What to try |\n| --- | --- |\n| Workflow fails immediately | Check all three secrets exist and the workflow uses `@main` |\n| `Input required: model` or `llm-base-url` | Add missing secrets (Step 2) |\n| Review never appears | Open **Actions** tab → open the failed run → read the error |\n| `/robin` does nothing | Put `/robin` on the **first** line; you need write access on the repo. On `@v1`, pin `@v1.4.0`+ or use `/review` if the tag predates v1.4.0 |\n| Review is very short | PR may be huge — see [docs/ADVANCED.md](docs/ADVANCED.md) (`max-diff-size`) |\n| `Empty response from LLM` | Free routers sometimes return no text — the action retries automatically; comment `/robin` again |\n| `OpenRouter stall` / job runs 15 min with no review | Auto-router hung — action now aborts after 45s with no stream and retries | Watch Actions log for `LLM resolved model` (routing OK); pin `@v2` or `@main` for the fix |\n| `404 Provider returned error` | Normal for `openrouter/free` when one provider is down — the action retries up to 5 times; keep `LLM_MODEL=openrouter/free` |\n\nMore fixes: [docs/ADVANCED.md#troubleshooting](docs/ADVANCED.md#troubleshooting)\n\n## Version pins\n\n| Pin | When to use |\n| --- | --- |\n| `@main` | Latest changes on the default branch |\n| `@v1` | Latest `1.x` release (updated on each release) |\n| `@v1.0.0` | Exact version (most predictable) |\n| Full commit SHA | Maximum supply-chain safety |\n\n```yaml\nuses: antongulin/robin/.github/workflows/review.yml@v1\n```\n\nReleases and notes are published automatically from [CHANGELOG.md](CHANGELOG.md) when changes land on `main`. See [CONTRIBUTING.md](CONTRIBUTING.md) for commit message format.\n\n## Learn more\n\n- [docs/ADVANCED.md](docs/ADVANCED.md) — all settings, strict mode, manual-only reviews, security notes\n- [CONTRIBUTING.md](CONTRIBUTING.md) — run tests and send pull requests\n- [CHANGELOG.md](CHANGELOG.md) — release history\n\n## Support\n\nRobin is free and open source (MIT). If it saves you money on code review, you can help keep it maintained:\n\n- ⭐ Star the repo — it's the cheapest way to help others find it.\n- 💛 [Sponsor the project](https://github.com/sponsors/antongulin) to support ongoing work.\n- 🐛 [Open an issue](https://github.com/antongulin/robin/issues) for bugs or ideas.\n\nBuilt by [Anton Gulin](https://github.com/antongulin), AI Architect building AI systems, agent workflows, and software automation. Need a custom AI agent, code-review pipeline, or QA automation? Visit [Anton.QA](https://www.anton.qa).\n\n## Development\n\n```bash\ngit clone https://github.com/antongulin/robin.git\ncd robin\nnpm ci\nnpm run lint\nnpm test\nnpm run build\n```\n\nRuntime code lives in `dist/index.js`; run `npm run build` before releasing. A full build removes intermediate files under `dist/` after bundling so only `index.js` remains locally (same file CI checks against).\n\nIf you ran `tsc` alone and see extra files under `dist/`, run `npm run clean`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantongulin%2Frobin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fantongulin%2Frobin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fantongulin%2Frobin/lists"}