A terminal-to-gif recorder minus the headaches.

Overview

ttystudio

A terminal-to-gif recorder minus the headaches.

ttystudio

Record your terminal and compile it to a GIF or APNG without any external dependencies, bash scripts, gif concatenation, etc.

Install with: $ npm install ttystudio. (Add -g for global install).

Usage

$ ttystudio output.gif --log
  $ vim
    hello world
    :q!
  $ ^Q # stop recording with ctrl-q
initializing writer
writing image
writing head
writing frame 0 - 132 left
writing frame 1 - 131 left
writing frame 2 - 130 left
...
writing frame 131 - 1 left
writing eof
wrote image to /home/chjj/output.gif
$ chromium output.gif
# or if you wrote to output.png (an APNG)
$ firefox output.png

The Difference

ttystudio differs from other terminal recorders in that:

  1. It has its own built-in gif and apng writer, no imagemagick required. The writer now has built-in frame offset optimization.
  2. It has a font parser to render the font during image writing so no terminal playback is required when writing the image (this also means no GUI is required at all - you can record on a remote machine via ssh).
  3. No concatenation of hundreds of gif files required. ttystudio automatically writes out to one gif or apng.
  4. No glitchy frames due to imperfect GUI recording of the playback or gif concatenation.
  5. ttystudio will record frames even if nothing is being updated on the screen.

This project has ended up making use of years of work I've done writing terminal libraries (my personal obsession). Once all the pieces were there, this project became possible. It also sprang out of a need to find a terminal-to-gif recorder that actually worked.

(NOTE: The above .gif was recorded with ttystudio - nested ttystudio instances cause a slight glitch where the cursor is not visible. Not to matter in most cases).

More Usage

$ ttystudio output.gif --log # record and compile
$ ttystudio frames.json --log # record
$ ttystudio frames.json output.gif --range=0-50 # compile

Use a frames.json file

$ ttystudio --record frames.json --interval=100 # grab each frame on a 100ms interval
  $ vim
    hello world
    :q!
  $ ^Q # stop recording with ctrl-q
$ ttystudio --compile frames.json output.gif --log
parsing json
initializing writer
writing image
writing head
writing frame 0 - 132 left
writing frame 1 - 131 left
writing frame 2 - 130 left
...
writing frame 131 - 1 left
writing eof
wrote image to /home/chjj/output.gif
$ chromium output.gif
# or if you wrote to output.png (an APNG)
$ firefox output.png

How it works

  1. $ ttystudio --record frames.json: blessed+term.js+pty.js will spawn a pseudo-terminal to let you record until you press ^Q.
  2. $ ttystudio --compile frames.json output.gif: ttystudio will parse each set of frames into a bitmap, keeping in mind the foreground color and character in each cell.
  3. It will use its parsed font (terminus-u14n/b by default) to render pixels for each characters in the image.
  4. It will write out each frame to a .gif or .png file of your choice.

It's that simple. No bash script to run. No gifs to concatenate. No external dependencies required (i.e. ffmpeg or imagemagick) - ttystudio does it all on its own, in 99% javascript (aside from pty.js which is a node c++ binding to spawn terminals).

Options and Examples

Compiling to APNG:

$ ttystudio frames.json output.png --log

Accidentally recorded something you don't want in your image? The range option can help:

# compile only frames 5 to 130
$ ttystudio frames.json output.gif --log --range=5-130

The delay option sets the delay between frames in the final image:

# 100ms between output frames
$ ttystudio frames.json output.png --log --delay=100

The --no-palette/--rgba option can be used to avoid use a global palette (color type 3) when compiling APNGs (this is known to cause high memory usage when building the palette since it has to parse every frame beforehand). Instead, it will use color type 6 (RGBA). This will make the APNG larger, but does not risk OOMing the process. OOMing the process is unlikely to happen, but if it does, this option is here. Use pngcrush afterwards to optimize.

$ ttystudio frames.json output.png --log --rgba

Piping:

$ ttystudio frames.json - | feh -

Replaying frames in the terminal:

$ ttystudio --play frames.json

Adding a border:

# explanation of arguments:
$ ttystudio output.gif --log --border=[width],[r],[g],[b],[a]
# add a red border:
$ ttystudio output.gif --log --border=10,255,0,0,255
# white border:
$ ttystudio output.gif --log --border=10,255
$ ttystudio output.gif --log --border=10,255,255,255
$ ttystudio output.gif --log --border=10

Start in screenshot mode. This allows you to take multiple screenshot whenever C-p is pressed. ttystudio will write them all to separate images.

$ ttystudio o.gif --screenshot --screenshot-key C-p

Full Options List

  • -l, --log

    • Log status to stderr (now default).
  • -q, --quiet

    • Do not log status to stderr.
  • -f, --font [font-file]

    • Choose a BDF font in ttystudio's JSON format.
  • -b, --font-bold [font-file]

    • Choose a bold BDF font in ttystudio's JSON format.
  • -d, --delay [delay-ms]

    • Specify frame delay in ms (default: 100).
  • -i, --interval [interval-ms]

    • Specify frame snapshot interval in ms (default: 100).
  • -k, --key [quit-key]

    • Choose a key combination to quit recording (default: C-q).
  • -n, --num-plays [num-plays]

    • Specify a number of plays for the animation (default: 0 - infinite).
  • -r, --range [frame-range]

    • Choose a range of frames to compile. e.g. 5-200.
  • -x, --ratio [pixel-cell-ratio]

    • Choose pixel to cell ratio. This option is useless right now since it is overwritten by the font (default: 8x14).
  • -t, --term [term-name]

    • Choose the terminal name for terminfo.
  • --palette

    • Use a global palette for APNGs instead of RGBA.
  • --no-palette, --rgba, --lct

    • Use RGBA for APNGs instead of a global palette. This will also avoid building a global palette for GIFs and only use a local color table for each frame.
  • --border [width,r,g,b,a]

    • Add a border around the animation using the specified parameters.
  • play, --play

    • Replay a frames file in the terminal.
  • record, --record

    • Explicitly choose to record (not very useful).
  • compile, --compile

    • Explicitly choose to compile (not very useful).
  • screenshot, --screenshot

    • Start ttystudio in screenshot mode. It will take a screenshot on C-p unless specified otherwise by --screenshot-key.
  • --screenshot-key

    • Set the screenshot key when in screenshot mode. Default is C-p.
  • --version

    • Display ttystudio version.
  • -h, --help

    • Display help information.

Choosing a new font for your terminal recording

Since ttystudio does not record a GUI, it needs to know which font you want to use (it has no real idea of the font your terminal is using). ttystudio uses terminus (ter-u14n/b) by default, but you can change this.

Your font must be in BDF format. Once you have your font ready, place it in the fonts/ directory in ttystudio and run $ make. ttystudio+pxxl.js will convert the .bdf font to a glyph bitmap format in a json file, which is what ttystudio uses.

$ cp ~/ter-u12n.bdf ~/ttystudio/fonts/
$ cp ~/ter-u12b.bdf ~/ttystudio/fonts/
$ cd ~/ttystudio/fonts
$ make
...
$ ttystudio output.gif --log \
  --font ~/ttystudio/fonts/ter-u12n.json \
  --font-bold ~/ttystudio/fonts/ter-u12b.json

OSX

pty.js seems to currently be causing sporadic input lag on OSX. This is being investigated.

Notes

A special thanks to the folks who developed pxxl.js - a BDF font parser. Without them, it would not have been possible to render a reasonable looking font to the output gif/png.

Todo

  • More fonts and font formats supported.
  • Antialiased fonts.
  • Emit frames as events in writers.

Contribution and License Agreement

If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license. You are also implicitly verifying that all code is your original work. </legalese>

License

Copyright (c) 2015, Christopher Jeffrey. (MIT License)

See LICENSE for more info.

Comments
  • ttystudio not terminating

    ttystudio not terminating

    on Linux Mint 17

    ~$ ttystudio test.gif --log
    ...
    writing frame 268 - 7 left
    writing frame 269 - 6 left
    writing frame 270 - 5 left
    writing frame 271 - 4 left
    writing frame 272 - 3 left
    writing frame 273 - 2 left
    writing frame 274 - 1 left
    writing eof
    

    it stopped there. After ~20 Minutes i canceled it. The resulting gif file is incomplete.

    opened by schenker 29
  • Old node version: TypeError: Object m has no method 'writeUIntBE'

    Old node version: TypeError: Object m has no method 'writeUIntBE'

    I got one of these

    initializing writer
    writing image
    writing head
    TypeError: Object m has no method 'writeUIntBE'
        at GIFWriter.writeBE (/usr/local/lib/node_modules/ttystudio/lib/gif.js:97:7)
        at GIFWriter.writeHead (/usr/local/lib/node_modules/ttystudio/lib/gif.js:134:12)
        at GIFWriter.write (/usr/local/lib/node_modules/ttystudio/lib/gif.js:51:8)
        at SGRWriter.write (/usr/local/lib/node_modules/ttystudio/lib/writer.js:53:22)
        at compile (/usr/local/lib/node_modules/ttystudio/bin/ttystudio:61:10)
        at /usr/local/lib/node_modules/ttystudio/bin/ttystudio:93:12
        at Screen.done (/usr/local/lib/node_modules/ttystudio/lib/record.js:92:7)
        at Screen.EventEmitter._emit (/usr/local/lib/node_modules/ttystudio/node_modules/blessed/lib/events.js:90:20)
        at Screen.EventEmitter.emit (/usr/local/lib/node_modules/ttystudio/node_modules/blessed/lib/events.js:107:17)
        at Program.<anonymous> (/usr/local/lib/node_modules/ttystudio/node_modules/blessed/lib/widgets/screen.js:480:12)
    probook:TelcareOperations ivan$ vim /usr/local/lib/node_modules/ttystudio/lib/gif.js
    

    when node -v === v0.10.35 but then upgrading to v0.12.4 and some npm uninstall and reinstall stuff later it works now. Awesome app, BTW.

    opened by ivanistheone 8
  • Add screencast mode.

    Add screencast mode.

    If I am a screencaster I want a fluid recording with minimal filesize and no pauses when I am thinking of what to type while recording. When I type a command, the resulting animation should show a fixed delay between only frames that show updating content. I also wish to have the option to add padding frames to pause at moments of interest for my viewer.

    This commit adds the screencast mode and relevant options.

    Motivation

    Recall the recorder either catches frames on a fixed interval, or when you press a screenshot key (default: C-p). This means when running $ foo on your screencast you would have to run ttystudio --screenshot and then type f <C-p> o <C-p> o <C-p>. Maybe you'd hit C-p a few more times on the command output to add more frames for people to read the output of your command. But then you have to concatenate the output files because the frames are written individually in screenshot mode.

    What I ended up doing was making ttystudio grab a frame on each render, provided that the frame contents actually changed. Typing is laggy but this drastically reduced the number of frames recorded.

    Adding pauses at moments of interest involves using --screencast-padding to add padding frames.

    opened by zyrolasting 5
  • Rendered images not showing in Chrome

    Rendered images not showing in Chrome

    This technically isn't a you problem per se.

    With your fixes to the other issues in the last few days (thanks you rock) I have finally been able to render a gif. When I open it in chrome the first frame shows then it goes away. If I upload that gif to imgur whatever they do to re-encode it seems to correct the issue.

    The rendered gif https://www.dropbox.com/s/la4mfkzpj383o46/fwconsole.gif?dl=0 The imgur gif https://www.dropbox.com/s/ivg0z0f2cogebwr/OrqQBbK.gif?dl=0

    I don't know what the difference is or if maybe it is as simple as passing a flag of some sort

    opened by jfinstrom 5
  • "TypeError: Value is out of bounds" when writing frame 1

    Output:

     ~  ttystudio myfile.gif --log
    initializing writer
    writing image
    writing head
    writing frame 0 - 59 left
    frame dimensions: 640x336
    writing frame 1 - 58 left
    frame dimensions: 1x1
    TypeError: value is out of bounds
        at TypeError (<anonymous>)
        at checkInt (buffer.js:705:11)
        at Buffer.writeUInt8 (buffer.js:715:5)
        at GIFWriter.write8 (/usr/local/lib/node_modules/ttystudio/lib/gif.js:82:7)
        at GIFWriter.writeFrame (/usr/local/lib/node_modules/ttystudio/lib/gif.js:196:12)
        at GIFWriter.write (/usr/local/lib/node_modules/ttystudio/lib/gif.js:61:10)
        at SGRWriter.write (/usr/local/lib/node_modules/ttystudio/lib/writer.js:53:22)
        at compile (/usr/local/lib/node_modules/ttystudio/bin/ttystudio:61:10)
        at /usr/local/lib/node_modules/ttystudio/bin/ttystudio:93:12
        at Screen.done (/usr/local/lib/node_modules/ttystudio/lib/record.js:93:7)
    

    Replicated this error in urxvt and gnome-terminal, with different terminal sizes that definitely weren't 1x1.

    opened by bedekelly 5
  • Install Fails on Debian 8 Jessie

    Install Fails on Debian 8 Jessie

    _Nube Alert_

    Its my first ever time dealing with node and npm so there is probably a lot that I am missing.

    I did the following:

    1. apt-get install node
    2. apt-get install npm
    3. npm install ttystudio

    and I get the following output:

    root@debian:/home/ikuru# npm install ttystudio /

    [email protected] install /home/ikuru/node_modules/ttystudio/node_modules/pty.js node-gyp rebuild

    gyp: Call to 'node -e "require('nan')"' returned exit status 1. while trying to load binding.gyp gyp ERR! configure error gyp ERR! stack Error: gyp failed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/share/node-gyp/lib/configure.js:344:16) gyp ERR! stack at ChildProcess.emit (events.js:98:17) gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:809:12) gyp ERR! System Linux 3.16.0-4-686-pae gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild" gyp ERR! cwd /home/ikuru/node_modules/ttystudio/node_modules/pty.js gyp ERR! node -v v0.10.29 gyp ERR! node-gyp -v v0.12.2 gyp ERR! not ok npm WARN This failure might be due to the use of legacy binary "node" npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian

    npm ERR! [email protected] install: node-gyp rebuild npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] install script. npm ERR! This is most likely a problem with the pty.js package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node-gyp rebuild npm ERR! You can get their info via: npm ERR! npm owner ls pty.js npm ERR! There is likely additional logging output above.

    npm ERR! System Linux 3.16.0-4-686-pae npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "ttystudio" npm ERR! cwd /home/ikuru npm ERR! node -v v0.10.29 npm ERR! npm -v 1.4.21 npm ERR! code ELIFECYCLE npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /home/ikuru/npm-debug.log npm ERR! not ok code 0 root@debian:/home/ikuru# npm install -g ttystudio /

    [email protected] install /usr/local/lib/node_modules/ttystudio/node_modules/pty.js node-gyp rebuild

    gyp: Call to 'node -e "require('nan')"' returned exit status 1. while trying to load binding.gyp gyp ERR! configure error gyp ERR! stack Error: gyp failed with exit code: 1 gyp ERR! stack at ChildProcess.onCpExit (/usr/share/node-gyp/lib/configure.js:344:16) gyp ERR! stack at ChildProcess.emit (events.js:98:17) gyp ERR! stack at Process.ChildProcess._handle.onexit (child_process.js:809:12) gyp ERR! System Linux 3.16.0-4-686-pae gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild" gyp ERR! cwd /usr/local/lib/node_modules/ttystudio/node_modules/pty.js gyp ERR! node -v v0.10.29 gyp ERR! node-gyp -v v0.12.2 gyp ERR! not ok npm WARN This failure might be due to the use of legacy binary "node" npm WARN For further explanations, please read /usr/share/doc/nodejs/README.Debian

    npm ERR! [email protected] install: node-gyp rebuild npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] install script. npm ERR! This is most likely a problem with the pty.js package, npm ERR! not with npm itself. npm ERR! Tell the author that this fails on your system: npm ERR! node-gyp rebuild npm ERR! You can get their info via: npm ERR! npm owner ls pty.js npm ERR! There is likely additional logging output above.

    npm ERR! System Linux 3.16.0-4-686-pae npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "install" "-g" "ttystudio" npm ERR! cwd /home/ikuru npm ERR! node -v v0.10.29 npm ERR! npm -v 1.4.21 npm ERR! code ELIFECYCLE npm ERR! npm ERR! Additional logging details can be found in: npm ERR! /home/ikuru/npm-debug.log npm ERR! not ok code 0

    Sorry again for the nube-ish issue & thanks in advance!

    opened by iku000888 3
  • NPM install failed

    NPM install failed

    I am using latest Xubuntu, and I could not install the Node package. Console output is:

    $ sudo npm -g install ttystudio
    > [email protected] install /usr/local/lib/node_modules/ttystudio/node_modules/pty.js
    > node-gyp rebuild
    
    /bin/sh: node: command not found
    gyp: Call to 'node -e "require('nan')"' returned exit status 127. while trying to load binding.gyp
    gyp ERR! configure error 
    gyp ERR! stack Error: `gyp` failed with exit code: 1
    gyp ERR! stack     at ChildProcess.onCpExit (/usr/share/node-gyp/lib/configure.js:344:16)
    gyp ERR! stack     at ChildProcess.EventEmitter.emit (events.js:98:17)
    gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:797:12)
    gyp ERR! System Linux 3.19.0-22-generic
    gyp ERR! command "nodejs" "/usr/bin/node-gyp" "rebuild"
    gyp ERR! cwd /usr/local/lib/node_modules/ttystudio/node_modules/pty.js
    gyp ERR! node -v v0.10.25
    gyp ERR! node-gyp -v v0.12.2
    gyp ERR! not ok 
    npm WARN This failure might be due to the use of legacy binary "node"
    npm WARN For further explanations, please read
    /usr/share/doc/nodejs/README.Debian
    
    npm ERR! [email protected] install: `node-gyp rebuild`
    npm ERR! Exit status 1
    npm ERR! 
    npm ERR! Failed at the [email protected] install script.
    npm ERR! This is most likely a problem with the pty.js package,
    npm ERR! not with npm itself.
    npm ERR! Tell the author that this fails on your system:
    npm ERR!     node-gyp rebuild
    npm ERR! You can get their info via:
    npm ERR!     npm owner ls pty.js
    npm ERR! There is likely additional logging output above.
    
    npm ERR! System Linux 3.19.0-22-generic
    npm ERR! command "/usr/bin/nodejs" "/usr/bin/npm" "-g" "install" "ttystudio"
    npm ERR! cwd /home/ern0
    npm ERR! node -v v0.10.25
    npm ERR! npm -v 1.4.21
    npm ERR! code ELIFECYCLE
    npm ERR! 
    npm ERR! Additional logging details can be found in:
    npm ERR!     /home/ern0/npm-debug.log
    npm ERR! not ok code 0
    
    opened by ern0 3
  • display error of bash: command not found in pseudo-terminal while start record

    display error of bash: command not found in pseudo-terminal while start record

    in macOS x HighSierra 10.13.2

    I have a custom method in ~/.bash_profile which prompt git branch name in terminal

    parse_git_branch() {
        git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
    }
    # some other code
    export PS1="${GREEN}\u@${YELLOW}\h:${LIGHT_RED}\w${LIGHT_GREEN}\$(parse_git_branch)${WHITE} $ 
    

    now when I start recording with

    ttystudio --outout.gif --log

    it display error

    parse: parse_git_branch: command not found

    How to overcome this issue?

    opened by zymr-keshav 1
  • more friendly error info

    more friendly error info

    More friendly error info when missing output file.

    The old error:

    ➜ ttystudio
    Error: No output file specified.
        at /Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/bin/ttystudio:80:13
        at Screen.done (/Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/lib/record.js:92:7)
        at Screen.EventEmitter._emit (/Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/node_modules/blessed/lib/events.js:90:20)
        at Screen.EventEmitter.emit (/Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/node_modules/blessed/lib/events.js:107:17)
        at Program.<anonymous> (/Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/node_modules/blessed/lib/widgets/screen.js:480:12)
        at Program.emit (events.js:110:17)
        at ReadStream.<anonymous> (/Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/node_modules/blessed/lib/program.js:310:10)
        at ReadStream.emit (events.js:110:17)
        at /Users/zli/.nvm/versions/node/v0.12.2/lib/node_modules/ttystudio/node_modules/blessed/lib/keys.js:312:14
        at Array.forEach (native)
    
    opened by zhiyelee 1
  • rm unnecessary node_modules rule

    rm unnecessary node_modules rule

    rm unnecessary node_modules rule, npm will ignore node_modules, .git by default

    https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

    opened by zhiyelee 1
  • run ttystudio with no flags should show help

    run ttystudio with no flags should show help

    if ttystudio is run without flags a new shell is started rather than presenting the user the help page. It seems there is no point in having ttystudio create a new session if the output has not been set. Might be better to just default to $ ttystudio -h implicitly

    opened by kangman 0
  • Is this project abandoned?

    Is this project abandoned?

    Seems like issues are open for several years, and it fails to install.

    if it is abandoned, perhaps mention it somewhere in the README and archive it? it is still being recommended by some, and I remember that it worked well when it did, so I would love for it to not be abandoned...

    opened by DannyBen 4
  • Change the prompt of the shell

    Change the prompt of the shell

    Hi! I wanted to use a minimal prompt for terminal recordings, but if I do export PS1="\\$ " and then run ttystudio, PS1 seems to be reset to the default.

    What can I do to achieve a minimal prompt (like "$ ") in ttystudio?

    opened by moi90 0
  • [wishlist] support terminal color scheme

    [wishlist] support terminal color scheme

    I'm using the Solarized dark color scheme in my terminal and vim, but that isn't reflected yet by ttystudio. Recordings look like out when really it looks like screen From this blog post I gather that it is actually possible to implement it.

    opened by nschloe 0
  • Special characters fonts?

    Special characters fonts?

    I tried to compile my own font using the BDFs from https://github.com/powerline/fonts/tree/a44abd0e742ad6e7fd8d8bc4c3cad5155c9f3a92/Terminus/BDF but it still results in a white box for special characters :(

    Original: screenshot from 2017-06-14 14-27-18

    Output: screenshot from 2017-06-14 14-26-43

    The quality is much worse as well.

    opened by FallingSnow 1
  • Is it possible to know the last frame from a json file ?

    Is it possible to know the last frame from a json file ?

    Is there a command that would let me know that last frame ? so I can trigger a compile command knowing that last frame (160) before hand --compile --range=0-150 letting me drop the last 10 frames of the series.

    Thanks for this project, pretty awesome, cheers.

    opened by handmilkingsoftware 0
Owner
Christopher Jeffrey (JJ)
Christopher Jeffrey (JJ)
Uses marked-terminal to render a README.md for any npm module in the terminal.

modhelp Uses marked-terminal to render a README.md for any npm module in the terminal. Now with built-in pager! Page up/down, arrow keys to scroll lin

Jason Livesay 23 Feb 8, 2022
Terminal ui for discord with interactive terminal

dickord why No fucking clue i was bored or something. why does it look dogshit Try and find a node module that supports terminal functions like trauma

Hima 3 Nov 7, 2022
Sublime-like terminal-based text editor

slap ?? slap is a Sublime-like terminal-based text editor that strives to make editing from the terminal easier. It has: first-class mouse support (ev

slap 6.1k Jan 1, 2023
rtail(1) - Terminal output to the browser in seconds, using UNIX pipes.

rtail(1) Terminal output to the browser in seconds, using UNIX pipes. rtail is a command line utility that grabs every line in stdin and broadcasts it

Kilian Ciuffolo 1.6k Jan 6, 2023
Pipeable javascript. Quickly filter, map, and reduce from the terminal

Pipeable JavaScript - another utility like sed/awk/wc... but with JS! Quickly filter, map and reduce from the command line. Features a streaming API.

Daniel St. Jules 410 Dec 10, 2022
Translations with speech synthesis in your terminal as a node package

Normit Normit is an easy way to translate stuff in your terminal. You can check out its Ruby gem version termit. Installation npm install normit -g Us

Paweł Urbanek 234 Jan 1, 2023
Terminal task list

listr Terminal task list Install $ npm install --save listr Usage const execa = require('execa'); const Listr = require('listr'); const tasks = new

Sam Verschueren 3.1k Jan 3, 2023
📜 Create mutable log lines into the terminal, and give life to your logs!

Because Logging can be pretty and fun Installation $ npm install draftlog What it does It allows you to re-write a line of your log after being writt

Ivan Seidel 1.2k Dec 31, 2022
Display images in the terminal

terminal-image Display images in the terminal Works in any terminal that supports colors. In iTerm, the image will be displayed in full resolution, si

Sindre Sorhus 905 Dec 25, 2022
:rainbow: Beautiful color gradients in terminal output

gradient-string Beautiful color gradients in terminal output Install $ npm i gradient-string Usage const gradient = require('gradient-string'); cons

Boris K 864 Jan 3, 2023
Create clickable links in the terminal

terminal-link Create clickable links in the terminal Install $ npm install terminal-link Usage import terminalLink from 'terminal-link'; const link

Sindre Sorhus 539 Dec 31, 2022
Reliably get the terminal window size

term-size Reliably get the terminal window size Because process.stdout.columns doesn't exist when run non-interactively, for example, in a child proce

Sindre Sorhus 132 Oct 11, 2022
Truncate a string to a specific width in the terminal

cli-truncate Truncate a string to a specific width in the terminal Gracefully handles ANSI escapes. Like a string styled with chalk. It also supports

Sindre Sorhus 78 Oct 10, 2022
Execute shell commands in terminal

Execute shell commands in terminal

skanehira 9 Dec 11, 2021
Add a hungry turtle to your terminal and feed it every time you mistype 'npm' as 'nom'

Nom Does this ever happen to you? You happily code away on a project, navigating the command line like a pro, testing, error logging, installing packa

Meike Hankewicz 5 Apr 26, 2022
Just a minimal library to do some terminal stuff.

Termctl A simple library to do some basic terminal stuff. Usage const termctl = require("termctl"); Note: We have tested this on Linux Mint and Window

Biraj 4 Sep 28, 2021
A terminal for a more modern age

Downloads: Latest release Repositories: Debian/Ubuntu-based, RPM-based Latest nightly build This README is also available in: Korean 简体中文 Tabby (forme

null 41.8k Dec 30, 2022
DataENV is a cli tool that allows you to save data temporarily using your terminal.

DataEnv CLI Instllation npm install -g dataenv Usage Table of Contents LocalStorage npx dataenv save Parameters npx dataenv show Parameters npx dataen

PGamerX 2 Feb 5, 2022