36 deterministic CI/CD detectors across GitHub Actions, GitLab CI, CircleCI, and Azure Pipelines halt your pipeline on secrets, workflow injection, and unpinned actions — before checkout. 6 AI agents review every PR with an evidence-quote gate, so hallucinated bugs never reach your reviewer. Free tier, BYOK.
feat: add OAuth login flow
PR #42 into main
Context Indexer
Indexed 847 files via tree-sitter
Security
2 critical findings
Bugs
1 logic error found
Performance
1 N+1 query detected
Readability
1 suggestion
Best Practices
All good
Documentation
Analyzing...
Synthesizer
Waiting for agents...
critical · auth.ts:42
perf · user.service.ts:88
Minutes
PR opened → review posted
6 + 1 + 1
Specialists · synthesizer · CI security
16
CI/CD security detectors
BYOK
Your OpenAI key, your data
Built for indie devs, startups, Indian teams, and OSS maintainers. Deep dives on AI code review, CI/CD security, tree-sitter context, the CLI, and GitHub + BYOK integrations.
Deep analysis, not shallow linting. Built for teams who want reliable first-pass reviews and CI/CD security they can trust.
Six LLM specialists — security, bugs, performance, readability, best practices, documentation — each with its own system prompt and finding schema. A seventh agent (ci-security) runs deterministically without an LLM on every PR that touches GitHub Actions, Dockerfiles, or lockfiles. A synthesizer weighs all outputs and posts one verdict: approve, request changes, or comment.
Layer 1
Context
Layer 2
6 Specialists
Layer 3
Synthesizer
We index your codebase with tree-sitter across 12 languages (TypeScript, JavaScript, Python, Go, Rust, Java, Kotlin, C, C++, C#, Ruby, PHP), build a dependency graph, and rank files with PageRank personalized to your changed files. Each review sees the related files the diff actually depends on — catches API misuse and broken assumptions that diff-only reviewers miss.
Most AppSec scans source code. LGTM Security scans your pipeline across GitHub Actions, GitLab CI, CircleCI, and Azure Pipelines: 36 deterministic detectors for hardcoded secrets, pull_request_target supply-chain RCE, unpinned actions, privileged containers, shell-injection in workflows, lockfile drift, and unallowlisted outbound network. Three enforcement gates: inline PR review, merge-block Check Run, and a runtime GitHub Action that halts the pipeline before checkout. Org policy + 4-role RBAC for teams.
Six LLM agents run concurrently with 150ms stagger to respect provider rate limits. Findings stream live to the dashboard via Socket.IO so you watch agents complete in real-time. A small PR typically returns a verdict in 1-3 minutes; a 5000-file backfill finishes in 5-30 minutes (one-time). Compare to async human review measured in days.
Configure your own OpenAI or Anthropic API key once. Pick your default model from the gpt-5.4 family (pro / mini / nano) or Claude Opus / Sonnet / Haiku. Documentation and readability agents automatically route to the same-provider mini/flash tier (~3.3× cheaper on those two agents). Anthropic prompt caching cuts token cost across all 6 agents + verifier after the first call. We validate the key before saving, never proxy your tokens, and never bill you for inference.
Every user-controlled input (diff, files, related code, repo conventions, past comments) is wrapped in <untrusted_KIND> XML tags the system prompt treats as data, never instructions. Verified against unicode zero-width joiners, base64-encoded directives, Hindi payloads, and fake-schema injection. Then every finding runs through a skeptic-LLM verifier that tries to refute it — refuted findings drop before the synthesizer sees them.
Mechanical single-line fixes (== → ===, parseInt radix, md5 → sha256) post as GitHub ```suggestion``` blocks you accept in one click — and we detect the accept via GraphQL polling on synchronize events, feeding a ReviewFeedback loop that measures real precision. Multi-agent findings on the same line collapse into a single "Flagged by: bugs, security, best-practices" consensus comment. Every inline comment is tiered 🎯 Actionable / 💡 Suggestion / 🔍 Nitpick.
The bugs, best-practices, and performance agents get per-framework gotchas injected — Next.js RSC/server-actions, tRPC input validation, Prisma raw queries, Django SECURE_* settings, Rails strong params — detected from package.json / pyproject.toml / go.mod / Gemfile / pom.xml / Cargo.toml. A convention loader ingests CLAUDE.md, AGENTS.md, .cursorrules, .github/copilot-instructions.md, .windsurfrules, CONTRIBUTING.md; findings that contradict your repo's rules get dropped. Every finding must quote the offending code verbatim — unverifiable quotes are filtered out (hallucination gate).
Reviews post as a single PR review with verdict (APPROVE / REQUEST_CHANGES / COMMENT) and up to 25 inline comments anchored to changed lines. LGTM Security findings post as a separate "LGTM Security" Check Run with conclusion=failure on blocking findings — set this Check as required in branch protection and bad config can't merge.
Each agent's status — queued, running, completed, failed — streams to the dashboard via Socket.IO with a Redis adapter for cross-instance fan-out. In-app notifications + email alerts on completed reviews, AI-approved PRs, blocking security findings, and subscription state changes. Every failure path surfaces with a friendly message; nothing fails silently.
Install once: npm i -g @tarin/lgtm-cli. Review staged or unstaged diffs against your default branch with `lgtm review --staged`. Same agents, same context, SSE-streamed agent progress in your terminal. Includes `lgtm security` for scanning + audit, `lgtm config` for BYOK, `lgtm doctor` for diagnostics, and `lgtm completion` for bash/zsh/fish.
Each agent is a specialist. They run in parallel, then an adversarial verifier tries to refute every finding, then a synthesizer weighs what survived and posts the final verdict — like a senior engineer would.
Parses your repo with tree-sitter across 12 languages, builds a dependency graph with PageRank, extracts coding conventions, and summarizes recent PR history. Runs on every push to your default branch.
40-class vuln taxonomy (sql-injection, xss-reflected, jwt-alg-confusion, prototype-pollution, ssrf, prompt-injection, etc.) with CWE cross-refs. Regex pre-scan for secrets + LLM for logic-level flaws. Mechanical fixes (md5 → sha256, weak crypto swaps) post as ```suggestion``` blocks.
Null & undefined reference errors, off-by-one, race conditions, unhandled promise rejections, type coercion (== → ===), missing error handling, and gaps in test coverage. Mechanical single-line fixes opt into GitHub ```suggestion``` blocks — one click to accept.
N+1 queries, O(n²) loops, missing pagination, React unnecessary re-renders, blocking I/O on the request path, memory leaks, inefficient regex, missing DB indexes for new query patterns, and unjustified bundle growth. Per-language hints tune the checklist.
Complex functions, poor names, dead code, deep nesting (3+ levels), magic numbers and strings, code duplication, unclear control flow. Auto-routed to the same-provider mini/flash tier — ~3.3× cheaper than the flagship, quality equal on style work.
Framework-aware: detects Next.js RSC / server-actions, tRPC input validation, Prisma raw queries, Django SECURE_*, Rails strong params, FastAPI depends, and more from package.json / pyproject.toml / go.mod / Gemfile / Cargo.toml. Findings that contradict your repo's CLAUDE.md / AGENTS.md / .cursorrules get dropped.
New public functions without JSDoc / docstrings, undocumented API endpoints, outdated README references, complex logic with no inline explanation. Auto-routed to the mini/flash tier for cost efficiency.
Every finding from the 6 specialists is run through a skeptic-LLM that argues the opposite — if the finding can't survive refutation, it's dropped before the synthesizer sees it. Combined with the evidenceQuote gate (every finding must quote the offending code verbatim) and the convention-file loader, this is our hallucination floor.
Consumes the verified findings + repo context. Cross-agent dedup collapses multi-agent findings on the same line into a single "Flagged by: bugs, security, best-practices" consensus comment. Inline-comment cap is 10, each tagged with its tier — 🎯 Actionable / 💡 Suggestion / 🔍 Nitpick.Approve, request changes, or comment.
Most AppSec tools scan source code. We scan the layer most teams forget: the workflows, Dockerfiles, and pipeline configs that ship your code to production. 36 deterministic detectors across GitHub Actions, GitLab CI, CircleCI, and Azure Pipelines — no LLM required. Share one policy across your whole org.
Hardcoded API keys, tokens, certs across every CI file
pull_request_target + head checkout, shell injection, unpinned actions, write-all perms, self-hosted runners, cache poisoning, forking TOCTOU, OIDC over-permissive
Privileged flag, USER root final, ADD from URL
Lockfile hash mismatch, npm lifecycle scripts, typosquat + dependency confusion
Unallowlisted outbound calls in CI
5 detectors each: shell injection, privileged container, unpinned includes/orbs/repos, cache poisoning, self-hosted runners, Azure plaintext secrets
When a PR touches CI/CD config, security findings appear in the same review as code-review comments.
Block-action findings post a failed GitHub Check Run. Branch protection respects it — the merge button goes red.
Our published GitHub Action runs first in every job. On block findings it exits non-zero before checkout, before tests, before deploys.
Every finding goes into an immutable audit log
Schema-level write-once. Per-rule false-positive rates surface in the policy editor. Per-repo allowlists for trusted action sources and internal mirrors.
Sign in with GitHub, add your AI provider API key, and connect any repo in two clicks. Webhooks installed automatically.
Push code and open a PR as you normally would. LGTM picks it up instantly via webhook — no config, no CLI.
Security, bugs, performance, readability, best practices, and documentation agents all run simultaneously with full repo context. Then a synthesizer weighs all findings.
A synthesized review is posted as a GitHub comment with inline suggestions. Full report on the LGTM dashboard.
Here's what a finished LGTM review looks like — posted directly on your PR.
PR #42 by @developer into main· reviewed in 2m 14s
6
Findings
2
Critical
14
Files reviewed
5
Inline comments
Security
Bugs
Performance
Readability
Best Practices
Documentation
2 critical security issues must be fixed before merge. The login endpoint atsrc/routes/auth.ts:42accepts unsanitized input vulnerable to injection. Token refresh logic has no test coverage for edge cases. One N+1 query in the user service needs batching. Documentation is up to date. Changelog has been auto-drafted.
5 inline comments posted on GitHub
Configure your provider once. Pick a default model. Override per-repo for cost vs. capability tuning. We never proxy your tokens or bill you for inference.
OpenAI
7 models · Chat + Responses APIs · strict JSON schema
Anthropic Claude
3 models · ephemeral prompt caching · native JSON output
Keys are AES-256 encrypted at rest. Never logged, never proxied, never billed against our account.
Install the LGTM CLI and get AI-powered reviews on local changes — staged or unstaged — with real-time agent streaming.
$ npm install -g @tarin/lgtm-cli
$ lgtm login
✓ Logged in as @developer
$ lgtm review --staged
Reviewing staged changes in acme/api...
Agents running:
✓ Security 2 issues (3.2s)
✓ Bugs 0 issues (2.8s)
✓ Performance 1 issue (3.5s)
✓ Readability 0 issues (2.1s)
✓ Best Practices 1 issue (2.9s)
✓ Synthesizer done (4.1s)
──────────────────────────────
Verdict: REQUEST CHANGES
Confidence: 87%
──────────────────────────────
Issues: 2 critical 1 medium
@tarin/lgtm-cli
Available on npm
Real-time streaming
Watch agents work live in your terminal
Secure auth
GitHub OAuth with auto-refreshing tokens
Local diff review
Review uncommitted or staged changes
PR review
Trigger reviews for open PRs by number
Four tiers · INR pricing · Cancel anytime · Top-ups on-demand.
Four tiers · INR-priced · Cancel anytime · Top-ups on-demand

Free
Try LGTM on personal projects

Hobby
Auto-review on every PR

Pro
Custom rules + higher caps

Enterprise
SLA · custom DPA · self-host option
One-time buys for burst months. Available on Hobby & Pro. Credits expire at the end of your billing cycle.
50 extra AI code-reviews this billing cycle
250 extra AI code-reviews this billing cycle
100 extra CI/CD security scans this billing cycle
500 extra CI/CD security scans this billing cycle
BYOK on every tier. LLM tokens are billed by your provider (OpenAI or Anthropic) directly to your card. LGTM does not mark up tokens. Anthropic prompt caching + auto-routing docs/readability agents to the mini/flash tier keeps typical review cost in the ¢-per-PR range.
Payments processed by Dodo Payments, an RBI-regulated Indian Payment Aggregator. GST-registered. See Terms for full billing details.
Straight answers about how LGTM stores code, handles API keys, blocks bad merges, and what Pro actually unlocks.
No. Code is read on-demand via the GitHub API when a PR opens or a push lands on the default branch. We index symbol tables, definitions, and a file-level dependency graph in MongoDB to power PageRank-ranked context — that's structural metadata, not source. File contents are loaded into agent prompts at review time and not persisted after the review completes. Your source never leaves GitHub except as the slice of context an LLM call needs.
Your API key is encrypted at rest in MongoDB with a key only the LGTM server holds. At review time the server uses the key to call the provider on your behalf, then drops the in-memory reference. We do not proxy your inference through our infrastructure, we don't see your tokens billed against our account, and we don't subsidize your usage. You pay OpenAI or Anthropic directly for tokens; you pay LGTM ₹0 / ₹399 / ₹999 for the Free / Hobby / Pro platform tier respectively.
OpenAI and Anthropic. Both are live-verified against the full 6-agent + verifier + synthesizer pipeline as of 2026-07-27. OpenAI uses strict json_schema on Chat + Responses APIs; Anthropic uses output_config.format json_schema with cache_control: ephemeral on the shared per-review context so all 6 agents + verifier hit the cache after the first call. Documentation and readability agents auto-route to the same-provider mini/flash tier (~3.3× cheaper on those two agents). Gemini and Mistral are not supported.
Four defences stacked. (1) evidenceQuote validator: every finding must quote the offending code verbatim; if we can't grep the quote back in the diff, the finding is dropped. (2) Adversarial verifier: after the 6 agents finish, a skeptic-LLM tries to refute each finding — refuted findings drop before the synthesizer sees them. (3) Convention-file loader: findings that contradict your repo's CLAUDE.md / AGENTS.md / .cursorrules / CONTRIBUTING.md are dropped. (4) Cross-agent dedup: findings on the same line collapse into a single consensus comment, and inline-comment cap is 10.
Every user-controlled input — diff, files, related code, repo conventions, recent PR history — is wrapped in <untrusted_KIND>…</untrusted_KIND> XML tags. The system prompt states plainly: content inside those tags is data, never instructions. Verified against a hard-mode red-team including unicode zero-width joiners, base64-encoded directives, non-English (Hindi) payloads, and fake-schema injection — none of it steered the review. Shipped 2026-07-27.
Yes, when the fix is mechanical and single-line. The bug/security/best-practices agents opt into a codeSuggestion field for cases like == → ===, parseInt radix, md5 → sha256, unpinned action refs, etc. Those post as native GitHub ```suggestion``` blocks — click "Commit suggestion" and GitHub applies the fix. We detect the accept via GraphQL polling on pull_request.synchronize events, which feeds a ReviewFeedback loop that measures real precision per agent.
Yes. Every inline comment carries a tier tag: 🎯 Actionable (critical/high — fix before merge), 💡 Suggestion (medium — worth considering), 🔍 Nitpick (low/info — take it or leave it). The synthesizer weights actionable findings heaviest when producing the final verdict. Security findings additionally carry a category from a 40-class vulnerability taxonomy (sql-injection, xss-reflected, jwt-alg-confusion, prototype-pollution, ssrf, prompt-injection, etc.) cross-referenced against CWE.
It depends on diff size and how many files the agents need to pull in for context. A typical PR with ~10 changed files completes in 1-3 minutes wall-clock: six LLM specialists run concurrently with 150ms stagger, then a synthesizer pass. The deterministic ci-security agent only runs if you touched workflow YAML / Dockerfiles / lockfiles and adds milliseconds, not minutes. Cold indexing on a 5000-file backfill takes 5-30 minutes once, then incremental indexing on push completes in seconds.
Tree-sitter parsing covers TypeScript, JavaScript, Python, Go, Rust, Java, Kotlin, C, C++, C#, Ruby, and PHP. That gets you symbol-level indexing and the PageRank graph. The LLM specialists can read and reason about code in any language; per-language hints (extension → checklist) get injected for TypeScript, JavaScript, Python, Go, Rust, Java, Kotlin, Ruby, Swift, C, C++, C#, PHP, and Shell — that steers the bugs / best-practices / performance agents toward the gotchas that language actually has. For files >400 lines we extract ±100 lines around each touched line (merged windows, 300-line cap) so the LLM sees the enclosing function context in giant files.
Three gates. Gate 1: inline PR review surfaces the finding on the offending line as a critical comment. Gate 2: a Check Run named "LGTM Security" posts with conclusion=failure on any rule whose configured action is block — if you add this check to your branch protection "required" list, the merge button is disabled until resolved. Gate 3: the LGTM Security Watchdog GitHub Action (lgtm-action) runs as the first step of your CI job, polls our pipeline-decision API, and exits non-zero before checkout, before tests, before deploys. Bad config can't reach production.
Secrets: hardcoded API keys, GitHub PATs, AWS access keys, private keys, JWTs (fires on every CI file type). GitHub Actions workflow YAML (13): unpinned actions/checkout, unpinned third-party actions, permissions write-all, missing job permissions, untrusted-input shell injection, pull_request_target with head checkout, self-hosted runner on public repo, privileged container, external reusable workflow, weak workflow_dispatch triggers, cache-key poisoning, forking TOCTOU, OIDC over-permissive + trust-policy wildcard sub. Dockerfile (3): --privileged flag, USER root in final stage, ADD from HTTP URL. Dependencies (3): lockfile-only edits, npm lifecycle scripts, typosquat + dependency confusion. Network (1): unallowlisted curl/wget in CI (escalates if piped to bash). GitLab CI (5), CircleCI (5), Azure Pipelines (5): shell injection, privileged container, unpinned includes/orbs/repo resources, cache poisoning, self-hosted runners, and Azure plaintext-secret variables. Every rule has a default action (block / warn / off) you can override per-repo or lock at the org level.
Yes. Each detector ships with a default action — block, warn, or off — and you can override it per-repo in the policy editor or via CLI: lgtm security policy set <rule-id> <block|warn|off>. You can also maintain allowlists for trusted action sources (e.g. actions/*, your-org/*), permitted outbound domains, and approved self-hosted runner labels. The policy is versioned so audits show exactly what was active at the time of any finding.
The CLI talks to the LGTM API at api.looksgoodtomeow.in for review orchestration, BYOK validation, and context fetching. It can't run fully air-gapped today — agents run on the LGTM server, not your laptop. If you need on-prem or self-hosted, get in touch; it's something we'd consider for serious teams.
LGTM is operated by Tarin Agarwal, an Indian sole proprietor based in Bangalore doing business as DevsBazaar (not incorporated). Source code is read via GitHub API and not persisted as source. User account data is minimal (GitHub username, email, encrypted BYOK keys). We map to DPDP Act 2023 obligations — data fiduciary disclosures, retention policies, and a named Grievance Officer (Tarin Agarwal, Proprietor) — published in the Privacy Policy at looksgoodtomeow.in/privacy. Taxes are collected and remitted by Dodo Payments as our Merchant of Record.
Free (₹0/mo): 10 reviews + 5 CI/CD security scans/month, 1 enrolled repo, all 6 review agents, all 36 security detectors across 4 CI systems, CLI, dashboard, BYOK. Hobby (₹399/mo): 100 reviews + 50 CI/CD scans/month, 3 enrolled repos, auto-review on every PR, Runtime Watchdog Action, email support 48h, top-up packs. Pro (₹999/mo): 500 reviews + 300 CI/CD scans/month, unlimited enrolled repos, custom detector rules, per-repo model overrides, email support 24h, top-up packs. Enterprise: unlimited reviews + scans, custom SLA + DPA, optional self-hosted deployment. Payments via Dodo Payments; cancel anytime, no contracts.
"LGTM" — Looks Good To Me — is what reviewers type when they're done. We made it Looks Good To Meow because (a) it's memorable, (b) the brand permits being friendly about a dry topic, and (c) every senior engineer secretly wishes their reviews were one-line approvals. The tool exists so yours can be.
Sales, support, security disclosures, or anything in between. We reply within 1 business day.

Connect your first repo in under a minute. Your next PR gets a full AI-powered review automatically.
Your API keys stay with you. Code is read via GitHub API and never stored.