Skip to main content

Introduction

Production React builds are minified, so a stack trace from a real user looks like this:
When you upload your build’s source maps to Lerix, the dashboard maps each frame back to your original code, for example src/components/Chat.tsx:142, and shows the surrounding lines. The maps are uploaded privately and deleted from your build output before you deploy. They are never served publicly, so your source code stays private.
Complete the React installation first. Setting a release requires @lerix-dev/lerix-core 1.1.0 or newer.

1. Enable source maps

Generate hidden source maps in vite.config:
vite.config.ts
'hidden' generates the .map files without adding a //# sourceMappingURL comment to the shipped JavaScript, so browsers never try to load them. The output folder is dist.
Run your production build and check that .js.map files appear next to the bundles.

2. Create a private API key

Uploading source maps needs a private key, separate from the public project key your app uses.
  1. Open your project in the Lerix Dashboard.
  2. Go to Project settings → API keys.
  3. Create a key with the Upload source maps permission (or Full access).
This key is secret. Store it as a CI secret and never put it in client code or commit it to your repository.

3. Upload the maps after each build

After the build and before you deploy, run the Lerix CLI on the build output:
Run it from your project folder. It finds the build output on its own (dist (Vite) or build (Create React App)) and uses the version from package.json as the release. To set them yourself: npx @lerix-dev/lerix-cli upload dist --release 1.4.0. The CLI uploads every *.js.map file in the folder (it skips node_modules and CSS maps), then deletes the .map files from the build output so they are never deployed. If any upload fails, it keeps the maps and exits with code 1, so you can retry the step. The CLI requires Node.js 18.17 or newer.

Upload on every build

Instead of running the command yourself, install the CLI in your project and let npm run it after each build:
package.json
Now every npm run build uploads the maps. --optional keeps local builds working: on a machine without LERIX_SECRET_KEY (a developer’s laptop), the upload is skipped instead of failing the build, and the .map files are still deleted. Set the keys in your CI or build server, where the release build runs.
pnpm and Yarn 2+ don’t run postbuild scripts. Chain the command instead: "build": "vite build && lerix upload --optional".

Options

Each option can also be set with an environment variable.

4. Pass the same release to the SDK

Set release in the LerixProvider options to the value you passed to --release:
Lerix matches maps by the script’s file name. Bundler chunk names are content-hashed, so they are unique per build, and Lerix prefers maps from the same release. Matching still works if you omit release, but setting it is recommended. The release also replaces the 0.0.0 app version previously shown for web apps.
Use the same value in both places without editing it by hand: your git commit SHA or the version from package.json both work well.

Example: GitHub Actions

This workflow builds a Vite app, uploads the maps, then deploys. Add LERIX_API_KEY, LERIX_PROJECT_ID and LERIX_SECRET_KEY as repository secrets.
.github/workflows/deploy.yml
Then read the value in your app:
With Create React App, name the variable REACT_APP_LERIX_RELEASE and read it from process.env.REACT_APP_LERIX_RELEASE instead.

What you see in the dashboard

New errors show the original file, line and function, with the surrounding code. Click Show minified to see the stack exactly as the browser sent it. The AI assistant, GitHub issues and the MCP server all receive the readable stack too.
  • Only errors reported after the maps are uploaded are mapped. Earlier errors keep their minified stack.
  • Lerix keeps the newest 5,000 maps per project.
  • Each map can be up to 50 MB.

Troubleshooting