---
title: Conditions
description: Control entry visibility based on environment variables and binary existence
---
import { Aside } from '@astrojs/starlight/components';
## Overview
Raffi supports conditional visibility for launcher entries. Use conditions to:
- Show entries only in specific desktop environments
- Display entries only when certain binaries are installed
- Conditionally show entries based on environment variables
Multiple conditions can be specified per entry. When multiple conditions are present, they are AND-ed together — all conditions must pass for the entry to be shown.
## Condition Types
### ifenvset
Shows the entry only if an environment variable is set (to any value).
**`ifenvset`** `string`
Environment variable name. Entry is shown only if this variable is set.
#### Example: Wayland-Only Entry
```yaml
launchers:
rbw-pass:
binary: rofi-rbw
args:
[
"--selector wofi --clipboarder wl-copy --action copy-password --typer xdotool",
]
description: "Password Manager"
icon: password-manager
ifenvset: WAYLAND_DISPLAY
```
This entry appears only when `WAYLAND_DISPLAY` is set (i.e., in Wayland sessions).
#### Example: Sway-Specific Entry
```yaml
launchers:
cliphistory:
binary: clipman
args: ["pick", "-t", "wofi"]
description: "Clipboard history"
icon: accessories-clipboard
ifenvset: SWAYSOCK
```
### ifenvnotset
Shows the entry only if an environment variable is **not** set.
**`ifenvnotset`** `string`
Environment variable name. Entry is shown only if this variable is not set.
#### Example
```yaml
launchers:
x11-only:
binary: xdotool
description: "X11 Tool"
ifenvnotset: WAYLAND_DISPLAY
```
### ifenveq
Shows the entry only if an environment variable equals a specific value.
**`ifenveq`** `array`
Array with exactly two elements: `[VARIABLE_NAME, EXPECTED_VALUE]`.
Entry is shown only if `$VARIABLE_NAME == EXPECTED_VALUE`.
#### Example: GNOME-Only Entry
```yaml
launchers:
keyboard-setting:
binary: gnome-control-center
args: [keyboard]
description: "Keyboard setting"
icon: preferences-desktop-keyboard-shortcuts
ifenveq: [DESKTOP_SESSION, GNOME]
```
#### Example: X11-Only Entry
```yaml
launchers:
snap-window-around:
binary: wmctrl-resize-and-center
args: [rotate]
description: "Snap window around"
icon: wmaround
ifenveq: [XDG_SESSION_TYPE, x11]
```
#### Example: Desktop Environment Check
```yaml
launchers:
gnome-shutdown:
binary: gnome-session-quit
args: [--power-off]
description: "Shutdown / Poweroff"
icon: gnome-shutdown
ifenveq: [DESKTOP_SESSION, GNOME]
reboot:
binary: gnome-session-quit
args: [--reboot]
description: "Reboot"
icon: gnome-session-reboot
ifenveq: [DESKTOP_SESSION, GNOME]
```
### ifexist
Shows the entry only if a specific binary or file exists.
**`ifexist`** `string`
Binary name. Entry is shown only if the binary exists in PATH.
#### Example: Binary Existence
```yaml
launchers:
wally:
binary: jumpapp
args: ["-X", "wally"]
description: "Wally"
icon: wally
ifexist: wally
```
Shown only if `wally` is installed in PATH.
#### Example: Multiple Entries for Same App
```yaml
launchers:
evolution-mail:
binary: jumpapp
args: ["-t", "Evolution", "-X", "evolution"]
description: "Evolution Mail"
icon: evolution-mail
ifexist: evolution
signal:
binary: jumpapp
args: ["-X", "signal", "signal-desktop"]
description: "Signal"
icon: signal-desktop
ifexist: signal-desktop
```
#### Example: File Path Check
```yaml
launchers:
custom-app:
binary: ~/bin/myapp
description: "My Application"
icon: myapp
ifexist: ~/bin/myapp
```
## Combining with Other Fields
Conditions work with all other entry fields:
### Script with Condition
```yaml
launchers:
my-script:
script: |
echo "Running on Wayland"
env | grep WAYLAND
description: "Wayland Info"
icon: "info"
ifenvset: WAYLAND_DISPLAY
```
### Disabled Entry with Condition
```yaml
launchers:
optional-tool:
binary: special-tool
description: "Special Tool"
ifexist: special-tool
disabled: true
```
<Aside type="note">
Even if the condition passes, a `disabled: true` entry will be hidden.
</Aside>
## Real-World Examples
From the example configuration:
### Environment-Specific System Commands
```yaml
# GNOME-specific shutdown
launchers:
gnome-shutdown:
binary: gnome-session-quit
args: [--power-off]
description: "Shutdown / Poweroff"
icon: gnome-shutdown
ifenveq: [DESKTOP_SESSION, GNOME]
# Sway-specific shutdown
shutdown:
binary: poweroff
description: "Shutdown / Poweroff"
icon: gnome-shutdown
ifenvset: SWAYSOCK
```
### Session Type Detection
```yaml
# X11-only entry
launchers:
red-hat-mail:
binary: xdo-focus-a-tab
args: ["chromium", "Red Hat Mail", "https://mail.google.com/a/redhat.com"]
description: "Red Hat GMail"
icon: gmail
ifenveq: [XDG_SESSION_TYPE, x11]
# Wayland-only entry
screenshot-clipboard:
binary: sway-screenshot
args: [selection-clipboard]
description: "Screenshot to clipboard"
icon: screenshoticon
ifenvset: SWAYSOCK
```
### Optional Tools
```yaml
launchers:
emoji-picker:
binary: splatmoji
args: [copy]
description: "Emoji Picker"
icon: emoji
ifexist: splatmoji
bpytop:
binary: kitty-ctrl
args: ["jump", "bpytop"]
description: "BpyTOP"
icon: bashtop
ifexist: bpytop
start-kind:
binary: kitty-ctrl
args: ["jump", "-t", "Kind", "startkind"]
description: "Start Kind"
icon: kind-started
ifexist: kind
```
## Validation Logic
Raffi evaluates conditions on startup:
1. **ifenveq**: Checks if variable exists and equals expected value
2. **ifenvset**: Checks if variable exists (any value)
3. **ifenvnotset**: Checks if variable does not exist
4. **ifexist**: Checks if binary is in PATH or file exists
If any condition fails, the entry is hidden.
### Automatic Binary Check
Even without conditions, Raffi automatically hides entries if:
- `binary` doesn't exist in PATH (for non-script entries)
- Script interpreter doesn't exist in PATH (for script entries)
```yaml
# Automatically hidden if firefox is not installed
launchers:
firefox:
binary: firefox
description: "Firefox"
icon: firefox
```
## Multiple Conditions
Multiple conditions can be specified on a single entry. When present, they are AND-ed together — all conditions must pass for the entry to be shown.
```yaml
# Entry shown only on GNOME Wayland sessions
launchers:
gnome-wayland-tool:
binary: my-tool
description: "Tool (GNOME on Wayland)"
ifenveq: [DESKTOP_SESSION, GNOME]
ifenvset: WAYLAND_DISPLAY
```