Skip to content

Error Messages Quality

Real error messages from real services. Some help you fix the problem in seconds. Others make you question your career.

StripeJSON with codes
A+
Clarity
10
Actionability
10
Consistency
9
Helpfulness
10
Error CodesSuggested FixDoc Links
Payment attempt with low-balance cardexcellent
{
  "error": {
    "code": "card_declined",
    "decline_code": "insufficient_funds",
    "doc_url": "https://stripe.com/docs/error-codes/card-declined",
    "message": "Your card has insufficient funds.",
    "param": "source",
    "type": "card_error"
  }
}
Error code, decline reason, doc link, affected param, human message. Everything you need in one response.
API call with invalid customer IDexcellent
{
  "error": {
    "code": "resource_missing",
    "message": "No such customer: 'cus_nonexistent'",
    "param": "customer",
    "type": "invalid_request_error"
  }
}
Tells you exactly which resource is missing and which param caused it. No guesswork.
Best Pattern

Every error includes code, message, param, type, and doc_url. Machine-readable and human-readable at the same time.

Worst Pattern

Webhook signature errors could be more specific about what went wrong with the signature.

The gold standard. Every error has a dedicated docs page. SDKs throw typed exceptions.

ClerkStructured exceptions with steps
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Using auth() without middleware configuredexcellent
ClerkRuntimeError: Clerk: auth() was called but Clerk can't detect usage of clerkMiddleware(). Please ensure the following:
1. clerkMiddleware() is used in your middleware.ts
2. Your middleware.ts is located at the root of your app
Tells you exactly what's wrong and gives numbered steps to fix it. Chef's kiss.
Missing environment variablegood
Clerk: You need to add your Publishable Key to the <ClerkProvider publishableKey={YOUR_KEY} />
Clear about what's missing, but could link to the dashboard where you get the key.
Best Pattern

Framework-specific errors that mention the exact file and component you need to change.

Worst Pattern

JWT validation errors are generic — 'Invalid token' without specifying which claim failed.

Great DX. Errors read like mini-tutorials. Framework integration errors are especially good.

AnthropicJSON with typed error objects
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Exceeding token rate limitexcellent
{
  "type": "error",
  "error": {
    "type": "rate_limit_error",
    "message": "Number of request tokens has exceeded your daily rate limit (80000) of tokens per minute. Please reduce your request rate."
  }
}
Tells you the exact limit hit, your current rate, and what to do. Rate limit errors are often the worst — this one is the best.
Malformed conversation turns in messages arrayexcellent
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "messages: roles must alternate between \"user\" and \"assistant\", but found two consecutive \"user\" roles"
  }
}
Explains the exact constraint violated and where. You know immediately which message in the array to fix.
Best Pattern

Error types are enum-like and stable: rate_limit_error, invalid_request_error, api_error — easy to handle in code.

Worst Pattern

Streaming errors can arrive mid-stream as an error event, which requires careful client-side handling that the docs could better highlight.

Follows the OpenAI error pattern but improves on it. Rate limit messages include actual numbers. Message validation errors are specific.

LinearGraphQL error format with extensions
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Creating an issue without required title fieldexcellent
{
  "errors": [
    {
      "message": "Variable \"$input\" of type \"IssueCreateInput!\" has invalid value: Field \"title\" of required type \"String!\" was not provided.",
      "extensions": { "code": "VALIDATION_ERROR" }
    }
  ]
}
Points to the exact variable, the exact field, and the expected type. GraphQL error format is well-structured.
Exceeding API rate limitexcellent
{
  "errors": [
    {
      "message": "Rate limit exceeded. Retry after 1.2 seconds.",
      "extensions": { "code": "RATE_LIMITED", "retryAfter": 1.2 }
    }
  ]
}
Includes retryAfter in extensions — machine-readable and human-readable. No guesswork on backoff timing.
Best Pattern

GraphQL errors with extensions.code make programmatic handling easy. Validation errors reference exact field paths.

Worst Pattern

Webhook delivery failures in dashboard lack detail about why the endpoint rejected the payload.

Among the best GraphQL API error implementations. Consistent structure, machine-readable codes, and clear messages.

ResendJSON with name and message
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Sending email with malformed recipientexcellent
{
  "statusCode": 422,
  "message": "The 'to' field must contain a valid email address.",
  "name": "validation_error"
}
Exact field name, clear constraint, structured JSON. Simple and effective.
Sending to external address without verified domainexcellent
{
  "statusCode": 403,
  "message": "You can only send emails to your own email address until you verify a domain.",
  "name": "validation_error"
}
Explains the restriction AND the solution (verify a domain) in one sentence. Onboarding-aware error.
Best Pattern

Errors are aware of your account state — sandbox restrictions explained clearly with the path to lift them.

Worst Pattern

Rate limit errors don't include retry-after timing or current usage numbers.

Tiny API surface means few error types, but each one is crafted well. Onboarding-state-aware errors are a standout feature.

ConvexStructured ConvexError with hints
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Calling a mutation with missing required argumentexcellent
ConvexError: Server function "api.users.create" failed:
  Argument validation failed:
    Field "email": Expected string, received undefined
  at convex/users.ts:15
Function name, field path, expected vs received, source file line. Everything a developer needs in one message.
Query returning too much dataexcellent
ConvexError: Query function "api.users.list" returned more than 8MB of data.
Hint: Add .paginate() to return results in smaller chunks.
States the limit, names the function, and suggests the exact API to fix it. Errors that teach.
Best Pattern

Server function errors include full file paths, argument validation details, and actionable hints for platform limits.

Worst Pattern

WebSocket reconnection errors during development can produce noisy console output before auto-recovering.

Excellent DX. Errors reference your code, not internal stack frames. Platform limit errors always suggest the workaround.

CypressFormatted text with URLs and context
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Element not found during testexcellent
CypressError: `cy.get()` timed out retrying after 4000ms
Expected to find element: `[data-testid="submit-btn"]`, but never found it.

Learn more: https://on.cypress.io/element-not-found
Selector used, timeout duration, what was expected, and a doc link. Plus the Test Runner shows the DOM snapshot at failure time.
API request returning error statusexcellent
CypressError: `cy.request()` failed on:

http://localhost:3000/api/users

The response we received from your web server was: 404 Not Found

This was considered a failure because the status code was not 2xx or 3xx.
Full URL, status code, and explanation of why Cypress considers it a failure. Clear and educational.
Best Pattern

Every error includes the command that failed, what was expected, what actually happened, and a doc link.

Worst Pattern

Flaky test detection messages could better explain WHY a test is flaky rather than just flagging it.

Best-in-class test runner errors. The visual Test Runner plus detailed error messages make debugging tests genuinely pleasant.

PlaywrightStructured text with call logs
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Assertion on element that doesn't existexcellent
Error: expect(locator).toBeVisible

Locator: getByRole('button', { name: 'Submit' })
Expected: visible
Received: <element is not attached to the DOM>

Call log:
  - waiting for getByRole('button', { name: 'Submit' })
  - locator resolved to 0 elements
Shows the locator, expected state, actual state, and the full resolution log. You know exactly what Playwright tried and where it failed.
Navigating to a server that isn't runninggood
Error: page.goto: net::ERR_CONNECTION_REFUSED at http://localhost:3000
=========================== logs ===========================
navigating to "http://localhost:3000", waiting until "load"
Clear about the URL and the network error. Most devs immediately realize they forgot to start the dev server.
Best Pattern

Call logs showing each step Playwright took before failure. Locator resolution details eliminate selector guessing.

Worst Pattern

Trace viewer errors are excellent but require opening a separate HTML report — not inline in terminal.

Rivals Cypress for test error quality. Call logs are a standout feature — you see exactly what the framework tried. Trace viewer is the ultimate debugging tool.

VitestDiff with file:line pointers
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
String assertion mismatchexcellent
FAIL  tests/utils.test.ts > formatDate > should format ISO date
AssertionError: expected 'Mar 15, 2024' to be 'March 15, 2024'

- Expected
+ Received

- March 15, 2024
+ Mar 15, 2024

 ❯ tests/utils.test.ts:15:22
Diff view with expected vs received, exact file:line, test name hierarchy. Everything you need in one glance.
Runtime error in code under testgood
TypeError: Cannot read properties of undefined (reading 'map')
 ❯ src/utils.ts:42:15
 ❯ tests/utils.test.ts:8:18
Points to both the source file and the test file. Stack trace is clean and shows only relevant frames.
Best Pattern

Diff-style assertion output with color coding. Test hierarchy in failure output helps locate the exact test.

Worst Pattern

Module resolution errors for ESM/CJS mismatches produce Node-level errors that Vitest doesn't interpret.

Inherits the best of Jest's error formatting with better ESM support. Fast feedback loop makes error messages feel less painful.

SnykCLI output with severity + fix commands
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Vulnerability scan finding in dependencyexcellent
✗ High severity vulnerability found in lodash
  Description: Prototype Pollution
  Info: https://snyk.io/vuln/SNYK-JS-LODASH-1040724
  Introduced through: my-app@1.0.0 > express@4.18.2 > lodash@4.17.20
  Fix: Upgrade lodash to 4.17.21
    npm install lodash@4.17.21
Severity, CVE-equivalent link, full dependency chain showing HOW it got in, and the exact npm command to fix it. Gold standard for security tools.
License compliance scangood
✗ License issue: GPL-3.0 license detected in package "some-lib@2.0.0"
  Introduced through: my-app > other-pkg > some-lib
Shows the dependency path and the license type. Could be better by explaining what GPL-3.0 means for your project.
Best Pattern

Dependency chain tracing from your package.json to the vulnerable transitive dep, with exact fix commands.

Worst Pattern

False positives for vulnerabilities in dev dependencies that never ship to production lack context about actual risk.

Best vulnerability reporting in the ecosystem. Dependency chain visibility and one-command fixes make security scanning actually usable.

BiomeRustc-style with column highlights
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Using 'any' type in TypeScriptexcellent
lint/suspicious/noExplicitAny ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ✖ Unexpected any. Specify a different type.

  > 5 │ function foo(x: any) {
      │                 ^^^

  i Disabling any disables many important type checks. Consider using unknown instead.
Rule name, exact column highlight, explanation of WHY it's bad, and a concrete alternative. Better than ESLint's default output.
Running Biome after a major version upgradegood
error[migrate]: Configuration file not compatible with Biome 2.x
  biome.json:3:5 'formatter.indentSize' is deprecated. Use 'formatter.indentWidth' instead.
Deprecated field named, replacement given, exact location in config. Could auto-migrate but at least it's clear.
Best Pattern

Visual column pointers (^^^) under the offending code make it instantly clear what triggered the rule.

Worst Pattern

Import organization errors can produce many violations at once with little grouping — wall of red.

Borrowed Rust compiler error style. High signal, low noise. Most errors include a suggested fix or alternative.

ZodStructured JSON with path arrays
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Validating nested object with wrong field typeexcellent
ZodError: [
  {
    "code": "invalid_type",
    "expected": "string",
    "received": "number",
    "path": ["user", "email"],
    "message": "Expected string, received number"
  }
]
code, expected, received, path — everything you need. The path array tells you exactly where in the nested object the failure occurred.
Password field below minimum lengthexcellent
ZodError: [
  { "code": "too_small", "minimum": 8, "type": "string", "inclusive": true, "message": "String must contain at least 8 character(s)", "path": ["password"] }
]
Minimum value, type context, and path. Enough to build a UI error message directly from the ZodError.
Best Pattern

Structured ZodError with path arrays makes errors trivially mappable to form field names.

Worst Pattern

Union type errors (z.union) produce verbose output listing every branch that failed — hard to read with large schemas.

Best-in-class validation errors. The path array is a killer feature — frontend form libraries use it directly to highlight the right field.

AstroDescriptive with install commands and doc links
A
Clarity
9
Actionability
8
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Using image optimization without sharp installedexcellent
AstroError: Could not find Sharp. Please install it manually into your project:

npm install sharp

Learn more: https://docs.astro.build/en/guides/images/#sharp
Names the missing dep, gives the exact install command, links to docs. Complete error in 3 lines.
Malformed HTML in Astro componentexcellent
AstroError: Failed to load Vite config
  src/pages/index.astro: Expected closing tag for <div> (line 18)
  > 18 | <div class="foo"
       | ^
Specific file, line number, visual pointer. Hard to do better for a template syntax error.
Best Pattern

Missing dependency errors always include the exact install command — zero googling needed.

Worst Pattern

Hydration errors with multiple islands can be confusing — error may surface at the wrong component.

One of the better build-tool error experiences. Clear hierarchy: build errors, server errors, and hydration errors are visually distinct.

InngestStep-attributed with retry context
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Step function exhausting retriesexcellent
InngestFunctionError: Function "user/send-welcome" failed after 3 retries.
  Last error: Error: SMTP connection refused at smtp.example.com:587
  Step: "send-email" (step 2 of 3)
  Retry history: attempt 1 (2m ago), attempt 2 (10m ago), attempt 3 (30m ago)
Function name, step name, step position, last error, and retry history. Dashboard shows the same info visually.
Dev server can't find the Inngest endpointexcellent
InngestDevServerError: No serve handler found at POST /api/inngest.
Make sure you've added the serve() handler in your app.
Exact endpoint path expected, exact fix needed. The 'Make sure you've added serve()' covers 90% of new users' first problem.
Best Pattern

Step-level error attribution with retry history. Errors in distributed step functions are usually impossible to trace — Inngest solves this.

Worst Pattern

Event schema validation errors could be more specific about which field failed.

Excellent for background jobs. The retry history in errors is a standout feature — you can see the degradation pattern, not just the final failure.

DenoPermission-aware with flag suggestions
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Reading file without --allow-read permissionexcellent
error: Uncaught (in promise) PermissionDenied: Requires read access to "/etc/passwd", run again with the --allow-read flag
    at async Deno.readTextFile (ext:deno_fs/30_fs.js:742:10)
Names the exact permission, the exact flag to add, the exact resource being accessed. Couldn't be more actionable.
Importing npm package without proper configgood
error: Module not found "npm:express@4.18.2".
If you're using an npm package, make sure you have an import map or deno.json configured.
Module path shown, config fix suggested. Could link to the deno.json docs but the error message is complete.
Best Pattern

Permission errors always include the exact --allow-X flag and the resource path. Deno's security model could be confusing — these errors make it learnable.

Worst Pattern

TypeScript type errors from Deno's built-in checker can be verbose and hard to distinguish from your own code's type errors.

Permission-related errors are best-in-class. The model of 'error says exactly what to allow' is perfect for a sandboxed runtime.

SvelteKitFramework-specific with file attribution
A
Clarity
9
Actionability
8
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Importing server-only module in a client componentexcellent
Error: Cannot import $lib/server/db in client-side code
The module at "$lib/server/db" is only available on the server.
This was imported from "src/routes/+page.svelte".
Names the module, explains the constraint, traces the import origin. Framework-specific context makes this actionable without googling.
Load function with missing return statementexcellent
SvelteKitError: 'load' function in 'src/routes/blog/+page.ts' must return a plain object.
Got: undefined
File name, function name, what was expected, what was received. Perfect error for a common beginner mistake.
Best Pattern

Server/client boundary errors name the offending import and trace its origin file — a lesson in how to write framework errors.

Worst Pattern

Hydration mismatch errors are less specific than they could be about which component caused the mismatch.

Among the best DX in modern meta-frameworks. Errors are written for developers, not stack traces.

Better AuthTyped APIError with code and status
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Sign-in attempt with wrong credentialsexcellent
APIError: INVALID_EMAIL_OR_PASSWORD
status: 401
message: Invalid email or password
Code, status, and human message all present. Client receives the same shape for consistent handling.
Missing secret on initializationexcellent
BetterAuthError: secret is required. Please set the secret in the auth config or BETTER_AUTH_SECRET environment variable.
Tells you both ways to fix it — config field or env var name. No googling required.
Best Pattern

Server-side errors are typed APIError instances; client mirrors the same shape via SDK.

Worst Pattern

Plugin compatibility errors can be terse when two plugins disagree on hooks.

Shape-consistent across server and client. Plugin system extends error codes coherently.

WorkOSTyped errors with codes and request IDs
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Calling Directory Sync without organization_idexcellent
WorkOSError: organization_id is required
  code: 'invalid_request'
  status: 422
  requestId: 'req_xxx'
Code, status, and request ID. SDK throws typed exceptions. Easy to file support tickets with the requestId.
Expired SSO sessionexcellent
{
  "code": "sso_session_expired",
  "message": "The SSO session has expired. Please re-authenticate.",
  "status": 401
}
Specific code differentiates session expiry from other auth failures. Action is clear.
Best Pattern

Every error includes code, message, status, and request ID. SDK throws typed errors per category.

Worst Pattern

IdP-specific connection errors can echo upstream provider language verbatim.

Stripe-quality error design for enterprise auth. Consistent across SSO, Directory Sync, and AuthKit.

VitePlugin-tagged with file:line:col
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Importing a non-existent fileexcellent
[plugin:vite:import-analysis] Failed to resolve import "./missing.ts" from "src/main.ts". Does the file exist?

File: /Users/me/app/src/main.ts:3:18
Plugin name, file paths, line/column, and a helpful hint. Overlay in browser also points to the offending line.
Missing dependencygood
[vite] Internal server error: Pre-transform error: Failed to load url /node_modules/.vite/deps/react.js
Did you forget to install it?
Hints at the fix. Could be more direct about running npm install.
Best Pattern

In-browser error overlay shows source location and suggested fixes for HMR errors.

Worst Pattern

Some plugin errors lose attribution and show as 'internal server error' without context.

One of the best DX stories in modern build tools. The HMR overlay is a developer love letter.

OpenAI SDKTyped exceptions with structured error envelope
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Exceeding model context limitexcellent
BadRequestError: 400 {"error":{"message":"This model's maximum context length is 8192 tokens. However, your messages resulted in 8500 tokens.","type":"invalid_request_error","code":"context_length_exceeded"}}
Reports the limit and the actual count. Code field allows programmatic handling.
Hitting per-minute request limitexcellent
RateLimitError: 429 Rate limit reached for gpt-4 in organization org_xxx on requests per min. Limit: 200/min. Please try again in 200ms.
Tells you the model, the limit, and the suggested wait time. Production-friendly.
Best Pattern

Typed exception classes per error type. Every error includes message, type, and code.

Worst Pattern

Tool-call validation errors could be more specific about which argument failed schema.

The pattern many AI SDKs now copy. Streaming errors handled gracefully via async iteration.

MuxTyped errors with request IDs
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Creating asset with invalid input URLexcellent
MuxError: 422 {"error":{"type":"invalid_parameters","messages":["input.url is invalid"]}, "request_id": "req_xxx"}
Request ID for support tickets. Type and field-specific messages array. SDK throws typed exception.
Looking up missing playback IDexcellent
{"error":{"type":"playback_id_not_found","messages":["No playback ID matched the provided value"]}}
Error type names exactly what was not found. Easy to differentiate from other 404s.
Best Pattern

Stripe-inspired error envelope with type, messages, and request_id on every response.

Worst Pattern

Webhook signature validation errors could mention timestamp tolerance settings.

Video API errors are inherently tricky; Mux makes them debuggable.

TanStack QueryPlain English with concrete next steps
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
useQuery called outside QueryClientProviderexcellent
Error: No QueryClient set, use QueryClientProvider to set one
Tells you the exact missing piece and how to fix it in one sentence. Common beginner mistake handled gracefully.
useQuery without queryFnexcellent
Error: Missing queryFn for queryKey ["users", 1]

If you don't want to use a queryFn at this point, please pass enabled: false
Names the queryKey, explains the constraint, and offers the workaround. This is what every error should look like.
Best Pattern

Errors describe what is missing and offer the canonical fix in the same sentence.

Worst Pattern

Suspense + Query errors can require reading both libraries' docs.

v5 cleaned up many warnings. Devtools panel surfaces query errors clearly.

Anthropic SDKTyped error responses with SDK exceptions
A
Clarity
9
Actionability
9
Consistency
10
Helpfulness
9
Error CodesSuggested FixDoc Links
Empty messages arrayexcellent
BadRequestError: 400 {"type":"error","error":{"type":"invalid_request_error","message":"messages: at least one message is required"}}
Status, type, and human message all included. SDK throws a typed exception class for catch handling.
Hitting per-minute token limitexcellent
RateLimitError: 429 {"type":"error","error":{"type":"rate_limit_error","message":"Number of request tokens has exceeded your per-minute rate limit"}}
Distinguishes request tokens from output tokens. Retry-after header included for backoff.
Best Pattern

Each error has type, message, and HTTP status. SDK exception classes per error type.

Worst Pattern

Tool-use validation errors could be more specific about which input field failed schema.

Mirrors OpenAI patterns with similar quality. Streaming errors are handled gracefully via the SDK.

GroqOpenAI-compatible error envelope
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Requesting a model that does not existexcellent
BadRequestError: 400 {"error":{"message":"The model 'llama-3-9999b' does not exist","type":"invalid_request_error","code":"model_not_found"}}
Echoes the user's input. Provides error code for programmatic handling. Type field matches OpenAI.
Hitting TPM limitexcellent
RateLimitError: 429 Rate limit reached for model llama-3.3-70b in organization org_xxx on tokens per minute (TPM): Limit 6000, Used 5800, Requested 500.
Specific numbers — limit, used, requested. Tells you exactly how much over you went.
Best Pattern

Rate limit errors include limit/used/requested values for accurate backoff.

Worst Pattern

Some streaming connection errors can be terse when the upstream model fails mid-response.

OpenAI-format errors mean existing handling code works without changes.

Polar.shTyped error classes from OpenAPI schema
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Creating product with invalid amountexcellent
{
  "type": "PolarRequestValidationError",
  "detail": [
    {
      "loc": ["body", "amount"],
      "msg": "Input should be greater than 0",
      "type": "greater_than"
    }
  ]
}
FastAPI-style validation with location array. SDK throws PolarRequestValidationError class for typed handling.
Looking up deleted productgood
{
  "type": "ResourceNotFound",
  "detail": "Product not found"
}
Clear and minimal. Could include the requested ID for debugging.
Best Pattern

Auto-generated SDK throws typed errors per schema. Validation errors include field paths.

Worst Pattern

Webhook signature errors could be more specific about timestamp vs hash mismatch.

Built on FastAPI so error format is consistent and well-structured.

KnockCoded errors with environment context
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Triggering missing workflowexcellent
KnockError: 422 {"code":"workflow_not_found","message":"Workflow with key 'welcome-email' not found in environment 'production'"}
Names the workflow key and the environment. Clear what is missing and where to add it.
Trigger missing recipient identifierexcellent
{"code":"invalid_recipient","message":"Recipient must include either user_id or object_id","status":422}
Tells you the two valid options. Beginners learn the model from the error.
Best Pattern

Errors educate the developer about valid recipients and channel configurations.

Worst Pattern

Channel-specific delivery errors (e.g. SES rejection) inherit upstream provider messages verbatim.

Notification-platform errors are inherently complex; Knock surfaces them well.

StytchTyped errors with request IDs
A
Clarity
9
Actionability
8
Consistency
9
Helpfulness
8
Error CodesSuggested FixDoc Links
Authenticating with bad credentialsexcellent
StytchError: 401 {"status_code":401,"request_id":"request-id-test-xxx","error_type":"unauthorized_credentials","error_message":"The credentials provided are invalid"}
Status, request ID, error type, and message all included. Easy support escalation with request_id.
Verifying a stale OTP codegood
{"error_type":"otp_code_not_found","error_message":"The provided OTP could not be found, or has expired"}
Two distinct cases combined into one error type — could distinguish expired vs not-found.
Best Pattern

Every error includes error_type, error_message, status_code, and request_id.

Worst Pattern

Some compound error types collapse multiple failure modes into one code.

Solid auth API errors. Documentation maps every error_type to recommended remediation.

PostmarkNumeric error codes with descriptive messages
A
Clarity
9
Actionability
9
Consistency
10
Helpfulness
9
Error CodesSuggested FixDoc Links
Sending to a hard-bounced recipientexcellent
{"ErrorCode": 406, "Message": "You tried to send to recipient(s) that have been marked as inactive."}
Postmark's numeric error codes are extensively documented. Each maps to a specific cause and fix.
Sending from unverified domainexcellent
{"ErrorCode": 300, "Message": "Invalid 'From' address: noreply@unverified.com is not a verified Sender Signature"}
Pinpoints the exact field and the exact requirement. New devs learn the model from this error.
Best Pattern

Numeric ErrorCode values are stable and indexed in docs. Each has a dedicated explanation.

Worst Pattern

Bulk send errors aggregate per-message failures into one response, requiring extra parsing.

One of the most thoughtful error catalogs in the email space. Errors map 1:1 to docs pages.

WorkOS AuthKitCoded errors per product area
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Reusing an OAuth codeexcellent
WorkOSError: invalid_authorization_code
  message: 'The authorization code has expired or has already been used'
  status: 422
Names the OAuth-specific failure mode precisely. Tells you both possible causes.
Reading a directory that does not existexcellent
{
  "code": "directory_not_found",
  "message": "Directory dir_xxx does not exist or you do not have access",
  "status": 404
}
Combines 'not found' and 'no access' clearly without leaking existence info.
Best Pattern

Distinct codes for OAuth vs Directory vs Organization errors.

Worst Pattern

JWT validation errors don't always specify which claim failed.

AuthKit's error layer translates upstream IdP errors into WorkOS taxonomy.

Dub.coCoded errors with doc URLs
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Creating link with invalid URLexcellent
DubApiError: 422 {"error":{"code":"unprocessable_entity","message":"Validation failed","doc_url":"https://dub.co/docs/api-reference/errors#unprocessable-entity"}}
Doc URL on every error. Code is stable and documented. SDK throws typed exceptions.
Creating link with duplicate keyexcellent
{"error":{"code":"conflict","message":"Link with key 'launch' already exists in this domain","doc_url":"https://dub.co/docs/api-reference/errors#conflict"}}
Names the conflicting key and the affected scope (domain). Conflict resolution path is obvious.
Best Pattern

Stripe-style errors with code, message, and doc_url on every response.

Worst Pattern

Bulk operations could include per-item error indexes.

OpenAPI-generated SDK gives consistent error class hierarchy across languages.

Better AuthTyped error classes with messages
A
Clarity
9
Actionability
9
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Missing database adapter dependencyexcellent
BetterAuthError: Database adapter "drizzle" requires the "drizzle-orm" package. Install it with: npm install drizzle-orm
Names the missing package and gives the exact install command.
Missing OAuth credentialsgood
BetterAuthError: OAuth provider "github" requires clientId and clientSecret. Set GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET environment variables.
Tells you exactly which env vars to set. Could link to GitHub OAuth app creation.
Best Pattern

Errors name the specific config field or dependency that's missing and suggest the fix.

Worst Pattern

Session validation errors are sometimes generic — 'Invalid session' without specifying why.

Great DX for setup errors. Runtime auth errors are clear. Plugin errors include the plugin name in context.

ConvexStructured with function context and schema validation
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Query with missing required argumentexcellent
ConvexError: [QUERY] messages:list
  Argument validation failed:
    Expected { channelId: v.id("channels") } but got { channelId: undefined }
Names the function, shows the schema, and what was actually received.
Referencing deleted documentgood
Server Error: Document with ID "messages:abc123" not found in table "messages"
Includes table name and document ID. Clear what went wrong.
Best Pattern

Function name, argument schema, and actual value shown together. Dashboard links to the exact function.

Worst Pattern

Internal Convex platform errors are opaque — 'Internal Server Error' without details.

Dashboard shows errors in real-time with stack traces. Validator errors are excellent. Platform errors (rare) are less helpful.

OpenRouterJSON with codes and metadata
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Rate limit hitexcellent
{
  "error": {
    "code": 429,
    "message": "Rate limit exceeded for model anthropic/claude-3.5-sonnet. Retry after 2.3s.",
    "metadata": { "provider": "anthropic", "model": "claude-3.5-sonnet", "retry_after": 2.3 }
  }
}
Includes provider, model, and exact retry delay. Machine-actionable.
Out of creditsgood
{
  "error": {
    "code": 402,
    "message": "Insufficient credits. Add credits at https://openrouter.ai/credits"
  }
}
Direct link to add credits. Clear and actionable.
Best Pattern

Errors include provider, model, and metadata. Rate limits have retry_after field.

Worst Pattern

Some upstream provider errors pass through without OpenRouter context.

Excellent error design. Provider fallback errors explain which providers were tried and why each failed.

Trigger.devStructured task context with retry metadata
A
Clarity
9
Actionability
8
Consistency
8
Helpfulness
9
Error CodesSuggested FixDoc Links
Task step failure with retryexcellent
TriggerError: Task "send-email" failed at step "validate-recipient"
  Attempt 2/3 | Next retry in 30s
  Error: Invalid email format: "not-an-email"
Task name, step name, attempt count, retry timing, and the actual error. Full context.
Triggering non-existent taskexcellent
TriggerDevError: Cannot find task "process-order" in your project. Available tasks: send-email, sync-data, generate-report
Lists available tasks. You can immediately see if it's a typo.
Best Pattern

Task errors include task name, step name, attempt number, and retry schedule.

Worst Pattern

Build errors during deployment sometimes show raw esbuild output.

Dashboard shows full error timeline per run. Step-level errors are excellent. Dev server errors are actionable.

InngestStructured with retry semantics and function context
A
Clarity
9
Actionability
9
Consistency
9
Helpfulness
9
Error CodesSuggested FixDoc Links
Non-retriable step failureexcellent
InngestError: Function "user/signup.welcome-email" failed at step "send-email"
  NonRetriableError: Resend API key is invalid
  This step will NOT be retried.
Function ID, step name, error type (non-retriable vs retriable), and clear retry behavior.
Sending unregistered eventexcellent
InngestError: Event "user.signup" does not match any registered function.
  Registered events: user.created, order.placed, invoice.paid
Lists registered events so you can spot typos immediately.
Best Pattern

Errors distinguish retriable vs non-retriable, include function/step context, and list available options.

Worst Pattern

Dev server startup errors with wrong serve handler can be confusing.

Dev server shows errors in real-time with replay. Production errors are just as detailed. Event-driven errors list available events.

Next.jsDev overlay + terminal
B+
Clarity
8
Actionability
7
Consistency
6
Helpfulness
8
Error CodesSuggested FixDoc Links
Using React hook in Server Componentexcellent
Error: useState only works in Client Components. Add the "use client" directive at the top of the file to use it.
Tells you the exact issue and the exact fix. This is how framework errors should work.
Bad export in page.tsxbad
Error: Unsupported Server Component type: undefined. This might happen if you meant to export a component but accidentally exported a constant or undefined value.
Somewhat helpful but 'might happen' is vague. RSC errors are still a pain point.
Best Pattern

Dev overlay with source-mapped stack traces and quick-fix suggestions for common mistakes.

Worst Pattern

React Server Component errors can be cryptic. 'Cannot access X on the server' without explaining which import chain caused it.

Dev mode errors are great. Production errors are stripped. RSC boundary errors are still confusing for newcomers.

SanityFormatted text with code pointers
B+
Clarity
8
Actionability
7
Consistency
7
Helpfulness
8
Error CodesSuggested FixDoc Links
Malformed GROQ query syntaxexcellent
Error: GROQ query parse error:
  *[_type == "post" && {]
                       ^
  Expected expression but found "{"
Points to the exact character in your query with a caret. Shows what was expected vs found. Textbook error format.
Invalid reference field in schema definitionexcellent
Schema error in document type "post":
  Field "author" references type "reference" but "to" is not defined.
  Did you mean: { type: 'reference', to: [{ type: 'author' }] }
Shows the exact field, explains what's wrong, and suggests the correct syntax. Schema errors that teach you the API.
Best Pattern

GROQ parse errors with caret positioning and schema errors with suggested fixes are genuinely excellent.

Worst Pattern

Real-time listener disconnection errors are vague — 'connection lost' without retry guidance.

Studio errors are some of the best in the CMS space. GROQ query errors rival Prisma for clarity. API errors are more standard.

ESLintfile:line:col with rule names
B+
Clarity
8
Actionability
8
Consistency
8
Helpfulness
8
Error CodesSuggested FixDoc Links
Running ESLint on a file with violationsexcellent
/src/App.tsx
  15:7  error  'useState' is defined but never used  no-unused-vars
  22:3  warning  Unexpected console statement     no-console

✖ 2 problems (1 error, 1 warning)
File, line:column, severity, message, and rule name. The rule name is the key — you can look it up or disable it.
Missing ESLint plugin dependencygood
ESLint couldn't find the plugin "@typescript-eslint/eslint-plugin".
(The package "@typescript-eslint/eslint-plugin" was not found when loaded as a Node module from the directory "/app".)
Names the package and the resolution directory. Could also suggest the install command but the package name is enough.
Best Pattern

Rule name in every violation enables quick lookup, targeted disable, and config adjustment. Line:column precision.

Worst Pattern

Flat config migration errors (v8 → v9) can be confusing when mixing old and new config formats.

The standard for linter error formatting. Rule names as error codes is a pattern every tool should copy. Auto-fix for many rules is a bonus.

BunNode-compatible runtime errors, inconsistent bundler errors
B+
Clarity
8
Actionability
8
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Importing a file that doesn't existgood
error: Cannot find module './utils' from 'src/index.ts'
    at require ('bun:wrap')
    at /home/user/project/src/index.ts:3:18
Clear message with file:line:col. 'from' field tells you where the import originated. Standard node-style but with Bun source attribution.
Syntax error in JSXbad
BuildMessage {
  message: "Unexpected ">"
  level: "error"
  position: { line: 12, column: 8 }
}
Gives position as an object rather than inline file:line:col. No file name in the output. Feels like debugging a JSON log.
Best Pattern

Runtime errors match Node.js conventions — familiar to anyone who has used Node.

Worst Pattern

Bundler errors expose internal data structures instead of human-readable messages.

Good for runtime errors, rough edges on build/bundler errors. Improving with each release.

PrismaNamed error classes with P-codes
B+
Clarity
8
Actionability
8
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Updating a record that doesn't existgood
PrismaClientKnownRequestError: 
  Invalid `prisma.user.findUnique()` invocation:

  An operation failed because it depends on one or more records that were required but not found. Record to update not found.
Names the model and method. 'Record to update not found' is clear. Could include the where clause values for faster debugging.
Database server not runningexcellent
PrismaClientInitializationError: Can't reach database server at 'localhost:5432'
Please make sure your database server is running at 'localhost:5432'.
Repeats the connection string so you can verify it. Suggests the likely fix. One of Prisma's better error messages.
Best Pattern

Error P codes (P2002 for unique constraint etc.) let you programmatically handle specific database errors.

Worst Pattern

Schema migration errors can be cryptic when there are circular relations or complex composite types.

Good overall. P-error codes are useful for error handling in application code. Migration errors are the weak spot.

Trigger.devTask-attributed with run IDs and dashboard links
B+
Clarity
8
Actionability
8
Consistency
7
Helpfulness
8
Error CodesSuggested FixDoc Links
Task throwing a JavaScript errorexcellent
TriggerError: Task "process-invoice" failed in run rn_abc123.
  Error: Cannot read properties of null (reading 'amount')
  at processInvoice (src/trigger/invoice.ts:34:18)
  Run link: https://cloud.trigger.dev/runs/rn_abc123
Task name, run ID, file:line, and a direct link to the run in the dashboard. The run link is the killer feature.
SDK version out of dateexcellent
TriggerError: API version mismatch. Your SDK is v3.0.1 but the server expects v3.1.x.
Run: npm install @trigger.dev/sdk@latest
Both versions shown, exact fix with the install command. You're done in 30 seconds.
Best Pattern

Run links in errors let you jump directly to the run's full logs, timing breakdown, and retry history.

Worst Pattern

Concurrency limit errors could include current queue depth to help you tune the limits.

Strong DX focus is visible in error design. Run links make the gap between error and debugging near zero.

ElysiaStructured JSON for validation, raw errors for lifecycle
B+
Clarity
8
Actionability
7
Consistency
8
Helpfulness
8
Error CodesSuggested FixDoc Links
Request body validationexcellent
VALIDATION_ERROR: Expected string at 'body.name' but got undefined
{
  "type": "validation",
  "on": "body",
  "property": "name",
  "expected": "string"
}
Structured JSON with type, location, property, expected value. Machine-readable and human-readable.
Plugin applied in wrong orderbad
TypeError: Cannot read properties of undefined (reading 'derive')
Plugin ordering issues produce raw TypeErrors. No Elysia-specific guidance.
Best Pattern

Validation errors are structured JSON with exact field path and expected type.

Worst Pattern

Plugin lifecycle errors are raw TypeErrors without framework context.

Validation DX is excellent thanks to TypeBox integration. Framework internals could use better error boundaries.

tRPCTyped error codes with nested validation details
B+
Clarity
8
Actionability
8
Consistency
8
Helpfulness
8
Error CodesSuggested FixDoc Links
Calling procedure with invalid inputexcellent
TRPCClientError: 
  [BAD_REQUEST] Input validation failed
  path: user.create
  {
    "code": "invalid_type",
    "expected": "string",
    "received": "undefined",
    "path": ["email"]
  }
Includes procedure path, Zod validation error with field path, expected and received types.
Calling protected procedure without authgood
TRPCClientError: [UNAUTHORIZED]
  You must be logged in to perform this action
Clear code and message. Could suggest how to pass auth context.
Best Pattern

Zod validation errors flow through with full field paths and type expectations.

Worst Pattern

Custom procedure errors depend on what the developer throws — tRPC doesn't enforce quality.

Error quality depends heavily on Zod schemas. Framework errors (BAD_REQUEST, UNAUTHORIZED) are consistent. Custom errors vary.

MintlifyCLI build errors with suggestions
B+
Clarity
8
Actionability
8
Consistency
8
Helpfulness
8
Error CodesSuggested FixDoc Links
Broken navigation referenceexcellent
[mintlify] Error in mint.json: "navigation" group "API Reference" references page "api/users" which does not exist.
  Available pages in api/: api/auth, api/projects, api/billing
Names the broken reference and lists available pages. Immediately fixable.
Using wrong component nameexcellent
[mintlify] MDX compilation error in docs/quickstart.mdx:15
  Unknown component <Callout>. Did you mean <Note>?
Line number, file path, and a suggestion. Great DX.
Best Pattern

Build errors reference the exact file, line, and suggest alternatives.

Worst Pattern

Some OpenAPI parsing errors show raw YAML parse failures without pointing to the issue.

Dev server errors are excellent — they point to the exact config or MDX issue. Deployment errors are less detailed.

DubJSON with codes and doc URLs
B+
Clarity
8
Actionability
8
Consistency
8
Helpfulness
8
Error CodesSuggested FixDoc Links
Creating link with unconfigured domainexcellent
{
  "error": {
    "code": "domain_not_found",
    "message": "Domain 'example.com' is not configured. Add it in your Dub dashboard.",
    "doc_url": "https://dub.co/docs/api-reference/domains"
  }
}
Error code, message with context, and doc link. All you need.
Rate limitgood
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "Rate limit exceeded. Retry after 1s.",
    "retry_after": 1
  }
}
Includes retry_after. Machine-actionable.
Best Pattern

Errors include error codes, doc URLs, and actionable messages.

Worst Pattern

Some bulk operation errors don't specify which item in the batch failed.

Follows Stripe-like error patterns. Well-designed API errors with consistent format.

VercelPlain text with error codes
B
Clarity
7
Actionability
7
Consistency
6
Helpfulness
7
Error CodesSuggested FixDoc Links
Deploying oversized functiongood
Error: The Serverless Function "api/hello" is 58mb which exceeds the maximum size limit of 50mb.
Clear numbers, specific function name. You know exactly what to fix.
Serverless function timeout in productionbad
Error: FUNCTION_INVOCATION_TIMEOUT
Task timed out after 10.00 seconds
No request ID, no function name, no stack trace. Which function? What was it doing? Good luck.
Best Pattern

Build errors with specific file paths and size limits are genuinely helpful.

Worst Pattern

Runtime errors in production logs are stripped of context. FUNCTION_INVOCATION_TIMEOUT tells you nothing.

Build errors are decent. Runtime/deployment errors can be maddeningly vague. Edge runtime errors are worse.

SupabaseJSON (mixed PostgREST + Postgres)
B
Clarity
7
Actionability
6
Consistency
6
Helpfulness
7
Error CodesSuggested FixDoc Links
Invalid JWT token in API requestbad
{
  "code": "PGRST301",
  "details": null,
  "hint": null,
  "message": "JWSError JWSInvalidSignature"
}
PGRST301? JWSError? This is PostgREST internals leaking through. Normal devs shouldn't see this.
Inserting duplicate emailgood
{
  "code": "23505",
  "details": "Key (email)=(test@test.com) already exists.",
  "hint": null,
  "message": "duplicate key value violates unique constraint \"users_email_key\""
}
Postgres error but at least it tells you the exact column and value. The constraint name helps.
Best Pattern

Auth errors from GoTrue are clear and well-structured with proper HTTP codes.

Worst Pattern

Raw Postgres error codes (23505, 42501) leak through PostgREST with no translation layer.

Two layers of errors: GoTrue auth (good) and PostgREST/Postgres (raw). RLS errors are especially cryptic.

AlgoliaJSON with message
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
6
Error CodesSuggested FixDoc Links
Wrong API keygood
{
  "message": "Invalid Application-ID or API key",
  "status": 403
}
Clear about the problem. Could be better by specifying which one is wrong (App ID vs API key).
Empty index name in querygood
{
  "message": "indexName is not valid. Expected a non-empty string.",
  "status": 400
}
Identifies the parameter, states the constraint. Simple and effective.
Best Pattern

Consistent JSON format with clear parameter validation messages.

Worst Pattern

Rate limiting errors don't tell you your current usage or when to retry.

Consistent and readable. Not spectacular but never terrible. Missing error codes and retry-after headers.

TwilioJSON with codes and doc links
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Sending SMS to invalid numbergood
{
  "code": 21211,
  "message": "The 'To' number +1555INVALID is not a valid phone number.",
  "more_info": "https://www.twilio.com/docs/errors/21211",
  "status": 400
}
Error code, clear message, doc link. The doc link is the saving grace — errors alone can be terse.
API call without authgood
{
  "code": 20003,
  "message": "Authentication Error - No credentials provided",
  "more_info": "https://www.twilio.com/docs/errors/20003",
  "status": 401
}
Clear but you basically need to visit the docs link every time to understand what to do.
Best Pattern

Every error has a numeric code and a link to a dedicated docs page with troubleshooting steps.

Worst Pattern

Error messages are short and sometimes cryptic — the real help is always behind the docs link.

Twilio's error directory is great but you're always one click away from understanding. Messages alone are often not enough.

NeonNeonDbError wrapping Postgres messages
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Connecting without SSL in productiongood
NeonDbError: connection is insecure (try using `sslmode=require`)
  at /app/node_modules/@neondatabase/serverless/index.js
Tells you the exact sslmode flag to add. Actionable even if the stack trace is noisy.
Query on a suspended free-tier endpointgood
NeonDbError: endpoint is disabled
Hint: The compute endpoint has been suspended due to inactivity. It should resume automatically.
Clear about what happened and that it auto-resumes. Rare: an error that explains itself without panic.
Best Pattern

Postgres errors come through with the original detail intact plus Neon-specific hints for cloud-specific issues.

Worst Pattern

WebSocket connection errors during cold starts show raw protocol messages that look alarming but are usually transient.

Above-average for a database SDK. Neon-specific errors have actionable hints. Raw Postgres errors still require lookup.

HonoHTTPException + Zod passthrough
B
Clarity
7
Actionability
6
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Request hitting a protected route without a valid tokenbad
HTTPException: Unauthorized
  status: 401
  message: "Unauthorized"
Technically correct but tells the developer nothing about what's missing — no token, expired token, wrong scope?
Missing required body field in Zod-validated endpointexcellent
ZodError: [
  {
    "code": "invalid_type",
    "expected": "string",
    "received": "undefined",
    "path": ["body", "email"],
    "message": "Required"
  }
]
Hono's Zod validator surfaces full ZodError — path, expected type, message. Exactly what the client needs to fix the request.
Best Pattern

Zod validator integration gives detailed, path-aware validation errors that bubble up cleanly to the response.

Worst Pattern

HTTPException is a blank slate — framework throws it correctly but messages are whatever the developer set (often nothing).

Framework-level error quality depends heavily on middleware used. Zod integration is excellent; bare HTTPException is thin.

DrizzleDrizzleError wrapper + raw Postgres passthrough
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Querying a column that was renamed in the schemaexcellent
DrizzleError: Column "userId" does not exist
Hint: Available columns: id, email, name, createdAt
Lists the available columns right in the error. No schema-diving required.
Running queries before migrationsbad
PostgresError: relation "users" does not exist
  code: '42P01'
Raw Postgres error passes through. Drizzle could detect 'table not found' and suggest running migrations, but doesn't.
Best Pattern

Schema introspection errors (wrong column, wrong table) leverage Drizzle's compile-time type info to list valid alternatives.

Worst Pattern

Postgres driver errors pass through with raw codes. Migration-related errors get no Drizzle-layer interpretation.

Better than most ORMs for schema-related errors. Driver errors still require knowing Postgres error codes. No doc links in errors.

SentryCLI text with suggested fixes
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Running sentry-cli without authexcellent
SentryCliError: Authentication credentials were not provided. Use `sentry-cli login` or set SENTRY_AUTH_TOKEN environment variable.
Two solutions in one error — CLI login or env var. Tells you exactly how to fix it.
Uploading source maps without release namegood
Error: Could not determine release name. Please pass --release or set SENTRY_RELEASE.
Clear about what's missing and two ways to provide it. Source map workflow errors are decent.
Best Pattern

CLI errors consistently suggest the fix — either a flag or an environment variable.

Worst Pattern

SDK initialization errors in the browser are swallowed silently. DSN typos produce no visible error.

CLI errors are excellent. SDK errors are intentionally silent (monitoring shouldn't break your app). API errors are standard REST.

ContentfulJSON with sys.id error type
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Fetching a deleted or unpublished entrygood
{
  "sys": { "type": "Error", "id": "NotFound" },
  "message": "The resource could not be found.",
  "details": { "type": "Entry", "id": "abc123", "space": "my-space" }
}
Includes the resource type, ID, and space. You know what's missing and where to look.
Updating an entry that was modified by another userbad
{
  "sys": { "type": "Error", "id": "VersionMismatch" },
  "message": "Version mismatch error. The version you specified was incorrect. This may be due to someone else editing the content."
}
Tells you the version is wrong but not what the current version is. You have to fetch the entry again to find out.
Best Pattern

Resource errors include sys.id as machine-readable error type plus the affected entity details.

Worst Pattern

Version mismatch errors don't include the current version, forcing an extra API call every time.

Consistent JSON structure across the API. Resource identification is good. Conflict resolution errors could use more guidance.

SonarQubeStructured findings with effort estimates
B
Clarity
7
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Static analysis detecting potential null dereferenceexcellent
Bug: "NullPointerException" will be thrown when invoking method "getName()"
  src/User.java:42
  Why is this an issue? When "user" is null (see line 38), calling getName() will throw.
  Effort: 5min
References the exact line, explains the data flow, links to where the null originates, and estimates fix effort. Teaching through analysis.
Function exceeding complexity thresholdbad
Code Smell: Refactor this function to reduce its Cognitive Complexity from 23 to the 15 allowed.
Tells you the number but not which parts of the function contribute most to complexity. You have to analyze the whole function yourself.
Best Pattern

Bug and vulnerability reports with data flow analysis showing exactly how the issue can be triggered.

Worst Pattern

Code smell messages cite metrics without showing which specific code patterns are driving the score up.

Analysis depth is impressive for bugs and vulnerabilities. Code smell messages feel too metric-driven and not actionable enough.

StorybookPrefixed error codes with config suggestions
B
Clarity
7
Actionability
6
Consistency
6
Helpfulness
7
Error CodesSuggested FixDoc Links
Missing framework config after initexcellent
SB_BUILDER-VITE_0001: Storybook could not detect your project type.
Please set the "framework" field in your .storybook/main.ts:
  framework: '@storybook/react-vite'
Error code, clear message, and the exact config to add with the file path. Newer Storybook errors are great.
Missing Storybook dependencybad
Cannot find module '@storybook/react' from 'src/Button.stories.tsx'
Standard Node module resolution error. Storybook doesn't intercept to suggest 'npx storybook@latest init' or the correct install command.
Best Pattern

v7+ errors with SB_ prefixed codes include the exact config change needed.

Worst Pattern

Dependency and bundler errors pass through without Storybook-level interpretation. Webpack/Vite config conflicts are painful.

Storybook 7+ errors dramatically improved over v6. Framework detection and config errors are now excellent. Build errors still pass through raw.

Tailwind CSSTerminal warnings with doc links
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Empty content array in tailwind.config.jsexcellent
warn - The `content` option in your Tailwind CSS configuration is missing or empty.
warn - Configure your content sources or your generated CSS will be empty.
warn - https://tailwindcss.com/docs/content-configuration
States the problem, explains the consequence, and links to the exact docs page. Warning that prevents the #1 Tailwind gotcha.
Using a class from a newer Tailwind versiongood
The 'bg-blue-950' class does not exist. If 'bg-blue-950' is a custom class, make sure it is defined within a @layer directive.
Identifies the class and suggests the custom class route. Could also mention checking the Tailwind version.
Best Pattern

Content configuration warnings with doc links prevent the most common setup mistake.

Worst Pattern

Missing class errors don't distinguish between typos, wrong version, and genuinely custom classes.

v3 errors are solid. The IntelliSense plugin catches most issues in the editor before you even see terminal warnings.

Cloudflare WorkersCLI formatted with error codes
B
Clarity
7
Actionability
7
Consistency
6
Helpfulness
7
Error CodesSuggested FixDoc Links
Using Node.js API without compatibility flagexcellent
✘ [ERROR] Could not resolve "node:crypto"
  The package "node:crypto" was not found on the file system, and is not a known Node.js built-in.
  Hint: Enable Node.js compatibility with:
    compatibility_flags = ["nodejs_compat"]
  in your wrangler.toml
Shows the exact module, explains why it failed, and provides the exact config to add. wrangler errors improved massively.
Deploying a worker that exceeds size limitbad
✘ [ERROR] A request to the Cloudflare API failed.
  workers.api.error.script_too_large [code: 10027]
Error code is there but no size numbers — how big is the script? What's the limit? You have to look up code 10027.
Best Pattern

Node.js compatibility errors with exact wrangler.toml config to fix them are excellent developer experience.

Worst Pattern

API errors pass through with numeric codes but no inline explanation or size/limit details.

wrangler v3 errors are a big improvement. Local dev errors are great. Deployment API errors are still terse and require code lookup.

Vercel Postgres (Neon)VercelPostgresError with named codes
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Missing database URL environment variableexcellent
VercelPostgresError: VercelPostgresError - 'missing_connection_string': You did not supply a 'connectionString' and no 'POSTGRES_URL' env var was found.
Names both options (parameter and env var), identifies the exact env var name. You know immediately what to set.
Malformed connection stringgood
VercelPostgresError: VercelPostgresError - 'invalid_connection_string': The connection string is not a valid URL.
Clear about what's wrong but doesn't show the expected format. A regex example or valid URL template would help.
Best Pattern

Missing config errors list both the programmatic and env var approaches to provide the value.

Worst Pattern

Connection string format errors don't show the expected format or an example.

Thin wrapper around Neon with Vercel-specific error codes for config issues. Postgres errors pass through from Neon unchanged.

AppwriteAppwriteException with typed codes
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Calling account API without authenticationgood
AppwriteException: User (role: guests) missing scope (account)
  code: 401
  type: general_unauthorized_scope
Shows the role, the missing scope, and a typed error. You know what permission is needed.
Creating a document with a duplicate IDgood
AppwriteException: Document with the requested ID already exists.
  code: 409
  type: document_already_exists
Clear message and typed error code. Doesn't show the conflicting ID, which would be more helpful.
Best Pattern

Typed error codes (general_unauthorized_scope, document_already_exists) are searchable and machine-readable.

Worst Pattern

Self-hosted Docker errors during setup mix Appwrite errors with raw Docker/Traefik errors — hard to distinguish.

Consistent error structure across all SDK methods. Error types are descriptive. Self-hosted setup errors are the weak point.

TurborepoCLI text with JSON config suggestions
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Running a task not defined in turbo.jsonexcellent
x Could not find "build" in turbo.json pipeline.
  If you want to run "build" as a task, add it to turbo.json:
  {
    "tasks": {
      "build": {}
    }
  }
Names the missing task and shows the exact JSON to add. Config errors that write the fix for you.
Environment variable not declared in task configexcellent
WARNING: "NEXT_PUBLIC_API_URL" is included in "dependsOn" but is not listed in "env".
  Add it to the "env" key of the "build" task in turbo.json.
Identifies the variable, the task, and tells you exactly where to add it. Cache safety warnings done right.
Best Pattern

Missing task and env var errors include the exact turbo.json snippet needed to fix them.

Worst Pattern

Cache miss reasons could be more detailed — 'cache miss' doesn't explain which input changed.

Turbo's errors are surprisingly good for a build tool. Config mistakes are caught early with actionable fixes. Cache debugging could improve.

tRPCHTTP-style codes with router paths
B
Clarity
7
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Calling a mutation as a querygood
TRPCClientError: No "query"-procedure on path "user.getById"
    at TRPCClientError.from (client.js:78)
Names the path and wrong procedure type. You know exactly which router entry to look at.
Calling a protected procedure without authgood
TRPCError: UNAUTHORIZED
  message: "You must be logged in to do this"
Standard HTTP-style error code with a custom message from your middleware. Clear enough — just follows your own message conventions.
Best Pattern

Router path in errors (user.getById) maps 1:1 to your source code. No guessing which procedure failed.

Worst Pattern

Zod input validation errors lose their structure when passed through tRPC — you get a flat message string instead of the full ZodError.

Works well for procedure-level errors. Input validation error formatting is a known pain point — consider using error formatters to preserve Zod structure.

UpstashRedis passthrough + HTTP status codes
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
6
Error CodesSuggested FixDoc Links
Malformed Redis commandgood
UpstashError: ERR wrong number of arguments for 'set' command
Passes through Redis error verbatim. Familiar to anyone who knows Redis. Not Upstash-specific info but the underlying error is clear.
Invalid REST tokenbad
UpstashError: Unauthorized
Just 'Unauthorized'. No hint whether URL is wrong, token is wrong, or token is expired. Needs a status code at minimum.
Best Pattern

Redis command errors are faithful passthroughs — familiar and unambiguous for Redis users.

Worst Pattern

Authentication errors are bare 401s with no additional context about what credential is invalid.

Functional but minimal. Auth errors need improvement. Rate limit errors include the limit values which is helpful.

AxiomDescriptive with dashboard links
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
6
Error CodesSuggested FixDoc Links
Ingesting to a dataset that hasn't been createdexcellent
AxiomError: Dataset 'my-logs' does not exist. Create it at https://app.axiom.co/datasets
Names the dataset, links to the exact place to fix it. Can't ask for more.
Sending log events without a timestamp fieldgood
AxiomError: Request failed with status 422: field '_time' is required
Status + field name. Not immediately obvious that Axiom expects _time to be an ISO string — could be clearer.
Best Pattern

Resource-not-found errors link directly to the dashboard section where you create the resource.

Worst Pattern

Ingest format errors are terse — field name is given but expected format/type is not.

Above average for an observability tool. The SDK wraps HTTP errors cleanly. Query errors from APL could be more descriptive.

Payload CMSNamed error classes with field attribution
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
6
Error CodesSuggested FixDoc Links
REST API call to a collection not defined in configexcellent
PayloadError: The collection "products" does not exist. Check your payload.config.ts and ensure the slug matches.
Names the collection, points to the exact file and field to check. Can't ask for more.
Creating a document with invalid fieldsgood
ValidationError: The following field(s) failed validation:
  - title: This field is required
  - price: Value must be a number
Field-level errors with messages. Clean enough to surface directly in admin UI or API responses.
Best Pattern

Collection-not-found errors reference the config file directly — great for new users who mistype slugs.

Worst Pattern

Plugin compatibility errors can be cryptic when two plugins conflict in payload.config.ts.

Solid for a CMS. REST API errors are clean and consistent. Admin UI surfaces validation errors properly.

Drizzle ORMDriver errors plus DrizzleError class
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Querying renamed columngood
error: column "users.email" does not exist
  at /node_modules/postgres/cjs/src/connection.js:783:26
  Code: 42703
Postgres error code is preserved. Column name is explicit. But no hint about schema sync.
Misconfigured relationexcellent
DrizzleError: Cannot use `relations` with `one` without specifying fields and references.
Names the misuse precisely. Explains what is required to make the relation valid.
Best Pattern

Schema-time errors mention which table and field is misconfigured.

Worst Pattern

Runtime SQL errors pass through unchanged from the underlying driver.

Quality depends on which driver. drizzle-kit migration errors are clearer than runtime errors.

ReplicateApiError class plus raw prediction logs
B
Clarity
8
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Missing required model inputgood
ApiError: 422 {"detail":"Input validation failed","errors":{"prompt":["This field is required"]}}
Field-level error mapping. Could include the model's full input schema for context.
Model exceeded GPU memorygood
Prediction failed: CUDA out of memory. Tried to allocate 24.00 GiB. GPU 0 has a total capacity of 23.69 GiB.
Surfaces the underlying CUDA error from the prediction logs. Honest but not user-friendly for non-ML devs.
Best Pattern

API errors are structured by field. Prediction logs are streamed back as part of the error.

Worst Pattern

Model-specific errors leak underlying framework messages (PyTorch, transformers) without translation.

Quality depends on model author. Replicate-managed models tend to have cleaner errors than community uploads.

Lemon SqueezyJSON:API errors envelope
B
Clarity
7
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Lookup with invalid store IDgood
{
  "errors": [
    {
      "status": "404",
      "title": "Not Found",
      "detail": "The requested store could not be found"
    }
  ]
}
JSON:API conformant. Status, title, and detail are present. Could include the offending ID.
Creating product with invalid pricegood
{
  "errors": [
    {
      "status": "422",
      "source": {"pointer": "/data/attributes/price"},
      "detail": "Price must be greater than zero"
    }
  ]
}
JSON Pointer for field location. Standard JSON:API pattern. Tooling can map automatically.
Best Pattern

JSON:API spec compliance gives consistent shape across every endpoint.

Worst Pattern

Webhook delivery error messages in dashboard are less detailed than API responses.

Standard-compliant errors mean tools that speak JSON:API work out of the box.

CohereJSON error envelope with reason field
B
Clarity
8
Actionability
8
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Exceeding model token limitgood
CohereAPIError: 400 {"message":"too many tokens. Please specify a shorter prompt."}
Clear about the cause but doesn't report the actual count vs the limit.
Hitting trial rate limitexcellent
CohereAPIError: 429 {"message":"trial token rate limit exceeded, limit is 100 requests per minute","reason":"trial_token_rate_limit_exceeded"}
Tells you it's the trial limit specifically. The reason field is useful for branching.
Best Pattern

Rate limit errors distinguish trial from production limits clearly.

Worst Pattern

Token-count errors don't include actual usage numbers.

Improving with v2 API. Rerank and embed errors are more specific than chat errors.

TinybirdMix of Tinybird and ClickHouse exceptions
B
Clarity
8
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Querying a column that doesn't exist in the data sourcegood
{"error": "Code: 47, e.displayText() = DB::Exception: Missing columns: 'user_id' while processing query (version 23.x.x)"}
ClickHouse error code is preserved. Names the missing column. ClickHouse-specific terminology can confuse new users.
Calling pipe before publishing itexcellent
{"error":"Pipe 'top_users' has no published endpoint"}
Names the pipe and explains the lifecycle requirement. Quick fix is obvious.
Best Pattern

Tinybird-layer errors are clear; underlying ClickHouse errors retain their codes for advanced debugging.

Worst Pattern

Some ClickHouse exception messages leak through with C++-style internals.

Pipe and Data Source errors are well-designed; raw query errors depend on ClickHouse quality.

Stack AuthError classes with messages
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Missing project configurationgood
StackClientError: Missing NEXT_PUBLIC_STACK_PROJECT_ID environment variable. Get it from your Stack Auth dashboard.
Clear about what's missing and where to find it.
Wrong or expired API keybad
StackServerError: Invalid API key
Too generic. Doesn't say which key (publishable vs secret) or suggest checking the dashboard.
Best Pattern

Setup errors reference the dashboard and specific env var names.

Worst Pattern

API errors sometimes lack context — just status code and generic message.

Getting better with each release. Setup errors are good, runtime errors need more context.

HonoMix of middleware errors and raw runtime errors
B
Clarity
7
Actionability
6
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Wrong import stylebad
TypeError: app.get is not a function
// This often means you imported Hono incorrectly
Standard JS TypeError. Hono doesn't intercept this — you get raw runtime errors.
Request validation failuregood
[hono/validator] Validation failed:
- body.email: Expected string, received undefined
Validator middleware gives field-level errors. Clear path and expected type.
Best Pattern

Validator middleware errors are structured with field paths and expected types.

Worst Pattern

Framework-level errors are often raw TypeErrors — no Hono-specific context.

Minimalist framework means minimal error handling. Validation middleware is the exception — it's well-designed.

Drizzle ORMMix of Drizzle errors and raw database errors
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Calling drizzle without connectiongood
DrizzleError: No database connection. Make sure to pass a database client to drizzle().
Example: const db = drizzle(client)
Error includes an example of correct usage.
Query referencing unmigrated columnbad
error: column "user_id" does not exist
Raw Postgres error passes through. Drizzle doesn't add context about pending migrations.
Best Pattern

Setup errors include code examples showing correct usage.

Worst Pattern

SQL-level errors pass through raw from the database driver — no Drizzle context added.

Drizzle Kit migration errors are clearer than ORM runtime errors. SQL transparency means you get database errors directly.

TursoSQLite error codes with libSQL wrapper
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Inserting duplicate unique valuegood
LibsqlError: SQLITE_CONSTRAINT: UNIQUE constraint failed: users.email
SQLite error code, constraint type, and exact column. Standard SQLite quality.
Wrong auth tokenbad
Error: Failed to connect to database: unauthorized
Just 'unauthorized' — doesn't say which token or suggest checking the dashboard.
Best Pattern

SQL errors carry SQLite error codes and constraint details.

Worst Pattern

Connection and auth errors are vague — 'unauthorized' or 'connection refused' without guidance.

SQL-level errors are as good as SQLite itself. Connection layer errors need improvement. turso CLI errors are better.

LangfuseError classes with messages
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Wrong API keygood
LangfuseError: Failed to flush events. Status 401: Invalid API key. Check your LANGFUSE_SECRET_KEY.
Names the specific env var to check.
Referencing non-existent tracebad
LangfuseError: Trace not found: trace_abc123
Includes the trace ID but doesn't suggest possible causes (wrong project, deleted, not yet flushed).
Best Pattern

Auth errors name the specific environment variable to check.

Worst Pattern

SDK silently drops events on network errors by default — no error visible.

SDK is designed to not crash your app — errors are logged, not thrown. Good for production but bad for debugging.

HatchetMix of Hatchet errors and raw gRPC codes
B
Clarity
7
Actionability
6
Consistency
6
Helpfulness
7
Error CodesSuggested FixDoc Links
Workflow step failuregood
HatchetError: Workflow "order-processing" step "charge-payment" failed
  Error: Payment declined
Includes workflow and step names. The underlying error passes through.
Worker can't connect to enginebad
gRPC Error: UNAVAILABLE: failed to connect to worker. Is the Hatchet engine running?
gRPC errors leak through. The suggestion helps but the format is unfriendly.
Best Pattern

Workflow step errors include the full workflow/step path.

Worst Pattern

gRPC transport errors leak raw codes without user-friendly context.

Dashboard visualization of workflow failures is helpful. SDK errors are improving but gRPC layer needs wrapping.

OramaError classes with schema context
B
Clarity
8
Actionability
7
Consistency
8
Helpfulness
7
Error CodesSuggested FixDoc Links
Inserting document with wrong typeexcellent
OramaError: Property "title" is defined as "string" in schema but received "number"
Names the property, expected type from schema, and actual type received.
Searching on non-indexed fieldexcellent
OramaError: Cannot search on property "content" — not indexed. Indexed properties: title, description
Lists indexed properties so you can fix immediately.
Best Pattern

Schema validation errors name the exact property and show expected vs received types.

Worst Pattern

Vector search dimension mismatches give a numeric error without explaining embedding model expectations.

Schema-driven errors are excellent. Vector/hybrid search errors need more context about embedding dimensions.

PGliteStandard Postgres error codes
B
Clarity
7
Actionability
6
Consistency
8
Helpfulness
6
Error CodesSuggested FixDoc Links
SQL typogood
error: syntax error at or near "SELEC"
  at character 1
Standard Postgres error. Points to the character position.
Loading unavailable extensiongood
Error: Extension "pgvector" is not available. Available extensions: uuid-ossp, pg_trgm
Lists available extensions. Helpful for WASM environment limitations.
Best Pattern

Extension availability errors list what's actually available in the WASM build.

Worst Pattern

WASM initialization errors are opaque — memory and browser compatibility issues give generic failures.

You get real Postgres errors — same quality as any Postgres instance. WASM layer errors are the weak point.

Electric SQLError classes with sync context
B
Clarity
7
Actionability
6
Consistency
7
Helpfulness
6
Error CodesSuggested FixDoc Links
Subscribing to non-electrified tableexcellent
ElectricError: Shape subscription failed: table "messages" does not exist or is not electrified.
  Run: ALTER TABLE messages ENABLE ELECTRIC;
Tells you exactly what SQL to run.
Write conflict during syncbad
SyncError: Conflict detected on row messages/abc123. Local write rejected.
Names the row but doesn't explain the conflict resolution strategy or how to handle it.
Best Pattern

Setup errors include the exact SQL command to fix the issue.

Worst Pattern

Sync conflict errors are vague about what conflicted and how to resolve.

Setup and schema errors are helpful. Sync-layer errors (conflicts, connectivity) need more context for debugging.

PolarJSON with FastAPI validation format
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Invalid price in product creationgood
{
  "error": "validation_error",
  "detail": [{ "loc": ["body", "price_amount"], "msg": "value is not a valid integer", "type": "type_error.integer" }]
}
FastAPI-style validation with field location and type error.
Accessing deleted productbad
{
  "error": "not_found",
  "detail": "Product not found"
}
Generic not_found. Doesn't include the product ID or suggest checking the dashboard.
Best Pattern

Validation errors use FastAPI format with field paths and type info.

Worst Pattern

404 errors are generic — just 'not found' without the resource ID.

API is built on FastAPI — you get its validation error quality for free. Custom errors are less detailed.

CerebrasOpenAI-compatible JSON errors
B
Clarity
7
Actionability
7
Consistency
7
Helpfulness
7
Error CodesSuggested FixDoc Links
Requesting unavailable modelgood
{
  "error": {
    "message": "Model 'gpt-4' is not available. Available models: llama3.3-70b, llama-4-scout-17b-16e",
    "type": "invalid_request_error"
  }
}
Lists available models. Follows OpenAI error format.
Too many requestsbad
{
  "error": {
    "message": "Rate limit exceeded",
    "type": "rate_limit_error"
  }
}
No retry_after, no current usage info. Just 'exceeded'.
Best Pattern

Model errors list available alternatives.

Worst Pattern

Rate limit errors lack retry timing and usage context.

Follows OpenAI error format which is familiar. Missing some helpful metadata that OpenAI and OpenRouter include.

FirebaseMixed — varies by product
C
Clarity
5
Actionability
5
Consistency
4
Helpfulness
5
Error CodesSuggested FixDoc Links
Firestore read blocked by security rulesterrible
FirebaseError: Missing or insufficient permissions.
Which rule? Which path? Which condition failed? This is the Firestore equivalent of AWS AccessDenied.
Creating account with existing emailgood
FirebaseError: Firebase: Error (auth/email-already-in-use).
The error code auth/email-already-in-use is clear and searchable. Auth errors are Firebase's best.
Best Pattern

Firebase Auth has great namespaced error codes (auth/weak-password, auth/user-not-found).

Worst Pattern

Firestore 'Missing or insufficient permissions' tells you nothing about which rule failed or why.

Auth errors: good. Firestore rules errors: terrible. Cloud Functions errors: depends on the day. No consistency across products.

TerraformPlain text with file:line references
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
4
Error CodesSuggested FixDoc Links
Using undeclared variablegood
Error: Invalid reference

  on main.tf line 15, in resource "aws_instance" "web":
  15:   ami = var.ami_id

A reference to a variable which has not been declared.
File, line number, the offending code, and what's wrong. HCL parser errors are actually decent.
ARM instance with x86 AMIbad
Error: Error creating EC2 instance: InvalidParameterCombination: The architecture 'arm64' of the specified instance type is incompatible with the architecture 'x86_64' of the specified AMI.
The AWS error passes through but Terraform wraps it unhelpfully. 'Error: Error creating' is redundant.
Best Pattern

HCL syntax errors with file:line and code snippet are genuinely useful.

Worst Pattern

Provider errors pass through raw cloud API errors with no Terraform-level guidance on how to fix your config.

Syntax errors: decent. Provider errors: raw passthrough from cloud APIs. State lock errors are terrifying.

MongoDBError codes with mixed detail
C
Clarity
5
Actionability
5
Consistency
5
Helpfulness
5
Error CodesSuggested FixDoc Links
Inserting duplicate unique keygood
MongoServerError: E11000 duplicate key error collection: mydb.users index: email_1 dup key: { email: "test@test.com" }
Shows the collection, index name, and the duplicate value. One of MongoDB's better errors.
No database connection establishedbad
MongooseError: Operation `users.find()` buffering timed out after 10000ms
Buffering timed out? The real issue is you're not connected to the database. Say that.
Best Pattern

Duplicate key errors clearly show which index and value conflicted.

Worst Pattern

Connection/buffering errors hide the real problem (no connection) behind timeout language.

Wide range: duplicate key errors are great, ObjectId cast errors are confusing, connection errors are misleading.

Auth0JSON with status codes
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
4
Error CodesSuggested FixDoc Links
Management API call without proper scopesbad
{"statusCode":403,"error":"Forbidden","message":"You are not allowed to call this endpoint.","errorCode":"insufficient_scope"}
Which scope is missing? There are dozens. 'insufficient_scope' without listing the required scope is useless.
OAuth redirect misconfigurationgood
Callback URL mismatch. http://localhost:3000/api/auth/callback is not in the list of allowed callback URLs.
Actually tells you the URL that failed and implies you need to add it to the allowed list. Rare Auth0 win.
Best Pattern

Callback URL mismatch errors actually show the offending URL.

Worst Pattern

Redirect loops with no error — just infinite redirects and a blank page. Silent failures are the worst.

Auth0's worst sin: silent redirect loops. When errors DO show, they're okay but rarely tell you the fix.

TursoLibsqlError with SQLite codes
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
5
Error CodesSuggested FixDoc Links
Inserting duplicate unique valuegood
LibsqlError: SQLITE_CONSTRAINT_UNIQUE: UNIQUE constraint failed: users.email
  code: 'SQLITE_CONSTRAINT_UNIQUE'
SQLite constraint errors are actually clear. The error code mirrors SQLite standard codes.
Network issue connecting to Turso databasebad
LibsqlError: SERVER_ERROR: request error: connection refused
  code: 'SERVER_ERROR'
SERVER_ERROR is too generic. Connection refused could mean wrong URL, wrong token, or region issue — no way to tell.
Best Pattern

SQLite constraint and query errors pass through with proper SQLite error codes that are well-documented.

Worst Pattern

Network and replication errors collapse into generic SERVER_ERROR with no distinction between auth, connectivity, and config problems.

SQLite layer errors are clear; Turso infrastructure errors are vague. Embedded/local SQLite mode has better errors than cloud mode.

RailwayPlain text with exit codes
C
Clarity
5
Actionability
4
Consistency
4
Helpfulness
5
Error CodesSuggested FixDoc Links
Deploying a monorepo without root config pointing to the right directorygood
Build failed
Error: unable to find any supported files in /app
Make sure your application is in the root of the repository.
Tells you where it looked and what to do. One of Railway's better errors.
Service running out of memoryterrible
Deployment crashed
Exit code: 137
Exit code 137 means OOM kill. Railway should say 'your service ran out of memory — upgrade your plan or check memory usage' but instead shows a raw exit code.
Best Pattern

Build detection errors explain what Nixpacks expected and how to configure it.

Worst Pattern

Runtime crashes show exit codes with no interpretation. OOM kills (137) and segfaults look identical to normal crashes.

Build errors are decent. Runtime errors are bare exit codes. No in-dashboard guidance on common failures.

RenderPlain text, inconsistent structure
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
4
Error CodesSuggested FixDoc Links
Free tier service hitting memory limitgood
Your service is using more than 512 MB of RAM. Consider upgrading to a higher plan.
Clear about the problem and suggests the fix (upgrade). Numerical limit helps.
Build script returning non-zero exit codebad
Build failed: exit status 1
==> Check the logs above for more details
'Check the logs above' is not an error message, it's abdication. You have to scroll up through hundreds of log lines.
Best Pattern

Infrastructure limit errors (memory, disk) are clearly communicated with current vs allowed values.

Worst Pattern

Build failures report 'exit status 1' and redirect you to logs without highlighting the relevant section.

Better than raw exit codes but not by much. No error codes, no doc links. Dashboard surfacing of errors needs work.

Fly.ioCLI text with nested error chains
C
Clarity
5
Actionability
4
Consistency
4
Helpfulness
5
Error CodesSuggested FixDoc Links
Deploying with wrong Dockerfile COPY pathbad
Error: failed to fetch an image or build from source: error building: failed to solve: failed to compute cache key: failed to calculate checksum of ref: "/app/package.json": not found
Nested 'failed to' chain. The actual issue (wrong path) is buried at the end. Docker error passthrough without interpretation.
Machine stuck after failed deploymentgood
Error: Machines in app 'my-app' are in an unrecoverable state. Run `fly apps restart my-app` to attempt recovery.
States the problem and gives the exact command to fix it. One of Fly's better error messages.
Best Pattern

flyctl errors that suggest a fix command (fly apps restart, fly scale, fly secrets set) are helpful.

Worst Pattern

Docker build errors pass through with nested 'failed to' chains. Machine health check failures are cryptic.

CLI-level errors vary widely. Some suggest fixes, others pass through raw Docker/OCI errors. Health check failures need more context.

HasuraGraphQL error format with extensions
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
5
Error CodesSuggested FixDoc Links
Querying a relationship that hasn't been trackedgood
{
  "errors": [{
    "extensions": { "path": "$.selectionSet.users.selectionSet.posts", "code": "validation-failed" },
    "message": "field 'posts' not found in type: 'users'"
  }]
}
GraphQL path shows exactly where in the query the error is. Message is clear. Extensions code helps with programmatic handling.
Insert blocked by row-level permissionsterrible
{
  "errors": [{
    "extensions": { "code": "permission-error" },
    "message": "check constraint of an insert/update permission has failed"
  }]
}
Which permission? Which check constraint? Which field violated it? This tells you nothing actionable about your permission config.
Best Pattern

GraphQL validation errors with JSON path are useful for debugging complex nested queries.

Worst Pattern

Permission errors are the worst — no indication of which rule failed or what value was rejected.

Query validation errors are decent. Permission and relationship errors are frustratingly vague. Metadata apply errors can be cryptic.

SendGridJSON with field references
C
Clarity
5
Actionability
4
Consistency
6
Helpfulness
4
Error CodesSuggested FixDoc Links
Sending from an unverified email addressgood
{
  "errors": [{
    "message": "The from address does not match a verified Sender Identity.",
    "field": "from.email",
    "help": "http://sendgrid.com/docs/for-developers/sending-email/sender-identity/"
  }]
}
Field name, message, and help link. One of SendGrid's better error messages.
Invalid API keybad
{
  "errors": [{
    "message": "Permission denied, wrong credentials",
    "field": null,
    "help": null
  }]
}
No help link, no field, generic message. Is the key wrong, expired, or lacking the right scopes? No way to tell.
Best Pattern

Validation errors with field names and help links guide you to the specific configuration needed.

Worst Pattern

Authentication errors are generic. API key scope issues look identical to wrong credentials.

Uneven quality. Sender verification errors are decent. Auth and rate limit errors lack specificity. Acquired by Twilio but error quality didn't improve.

GitLab CIMixed — YAML validation vs raw exit codes
C
Clarity
5
Actionability
5
Consistency
5
Helpfulness
5
Error CodesSuggested FixDoc Links
Typo in .gitlab-ci.yml key nameexcellent
(.gitlab-ci.yml): jobs:deploy config contains unknown keys: enviroment
Did you mean: environment?
Catches the typo and suggests the correct key. YAML linting errors in GitLab CI are genuinely helpful.
Script step returning non-zero exit codeterrible
ERROR: Job failed: exit code 1
Exit code 1. That's it. Which command? What output? You have to scroll through the full job log to find the actual error.
Best Pattern

YAML validation errors with typo detection and suggestions are excellent.

Worst Pattern

Script execution failures show only the exit code. The actual error is buried in job logs with no highlighting.

Config validation is good. Runtime errors are just exit codes. Pipeline visualization helps trace which job failed but error messages don't.

CircleCIPlain text with YAML positions
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
5
Error CodesSuggested FixDoc Links
YAML syntax error in configgood
Error: Unable to parse config:
  in .circleci/config.yml, line 15, column 3:
    - run: echo "hello
         ^
  found unexpected end of stream
Line, column, caret pointing to the issue. Standard YAML parser error but at least it's precise.
Step producing no output for 10 minutesbad
Too long with no output (exceeded 10m0s): context deadline exceeded
Knows it timed out but doesn't identify which step or suggest using no_output_timeout. Generic timeout message.
Best Pattern

YAML parsing errors with line:column and caret positioning are useful.

Worst Pattern

Timeout and resource errors lack step context and don't suggest config fixes (no_output_timeout, resource_class).

Config validation is decent. Execution errors are bare. Orb-related errors (version conflicts, missing parameters) can be very confusing.

Drizzle KitMix of SQL passthrough and internal JS errors
C
Clarity
5
Actionability
5
Consistency
5
Helpfulness
4
Error CodesSuggested FixDoc Links
Migration with type mismatchgood
Error: column "user_id" is of type integer but expression is of type text
  Hint: You will need to rewrite or cast the expression.
This one is actually Postgres talking through drizzle-kit. The underlying error is clear, the hint is helpful.
Invalid schema export in drizzle.config.tsterrible
Error: Cannot read properties of undefined (reading 'columns')
    at Object.<anonymous> (/node_modules/drizzle-kit/dist/index.js:1:9876)
Internal stack trace with no indication of what you did wrong. Could be any number of schema mistakes. Hours of debugging await.
Best Pattern

SQL-level errors from migrations are passed through cleanly from the database.

Worst Pattern

Schema introspection errors expose internal JS errors with no user-facing message or file location.

Drizzle ORM query errors are fine. drizzle-kit CLI errors are rough — schema mistakes yield cryptic internal errors rather than helpful messages.

PostHogInconsistent — some structured, mostly console logs
C
Clarity
5
Actionability
4
Consistency
5
Helpfulness
4
Error CodesSuggested FixDoc Links
Network error during event capturebad
[PostHog] Error sending events: Network request failed
Silent failure in a browser console. No indication of how many events were lost or if they'll be retried.
Wrong API key in initializationgood
PostHogError: Invalid API key 'phc_...' for project. Check your PostHog project settings.
Shows which key was rejected. Points you to the right settings location.
Best Pattern

API key validation error is clear and links to the right place.

Worst Pattern

Analytics event failures fail silently in many SDKs — no feedback about dropped events, no retry indication.

Client-side analytics errors are inherently low priority, but PostHog's SDK makes it hard to know when capture is broken.

AWSXML soup
D
Clarity
3
Actionability
2
Consistency
4
Helpfulness
2
Error CodesSuggested FixDoc Links
S3 GetObject with wrong IAM permissionsterrible
<ErrorResponse>
  <Error>
    <Type>Sender</Type>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
  </Error>
  <RequestId>A1B2C3D4E5F6</RequestId>
</ErrorResponse>
Access Denied. That's it. Which permission? Which policy? Which resource ARN? Go read 47 IAM docs pages.
Lambda deployment with large packagebad
An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: Unzipped size must be smaller than 262144000 bytes
At least it says the limit, but 262144000 bytes? Just say 250MB. Also no suggestion on how to fix it.
Best Pattern

Request IDs are always present, which helps when contacting support.

Worst Pattern

IAM AccessDenied with zero context about which permission or policy is blocking you. The #1 time sink in AWS.

AWS errors are a rite of passage. AccessDenied is the most useless error in all of cloud computing.

DockerNested error chains
D
Clarity
3
Actionability
3
Consistency
3
Helpfulness
3
Error CodesSuggested FixDoc Links
Docker pull with DNS issuesterrible
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.53:53: server misbehaving
DNS resolution failed but the error is a nested chain of technical jargon. 'server misbehaving' is not actionable.
Running docker without sudoterrible
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied
The classic. URL-encoded socket paths, nested error chain. Just say 'add your user to the docker group'.
Best Pattern

Build step errors at least show which Dockerfile line failed.

Worst Pattern

Socket/daemon connection errors are a wall of URL-encoded paths and nested protocol errors.

Docker errors feel like reading raw syscall output. Permission denied is a 200-char sentence when it should be one line.

KubernetesStructured text walls
D
Clarity
3
Actionability
2
Consistency
4
Helpfulness
3
Error CodesSuggested FixDoc Links
Mismatched selector and template labelsbad
The Deployment "web" is invalid: spec.template.metadata.labels: Invalid value: map[string]string{"app":"web"}: `selector` does not match template `labels`
Technically correct but 'selector does not match template labels' requires K8s internals knowledge to parse.
Pod stuck in Pending stateterrible
0/3 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }, 2 node(s) didn't match Pod's node affinity/selector.
Untolerated taint? Node affinity selector? This is a scheduling failure but reads like an alien language to most devs.
Best Pattern

kubectl describe output at least groups events chronologically so you can trace what happened.

Worst Pattern

Scheduling errors with taints, tolerations, and affinity rules produce incomprehensible messages.

K8s errors assume you have a PhD in distributed systems. Even experienced devs Google every other error.

The Wall of Shame

The worst error messages in production. These cost developers millions of hours combined.

AWSterrible
<ErrorResponse>
  <Error>
    <Type>Sender</Type>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
  </Error>
  <RequestId>A1B2C3D4E5F6</RequestId>
</ErrorResponse>

S3 GetObject with wrong IAM permissions

Access Denied. That's it. Which permission? Which policy? Which resource ARN? Go read 47 IAM docs pages.

Firebaseterrible
FirebaseError: Missing or insufficient permissions.

Firestore read blocked by security rules

Which rule? Which path? Which condition failed? This is the Firestore equivalent of AWS AccessDenied.

Dockerterrible
Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.53:53: server misbehaving

Docker pull with DNS issues

DNS resolution failed but the error is a nested chain of technical jargon. 'server misbehaving' is not actionable.

Dockerterrible
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied

Running docker without sudo

The classic. URL-encoded socket paths, nested error chain. Just say 'add your user to the docker group'.

Kubernetesterrible
0/3 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }, 2 node(s) didn't match Pod's node affinity/selector.

Pod stuck in Pending state

Untolerated taint? Node affinity selector? This is a scheduling failure but reads like an alien language to most devs.

Railwayterrible
Deployment crashed
Exit code: 137

Service running out of memory

Exit code 137 means OOM kill. Railway should say 'your service ran out of memory — upgrade your plan or check memory usage' but instead shows a raw exit code.

Hasuraterrible
{
  "errors": [{
    "extensions": { "code": "permission-error" },
    "message": "check constraint of an insert/update permission has failed"
  }]
}

Insert blocked by row-level permissions

Which permission? Which check constraint? Which field violated it? This tells you nothing actionable about your permission config.

GitLab CIterrible
ERROR: Job failed: exit code 1

Script step returning non-zero exit code

Exit code 1. That's it. Which command? What output? You have to scroll through the full job log to find the actual error.

Drizzle Kitterrible
Error: Cannot read properties of undefined (reading 'columns')
    at Object.<anonymous> (/node_modules/drizzle-kit/dist/index.js:1:9876)

Invalid schema export in drizzle.config.ts

Internal stack trace with no indication of what you did wrong. Could be any number of schema mistakes. Hours of debugging await.

Explore other areas