Library / SDK
redox-os/ion avatar
redox-os/ion

Ion Shell: RedoxOS system shell with Rust internals

Mirror of https://gitlab.redox-os.org/redox-os/ion

1,659 stars141 forksRustMIT

At a glance

What is it?
Ion is an experimental Rust system shell developed primarily for RedoxOS and also intended for other Unix-like platforms. It has a documented installation path, shell plugins and editor tooling, but its alpha status and changing syntax limit suitability for production scripts.
Who is it for?
Adopt Ion for RedoxOS development, shell language experimentation or contributor work where an alpha interface is acceptable. Do not select it as the default shell for a fleet that requires stable syntax or undocumented compatibility guarantees.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 30 days ago.
What is it written in?
Mainly Rust, according to GitHub's language statistics.

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

Editorial analysis

Why RedoxOS needed the Ion shell

Ion addresses the command interpreter used to execute commands, scripts and interactive shell input on Unix-like systems. It is written in Rust, has a `src/` implementation and exposes an `ion` executable through the root binary target in `Cargo.toml`. Its primary audience is RedoxOS, where a shell developed alongside the operating system can account for the platform's own needs. The README also says that Ion can run on other Unix-like platforms, so its intended scope is wider than RedoxOS alone.

The project differentiates itself through its shell syntax and extension model. The manual covers the language, while an RFC process exists for language proposals. Separate repositories provide plugins, Vim or Neovim highlighting and an LSP server. That makes Ion relevant to developers who want to write shell code, customize its interactive environment or build tooling around the language. It is not presented as a replacement for every established shell. No documented migration tool, Bash compatibility layer or production readiness guarantee appears in the repository.

The README makes performance and quality claims, including a comparison with Dash, but it does not publish the commands, environment or measurements behind that comparison. Accordingly, performance should be investigated with the intended workload rather than inferred from the introduction. The stronger adoption signal is structural: Ion has an executable target, a Cargo workspace, tests, examples, a manual, generated builtin documentation, benchmark definitions, an LSP implementation and editor integrations.

How Ion's Rust shell code is organized

The repository identifies itself as a Cargo package named `ion-shell`, using Rust edition 2018. Its binary section binds the name `ion` to `src/main.rs`, giving users a conventional shell executable. Four workspace members, `members/builtins-proc`, `members/ranges`, `members/scopes-rs` and `members/types-rs`, isolate reusable parts of the implementation. Based on this layout, the main shell and its procedural builtins are not a single undifferentiated source file.

Ion also separates language-facing assets from runtime code. The `manual/` directory contains the mdBook manual, while `build.rs` participates in the Cargo build. The Makefile has a `manual` target that first builds with the `man` feature, recreates `manual/builtins`, and collects the generated builtin command documentation. This gives shell commands a path into the manual instead of leaving documentation entirely outside the executable.

Development and validation occupy dedicated directories. The repository contains `tests/`, `testing/`, `fuzz/`, `benches/` and `examples/`. The Makefile's `tests` target invokes Cargo tests, runs `tests/run_examples.sh`, and then tests each workspace crate. Optional `piston` features enable `piston-ai_behavior`, `piston_window` and `piston2d-sprite`, while the optional `unicode` feature enables Unicode support in `regex`. These are real build choices an adopter should inspect, especially when reproducing a release build or packaging Ion for another platform.

The repository does not document Ion's complete execution pipeline or startup configuration in the README. It does show support for signal handling and job control through the name of release 1.0.4, but the release label alone does not explain implementation details. Any evaluation of shell state, process control or error recovery therefore needs the current manual and source rather than assumptions based on familiar Bash behavior.

Installing Ion for a first interactive session

The README provides a one-user installation from the GitLab source repository. It requires Cargo and a compatible Rust compiler, then uses `cargo install --path=. --force`. The documented per-user destination is `~/.cargo/bin`, so that directory must be present in the shell's command search path for the installed binary to be found normally.

The following commands clone the repository, enter it and install the `ion` executable for the current user:

sh
git clone https://gitlab.redox-os.org/redox-os/ion/
cd ion
cargo install --path=. --force

After installation, invoke the executable named `ion`:

sh
ion

The README does not give a starter script or show what a first prompt should look like. This is a meaningful gap for a new user: installation is concrete, but there is no documented first-command walkthrough.

There is also a version inconsistency worth checking before building. The README tells developers to run `rustup override set 1.56.0`, while `Cargo.toml` declares `rust-version = "1.65.0"` and the Makefile sets `TOOLCHAIN ?= 1.76.0`. The manifest is the explicit package constraint, while the Makefile controls builds made through that file. The older README instruction may not satisfy the current manifest, so a source build should follow the repository metadata rather than assuming that 1.56.0 is sufficient.

For Redox OS dependency builds, the README specifically requires the nightly toolchain. That requirement is separate from ordinary Unix-like installation and should not be applied without a Redox target.

System-wide installation and shell registration

For a machine-wide installation, the README builds a release binary and runs the repository's installation script with a destination under `/usr/local/bin`. The optional `update-shells` target can then register Ion with the system through `/etc/shells` and can set it as the login shell when the target is invoked with `prefix=/usr`.

The documented system-wide sequence is:

sh
git clone https://gitlab.redox-os.org/redox-os/ion/
cd ion
cargo build --release
sudo DESTDIR=/usr/local/bin bash/install.sh

The README presents login-shell registration as a separate optional step:

sh
sudo make update-shells prefix=/usr

The Makefile default is `prefix ?= usr/local`, while the README explicitly passes `prefix=/usr`. In that command, the Makefile calculates its binary path from the selected prefix. The visible system configuration change is broader than copying the binary, because registering a shell can affect accounts that use it for login sessions.

The README does not document rollback or a complete uninstall procedure. It does list `uninstall` in the Makefile target list, but the visible Makefile excerpt does not include the recipe. It also does not explain how changing an account's configured shell is reversed. Administrators should therefore inspect `Makefile`, `bash/install.sh` and the operating system's shell-account configuration before using the system-wide path. The project does not publish enough documentation here to promise clean rollback behavior.

Ion plugins, manual pages and editor support

Ion treats customization as shell-level aliases and functions. The separate `ion-plugins` repository contains these definitions in Ion itself, which keeps plugin behavior close to the shell language instead of requiring a compiled extension for every customization. This is a practical distinction for interactive configuration, although the README does not document plugin discovery order, compatibility guarantees or update procedures.

Editor support is split by editor. The repository identifies `redox-os/ion-vim` as officially supported and shows its Vim plugin declaration:

vimscript
Plugin 'vmchale/ion-vim'

It separately links `iwahbe/ion-mode` for Emacs and describes that integration as kindly supported. The support labels are not performance or compatibility claims, but they do indicate where maintainers place stronger project responsibility.

For IDE assistance, the README points to the `ion_shell_lsp_server` crate and the `ion_lsp` source repository. It says the server can provide IDE features such as error messages to an LSP-compatible client. No setup command, editor configuration or supported client list is included, so installing the crate alone should not be treated as complete IDE integration.

The manual can be built locally through mdBook. Builtin documentation is generated first because shell command reference is part of the manual:

sh
make manual

The remaining manual is then built with:

sh
mdbook build manual

For local preview, the README offers:

sh
mdbook serve manual --open

This makes manual review a specific pre-adoption check. Since Ion syntax is still subject to change, scripts and editor assumptions should be compared with the manual generated from the same source revision.

Why the alpha boundary matters for scripts

The clearest limitation comes directly from the README: Ion is still a work in progress, and both its syntax and rules may change. It is described as still being some distance from stabilization. The package metadata reinforces this with version `1.0.0-alpha` and a maintenance badge whose status is `experimental`. The listed releases are all alpha releases from 2017, including 1.0.5, 1.0.4 and 1.0.3.

That status makes Ion a poor default for unattended automation unless the owning team accepts language migration work. The README expects further RFC work, and it says many current and future implementation ideas have not yet entered the formal specification. In other words, behavior may exist before the language contract is settled. A script can work without being a portable baseline that Ion promises to preserve.

Feature opt-ins create a second boundary. The `piston` feature adds graphical and behavioral dependencies, and the `unicode` feature changes regex support. A build made with one feature set should not be assumed equivalent to a plain build. Redox targets also use a nightly toolchain and a target-specific linker setup in the Makefile. These constraints make reproducible deployment more involved than simply copying one generic binary.

The absence of a documented Bash compatibility layer is equally important. Ion may run on Unix-like platforms, but platform portability does not by itself establish script portability. The repository includes Bash for its installation and test tooling, but that does not mean Bash scripts are valid Ion scripts. For an existing environment full of established shell code, the safe assumption is that syntax compatibility must be checked rather than granted.

Ion versus Bash and Dash as an adoption choice

Bash is the relevant alternative when an organization needs the established shell around which existing system administration code is already written. The practical difference is script compatibility and operational familiarity. Ion offers its own evolving syntax, Rust implementation, Ion-language plugins, manual and LSP tooling. Bash instead is the shell directly involved in commands such as `bash/install.sh` and `bash tests/run_examples.sh`; the repository does not claim that those scripts are Ion scripts or that an existing Bash script can be passed to Ion unchanged.

Dash is the comparison named by the README. Ion claims performance above Dash when its own features are taken advantage of, but the README provides no benchmark procedure or result table. Dash therefore serves as a claimed comparison point, not evidence for selecting either shell. Teams with a Dash-oriented deployment should reproduce relevant workloads before making a performance decision.

The choice should follow the actual requirement. Choose Bash or another established shell when preserving the current script contract matters more than Ion's language and tooling. Choose Ion when RedoxOS integration, Rust implementation, contributor access to the source, or experimentation with Ion's syntax is a primary requirement. For interactive evaluation, keep the existing login shell unchanged, install Ion for one user, and use it first on scripts whose syntax and failure behavior you can inspect. The README's absence of rollback guidance is a concrete reason not to begin with system-wide login-shell registration.

Maintenance signals, licensing and upgrade work

The GitHub repository is a mirror of the GitLab project, its default branch is `master`, and it is not archived. Its last push was on 2026-09-23. That is a recent repository activity signal, but it does not erase the project's explicit alpha classification. Maintenance status and release maturity are separate here. The repository moved after the listed 2017 releases, while the package still identifies itself as experimental.

The code license is MIT. Ion also names an MIT license in the README, and `Cargo.toml` points to the repository's `LICENSE` file. This gives integrators a stated permissive license basis, but it is not permission to disregard third-party license terms. `Cargo.toml` contains dependencies from crates.io and Git repositories. A distributor should inspect the applicable dependency licenses separately rather than assuming every packaged artifact is covered by one file.

Upgrade cost is shaped by language instability. The README says syntax and rules remain subject to change, while the RFC process is still developing. An upgrade can therefore require more than replacing a binary. Scripts may need review, plugins may track shell-language changes, and editor or LSP behavior may change with the same source revision. The repository's manual, tests and examples can serve as concrete comparison points, but the README does not publish a compatibility or migration policy.

Toolchain drift adds another maintenance task. The README, manifest and Makefile name different Rust baselines. Teams that pin Rust versions should record which source revision they used and which build entry point they invoked. On the documented evidence, Ion is recently touched but still experimental, so adoption planning must budget for source inspection rather than treating the latest push as a production support commitment.

Editorial conclusion

Adopt Ion for RedoxOS development, shell language experimentation or contributor work where an alpha interface is acceptable. Do not select it as the default shell for a fleet that requires stable syntax or undocumented compatibility guarantees. Verify the current manual, the Rust version declared by Cargo.toml, the target-specific dependencies and the behavior of every production script first. For a new deployment, the specific deciding fact is that Cargo.toml still labels the package `1.0.0-alpha`.

Frequently asked questions

How do I install Ion Shell for the current user in redox-os/ion?

Clone the repository, enter its directory and run `cargo install --path=. --force`. The README says this installs the `ion` executable into `~/.cargo/bin`.

Is Ion Shell stable enough for production scripts?

The README calls Ion a work in progress and says its syntax and rules are subject to change. `Cargo.toml` also uses version `1.0.0-alpha` and marks the maintenance status as `experimental`.

Which Rust version should I use to build redox-os/ion?

The repository metadata is inconsistent: the README names 1.56.0, `Cargo.toml` declares `rust-version = "1.65.0"`, and the Makefile defaults to 1.76.0. Redox OS dependency builds require nightly according to the README.

Does redox-os/ion support Vim, Emacs and IDE tooling?

The README links a supported `ion-vim` plugin, a kindly supported `ion-mode` project for Emacs and an `ion_shell_lsp_server` crate. It does not document complete LSP client setup.

Can existing Bash scripts run unchanged in Ion Shell?

The README does not claim Bash script compatibility or document a compatibility layer. Bash appears in Ion's own installation and test scripts, but that does not establish that those scripts use Ion syntax.

Official sources

  1. Issues
  2. License: MIT
  3. README
  4. redox-os/ion on GitHub
  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/redox-os-ion.svg)](https://hysenlabs.com/projects/redox-os-ion)

Was this useful?