CLI tool
lmorg/murex avatar
lmorg/murex

Murex Shell: Typed Pipelines and Structured Data in the Terminal

A smarter shell and scripting environment with advanced features designed for usability, safety and productivity (eg smarter DevOps tooling)

1,915 stars40 forksGoGPL-2.0

At a glance

What is it?
Murex is a Go-based shell that adds type information to pipelines so JSON, YAML, CSV and tables flow between commands as data rather than text. It is aimed at engineers who write shell scripts for DevOps work and want error handling that does not leak.
Who is it for?
Adopt Murex if you write shell scripts that parse JSON, CSV or SQL output and you want structured data to survive the pipe instead of being re-parsed by every command. Do not adopt it if your team depends on Bash-specific tooling, sourcing existing .bashrc files, or POSIX portability, since Murex is a separate language with its own syntax and its own startup files.
Can I use it commercially?
Yes, with conditions. GPL-2.0 is a copyleft licence: if you distribute software that includes it, you must release that software's source code under the same licence. Running it internally without distributing it does not trigger that obligation.
Is it still maintained?
Yes. The repository last received commits 35 days ago.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The problem Murex targets: pipelines that lose their types

In a POSIX shell, everything on a pipe is bytes. That works until the bytes are a JSON document or a CSV row, at which point every tool in the chain has to re-parse the same structure, and any command that is not aware of the format will happily mangle it. Murex's stated approach is to attach additional type information to pipelines so that complex formats like JSON or tables are known to the shell itself. The README frames the payoff as making existing UNIX tools work more intelligently with no extra configuration.

The audience is narrow and specific. This is not a shell for someone who types ls and cd and nothing else. It is for people who write scripts that pull data out of an API, reshape it, and hand it to another process, and who have been burned by a failure that exited zero. The README names DevOps tooling in the project description and lists try/catch blocks, line numbers in error messages, and script testing and debugging frameworks as core features. That combination points at CI scripts and release automation more than at interactive daily driving, though the interactive shell is documented separately.

How typed pipelines and the built-in data formats work

The mechanism visible in the repository is a set of format handlers plus a type-aware pipe. The go.mod file lists dependencies for the formats the README claims: gopkg.in/yaml.v3 for YAML, github.com/clbanning/mxj/v2 for XML, github.com/pelletier/go-toml for TOML, github.com/hashicorp/hcl for HCL, and two SQLite drivers, github.com/mattn/go-sqlite3 and modernc.org/sqlite. There is also github.com/Knetic/govaluate, which suggests expression evaluation inside the language rather than shelling out for arithmetic and comparisons. github.com/abesto/sexp appears as well, which fits the s-expression style of Murex's block syntax.

The examples directory is the clearest evidence of intent. It contains files named dictionary-api.mx, inline-sql.mx, table-indexes.mx, arrays-as-parameters.mx, try-catch.mx, foreach.mx and loops-iteration.mx. Those names describe a language with first-class collections, indexed tables, SQL embedded in the script, and structured error handling, not a thin wrapper over exec. The README's compatibility.md and the Rosetta Stone guide for Bash users both exist because the syntax differs enough from Bash that migration needs a mapping document.

One design consequence is worth stating plainly: because type information rides alongside the data, the shell has to know the format to do anything useful with it. That is the source of both the convenience and the coupling. If a command emits something the shell cannot classify, you are back to text.

Installing Murex and running a first script

The README points at INSTALL.md for detail and lists four package manager routes. On macOS the Homebrew formula is the shortest path, and MacPorts is listed as an alternative.

bash
brew install murex

On FreeBSD the project is in Ports, so the package name is enough.

bash
pkg install murex

On ArchLinux the README gives an AUR recipe that downloads the PKGBUILD and builds it locally. Note that makepkg is run by the user, not by a helper, and the flags are the ones shown in the README.

bash
wget -O PKGBUILD 'https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=murex'
makepkg --syncdeps --install 

Building from source goes through the Makefile, which writes the binary into ./bin and can also build a WebAssembly target. The build target takes build tags from builtins/optional/standard-opts.txt unless BUILD_TAGS is overridden.

bash
make build
./bin/murex

The Makefile also defines an install target that copies the binary to /usr/bin/ and appends that path to /etc/shells, which is what makes Murex selectable with chsh. That target writes outside the home directory, so it needs elevated permissions on most systems.

For a first real use, the examples directory is the intended entry point. hello-world.mx is the smallest, and the README directs new users to the language tour in docs/tour.md and to the Rosetta Stone at docs/user-guide/rosetta-stone.md for readers who want Bash comparisons rather than a tutorial. After installing, the fastest way to judge whether the typed pipeline model suits you is to read inline-sql.mx and dictionary-api.mx, since those two cover the cases where a text pipeline would force you to re-parse.

Where Murex is the wrong tool

The largest constraint is that Murex is a different language, not a Bash drop-in. The README's own framing supports this: it publishes a Rosetta Stone specifically for people coming from Bash, which would be unnecessary if existing scripts ran unchanged. Anything that sources a .bashrc, relies on Bash array semantics, or depends on a specific shell's word-splitting rules will need rewriting rather than porting. Scripts that call other scripts with a hardcoded #!/bin/bash shebang are unaffected by installing Murex, which cuts both ways: your existing automation keeps working, and it also keeps none of Murex's benefits.

Second, the value proposition depends on structured data being present. If your scripts mostly move files, run compilers, and check exit codes, the typed pipeline layer adds surface area without adding much. The interactive features the README lists, in-line spell checking, context-sensitive hint text, and auto-parsing of man pages for completions, are usability gains, and they are not a reason to change shells on their own.

Third, portability. A script written for Murex will not run on a machine that only has sh, dash, or Bash. For CI images and container entrypoints where you cannot guarantee the interpreter is installed, that is a real cost, and it is the reason a project might keep its entrypoint in POSIX shell and use Murex only for the parts that touch structured data. The README does not document rollback or an uninstall path, so if you append to /etc/shells via the Makefile install target you should know what you will need to remove by hand.

Murex compared with Nushell and with Bash

Nushell is the closest comparison and the difference is in how the type information is carried. Nushell's model is a structured value that flows through every command, with its own command set built around that value. Murex's README describes additional type information in pipelines that lets existing UNIX tools work more intelligently without additional configuration. That is a meaningfully different bet: Murex tries to keep awk, grep and friends in play and annotate the data around them, rather than replacing the toolset with commands that natively speak the structured type. If your scripts are mostly external binaries and you want the shell to understand the JSON passing between them, Murex's approach is the closer fit. If you want every builtin to return a table you can index, the other model is more consistent.

Against Bash, the difference is error handling and testing rather than data. Bash's leaky failure modes are the thing Murex explicitly targets, with try/catch blocks, line numbers in error messages, and unit test frameworks described in the README as baked into the language. Bash can approximate this with set -e, trap, and an external test runner, and many teams do exactly that. Murex's argument is that the approximation is fragile. That argument is reasonable, but it is also the argument for every alternative shell, and it does not by itself tell you whether the migration cost is worth paying for your particular scripts.

Maintenance, licence and upgrade cost

Murex is not archived. The last push to the default branch was on 2026-08-26, which is recent enough that the project cannot be described as dormant. The release cadence visible in the repository is roughly one tagged release every three to four months: v7.0.2107 on 2025-07-02, v7.1.4143 on 2025-10-24, and v7.2.1001 on 2026-02-02. The version numbers are large and non-semver-looking, so do not read a jump in the middle digits as a breaking change indicator. The README states a compatibility commitment and links to compatibility.md, which is the document to read before pinning a version, since it is the only place that would define what backwards compatibility means in practice.

The licence is GPL-2.0, and the repository's LICENSE file is the authoritative text. For most users this is irrelevant: running a GPL shell does not affect the licence of the scripts you write with it. It matters if you plan to link Murex code into a proprietary product, embed it in a closed appliance, or ship a modified binary. The docs site is a separate package with its own package.json, named murex-docs, licensed GPLv2 and built with VuePress and pnpm, which is worth knowing if you intend to build the documentation locally rather than read it at murex.rocks.

Upgrade cost is mostly a function of how much of your tooling is written in .mx files. Because the project commits to backwards compatibility, the expected upgrade path is a package manager update. The risk sits in the interactive configuration and in any build tags you set, since the Makefile's build-dev target adds pprof, trace and no_crash_handler, and build-tinygo drops the cachedb, cmd_select and pty features. Those are compile-time choices, not runtime flags, so a binary built with TinyGo will not behave identically to a standard build.

Editorial conclusion

Adopt Murex if you write shell scripts that parse JSON, CSV or SQL output and you want structured data to survive the pipe instead of being re-parsed by every command. Do not adopt it if your team depends on Bash-specific tooling, sourcing existing .bashrc files, or POSIX portability, since Murex is a separate language with its own syntax and its own startup files. Before committing, verify two things: that the package manager you use actually carries a build you can pin (the README lists AUR, FreeBSD Ports, Homebrew and MacPorts), and that the compatibility commitment in compatibility.md covers the features you rely on, because the README promises backwards compatibility without listing which syntax is frozen.

Frequently asked questions

What is Murex used for?

Murex is a shell and scripting environment for interactive terminal work and for scripts that handle structured data. The README highlights typed pipelines for formats such as JSON and tables, usability features like in-line spell checking and context-sensitive hints, and error handling with try/catch blocks and unit tests.

How do you install Murex?

The README lists Homebrew (brew install murex), MacPorts (port install murex), FreeBSD Ports (pkg install murex) and an AUR recipe for ArchLinux that downloads the PKGBUILD and runs makepkg --syncdeps --install. INSTALL.md has the full details, and the Makefile provides build and install targets for building from source.

What data formats does Murex understand natively?

The README names JSON, YAML, XML and CSV among the formats with native support, and the go.mod dependencies include libraries for YAML, XML, TOML, HCL and SQLite. The examples directory includes files for inline SQL and table indexes.

Can Murex run my existing Bash scripts?

The README does not claim Bash compatibility. It publishes a Rosetta Stone guide specifically for people migrating from Bash, which implies the syntax differs. Scripts invoked through their own #!/bin/bash shebang are unaffected by installing Murex.

What licence is Murex released under?

The repository is licensed GPL-2.0, and the LICENSE file in the repository root holds the text. The documentation site is a separate package, murex-docs, also licensed GPLv2.

Is Murex still maintained?

The repository is not archived and the last push to the default branch was on 2026-08-26. Tagged releases appear at intervals of roughly three to four months, with v7.2.1001 published on 2026-02-02.

Official sources

  1. License: GPL-2.0
  2. lmorg/murex on GitHub
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/lmorg-murex.svg)](https://hysenlabs.com/projects/lmorg-murex)