HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
mikefarah
yq
Go2019–2026
mikefarah / yq

yq

yq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor

27Distinct people
33Mentions
0Explicit recommenders
16.3KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

yq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor

GitHub

Where it is used

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

What people are saying

No recommendation phrase was found in the indexed comments.

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 7–Nov 14 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/14/2026, 5:04:57 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 year33 dated mentions

Observed mentions: 2019-10-28 14:44:52 UTC to 2026-04-27 18:37:00 UTC.

02468102019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 2 mentions; 1 submissions, 1 comments20192020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 10 mentions; 1 submissions, 9 comments20222023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 8 mentions; 1 submissions, 7 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 6 mentions; 0 submissions, 6 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 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
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC211
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC303
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC110
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC1019
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC817
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC606
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC202
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC101

From the project README

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

Read the project’s introduction
yq A lightweight and portable command-line YAML, JSON, INI and XML processor. yq uses jq (a popular JSON processor) like syntax but works with yaml files as well as json, kyaml, xml, ini, properties, csv and tsv. It doesn't yet support everything jq does - but it does support the most common operations and functions, and more is being added continuously. yq is written in Go - so you can download a dependency free binary for your platform and you are good to go! If you prefer there are a variety of package managers that can be used as well as Docker and Podman, all listed below. Quick Usage Guide Basic Operations Read a value: yq '.a.b[0].c' file.yaml Pipe from STDIN: yq '.a.b[0].c' < file.yaml Update a yaml file in place: yq -i '.a.b[0].c = "cool"' file.yaml Update using environment variables: NAME=mike yq -i '.a.b[0].c = strenv(NAME)' file.yaml Advanced Operations Merge multiple files: # merge two files yq -n 'load("file1.yaml") * load("file2.yaml")' # merge using globs (note: `ea` evaluates all files at once instead of in sequence) yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml Multiple updates to a yaml file: yq -i ' .a.b[0].c = "cool" | .x.y.z = "foobar" | .person.name = strenv(NAME) ' file.yaml Find and update an item in an array: # Note: requires input file - add your file at the end yq -i '(.[] | select(.name == "foo") | .address) = "12 cat st"' data.yaml Convert between formats: # Convert JSON to YAML (pretty print) yq -Poy sample.json # Convert YAML to JSON yq -o json file.yaml # Convert XML to YAML yq -o yaml file.xml See recipes for more examples and the documentation for more information. Take a look at the discussions for common questions, and cool ideas Install Download the latest binary wget Use wget to download pre-compiled binaries. Choose your platform and architecture: For Linux (example): # Set your platform variables (adjust as needed) VERSION=v4.2.0 PLATFORM=linux_amd64 # Download compressed binary wget https://github.com/mikefarah/yq/releases/download/${VERSION}/yq_${PLATFORM}.tar.gz -O - |\ tar xz && sudo mv yq_${PLATFORM} /usr/local/bin/yq # Or download plain binary wget https://github.com/mikefarah/yq/releases/download/${VERSION}/yq_${PLATFORM} -O /usr/local/bin/yq &&\ chmod +x /usr/local/bin/yq Latest version (Linux AMD64): wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/local/bin/yq &&\ chmod +x /usr/local/bin/yq Available platforms: linux_amd64, linux_arm64, linux_arm, linux_386, darwin_amd64, darwin_arm64, windows_amd64, windows_386, etc. MacOS / Linux via Homebrew: Using Homebrew brew install yq Linux via snap: snap install yq Snap notes yq installs with strict confinement in snap, this means it doesn't have direct access to root files. To read root files you can: sudo cat /etc/myfile | yq '.a.path' And to write to a root file you can either use sponge: sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile or write to a temporary file: sudo cat /etc/myfile | yq '.a.path = "value"' | sudo tee /etc/myfile.tmp sudo mv /etc/myfile.tmp /etc/myfile rm /etc/myfile.tmp Run with Docker or Podman One-time use: # Docker - process files in current directory docker run --rm -v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml # Podman - same usage as Docker podman run --rm -v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml Security note: You can run yq in Docker with restricted privileges: docker run --rm --security-opt=no-new-privileges --cap-drop all --network none \ -v "${PWD}":/workdir mikefarah/yq '.a.b[0].c' file.yaml Pipe data via STDIN: You'll need to pass the -i --interactive flag to Docker/Podman: # Process piped data docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml # Same with Podman podman run -i --rm mikefarah/yq '.this.thing' < myfile.yml Run commands interactively: docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq podman run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq It can be useful to have a bash function to avoid typing the whole docker command: yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@" } yq() { podman run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@" } Running as root: yq's container image no longer runs under root (#860). If you'd like to install more things in the container image, or you're having permissions issues when attempting to read/write files you'll need to either: docker run --user="root" -it --entrypoint sh mikefarah/yq podman run --user="root" -it --entrypoint sh mikefarah/yq Or, in your Dockerfile: FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yq Missing timezone data By default, the alpine image yq uses does not include timezone data. If you'd like to use the tz operator, you'll need to include this data: FROM mikefarah/yq USER root RUN apk add --no-cache tzdata USER yq Podman with SELinux If you are using podman with SELinux, you will need to set the shared volume flag :z on the volume mount: -v "${PWD}":/workdir:z GitHub Action - name: Set foobar to cool uses: mikefarah/yq@master with: cmd: yq -i '.foo.bar = "cool"' 'config.yml' - name: Get an entry with a variable that might contain dots or spaces id: get_username uses: mikefarah/yq@master with: cmd: yq '.all.children.["${{ matrix.ip_address }}"].username' ops/inventories/production.yml - name: Reuse a variable obtained in another step run: echo ${{ steps.get_username.outputs.result }} See https://mikefarah.gitbook.io/yq/usage/github-action for more. Go Install: go install github.com/mikefarah/yq/v4@latest Use yq as a Go library The command above installs the yq CLI. To use yq in a Go program instead, add it to your Go module with go get github.com/mikefarah/yq/v4 and import github.com/mikefarah/yq/v4/pkg/yqlib. See examples/library/main.go for a simple, runnable example (go run ./examples/library). Community Supported Installation metho
Read the full README on GitHub

What Hacker News says

33 sources
I'd be curious how the performance compares to this Rust jq clone: cargo install --locked jaq (you might also be able to add RUSTFLAGS="-C target-cpu=native" to enable optimizations for your specific CPU family) "cargo install" is an underrated feature of Rust for exactly the kind of use case described in the article. Because it builds the tools from source, you can opt into platform-specific features/instructions that often aren't included in binaries built for compatibility with older CPUs. And no need to clone the repo or figure out how to build it; you get that for free. jaq[1] and yq[2] are my go-to options anytime I'm using jq and need a quick and easy performance boost. [1] https://github.com/01mf02/jaq [2] https://github.com/mikefarah/yq
In Make Ubuntu packages 90% faster by rebuilding them
What I often use to just get the full key paths is yq (https://github.com/mikefarah/yq), piping into grep when necessary yq -o=props <file> e.g. kind = Ingress metadata.name = hello spec.rules.0.host = localhost spec.rules.0.http.paths.0.pathType = ImplementationSpecific spec.rules.0.http.paths.0.backend.service.name = hello spec.rules.0.http.paths.0.backend.service.port.number = 80 The one drawback I've encountered so far are multi-doc files - yq can certainly handle those, but you have to script the loop yourself.
In Show HN: Flatito, grep for YAML and JSON files
combined with gosh - a golang shell interpreter it's pretty easy to create scripts that run on all the platforms and architectures, even future targets go run mvdan.cc/sh/v3/cmd/gosh@latest -c ' go run github.com/mikefarah/yq/v3@latest n foo.bar.hello world | go run github.com/cezarsa/glolcat@latest'
In Go run
jq feels like a much more robust tool than yq. I understand that the task of processing YAML is much harder than JSON, but: - yq changed its syntax between version 3 and 4 to be more like jq (but not quite the same for some reason) - yq has no if-then-else https://github.com/mikefarah/yq/issues/95 which is a poor design (or omission) in my opinion So yq works when you need to process YAML, it can even handle comments quite well. Buy for pure JSON processing jq is a better tool.
In Jaq – A jq clone focused on correctness, speed, and simplicity
* I note this is not splitting one large one into small, but the actually starting with smaller ones, as the other commenter suggested I store different api logic in their own files. Then I use yq to stitch them all together. After which, I use openapi-generator to make a yaml output. https://gist.github.com/freshteapot/3637e8d2b5ecdf01b7d25246... - yq version 3.4.1 (Worth noting, the example uses an out of date yq, so a few modifictaions might be needed) https://github.com/mikefarah/yq
In HTTPie Desktop: cross-platform API testing client for humans

Showing the 15 most recent of 33 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.