๐Ÿ”ฅ single-command flamegraph profiling ๐Ÿ”ฅ

Overview

0x

0x

๐Ÿ”ฅ single-command flamegraph profiling ๐Ÿ”ฅ

Discover the bottlenecks and hot paths in your code, with flamegraphs.

Visualize Stack Traces

0x can profile and generate an interactive flamegraph for a Node process with a single command, on any platform which Node runs on (macOs, Linux, Windows, Android...).

Support

  • Node v8.5.0 and above
  • Default usage supports any Operating System that Node runs on!
  • Chrome
    • Other browsers may open flamegraphs in a degraded, but functional form

Legacy

Older versions of Node are supported via previous 0x versions:

0x Node macOS/SmartOS Linux Windows
v4 v8.5.0+ โ˜‘๏ธ โ˜‘๏ธ โ˜‘๏ธ
v3 v6 โ€“ v8.4.0 โ˜‘๏ธ โ˜‘๏ธ โคฌ
v2 v4 โ˜‘๏ธ โ˜‘๏ธ โคฌ

Demo

An example interactive flamegraph can be viewed at http://davidmarkclements.github.io/0x-demo/

Install

npm install -g 0x

Usage

Use 0x to run a script:

0x my-app.js

Immediately open the flamegraph in the browser:

0x -o my-app.js

Automatically execute profiling command against the first port opened by profiled process:

0x -P 'autocannon localhost:$PORT' my-app.js

Use a custom node executable:

0x -- /path/to/node my-app.js

Pass custom arguments to node:

0x -- node --zero-fill-buffers my-app.js

Generating

When ready to generate a flamegraph, send a SIGINT.

The simplest way to do this is pressing CTRL+C.

When 0x catches the SIGINT, it process the stacks and generates a profile folder (<pid>.0x), containing flamegraph.html.

The UI

The flamegraph.html file contains the 0x UI, which is explained in docs/ui.md.

Production Servers

A lightweight, production server friendly, approach to generating a flamegraph is described in docs/production-servers.md.

The Profile Folder

By default, a Profile Folder will be created and named after the PID, e.g. 3866.0x (we can set this name manually using the --output-dir flag).

The Profile Folder is explained in more detail in docs/profile-folder.md

Example

Clone this repo, run npm i -g and from the repo root run

0x examples/rest-api

In another tab run

npm run stress-rest-example

To put some load on the rest server, once that's done use ctrl + c to kill the server.

Command Line API

--help | -h

Print usage info.

--open | -o

Open the flamegraph in the browser using open or xdg-open (see https://www.npmjs.com/package/open for details).

--on-port | -P

Run a given command and then generate the flamegraph. The command as specified has access to a $PORT variable. The $PORT variable is set according to the first port that profiled process opens.

For instance, here's an example of using autocannon to load-test the process:

0x -P 'autocannon localhost:$PORT' app.js

When the load-test completes, the profiled processed will be sent a SIGINT and the flamegraph will be automatically generated.

Remember to use single quotes to avoid bash interpolation, or else escape variable (e.g. 0x -P "autocannon localhost:$PORT" app.js won't work wheras 0x -P "autocannon localhost:\$PORT" app.js will).

Note: On Windows interpolation usually occurs with %PORT%, however in this case the dollar-prefix $PORT is the correct syntax (because the interpolation is not shell based).

Default: ''

--name

The name of the HTML file, without the .html extension Can be set to - to write HTML to STDOUT (note due to the nature of CLI argument parsing, this must be set using =, e.g. --name=-).

If either this flag or --output-html-file is set to - then the HTML will go to STDOUT.

Default: flamegraph

---title

Set the title to display in the flamegraph UI.

Default: the command that 0x ran to start the process

--output-dir | -D

Specify artifact output directory. This can be specified in template form with possible variables being {pid}, {timestamp}, {name} (based on the --name flag) and {outputDir}(variables must be specified without whitespace, e.g. { pid } is not supported).

Default: {pid}.0x

--output-html | -F

Specify destination of the generated flamegraph HTML file. This can be specified in template form with possible variables being {pid}, {timestamp}, {name} (based on the --name flag) and {outputDir} (variables must be specified without whitespace, e.g. { pid } is not supported). It can also be set to - to send the HTML output to STDOUT (note due to the nature of CLI argument parsing, this must be set using =, e.g. --output-html=-).

If either this flag or --name is set to - then the HTML will go to STDOUT.

Default: {outputDir}/{name}.html

--kernel-tracing

Use an OS kernel tracing tool (perf on Linux or dtrace on macOS and SmartOS). This will capture native stack frames (C++ modules and Libuv I/O), but may result in missing stacks on Node 8.

See docs/kernel-tracing.md for more information.

Default: false

--quiet | -q

Limit output, the only output will be fatal errors or the path to the flamegraph.html upon successful generation.

Default: false

--silent | -s

Suppress all output, except fatal errors.

Default: false

--collect-only

Don't generate the flamegraph, only create the Profile Folder, with relevant outputs.

Default: false

--visualize-only

Supply a path to a profile folder to build or rebuild visualization from original stacks.

Default: undefined

--visualize-cpu-profile

Supply a path to a CPU profile. See examples/cpu-profile for an example.

CPU Profile output does not have as much information but it can be exported from Chrome Devtools in the browser. There's also an automated headless tool for doing so: automated-chrome-profiling. For creating Node.js Cpu Profiles in Node see v8-profiler or v8-profiler-next.

Default: undefined

--kernel-tracing-debug

Show output from DTrace or perf(1) tools.

Default: false

--tree-debug

Save the intermediate tree representation of captured trace output to a JSON file.

Default: false

Programmatic API

0x can also be required as a Node module and scripted:

const zeroEks = require('0x')
const path = require('path')

async function capture () {
  const opts = {
    argv: [path.join(__dirname, 'my-app.js'), '--my-flag', '"value for my flag"'],
    workingDir: __dirname
  }
  try {
    const file = await zeroEks(opts)
    console.log(`flamegraph in ${file}`)
  } catch (e) {
    console.error(e)
  }
}

capture()

The Programmatic API is detailed in docs/api.md.

Troubleshooting

Memory Issues

Very complex applications with lots of stacks may hit memory issues.

The --stack-size flag can be used to set the memory to the maximum 8GB in order to work around this when profiling:

node --stack-size=8024 $(which 0x) my-app.js

There may still be a problem opening the flamegraph in Chrome. The same work around can be used by opening Chrome from the command line (platform dependent) and nesting the --stack-size flag within the --js-flags flag: --js-flags="--stack-size 8024".

Debugging

DEBUG=0x* 0x my-app.js

Alternatives

Acknowledgements

Sponsored by nearForm

This tool is inspired from various info and code sources and would have taken much longer without the following people and their Open Source/Info Sharing efforts:

License

MIT

Comments
  • electron wrapper

    electron wrapper

    display flamegraph.html in electron

    1. should this be default behaviour (of a v2)
    2. should it be behind a flag
    3. if behind a flag, should we make users download electron etc. during default install if they don't intend to use this feature (e.g. running 0x on server side)
    opened by davidmarkclements 19
  • Add support for visualizing CPU Profile

    Add support for visualizing CPU Profile

    ...gathered by CpuProfiler::StartProfling.

    As suggested in the comment: https://github.com/davidmarkclements/0x/issues/196#issuecomment-436196449 here is an example https://github.com/slonka/0x-visualize-v8-profile-example of how to generate v8 profile at runtime and a flamegraph from it.

    Example flamegraph looks like this: screen shot 2018-11-06 at 16 36 15

    There is a couple of things that this PR is missing:

    • [x] tests
    • [x] merged / unmerged
    • [x] optimized / unoptimized could probably be taken from "bailout reason"
    • [ ] I do not know how 0x detects tiers

    But the basic functionality is there. Would love help improving this.

    opened by slonka 18
  • Failing with JSON parse error

    Failing with JSON parse error

    The program I'm trying to profile is a node script, normally I run it like

    botpress start
    

    Or more specifically in this case

    "start": "NODE_ENV=production LOG_LEVEL=info DATABASE=postgres DATABASE_URL=postgres://x:y@localhost:5432/z node ./node_modules/.bin/botpress start"
    

    Which works.

    I am also able to manually gather the profiling info by running

    "start-perf": "rm -f isolate* && NODE_ENV=production LOG_LEVEL=info DATABASE=postgres DATABASE_URL=postgres://x:y@localhost:5432/z node --prof ./node_modules/.bin/botpress start"
    

    My 0x command correspondingly looks like

    "start-0x": "NODE_ENV=production LOG_LEVEL=info DATABASE=postgres DATABASE_URL=postgres://x:y@localhost:5432/z 0x -- node ./node_modules/.bin/botpress start"
    

    And I'm getting

    ๐Ÿ”ฅ  ProfilingSyntaxError: Unexpected token : in JSON at position 2
        at JSON.parse (<anonymous>)
        at Pipe.channel.onread (internal/child_process.js:470:28)
    

    Any idea why? I'm not seeing the detailed stack so I'm not even sure if it's coming from 0x itself or from my program being ran in some unusual way (and thus maybe not being able to find some JSON file by relative path?)

    Stale 
    opened by emirotin 16
  • 0x may exit without generating flamegraph on SIGINT

    0x may exit without generating flamegraph on SIGINT

    With node v8.11.3 installed with nvm in Gentoo recently, 0x (4.1.0) occasionally exit without generating flamegraph on SIGINT (generated with Ctrl + C).

    I did some investigation, and I think the issue is related to this line:

    https://github.com/davidmarkclements/0x/blob/cbd5c309d0adea0d2cec8d7bf8ccb967670ebd4e/platform/v8.js#L49

    I tried to put the following debug print just before the Promise race:

    process.on('SIGINT', () => console.log('|SIGINT|'))
    

    and when I press Ctrl + C it prints two |SIGINT| however it won't exit without generating flamegraph anymore.

    I have no idea why it emits two SIGINT events to process and how to fix this issue (or is it just me)?

    Stale 
    opened by vizv 15
  • feature: adds autoexit option. Default: do autoexit after script

    feature: adds autoexit option. Default: do autoexit after script

    @davidmarkclements maybe this would be interesting for you. Don't know what your plan for this was, but I like the notion of autoexiting, after the script has run. It will however wind down the rest of the app logic.

    opened by eljefedelrodeodeljefe 14
  • Empty stacks.<pid>.out

    Empty stacks..out

    After executing

    0x --trace-info node test.js Profiling^C[ perf record: Woken up 1 times to write data ] Caught SIGINT, generating flamegraph WARNING: The /tmp/perf-pi50u.data file's data size field is 0 which is unexpected. Was the 'perf record' command properly terminated? [ perf record: Captured and wrote 0.055 MB /tmp/perf-pi50u.data (138 samples) ]

    and checking result:

    ll profile-28897/ total 376 drwxrwxr-x 2 user user 4096 Aug 24 14:33 ./ drwxr-xr-x 16 user user 4096 Aug 24 14:33 ../ -rw-rw-r-- 1 user user 370134 Aug 24 14:33 flamegraph.html -rw-rw-r-- 1 user user 42 Aug 24 14:33 stacks.28897.json -rw-rw-r-- 1 user user 0 Aug 24 14:33 stacks.28897.out

    we found that stacks.28897.out is empty

    Our test.js looks like:

    loop();
    function loop() {
        var i;
        for(i=0;i<1000;i++) {
        }
        setTimeout(loop,100);
    }
    

    Our software versions:

    0x: 2.2.8 Ubuntu: 16.04.1 Kernel: 4.4.0-34-generic node: v4.4.7 perf: 4.4.15

    opened by ergomatikus 13
  • discuss: flamegraphs on windows

    discuss: flamegraphs on windows

    I am opening this to discuss a possible integration of windows flame graphs and to collect some initial reading on it.

    After a quick research a good starting point could be this:

    help wanted 
    opened by eljefedelrodeodeljefe 13
  • How to read Flamegraph for reply.send fastify perf issue

    How to read Flamegraph for reply.send fastify perf issue

    Hi All, below is my graph generated from autocannon and 0x image rather than issue my concern is how to find find bottleneck and optimized the code the problem here is the reply.send is fastify function and it is pointing to that line so how can one optimize in that situation. any help or pointer would suffice

    opened by matt212 12
  • Environment variable is undefined

    Environment variable is undefined

    I can run this command with node, but when I run it with 0x it seems that process.env.BENCHMARK is undefined? Do environment variables not get picked up by 0x?

    > env BENCHMARK='server/models/timeline' ./node_modules/.bin/0x node benchmark/single.js
    module.js:339
        throw err;
        ^
    
    Error: Cannot find module './undefined'
        at Function.Module._resolveFilename (module.js:337:15)
        at Function.Module._load (module.js:287:25)
        at Module.require (module.js:366:17)
        at require (module.js:385:17)
        at Object.<anonymous> (/home/jtkc/example/benchmark/single.js:3:14)
        at Module._compile (module.js:435:26)
        at Object.Module._extensions..js (module.js:442:10)
        at Module.load (module.js:356:32)
        at Function.Module._load (module.js:311:12)
        at Function.Module.runMain (module.js:467:10)
    Profiling
    
    opened by jeromecovington 12
  • 0x not working with Mongoose package whereas Forever is working perfectly fine.

    0x not working with Mongoose package whereas Forever is working perfectly fine.

    I don't know why this is happening but previously i was using Forever module with the command forever start app.js to run my node.js app but now as i am using 0x the command i wrote is 0x app.js, now in logs bellow error is printing

    { MongoError: failed to connect to server [XX.XXX.X.X:27017] on first connect [MongoError: connection 0 to XX.XXX.X.X:27017 timed out]
        at Pool.<anonymous> (/home/projects/kj_app/node_modules/mongodb-core/lib/topologies/server.js:336:35)
        at Pool.emit (events.js:180:13)
        at Connection.<anonymous> (/home/projects/kj_app/node_modules/mongodb-core/lib/connection/pool.js:280:12)
        at Object.onceWrapper (events.js:272:13)
        at Connection.emit (events.js:180:13)
        at Socket.<anonymous> (/home/projects/kj_app/node_modules/mongodb-core/lib/connection/connection.js:197:10)
        at Object.onceWrapper (events.js:272:13)
        at Socket.emit (events.js:180:13)
        at Socket._onTimeout (net.js:393:8)
        at ontimeout (timers.js:466:11)
        at tryOnTimeout (timers.js:304:5)
        at Timer.listOnTimeout (timers.js:267:5)
      name: 'MongoError',
    

    But the thing is when using Forever i am not getting this error and everything is working perfectly fine.

    opened by sudhanshugaur4 11
  • ๐Ÿž Cannot read property 'toString' of undefined (from src.toString())

    ๐Ÿž Cannot read property 'toString' of undefined (from src.toString())

    Just received the following error trying this out, on OS X 10.11.3

    > npm version
    { 'devboard-example': '1.0.0',
      npm: '3.8.5',
      ares: '1.10.1-DEV',
      http_parser: '2.5.2',
      icu: '56.1',
      modules: '46',
      node: '4.4.2',
      openssl: '1.0.2g',
      uv: '1.8.0',
      v8: '4.5.103.35',
      zlib: '1.2.8' }
    
    > npm ls -g 0x
    /usr/local/lib
    โ””โ”€โ”€ [email protected]
    
    /usr/local/lib/node_modules/0x/index.js:122
          throw e
          ^
    
    TypeError: Cannot read property 'toString' of undefined
        at Readable.<anonymous> (/usr/local/lib/node_modules/0x/index.js:325:22)
        at emitOne (events.js:77:13)
        at Readable.emit (events.js:169:7)
        at Labeled.<anonymous> (/usr/local/lib/node_modules/0x/node_modules/read-only-stream/index.js:28:44)
        at emitOne (events.js:77:13)
        at Labeled.emit (events.js:169:7)
        at Labeled.<anonymous> (/usr/local/lib/node_modules/0x/node_modules/stream-splicer/index.js:130:18)
        at emitOne (events.js:82:20)
        at Labeled.emit (events.js:169:7)
        at DestroyableTransform.<anonymous> (/usr/local/lib/node_modules/0x/node_modules/stream-splicer/index.js:130:18)
    
    opened by glenjamin 10
Releases(v5.4.0)
  • v5.4.0(Jul 14, 2022)

    What's Changed

    • Update --visualize-cpu-profile docs by @kazarmy in https://github.com/davidmarkclements/0x/pull/259
    • Fix test for 18 node and add it to CI by @Minhir in https://github.com/davidmarkclements/0x/pull/261
    • Fix: EXDEV: cross-device link not permitted by @Minhir in https://github.com/davidmarkclements/0x/pull/260

    New Contributors

    • @Minhir made their first contribution in https://github.com/davidmarkclements/0x/pull/261

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.3.1...v5.4.0

    Source code(tar.gz)
    Source code(zip)
  • v5.3.1(Jun 19, 2022)

    What's Changed

    • Add test for #256 (--cpu-prof .cpuprofile) by @kazarmy in https://github.com/davidmarkclements/0x/pull/257
    • cpu-profile-to-tree: Refactor out the filtering of parenthesized nodes by @kazarmy in https://github.com/davidmarkclements/0x/pull/258

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.3.0...v5.3.1

    Source code(tar.gz)
    Source code(zip)
  • v5.3.0(Jun 14, 2022)

    What's Changed

    • Support .cpuprofile of node --cpu-prof by @kazarmy in https://github.com/davidmarkclements/0x/pull/256

    New Contributors

    • @kazarmy made their first contribution in https://github.com/davidmarkclements/0x/pull/256

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.2.1...v5.3.0

    Source code(tar.gz)
    Source code(zip)
  • v5.2.1(Mar 10, 2022)

    What's Changed

    • fix: override process.stdout.fd by @RafaelGSS in https://github.com/davidmarkclements/0x/pull/255

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.2.0...v5.2.1

    Source code(tar.gz)
    Source code(zip)
  • v5.2.0(Feb 21, 2022)

    What's Changed

    • fix: collect-only to render-only flow by @adiktofsugar in https://github.com/davidmarkclements/0x/pull/253
    • fix: call soft close instead of process.exit when CTRL + C is pressed by @rubenpad in https://github.com/davidmarkclements/0x/pull/254

    New Contributors

    • @adiktofsugar made their first contribution in https://github.com/davidmarkclements/0x/pull/253
    • @rubenpad made their first contribution in https://github.com/davidmarkclements/0x/pull/254

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.1.2...v5.2.0

    Source code(tar.gz)
    Source code(zip)
  • v5.1.2(Jan 29, 2022)

    What's Changed

    • fix: add support to inlined functions + sparkplug on v16+ by @RafaelGSS in https://github.com/davidmarkclements/0x/pull/252

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.1.1...v5.1.2

    Source code(tar.gz)
    Source code(zip)
  • v5.1.1(Jan 26, 2022)

    What's Changed

    • refactor: cleanup todos adding a note about inlined functions by @RafaelGSS in https://github.com/davidmarkclements/0x/pull/247
    • chore: add stale workflow by @RafaelGSS in https://github.com/davidmarkclements/0x/pull/248
    • Adding the SIGTERM to soft exit by @arthurguedes375 in https://github.com/davidmarkclements/0x/pull/250

    New Contributors

    • @arthurguedes375 made their first contribution in https://github.com/davidmarkclements/0x/pull/250

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v5.0.0...v5.1.1

    Source code(tar.gz)
    Source code(zip)
  • v5.0.0(Dec 30, 2021)

    What's Changed

    • linux: fixes perf profiling stacktraces by @RafaelGSS in https://github.com/davidmarkclements/0x/pull/244
    • Updated deps and added CI by @mcollina in https://github.com/davidmarkclements/0x/pull/246
    • Kernel tracing is not supported anymore as --perf-basic-prof is limited to Linux by @mcollina in https://github.com/davidmarkclements/0x/pull/245

    New Contributors

    • @RafaelGSS made their first contribution in https://github.com/davidmarkclements/0x/pull/244

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v4.11.0...v5.0.0

    Source code(tar.gz)
    Source code(zip)
  • v4.11.0(Aug 21, 2021)

    What's Changed

    • Update ui.md: Typos by @pzrq in https://github.com/davidmarkclements/0x/pull/234
    • Collect timeout feature by @ErisDS in https://github.com/davidmarkclements/0x/pull/239

    New Contributors

    • @pzrq made their first contribution in https://github.com/davidmarkclements/0x/pull/234
    • @ErisDS made their first contribution in https://github.com/davidmarkclements/0x/pull/239

    Full Changelog: https://github.com/davidmarkclements/0x/compare/v4.10.2...v4.11.0

    Source code(tar.gz)
    Source code(zip)
  • v4.10.2(Sep 25, 2020)

  • v4.10.1(Sep 25, 2020)

  • v4.10.0(Sep 18, 2020)

  • v4.7.5(Mar 29, 2019)

  • v4.7.4(Mar 15, 2019)

  • v4.7.3(Feb 24, 2019)

  • v4.7.2(Dec 4, 2018)

  • v4.7.1(Dec 3, 2018)

  • v4.7.0(Nov 28, 2018)

  • v4.6.0(Nov 27, 2018)

  • v4.5.2(Oct 19, 2018)

  • v4.5.1(Oct 8, 2018)

  • v4.5.0(Oct 2, 2018)

  • v4.4.4(Sep 24, 2018)

  • v4.4.0(Sep 18, 2018)

  • v4.3.0(Aug 28, 2018)

  • v4.2.0(Aug 24, 2018)

    • Change process.stdout.write switcharoo to a full net.Socket instance #156
    • Send SIGTERM to subprocess on second Ctrl+C #154
    • Throw error if a cluster subprocess is forked #155
    Source code(tar.gz)
    Source code(zip)
  • v4.1.5(Aug 14, 2018)

  • v4.1.4(Aug 10, 2018)

  • v4.1.3(Aug 3, 2018)

  • v4.1.2(Jul 24, 2018)

Owner
David Mark Clements
Consultant, Principal Architect, Author of Node Cookbook, Technical Lead of OpenJS Certifications
David Mark Clements
Run a command, watch the filesystem, stop the process on file change and then run the command again...

hubmon Run a command, watch the filesystem, stop the process on file change and then run the command again... Install You can install this command lin

Hubert SABLONNIรˆRE 7 Jul 30, 2022
Set up a modern web app by running one command.

Create React App Create React apps with no build configuration. Creating an App โ€“ How to create a new app. User Guide โ€“ How to develop apps bootstrapp

Facebook 98.4k Jan 1, 2023
๐ŸŒˆ React for interactive command-line apps

React for CLIs. Build and test your CLI output using components. Ink provides the same component-based UI building experience that React offers in the

Vadim Demedes 19.7k Jan 3, 2023
Execute one command (or mount one Node.js middleware) and get an instant high-performance GraphQL API for your PostgreSQL database!

PostGraphile Instant lightning-fast GraphQL API backed primarily by your PostgreSQL database. Highly customisable and extensible thanks to incredibly

Graphile 11.7k Jan 4, 2023
:rocket: One command to generate REST APIs for any MySql Database.

Xmysql : One command to generate REST APIs for any MySql database Why this ? Generating REST APIs for a MySql database which does not follow conventio

null 129 Dec 30, 2022
Set up a modern web app by running one command.

Create React App Create React apps with no build configuration. Creating an App โ€“ How to create a new app. User Guide โ€“ How to develop apps bootstrapp

Facebook 98.4k Dec 28, 2022
Geokit - is a command-line interface (CLI) tool written in javascript, that contains all the basic functionalities for measurements, conversions and operations of geojson files.

Geokit Geokit is a command-line interface (CLI) tool written in javascript, that contains all the basic functionalities for measurements, conversions

Development Seed 31 Nov 17, 2022
a simple zero-configuration command-line http server

http-server: a command-line http server http-server is a simple, zero-configuration command-line http server. It is powerful enough for production usa

http ... PARTY! 12.4k Jan 4, 2023
Control the macOS dark mode from the command-line

dark-mode Control the macOS dark mode from the command-line Requires macOS 10.10 or later. macOS 10.13 or earlier needs to download the Swift runtime

Sindre Sorhus 630 Dec 30, 2022
node.js command-line interfaces made easy

Commander.js The complete solution for node.js command-line interfaces. Read this in other languages: English | ็ฎ€ไฝ“ไธญๆ–‡ Commander.js Installation Declari

TJ Holowaychuk 24k Jan 8, 2023
๐ŸŒˆ React for interactive command-line apps

React for CLIs. Build and test your CLI output using components. Ink provides the same component-based UI building experience that React offers in the

Vadim Demedes 19.7k Jan 9, 2023
Pretty unicode tables for the command line

cli-table3 This utility allows you to render unicode-aided tables on the command line from your node.js scripts. cli-table3 is based on (and api compa

null 418 Dec 28, 2022
Run any command on specific Node.js versions

Run any command on specific Node.js versions. Unlike nvm exec it: can run multiple Node.js versions at once can be run programmatically is 5 times fas

ehmicky 605 Dec 30, 2022
Gulp.js command execution for humans

Gulp.js command execution for humans. As opposed to similar plugins or to child_process.exec(), this uses Execa which provides: Better Windows support

ehmicky 55 Dec 14, 2022
Salesforce Commerce Cloud ODS Command Center

ODS Command center The On Demand Sandbox Command Center is a GUI tool which usessfcc-ci under the hood. It aims to provide a simple interface for runn

Sachin Upmanyu 18 Sep 20, 2022
Fill the boring catsalud covid vaccine form with a console command

vacunacovid-catsalud-autofullfill form Fill the boring catsalud covid vaccine form with a console command Manual use, pasting in the script in the con

null 18 Jul 27, 2021
๐Ÿ”Š first auto join discord selfbot - just with one command join it to your server ๐Ÿ”ฅ

?? Messi (Discord Self Bot) first auto join discord selfbot - just with one command join it to your server discord.js-selfbot ?? Requirements Discord

Parsa 25 Dec 12, 2022
Control the Plash app from the command-line

plash-cli Control the Plash app from the command-line Install $ npm install --global plash Requires Node.js 14 or later. Requires Plash 2.3.0 or late

Sindre Sorhus 33 Dec 30, 2022
๐Ÿค– EvoBot is a Discord Music Bot built with discord.js & uses Command Handler from discordjs.guide

?? EvoBot is a Discord Music Bot built with discord.js & uses Command Handler from discordjs.guide

Erit Islami 1.4k Jan 8, 2023
A great application command handler bot for Discord servers!

discord-app-commands-v13 A great multiple application command handler bot for Discord servers! Features Multiple application command handling. Slash c

null 17 Nov 1, 2022