Wrinkle
Download
About Pricing Login Download

Identify bugs
the instant they are written.
Identify bugs the instant they are written.

Wrinkle analyzes every keystroke, providing immediate in-IDE feeback — reducing debug time, review churn, and production outages.

checkout.ts
1
function applyDiscount(cart: Cart) {
2
  const name: string = cart.coupon.name
3
  const items: LineItem[] = cart.items
4
  const total: number = items
5
    .reduce((s, i) => s + i.price * i.quantity, 0)
6
  return total * (1 - rates[name])
7
}
! rates is keyed by coupon code, but here you accessed it by coupon name. wrinkle · semantics
Get started for free

Don't wait until the PR for AI-powered code review.

cart.ts
1
function orderTotal(items: LineItem[]): number {
2
  const subtotal = items.reduce(
3
    (acc, item) => acc + item.price,
4
    0,
5
  )
6

                
7
  const tax = subtotal * TAX_RATE
8
  return Math.round((subtotal + tax) * 100) / 100
9
}
! item.price is a per-unit price, but you used it as the line total price wrinkle · semantics

Wrinkle performs deep, incremental analysis to catch bugs that slip past type checkers and linters. Utilizing static analysis and low-latency LLMs, it was engineered from the ground up for instant, in-IDE diagnostics, providing frictionless feedback for engineers and agents alike.

Wrinkle uses rich context to determine the intent and correctness of your code. If intended logic is flagged as incorrect, add a comment explaining why and the diagnostic will disappear as fast as it appeared, thoughtfully staying out of your way.

order.ts
1
async function checkout(cart: Cart) {
2
  const order = await createOrder(cart)
3

                
4
  // fire-and-forget — must not block checkout
5
  void track('purchase', order.total)
6

                
7
  await sendReceipt(order)
8
  return redirect('/orders/' + order.id)
9
}
Un-awaited promise is intentional.No diagnostics · wrinkle · context-aware