Skip to content
Back to skills

Setup Zellij

DSecurity

Install Zellij and configure shell profiles to auto-launch Zellij on startup (replacing any existing herdr autostart block). Use when the user wants to install or configure Zellij's shell autostart.

  • 3 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 3, 2026
developmentgoshellbashapi

Works with

  • terminal
  • cli
  • api

Security analysis

D50/100
  • criticalModifies startup scripts or system services for persistence
  • criticalModifies startup scripts or system services for persistence

Pro shows the line behind each finding and how to fix it

Scanned September 3, 2026

npx -y skills add atman-33/workhub --skill setup-zellij --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Setup Zellij?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Setup Zellij
[![Security: D — Skills Directory](https://www.skillsdirectory.com/api/skills/atman-33-setup-zellij/badge)](https://www.skillsdirectory.com/skills/atman-33-setup-zellij)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: setup-zellij
description: Install Zellij and configure shell profiles to auto-launch Zellij on startup (replacing any existing herdr autostart block). Use when the user wants to install or configure Zellij's shell autostart.
disable-model-invocation: true
---

## Task

Install `zellij` terminal multiplexer and configure each shell profile (PowerShell and
WSL bash / zsh) to launch it automatically on startup — replacing any existing herdr
autostart block installed by `setup-herdr`.

## Steps

### 1. Check Zellij installation (per environment)

**PowerShell:**
Run `Get-Command zellij -ErrorAction SilentlyContinue` (or `zellij --version`).

**WSL:**
Run `wsl -- which zellij` (or `wsl -- zellij --version`).

If found in an environment, mark that environment "already installed" and skip to step 3
for it. If not found, continue to step 2 for that environment.

---

### 2. Install Zellij (only after user confirmation)

These are system-level installers — always show the exact command and get the user's
go-ahead before running it via Bash/PowerShell (same convention `setup-herdr` uses for
herdr's own install script).

**Windows:**
```powershell
winget install --id Zellij.Zellij -e
```

**WSL/Linux:**
```bash
sudo apt update && sudo apt install -y zellij
```

> If the distribution doesn't ship `zellij`, install it from Cargo instead:
> `cargo install --locked zellij` (or see https://zellij.dev).

If the user declines, mark that environment "skipped (declined)" and continue with the
other environment.

---

### 3. Configure shell profiles: remove herdr autostart, add Zellij autostart

Process the following **four profiles** independently: PowerShell 7 (`$PROFILE`),
Windows PowerShell, WSL bash, and WSL zsh (only if zsh is installed).

#### 3-A. PowerShell 7 profile

1. Get the profile path from `$PROFILE`.
2. If the file does not exist, create it along with its parent directory.
3. **Remove any existing herdr autostart block.** Look for the `# Auto-start herdr`
   comment; if present, remove it together with the block that follows through the
   matching closing `}`:
   ```powershell
   # Auto-start herdr
   if (-not $env:HERDR_ENV) {
       herdr
   }
   ```
   If not found, note "(nothing to remove)" and continue.
4. Read the file and check whether it contains `ZELLIJ` or `Auto-start Zellij`.
   If found, mark as "already configured" and skip to 3-B.
5. If not found, append the following at the end of the file:

   ```powershell
   # Auto-start Zellij
   if (-not $env:ZELLIJ) {
       $cwd = (Get-Location).Path
       zellij options --default-shell pwsh --default-cwd $cwd
   }
   ```

   > **Why `--default-cwd`?**
   > On Windows, Zellij does not inherit the CWD from the launching shell, so new
   > panes open in the user home directory. `--default-cwd` sets the working
   > directory for the Zellij session directly, without altering the shell command.
   > (`pwsh` = PowerShell 7 executable name on Windows)

#### 3-B. Windows PowerShell profile

1. Build the profile path without hardcoding the username:

   ```powershell
   $winPSProfile = Join-Path ([Environment]::GetFolderPath("MyDocuments")) "WindowsPowerShell\Microsoft.PowerShell_profile.ps1"
   ```

   > **OneDrive redirect**: On systems where OneDrive syncs the Documents folder,
   > `GetFolderPath("MyDocuments")` returns the OneDrive path (e.g.
   > `C:\Users\...\OneDrive\Documents\...`). Do NOT hardcode
   > `C:\Users\...\Documents\...` — the actual profile will be on OneDrive and
   > the hardcoded path will silently miss it. Always use `GetFolderPath` or
   > resolve the path via PowerShell before reading/editing.

2. If the parent directory (`WindowsPowerShell\`) does not exist, create it with `New-Item -ItemType Directory -Force`.
3. If the file does not exist, create it.
4. **Remove any existing herdr autostart block** (same `# Auto-start herdr` → closing
   `}` detection as 3-A). If not found, note "(nothing to remove)" and continue.
5. Read the file and check whether it contains `ZELLIJ` or `Auto-start Zellij`.
   If found, mark as "already configured" and skip to 3-C.
6. If not found, append the following at the end of the file:

   ```powershell
   # Auto-start Zellij
   if (-not $env:ZELLIJ) {
       $cwd = (Get-Location).Path
       zellij options --default-shell powershell --default-cwd $cwd
   }
   ```

   > **Why `--default-cwd`?**
   > Same reason as 3-A. (`powershell` = Windows PowerShell 5.x executable name)

#### 3-C. WSL bash profile

1. Run `wsl -- test -f ~/.bashrc && echo exists` to check whether `~/.bashrc` exists.
2. **Remove any existing herdr autostart block.** Look for the `# Auto-start herdr`
   comment; if present, remove it together with the block that follows through the
   matching `fi` (e.g. `wsl -- sed -i '/# Auto-start herdr/,/^fi$/d' ~/.bashrc` — the
   block shape is fixed and known, so a range delete from the comment through the next
   `^fi$` is safe). If not found, note "(nothing to remove)" and continue.
3. Run `wsl -- grep -q "Auto-start Zellij" ~/.bashrc` to check for duplicates.
   (Match the literal comment marker `Auto-start Zellij`, **not** `ZELLIJ` — see the
   warning below for why.) If already present, skip to 3-D.
4. If not present, append the block by piping a **PowerShell single-quoted here-string**
   to WSL's stdin. The closing `'@` must sit at column 0:

   ```powershell
   @'

   # Auto-start Zellij
   if [[ -z "$ZELLIJ" ]]; then
       zellij
   fi
   '@ | wsl -- bash -c 'cat >> ~/.bashrc'
   ```

   > **⚠️ Why a here-string, not `printf`?**
   > A naive `wsl -- bash -c 'printf "...\$ZELLIJ..." >> ~/.bashrc'` passes the
   > format string through PowerShell → wsl → bash. The `\$ZELLIJ` escaping is
   > fragile and can be stripped, writing `if [[ -z "" ]]` instead of
   > `if [[ -z "$ZELLIJ" ]]`. Since `[[ -z "" ]]` is **always true**, Zellij then
   > launches unconditionally — including inside an existing session — causing
   > runaway nested Zellij/shell spawning that makes WSL unstable.
   > A single-quoted here-string is passed **verbatim** (no `$` expansion in
   > PowerShell), and `cat` appends stdin as-is, so the `$ZELLIJ` guard survives.
   > For the same reason, the dedup check in step 3 greps for `Auto-start Zellij`
   > (always written) rather than `ZELLIJ` (lost when the guard breaks).

#### 3-D. WSL zsh profile (only if zsh is installed)

1. Run `wsl -- which zsh` to check whether zsh is available. If not found, skip.
2. Run `wsl -- test -f ~/.zshrc && echo exists` to check whether `~/.zshrc` exists.
3. **Remove any existing herdr autostart block** (same detection/removal as 3-C, applied
   to `~/.zshrc`). If not found, note "(nothing to remove)" and continue.
4. Run `wsl -- grep -q "generate-auto-start" ~/.zshrc` first. If present, zsh already
   auto-starts Zellij via the official `zellij setup --generate-auto-start zsh` method;
   **mark as "already configured" and skip** (do not add a second manual block).
5. Otherwise run `wsl -- grep -q "Auto-start Zellij" ~/.zshrc` to check for the manual
   block. If already present, skip.
6. If neither is present, append the block via a PowerShell here-string piped to stdin
   (same technique and rationale as bash; the closing `'@` must sit at column 0):

   ```powershell
   @'

   # Auto-start Zellij
   if [[ -z "$ZELLIJ" ]]; then
       zellij
   fi
   '@ | wsl -- zsh -c 'cat >> ~/.zshrc'
   ```

---

### 4. Report results (follow the Output Format below)

## Output Format

```
## Zellij Setup

| Item                     | Status                                            |
|---------------------------|---------------------------------------------------|
| Zellij install (Windows)  | <Installed / Already installed / Skipped (declined)> |
| Zellij install (WSL/Linux)| <Installed / Already installed / Skipped (declined)> |

| Profile             | herdr block removed | Zellij autostart                                    | Profile Path |
|----------------------|----------------------|------------------------------------------------------|--------------|
| PowerShell 7         | <Yes / No / N/A>     | <Added / Already configured>                          | <$PROFILE path> |
| Windows PowerShell   | <Yes / No / N/A>     | <Added / Already configured>                          | <Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1> |
| WSL bash             | <Yes / No / N/A>     | <Added / Already configured>                          | ~/.bashrc |
| WSL zsh              | <Yes / No / N/A / zsh not installed> | <Added / Already configured / Already auto-starts via generate-auto-start> | ~/.zshrc |

### Actions taken
- <bulleted list of what was actually done>

### Next steps
- Open each shell in a new session and verify that Zellij starts automatically.
- If you are already inside a Zellij session, nested launches are suppressed via the `$ZELLIJ` variable.
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.