BeforeMerge

AI-native code review knowledge base. Structured rules that catch what linters miss.

Product

  • Features
  • Explore
  • Pricing
  • Docs
  • GitHub

Company

  • About
  • Blog
  • Contributors
  • Contributing

Legal

  • Privacy Policy
  • Terms of Service
  • MIT License

© 2026 BeforeMerge. Built by Peter Krzyzek

BeforeMerge
Features
Explore
PricingBlogContributorsInstall Guide
2Sign In
FeaturesExplore
RulesSkillsKnowledgePrompts
PricingBlogContributorsInstall Guide
Sign In

Explore

Browse 158 rules, 25 knowledge articles, and 25 prompt templates across security, performance, architecture, and quality.

158 rules

Validate External Data at System Boundaries

MEDIUM

TypeScript types vanish at runtime. Validate external data at system boundaries with Zod to prevent crashes from unexpected shapes. [CWE-20]

nextjsValidation
beforemerge-nextjs-review

Ban any at Trust Boundaries — Use unknown with Validation

HIGH

Using 'any' or 'as any' at API boundaries, form handlers, and external data silently disables TypeScript safety, causing runtime crashes from unexpected data. [CWE-20]

anynextjs
beforemerge-nextjs-review

Never Use Type Assertions on External Data — Validate Instead

MEDIUM

Casting API responses, form data, or URL params with 'as Type' bypasses TypeScript guarantees. When the shape doesn't match, crashes happen far from the boundary. [CWE-20]

nextjsValidation
beforemerge-nextjs-review

Never Hardcode Secrets — Use Environment Variables Properly

HIGH

Hardcoded secrets persist in Git history forever. Use environment variables and never prefix secrets with NEXT_PUBLIC_. [CWE-798 · A07:2021]

nextjsconfiguration
beforemerge-nextjs-review

Always Return Cleanup Functions from useEffect

HIGH

useEffect hooks that set up subscriptions, timers, or event listeners without cleanup cause memory leaks, stale state updates, and race conditions.

useeffectnextjs
beforemerge-nextjs-review

Prevent Unnecessary Re-renders from Unstable References

HIGH

Inline objects, arrays, and functions as props create new references every render, defeating React.memo and causing cascading re-renders across the tree.

usecallbacknextjs
beforemerge-nextjs-review

Avoid Stale Closure Bugs in Hooks and Callbacks

MEDIUM

Event handlers and effects that capture state in closures can reference outdated values, causing silent data corruption and missed updates.

useeffectnextjs
beforemerge-nextjs-review

Prefer Server Components — Only Add 'use client' When Necessary

HIGH

Adding 'use client' unnecessarily ships component JS to the browser. Only use it when you need hooks, event handlers, or browser APIs.

nextjsbundle-size
beforemerge-nextjs-review

Parallelize Independent Async Operations

CRITICAL

Sequential await calls on independent operations create request waterfalls. Use Promise.all or Suspense boundaries to parallelize.

nextjsasync
beforemerge-nextjs-review

Eliminate N+1 Database Queries

CRITICAL

Fetching related data inside loops creates N+1 queries that scale linearly with data size. Use eager loading or batch queries instead. [CWE-400]

drizzlenextjs
beforemerge-nextjs-review

Use Stable, Unique Keys for List Items (Never Index)

MEDIUM

Using array indices as key props causes incorrect state preservation, UI corruption, and degraded performance when lists are reordered or filtered.

nextjsReact
beforemerge-nextjs-review

Use next/image Instead of Raw img Tags

HIGH

Raw <img> tags skip automatic optimization, lazy loading, and responsive sizing. next/image provides WebP/AVIF conversion, blur placeholders, and CLS prevention.

Imagesnextjs
beforemerge-nextjs-review

Use next/font Instead of External Font Loading

MEDIUM

External font loading from Google Fonts or CDNs causes layout shift and render-blocking requests. next/font self-hosts fonts with zero layout shift.

nextjsfonts
beforemerge-nextjs-review

Use Dynamic Imports for Heavy Client Components

HIGH

Large client libraries loaded synchronously block the initial page load. Use next/dynamic or React.lazy to code-split and load them on demand.

nextjsdynamic-imports
beforemerge-nextjs-review

Avoid Barrel File Imports in Client Components

HIGH

Barrel file imports in Client Components force bundlers to load entire libraries. Use direct imports or Next.js optimizePackageImports.

nextjsimports
beforemerge-nextjs-review

Implement loading.tsx and error.tsx at Every Route Segment

MEDIUM

Missing loading.tsx causes full-page spinners instead of granular streaming. Missing error.tsx lets errors crash parent layouts instead of being contained.

nextjssuspense
beforemerge-nextjs-review

Break Up God Components Into Focused, Composable Units

MEDIUM

Components handling data fetching, business logic, state, and rendering are hard to test and maintain. Decompose by responsibility.

single-responsibilitycomponents
beforemerge-nextjs-review

Add Error Boundaries Around Unreliable Content

MEDIUM

Without error boundaries, a single component failure crashes the entire page. Use error.tsx and granular ErrorBoundary wrappers.

nextjsresilience
beforemerge-nextjs-review

Keep API Route Handlers Thin — Delegate to Services

CRITICAL

API routes with business logic are hard to test, audit, and secure. Keep route handlers under 100 lines by delegating to service classes. [CWE-1064]

single-responsibilitythin-controllers
beforemerge-fullstack-architecture-review

Rate Limit Every API Route with Appropriate Buckets

HIGH

API routes without rate limiting enable brute force, DDoS, and credit exhaustion attacks. Apply tiered rate limits as the first middleware. [CWE-770 · A04:2021]

middlewarenextjs
beforemerge-fullstack-architecture-review

Never Expose Raw Errors or Stack Traces to Clients

MEDIUM

Returning raw error messages or stack traces leaks implementation details. Return generic messages with a requestId for server-side debugging. [CWE-209]

nextjsinformation-disclosure
beforemerge-fullstack-architecture-review

Validate CSRF Tokens on All State-Changing Requests

HIGH

State-changing API routes without CSRF validation allow cross-site request forgery. Validate tokens on POST/PUT/PATCH/DELETE with known exemptions. [CWE-352 · A01:2021]

middlewarenextjs
beforemerge-fullstack-architecture-review

Use Consistent ServiceResult Type for All Service Returns

MEDIUM

Inconsistent error handling with thrown exceptions, returned nulls, and ad-hoc error objects makes callers fragile. Use a discriminated union ServiceResult type.

discriminated-unionservice-result
beforemerge-fullstack-architecture-review

Search Existing Code Before Creating New Utilities

MEDIUM

Creating new components or utilities without checking if one already exists leads to duplicated logic and inconsistency. Search existing code first.

discoverabilitycode-reuse
beforemerge-fullstack-architecture-review

Automate these checks on every PR

BeforeMerge scans your pull requests against these rules automatically. Get actionable feedback before code ships to production.

Join WaitlistLearn More
Sort:
Previous1234567Next