Command-line JSON viewer 🔥
Clone or download
Latest commit 89faa8b Nov 14, 2018
Failed to load latest commit information.
.gitignore Add standalone binary dist Jan 26, 2018
.travis.yml ci: test Node.js 8, 10 and 11 (#26) Nov 8, 2018
LICENSE Create LICENSE Jan 25, 2018 Update Nov 14, 2018
fx.js Limit expand all Nov 8, 2018
index.js Add .fxrc support (#22) Nov 10, 2018
package.json Update package.json Nov 13, 2018
test.js Add dot feature Aug 30, 2018


fx example

* Function eXecution

Build Status npm version

Command-line JSON processing tool


  • Don't need to learn new syntax
  • Plain JavaScript
  • Formatting and highlighting
  • Standalone binary
  • Interactive mode 🎉


$ npm install -g fx

Or download standalone binary from releases page.


Pipe into fx any JSON and anonymous function for reducing it.

$ echo '{...}' | fx [code ...]

Start interactive mode without passing any arguments:

$ curl ... | fx

Anonymous function

Use an anonymous function as reducer which gets JSON and processes it:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x =>[0].bar'


If you don't pass anonymous function param => ..., code will be automatically transformed into anonymous function. And you can get access to JSON by this keyword:

$ echo '{"foo": [{"bar": "value"}]}' | fx '[0].bar'


It is possible to omit this keyword:

$ echo '{"foo": [{"bar": "value"}]}' | fx .foo[0].bar

If single dot is passed, JSON will be processed without modification:

$ echo '{"foo": "bar"}' | fx .
  "foo": "bar"


You can pass any number of anonymous functions for reducing JSON:

$ echo '{"foo": [{"bar": "value"}]}' | fx 'x =>' 'this[0]' ''


If passed code contains yield keyword, generator expression will be used:

$ curl ... | fx 'for (let user of this) if (user.login.startsWith("a")) yield user'

Access to JSON through this keyword:

$ echo '["a", "b"]' | fx 'yield* this'
$ echo '["a", "b"]' | fx 'yield* this; yield "c";'


You can update existing JSON using spread operator:

$ echo '{"count": 0}' | fx '{...this, count: 1}'
  "count": 1

Using packages

Use any npm package by installing it globally:

$ npm install -g lodash
$ cat package.json | fx 'require("lodash").keys(this.dependencies)'

Using .fxrc

Create .fxrc file in $HOME directory, and require any packages or define global functions.

For example, access all lodash methods without _ prefix. Put in your .fxrc file:

Object.assign(global, require('lodash'))

And now you will be able to call all lodash methods. For example, see who's been committing to react recently:

curl '' \
| fx 'mapValues(groupBy(this, ""), size)'

To be able require global modules make sure you have correct NODE_PATH env variable.

export NODE_PATH=/usr/local/lib/node_modules


If you need something different then JSON (for example arguments for xargs) do not return anything from reducer. undefined value printed into stderr by default.

echo '[]' | fx 'void 0'
echo '[1,2,3]' | fx 'this.forEach(x => console.log(x))' 2>/dev/null | xargs echo
1 2 3

Other examples

Convert object to array:

$ cat package.json | fx 'Object.keys(this.dependencies)'

By the way, fx has shortcut for Object.keys(this). Previous example can be rewritten as:

$ cat package.json | fx this.dependencies ?

Interactive mode

Start interactive mode without passing any arguments:

$ curl ... | fx

Click on fields to expand or collapse JSON tree, use mouse wheel to scroll view.

Next commands available in interactive mode:

Key Command
q or Esc or Ctrl+c Exit
e/E Expand/Collapse all
up/down or k/j Scroll up/down one line
g/G Goto top/bottom

Selecting text

You may found what you can't just select text in fx. This is due the fact that all mouse events redirected to stdin. To be able select again you need instruct your terminal not to do it. This can be done by holding special keys while selecting:

Key Terminal
Option+Mouse iTerm2, Hyper
Shift+Mouse Linux


  • xx - fx-like JSON tool (go)
  • ymlx - fx-like YAML cli processor