---
theme: slidev-theme-pdego
title: Mise-en-Place
author: Erwann
colorSchema: dark
highlight: one-dark-pro
section: Developer Tooling
description: Mise-en-place applied to dev tooling — one .mise.toml to replace five version managers
favicon: /favicon.svg
layout: cover
---

# 🍽️ Everything in Its Place

How I went from juggling five dev tools to one config file

---

# It's Monday. You're excited.

New project. Greenfield. The README is open.

> *Prerequisites: Node 22, Ruby 3.3, Java 21, and the correct version of all three.*

No problem. You've got `nvm`. And `rvm`. And `sdkman`.

You check the clock at 11am.

You check it again at 3pm.

You still haven't written a single line of code.

---
layout: section
---

# 💸 The Environment Tax

---

# 🚧 The hidden toll nobody budgets for

Everyone budgets for the feature. Nobody budgets for *getting there*.

- The right version of Node
- The right version of Ruby
- The right version of Java
- The right version of **the right version manager**

You're not blocked by the problem. You're blocked by the setup *for* the problem.

Nobody ships a feature by configuring `nvm`.

---

# 🖥️ My situation made it worse

I maintain Mac Mini machines for the team

- Native workloads only — no virtualisation layer
- **No Docker** — the standard escape hatch? Welded shut.
- Every tool had to be installed and managed natively
- And kept in sync across machines. By hand. Every time.

Think of it as cooking on an open fire with no running water.

---
layout: section
---

# 🪦 A Different Kind of Graveyard

---

# 🦁 Five chefs, five recipes, zero coordination

| Language      | Tool     | Config file     | Vibe                  |
| ------------- | -------- | --------------- | --------------------- |
| Ruby          | `rvm`    | `.ruby-version` | Opinionated, ancient  |
| Node          | `nvm`    | `.nvmrc`        | Slow, beloved anyway  |
| Node (faster) | `fnm`    | `.nvmrc`        | Same file, new drama  |
| Java / Kotlin | `sdkman` | `.sdkmanrc`     | Enterprisey, baroque  |

Each one: its own shell hooks, its own activation ritual, its own personality disorder.

---

# 🧠 The context-switch ritual

Switching projects used to look like this:

```sh
nvm use            # pray .nvmrc exists
rvm use 3.3.0      # if you remembered to install it
sdk use java 21    # if sdkman is even in your PATH today
```

And on the Mac Minis? Every tool update meant repeating this ceremony
across every machine. In person. With a coffee. That went cold.

---

# 🐳 Docker would have saved us

```sh
docker run --rm -it node:22 npm install
```

Right version. Zero setup. Reproducible everywhere.

The universal "have you tried turning it off and on again" of dev environments.

But Docker wasn't an option on the Mac Minis.

So: back to the messy kitchen.

---
layout: section
---

# 👨‍🍳 Enter mise-en-place

---

# mise-en-place

> *"Everything in its place"*

In a professional kitchen, mise en place is what separates a chef from a panic attack.
Every ingredient chopped, measured, and ready *before* the heat goes on.

The tool is named after this philosophy — and it earns it.

- Polyglot version manager — replaces `rvm`, `nvm`, `fnm`, `sdkman`, and more
- Written in Rust — near-instant activation, no shell lag
- One config file. Every language. One mise en place.

---

# 📄 One file to rule them all

```toml
# mise.toml
[tools]
node = "22"
ruby = "3.3"
java = "corretto-21"
python = "3.12"
```

```sh
mise install
```

Every tool. Every version. One command.

No shell hooks to untangle. No conflicting configs. Just prep, done.

---

# 🆓 Zero migration cost — it speaks your dialect

mise reads what you already have

- `.nvmrc` — understood
- `.ruby-version` — understood
- `.tool-versions` (asdf) — fully compatible

Drop it into any existing project. Run `mise install`. Walk away.
The kitchen is already prepped. You didn't change a thing.

---
layout: section
---

# ⚖️ Before and After

---

# 😫 Before mise: a half-day performance art piece

Setting up a new Mac Mini:

1. Install `rvm` → configure shell hooks → install Ruby → realise you need the wrong version → install that too
2. Install `nvm` → configure shell hooks → install Node → remember `fnm` exists → install that too
3. Install `sdkman` → install Java → pin the version → repeat on next machine
4. Lunch.

Half a day. Every time. For every machine.

And every developer who joined the team got the same tour.

---

# 🚀 After mise: embarrassingly simple

```sh
brew install mise
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
```

Then in any project:

```sh
mise install
```

One morning. Once. Every language. Every machine.

The new developer now asks: *"Is that it?"*

Yes. That's it.

---

# 🌍 It even replaced direnv

```toml
[env]
NODE_ENV = "development"
DATABASE_URL = "postgres://localhost/myapp"
PORT = "3000"
```

Variables activate when you `cd` in. Cleared when you leave.

No more `.env` files living on laptops like forgotten leftovers at the back of the fridge.

---

# ⚡ And it's a task runner. Yes, really.

```toml
[tasks.dev]
description = "Start the dev server"
run = "npm run dev"

[tasks.test]
run = "npm test"
```

```sh
mise run dev
```

One interface. Every project. Every language.

You came for the version manager. You stayed for everything else.

---
layout: cover
---

# 🍽️ Everything in its place.

Stop setting up. Start cooking.

[mise.jdx.dev](https://mise.jdx.dev)
