Free
For side projects, evals, and internal tools.
$0/ month
No card needed. No overage charges.
Start free- 10 GB telemetry
- 5K replays
- 500 AI credits
Included
- AI triage on new issues
- 500 AI credits / month (an investigation uses 50)
- 1 project
Add @squasher-ai/browser and call init() once. Uncaught errors, unhandled rejections, Web Vitals, and session replay start on their own.
Free plan. No credit card required.
import { init } from "@squasher-ai/browser"; init({ apiKey: import.meta.env.VITE_SQUASHER_API_KEY, projectId: import.meta.env.VITE_SQUASHER_PROJECT_ID, environment: import.meta.env.MODE, release: import.meta.env.VITE_GIT_SHA, captureConsoleErrors: true,});TypeError: Failed to fetch
UnhandledRejection(TypeError)
Example code and the issue it produces.
One init() call covers what the browser reports on its own. The rest is one line each.
Checked with @squasher-ai/browser 0.4.0 on September 24, 2026.
Install the SDK, start it when your app boots, and throw one error. Or paste one prompt into your coding agent.
Install it in the app that runs in the browser.
npm install @squasher-ai/browserRead the key and project ID from your bundler's public environment variables.
import { init } from "@squasher-ai/browser"; init({ apiKey: import.meta.env.VITE_SQUASHER_API_KEY, projectId: import.meta.env.VITE_SQUASHER_PROJECT_ID, environment: import.meta.env.MODE, release: import.meta.env.VITE_GIT_SHA, captureConsoleErrors: true,});Run this in the page, then check Issues in your project.
setTimeout(() => { throw new Error("Squasher test error");});Install Squasher for this project. If Squasher skills or MCP are not configured in this agent environment, run `bash <(curl -fsSL https://squasher.ai/install.sh) --agents -y`. Then read https://skills.squasher.ai/squasher-onboard/SKILL.md, map every runnable app/service/worker/frontend/agent in the repo, choose the matching Squasher SDK, log drain, OTLP, or Agent SDK path, initialize with SQUASHER_API_KEY and SQUASHER_PROJECT_ID from environment variables, send one real verification event, and report the files changed plus the verification step. Do not hardcode or reveal real API keys.bash <(curl -fsSL https://squasher.ai/install.sh) --agents -yReplay records the page as the user used it. It shares a session ID with that user's errors.
error at 1:031:40

Example replay.
A stack trace says where the code failed. These fields say which build, which page, and which user.
The build the error came from. Pass your commit SHA to release.
production, staging, or development, so you can filter issues.
The address of the page where the error happened.
One ID per browser tab, shared by errors, Web Vitals, and replay.
Call identify() after sign-in, and later events carry that user.
Change or drop any error event before it leaves the page.
Build with source maps and upload them from CI with the release you deploy.
vite build --sourcemap squasher sourcemaps upload \ --project "$SQUASHER_PROJECT_ID" \ --service checkout-web \ --release "$GIT_SHA" \ $(find dist -name "*.map")What each error means in every browser, why it happens, and the code that fixes it.
No response reached your code: CORS, offline, or blocked.
Read the fixA value was never set: data not loaded, or a failed find().
Read the fixA DOM query, ref, or match() returned null.
Read the fixA resize callback changed the size it was watching.
Read the fixfetch, Axios, and chunk loads that fail before a response.
Read the fixPaste a JavaScript, Python, JVM, Ruby, or Go stack trace and find the first app frame.
Open the toolAfter init() it captures uncaught errors from the window error event and unhandled promise rejections, and it records Core Web Vitals and session replay. console.error calls become events only when you set captureConsoleErrors: true.
Yes, it only needs a browser. React render errors need SquasherErrorBoundary from @squasher-ai/browser/react. Vue handles component errors itself, so call captureError from app.config.errorHandler. For Next.js, use the Next.js setup.
Yes, when you upload source maps. Upload them for each release with the CLI, and the issue page shows the original file, line, function, and source lines. Maps with a debug ID match without a release.
Errors are sent one by one with sendBeacon or a keepalive fetch, and Web Vitals in small batches. The replay recorder is the largest part. It is loaded with a dynamic import, and with replay: { enabled: false } it is not loaded at all.
Use beforeSend to change or drop an event before it leaves the page. Replay masks all text, typed values, and media by default; hide more elements with privacy.blockSelector.
Call identify() or setUser() after sign-in. Later events carry that user, and replays are attributed to the same identity.
Start free. Invite the whole team. AI triage is included on every plan.
For side projects, evals, and internal tools.
$0/ month
No card needed. No overage charges.
Start freeIncluded
For small production apps that want one tool, not five.
$29/ month
Flat price. No per-seat fees.
Start on ProEverything in Free, plus
For product teams replacing separate error, replay, and status tools.
$99/ month
Flat price. No per-seat fees.
Start on TeamEverything in Pro, plus
For high-volume teams with security, procurement, and support needs.
$299/ month
Flat price. No per-seat fees.
Start on ScaleEverything in Team, plus
Need more volume, a security review, or custom terms? Get in touch.
Connect one service and send one real event. The crew takes it from there.
Free plan. No credit card required.