Indent Review

Other code reviewers create more work. Indent Review does it for you.

Indent Review is what AI code review should be: it gives feedback like your best teammates would, fixes what it finds, and gets better over time

Load team conventions

Load team conventions

Load team conventions

Load team conventions

Extremely in-depth review

Extremely in-depth review

Extremely in-depth review

Extremely in-depth review

High-signal feedback only

High-signal feedback only

High-signal feedback only

High-signal feedback only

Fixes automatically applied

Fixes automatically applied

Fixes automatically applied

Fixes automatically applied

System rules

  • Always use design tokens for colors, never plain hexcodes

  • Always use semantic values in components

  • Never introduce spacing values that aren't in the design system

Ran 9 commands, Searched 5 patterns, Read 17 files

Posted 4 comments

Indent Code is addressing 3 comments

indent

bot

commented

indent

bot

left a comment

Author

Partial token adoption: The boxShadow property mixes token and hardcoded values. The first shadow layer correctly uses --shadow-color-sm, but the second layer contains a raw oklch value, bypassing the design system. ( src/components/Tooltip.tsx line 112)

Change proposed by

Indent Code

112

-

0 10px 24px -4px oklch(0.25 0.02 260 / 0.18)

112

-

0 10px 24px -4px var(--shadow-color-lg)

Accept change

Reject

Load team conventions

Extremely in-depth review

High-signal feedback only

Fixes automatically applied

System rules

  • Always use design tokens for colors, never plain hexcodes

  • Always use semantic values in components

  • Never introduce spacing values that aren't in the design system

Ran 9 commands, Searched 5 patterns, Read 17 files

Posted 4 comments

Indent Code is addressing 3 comments

indent

bot

commented

indent

bot

left a comment

Author

Partial token adoption: The boxShadow property mixes token and hardcoded values. The first shadow layer correctly uses --shadow-color-sm, but the second layer contains a raw oklch value, bypassing the design system. ( src/components/Tooltip.tsx line 112)

Change proposed by

Indent Code

112

-

0 10px 24px -4px oklch(0.25 0.02 260 / 0.18)

112

-

0 10px 24px -4px var(--shadow-color-lg)

Accept change

Reject

A great code review is…

Instant: reviews complete within minutes of a PR being opened

2 min ago

2 min ago

Add rate limiting to /api/upload #847

Opened 2 minute ago

Open

ash-uxi

wants to merge 2 commits into

main

from

indent-bot/pr-review-workflow-75833f62

1 min ago

1 min ago

Indent

bot

left a comment 1 minute ago

Summary

There are a couple failing CI checks, but they're not related to this PR, so we can ignore them. The real issue is that we haven't updated the tests according to the new functionality. More details below:

▶︎

frontend / tests (push)

Autofix

▶︎

backend / typecheck (push)

Autofix

▶︎

backend / lint (push)

Autofix

2 min ago

Add rate limiting to /api/upload #847

Opened 2 minute ago

Open

ash-uxi

wants to merge 2 commits into

main

from

indent-bot/pr-review-workflow-75833f62

1 min ago

Indent

bot

left a comment 1 minute ago

Summary

There are a couple failing CI checks, but they're not related to this PR, so we can ignore them. The real issue is that we haven't updated the tests according to the new functionality. More details below:

▶︎

frontend / tests (push)

Autofix

▶︎

backend / typecheck (push)

Autofix

▶︎

backend / lint (push)

Autofix

2 min ago

Add rate limiting to /api/upload #847

Opened 2 minute ago

Open

ash-uxi

wants to merge 2 commits into

main

from

indent-bot/pr-review-workflow-75833f62

1 min ago

Indent

bot

left a comment 1 minute ago

Summary

There are a couple failing CI checks, but they're not related to this PR, so we can ignore them. The real issue is that we haven't updated the tests according to the new functionality. More details below:

▶︎

frontend / tests (push)

Autofix

▶︎

backend / typecheck (push)

Autofix

▶︎

backend / lint (push)

Autofix

2 min ago

Add rate limiting to /api/upload #847

Opened 2 minute ago

Open

ash-uxi

wants to merge 2 commits into

main

from

indent-bot/pr-review-workflow-75833f62

1 min ago

Indent

bot

left a comment 1 minute ago

Summary

There are a couple failing CI checks, but they're not related to this PR, so we can ignore them. The real issue is that we haven't updated the tests according to the new functionality. More details below:

▶︎

frontend / tests (push)

Autofix

▶︎

backend / typecheck (push)

Autofix

▶︎

backend / lint (push)

Autofix

Exhaustive: all related code, earlier changes, and stored info are considered

Considered 147 files, 23 previous PRs, and 4 months of history

Read:

src/api/upload.ts

Read:

src/middleware/rateLimit.ts

git log:

Last modified by @sarah 12 days ago

Search:

Found 8 matches across 6 files

Observation:

review from PR #792, discussion about Redis approach

Read:

src/config/limits.ts

This PR adds rate limiting but there's an existing rate limiter in middleware. Checking if they're compatible and looking at how the team has handled this pattern before.

Grep:

Found in api.test.ts, integration/upload.test.ts

Considered 147 files, 23 previous PRs, and 4 months of history

Read:

src/api/upload.ts

Read:

src/middleware/rateLimit.ts

git log:

Last modified by @sarah 12 days ago

Search:

Found 8 matches across 6 files

Observation:

review from PR #792, discussion about Redis approach

Read:

src/config/limits.ts

This PR adds rate limiting but there's an existing rate limiter in middleware. Checking if they're compatible and looking at how the team has handled this pattern before.

Grep:

Found in api.test.ts, integration/upload.test.ts

Considered 147 files, 23 previous PRs, and 4 months of history

Read:

src/api/upload.ts

Read:

src/middleware/rateLimit.ts

git log:

Last modified by @sarah 12 days ago

Search:

Found 8 matches across 6 files

Observation:

review from PR #792, discussion about Redis approach

Read:

src/config/limits.ts

This PR adds rate limiting but there's an existing rate limiter in middleware. Checking if they're compatible and looking at how the team has handled this pattern before.

Grep:

Found in api.test.ts, integration/upload.test.ts

Considered 147 files, 23 previous PRs, and 4 months of history

Read:

src/api/upload.ts

Read:

src/middleware/rateLimit.ts

git log:

Last modified by @sarah 12 days ago

Search:

Found 8 matches across 6 files

Observation:

review from PR #792, discussion about Redis approach

Read:

src/config/limits.ts

This PR adds rate limiting but there's an existing rate limiter in middleware. Checking if they're compatible and looking at how the team has handled this pattern before.

Grep:

Found in api.test.ts, integration/upload.test.ts

High signal: concise, practical feedback that your team won’t tune out

Indent

bot

The error handler returns the full user object including email and created_at . On a 500, this leaks PII to the client.
needs to be authenticated

👍 6

🚀 4

Indent

bot

getOrgMembers() runs inside the loop. One query per team. With 50 teams, that's ~2s added latency. A single batch query would fix this.

👍 3

🎉 5

Indent

bot

webhook.payload.repository is undefined for org-level events like member_added. This .split() will throw a TypeError on those webhooks.

👍 5

Indent

bot

The error handler returns the full user object including email and created_at . On a 500, this leaks PII to the client.
needs to be authenticated

👍 6

🚀 4

Indent

bot

getOrgMembers() runs inside the loop. One query per team. With 50 teams, that's ~2s added latency. A single batch query would fix this.

👍 3

🎉 5

Indent

bot

webhook.payload.repository is undefined for org-level events like member_added. This .split() will throw a TypeError on those webhooks.

👍 5

Indent

bot

The error handler returns the full user object including email and created_at . On a 500, this leaks PII to the client.
needs to be authenticated

👍 6

🚀 4

Indent

bot

getOrgMembers() runs inside the loop. One query per team. With 50 teams, that's ~2s added latency. A single batch query would fix this.

👍 3

🎉 5

Indent

bot

webhook.payload.repository is undefined for org-level events like member_added. This .split() will throw a TypeError on those webhooks.

👍 5

Indent

bot

The error handler returns the full user object including email and created_at . On a 500, this leaks PII to the client.
needs to be authenticated

👍 6

🚀 4

Indent

bot

getOrgMembers() runs inside the loop. One query per team. With 50 teams, that's ~2s added latency. A single batch query would fix this.

👍 3

🎉 5

Indent

bot

webhook.payload.repository is undefined for org-level events like member_added. This .split() will throw a TypeError on those webhooks.

👍 5

An Indent Review is even better.

You'll come back to ready-to-merge changes, not just comments.

1

PR opened

Update repo sync to handle warnings separately

Open

ash-uxi

wants to merge 1 commit into

main

from

indent-bot/pr-review-workflow-75833f62

2

Feedback received

Indent

bot

left a comment 12 minutes ago

3 potential issues found

Output redirect conflict
2>&1 merges stderr into stdout — warning check unreachable

python_modules/prime_server/exponent_server/core/services/e2b/sandbox•py

659

651

+

await write_update_script(sandbox)

660

652

+

update_result = await sandbox.commands.run(

661

666

+

f"/tmp/update_repo.sh /root/{repository.github_repo_name} 2>&1",

666

653

+

f"/tmp/update_repo.sh /root/{repository.github_repo_name}",

3

Issues addressed automatically

Indent

bot

left a comment

Author

⛔ 3 issues found. Addressing feedback…

Indent Code is working...

Indent Code is working...

Indent Code is working...

4

Changes merged 5x faster

Worked for 1 mins

+1

Worked for 3 mins

+8

-3

Worked for 8 mins

+18

-26

Update repo sync to handle warnings separately

Merged

ash-uxi

merged 1 commit into

main

from

indent-bot/pr-review-workflow-75833f62

python_modules/prime_server/models/incident_event.py

32

-

incident_id = sa.Column(sa.Text, nullable=False)

32

+

incident_id = sa.Column(sa.Text, nullable=False, unique=True)

jsegaran

Commented 15 minutes ago

@indent check our prod data to see if any of it could violate this new constraint

indent

bot

commented 12 minutes ago

I checked prod and found 23 duplicate incident_id values. Two options, let me know which one you'd like to proceed with.


  1. Loosen: make it unique per (tenant_id, incident_id) (or partial unique for non-resolved), depending on intent.

  2. Backfill: merge duplicates (pick canonical row, re-point FKs, delete extras) then add the unique constraint.

python_modules/prime_server/models/incident_event.py

32

-

incident_id = sa.Column(sa.Text, nullable=False)

32

+

incident_id = sa.Column(sa.Text, nullable=False, unique=True)

jsegaran

Commented 15 minutes ago

@indent check our prod data to see if any of it could violate this new constraint

indent

bot

commented 12 minutes ago

I checked prod and found 23 duplicate incident_id values. Two options, let me know which one you'd like to proceed with.


  1. Loosen: make it unique per (tenant_id, incident_id) (or partial unique for non-resolved), depending on intent.

  2. Backfill: merge duplicates (pick canonical row, re-point FKs, delete extras) then add the unique constraint.

python_modules/prime_server/models/incident_event.py

32

-

incident_id = sa.Column(sa.Text, nullable=False)

32

+

incident_id = sa.Column(sa.Text, nullable=False, unique=True)

jsegaran

Commented 15 minutes ago

@indent check our prod data to see if any of it could violate this new constraint

indent

bot

commented 12 minutes ago

I checked prod and found 23 duplicate incident_id values. Two options, let me know which one you'd like to proceed with.


  1. Loosen: make it unique per (tenant_id, incident_id) (or partial unique for non-resolved), depending on intent.

  2. Backfill: merge duplicates (pick canonical row, re-point FKs, delete extras) then add the unique constraint.

python_modules/prime_server/models/incident_event.py

32

-

incident_id = sa.Column(sa.Text, nullable=False)

32

+

incident_id = sa.Column(sa.Text, nullable=False, unique=True)

jsegaran

Commented 15 minutes ago

@indent check our prod data to see if any of it could violate this new constraint

indent

bot

commented 12 minutes ago

I checked prod and found 23 duplicate incident_id values. Two options, let me know which one you'd like to proceed with.


  1. Loosen: make it unique per (tenant_id, incident_id) (or partial unique for non-resolved), depending on intent.

  2. Backfill: merge duplicates (pick canonical row, re-point FKs, delete extras) then add the unique constraint.

python_modules/prime_server/models/incident_event.py

32

-

incident_id = sa.Column(sa.Text, nullable=False)

32

+

incident_id = sa.Column(sa.Text, nullable=False, unique=True)

jsegaran

Commented 15 minutes ago

@indent check our prod data to see if any of it could violate this new constraint

indent

bot

commented 12 minutes ago

I checked prod and found 23 duplicate incident_id values. Two options, let me know which one you'd like to proceed with.


  1. Loosen: make it unique per (tenant_id, incident_id) (or partial unique for non-resolved), depending on intent.

  2. Backfill: merge duplicates (pick canonical row, re-point FKs, delete extras) then add the unique constraint.

Responds like a teammate

Tag @indent in any comment thread to get its input, tell it to remember something, or ask it for changes

Follows custom rules

Increase review quality for everyone by telling Indent about your team’s style and patterns.

Custom rules

These rules are automatically included in every Agent conversation

Frontend

3 rules

-

- Data fetching via React Query; no ad-hoc useEffect fetches

-

- Use the shared design system components first; don’t hand-roll buttons/modals

-

- No non-null assertions (!) in app code; handle the null case or narrow the type

Backend

2 rules

-

- Prefer SQLAlchemy 2.0 style (select(), Session.execute) over legacy .query()

-

- Error handling: map known failures to typed HTTP errors

Database

1 rule

-

- Any new constraint/index must include a preflight query to check for existing prod violations

Add rule

Custom rules

These rules are automatically included in every Agent conversation

Frontend

3 rules

-

- Data fetching via React Query; no ad-hoc useEffect fetches

-

- Use the shared design system components first; don’t hand-roll buttons/modals

-

- No non-null assertions (!) in app code; handle the null case or narrow the type

Backend

2 rules

-

- Prefer SQLAlchemy 2.0 style (select(), Session.execute) over legacy .query()

-

- Error handling: map known failures to typed HTTP errors

Database

1 rule

-

- Any new constraint/index must include a preflight query to check for existing prod violations

Add rule

Custom rules

These rules are automatically included in every Agent conversation

Frontend

3 rules

-

- Data fetching via React Query; no ad-hoc useEffect fetches

-

- Use the shared design system components first; don’t hand-roll buttons/modals

-

- No non-null assertions (!) in app code; handle the null case or narrow the type

Backend

2 rules

-

- Prefer SQLAlchemy 2.0 style (select(), Session.execute) over legacy .query()

-

- Error handling: map known failures to typed HTTP errors

Database

1 rule

-

- Any new constraint/index must include a preflight query to check for existing prod violations

Add rule

Custom rules

These rules are automatically included in every Agent conversation

Frontend

3 rules

-

- Data fetching via React Query; no ad-hoc useEffect fetches

-

- Use the shared design system components first; don’t hand-roll buttons/modals

-

- No non-null assertions (!) in app code; handle the null case or narrow the type

Backend

2 rules

-

- Prefer SQLAlchemy 2.0 style (select(), Session.execute) over legacy .query()

-

- Error handling: map known failures to typed HTTP errors

Database

1 rule

-

- Any new constraint/index must include a preflight query to check for existing prod violations

Add rule

Custom rules

These rules are automatically included in every Agent conversation

Frontend

2 rules

-

- Data fetching via React Query; no ad-hoc useEffect fetches

-

- Use the shared design system components first; don’t hand-roll buttons/modals

-

- No non-null assertions (!) in app code; handle the null case or narrow the type

Backend

2 rules

-

- Prefer SQLAlchemy 2.0 style (select(), Session.execute) over legacy .query()

-

- Error handling: map known failures to typed HTTP errors

Database

1 rule

-

- Any new constraint/index must include a preflight query to check for existing prod violations

Add rule

Observations

Patterns Indent discovers from your code and conversations

Uses early returns to reduce nesting

Source: Positive response

·

Approved 2 days ago

·

Applied in 34 reviews

Imports React hooks individually

Source: Code patterns

·

Approved 3 days ago

·

Applied in 12 reviews

Prefers const assertions for literal types

Source: Ignored comments

·

Approved 3 days ago

·

Applied in 28 reviews

Prefers kebab-case for file naming

PR #847

·

Pending approval

Approve

Reject

Observations

Patterns Indent discovers from your code and conversations

Uses early returns to reduce nesting

Source: Positive response

·

Approved 2 days ago

·

Applied in 34 reviews

Imports React hooks individually

Source: Code patterns

·

Approved 3 days ago

·

Applied in 12 reviews

Prefers const assertions for literal types

Source: Ignored comments

·

Approved 3 days ago

·

Applied in 28 reviews

Prefers kebab-case for file naming

PR #847

·

Pending approval

Approve

Reject

Observations

Patterns Indent discovers from your code and conversations

Uses early returns to reduce nesting

Source: Positive response

·

Approved 2 days ago

·

Applied in 34 reviews

Imports React hooks individually

Source: Code patterns

·

Approved 3 days ago

·

Applied in 12 reviews

Prefers const assertions for literal types

Source: Ignored comments

·

Approved 3 days ago

·

Applied in 28 reviews

Prefers kebab-case for file naming

PR #847

·

Pending approval

Approve

Reject

Observations

Patterns Indent discovers from your code and conversations

Uses early returns to reduce nesting

Source: Positive response

·

Approved 2 days ago

·

Applied in 34 reviews

Imports React hooks individually

Source: Code patterns

·

Approved 3 days ago

·

Applied in 12 reviews

Prefers const assertions for literal types

Source: Ignored comments

·

Approved 3 days ago

·

Applied in 28 reviews

Prefers kebab-case for file naming

PR #847

·

Pending approval

Approve

Reject

Observations

Patterns Indent discovers from your code and conversations

Uses early returns to reduce nesting

Source: Positive response

·

Approved 2 days ago

·

Applied in 34 reviews

Imports React hooks individually

Source: Code patterns

·

Approved 3 days ago

·

Applied in 12 reviews

Prefers const assertions for literal types

Source: Ignored comments

·

Approved 3 days ago

·

Applied in 28 reviews

Prefers kebab-case for file naming

PR #847

·

Pending approval

Approve

Reject

Improves on its own

Indent Review learns and updates its knowledge based on every piece of feedback it makes and sees

Spend a few minutes to save weeks

Spend a few minutes to save weeks

Spend a few minutes to save weeks

Spend a few minutes to save weeks

1

Connect your GitHub repo

Connect your GitHub repo

Connect your GitHub repo

Connect your GitHub repo

One-click signup and setup

One-click signup and setup

One-click signup and setup

One-click signup and setup

2

Indent Review gets to work

Indent Review gets to work

Indent Review gets to work

Indent Review gets to work

Indent starts looking at recent PRs

Indent starts looking at recent PRs

Indent starts looking at recent PRs

Indent starts looking at recent PRs

Agents

Local Agent

Cloud Agent

Database Agent

PR Review Agent

Incident Response

Resources

Documentation

Blog

Company

Careers

README

Privacy policy

LInks

X.com

LinkedIn

Agents

Local Agent

Cloud Agent

Database Agent

PR Review Agent

Incident Response

Resources

Documentation

Blog

Company

Careers

README

Privacy policy

LInks

X.com

LinkedIn

Agents

Local Agent

Cloud Agent

Database Agent

PR Review Agent

Incident Response

Resources

Documentation

Blog

Company

Careers

README

Privacy policy

LInks

X.com

LinkedIn

Agents

Local Agent

Cloud Agent

Database Agent

PR Review Agent

Incident Response

Resources

Documentation

Blog

Company

Careers

README

Privacy policy

LInks

X.com

LinkedIn

Agents

Local Agent

Cloud Agent

Database Agent

PR Review Agent

Incident Response

Resources

Documentation

Blog

Company

Careers

README

Privacy policy

LInks

X.com

LinkedIn