HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
tomnomnom
gron
Go2018–2026
tomnomnom / gron

gron

Make JSON greppable!

82Distinct people
95Mentions
2Explicit recommenders
14.5KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Make JSON greppable!

GitHub

Where it is used

No documented product use was verified in the last source check.

What people are saying

Also highly recommended is gron [0], to make json easily searchable [0] https://github.com/TomNomNom/gron

kitd used a recommendation phrase. 2 indexed comments match. This is a phrase match, not a verdict.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 3:56:07 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year95 dated mentions

Observed mentions: 2018-04-01 10:48:55 UTC to 2026-10-27 17:47:59 UTC.

051015202018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 5 mentions; 1 submissions, 4 comments20182019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 10 mentions; 0 submissions, 10 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 13 mentions; 1 submissions, 12 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 11 mentions; 0 submissions, 11 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 17 mentions; 2 submissions, 15 comments20222023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 18 mentions; 2 submissions, 16 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 10 mentions; 0 submissions, 10 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 6 mentions; 1 submissions, 5 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC514
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC10010
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC13112
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC11011
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC17215
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC18216
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC10010
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC505
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC615

From the project README

An excerpt from the repository, fetched Nov 12, 2026.

Read the project’s introduction
gron Make JSON greppable! gron transforms JSON into discrete assignments to make it easier to grep for what you want and see the absolute 'path' to it. It eases the exploration of APIs that return large blobs of JSON but have terrible documentation. ▶ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" json[0].commit.author = {}; json[0].commit.author.date = "2016-07-02T10:51:21Z"; json[0].commit.author.email = "mail@tomnomnom.com"; json[0].commit.author.name = "Tom Hudson"; gron can work backwards too, enabling you to turn your filtered data back into JSON: ▶ gron "https://api.github.com/repos/tomnomnom/gron/commits?per_page=1" | fgrep "commit.author" | gron --ungron [ { "commit": { "author": { "date": "2016-07-02T10:51:21Z", "email": "mail@tomnomnom.com", "name": "Tom Hudson" } } } ] Disclaimer: the GitHub API has fantastic documentation, but it makes for a good example. Installation gron has no runtime dependencies. You can just download a binary for Linux, Mac, Windows or FreeBSD and run it. Put the binary in your $PATH (e.g. in /usr/local/bin) to make it easy to use: ▶ tar xzf gron-linux-amd64-0.1.5.tgz ▶ sudo mv gron /usr/local/bin/ If you're a Mac user you can also install gron via brew: ▶ brew install gron Or if you're a Go user you can use go install: ▶ go install github.com/tomnomnom/gron@latest It's recommended that you alias ungron or norg (or both!) to gron --ungron. Put something like this in your shell profile (e.g. in ~/.bashrc): alias norg="gron --ungron" alias ungron="gron --ungron" Or you could create a shell script in your $PATH named ungron or norg to affect all users: gron --ungron "$@" Usage Get JSON from a file: ▶ gron testdata/two.json json = {}; json.contact = {}; json.contact.email = "mail@tomnomnom.com"; json.contact.twitter = "@TomNomNom"; json.github = "https://github.com/tomnomnom/"; json.likes = []; json.likes[0] = "code"; json.likes[1] = "cheese"; json.likes[2] = "meat"; json.name = "Tom"; From a URL: ▶ gron http://headers.jsontest.com/ json = {}; json.Host = "headers.jsontest.com"; json["User-Agent"] = "gron/0.1"; json["X-Cloud-Trace-Context"] = "6917a823919477919dbc1523584ba25d/11970839830843610056"; Or from stdin: ▶ curl -s http://headers.jsontest.com/ | gron json = {}; json.Accept = "*/*"; json.Host = "headers.jsontest.com"; json["User-Agent"] = "curl/7.43.0"; json["X-Cloud-Trace-Context"] = "c70f7bf26661c67d0b9f2cde6f295319/13941186890243645147"; Grep for something and easily see the path to it: ▶ gron testdata/two.json | grep twitter json.contact.twitter = "@TomNomNom"; gron makes diffing JSON easy too: ▶ diff <(gron two.json) <(gron two-b.json) 3c3 < json.contact.email = "mail@tomnomnom.com"; --- > json.contact.email = "contact@tomnomnom.com"; The output of gron is valid JavaScript: ▶ gron testdata/two.json > tmp.js ▶ echo "console.log(json);" >> tmp.js ▶ nodejs tmp.js { contact: { email: 'mail@tomnomnom.com', twitter: '@TomNomNom' }, github: 'https://github.com/tomnomnom/', likes: [ 'code', 'cheese', 'meat' ], name: 'Tom' } It's also possible to obtain the gron output as JSON stream via the --json switch: ▶ curl -s http://headers.jsontest.com/ | gron --json [[],{}] [["Accept"],"*/*"] [["Host"],"headers.jsontest.com"] [["User-Agent"],"curl/7.43.0"] [["X-Cloud-Trace-Context"],"c70f7bf26661c67d0b9f2cde6f295319/13941186890243645147"] ungronning gron can also turn its output back into JSON: ▶ gron testdata/two.json | gron -u { "contact": { "email": "mail@tomnomnom.com", "twitter": "@TomNomNom" }, "github": "https://github.com/tomnomnom/", "likes": [ "code", "cheese", "meat" ], "name": "Tom" } This means you use can use gron with grep and other tools to modify JSON: ▶ gron testdata/two.json | grep likes | gron --ungron { "likes": [ "code", "cheese", "meat" ] } or ▶ gron --json testdata/two.json | grep likes | gron --json --ungron { "likes": [ "code", "cheese", "meat" ] } To preserve array keys, arrays are padded with null when values are missing: ▶ gron testdata/two.json | grep likes | grep -v cheese json.likes = []; json.likes[0] = "code"; json.likes[2] = "meat"; ▶ gron testdata/two.json | grep likes | grep -v cheese | gron --ungron { "likes": [ "code", null, "meat" ] } If you get creative you can do some pretty neat tricks with gron, and then ungron the output back into JSON. Get Help ▶ gron --help Transform JSON (from a file, URL, or stdin) into discrete assignments to make it greppable Usage: gron [OPTIONS] [FILE|URL|-] Options: -u, --ungron Reverse the operation (turn assignments back into JSON) -v, --values Print just the values of provided assignments -c, --colorize Colorize output (default on tty) -m, --monochrome Monochrome (don't colorize output) -s, --stream Treat each line of input as a separate JSON object -k, --insecure Disable certificate validation -j, --json Represent gron data as JSON stream --no-sort Don't sort output (faster) --version Print version information Exit Codes: 0 OK 1 Failed to open file 2 Failed to read input 3 Failed to form statements 4 Failed to fetch URL 5 Failed to parse statements 6 Failed to encode JSON Examples: gron /tmp/apiresponse.json gron http://jsonplaceholder.typicode.com/users/1 curl -s http://jsonplaceholder.typicode.com/users/1 | gron gron http://jsonplaceholder.typicode.com/users/1 | grep company | gron --ungron FAQ Wasn't this written in PHP before? Yes it was! The original version is preserved here for posterity. Why the change to Go? Mostly to remove PHP as a dependency. There's a lot of people who work with JSON who don't have PHP installed. Why shouldn't I just use jq? jq is awesome, and a lot more powerful than gron, but with that power comes complexity. gron aims to make it easier to use the tools you already know, li
Read the full README on GitHub

What Hacker News says

95 sources
Big fan of gron[0] and zoxide[1]. Gron for flattening and viewing JSON, and zoxide (z) for fuzzily jumping around on my system or on remote systems with z installed. Also been using Rad [2] (disclaimer: am author) to replace my suite of Bash scripts and write new ones, quite happy with one atm which sets reminders e.g. 'remind 2h check the CI build' which will give me an OS reminder in two hours, I use it a ton at work. [0] https://github.com/tomnomnom/gron [1] https://github.com/ajeetdsouza/zoxide [2] https://github.com/amterp/rad
In Ask HN: What is your favorite lightweight tool or CLI utility in 2026?

Showing the 15 most recent of 95 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.