Skip to main content

celq

Crates.io Documentation Playground Minimum rustc 1.94

celq is a command-line tool for evaluating Common Expression Language (CEL) expressions. It processes JSON input, performs computations, and outputs results. Think of it as if jq supported CEL.

Quick Start

celq reads JSON from the input and lets users process it with CEL:

echo '["apples", "bananas", "blueberry"]' | celq 'this.filter(s, s.contains("a"))'
# Outputs: ["apples","bananas"]

celq can also evaluate expressions with arguments, without reading from the input:

celq -n --arg='fruit:string=apple' 'fruit.contains("a")'
# Outputs: true

Popular configuration formats such as JSON5, YAML, TOML, and XML are supported. The closely related format NDJSON is also supported.

For detailed usage examples and recipes, see the manual.

Interactive Playground

Want to try celq without installing anything? Visit the celq-playground to try it in your browser!

Why?

There are implementations of CEL for Go, Java, C++, JavaScript, Python, C#, Rust, Ruby, and possibly more languages.

celq brings the same CEL syntax to the command-line. celq is not necessarily better than jq, but perhaps it makes it easier to reuse snippets of code across multiple places.

Moreover, the CEL specification is simpler than the jqlang specification. If you need something less powerful than jq or Python, then celq might be what you are looking for.

Check our comparison with other tools for more details.

Installation

Pre-built Binaries

We publish pre-built binaries for Linux, macOS, FreeBSD, and Windows in celq's GitHub Releases page. To install the current version for Linux or macOS, run:

curl --proto '=https' --tlsv1.2 -sSf https://get-celq.github.io/install.sh | bash

Notice that the installer tries not to be clever and doesn't modify $PATH or overwrite existing files. To specify a destination, use the --to flag:

curl --proto '=https' --tlsv1.2 -sSf https://get-celq.github.io/install.sh | \
    bash -s -- --to DESTINATION

See the installation guide for more details on the installer such as --force to replace existing binaries, --target to specify which binary to download, versioned URLs, GitHub tokens, attestations, and more.

Homebrew (macOS)

If you are a macOS Homebrew user, then you can install celq with:

brew install get-celq/tap/celq

Scoop (Windows)

If you are a Scoop user on Windows, you can install celq with:

scoop bucket add get-celq https://github.com/get-celq/scoop-bucket
scoop install get-celq/celq

Chocolatey (Windows)

If you are a Chocolatey user on Windows, you can install celq with:

choco install celq

WinGet (Windows)

If you are a WinGet user on Windows, you can install celq with:

winget install IvanIsCoding.celq

Cargo

Installing From Source

If you want to install from source, celq publishes to crates.io.

cargo install celq --locked

Installing With cargo-binstall

If you have cargo-binstall installed, you can install pre-built binaries directly:

cargo binstall celq

Mise

celq can be used with mise. To install celq, use the Conda back-end:

mise use -g conda:celq

Alternatively, add this to mise.toml:

[tools]
"conda:celq" = "latest"

GitHub Actions

celq can be used in GitHub actions. For one-off commands, the get-celq/celq-action is the quickest way:

- name: Example Celq Action
  id: exampleID
  uses: get-celq/celq-action@main
  with:
    cmd: celq 'this.exampleID' < example.json

- name: Reuse a variable obtained in another step
  run: echo ${{ steps.exampleID.outputs.result }}

See the installation guide for more details on GitHub actions such as pinning the celq version and the Action itself.

If you are going to use celq in scripts or for multiple calls, we recommend using taiki-e/install-action:

- uses: taiki-e/install-action@v2
  with:
    tool: celq

Nix

celq is available for Nix. To run it as a Flake:

nix run github:IvanIsCoding/celq -- -n '"Hello World"'

By default, Nix fetches the stable version from crates.io. If you want to run the code from HEAD, use the dev derivation:

nix run github:IvanIsCoding/celq#dev -- -n '"Hello World"'

See the installation guide for other Nix setups.

FreeBSD

FreeBSD builds are tested with freebsd-vm and cross-compiled with Zig. Although celq is not yet in the ports tree, it does publish pre-built binaries:

VERSION=v0.7.1
RELEASE_URL=https://github.com/IvanIsCoding/celq/releases/download/${VERSION}
PLATFORM=x86_64 # or aarch64

fetch ${RELEASE_URL}/celq-freebsd-${PLATFORM}.tar.gz

tar xzf celq-freebsd-${PLATFORM}.tar.gz
su root -c 'install -m 755 celq /usr/local/bin/'

celq can also be installed from source following the Cargo section. We strive to always compile with the Rust version provided in the ports tree.

OpenBSD

OpenBSD builds are tested in CI using the latest stable release. celq strives to always compile with the Rust version provided in the ports tree. Refer to the Cargo section for installation instructions.

NetBSD

NetBSD builds are tested in CI against the latest stable release. celq aims to remain compatible with the Rust version provided by the NetBSD pkgsrc quarterly branch. See the Cargo section for installation instructions.

NPM (Node.js/JavaScript)

celq is packaged for NPM. Node.js users can install celq in their project with:

npm install celq

This adds celq to package.json and makes it available for scripts. It is also possible to run single commands with npx:

npx celq -n '"Hello World"'

Python

celq is packaged for PyPI. Python users can install it with pip:

pip install celq

If you have uv installed, celq can be used as a tool:

uvx celq -n '"Hello World"'

Conda Forge

celq is available on conda-forge and can be installed with conda, mamba, micromamba, and pixi:

conda install -c conda-forge celq

If you have pixi, you can run celq in a temporary environment with:

pixi exec celq -n '"Hello World"'

Skills

To teach agents how to use celq, we provide a skill at get-celq/agent-skills.

Install it with the skills CLI:

npx skills add get-celq/agent-skills --skill celq

Or install it with the GitHub CLI:

gh skill install get-celq/agent-skills celq

Limitations

Eager JSON Parsing

celq eagerly parses all JSON input into memory before evaluation. This design was made to simplify the code implementation, at the cost of memory and performance.

Currently, there are no benchmarks for celq. I believe the tool is "good enough" for my personal use. That might be revisited in the future. In the meantime, expect celq to be slower than jq. With that being said, celq feels snappy in practice. celq glues together Rust parsers that are performant with a CEL engine that strives to be fast.

CEL Implementation Differences

celq uses cel-rust, a community-maintained Rust implementation of CEL, rather than the official Go implementation.

There may be edge cases or advanced features where behavior differs from the official implementation. If you find one, open an issue at the celq repository and we'll triage the issue before sending it to cel-rust.

Malformed expressions

Currently, the error messages for CEL expressions that are invalid are cryptic. We will enhance them in future releases.

Non-Goals

REPL

While conceptually interesting, celq does not aim to be a CEL REPL. In the original author's view, that should live on a separate binary.

Full YAML Support

celq works with JSON. YAML is supported as a best-effort. If the ingested YAML can be translated to JSON, celq most likely works fine. Full YAML support is out-of-scope, as the specification has too many edge cases.

Acknowledgments

Special thanks to the maintainers of:

  • cel-rust for providing the CEL evaluation engine that powers celq
  • cel-python for publishing their CLI. celq has heavily drawn from their interface
  • jaq for giving an excellent blueprint on how to test a Rust CLI
  • gron for greppable JSON

Large Language Models Disclosure

Many commits in this repository were co-authored by LLMs. All commits were guided and reviewed by a human. I tried my best to keep things simple and auditable.

All the documentation in the manual has been hand-crafted. That was done to keep the tone of the original author. If you find a typo or a grammar mistake, please send a pull request.

License

This project is dual-licensed under the MIT License and Apache 2.0 licenses. See LICENSE-MIT and LICENSE-APACHE files for details.

The install.sh published with each GitHub release and its template at the root of the repository (template_install.sh) are licensed independently. Those files are under the CC0-1.0 license. They are the original work of Casey Rodarmor from just and have been adapted for celq.

Contributing

Contributions are welcome! See CONTRIBUTING.md for more details.

Unless explicitly stated otherwise, any contribution intentionally submitted for inclusion in celq by you shall be dual-licensed under the MIT License and the Apache 2.0 license. Contributions to template_install.sh shall be dedicated to the public domain. Any additional terms or conditions shall not apply.

Metadata

Release files for celq 0.7.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for celq 0.7.1
File Size Uploaded
celq-0.7.1.tar.gz 66.5 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for celq 0.7.1
File
celq-0.7.1-py3-none-win_arm64.whl Python 3 none Windows ARM64 Details
celq-0.7.1-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
celq-0.7.1-py3-none-musllinux_1_2_x86_64.whl Python 3 none Linux musl 1.2+ x86-64 Details
celq-0.7.1-py3-none-musllinux_1_2_riscv64.whl Python 3 none Linux musl 1.2+ RISC-V 64 Details
celq-0.7.1-py3-none-musllinux_1_2_ppc64le.whl Python 3 none Linux musl 1.2+ PowerPC 64-le Details
celq-0.7.1-py3-none-musllinux_1_2_aarch64.whl Python 3 none Linux musl 1.2+ ARM64 Details
celq-0.7.1-py3-none-manylinux_2_31_riscv64.whl Python 3 none Linux glibc 2.31+ RISC-V 64 Details
celq-0.7.1-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
celq-0.7.1-py3-none-manylinux_2_28_ppc64le.whl Python 3 none Linux glibc 2.28+ PowerPC 64-le Details
celq-0.7.1-py3-none-manylinux_2_28_aarch64.whl Python 3 none Linux glibc 2.28+ ARM64 Details
celq-0.7.1-py3-none-macosx_11_0_arm64.whl Python 3 none macOS 11.0+ ARM64 Details
celq-0.7.1-py3-none-macosx_10_12_x86_64.whl Python 3 none macOS 10.12+ x86-64 Details

Total release size: 26.0 MB

Release files / celq-0.7.1.tar.gz

Download URL celq-0.7.1.tar.gz
Size 66.5 kB
Tags Source
SHA-256 checksum
How to use checksums
6eba909d25895fead287dd357f383bd3e211e1b2a49090535193287df4b0992d
BLAKE2b-256 checksum
How to use checksums
ff7c23918d605f5127a254501e12f120b75f680a074583d1d46c9994a04975a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-win_arm64.whl

Download URL celq-0.7.1-py3-none-win_arm64.whl
Size 2.0 MB
Tags Python 3 Windows ARM64
SHA-256 checksum
How to use checksums
6f391f3355cab6bf31079a273f9d68efe54be5e372196224983216172b3a2c18
BLAKE2b-256 checksum
How to use checksums
aeeb42c7f0d0b59501334514017ab2c99d4e177430f687d98df1f47303aefc5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-win_amd64.whl

Download URL celq-0.7.1-py3-none-win_amd64.whl
Size 2.1 MB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
960aa5bae59afd32222804c59a0178f4321779490dc42c9f1294e3ef37720014
BLAKE2b-256 checksum
How to use checksums
13e70542e1719aff12daddc342b3919d2b11cb64337cdd1c261dc4331557c8c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-musllinux_1_2_x86_64.whl

Download URL celq-0.7.1-py3-none-musllinux_1_2_x86_64.whl
Size 2.2 MB
Tags Linux musl 1.2+ x86-64 Python 3
SHA-256 checksum
How to use checksums
9fad65dafca70c9a35b7ceb90b30f37ab02001e3a3c3153678d1305054f6e2e3
BLAKE2b-256 checksum
How to use checksums
e8d88d41de2f81950369e2f30aa5995d74161e7d1d8becee2d08fa7f37073aba
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-musllinux_1_2_riscv64.whl

Download URL celq-0.7.1-py3-none-musllinux_1_2_riscv64.whl
Size 2.2 MB
Tags Linux musl 1.2+ RISC-V 64 Python 3
SHA-256 checksum
How to use checksums
c4975009254c3589de353c4d0d457ee2846707af39a25e7e4f63d79bda45359b
BLAKE2b-256 checksum
How to use checksums
4972d2756f56de27d057151e68cf75f7be4f3648b3253ccc7b6d7acf2e0197a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-musllinux_1_2_ppc64le.whl

Download URL celq-0.7.1-py3-none-musllinux_1_2_ppc64le.whl
Size 2.3 MB
Tags Linux musl 1.2+ PowerPC 64-le Python 3
SHA-256 checksum
How to use checksums
fdd97f01f099e596411bd67a7eb1a8d9238a52816ce2064c0e6b6ab3b22ccb29
BLAKE2b-256 checksum
How to use checksums
f5d3271fa2df9b3f60c7b538b0690aea76a25a15cee3fe00c64b6931844b3cdc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-musllinux_1_2_aarch64.whl

Download URL celq-0.7.1-py3-none-musllinux_1_2_aarch64.whl
Size 2.1 MB
Tags Linux musl 1.2+ ARM64 Python 3
SHA-256 checksum
How to use checksums
d8b723e6bc342e9439f4855cc47438b281f17cfbecf5a493124c7c00695bfd79
BLAKE2b-256 checksum
How to use checksums
aabdbb8d6da26134da19d2d6b0a814bc01662dd82fac91f10ee4ea293ce37c6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-manylinux_2_31_riscv64.whl

Download URL celq-0.7.1-py3-none-manylinux_2_31_riscv64.whl
Size 2.1 MB
Tags Linux glibc 2.31+ RISC-V 64 Python 3
SHA-256 checksum
How to use checksums
fc50fb0ea688a4a50e895e6279618156baf4eba4cfcd2cfbf25af924abfaa4bc
BLAKE2b-256 checksum
How to use checksums
d2f17f7a9dbcd2f4f1d46b3038a6389a5ada27b2a5a5097ccdaa06b5060f2884
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-manylinux_2_28_x86_64.whl

Download URL celq-0.7.1-py3-none-manylinux_2_28_x86_64.whl
Size 2.2 MB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
3dcd3f2ca06eae3abc9436e083ab4c733524ea4183ec65dbded783d56d72d891
BLAKE2b-256 checksum
How to use checksums
818d9f0c0aa4cc33dd1ae2758489aab2933d9f273ad60ae69bc5a31f48ff2607
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-manylinux_2_28_ppc64le.whl

Download URL celq-0.7.1-py3-none-manylinux_2_28_ppc64le.whl
Size 2.4 MB
Tags Linux glibc 2.28+ PowerPC 64-le Python 3
SHA-256 checksum
How to use checksums
68824976cb64aca1380cebad88b29ba6ebaaacf8cfcccf84812a2899ea632774
BLAKE2b-256 checksum
How to use checksums
8d613cbe54ef6cdd20f2090f20fbe0547807deac8a3edb149899f8209cb909dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-manylinux_2_28_aarch64.whl

Download URL celq-0.7.1-py3-none-manylinux_2_28_aarch64.whl
Size 2.1 MB
Tags Linux glibc 2.28+ ARM64 Python 3
SHA-256 checksum
How to use checksums
6f8f55270aaf4566be79b374dcc10eeba905104ee09641ca40c5672132af5fb5
BLAKE2b-256 checksum
How to use checksums
be9a37f1afcab6c8fc0782825ee6f188715320953bb6f9c936c42c1b8ba107cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-macosx_11_0_arm64.whl

Download URL celq-0.7.1-py3-none-macosx_11_0_arm64.whl
Size 2.1 MB
Tags Python 3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
7a63e14c6b11c07b4f0c5c9ea009f6be187b7ff56db78429ca8f5a77f9d5d048
BLAKE2b-256 checksum
How to use checksums
16450c1c1dba709f123cc178aa424e220cd5fbb9ee4efe7d4836600ff6107c21
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / celq-0.7.1-py3-none-macosx_10_12_x86_64.whl

Download URL celq-0.7.1-py3-none-macosx_10_12_x86_64.whl
Size 2.2 MB
Tags Python 3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5a9a4d787ac3d4fd63e80004b938a718cc6d4801203a28130aeae8887c8684a5
BLAKE2b-256 checksum
How to use checksums
53ac2146e7b597f4a4ce4555cbcb50ea74db3b08833f2730ba85be1752c71299
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.9.22 {"installer":{"name":"uv","version":"0.9.22","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page