···11+---
22+title: A love letter to mise
33+description: "using mise to install packages on an immutable distro"
44+publish_date: 2026-04-30
55+tags: [projects, explained]
66+---
77+88+Recently, I have been using [GNOME OS][gnome-os], as my daily driver.
99+1010+After being a seasoned Linux for long, dabbling in distros like [Alpine Linux][alpine], [Arch Linux][arch], Fedora (and even Silverblue), I tried switching to something more _opinionated_ and that "works by default" all while being hard to break.
1111+1212+And given my existing [relationship with GNOME][gnome-rel], GNOME OS was a choice worth looking into.
1313+1414+One feature of GNOME OS is that it is immutable (i.e. system files are read-only). It also doesn't ship with a package manager, so it doesn't have functionality built-in to install extra packages.
1515+1616+You can install GUI Applications normally using [Flathub][flathub] (and Snap/AppImage), but installing non-GUI applications like development tools or CLI packages is not built-in.
1717+1818+There are of course several solutions you can use, such as [homebrew], [coldbrew], but today we will focus on [mise].
1919+2020+2121+## What is mise?
2222+2323+[mise] pitches itself as "One tool to manage languages, env vars, and tasks per project, reproducibly."
2424+2525+However, I only use a fraction of it's functionality, in that I only use it to install packages.
2626+2727+## How to install it?
2828+2929+The instructions are here: https://mise.jdx.dev/getting-started.html
3030+3131+But essentially it's as easy as running this (remember to read the source of the installer first):
3232+3333+```bash
3434+curl https://mise.run | sh
3535+```
3636+3737+## Activating mise
3838+3939+Then you will need to "activate" mise, which essentially makes tools installed by mise available by modifying your `$PATH` variable
4040+4141+```bash
4242+echo 'eval "$(~/.local/bin/mise activate bash --shims)"' >> ~/.bashrc
4343+```
4444+4545+The instructions above are for bash, so you will need to consult the docs to get instructions for your shell.
4646+4747+You will need to re-login for the `mise` command to be available, or open a new shell.
4848+4949+### A note on shims
5050+5151+> Feel free to skip this section, as it's just an explainer
5252+5353+Also, note that the above command use the `--shims` flag, which is NOT the default. It essentially means that mise will modify the `$PATH` variable, instead of doing a weird thing where it will re-activate itself after each command you run.
5454+5555+The non-shim way to activate mise is useful when you use mise to install different package versions across different repositories, but that sometimes breaks IDEs and is our of the scope of this blog post.
5656+5757+## Installing packages
5858+5959+You can start installing your first package with `mise`:
6060+6161+```sh
6262+mise use -g java
6363+```
6464+6565+The above command installs `java` globally (hence the `-g` flag), which you can now confirm by running:
6666+6767+```
6868+$ java --version
6969+openjdk 26.0.1 2026-04-21
7070+OpenJDK Runtime Environment (build 26.0.1+8-34)
7171+OpenJDK 64-Bit Server VM (build 26.0.1+8-34, mixed mode, sharing)
7272+```
7373+7474+You can install much more tools, of which you can find a non-complete list here: [mise-tools].
7575+7676+For example, you can similarly install a specific major version of nodejs
7777+7878+```sh
7979+mise use -g node@22
8080+```
8181+8282+Or install the latest LTS version of node
8383+8484+```sh
8585+mise use -g node@lts
8686+```
8787+8888+Or you can be overlay specific
8989+9090+```sh
9191+mise use -g node@v25.9.0
9292+mise use -g node@25.9.0 # this works too!
9393+```
9494+9595+## Searching
9696+9797+Use `mise search` to find packages.
9898+9999+```
100100+mise search typ
101101+Tool Description
102102+typos Source code spell checker. https://github.com/crate-ci/typos
103103+typst A new markup-based typesetting system that is powerful and easy to learn. https://github.com/typst/typst
104104+typstyle Beautiful and reliable typst code formatter. https://github.com/Enter-tainer/typstyle
105105+quicktype Generate types and converters from JSON, Schema, and GraphQL provided by https://quicktype.io. https://www.npmjs.com/package/quicktype
106106+```
107107+108108+## Uninstalling
109109+110110+```
111111+mise unuse -g node
112112+```
113113+114114+## Updating
115115+116116+```
117117+mise self-update # updating mise itself
118118+mise up # updating tools installed by mise
119119+mise outdated # checking if you have outdated tools
120120+```
121121+122122+## Config File
123123+124124+Tools you install with mise globally will be saved in the file `~/.config/mise/config.toml`, which you can commit to your dotfiles so you can have similar tools across different machines.
125125+126126+Here's an example of my mise config file at the time of writing this blog post.
127127+128128+```toml
129129+# ~/.config/mise/config.toml
130130+[tools]
131131+bat = "latest"
132132+btop = "latest"
133133+bun = "latest"
134134+caddy = "latest"
135135+"cargo:mergiraf" = "latest"
136136+deno = "latest"
137137+difftastic = "latest"
138138+doggo = "latest"
139139+fastfetch = "latest"
140140+fzf = "latest"
141141+github-cli = "latest"
142142+"github:railwayapp/railpack" = "latest"
143143+glab = "latest"
144144+helix = "latest"
145145+java = "latest"
146146+lazygit = "latest"
147147+node = "latest"
148148+"npm:vscode-langservers-extracted" = "latest"
149149+oha = "latest"
150150+pipx = "latest"
151151+pnpm = "latest"
152152+prettier = "latest"
153153+rust = "latest"
154154+scooter = "latest"
155155+tmux = "latest"
156156+usage = "latest"
157157+yt-dlp = { version = "latest", rename_exe = "yt-dlp" }
158158+zellij = "latest"
159159+"github:patryk-ku/music-discord-rpc" = { version = "latest", asset_pattern = "music-discord-rpc" }
160160+rclone = "latest"
161161+mc = "latest"
162162+go = "latest"
163163+"go:git.sr.ht/~migadu/alps/cmd/alps" = "latest"
164164+"npm:localtunnel" = "latest"
165165+```
166166+167167+After the tools inside the config has changed, you can run the following comand to make mise re-install packages from the config file
168168+169169+```
170170+mise install
171171+```
172172+173173+## Mise Backends
174174+175175+Mise is able to install packages from multiple sources. These sources are called "backends" by mise.
176176+177177+When you type `mise use -g node@22`, it will resolve `node` against the registry and figure out that the default backend for `node` is `core`
178178+179179+### Core
180180+181181+The default backend is called `core` and tools from this backend are usually provided from the official source.
182182+183183+Other tools that are available from `core` include Node.js, Ruby, Python, etc...
184184+185185+We could also have been explicit with the backend we want to use
186186+187187+```
188188+mise use -g core:node
189189+```
190190+191191+You can find [a list of all core packages here][mise-core].
192192+193193+### Aqua
194194+195195+You can also install packages from the [Aqua] registry.
196196+197197+### Language Package Managers
198198+199199+You can also install tools from their respective package managers. Here are a few examples
200200+201201+#### `npm`
202202+203203+You can install prettier, typescript, oxlint and other JavaScript/TypeScript tools published on the npm registry. Find the tools on [npm]
204204+205205+```bash
206206+mise use -g npm:prettier
207207+```
208208+209209+#### `pipx`
210210+211211+You can install black, poetry and other Python tools from pypi. Find the tools on [pypi]
212212+213213+```bash
214214+mise use -g pipx:black
215215+pipx:git+https://github.com/psf/black.git # from a github repo
216216+```
217217+218218+#### `cargo`
219219+220220+You can install cargo packages with this backed. You need to have rust installed beforehand though, which you can do with mise
221221+222222+```bash
223223+mise use -g rust
224224+```
225225+226226+Then install your packages
227227+228228+```bash
229229+mise use -g cargo:eza
230230+```
231231+232232+There are more [language package manager backends][mise-backends] like: `gem`, `go` and more.
233233+234234+### Github
235235+236236+You can install packages from Github directly, as long as the project you are trying to install from uses Github releases
237237+238238+```bash
239239+mise use -g github:railwayapp/railpack
240240+```
241241+242242+mise will usually auto-detect which asset you want to use, but you can also specify the asset glob in `~/.config/mise/config.toml`
243243+244244+```toml
245245+[tools]
246246+"github:patryk-ku/music-discord-rpc" = { version = "latest", asset_pattern = "music-discord-rpc" }
247247+```
248248+249249+[alpine]: https://alpinelinux.org
250250+[gnome-rel]: https://teams.pages.gitlab.gnome.org/Websites/people.gnome.org/#jimmac:~:text=Angelo%20Verlain%20Shema
251251+[arch]: https://archlinux.org
252252+[fedora]: https://fedoraproject.org/
253253+[flathub]: https://flathub.org/en
254254+[homebrew]: https://brew.sh/
255255+[coldbrew]: https://gitlab.postmarketos.org/postmarketOS/coldbrew
256256+[mise]: https://mise.jdx.dev/
257257+[mise-tools]: https://mise-tools.jdx.dev/
258258+[npm]: https://www.npmjs.com/search?q=keywords:cli
259259+[pypi]: https://pypi.org/
260260+[mise-core]: https://mise.jdx.dev/core-tools.html
261261+[mise-backends]: https://mise.jdx.dev/dev-tools/backends/
262262+[aqua]: https://aquaproj.github.io/