Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.
Connect your Git provider once, pick the repositories to watch, and every new pull request (PR) or merge request (MR) in them gets a review with no manual trigger. New to Review? Read the overview first.
Prerequisites
A CloudThinker workspace where you’re a workspace Admin. Developers and Viewers can see reviews but can’t run setup. See roles.
An account on GitHub, GitLab, Bitbucket Cloud, Azure DevOps or AWS CodeCommit that can install apps, create access tokens or create IAM roles for the repositories you want reviewed.
About ten minutes. GitLab, Azure DevOps and CodeCommit need one extra webhook step.
Self-hosted GitLab only: CloudThinker must be able to reach your GitLab URL over HTTPS, and your GitLab instance must be able to reach the webhook URL the wizard shows.
Each workspace connects one Git provider. If your team uses two, set up Review in a separate workspace for each.
Connect a provider and repositories
1
Open Review
Click Review in the left navigation. Before setup, the page shows Review smarter. Ship faster.
2
Start the setup wizard
Click Get Started with Review. The Review Setup dialog opens with these steps: Provider, Connect, Events, Repositories and Learnings. GitHub and Bitbucket skip Events because their webhooks register automatically.
3
Choose a provider
Under Review Provider, select GitLab, GitHub, Bitbucket, Azure DevOps or AWS CodeCommit, then click Next.
4
Connect your account
Authenticate the way your provider allows:
Provider
How you connect
GitHub
Install GitHub App
GitLab
OAuth tab (Connect to GitLab, GitLab.com only) or Access Token tab
Bitbucket
OAuth tab (Connect to Bitbucket) or Access Token tab
Azure DevOps
Personal access token, then Validate PAT and Connect
AWS CodeCommit
IAM Role (recommended) or Access Keys
Not sure which to pick? Use a project, group, workspace or repository access token for a team setup, so comments come from a bot user. Use OAuth for a quick trial on GitLab.com or Bitbucket. Provider authentication has the exact scopes and steps for each one.
Access tokens and PATs expire. Note the expiry date when you create one, and replace it before then with Update token.
Success state: the dialog shows Connected and moves to the next step.
5
Add the webhook (GitLab, Azure DevOps, CodeCommit)
The Events step shows what to set up, then you click Mark as Configured:
GitLab and Azure DevOps: add the webhook URL and Secret token in your provider, with the triggers the step lists.
AWS CodeCommit: copy the script the step shows and run it. It already contains the URL and secret.
Without this webhook, CloudThinker never hears about new MRs or PRs and no review runs.
To see the URL and secret token again later, open Review → Settings, and in the Connection section click Webhook.
6
Select repositories
Under Select Repositories, check each repository to review, then click Next. Use Search repositories… to find one in a long list. Only repositories your connection can see are listed. On GitHub, a repository must also be granted in the app’s repository access first (see GitHub).Repositories you create on your provider later don’t appear on their own: add them with Add repository in Review → Settings → Repositories.
7
Learnings
Two switches decide what reviews learn from. Both start on.
Switch
When on
Change it later
Learn from resolved findings
Each week, CloudThinker turns recurring patterns from resolved findings into Learnings for future reviews
On the Learnings page
Repository conventions
CloudThinker detects convention files, such as AGENTS.md, CLAUDE.md and .cursor/rules/, and follows them in every review. They refresh before each review. See the full list
Review → Settings → Repositories, the row’s actions menu (⋯) → Learning sources
Click Complete.Success state: the Review Overview page loads, and your repositories appear under Review → Settings → Repositories. While CloudThinker clones a repository, its row shows Cloning and its Review switch reads Setting up. If a clone fails, the row shows Setup failed; see repository problems. The workspace starts on the Fastreview mode.
Get your first review
1
Open a pull or merge request
Push a branch to a selected repository and open a PR or MR against it. Don’t open it as a draft: drafts are skipped until you mark them ready for review.A PR that arrives while the repository is still cloning gets a “setting up” note and is reviewed once the clone finishes.
2
Read the findings on the PR
CloudThinker posts a progress comment first, then replaces it with a summary. Inline comments land on the exact lines, each with a severity (Critical, High, Medium or Low), an explanation and a suggested fix.Success state: a summary comment appears on the PR, with a link back to the change in CloudThinker.Comments come from the identity you connected with:
How you connected
Comments appear as
GitHub App
The CloudThinker GitHub App
GitLab or Bitbucket access token
The token’s bot user
GitLab or Bitbucket OAuth
The person who connected
Azure DevOps PAT
The person who owns the PAT
CodeCommit
The IAM role or user the setup script created
3
Follow up from the PR
Reply in a finding’s thread to dispute it, or mention the bot in a PR comment:
@cloudthinker-ai why is this query a problem?@cloudthinker-ai review@cloudthinker-ai autofix
On AWS CodeCommit, only questions and @cloudthinker-ai help work. CodeCommit ignores review, autofix and replies in a finding’s thread. To review a CodeCommit PR again, push a new commit to its source branch.To skip review on one PR, put @cloudthinker:ignore anywhere in the PR description. See mention commands for the full list.
You can also open every reviewed change, with its findings and status, under Review → Reviews. See review workspace.
Choose a review mode
The review mode applies to every repository in the workspace. Change it under Review → Settings → General → Review mode. New workspaces start on Fast.
Review Settings: connected provider, review mode, and Add repository
Mode
What it does
Use it when
Fast
One reviewer reads the change. Quick analysis, lower cost
Most repositories, small PRs, fast feedback
Auto
Picks Fast for small changes and Advanced for complex ones. Shown when it’s available in your workspace; to get it, contact CloudThinker support
Repositories with a mix of small and large changes
Advanced
Splits the change across parallel reviewers for the deepest analysis, at the highest cost
Critical services where a missed defect is expensive
Other workspace settings
These sit in the same General section of Review → Settings and are off until you turn them on.
Setting
What it does
Pipeline analysis
Explains each failed pipeline run and suggests a fix. Each analysis is an agent run and uses credits. See pipelines
Auto-resolve conflicts
Opens a follow-up MR/PR that resolves merge conflicts. Each resolution is an agent run and uses credits. See auto-resolve conflicts
Analyze new release tags
Starts a release risk report when a tag is pushed. Each report uses credits like a review; see usage and credits and releases
Each repository can have filters, so CloudThinker skips PRs you don’t want reviewed, such as bot dependency bumps.
1
Open the repository's filters
Go to Review → Settings → Repositories, open the repository’s actions menu (⋯), and click Configure filters.
2
Add rules
Click Add Filter Rule, pick the filter type, Include or Exclude, and the values. Then click Save Filters.
Filter
Matches
Authors
The PR author’s username, exact match, not case-sensitive. No wildcards. For example dependabot[bot]
Branches
The target branch (the one being merged into). Glob patterns work, for example release/*. Case-sensitive
Labels
PR or MR labels, exact match, not case-sensitive. For example needs-review
How rules combine:
Exclude rules are checked first. A PR that matches any exclude rule is skipped.
Every include rule must then pass. Within one rule, matching any of its values is enough.
Put several branches in one Branches rule. Two separate Branches include rules must both match the same target branch, so almost every PR is skipped.
Rules
Reviewed
Skipped
Include Branches main, release/* (one rule)
PRs into main or any release/ branch
PRs into any other branch
Include Branches main plus Include Branches release/* (two rules)
Nothing
Every PR: no target branch is both main and a release/ branch
Include Branches main plus Include Labels needs-review
PRs into main that carry needs-review
PRs into main without the label, and every PR into another branch
Filters are checked on every new event, so they also apply to MR/PRs CloudThinker already tracks, from their next push. To review one filtered MR/PR anyway, comment @cloudthinker-ai review on it. CodeCommit has no review command, so a filtered CodeCommit PR stays unreviewed until you change the filters and push a new commit.For example, Exclude Authors dependabot[bot] plus Include Branches main reviews every PR into main except Dependabot’s. A skipped PR is tracked but not reviewed: it shows on Review → Reviews in the All tab with the Ignored verdict. See verdicts.
Troubleshooting
No comment appears on a new PR
Cause: the PR is a draft, the repository isn’t selected or is still cloning, a filter excluded it, or the webhook is missing.Check: open Review → Settings → Repositories and confirm the repository is On. Then check your provider:
GitHub: in your organization or account settings, open GitHub Apps, click Configure next to the CloudThinker app, and confirm the repository has access.
Bitbucket: in Repository settings → Webhooks, confirm the CloudThinker webhook exists and its recent requests succeeded.
GitLab: in Settings → Webhooks, edit the CloudThinker webhook and check Recent events for failed requests.
Azure DevOps: in Project Settings → Service hooks, open each CloudThinker subscription and check its History.
CodeCommit: there’s no webhook log. In Amazon EventBridge, in the repository’s region, confirm the CloudThinker-CodeCommit-* rules exist. If they don’t, re-run the Events script.
Fix: mark the PR ready for review, enable the repository, or re-add the webhook. Then comment @cloudthinker-ai review on the PR to start a review without pushing. On CodeCommit, push a new commit to the PR’s source branch instead.
Review shows Reconnect your Git provider
Cause: the token expired or was revoked, or the OAuth grant was removed.Fix: the Review page shows an Authentication Error alert. If you connected with OAuth, click Reconnect with GitLab (or Bitbucket) and approve access again. If you used a token, click Update Token (on CodeCommit, Update Credentials), paste the new one and validate it. Your repositories and settings are kept.A PR opened while the connection was broken may have no review. Comment @cloudthinker-ai review on it to start one, or on CodeCommit, push a new commit to its source branch.To replace a token before it expires, open Review → Settings, and in the Connection section open the actions menu (⋯) and click Update token.
A review stopped before posting its summary
Check: the progress comment on the PR now reads CloudThinker Review Did Not Finish, and may say why, for example that CloudThinker couldn’t open the repository. In CloudThinker, open the review and use More actions (⋯) → View review conversation to see the run.Fix: if the repository couldn’t be opened, reconnect it in Review → Settings. Then comment @cloudthinker-ai review on the PR to continue from the last reviewed commit. On CodeCommit, push a new commit to the PR’s source branch instead.
The PR says Code Review Stopped (Quota Exceeded)
Cause: your workspace ran out of its usage quota, so the review couldn’t finish.Check:Admin Settings → Usage shows the credits your organization has left (the Owner and Admins can open it). A workspace can also hit its own credit limit.Fix: upgrade your plan or wait for the quota to renew (see usage and credits for when each credit type resets), then comment @cloudthinker-ai review on the PR. On CodeCommit, push a new commit to the PR’s source branch instead.
A repository shows Setup failed or stays on Cloning
Check: in Review → Settings → Repositories, hover Setup failed to see the clone error. It’s often an expired token or missing access to that repository.Fix: fix the access, then click Retry on the row. If a clone stays on Cloning, click Cancel and confirm Cancel clone. The row shows Setup cancelled; click Retry.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"CloudThinker","colors":{"primary":"#0c93c0","light":"#2897c1","dark":"#0c93c0"},"logo":{"light":"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/light.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=a56a571509d1cd246f5b0e68db015e5f","dark":"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/dark.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=4252f33496bbaa527e5408338963a31e"},"favicon":"https://mintcdn.com/cloudthinker/PoYnb4baZ54aMMQW/favicon.ico?fit=max\u0026auto=format\u0026n=PoYnb4baZ54aMMQW\u0026q=85\u0026s=6570e99ed2a763d9632c8f933fe9c164","background":{"color":{"light":"#eef0f3","dark":"#000000"}},"navbar":{"links":[{"href":"https://discord.com/invite/sRBWRWtaNR","label":"Community"},{"href":"https://cloudthinker.io/blogs","label":"Blog"},{"href":"https://cloudthinker.io/contact","label":"Contact us"}],"primary":{"type":"button","label":"Open app","href":"https://app.cloudthinker.io"}},"footer":{"socials":{"x":"https://x.com/cloudthinkerio?s=21","linkedin":"https://www.linkedin.com/company/cloud-thinker","github":"https://github.com/cloudthinker-ai","discord":"https://discord.com/invite/sRBWRWtaNR","youtube":"https://www.youtube.com/@cloudthinkerai"}},"seo":{"indexing":"navigable"},"fonts":{"family":"Poppins"},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"metadata":{"timestamp":false},"styling":{"latex":true},"navigation":{"languages":[{"language":"en","href":""},{"language":"vi","href":"vi"},{"language":"ja","href":"ja"},{"language":"ko","href":"ko"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"cloudthinker","hasAudioNarration":false,"actualSubdomain":"cloudthinker","customDomains":["docs.cloudthinker.io"],"gitSource":{"type":"github","owner":"nhat-tranvan","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{},"buildId":"6af2bdaaca4de4868675335e","clientVersion":"0.0.4138","searchFilterCounts":[{"language":"vi","tag":"Nền tảng","count":130},{"language":"vi","tag":"Kết nối","count":100},{"language":"default","tag":"Platform","count":71},{"language":"en","tag":"Platform","count":64},{"language":"ja","tag":"プラットフォーム","count":63},{"language":"ko","tag":"플랫폼","count":63},{"language":"default","tag":"Connections","count":55},{"language":"vi","tag":"Sản phẩm","count":54},{"language":"en","tag":"Connections","count":50},{"language":"ja","tag":"接続","count":48},{"language":"ko","tag":"연결","count":48},{"language":"vi","tag":"Tài nguyên","count":39},{"language":"default","tag":"Products","count":33},{"language":"vi","tag":"Học","count":30},{"language":"en","tag":"Products","count":29},{"language":"ja","tag":"プロダクト","count":29},{"language":"ko","tag":"제품","count":29},{"language":"default","tag":"Resources","count":26},{"language":"vi","tag":"Bắt đầu","count":26},{"language":"vi","tag":"Observability \u0026 Monitoring","count":24},{"language":"vi","tag":"Resolve","count":20},{"language":"default","tag":"Learn","count":18},{"language":"default","tag":"Agentic Infrastructure Operations - Engineer Edition","count":18},{"language":"vi","tag":"Agentic Infrastructure Operations - Engineer Edition","count":18},{"language":"en","tag":"Get started","count":16},{"language":"ja","tag":"はじめに","count":16},{"language":"ko","tag":"시작하기","count":16},{"language":"vi","tag":"Databases","count":16},{"language":"default","tag":"Review","count":13},{"language":"en","tag":"Resources","count":13},{"language":"ja","tag":"リソース","count":13},{"language":"ko","tag":"리소스","count":13},{"language":"en","tag":"Monitoring","count":12},{"language":"en","tag":"Learn","count":12},{"language":"en","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"ja","tag":"Observability \u0026 Monitoring","count":12},{"language":"ja","tag":"学ぶ","count":12},{"language":"ja","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"ko","tag":"Observability \u0026 Monitoring","count":12},{"language":"ko","tag":"배우기","count":12},{"language":"ko","tag":"Agentic Infrastructure Operations - Leadership Edition","count":12},{"language":"default","tag":"Get started","count":11},{"language":"en","tag":"Resolve","count":11},{"language":"ja","tag":"Resolve","count":11},{"language":"ko","tag":"Resolve","count":11},{"language":"default","tag":"Resolve","count":9},{"language":"en","tag":"Enterprise","count":9},{"language":"default","tag":"Set up","count":8},{"language":"ja","tag":"Databases","count":8},{"language":"ko","tag":"Databases","count":8}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":"a.ct-featured{display:block;margin:1.25rem 0 1rem;padding:1.75rem 1.75rem 1.5rem;border:1px solid rgba(12, 147, 192, 0.45)!important;border-radius:16px;background:radial-gradient(120% 160% at 0% 0%, rgba(12, 147, 192, 0.14), transparent 55%),\n #ffffff;box-shadow:0 12px 32px -16px rgba(12, 147, 192, 0.45);text-decoration:none!important;transition:border-color 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease}a.ct-featured:hover{border-color:#0c93c0!important;transform:translateY(-1px);box-shadow:0 16px 40px -16px rgba(12, 147, 192, 0.6)}.dark a.ct-featured{border-color:rgba(40, 151, 193, 0.45)!important;background:radial-gradient(120% 160% at 0% 0%, rgba(40, 151, 193, 0.16), transparent 55%),\n #05070a;box-shadow:0 12px 32px -16px rgba(40, 151, 193, 0.35)}.dark a.ct-featured:hover{border-color:#2897c1!important}.ct-featured-head{display:flex;align-items:center;gap:0.75rem;margin-bottom:0.875rem}.ct-featured-icon{display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:999px;background:rgba(12, 147, 192, 0.12);color:#0a7aa0}.dark .ct-featured-icon{background:rgba(40, 151, 193, 0.14);color:#5bb8e0}.ct-eyebrow{font-size:0.75rem;font-weight:600;letter-spacing:0.14em;text-transform:uppercase;color:#0a7aa0}.dark .ct-eyebrow{color:#5bb8e0}.ct-title{font-size:1.375rem;font-weight:600;line-height:1.3;color:#0b1a2b}.dark .ct-title{color:#f5f5f7}.ct-body{margin:0.5rem 0 0!important;font-weight:400!important;font-size:1rem;max-width:46rem;color:#5b6577;line-height:1.6}.dark .ct-body{color:#a1a1a6}.ct-cta{display:inline-block;margin-top:1rem;font-weight:600;color:#0a7aa0}.dark .ct-cta{color:#5bb8e0}.ct-illustration{margin:1.5rem 0}.ct-illustration img{display:block;width:100%;max-width:720px;height:auto;margin:0 auto}.ct-iso-scene{margin:1.5rem 0 2rem;border:1px solid rgba(12, 147, 192, 0.18);border-radius:16px;background:#ffffff;overflow:hidden}.dark .ct-iso-scene{border-color:rgba(40, 151, 193, 0.22);background:#000000}.ct-iso-scene .ct-iso-svg{display:block;width:100%;height:auto}.ct-landing{max-width:1120px;margin:0 auto;padding:3rem 1.5rem 5rem}.ct-landing a{text-decoration:none!important;border-bottom-width:0}.ct-kicker{font-size:0.8125rem;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:#0c93c0}.dark .ct-kicker{color:#2897c1}.ct-hero{text-align:center;padding:1.5rem 0 1rem}.ct-hero h1{margin:0.75rem 0 0;font-size:clamp(2.25rem, 5vw, 3.75rem);line-height:1.05;font-weight:600;letter-spacing:-0.03em}.ct-hero .ct-promise{margin:1rem auto 0;font-size:clamp(1.125rem, 2.2vw, 1.5rem);color:#5b6577}.dark .ct-hero .ct-promise{color:#a1a1a6}.ct-hero .ct-promise strong{color:#0c93c0;font-weight:600}.dark .ct-hero .ct-promise strong{color:#2897c1}.ct-hero p.ct-lead{max-width:44rem;margin:1rem auto 0;font-size:1.0625rem;line-height:1.65;color:#5b6577}.dark .ct-hero p.ct-lead{color:#a1a1a6}.ct-actions{display:flex;flex-wrap:wrap;gap:0.75rem;justify-content:center;margin-top:1.75rem}.ct-btn{display:inline-flex;align-items:center;gap:0.5rem;padding:0.7rem 1.25rem;border-radius:999px;font-weight:600;font-size:0.95rem;transition:transform .15s ease, background .15s ease}.ct-btn:hover{transform:translateY(-1px)}.ct-btn-primary{background:#0c93c0;color:#fff!important}.ct-btn-primary:hover{background:#0a7aa0}.ct-btn-ghost{border:1px solid rgba(12, 147, 192, 0.35)!important;color:#0b1a2b!important}.dark .ct-btn-ghost{color:#f5f5f7!important;border-color:rgba(40, 151, 193, 0.4)!important}.ct-landing .ct-iso-scene{margin-top:2.5rem}.ct-section{margin-top:4.5rem}.ct-section>h2{margin:0.4rem 0 0;font-size:1.75rem;font-weight:600;letter-spacing:-0.02em}.ct-section>p.ct-section-lead{margin:0.5rem 0 0;color:#5b6577;max-width:46rem}.dark .ct-section>p.ct-section-lead{color:#a1a1a6}.ct-steps{display:grid;grid-template-columns:repeat(4, minmax(0, 1fr));gap:1rem;margin-top:1.5rem}.ct-step{display:block;padding:1.25rem;border-radius:14px;border:1px solid rgba(12, 147, 192, 0.18)!important;background:#fff;transition:border-color .15s ease, transform .15s ease}.dark .ct-step{background:#05070a;border-color:rgba(40, 151, 193, 0.22)!important}.ct-step:hover{border-color:#0c93c0!important;transform:translateY(-1px)}.ct-step-num{display:inline-flex;width:1.75rem;height:1.75rem;border-radius:999px;align-items:center;justify-content:center;font-size:0.85rem;font-weight:700;color:#fff;background:#0c93c0}.ct-step h3,.ct-card h3{margin:0.75rem 0 0.25rem;font-size:1.05rem;font-weight:600;color:#0b1a2b}.dark .ct-step h3,.dark .ct-card h3{color:#f5f5f7}.ct-step p,.ct-card p{margin:0;font-size:0.925rem;line-height:1.55;color:#5b6577}.dark .ct-step p,.dark .ct-card p{color:#a1a1a6}.ct-grid{display:grid;gap:1rem;margin-top:1.5rem}.ct-grid-3{grid-template-columns:repeat(3, minmax(0, 1fr))}.ct-grid-5{grid-template-columns:repeat(5, minmax(0, 1fr))}.ct-card{display:flex;flex-direction:column;padding:1.25rem;border-radius:14px;border:1px solid rgba(12, 147, 192, 0.18);background:#fff}.dark .ct-card{background:#05070a;border-color:rgba(40, 151, 193, 0.22)}.ct-card .ct-card-head{display:flex;align-items:center;gap:0.6rem}.ct-card .ct-card-head span{font-weight:600;color:#0b1a2b}.dark .ct-card .ct-card-head span{color:#f5f5f7}.ct-card .ct-tagline{margin-top:0.75rem;font-size:1.05rem;font-weight:600;line-height:1.35;color:#0c93c0}.dark .ct-card .ct-tagline{color:#2897c1}.ct-card .ct-links{margin-top:auto;padding-top:1rem;display:flex;gap:1rem;font-size:0.9rem;font-weight:600}.ct-card .ct-links a{color:#0c93c0!important}.dark .ct-card .ct-links a{color:#2897c1!important}a.ct-card{transition:border-color .15s ease, transform .15s ease}a.ct-card:hover{border-color:#0c93c0!important;transform:translateY(-1px)}.ct-strip{display:flex;flex-wrap:wrap;gap:0.6rem;margin-top:1.25rem}.ct-strip a{display:inline-flex;align-items:center;gap:0.45rem;padding:0.55rem 0.95rem;border-radius:999px;border:1px solid rgba(12, 147, 192, 0.25)!important;font-size:0.9rem;font-weight:500;color:#0b1a2b!important}.dark .ct-strip a{color:#f5f5f7!important;border-color:rgba(40, 151, 193, 0.3)!important}.ct-strip a:hover{border-color:#0c93c0!important}@media (max-width: 900px){.ct-steps,.ct-grid-3,.ct-grid-5{grid-template-columns:repeat(2, minmax(0, 1fr))}}@media (max-width: 560px){.ct-landing{padding:2rem 1rem 4rem}.ct-steps,.ct-grid-3,.ct-grid-5{grid-template-columns:minmax(0, 1fr)}}.ct-hero h1{color:#0b1a2b;-webkit-text-fill-color:currentColor;background:none}.dark .ct-hero h1{color:#f5f5f7}.ct-landing table{width:100%;margin-top:1.25rem;border-collapse:collapse;font-size:0.925rem}.ct-landing th{text-align:left;font-weight:600;padding:0.7rem 0.9rem;border-bottom:1px solid rgba(12, 147, 192, 0.3)}.ct-landing td{vertical-align:top;padding:0.8rem 0.9rem;border-bottom:1px solid rgba(12, 147, 192, 0.12);color:#5b6577;line-height:1.55}.dark .ct-landing td{color:#a1a1a6}.ct-landing td:first-child{font-weight:600;color:#0b1a2b;width:22%}.dark .ct-landing td:first-child{color:#f5f5f7}.ct-landing td a{color:#0c93c0!important;font-weight:600}.dark .ct-landing td a{color:#2897c1!important}.ct-section>h2{color:#0b1a2b;-webkit-text-fill-color:currentColor;background:none}.dark .ct-section>h2{color:#f5f5f7}.ct-product{padding:1.1rem 1.2rem}.ct-product .ct-tagline{margin-top:0.55rem;font-size:1rem}.ct-product p{margin-top:0.3rem}.ct-powered{margin-top:0.6rem;font-size:0.75rem;font-weight:600;letter-spacing:0.02em;color:#8a94a6}.dark .ct-powered{color:#86868b}.ct-card-head .ct-arrow{margin-left:auto;font-weight:500!important;color:#0c93c0!important;transition:transform .15s ease}.dark .ct-card-head .ct-arrow{color:#2897c1!important}a.ct-product:hover .ct-arrow{transform:translateX(3px)}html:not(.dark) .ct-step,html:not(.dark) .ct-card,html:not(.dark) .ct-iso-scene{background:#f6f7f9}html:not(.dark) .ct-iso-scene{border-color:rgba(12, 147, 192, 0.12)}html:not(.dark) body{color:#2b3240}html:not(.dark) #content-area,html:not(.dark) .prose{color:#2b3240}html:not(.dark) .prose :where(h1,h2,h3,h4,strong){color:#1c2230}html:not(.dark) .ct-hero h1,html:not(.dark) .ct-section>h2,html:not(.dark) .ct-step h3,html:not(.dark) .ct-card h3,html:not(.dark) .ct-card .ct-card-head span{color:#1c2230}"}],"page":{"pagePath":"guide/code-review/setup","slug":"/guide/code-review/setup","pageMetadata":{"title":"Review Setup","description":"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.","icon":"gear","href":"/guide/code-review/setup"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`Connect your Git provider once, pick the repositories to watch, and every new pull request (PR) or merge request (MR) in them gets a review with no manual trigger. New to Review? Read the `,_jsx(_components.a,{href:`/guide/code-review/overview`,children:`overview`}),` first.`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`A CloudThinker workspace where you’re a workspace `,_jsx(_components.strong,{children:`Admin`}),`. Developers and Viewers can see reviews but can’t run setup. See `,_jsx(_components.a,{href:`/guide/security/roles`,children:`roles`}),`.`]}),`\n`,_jsx(_components.li,{children:`An account on GitHub, GitLab, Bitbucket Cloud, Azure DevOps or AWS CodeCommit that can install apps, create access tokens or create IAM roles for the repositories you want reviewed.`}),`\n`,_jsx(_components.li,{children:`About ten minutes. GitLab, Azure DevOps and CodeCommit need one extra webhook step.`}),`\n`,_jsx(_components.li,{children:`Self-hosted GitLab only: CloudThinker must be able to reach your GitLab URL over HTTPS, and your GitLab instance must be able to reach the webhook URL the wizard shows.`}),`\n`]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Each workspace connects one Git provider. If your team uses two, set up Review in a separate workspace for each.`})}),`\n`,_jsx(Heading,{level:`2`,id:`connect-a-provider-and-repositories`,children:`Connect a provider and repositories`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open Review`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Review`}),` in the left navigation. Before setup, the page shows `,_jsx(_components.strong,{children:`Review smarter. Ship faster.`})]})}),_jsx(Step,{title:`Start the setup wizard`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Get Started with Review`}),`. The `,_jsx(_components.strong,{children:`Review Setup`}),` dialog opens with these steps: `,_jsx(_components.strong,{children:`Provider`}),`, `,_jsx(_components.strong,{children:`Connect`}),`, `,_jsx(_components.strong,{children:`Events`}),`, `,_jsx(_components.strong,{children:`Repositories`}),` and `,_jsx(_components.strong,{children:`Learnings`}),`. GitHub and Bitbucket skip `,_jsx(_components.strong,{children:`Events`}),` because their webhooks register automatically.`]})}),_jsx(Step,{title:`Choose a provider`,children:_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Review Provider`}),`, select `,_jsx(_components.strong,{children:`GitLab`}),`, `,_jsx(_components.strong,{children:`GitHub`}),`, `,_jsx(_components.strong,{children:`Bitbucket`}),`, `,_jsx(_components.strong,{children:`Azure DevOps`}),` or `,_jsx(_components.strong,{children:`AWS CodeCommit`}),`, then click `,_jsx(_components.strong,{children:`Next`}),`.`]})}),_jsxs(Step,{title:`Connect your account`,children:[_jsx(_components.p,{children:`Authenticate the way your provider allows:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Provider`}),_jsx(_components.th,{children:`How you connect`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GitHub`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:`Install GitHub App`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GitLab`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`OAuth`}),` tab (`,_jsx(_components.strong,{children:`Connect to GitLab`}),`, GitLab.com only) or `,_jsx(_components.strong,{children:`Access Token`}),` tab`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Bitbucket`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`OAuth`}),` tab (`,_jsx(_components.strong,{children:`Connect to Bitbucket`}),`) or `,_jsx(_components.strong,{children:`Access Token`}),` tab`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Azure DevOps`}),_jsxs(_components.td,{children:[`Personal access token, then `,_jsx(_components.strong,{children:`Validate PAT`}),` and `,_jsx(_components.strong,{children:`Connect`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`AWS CodeCommit`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`IAM Role (recommended)`}),` or `,_jsx(_components.strong,{children:`Access Keys`})]})]})]})]}),_jsxs(_components.p,{children:[`Not sure which to pick? Use a project, group, workspace or repository access token for a team setup, so comments come from a bot user. Use OAuth for a quick trial on GitLab.com or Bitbucket. `,_jsx(_components.a,{href:`/guide/code-review/provider-auth#pick-an-auth-method`,children:`Provider authentication`}),` has the exact scopes and steps for each one.`]}),_jsx(Tip,{children:_jsxs(_components.p,{children:[`Access tokens and PATs expire. Note the expiry date when you create one, and replace it before then with `,_jsx(_components.a,{href:`/guide/code-review/provider-auth#token-expiry`,children:`Update token`}),`.`]})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success state:`}),` the dialog shows `,_jsx(_components.strong,{children:`Connected`}),` and moves to the next step.`]})]}),_jsxs(Step,{title:`Add the webhook (GitLab, Azure DevOps, CodeCommit)`,children:[_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Events`}),` step shows what to set up, then you click `,_jsx(_components.strong,{children:`Mark as Configured`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`GitLab and Azure DevOps:`}),` add the webhook `,_jsx(_components.strong,{children:`URL`}),` and `,_jsx(_components.strong,{children:`Secret token`}),` in your provider, with the triggers the step lists.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`AWS CodeCommit:`}),` copy the script the step shows and run it. It already contains the URL and secret.`]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.a,{href:`/guide/code-review/provider-auth#configure-webhooks`,children:`Configure webhooks`}),` has the steps for each one.`]}),_jsx(Warning,{children:_jsx(_components.p,{children:`Without this webhook, CloudThinker never hears about new MRs or PRs and no review runs.`})}),_jsxs(_components.p,{children:[`To see the URL and secret token again later, open `,_jsx(_components.strong,{children:`Review → Settings`}),`, and in the `,_jsx(_components.strong,{children:`Connection`}),` section click `,_jsx(_components.strong,{children:`Webhook`}),`.`]})]}),_jsxs(Step,{title:`Select repositories`,children:[_jsxs(_components.p,{children:[`Under `,_jsx(_components.strong,{children:`Select Repositories`}),`, check each repository to review, then click `,_jsx(_components.strong,{children:`Next`}),`. Use `,_jsx(_components.strong,{children:`Search repositories…`}),` to find one in a long list. Only repositories your connection can see are listed. On GitHub, a repository must also be granted in the app’s repository access first (see `,_jsx(_components.a,{href:`/guide/code-review/provider-auth#github`,children:`GitHub`}),`).`]}),_jsxs(_components.p,{children:[`Repositories you create on your provider later don’t appear on their own: add them with `,_jsx(_components.strong,{children:`Add repository`}),` in `,_jsx(_components.strong,{children:`Review → Settings → Repositories`}),`.`]})]}),_jsxs(Step,{title:`Learnings`,children:[_jsx(_components.p,{children:`Two switches decide what reviews learn from. Both start on.`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Switch`}),_jsx(_components.th,{children:`When on`}),_jsx(_components.th,{children:`Change it later`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Learn from resolved findings`})}),_jsxs(_components.td,{children:[`Each week, CloudThinker turns recurring patterns from resolved findings into `,_jsx(_components.a,{href:`/guide/code-review/learnings`,children:`Learnings`}),` for future reviews`]}),_jsx(_components.td,{children:`On the Learnings page`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Repository conventions`})}),_jsxs(_components.td,{children:[`CloudThinker detects convention files, such as `,_jsx(_components.code,{children:`AGENTS.md`}),`, `,_jsx(_components.code,{children:`CLAUDE.md`}),` and `,_jsx(_components.code,{children:`.cursor/rules/`}),`, and follows them in every review. They refresh before each review. See `,_jsx(_components.a,{href:`/guide/code-review/overview#what-review-reads`,children:`the full list`})]}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Review → Settings → Repositories`}),`, the row’s actions menu (⋯) → `,_jsx(_components.strong,{children:`Learning sources`})]})]})]})]}),_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Complete`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success state:`}),` the Review `,_jsx(_components.strong,{children:`Overview`}),` page loads, and your repositories appear under `,_jsx(_components.strong,{children:`Review → Settings → Repositories`}),`. While CloudThinker clones a repository, its row shows `,_jsx(_components.strong,{children:`Cloning`}),` and its Review switch reads `,_jsx(_components.strong,{children:`Setting up`}),`. If a clone fails, the row shows `,_jsx(_components.strong,{children:`Setup failed`}),`; see `,_jsx(_components.a,{href:`/guide/code-review/troubleshooting#repository-problems`,children:`repository problems`}),`. The workspace starts on the `,_jsx(_components.strong,{children:`Fast`}),` `,_jsx(_components.a,{href:`#choose-a-review-mode`,children:`review mode`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`get-your-first-review`,children:`Get your first review`}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Open a pull or merge request`,children:[_jsx(_components.p,{children:`Push a branch to a selected repository and open a PR or MR against it. Don’t open it as a draft: drafts are skipped until you mark them ready for review.`}),_jsx(_components.p,{children:`A PR that arrives while the repository is still cloning gets a “setting up” note and is reviewed once the clone finishes.`})]}),_jsxs(Step,{title:`Read the findings on the PR`,children:[_jsx(_components.p,{children:`CloudThinker posts a progress comment first, then replaces it with a summary. Inline comments land on the exact lines, each with a severity (Critical, High, Medium or Low), an explanation and a suggested fix.`}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Success state:`}),` a summary comment appears on the PR, with a link back to the change in CloudThinker.`]}),_jsx(_components.p,{children:`Comments come from the identity you connected with:`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`How you connected`}),_jsx(_components.th,{children:`Comments appear as`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GitHub App`}),_jsx(_components.td,{children:`The CloudThinker GitHub App`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GitLab or Bitbucket access token`}),_jsx(_components.td,{children:`The token’s bot user`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`GitLab or Bitbucket OAuth`}),_jsx(_components.td,{children:`The person who connected`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Azure DevOps PAT`}),_jsx(_components.td,{children:`The person who owns the PAT`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`CodeCommit`}),_jsx(_components.td,{children:`The IAM role or user the setup script created`})]})]})]})]}),_jsxs(Step,{title:`Follow up from the PR`,children:[_jsx(_components.p,{children:`Reply in a finding’s thread to dispute it, or mention the bot in a PR comment:`}),_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`@cloudthinker-ai why is this query a problem?`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`@cloudthinker-ai review`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`@cloudthinker-ai autofix`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsxs(_components.p,{children:[`On AWS CodeCommit, only questions and `,_jsx(_components.code,{children:`@cloudthinker-ai help`}),` work. CodeCommit ignores `,_jsx(_components.code,{children:`review`}),`, `,_jsx(_components.code,{children:`autofix`}),` and replies in a finding’s thread. To review a CodeCommit PR again, push a new commit to its source branch.`]}),_jsxs(_components.p,{children:[`To skip review on one PR, put `,_jsx(_components.code,{children:`@cloudthinker:ignore`}),` anywhere in the PR description. See `,_jsx(_components.a,{href:`/guide/code-review/mention-commands`,children:`mention commands`}),` for the full list.`]})]})]}),`\n`,_jsxs(_components.p,{children:[`You can also open every reviewed change, with its findings and status, under `,_jsx(_components.strong,{children:`Review → Reviews`}),`. See `,_jsx(_components.a,{href:`/guide/code-review/review-workspace`,children:`review workspace`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-a-review-mode`,children:`Choose a review mode`}),`\n`,_jsxs(_components.p,{children:[`The review mode applies to every repository in the workspace. Change it under `,_jsx(_components.strong,{children:`Review → Settings → General → Review mode`}),`. New workspaces start on `,_jsx(_components.strong,{children:`Fast`}),`.`]}),`\n`,_jsx(Frame,{caption:`Review Settings: connected provider, review mode, and Add repository`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=df40798c54926e132f949ee7d443c5f1`,alt:`Review Settings page showing the connected Git provider, the Review mode setting and the Add repository button`,\"data-og-width\":`2176`,width:`2176`,\"data-og-height\":`1107`,height:`1107`,\"data-path\":`images/v2/review-settings.webp`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=280\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=ca9123d519052aa176e51e21cc7674ca 280w, https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=560\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=b7a5b61ece800e08646b4a5311780d02 560w, https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=840\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=08618c70a98a833b999dd611a70534da 840w, https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=1100\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=499e240e99cee2f81a5e69f37bb71402 1100w, https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=1650\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=cc1e5b1e76e09d2822760f1bd6d56c15 1650w, https://mintcdn.com/cloudthinker/FdoxT8pgJbNUKT1v/images/v2/review-settings.webp?w=2500\u0026fit=max\u0026auto=format\u0026n=FdoxT8pgJbNUKT1v\u0026q=85\u0026s=5007db61d8cf4e04a1273abc69773203 2500w`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Mode`}),_jsx(_components.th,{children:`What it does`}),_jsx(_components.th,{children:`Use it when`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Fast`})}),_jsx(_components.td,{children:`One reviewer reads the change. Quick analysis, lower cost`}),_jsx(_components.td,{children:`Most repositories, small PRs, fast feedback`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Auto`})}),_jsx(_components.td,{children:`Picks Fast for small changes and Advanced for complex ones. Shown when it’s available in your workspace; to get it, contact CloudThinker support`}),_jsx(_components.td,{children:`Repositories with a mix of small and large changes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Advanced`})}),_jsx(_components.td,{children:`Splits the change across parallel reviewers for the deepest analysis, at the highest cost`}),_jsx(_components.td,{children:`Critical services where a missed defect is expensive`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`other-workspace-settings`,children:`Other workspace settings`}),`\n`,_jsxs(_components.p,{children:[`These sit in the same `,_jsx(_components.strong,{children:`General`}),` section of `,_jsx(_components.strong,{children:`Review → Settings`}),` and are `,_jsx(_components.strong,{children:`off`}),` until you turn them on.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Pipeline analysis`})}),_jsxs(_components.td,{children:[`Explains each failed pipeline run and suggests a fix. Each analysis is an agent run and uses credits. See `,_jsx(_components.a,{href:`/guide/code-review/pipelines`,children:`pipelines`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Auto-resolve conflicts`})}),_jsxs(_components.td,{children:[`Opens a follow-up MR/PR that resolves merge conflicts. Each resolution is an agent run and uses credits. See `,_jsx(_components.a,{href:`/guide/code-review/conflict-resolution`,children:`auto-resolve conflicts`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Analyze new release tags`})}),_jsxs(_components.td,{children:[`Starts a release risk report when a tag is pushed. Each report uses credits like a review; see `,_jsx(_components.a,{href:`/guide/billing/usage`,children:`usage and credits`}),` and `,_jsx(_components.a,{href:`/guide/code-review/releases`,children:`releases`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`For repository switches, Atlas branches and bulk changes, see `,_jsx(_components.a,{href:`/guide/code-review/repository-management`,children:`Manage Review Repositories`}),`. To change summary sections, tone or language, see `,_jsx(_components.a,{href:`/guide/code-review/customizations`,children:`Review Personalization`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`filter-which-prs-get-reviewed`,children:`Filter which PRs get reviewed`}),`\n`,_jsx(_components.p,{children:`Each repository can have filters, so CloudThinker skips PRs you don’t want reviewed, such as bot dependency bumps.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the repository's filters`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Review → Settings → Repositories`}),`, open the repository’s actions menu (⋯), and click `,_jsx(_components.strong,{children:`Configure filters`}),`.`]})}),_jsx(Step,{title:`Add rules`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Add Filter Rule`}),`, pick the filter type, `,_jsx(_components.strong,{children:`Include`}),` or `,_jsx(_components.strong,{children:`Exclude`}),`, and the values. Then click `,_jsx(_components.strong,{children:`Save Filters`}),`.`]})})]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Filter`}),_jsx(_components.th,{children:`Matches`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Authors`})}),_jsxs(_components.td,{children:[`The PR author’s username, exact match, not case-sensitive. No wildcards. For example `,_jsx(_components.code,{children:`dependabot[bot]`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Branches`})}),_jsxs(_components.td,{children:[`The target branch (the one being merged into). Glob patterns work, for example `,_jsx(_components.code,{children:`release/*`}),`. Case-sensitive`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Labels`})}),_jsxs(_components.td,{children:[`PR or MR labels, exact match, not case-sensitive. For example `,_jsx(_components.code,{children:`needs-review`})]})]})]})]}),`\n`,_jsx(_components.p,{children:`How rules combine:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Exclude rules are checked first. A PR that matches any exclude rule is skipped.`}),`\n`,_jsx(_components.li,{children:`Every include rule must then pass. Within one rule, matching any of its values is enough.`}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Put several branches in `,_jsx(_components.strong,{children:`one`}),` Branches rule. Two separate `,_jsx(_components.strong,{children:`Branches`}),` include rules must both match the same target branch, so almost every PR is skipped.`]})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Rules`}),_jsx(_components.th,{children:`Reviewed`}),_jsx(_components.th,{children:`Skipped`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Include`}),` Branches `,_jsx(_components.code,{children:`main`}),`, `,_jsx(_components.code,{children:`release/*`}),` (one rule)`]}),_jsxs(_components.td,{children:[`PRs into `,_jsx(_components.code,{children:`main`}),` or any `,_jsx(_components.code,{children:`release/`}),` branch`]}),_jsx(_components.td,{children:`PRs into any other branch`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Include`}),` Branches `,_jsx(_components.code,{children:`main`}),` plus `,_jsx(_components.strong,{children:`Include`}),` Branches `,_jsx(_components.code,{children:`release/*`}),` (two rules)`]}),_jsx(_components.td,{children:`Nothing`}),_jsxs(_components.td,{children:[`Every PR: no target branch is both `,_jsx(_components.code,{children:`main`}),` and a `,_jsx(_components.code,{children:`release/`}),` branch`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.strong,{children:`Include`}),` Branches `,_jsx(_components.code,{children:`main`}),` plus `,_jsx(_components.strong,{children:`Include`}),` Labels `,_jsx(_components.code,{children:`needs-review`})]}),_jsxs(_components.td,{children:[`PRs into `,_jsx(_components.code,{children:`main`}),` that carry `,_jsx(_components.code,{children:`needs-review`})]}),_jsxs(_components.td,{children:[`PRs into `,_jsx(_components.code,{children:`main`}),` without the label, and every PR into another branch`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[`Filters are checked on every new event, so they also apply to MR/PRs CloudThinker already tracks, from their next push. To review one filtered MR/PR anyway, comment `,_jsx(_components.code,{children:`@cloudthinker-ai review`}),` on it. CodeCommit has no `,_jsx(_components.code,{children:`review`}),` command, so a filtered CodeCommit PR stays unreviewed until you change the filters and push a new commit.`]}),`\n`,_jsxs(_components.p,{children:[`For example, `,_jsx(_components.strong,{children:`Exclude`}),` Authors `,_jsx(_components.code,{children:`dependabot[bot]`}),` plus `,_jsx(_components.strong,{children:`Include`}),` Branches `,_jsx(_components.code,{children:`main`}),` reviews every PR into `,_jsx(_components.code,{children:`main`}),` except Dependabot’s. A skipped PR is tracked but not reviewed: it shows on `,_jsx(_components.strong,{children:`Review → Reviews`}),` in the `,_jsx(_components.strong,{children:`All`}),` tab with the `,_jsx(_components.strong,{children:`Ignored`}),` verdict. See `,_jsx(_components.a,{href:`/guide/code-review/review-workspace#triage-the-reviews-list`,children:`verdicts`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`No comment appears on a new PR`,id:`no-comment-appears-on-a-new-pr`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cause:`}),` the PR is a draft, the repository isn’t selected or is still cloning, a filter excluded it, or the webhook is missing.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Check:`}),` open `,_jsx(_components.strong,{children:`Review → Settings → Repositories`}),` and confirm the repository is `,_jsx(_components.strong,{children:`On`}),`. Then check your provider:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`GitHub:`}),` in your organization or account settings, open `,_jsx(_components.strong,{children:`GitHub Apps`}),`, click `,_jsx(_components.strong,{children:`Configure`}),` next to the CloudThinker app, and confirm the repository has access.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Bitbucket:`}),` in `,_jsx(_components.strong,{children:`Repository settings → Webhooks`}),`, confirm the CloudThinker webhook exists and its recent requests succeeded.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`GitLab:`}),` in `,_jsx(_components.strong,{children:`Settings → Webhooks`}),`, edit the CloudThinker webhook and check `,_jsx(_components.strong,{children:`Recent events`}),` for failed requests.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Azure DevOps:`}),` in `,_jsx(_components.strong,{children:`Project Settings → Service hooks`}),`, open each CloudThinker subscription and check its `,_jsx(_components.strong,{children:`History`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`CodeCommit:`}),` there’s no webhook log. In Amazon EventBridge, in the repository’s region, confirm the `,_jsx(_components.code,{children:`CloudThinker-CodeCommit-*`}),` rules exist. If they don’t, re-run the `,_jsx(_components.strong,{children:`Events`}),` script.`]}),`\n`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fix:`}),` mark the PR ready for review, enable the repository, or `,_jsx(_components.a,{href:`/guide/code-review/provider-auth#configure-webhooks`,children:`re-add the webhook`}),`. Then comment `,_jsx(_components.code,{children:`@cloudthinker-ai review`}),` on the PR to start a review without pushing. On CodeCommit, push a new commit to the PR’s source branch instead.`]})]}),_jsxs(Accordion,{title:`Review shows Reconnect your Git provider`,id:`review-shows-reconnect-your-git-provider`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cause:`}),` the token expired or was revoked, or the OAuth grant was removed.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fix:`}),` the Review page shows an `,_jsx(_components.strong,{children:`Authentication Error`}),` alert. If you connected with OAuth, click `,_jsx(_components.strong,{children:`Reconnect with GitLab`}),` (or `,_jsx(_components.strong,{children:`Bitbucket`}),`) and approve access again. If you used a token, click `,_jsx(_components.strong,{children:`Update Token`}),` (on CodeCommit, `,_jsx(_components.strong,{children:`Update Credentials`}),`), paste the new one and validate it. Your repositories and settings are kept.`]}),_jsxs(_components.p,{children:[`A PR opened while the connection was broken may have no review. Comment `,_jsx(_components.code,{children:`@cloudthinker-ai review`}),` on it to start one, or on CodeCommit, push a new commit to its source branch.`]}),_jsxs(_components.p,{children:[`To replace a token before it expires, open `,_jsx(_components.strong,{children:`Review → Settings`}),`, and in the `,_jsx(_components.strong,{children:`Connection`}),` section open the actions menu (⋯) and click `,_jsx(_components.strong,{children:`Update token`}),`.`]})]}),_jsxs(Accordion,{title:`A review stopped before posting its summary`,id:`a-review-stopped-before-posting-its-summary`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Check:`}),` the progress comment on the PR now reads `,_jsx(_components.strong,{children:`CloudThinker Review Did Not Finish`}),`, and may say why, for example that CloudThinker couldn’t open the repository. In CloudThinker, open the review and use `,_jsx(_components.strong,{children:`More actions (⋯) → View review conversation`}),` to see the run.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fix:`}),` if the repository couldn’t be opened, reconnect it in `,_jsx(_components.strong,{children:`Review → Settings`}),`. Then comment `,_jsx(_components.code,{children:`@cloudthinker-ai review`}),` on the PR to continue from the last reviewed commit. On CodeCommit, push a new commit to the PR’s source branch instead.`]})]}),_jsxs(Accordion,{title:`The PR says Code Review Stopped (Quota Exceeded)`,id:`the-pr-says-code-review-stopped-quota-exceeded`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cause:`}),` your workspace ran out of its usage quota, so the review couldn’t finish.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Check:`}),` `,_jsx(_components.strong,{children:`Admin Settings → Usage`}),` shows the credits your organization has left (the Owner and Admins can open it). A workspace can also hit its own `,_jsx(_components.a,{href:`/guide/billing/credit-limits`,children:`credit limit`}),`.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fix:`}),` upgrade your plan or wait for the quota to renew (see `,_jsx(_components.a,{href:`/guide/billing/usage`,children:`usage and credits`}),` for when each credit type resets), then comment `,_jsx(_components.code,{children:`@cloudthinker-ai review`}),` on the PR. On CodeCommit, push a new commit to the PR’s source branch instead.`]})]}),_jsxs(Accordion,{title:`A repository shows Setup failed or stays on Cloning`,id:`a-repository-shows-setup-failed-or-stays-on-cloning`,children:[_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Check:`}),` in `,_jsx(_components.strong,{children:`Review → Settings → Repositories`}),`, hover `,_jsx(_components.strong,{children:`Setup failed`}),` to see the clone error. It’s often an expired token or missing access to that repository.`]}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Fix:`}),` fix the access, then click `,_jsx(_components.strong,{children:`Retry`}),` on the row. If a clone stays on `,_jsx(_components.strong,{children:`Cloning`}),`, click `,_jsx(_components.strong,{children:`Cancel`}),` and confirm `,_jsx(_components.strong,{children:`Cancel clone`}),`. The row shows `,_jsx(_components.strong,{children:`Setup cancelled`}),`; click `,_jsx(_components.strong,{children:`Retry`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Walkthrough:`}),` watch Review stop a change that would break production in `,_jsx(_components.a,{href:`/guide/use-cases/review-risky-pull-request`,children:`Catch a risky pull request with Review`}),`.`]}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Provider authentication`,icon:`key`,href:`/guide/code-review/provider-auth`,children:_jsx(_components.p,{children:`Token scopes and webhook steps for each Git provider.`})}),_jsx(Card,{title:`Mention commands`,icon:`at`,href:`/guide/code-review/mention-commands`,children:_jsx(_components.p,{children:`Ask questions, re-review and fix findings from a PR comment.`})}),_jsx(Card,{title:`Review workspace`,icon:`table-list`,href:`/guide/code-review/review-workspace`,children:_jsx(_components.p,{children:`Track every reviewed change and its findings in CloudThinker.`})}),_jsx(Card,{title:`Learnings`,icon:`scroll`,href:`/guide/code-review/learnings`,children:_jsx(_components.p,{children:`Teach reviews the patterns your team keeps fixing.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Review Setup","description":"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.","icon":"gear","href":"/guide/code-review/setup"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Connect a provider and repositories","slug":"connect-a-provider-and-repositories","depth":2,"children":[]},{"title":"Get your first review","slug":"get-your-first-review","depth":2,"children":[]},{"title":"Choose a review mode","slug":"choose-a-review-mode","depth":2,"children":[]},{"title":"Other workspace settings","slug":"other-workspace-settings","depth":2,"children":[]},{"title":"Filter which PRs get reviewed","slug":"filter-which-prs-get-reviewed","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"cloudthinker","siteName":"CloudThinker","title":"Review Setup - CloudThinker","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"en":{"href":"/guide/code-review/setup","matchLevel":0},"vi":{"href":"/vi/guide/code-review/setup","matchLevel":1},"ja":{"href":"/ja/guide/code-review/setup","matchLevel":1},"ko":{"href":"/ko/guide/code-review/setup","matchLevel":1}}},"lastModified":"2026-11-02T17:31:23.363Z","originalFileLocation":"guide/code-review/setup.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\">\u003cmeta data-mint-head name=\"application-name\" content=\"CloudThinker\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Review Setup - CloudThinker\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"CloudThinker\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.cloudthinker.io/guide/code-review/setup\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://cloudthinker.mintlify.site/_mintlify/api/og/v2?division=Get+started\u0026amp;title=Review+Setup\u0026amp;description=Connect+your+Git+provider%2C+choose+repositories+and+get+your+first+AI+review+on+a+pull+or+merge+request+in+about+ten+minutes.\u0026amp;theme=230c6a413834b6d1621e25c6\u0026amp;signature=a93792797bd0cc259e5df6cebb68c8899f1d606d3172cf1e7a34d91bd104735b\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Review Setup - CloudThinker\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://cloudthinker.mintlify.site/_mintlify/api/og/v2?division=Get+started\u0026amp;title=Review+Setup\u0026amp;description=Connect+your+Git+provider%2C+choose+repositories+and+get+your+first+AI+review+on+a+pull+or+merge+request+in+about+ten+minutes.\u0026amp;theme=230c6a413834b6d1621e25c6\u0026amp;signature=a93792797bd0cc259e5df6cebb68c8899f1d606d3172cf1e7a34d91bd104735b\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/cloudthinker/2UjfrgdSjUW0wAzv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"CloudThinker\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0c93c0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.cloudthinker.io/guide/code-review/setup\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guide/code-review/setup.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.cloudthinker.io/guide/code-review/setup\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"vi\" href=\"https://docs.cloudthinker.io/vi/guide/code-review/setup\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ja\" href=\"https://docs.cloudthinker.io/ja/guide/code-review/setup\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"ko\" href=\"https://docs.cloudthinker.io/ko/guide/code-review/setup\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.cloudthinker.io/guide/code-review/setup\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.cloudthinker.io/#organization\",\"name\":\"CloudThinker\",\"url\":\"https://docs.cloudthinker.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/cloudthinker/-4m9DUjwzDxHfABz/logo/light.svg?fit=max\u0026auto=format\u0026n=-4m9DUjwzDxHfABz\u0026q=85\u0026s=a56a571509d1cd246f5b0e68db015e5f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.cloudthinker.io#website\",\"name\":\"CloudThinker\",\"url\":\"https://docs.cloudthinker.io\",\"publisher\":{\"@id\":\"https://docs.cloudthinker.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.cloudthinker.io/guide/code-review/setup#webpage\",\"url\":\"https://docs.cloudthinker.io/guide/code-review/setup\",\"name\":\"Review Setup\",\"description\":\"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\",\"dateModified\":\"2026-11-02T17:31:23.363Z\",\"isPartOf\":{\"@id\":\"https://docs.cloudthinker.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.cloudthinker.io/guide/code-review/setup#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.cloudthinker.io/guide/code-review/setup#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Get started\",\"item\":\"https://docs.cloudthinker.io/guide/code-review/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Review Setup\",\"item\":\"https://docs.cloudthinker.io/guide/code-review/setup\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.cloudthinker.io/guide/code-review/setup#article\",\"headline\":\"Review Setup\",\"name\":\"Review Setup\",\"description\":\"Connect your Git provider, choose repositories and get your first AI review on a pull or merge request in about ten minutes.\",\"url\":\"https://docs.cloudthinker.io/guide/code-review/setup\",\"mainEntityOfPage\":{\"@id\":\"https://docs.cloudthinker.io/guide/code-review/setup#webpage\"},\"dateModified\":\"2026-11-02T17:31:23.363Z\",\"publisher\":{\"@id\":\"https://docs.cloudthinker.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.cloudthinker.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"CloudThinker\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"CloudThinker\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/guide/code-review/setup.md","siteName":"CloudThinker","nav":{"global":null,"languages":[{"language":"en","tabs":[{"tab":"Get started","pages":[{"title":"Get started","href":""}]},{"tab":"Products","anchors":[{"anchor":"Resolve","icon":"triangle-exclamation","pages":[{"title":"Resolve","href":"/guide/incident/overview"}]},{"anchor":"Review","icon":"code-pull-request","groups":[{"group":"Get started","pages":[{"title":"Review","icon":"code-pull-request","href":"/guide/code-review/overview"},{"title":"Review Dashboard","description":"Triage repository attention, read fix rates and unresolved findings, and open the changes that need your next action.","icon":"table-columns","href":"/guide/code-review/dashboard"},{"title":"Review Setup","icon":"gear","href":"/guide/code-review/setup"}]},{"group":"Set up","pages":[{"title":"Provider Authentication","description":"Authenticate GitHub, GitLab, Bitbucket, Azure DevOps or AWS CodeCommit for Review, with the exact token scopes and webhooks each one needs.","icon":"key","href":"/guide/code-review/provider-auth"},{"title":"Manage Review Repositories","sidebarTitle":"Repository Management","icon":"folders","href":"/guide/code-review/repository-management"},{"title":"Review Personalization","icon":"palette","href":"/guide/code-review/customizations"},{"title":"Review Workspace","icon":"list-check","href":"/guide/code-review/review-workspace"},{"title":"Learnings","icon":"scroll","href":"/guide/code-review/learnings"},{"title":"Review Extensions","icon":"puzzle-piece","href":"/guide/code-review/extensions"}]},{"group":"Use Review","pages":[{"title":"Codebase Atlas","icon":"map","href":"/guide/code-review/codebase-atlas"},{"title":"Business Flow Checks","icon":"briefcase","href":"/guide/code-review/business-flow"},{"title":"Ultra Review","icon":"bolt","tag":"Beta","href":"/guide/code-review/ultra-review"},{"title":"UI Review: Loupe","icon":"magnifying-glass","href":"/guide/code-review/loupe"},{"title":"Mention Commands","icon":"at","href":"/guide/code-review/mention-commands"},{"title":"Auto-Resolve Conflicts","icon":"code-merge","href":"/guide/code-review/conflict-resolution"},{"title":"Pipeline Analysis","icon":"timeline","href":"/guide/code-review/pipelines"},{"title":"Release Risk","icon":"rocket","href":"/guide/code-review/releases"}]},{"group":"Insights and help","pages":[{"title":"Review Insights","icon":"chart-mixed","href":"/guide/code-review/analytics"},{"title":"Review Troubleshooting","icon":"life-ring","href":"/guide/code-review/troubleshooting"}]}]},{"anchor":"Cyber (Beta)","icon":"shield-halved","pages":[{"title":"Cyber (Beta)","href":"/guide/security/cyber-overview"}]},{"anchor":"Optimize","icon":"chart-line","pages":[{"title":"Optimize","href":"/guide/cost-optimization/overview"}]},{"anchor":"Automation","icon":"clock","pages":[{"title":"Automation","href":"/guide/automation/quickstart"}]}]},{"tab":"Platform","pages":[{"title":"Platform","href":"/guide/connections/overview"}]},{"tab":"Enterprise","pages":[{"title":"Enterprise","href":"/guide/security/overview"}]},{"tab":"Developers","pages":[{"title":"Developers","href":"/guide/api/overview"}]},{"tab":"Resources","pages":[{"title":"Resources","href":"/learn/aio/introduction"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog"}]},{"tab":"Pricing","href":"https://cloudthinker.io/pricing"}]},{"language":"vi","pages":[{"title":"vi","href":"/vi/guide/code-review/setup"}]},{"language":"ja","pages":[{"title":"ja","href":"/ja/guide/code-review/setup"}]},{"language":"ko","pages":[{"title":"ko","href":"/ko/guide/code-review/setup"}]}]},"basePath":"","title":"Review Setup - CloudThinker","buildId":"dpl_715YoAgvjTGBDdo8RtXmHKM22b5p","deploymentId":"dpl_715YoAgvjTGBDdo8RtXmHKM22b5p","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-vIkpUzVS.js","DynamicMarkdown-TAXIW2vN.js","zoom-image-lightbox-y00V8U6G.js","lightbox-handle-r17bVUz3.js"]}