HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
jqlang
jq
C2012–2026
jqlang / jq

jq

Command-line JSON processor

79Distinct people
104Mentions
2Explicit recommenders
36.1KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Command-line JSON processor

GitHub

Where it is used

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

What people are saying

I highly recommend anyone to look at jq's VM implementation some time, it's kind of mind-blowing how it works under the hood:…

bouk 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

Mentioned in the same Hacker News threads. That is not proof they are substitutes.

This week on Hacker News

Nov 8–Nov 15 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/15/2026, 6:59:22 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 year104 dated mentions

Observed mentions: 2012-10-21 17:50:32 UTC to 2026-03-29 02:02:20 UTC.

05101520252012-01-01 00:00:00 UTC to 2013-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments20122013-01-01 00:00:00 UTC to 2014-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2014-01-01 00:00:00 UTC to 2015-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2015-01-01 00:00:00 UTC to 2016-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments2016-01-01 00:00:00 UTC to 2017-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments2017-01-01 00:00:00 UTC to 2018-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 12 mentions; 0 submissions, 12 comments2019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 7 mentions; 0 submissions, 7 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 9 mentions; 0 submissions, 9 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 8 mentions; 3 submissions, 5 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 14 mentions; 3 submissions, 11 comments2023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 25 mentions; 5 submissions, 20 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 11 mentions; 0 submissions, 11 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 8 mentions; 2 submissions, 6 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 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
20122012-01-01 00:00:00 UTC2013-01-01 00:00:00 UTC101
20132013-01-01 00:00:00 UTC2014-01-01 00:00:00 UTC202
20142014-01-01 00:00:00 UTC2015-01-01 00:00:00 UTC000
20152015-01-01 00:00:00 UTC2016-01-01 00:00:00 UTC211
20162016-01-01 00:00:00 UTC2017-01-01 00:00:00 UTC211
20172017-01-01 00:00:00 UTC2018-01-01 00:00:00 UTC101
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC12012
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC707
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC909
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC835
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC14311
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC25520
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC11011
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC826
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC202

From the project README

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

Read the project’s introduction
jq jq is a lightweight and flexible command-line JSON processor akin to sed,awk,grep, and friends for JSON data. It's written in portable C and has zero runtime dependencies, allowing you to easily slice, filter, map, and transform structured data. Documentation Official Documentation: jqlang.org Try jq Online: play.jqlang.org Installation Prebuilt Binaries Download the latest releases from the GitHub release page. The platform-specific assets are standalone executables, not archives. On macOS and Linux, rename the downloaded file to jq and make it executable with chmod +x jq. Docker Image Pull the jq image to start quickly with Docker. Run with Docker Example: Extracting the version from a package.json file docker run --rm -i ghcr.io/jqlang/jq:latest < package.json '.version' Example: Extracting the version from a package.json file with a mounted volume docker run --rm -i -v "$PWD:$PWD" -w "$PWD" ghcr.io/jqlang/jq:latest '.version' package.json Building from source Dependencies libtool make automake autoconf Instructions git submodule update --init # if building from git to get oniguruma autoreconf -i # if building from git ./configure --with-oniguruma=builtin make clean # if upgrading from a version previously built from source make -j8 make check sudo make install sudo ldconfig # on Linux, if jq cannot find libjq.so Build a statically linked version: make clean make LDFLAGS=-all-static If you're not using the latest git version but instead building a released tarball (available on the release page), skip the autoreconf step, and flex or bison won't be needed. Cross-Compilation For details on cross-compilation, check out the GitHub Actions file and the cross-compilation wiki page. Community & Support Questions & Help: Stack Overflow (jq tag) Chat & Community: Join us on Discord Wiki & Advanced Topics: Explore the Wiki License jq is released under the MIT License. jq's documentation is licensed under the Creative Commons CC BY 3.0. jq uses parts of the open source C library "decNumber", which is distributed under ICU License
Read the full README on GitHub

What Hacker News says

12 sources
What next? Job control signals?? :) (EDIT: How about tmux?) Anyways, this is fantastic. Finally, proper ssh functionality! This will encourage development of console (text-oriented) apps for Windows, which I hope will be much simpler. Interfacing with the console can be really difficult if you're coming from *nix. Ideally all the WIN32-specific code in, e.g., jq[0], could be ripped out. [0] https://github.com/stedolan/jq (look in src/main.c)
In Introducing the Windows Pseudo Console (ConPty)
Formatting: Written in Rust - fd: A simple, fast and user-friendly alternative to 'find' https://github.com/sharkdp/fd - ripgrep: ripgrep recursively searches directories for a regex pattern https://github.com/BurntSushi/ripgrep - exa: Replacement for 'ls' written in Rust https://github.com/ogham/exa - bat: A 'cat' replacement. I recommend following the customizations. https://github.com/sharkdp/bat Written in Python - asciinema: Terminal session recorder https://github.com/asciinema/asciinema - httpie: Modern command line HTTP client https://github.com/jakubroztocil/httpie - visidata: A terminal spreadsheet multitool for discovering and arranging data https://github.com/saulpw/visidata - youtube-dl: Command-line program to download videos from YouTube.com and other video sites https://github.com/rg3/youtu
Read the rest
be-dl - pgcli: Postgres cli with autocomplete and syntax highlighting https://github.com/dbcli/pgcli Written in C - jq: Command-line JSON processor https://github.com/stedolan/jq - tmux: a terminal multiplexer https://github.com/tmux/tmux - pspg: postgres pager (you can combine it with pgcli) https://github.com/okbob/pspg reply
In Ask HN: What are your favorite terminal programs?
Written in Rust: - fd: A simple, fast and user-friendly alternative to 'find' https://github.com/sharkdp/fd - ripgrep: ripgrep recursively searches directories for a regex pattern https://github.com/BurntSushi/ripgrep - exa: Replacement for 'ls' written in Rust https://github.com/ogham/exa - bat: A 'cat' replacement. I recommend following the customizations. https://github.com/sharkdp/bat Written in Python: - asciinema: Terminal session recorder https://github.com/asciinema/asciinema - httpie: Modern command line HTTP client https://github.com/jakubroztocil/httpie - visidata: A terminal spreadsheet multitool for discovering and arranging data https://github.com/saulpw/visidata - youtube-dl: Command-line program to download videos from YouTube.com and other video sites
Read the rest
https://github.com/rg3/youtube-dl - pgcli: Postgres cli with autocomplete and syntax highlighting https://github.com/dbcli/pgcli Written in C - jq: Command-line JSON processor https://github.com/stedolan/jq - tmux: a terminal multiplexer https://github.com/tmux/tmux - pspg: postgres pager (you can combine it with pgcli) https://github.com/okbob/pspg
In Ask HN: What are your favorite terminal programs?
If this is at all like jq's libjq's jv API [0], then this it will be great. The C-coded jv API gives you immutable JSON-ish data structures, with the illusion (and sometimes truth) that they are actually mutable. For example, say you have jv foo(jv a) { return jv_array_append(a, jv_string("foo")); } Here `jv_array_append()` looks like it must mutate `a`. What actually happens under the covers is that if `a` has just one reference, then indeed, `a` will be mutated, but if it has more than one reference then a new array will be constructed as a copy of `a`, `a`'s reference count will be decremented, the copy will be mutated, and lastly the copy will be returned. This might make it a bit clearer: jv a = jv_array(); a = jv_array_append(a, jv_true()); a = jv_array_append(a, jv_false()); a = jv_array_append(
Read the rest
a, jv_null()); Each assignment to `a` here can be a brand new array, though since in this code snippet `a` will always have just one reference, in fact `a` will always be mutated. Now, look at this: jv a = JV_ARRAY(jv_true(), jv_false(), jv_null()); set_thingy(jv_copy(a)); a = jv_array_append(a, jv_number(10)); here at the third line `a` might have two references, depending on what `set_thingy()` might have done with its reference. Perhaps `set_thingy()` saved its reference in a global or thread-local variable, or some object reachable from a global or thread-local variable, in which case the last call to `jv_array_append()` in this example will produce a brand new array. See the jq jv wiki[1]. Now, this is all C. But in Rust all of this would be even more powerful. [0] https://github.com/stedolan/jq/blob/master/src/jv.h [1] https://github.com/stedolan/jq/wiki/C-API:-jv
In Immutable.rs: immutable data structures for Rust
I'm not sure how to build a lock-less doubly-linked list in C, honestly, and it may not be possible. I've authored several lock-less data structures in C, but I've not thought about this one... A singly-linked list is easy-peasy for addition at the head or tail (just atomic reads and atomic compare-and-swap), though deletion is tricky (because the obvious CAS thing to do is racy if you'd free the deleted element, and you do want to free it eventually...). A good pattern for thread-safety is to use immutable data structures. jq's jv API [0] is a great example of how to make it easy to deal with immutable data structures. Of course, you don't get to have cycles this way and so you don't get to have doubly-linked lists. Also, for root state you kinda need something like a thread-safe variable (of which there are a number of flavors in C
Read the rest
lojure, Haskell, and others) where when you read it you're guaranteed to have a stable reference to the value, but also guaranteed that garbage will be collected -- this is great when the values are immutable data structures. You could have cycles in immutable data structures if you install the cycle before ever sharing with other threads and can make sure you don't fall into a loop when releasing the immutable value. But this is the sort of thing that requires "unsafe mode" unless the compiler/runtime can figure out that a) you haven't shared the thing yet, b) it won't be mutated once shared. I don't know how to figure that out statically, but that might be a good avenue for research. [0] https://github.com/stedolan/jq/wiki/C-API:-jv
In Why writing a linked list in safe Rust is so damned hard

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.