npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@cloudbeat/atlas-recorder

v0.2.0

Published

Record a browser session and turn it into a JMeter load-test plan

Downloads

337

Readme

@cloudbeat/atlas-recorder

Record a browser session and get a JMeter test plan out of it.

You click through your application in a real browser — log in, search, check out — and the recorder writes a .jmx you can run as a load test. It captures the requests your app actually made, skips the noise, and wires up the values that have to change on every run (CSRF tokens, session ids) so the script still works when you replay it with hundreds of users.

Install

npm install -g @cloudbeat/atlas-recorder

This downloads a private Chromium build (a few hundred MB) that the recorder uses for capture. It won't touch or interfere with the browsers you already have.

Requires Node.js 18 or newer.

Record a scenario

atlas-rec record https://example.com -o checkout.jmx -n "Checkout"

A browser window opens with a small control panel in the corner. Click through your flow, then press Stop. The plan is written to checkout.jmx.

Each thing you do — a click, a form submit, a page change — becomes a labelled transaction in the plan, with the requests it triggered grouped underneath. That way a report tells you "Checkout took 3.2s", not just which URLs were slow.

While recording you can, in the control panel:

  • rename a transaction, so the report reads in your language rather than the app's URLs
  • ➕ New to start a new transaction before you click, when one page really holds two steps worth measuring separately
  • expand a transaction and exclude or delete individual requests you don't want in the test
  • ⏸ Pause while you set something up you don't want recorded
  • name the whole scenario

Your recording is saved when you press Stop, when you close the browser window, and on Ctrl+C — closing the window by mistake won't lose it.

Add a scenario to an existing plan

Point -o at a plan that already exists and the new recording is added to it as another thread group, leaving what's already there untouched:

atlas-rec record https://example.com -o suite.jmx -n "Checkout"
atlas-rec record https://example.com -o suite.jmx -n "Search"     # adds a second

A .bak copy is written before the file is changed.

-t (threads) and -l (loops) only apply when the file is being created — they are not touched when adding to an existing plan.

Recording behind a login

Two ways to skip a login you don't want to record every time.

Reuse a signed-in session. With --profile, the session is saved when you stop and reloaded next time, so you start already logged in:

atlas-rec record https://app.example.com -o app.jmx --profile ./session.json

Bring cookies from your own browser. Export them and pass --cookies. Files saved by the usual browser cookie extensions are understood, as is a raw Cookie: header pasted into a file:

atlas-rec record https://app.example.com/home -o app.jmx --cookies ./cookies.json

What ends up in the plan

Kept: the requests your application makes — pages, API calls, form posts, and CORS preflights (marked (OPTIONS) so you can spot them).

Skipped: images, stylesheets, fonts, and known analytics traffic. These inflate a load test without telling you anything about your application. If you need one of them, include it from the control panel while recording.

Values that change every run are handled for you. If a request sends something it was given earlier — a CSRF token, a session id, an item id from a search result — the recorder finds where that value came from and pulls it out of the live response at run time instead of replaying the recorded one. Each of these gets a check attached, so if the value ever stops coming back the sample fails loudly rather than quietly posting a stale token. Turn this off with --no-correlate.

Values that look like a timestamp are replaced with JMeter's own clock so they're current on every request (--no-timestamps to keep them as recorded).

Pauses between steps are recorded and added as think-time, but switched off, so the plan runs flat out until you decide otherwise. To use them, enable the Settings - Sleeps block in the plan and set the durations you want.

A .capture.json file is written next to your plan holding the raw session. You don't need it to run the test — keep it if you want to re-generate the plan later, or pass --no-capture to skip it.

Options

| Option | Meaning | |--------|---------| | -o, --out <file> | Where to write. An existing plan is added to; otherwise created | | -n, --name <name> | Name for the scenario (also editable while recording) | | -t, --threads <n> | Number of users — only when creating a new plan | | -l, --loops <n> | Iterations per user — only when creating a new plan | | --profile <file> | Save and reuse a signed-in session between recordings | | --cookies <file> | Start the recording already signed in, using exported cookies | | --correlations <file> | Pin named parameters to a value of your choosing instead of detecting them, e.g. { "authToken": "${authToken}" } | | --no-correlate | Replay recorded values as-is instead of detecting changing ones | | --no-timestamps | Keep recorded timestamps instead of using the current time | | --capture <file> | Where to write the raw session file | | --no-capture | Don't write the raw session file | | -f, --format <fmt> | Output format. jmeter is currently the only one |

Using it with the Atlas CLI

If you use @cloudbeat/atlas-cli, it can drive the recorder and put the result straight into a project:

atlas record https://example.com -o flow.jmx --upload -p MY-PROJECT

The recorder is a separate package precisely so CI machines — which run tests but never record them — don't have to download a browser.

Things worth knowing

Check the plan before running it at scale. The recorder captures a single pass through your app. Anything that only appears sometimes (a cookie banner, an A/B variant, a retry) is recorded only if it happened while you clicked.

One recorded click can be two requests when a page redirects. The redirect is followed and the destination is also recorded on its own, so a redirecting step can hit the destination twice per iteration. Delete the duplicate from the control panel, or from the plan afterwards, if that matters for your numbers.

Opening the app is one transaction. Everything up to your first click — redirects off the start URL, a sign-in hop, a page that failed and reloaded — is recorded as a single step, named after the page you end up on. Renaming it in the control panel keeps your name.

Single-page apps are handled — in-app route changes are detected. A page change that your click caused belongs to that click, so one action stays one transaction even when the app calls the server first and moves a second or two later. A page you open yourself, after a pause, starts a new transaction. Where the split lands somewhere you did not want, use ➕ New to set the boundary.

If a recorded value can't be found at run time, the check attached to it fails the sample and names the value, which is your signal that the flow changed or the step that produced it wasn't recorded.