IonWarp logoIonWarp
FOR TEAMS SHIPPING WITH AI AGENTS

The GitHub AI
Reviewer fighting
AI Slop

IonWarp spawns agents to review your pull requests for Logs & Errors, Fast APIs, Pen Testing, Code Review, SEO — and to fight AI Slop.

Free for 3 seats · Startup discount

IonWarpbotcommented 15 min ago

IonWarp Review — PR #412

3 issues| 2 P1 1 P2
#SevIssueFile
1Copy-paste variant of adjacent fetchUsers()api/teams.ts
2createTasksV2 kept wired "for safety"lib/tasks.ts
3Narration comments restate the diffapi/teams.ts
api/teams.ts
717273
+
// call the helper to get the teamsasync function fetchTeamsList(ids) { /* same body as fetchUsers */ }const teams = await fetchRows("teams", ids);

Copy-paste variant of an adjacent function · AI Slop

fetchTeamsList duplicates fetchUsers with one literal changed. Parameterize the existing helper and delete the copy.

Suggested fixAI fix prompt
Agent catalog

Code

Product

Marketing

Docs

Plan

AI Complexity

13 agents in the catalog today — and any agents.md role you describe becomes one more.

API Performance4 / 13
IonWarpbotcommented 15 min ago

IonWarp Review — PR #310

3 issues| 2 P1 1 P2
#SevIssueFile
1N+1 query in user listing endpointapi/users.ts
2Unused import left after refactorutils/auth.ts
3Consider extracting shared validationforms/signup.tsx
api/users.ts
42434445
+++
const users = await db.users.findMany();const users = await db.users.findMany({  include: { teams: true },});

N+1 query in user listing · Code Review

The listing fetches users then loops to load teams individually. Use include to fetch in one query.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #87

3 issues| 2 P0 1 P1
#SevIssueFile
1SQL injection via template literaldb/query.ts
2Secrets in client bundleenv.config
3Missing rate limit on /authauth/login.ts
db/query.ts
424344
++
db.query(`SELECT * FROM users WHERE id=${userId}`)db.query("SELECT * FROM users WHERE id=$1", [userId])// parameterized. no more sqli.

SQL injection via template literal · Security Review

User input interpolated directly into SQL. Use parameterized query.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #42

4 issues| 1 P0 2 P1 1 P2
#SevIssueFile
1Modal not dismissible via Escapeauth-modal.tsx
2Focus trap missing in dropdown menunav-menu.tsx
3Touch target below 44px minimumsidebar.tsx
4Inconsistent hover state on cardstask-card.tsx
components/auth-modal.tsx
24252627
++++
useEffect(() => {  const onKey = (e) => e.key === "Escape" && onClose();  document.addEventListener("keydown", onKey);  return () => document.removeEventListener("keydown", onKey);

Modal not dismissible via Escape key · UX Review

The dialog intercepts focus but never registers an Escape handler. Keyboard-only users are trapped.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #422

3 issues| 1 P0 2 P1
#SevIssueFile
1N+1 query — one round-trip per idapi/users.ts
2Serial await over independent fetchesapi/teams.ts
3Analytics emit awaited on the hot pathlib/track.ts
api/users.ts
14151617
+
for (const id of ids) {  users.push(await db.user(id))}const users = await db.users({ where: { id: { in: ids } } })

N+1 query in the user listing · API Performance

One round-trip per id on a per-request path — the endpoint pays N database hops where a single WHERE IN serves. Batch it.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #256

3 issues| 2 P1 1 P2
#SevIssueFile
1Click event missing on pricing CTApricing.tsx
2utm params dropped on signup redirectauth/signup.ts
3Page view fires twice on hash changeapp.tsx
app/pricing.tsx
88899091
+  
<button onClick={upgrade}>Upgrade to Pro</button><button onClick={() => { track("pricing_cta_click"); upgrade(); }}>  Upgrade to Pro</button>

CTA click missing analytics event · Analytics Review

The "Upgrade to Pro" button has no event. You will lose the pricing → signup conversion signal in PostHog.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #189

3 issues| 2 P1 1 P2
#SevIssueFile
1Missing og:image meta taglayout.tsx
2H1 tag missing on pageblog/[slug].tsx
3Alt text empty on hero imagehero.tsx
app/blog/[slug].tsx
121314
+ 
<span className="post-title">{post.title}</span><h1 className="post-title">{post.title}</h1>// single h1 per page anchors topic

H1 tag missing on page · SEO Review

Blog post title uses <span> instead of <h1>. Search engines need a single <h1>.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #480

3 issues| 1 P1 2 P2
#SevIssueFile
1Breaking change not flaggedCHANGELOG.md
2New feature missing entryCHANGELOG.md
3Suggested release notes ready
CHANGELOG.md
1234
++++
## [2.4.0] – 2026-05-08### BREAKING- `auth.verify()` now requires explicit algorithms array### Added

Breaking change unflagged · Changelog

auth.verify signature changed but the changelog entry sits under "Added". Consumers will miss the migration step.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #528

3 issues| 1 P1 2 P2
#SevIssueFile
1Review turnaround p50 doubled this week
23 PRs merged with zero review
3Cycle-time trend attached to the report
pr-metrics-report.md
123
+++
| metric | last week | this week || review turnaround p50 | 3.1h | 6.4h || merged with zero review | 0 | 3 |

Review turnaround p50 doubled · PR Metrics

Median first-review time went 3.1h → 6.4h this week; three PRs merged with no review at all. The trend table is attached.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #264

3 issues| 2 P1 1 P2
#SevIssueFile
1Plan step 4 shipped with no owner or PRdocs/plans/rollout.md
2Diff contradicts the plan's stated contractlib/rollout.ts
3Unscheduled remainder not nameddocs/plans/rollout.md
docs/plans/rollout.md
3132
+
- [ ] Step 4: migrate existing rows (owner: TBD)- [ ] Step 4: migrate existing rows — PR #265, owner named

A plan step with no owner is a step that will not happen · Plan Review

Step 4 has no owner and no PR; the diff ships the feature around it. Name the owner or name the remainder.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #337

3 issues| 2 P1 1 P2
#SevIssueFile
1Bare catch reintroduced — 4th recurrencesync/worker.ts
2Fix shipped as opt-in flag on stored statelib/rollout.ts
3Per-instance patch; sibling sites keep the bugqueue/drain.ts
sync/worker.ts
545556
++
try { await push(row); } catch (error) { /* dropped */ }try { await push(row); } catch (error) {  throw new PushFailed(row.id, error); // learning: swallowed-sync-error

Reintroduced a learning the team fixed three times · Repeat-Failure Learnings

This exact swallowed-sync-error shape was re-patched in #212, #260 and #291. The cached learning says: rethrow named, never drop.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #144

3 issues| 2 P1 1 P2
#SevIssueFile
1Public API changed without docs updatedocs/api.md
2README install steps staleREADME.md
3Deleted guardrail left contradicted ruleCLAUDE.md
docs/api-reference.md
88899091
++++
### POST /v1/reviewsReturns: `{ id: string, status: "queued" | "running" }` Queues a swarm review against the given PR.

Return type undocumented for /v1/reviews · Docs Freshness

Consumers of the public API have to read source to know the return shape. Add an explicit response section.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #412

3 issues| 2 P1 1 P2
#SevIssueFile
1Copy-paste variant of adjacent fetchUsers()api/teams.ts
2createTasksV2 kept wired "for safety"lib/tasks.ts
3Narration comments restate the diffapi/teams.ts
api/teams.ts
717273
+
// call the helper to get the teamsasync function fetchTeamsList(ids) { /* same body as fetchUsers */ }const teams = await fetchRows("teams", ids);

Copy-paste variant of an adjacent function · AI Slop

fetchTeamsList duplicates fetchUsers with one literal changed. Parameterize the existing helper and delete the copy.

Suggested fixAI fix prompt
IonWarpbotcommented 15 min ago

IonWarp Review — PR #213

3 issues| 1 P0 1 P1 1 P2
#SevIssueFile
1D1 write failure swallowed, returns okapi/save.ts
2Liveness probe error read as "dead"cron/sweep.ts
3Timeout fires with no distinct log linelib/client.ts
api/save.ts
88899091
+++
} catch (error) { /* swallowed */ }} catch (error) {  log.warn({ error_code: "save_write_failed", run_id, error });  throw new SaveWriteFailed(error);

Swallowed write failure returns success · Log & Errors

The catch drops a D1 write failure and returns { ok: true } — a lost write is indistinguishable from a saved one. Log it keyed and rethrow.

Suggested fixAI fix prompt

Agents review the UX, not just the code.

Beyond Code Review.

IonWarp swarms your PR with specialized agents so every dimension of your product gets a second pair of eyes.

UX Review

A UX code review that
clicks through your app.

IonWarp takes screenshots across 3 viewports, checks every image, link, and heading, and produces a full audit table.

IonWarpbotcommented 2 min ago

UX Test Results — Zest (meetzest.com)

Browser evidence from a public demo site

Screenshots — Home

Desktop · 1440px
Zest Desktop · 1440px screenshot
Tablet · 768px
Zest Tablet · 768px screenshot
Mobile · 375px
Zest Mobile · 375px screenshot

Audit Table

TypePageViewportStatusDetails
VisualhomedesktopPassedscreenshot captured
VisualhometabletPassedscreenshot captured
VisualhomemobilePassedscreenshot captured
VisualpricingtabletWarning422 — anchor scroll timeout
ScrapehomeallWarning17 images empty alt
LinkshomeallPassed11 links, none broken
ContenthomedesktopPassedh1: clear value prop
12/15 passed · 0 failed · 3 warnings
Try for free

2-click start · GitHub Auth

Autofix rounds

Your agent ships the fix.
IonWarp checks its work.

Every finding is tracked until it is resolved or explicitly declined — so a review is a ledger that closes, not a wall of comments that scrolls away.

IonWarpbotre-reviewed after fixpack a1b2c3d

Findings ledger

9resolved
2declined
1still open

Round comment from the coding agent

  • Fixedclaim-before-dispatch — dispatch evidence persists before the row goes terminal
  • Fixedunindexed deck read — added the scoping column, migration regenerated
  • Declinedgesture thresholds — measured on-device; added a comment instead of changing them

Session analytics, read from the pull request

Harness
Claude Code
Planning
3 min
Coding
10 min
Local tests
5 min
Intent
Fix the dispatch race

Your coding agent describes how it worked; IonWarp keeps that beside the review, so a slow, silent, or looping agent is visible instead of anecdotal.

Pricing

Best pricing in the game.

One workspace price with seats included. Credits pool across your team. Unlimited repos on every plan.

Starter

$0 /mo

Try AI PR review.

  • Starter Swarm across 2 models
    • Code Review
    • Security Review
  • 3 seats included
  • +5,000 credits/mo
  • Unlimited repos
Get Started

Max

$149 /mo

Scale AI PR review.

  • Max Swarm across 5 models
    • AI CI/CD speed
    • UX Review
    • Agents.md
  • 10 seats included
  • +50,000 credits/mo
  • +$29/mo per added seat
  • Unlimited repos
  • Priority support
Choose Max
Enterprise

Custom swarms + credits · GitHub Enterprise · SSO/SAML + audit logs · Custom security review + SLA

Contact us
IonWarp for Startups

Get the Max plan at half price. — Full Swarm. Proactive PRs. 10 seats and 50,000 credits a month included.

Apply

IonWarp for Startups

Get the Max plan at half price.

Full Swarm. Proactive PRs. 10 seats and 50,000 credits a month included.

50% off Pro and Max for 12 months — Max works out to $74.50 / month. Redeem with your code in checkout; seats and overage stay at list price.

Who qualifies
  • Raised less than $5M total
  • Company is less than 3 years old
  • Backed by a recognized accelerator or VC (YC, a16z, Sequoia, Accel, Techstars, etc.)
How it works
  1. Fill out the form (30 seconds)
  2. We verify your funding in <24 hours
  3. Upgrade to Max at the startup rate

Already a customer? Email startups@ionwarp.com to switch.

FAQ

Frequently asked questions