i3status-rs(1)
๐ i3status-rs(1) โ General Commands Manual, bestie edition โจ
โจ NAME โจ
i3status-rs โ a feature-rich and resource-friendly replacement for i3status, written in Rust. ๐
๐ SYNOPSIS ๐
i3status-rs [--never-pause] [-j|--threads] [-h|--help] [-V|--version]
[CONFIG]
๐ DESCRIPTION ๐
Okay so i3status-rs is literally a feature-rich and resource-friendly replacement for i3status(1), written in Rust. โจ The i3status-rs program writes a stream of configurable "blocks" of system information (time, battery status, volume, etc.) to standard output in the JSON format understood by i3bar(1) and sway-bar(5). That's the whole vibe. ๐ซถ
๐ OPTIONS ๐
--never-pauseโ Ignore any attempts by i3 to pause the bar when hidden/fullscreen. ๐-j,--threads=BLOCKING_THREADS[default:2] โ The maximum number of blocking threads spawned by tokio. ๐งต-h,--helpโ Print help (see a summary with '-h'). ๐-V,--versionโ Print version. ๐[CONFIG][default:config.toml] โ Sets a TOML config file. ๐- If full absolute path given, then use it as is:
/home/foo/i3rs-config.toml - If filename given, e.g.
"custom_theme.toml", then first look in$XDG_CONFIG_HOME/i3status-rust - Then look for it in
$XDG_DATA_HOME/i3status-rust - Otherwise look for it in
/usr/share/i3status-rust
- If full absolute path given, then use it as is:
๐ง BLOCKS ๐ง
Each block is its own little main character. ๐
๐ฅ amd_gpu ๐ฅ
Display the stats of your AMD GPU. ๐
๐ Configuration ๐
deviceโ The device in/sys/class/drm/to read from. Default:Any AMD card.formatโ A[MultiFormat][MaybeMultiFormatConfig]string to customise the output of this block. See below for available placeholders. Default:[" $icon $utilization "].intervalโ Update interval in seconds. Default:5.
Placeholders:
iconโ A static icon. Type:Icon; Unit:-.utilizationโ GPU utilization. Type:Number; Unit:%.vram_totalโ Total VRAM. Type:Number; Unit:Bytes.vram_usedโ Used VRAM. Type:Number; Unit:Bytes.vram_used_percentsโ Used VRAM / Total VRAM. Type:Number; Unit:%.
Actions:
toggle_formatโ Toggles betweenformatandformat_alt. Default button:-.DEPRECATEDnext_formatโ Switches to the next format in the list. Default button:Left.prev_formatโ Switches to the previous format in the list. Default button:Right.
๐ Example ๐
[[block]]
block = "amd_gpu"
format = " $icon $utilization "
format_alt = " $icon MEM: $vram_used_percents ($vram_used/$vram_total) "
interval = 1
๐ฆ Icons Used ๐ฆ
gpu($icon)
๐ backlight ๐
The brightness of a backlight device. โจ
This block reads brightness information directly from the filesystem, so it works under both X11 and Wayland. ๐ฅ๏ธ The block uses inotify to listen for changes in the deviceโs brightness directly, so there is no need to set an update interval. โฑ๏ธ This block uses DBus to set brightness level using the mouse wheel, but will fallback to sysfs if systemd-logind is not used. ๐ฑ๏ธ
๐ Root scaling ๐
Some devices expose raw values that are best handled with nonlinear scaling. The human perception of lightness is close to the cube root of relative luminance, so settings for root_scaling between 2.4 and 3.0 are worth trying. For devices with few discrete steps this should be 1.0 (linear). More information: https://en.wikipedia.org/wiki/Lightness ๐ก
๐ Configuration ๐
deviceโ A regex to match against/sys/class/backlightdevices to read brightness information from (can match 1 or more devices). When there is no device specified, this block will display information for all devices found in the/sys/class/backlightdirectory. Default:Default device.formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $brightness ".missing_formatโ A string to customise the output of this block. No placeholders available. Default:" no backlight devices ".step_widthโ The brightness increment to use when scrolling, in percent. Default:5.minimumโ The minimum brightness that can be scrolled down to. Default:5.maximumโ The maximum brightness that can be scrolled up to. Default:100.cycleโ The brightnesses to cycle through on each click. Default:[minimum, maximum].root_scalingโ Scaling exponent reciprocal (ie.root). Default:1.0.invert_iconsโ Invert iconsโ ordering, useful if you have colorful emoji. Default:false.ddcci_sleep_multiplierโ See ddcutil documentationโจhttps://www.ddcutil.com/performance_options/#option-sleep-multiplierโฉ. Default:1.0.ddcci_max_tries_write_readโ The maximum number of times to attempt writing to or reading from a ddcci monitor. Default:10.
Placeholders:
iconโ Icon based on backlightโs state. Type:Icon; Unit:-.brightnessโ Current brightness. Type:Number; Unit:%.
Actions:
cycleโ Default button:Left.brightness_upโ Default button:Wheel Up.brightness_downโ Default button:Wheel Down.
๐ Example ๐
[[block]]
block = "backlight"
device = "intel_backlight"
Hide missing backlight:
[[block]]
block = "backlight"
missing_format = ""
๐ง calibright ๐ง
Additional display brightness calibration can be set in $XDG_CONFIG_HOME/calibright/config.toml. See https://github.com/bim9262/calibright for more details. This block will override any global config set in $XDG_CONFIG_HOME/calibright/config.toml. ๐
๐ D-Bus Fallback ๐
If you donโt use systemd-logind, i3status-rust will attempt to set the brightness using sysfs. In order to do this youโll need to have write permission. You can do this by writing a udev rule for your system.
First, check that your user is a member of the โvideoโ group using the groups command. Then add a rule in the /etc/udev/rules.d/ directory containing the following, for example in backlight.rules:
ACTION=="add", SUBSYSTEM=="backlight", GROUP="video", MODE="0664"
This will allow the video group to modify all backlight devices. You will also need to restart for this rule to take effect. ๐
๐ฆ Icons Used ๐ฆ
backlight($icon, as a progression)
๐ battery ๐
Information about the internal power supply. โก
This block can display the current battery state (Full, Charging or Discharging), percentage charged and estimate time until (dis)charged for an internal power supply. ๐ชซ๐
โ๏ธ Configuration โ๏ธ
okay bestie here's the battery config table, every key, no skips ๐
deviceโ forsysfs/UPower: the device in/sys/class/power_supply/to read from. (You can also put"DisplayDevice"for UPower โ that's a single logical power source that represents all the physical power sources. Super handy if your system has multiple batteries, because then DisplayDevice acts like you've got one big chonky battery instead of a whole squad.) Forapc_ups:IPv4Address:portorhostname:port. Default: forsysfs, the first battery device found in/sys/class/power_supply, with"BATx"or"CMBx"entries taking precedence; forapc_ups,"localhost:3551"; forupower,DisplayDevice.driverโ one of"sysfs","apc_ups", or"upower". Default:"sysfs".modelโ if present, the contents of/sys/class/power_supply/.../model_namemust match this value. Typical use is to select by model name on devices that change their path (iconic for flaky hardware fr). Default: N/A.intervalโ update interval, in seconds. Only relevant fordriver = "sysfs"or"apc_ups". Default:10.formatโ a string to customise the output of this block โจ see below for available placeholders. Default:" $icon $percentage ".full_formatโ same asformatbut for when the battery is full. Default:" $icon ".charging_formatโ same asformatbut for when the battery is charging. Default: links toformat๐.empty_formatโ same asformatbut for when the battery is empty. Default:" $icon ".not_charging_formatโ same asformatbut for when the battery is not charging. Defaults to the full battery icon, because so many batteries report this status when they're actually full ๐ (they're lying but okay). Default:" $icon ".missing_formatโ same asformatif the battery cannot be found. Default:" $icon ".infoโ minimum battery level where state is set to info. Default:60.goodโ minimum battery level where state is set to good. Default:60.warningโ minimum battery level where state is set to warning. Default:30.criticalโ minimum battery level where state is set to critical. Default:15.full_thresholdโ percentage above which the battery is considered full (full_formatshown). Default:95.empty_thresholdโ percentage below which the battery is considered empty. Default:7.5.
the placeholders, bestie ๐
iconโ icon based on battery's state. Type: Icon. Unit:-.percentageโ battery level, in percent. Type: Number. Unit:Percents.time_remainingโ time remaining until (dis)charge is complete. Only presented if the battery's status is (dis)charging. Type: Duration. Unit:-.timeโ time remaining until (dis)charge is complete. Only presented if the battery's status is (dis)charging. Type: String. Unit:-. DEPRECATED ๐powerโ power consumption by the battery, or from the power supply when charging. Type: String or Float. Unit:Watts.
timehas been deprecated in favor oftime_remaining. use the new one, she ate and left no crumbs ๐ซถ
Examples ๐ธ
basic usage, the classic:
[[block]]
block = "battery"
format = " $icon $percentage "
[[block]]
block = "battery"
format = " $percentage {$time_remaining.dur(hms:true, min_unit:m) |}"
device = "DisplayDevice"
driver = "upower"
hiding a missing battery (iconic, no notes):
[[block]]
block = "battery"
missing_format = ""
Icons Used ๐
batโ used as$iconinformat,full_format,empty_format,not_charging_format, as a progression.bat_chargingโ used as$iconincharging_format, as a progression.bat_not_availableโ used as$iconinmissing_format.
๐ต bluetooth ๐ต
monitor a Bluetooth device ๐
this block displays the connectivity of a given Bluetooth device, plus the battery level if that's supported. It relies on the Bluez D-Bus API.
when the device can be identified as an audio headset, a keyboard, a joystick, or a mouse, it uses the relevant icon (we love a device that knows what it is ๐ ). otherwise it falls back on the generic Bluetooth symbol.
right-clicking the block will attempt to connect (or disconnect) the device. so convenient, no cap.
Note: battery level information is not reported for some devices. enabling experimental features of bluez may fix it. (blame the device, not the block ๐)
โ๏ธ Configuration โ๏ธ
macโ MAC address of the Bluetooth device. Default: Required (yes bestie, mandatory, no skipping).adapter_macโ MAC Address of the Bluetooth adapter (in case your device was connected to multiple currently available adapters). Default: None.formatโ a string to customise the output of this block. See below for available placeholders. Default:" $icon $name{ $percentage|} ".disconnected_formatโ a string to customise the output of this block. See below for available placeholders. Default:" $icon{ $name|} ".battery_stateโ a mapping from battery percentage to the block's state (color). See example below. Default:0..15 -> critical,16..30 -> warning,31..60 -> info,61..100 -> good.
the placeholders ๐ฆ
iconโ icon based on what type of device is connected. Type: Icon. Unit:-.nameโ device's name. Type: Text. Unit:-.percentageโ device's battery level (may be absent if the device is not supported). Type: Number. Unit:%.battery_iconโ battery icon (may be absent if the device is not supported). Type: Icon. Unit:-.availableโ present if the device is available. Type: Flag. Unit:-.
actions ๐ฑ๏ธ
toggleโ default button: Right.
Examples โจ
this example just shows the icon when the device is connected:
[[block]]
block = "bluetooth"
mac = "00:18:09:92:1B:BA"
disconnected_format = ""
format = " $icon "
[block.battery_state]
"0..20" = "critical"
"21..70" = "warning"
"71..100" = "good"
Icons Used ๐
headphonesโ used as$iconfor bluetooth devices identifying as"audio-card","audio-headset"or"audio-headphones".joystickโ used as$iconfor bluetooth devices identifying as"input-gaming".keyboardโ used as$iconfor bluetooth devices identifying as"input-keyboard".mouseโ used as$iconfor bluetooth devices identifying as"input-mouse".bluetoothโ used as$iconfor all other devices, and when the device is unavailable.batโ used as$battery_icon, as a progression, for devices reporting a battery level.
๐ calendar ๐
calendar ๐๏ธ
this block displays upcoming calendar events retrieved from a CalDav ICalendar server.
okay so here's the rest of the knobs for this block โ key, what it does, and what it defaults to ๐
next_event_formatโ a string that customises what this block shows when there's a next event in the calendar. Peep the placeholders list below for what you can slot in. Default:
" $icon $start.datetime(f:`%a %H:%M') $summary "
ongoing_event_formatโ a string that customises the output when an event is currently ongoing. Default:
" $icon $summary (ends at $end.datetime(f:`%H:%M')) "
no_events_formatโ a string that customises the output when there are no events at all. Default:" $icon "redirect_formatโ a string that customises the output when authorization is being asked for. Default:" $icon Check your web browser "fetch_intervalโ how often to fetch events, in seconds. Default:60alternate_events_intervalโ interval in seconds for alternating between overlapping events. Default:10events_within_hoursโ how many hours into the future to look for events. Default:48sourceโ array of sources to pull calendars from. Default:[]warning_thresholdโ warning threshold in seconds for the upcoming event. Default:300browser_cmdโ command used to open event details in a browser. The block passes the HTML link as an argument. Default:"xdg-open"
โจ Source Configuration โจ
urlโ the CalDav calendar server URL. Default:N/Aauthโ authentication configuration, one ofunauthenticated,basic, oroauth2. Default:unauthenticatedcalendarsโ a list of calendar names to monitor. If it's empty, all calendars will be fetched. Default:[]
โ ๏ธ note bestie: currently only one source is supported. one. singular. ๐
And here's the action it can do:
open_linkโ opens the HTML link of the event. Default button: Left
๐ฆ Examples ๐ฆ
Unauthenticated ๐ธ
[[block]]
block = "calendar"
next_event_format = " $icon $start.datetime(f:'%a %H:%M') $summary "
ongoing_event_format = " $icon $summary (ends at $end.datetime(f:'%H:%M')) "
no_events_format = " $icon no events "
fetch_interval = 30
alternate_events_interval = 10
events_within_hours = 48
warning_threshold = 600
browser_cmd = "firefox"
[[block.source]]
url = "https://caldav.example.com/calendar/"
calendars = ["user/calendar"]
[block.source.auth]
type = "unauthenticated"
Basic Authentication ๐
[[block]]
block = "calendar"
next_event_format = " $icon $start.datetime(f:'%a %H:%M') $summary "
ongoing_event_format = " $icon $summary (ends at $end.datetime(f:'%H:%M')) "
no_events_format = " $icon no events "
fetch_interval = 30
alternate_events_interval = 10
events_within_hours = 48
warning_threshold = 600
browser_cmd = "firefox"
[[block.source]]
url = "https://caldav.example.com/calendar/"
calendars = [ "Holidays" ]
[block.source.auth]
type = "basic"
username = "your_username"
password = "your_password"
๐ก Note: you can also put the username and password in a separate TOML file.
~/.config/i3status-rust/example_credentials.toml
username = "my-username"
password = "my-password"
Source auth configuration with credentials_path:
[block.source.auth]
type = "basic"
credentials_path = "~/.config/i3status-rust/example_credentials.toml"
OAuth2 Authentication (Google Calendar) ๐
To hit Google's CalDav API you gotta follow these steps to enable the API and grab your client_id and client_secret:
- Go to the Google Cloud Console: navigate to the Google Cloud Console.
- Create a New Project: if you don't already have a project, click on the project dropdown and select "New Project". Give your project a name and click "Create".
- Enable the CalDAV API: in the project dashboard, go to the "APIs & Services" > "Library". Search for "CalDAV API" and click on it, then click "Enable".
- Set Up OAuth Consent Screen: go to "APIs & Services" > "OAuth consent screen". Fill out the required information and save.
- Create Credentials:
- Navigate to "APIs & Services" > "Credentials".
- Click "Create Credentials" and select "OAuth 2.0 Client IDs".
- Configure the consent screen if you haven't already.
- Set the application type to "Web application".
- Add your authorized redirect URIs. For example,
http://localhost:8080. - Click "Create" and note down the
client_idandclient_secret.
- Download the Credentials: click on the download icon next to your OAuth 2.0 Client ID to download the JSON file containing your client ID and client secret. Use these values in your configuration.
[[block]]
block = "calendar"
next_event_format = " $icon $start.datetime(f:'%a %H:%M') $summary "
ongoing_event_format = " $icon $summary (ends at $end.datetime(f:'%H:%M')) "
no_events_format = " $icon no events "
fetch_interval = 30
alternate_events_interval = 10
events_within_hours = 48
warning_threshold = 600
browser_cmd = "firefox"
[[block.source]]
url = "https://apidata.googleusercontent.com/caldav/v2/"
calendars = ["primary"]
[block.source.auth]
type = "oauth2"
client_id = "your_client_id"
client_secret = "your_client_secret"
auth_url = "https://accounts.google.com/o/oauth2/auth"
token_url = "https://oauth2.googleapis.com/token"
auth_token = "~/.config/i3status-rust/calendar.auth_token"
redirect_port = 8080
scopes = ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.events"]
๐ก Note: you can also putclient_idandclient_secretin a separate TOML file.
~/.config/i3status-rust/google_credentials.toml
client_id = "my-client_id"
client_secret = "my-client_secret"
Source auth configuration with credentials_path:
[block.source.auth]
type = "oauth2"
credentials_path = "~/.config/i3status-rust/google_credentials.toml"
auth_url = "https://accounts.google.com/o/oauth2/auth"
token_url = "https://oauth2.googleapis.com/token"
auth_token = "~/.config/i3status-rust/calendar.auth_token"
redirect_port = 8080
scopes = ["https://www.googleapis.com/auth/calendar", "https://www.googleapis.com/auth/calendar.events"]
๐ Format Configuration ๐
The format configuration is just a string that can include placeholders, and those placeholders get swapped out for dynamic content. The placeholders are:
$summaryโ summary of the event$descriptionโ description of the event$urlโ url of the event$locationโ location of the event$startโ start time of the event$endโ end time of the event
โญ Icons Used โญ
calendar($icon)
๐ป cpu ๐ป
literally CPU statistics, that's the whole vibe โจ
Configuration
formatโ a [MultiFormat][MaybeMultiFormatConfig] string to customise the output of this block. See the placeholders below for what you can use. Default:[" $icon $utilization "]intervalโ update interval in seconds. Default:5info_cpuโ percentage of CPU usage where the state gets set to info. Default:30.0warning_cpuโ percentage of CPU usage where the state gets set to warning. Default:60.0critical_cpuโ percentage of CPU usage where the state gets set to critical. Default:90.0
Now the placeholders, with their type and unit so you know what you're working with:
iconโ an icon. Type:Icon, Unit:-utilizationโ average CPU utilization. Type:Number, Unit:%utilization<N>โ utilization of the Nth logical CPU. Type:Number, Unit:%barchartโ utilization of all logical CPUs, presented as a barchart. Type:Text, Unit:-frequencyโ average CPU frequency (may be absent if the CPU isn't supported). Type:Number, Unit:Hzfrequency<N>โ frequency of the Nth logical CPU (may be absent if the CPU isn't supported). Type:Number, Unit:Hzmax_frequencyโ max frequency of all logical CPUs. Type:Number, Unit:Hzboostโ CPU turbo boost status (may be absent if the CPU isn't supported). Type:Text, Unit:-toggle_formatโ flips your block betweenformatandformat_alt๐ โ default button:-next_formatโ DEPRECATED โ moves on to the next format in the list โ default button: Leftprev_formatโ DEPRECATED โ hops back to the previous format in the list โ default button: Right
๐ธ Example
[[block]]
block = "cpu"
interval = 1
format = " $icon $barchart $utilization "
format_alt = " $icon $frequency{ $boost|} "
info_cpu = 20
warning_cpu = 50
critical_cpu = 90
๐ Icons Used
cpu($icon, as a progression) โจcpu_boost_on($boost) ๐ฅcpu_boost_off($boost) ๐
๐ฆ custom
Lowkey the most iconic block ever: it just shows the output of a custom shell command you give it. main character energy honestly.
For further customisation, use the json option and have the shell command output valid JSON in the schema below:
{"icon": "...", "state": "...", "text": "...", "short_text": "..."}
icon is optional (default โโ), state is optional, it may be Idle, Info, Good, Warning, Critical (default Idle), and short_text is optional. ๐ซถ
๐ Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:"{ $icon|} $text.pango-str() "commandโ Shell command to execute & display. Default:Nonepersistentโ Run command in the background; update display for each output line of the command. Default:falsecycleโ Commands to execute and change when the button is clicked. Default:Noneintervalโ Update interval in seconds (or"once"to update only once). Default:10jsonโ Use JSON from command output to format the block. If the JSON is not valid, the block will error out. Default:falsewatch_filesโ Watch files to trigger update on file modification. Supports path expansions e.g.~. Default:Nonehide_when_emptyโ Hides the block when the command output (or jsontextfield) is empty. Default:falseshellโ Specify the shell to use when running commands. Default:$SHELLif set, otherwise fallback tosh
โจ Placeholders
iconโ Value oficonfield from JSON output when itโs non-empty โ type: Icon โ unit:-textโ Output of the script ortextfield from JSON output โ type: Textshort_textโshort_textfield from JSON output โ type: Text
๐ Actions
cycleโ default button: Left
๐ Examples
Display temperature, update every 10 seconds:
[[block]]
block = "custom"
command = ''' cat /sys/class/thermal/thermal_zone0/temp | awk '{printf("%.1f\n",$1/1000)}' '''
Cycle between โONโ and โOFFโ, update every 1 second, run next cycle command when block is clicked:
[[block]]
block = "custom"
cycle = ["echo ON", "echo OFF"]
interval = 1
[[block.click]]
button = "left"
action = "cycle"
Use JSON output:
[[block]]
block = "custom"
command = "echo '{\"icon\":\"weather_thunder\",\"state\":\"Critical\", \"text\": \"Danger!\"}'"
json = true
Display kernel, update the block only once:
[[block]]
block = "custom"
command = "uname -r"
interval = "once"
Display the screen brightness on an intel machine and update this only when pkill -SIGRTMIN+4 i3status-rs is called:
[[block]]
block = "custom"
command = ''' cat /sys/class/backlight/intel_backlight/brightness | awk '{print $1}' '''
signal = 4
interval = "once"
Update block when one or more specified files are modified:
[[block]]
block = "custom"
command = "cat custom_status"
watch_files = ["custom_status"]
interval = "once"
๐ TODO:
- Use
shellexpand
๐ custom_dbus
A block controlled by the DBus ๐ โ yes bestie, you are in charge now.
This block creates a new DBus object in rs.i3status service. This object implements rs.i3status.custom interface which allows you to set blockโs icon, text and state.
Output of busctl --user introspect rs.i3status /<path> rs.i3status.custom:
NAME TYPE SIGNATURE RESULT/VALUE FLAGS
rs.i3status.custom interface - - -
.SetIcon method s s -
.SetState method s s -
.SetText method ss s -
๐ Configuration
formatโ A string to customise the output of this block. Default:"{ $icon|}{ $text.pango-str()|} "
โญ Placeholders
iconโ Value of icon set viaSetIconif the value is non-empty string. โ type: Icon โ unit:-textโ Value of the first string fromSetTextโ type: Textshort_textโ Value of the second string fromSetTextโ type: Text
๐ง Example
Config:
[[block]]
block = "custom_dbus"
path = "/my_path"
Usage:
# set full text to 'hello' and short text to 'hi'
busctl --user call rs.i3status /my_path rs.i3status.custom SetText ss hello hi
# set icon to 'music'
busctl --user call rs.i3status /my_path rs.i3status.custom SetIcon s music
# set state to 'good'
busctl --user call rs.i3status /my_path rs.i3status.custom SetState s good
Okay so real talk: because itโs impossible to publish objects to the same name from different processes, having multiple dbus blocks in different bars wonโt work. ๐ญ As a workaround, you can set the env varI3RS_DBUS_NAMEto set the interface a bar works on to differentiate between different processes. For example, setting this totop, will allow you to users.i3status.top.
๐ TODO
- Send a signal on click?
๐ฅ disk_iostats
Disk I/O statistics โ watching your drives go brrrr in real time. ๐
๐ Configuration
deviceโ Block device or partition name to monitor (as specified in/dev/). Default: If not set, device will be automatically selected every intervalformatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $speed_read.eng(prefix:K) $speed_write.eng(prefix:K) "intervalโ Update interval in seconds. Default:2missing_formatโ Same asformatbut for when the device is missing. Default:" ร "
โจ Placeholders
iconโ A static icon โ type: Icon โ unit:-deviceโ The name of device โ type: Text โ unit:-speed_readโ Read speed โ type: Number โ unit: Bytes per secondspeed_writeโ Write speed โ type: Number โ unit: Bytes per second
๐ Examples
[[block]]
block = "disk_iostats"
device = "sda"
format = " $icon $speed_write.eng(prefix:K) "
Use labeled Games partition via persistent device names from /dev/disk/by-*/ ๐
[[block]]
block = "disk_iostats"
device = "disk/by-partlabel/Games"
format = " $icon $speed_write.eng(prefix:K) "
๐ฆ Icons Used
disk_drive($icon) ๐ซถ
๐ธ disk_space
Disk usage statistics
โจ Configuration โจ
Okay bestie, here's everything you can tweak ๐
pathโ the path it collects info from. Path expansions are a thing, e.g.~. Default:"/"๐๏ธintervalโ update time, in seconds. Default:20formatโ a[MultiFormat][MaybeMultiFormatConfig]string to customise the block's output. Peep the placeholders below. Default:[" $icon $available "]warningโ the value that flips the block into warning state. Default:20.0โ ๏ธalertโ the value that flips the block into critical state. Default:10.0๐จinfo_typeโ picks which info actually affects the block state. Possible values:"available","free"and"used". Default:"available"alert_unitโ the unit used by thealertandwarningoptions. If you don't set it, percents are used. Possible values:"B","kB","KB","KiB","MB","MiB","GB","Gib","TB"and"TiB". Default:Nonebackendโ the backend used when querying disk usage. Possible values:"vfs"(likedu(1)) and"btrfs". Default:"vfs"
And here's your placeholder menu ๐
iconโ a static icon. Icon, unit:-pathโ whatever thepathoption is set to. Text, unit:-percentageโ free or used percentage, depends oninfo_type. Number, unit:%totalโ total disk space. Number, unit: Bytesusedโ used disk space. Number, unit: Bytesfreeโ free disk space. Number, unit: Bytesavailableโ available disk space (that's free disk space minus the reserved system space). Number, unit: Bytes
Actions you can click, no cap ๐ฑ๏ธ
toggle_formatโ toggles betweenformatandformat_alt. Default button:-. DEPRECATED ๐next_formatโ switches to the next format in the list. Default button:Leftprev_formatโ switches to the previous format in the list. Default button:Right
๐ธ Examples ๐ธ
[[block]]
block = "disk_space"
info_type = "available"
alert_unit = "GB"
alert = 10.0
warning = 15.0
format = " $icon $available "
format_alt = " $icon $available / $total "
Update the block on right click, iconic behavior fr:
[[block]]
block = "disk_space"
[[block.click]]
button = "right"
update = true
Show the block only if less than 10GB is available (hiding info? main character energy):
[[block]]
block = "disk_space"
format = " $free.eng(range:..10e9) |"
๐ Icons Used ๐
disk_drive($icon)
๐ณ docker ๐ณ
Local docker daemon status. Yep, it's watching your containers ๐
โจ Configuration โจ
intervalโ update interval, in seconds. Default:5formatโ a string to customise the output of this block. Placeholders are listed right below. Default:" $icon $running.eng(w:1) "socket_pathโ the path to the docker socket. Path expansions are supported, e.g.~. Default:"/var/run/docker.sock"
Placeholders, slay ๐ซถ
iconโ a static icon. Icon, unit:-totalโ total containers on the host. Number, unit:-runningโ containers running on the host. Number, unit:-stoppedโ containers stopped on the host. Number, unit:-pausedโ containers paused on the host. Number, unit:-imagesโ total images on the host. Number, unit:-
๐ธ Examples ๐ธ
[[block]]
block = "docker"
interval = 2
format = " $icon $running/$total "
This next one lets you show Podman status by setting the socket path (the path depends on your own setup, iykyk):
[[block]]
block = "docker"
format = " $icon $running/$total "
socket_path = "$XDG_RUNTIME_DIR/podman/podman.sock"
# socket_path = "/run/user/1000/podman/podman.sock"
๐ Icons Used ๐
docker($icon)
๐ external_ip ๐
Your external IP address plus a whole bunch of info about it. Literally a glow-up for your bar โจ
โจ Configuration โจ
formatโ a string to customise the output of this block. Placeholders below. Default:" $ip $country_flag "intervalโ interval in seconds for automatic updates. Default:300autolocate_intervalโ how long, in seconds, to reuse the last result from the geolocation service instead of contacting it again. Kept small by default so network changes get picked up promptly. Default:1with_network_managerโ iftrue, listen for NetworkManager events and update the IP immediately if there was a change. Default:trueuse_ipv4โ iftrue, use IPv4 for obtaining all info. Default:false
Placeholder city, population: you ๐
ipโ the external IP address, as seen from a remote server. Text, unit:-versionโ IPv4 or IPv6. Text, unit:-cityโ city name, such as โSan Franciscoโ. Text, unit:-regionโ region name, such as โCaliforniaโ. Text, unit:-region_codeโ region code, such as โCAโ for California. Text, unit:-countryโ country code (2 letter, ISO 3166-1 alpha-2). Text, unit:-country_nameโ short country name. Text, unit:-country_codeโ country code (2 letter, ISO 3166-1 alpha-2). Text, unit:-country_code_iso3โ country code (3 letter, ISO 3166-1 alpha-3). Text, unit:-country_capitalโ capital of the country. Text, unit:-country_tldโ country specific TLD (top-level domain). Text, unit:-continent_codeโ continent code. Text, unit:-in_euโ region code, such as โCAโ. Flag, unit:-postalโ ZIP / Postal code. Text, unit:-latitudeโ latitude. Number, unit:-(TODO: make degrees?)longitudeโ longitude. Number, unit:-(TODO: make degrees?)timezoneโ city. Text, unit:-utc_offsetโ UTC offset (with daylight saving time) as+HHMMor-HHMM(HH is hours, MM is minutes). Text, unit:-country_calling_codeโ country calling code (dial in code, comma separated). Text, unit:-currencyโ currency code (ISO 4217). Text, unit:-currency_nameโ currency name. Text, unit:-languagesโ languages spoken (comma separated 2 or 3 letter ISO 639 code with optional hyphen separated country suffix). Text, unit:-country_areaโ area of the country (in sq km). Number, unit:-country_populationโ population of the country. Number, unit:-timezoneโ time zone. Text, unit:-orgโ organization. Text, unit:-asnโ autonomous system (AS). Text, unit:-country_flagโ flag of the country. Text (glyph), unit:-
Not a glitch bestie โ timezone really does show up twice in the list. Both are in the original, so both stay ๐
๐ธ Example ๐ธ
[[block]]
block = "external_ip"
format = " $ip $country_code "
๐ Notes ๐
All the information comes from https://ipapi.co/json/. Check their documentation here: https://ipapi.co/api/#complete-location5
Okay so real quick on the geolocation refresh sched, because it's lowkey clever ๐
The IP gets queried:
- When
i3status-rsstarts - When a signal comes in over D-Bus about a network configuration change
- Every 5 minutes
That periodic refresh is there on purpose โ it's catching IP updates that don't fire off a notification, like when your router refreshes the IP. Sneaky ones. ๐
If the service reports rate limiting, the block just keeps showing the last known IP and waits out the geolocator's rate_limit_interval (10 minutes by default) before it asks again. No spamming, we're polite. ๐
Flags: heads up bestie, these are not icons โ they're unicode glyphs. You'll need a font that actually includes them. Tested with: https://www.babelstone.co.uk/Fonts/Flags.html
focused_window
Currently focused window ๐ช
This block shows the title and/or the active marks (when you're running it with sway/i3) of whatever window is focused right now. Supported WMs are: sway, i3 and most wlroots-based compositors. Wanna know more? Peep the driver option. โจ
Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:" $title.str(max_w:21) |"driverโ Which driver to use. Default:"auto". Available values:sway_ipcโ for i3 and swaywlr_toplevel_managementโ for Wayland compositors that implementwlr-foreign-toplevel-management-unstable-v1(https://gitlab.freedesktop.org/wlroots/wlr-protocols/-/blob/master/unstable/wlr-foreign-toplevel-management-unstable-v1.xml)autoโ try to automatically guess which driver to use
Placeholders ๐
titleโ Window's title (may be absent) โ Type: Text โ Unit:-marksโ Window's marks (present only with sway/i3) โ Type: Text โ Unit:-visible_marksโ Window's marks that do not start with_(present only with sway/i3) โ Type: Text โ Unit:-
Example
[[block]]
block = "focused_window"
[block.format]
full = " $title.str(max_w:15) |"
short = " $title.str(max_w:10) |"
And this next example โ instead of hiding the block when the window's title is empty, it displays Missing:
[[block]]
block = "focused_window"
format = " $title.str(0,21) | Missing "
github
The number of GitHub notifications ๐๐
This block shows the unread notification count for a GitHub account. You need a GitHub personal access token with the notifications scope, and you gotta pass it in using the I3RS_GITHUB_TOKEN environment variable or the token configuration option. Optionally, the colour of the block is determined by the highest notification in these lists, from highest to lowest: critical, warning, info, good. So like, the drama level of your notifs decides the vibe. ๐
Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $total.eng(w:1) "intervalโ Update interval in seconds. Default:30tokenโ A GitHub personal access token with thenotificationsscope. Default:Nonehide_if_total_is_zeroโ Hide this block if the total count of notifications is zero. Default:falsecriticalโ List of notification types that change the block to the critical colour. Default:Nonewarningโ List of notification types that change the block to the warning colour. Default:Noneinfoโ List of notification types that change the block to the info colour. Default:Nonegoodโ List of notification types that change the block to the good colour. Default:None
All the placeholders are numbers without a unit. ๐งฎ
iconโ A static icontotalโ The total number of notificationsassignโ You were assigned to the issueauthorโ You created the threadcommentโ You commented on the threadci_activityโ A GitHub Actions workflow run that you triggered was completedinvitationโ You accepted an invitation to contribute to the repositorymanualโ You subscribed to the thread (via an issue or pull request)mentionโ You were specifically @mentioned in the contentreview_requestedโ You, or a team you're a member of, were requested to review a pull requestsecurity_alertโ GitHub discovered a security vulnerability in your repositorystate_changeโ You changed the thread state (for example, closing an issue or merging a pull request)subscribedโ You're watching the repositoryteam_mentionโ You were on a team that was mentioned
Examples
[[block]]
block = "github"
format = " $icon $total.eng(w:1)|$mention.eng(w:1) "
interval = 60
token = "..."
[[block]]
block = "github"
token = "..."
format = " $icon $total.eng(w:1) "
info = ["total"]
warning = ["mention","review_requested"]
hide_if_total_is_zero = true
Icons Used
github($icon)
hueshift
Manage display temperature ๐ก๏ธ๐
This block displays the current color temperature in Kelvin. When you scroll on the block, the color temperature changes. A left click on the block sets the color temperature to click_temp, which is 6500K by default. A right click completely resets the color temperature back to its default value (6500K). Scroll to vibe, click to commit, right-click to ~heal~. ๐
Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:" $temperature "stepโ The step color temperature is in/decreased in Kelvin. Default:100hue_shifterโ Program used to control screen color. Default: Detect automaticallymax_tempโ Max color temperature in Kelvin. Default:10000min_tempโ Min color temperature in Kelvin. Default:1000click_tempโ Left click color temperature in Kelvin. Default:6500
Placeholders โจ
temperatureโ Current temperature โ Type: Number โ Unit:-set_click_tempโ Leftresetโ Righttemperature_upโ Wheel Uptemperature_downโ Wheel Down
That's the whole mouse vibe, bestie โ those are the defaults, no cap. ๐
โจ Available Hue Shifters โจ
Okay so here's the shifter menu, and each one is picky about which display server it lives on:
"redshift"โ X11 only ๐ฅ๏ธ"sct"โ X11 only"xsct"โ X11 only"gammastep"โ X11 and Wayland, versatile queen ๐"wl_gammarelay"โ Wayland only ๐"wl_gammarelay_rs"โ Wayland only"wlsunset"โ Wayland only
Heads up: at the moment, onlywl_gammarelayandwl_gammarelay_rssubscribe to the events and actually update the bar when the temperature is modified externally. Also โ and this is lowkey the important bit โ these are the only drivers at the moment that work under Wayland without flickering. ๐ญ No flicker era fr fr.
๐ธ Example ๐ธ
[[block]]
block = "hueshift"
hue_shifter = "redshift"
step = 50
click_temp = 3500
There's a hard limit on max_temp set to 10000K, and the same deal for min_temp, which is 1000K. The step has a hard limit too, defined as 500K, specifically to avoid too brutal changes. Like, we're protecting you from yourself here. ๐ซถ
๐ฆ kdeconnect ๐ฆ
KDEConnect indicator โ it shows info from whichever device is currently connected in KDEConnect, and it updates asynchronously, so no waiting around. โจ
Block colours get updated based on the battery levelโฆ unless all bat_* thresholds are set to 0, in which case the block colours depend on the notification count instead. Choose your fighter. ๐
Configuration
device_idโ Device ID as per the output ofkdeconnect --list-devices. Default: chooses the first found device, if any. ๐formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $name{ $bat_icon $bat_charge|}{ $notif_icon|}"format_disconnectedโ Same asformatbut when the device is disconnected. Default:" $icon "format_missingโ Same asformatbut when the device does not exist. Default:" $icon x "bat_infoโ Min battery level below which state is set toinfo. Default:60bat_goodโ Min battery level below which state is set togood. Default:60bat_warningโ Min battery level below which state is set towarning. Default:30bat_criticalโ Min battery level below which state is set tocritical. Default:15
Placeholders, aka the fun part ๐ง:
iconโ Icon based on connection's status. Type: Icon, Unit:-bat_iconโ Battery level indicator (only when connected and if supported). Type: Icon, Unit:-bat_chargeโ Battery charge level (only when connected and if supported). Type: Number, Unit:%network_iconโ Cell Network indicator (only when connected and if supported). Type: Icon, Unit:-network_typeโ Cell Network type (only when connected and if supported). Type: Text, Unit:-network_strengthโ Cell Network level (only when connected and if supported). Type: Number, Unit:%notif_iconโ Only when connected and there are notifications. Type: Icon, Unit:-notif_countโ Number of notifications on your phone (only when connected and non-zero). Type: Number, Unit:-nameโ Name of your device as reported by KDEConnect (if available). Type: Text, Unit:-
Example
This one does not show the name, and does not set the "good" state:
[[block]]
block = "kdeconnect"
format = " $icon {$bat_icon $bat_charge |}{$notif_icon |}{$network_icon$network_strength $network_type |}"
bat_good = 101
Icons Used
bat($bat_icon, as a progression) ๐bat_charging($bat_icon, as a progression) โกnet_cellular($network_icon, as a progression) ๐ถnotification($notif_icon) ๐phone($icon, informat) ๐ฑphone_disconnected($icon, indisconnected_format missing_format) ๐
โจ๏ธ keyboard_layout โจ๏ธ
Keyboard layout indicator, and bestie there are six drivers available:
xkbeventโ which can read asynchronous updates from the x11 eventssetxkbmap(alias forxkbevent) โ DEPRECATED ๐xkbswitch(alias forxkbevent) โ DEPRECATED ๐localebusโ which can read asynchronous updates from the systemdorg.freedesktop.locale1D-Bus pathkbddbusโ which useskbddto monitor per-window layout changes via DBusswayโ which can read asynchronous updates from the sway IPC ๐
setxkbmapandxkbswitchare deprecated and will be removed inv0.35.0. Consider this your two-business-day notice. ๐ญ
Which of these methods is appropriate will depend on your system setup. iykyk.
Configuration
driverโ One of"xkbevent","setxkbmap","xkbswitch","localebus","kbddbus"or"sway", depending on your system. Default:"xkbevent"intervalโ Update interval, in seconds. Default:60DEPRECATEDโ Only used by the"setxkbmap"driver.formatโ A string to customise the output of this block. See below for available placeholders. Default:" $layout "sway_kb_identifierโ Identifier of the device you want to monitor, as found in the output ofswaymsg -t get_inputs. Default: defaults to first input foundmappingsโ Map layout (variant) to custom short name. Default:None
intervalis deprecated and will be removed inv0.35.0. โจ
Placeholders:
layoutโ Keyboard layout name. Type: Stringvariantโ Keyboard variant name or N/A if not applicable. Type: String
Examples
Listen to D-Bus for changes:
[[block]]
block = "keyboard_layout"
driver = "localebus"
Listen to kbdd for changes โ the text is in the following format: "English (US)" - {$layout ($variant)}. Use block.mappings to override with shorter names as shown below. Also use format = " $layout ($variant) " to see the full text to map, or you can use:
dbus-monitor interface=ru.gentoo.kbdd
โฆto see the exact variant spelling. ๐ต๏ธโโ๏ธ
[[block]]
block = "keyboard_layout"
driver = "kbddbus"
[block.mappings]
"English (US)" = "us"
"Bulgarian (new phonetic)" = "bg"
Listen to sway for changes:
[[block]]
block = "keyboard_layout"
driver = "sway"
sway_kb_identifier = "1133:49706:Gaming_Keyboard_G110"
Listen to sway for changes and override mappings:
[[block]]
block = "keyboard_layout"
driver = "sway"
format = " $layout "
[block.mappings]
"English (Workman)" = "EN"
"Russian (N/A)" = "RU"
Listen to xkb events for changes:
[[block]]
block = "keyboard_layout"
driver = "xkbevent"
๐ load ๐
System load average. The classic. The icon. โญ
Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $1m.eng(w:4) "intervalโ Update interval in seconds. Default:3infoโ Minimum load, where state is set toinfo. Default:0.3warningโ Minimum load, where state is set towarning. Default:0.6criticalโ Minimum load, where state is set tocritical. Default:0.9
Placeholders:
iconโ A static icon. Type: Icon, Unit:-1mโ 1 minute load average. Type: Number, Unit:-5mโ 5 minute load average. Type: Number, Unit:-15mโ 15 minute load average. Type: Number, Unit:-
Example
[[block]]
block = "load"
format = " $icon 1min avg: $1m.eng(w:4) "
interval = 1
Icons Used
cogs($icon) โ๏ธ
๐ maildir ๐
Unread mail. Only supports maildir format โ no mbox, no pigeonholes, no vibes beyond that, sorry bestie. ๐
Important! You need to enable the maildir feature to use this block:
cargo build --release --features maildir
Slay that build flag. ๐ฅ
โจ Configuration โจ
okay so weโre still in the maildir block, bestie โ hereโs the config tea:
formatโ a string that customises this blockโs output. Peep the placeholders below. Default:" $icon $status ".inboxesโ list of maildir inboxes to look for mails in. Supports path/glob expansions (e.g.~and*). Default:Required.threshold_warningโ number of unread mails where state is set to warning. Default:1.threshold_criticalโ number of unread mails where state is set to critical. Default:10.intervalโ update interval, in seconds. Default:5.display_typeโ which part of the maildir to count:"new","cur", or"all". Default:"new".
Placeholders? Say less:
iconโ a static icon. Type:Icon. Unit:-.statusโ number of emails. Type:Number. Unit:-.
โจ Examples โจ
[[block]]
block = "maildir"
interval = 60
inboxes = ["~/mail/local", "~/maildir/account1/*"]
threshold_warning = 1
threshold_critical = 10
display_type = "new"
โจ Icons Used โจ
mail($icon)
๐ง memory ๐ง
Memory and swap usage. literally the โam I about to run out of RAMโ block.
โจ Configuration โจ
formatโ a[MultiFormat][MaybeMultiFormatConfig]string to customise the output of this block when in โMemoryโ view. See below for available placeholders. Default:[" $icon $mem_used.eng(prefix:Mi)/$mem_total.eng(prefix:Mi)($mem_used_percents.eng(w:2)) "].intervalโ update interval in seconds. Default:5.warning_memโ percentage of memory usage, where state is set to warning. Default:80.0.warning_swapโ percentage of swap usage, where state is set to warning. Default:80.0.critical_memโ percentage of memory usage, where state is set to critical. Default:95.0.critical_swapโ percentage of swap usage, where state is set to critical. Default:95.0.
Placeholders, aka the memory lore:
iconโ memory icon. Type:Icon. Unit:-.icon_swapโ swap icon. Type:Icon. Unit:-.mem_totalโ total physical ram available. Type:Number. Unit:Bytes.mem_freeโ free memory not yet used by the kernel or userspace (in general you should usemem_avail). Type:Number. Unit:Bytes.mem_free_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.mem_availโ kernel estimate of usable free memory which includes cached memory and buffers. Type:Number. Unit:Bytes.mem_avail_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.mem_total_usedโmem_total - mem_free. Type:Number. Unit:Bytes.mem_total_used_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.mem_usedโ memory used, excluding cached memory and buffers; same as htopโs green bar. Type:Number. Unit:Bytes.mem_used_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.buffersโ buffers, similar to htopโs blue bar. Type:Number. Unit:Bytes.buffers_percentโ as above but as a percentage of total memory. Type:Number. Unit:Percents.cachedโ cached memory (taking into account ZFS ARC cache), similar to htopโs yellow bar. Type:Number. Unit:Bytes.cached_percentโ as above but as a percentage of total memory. Type:Number. Unit:Percents.swap_totalโ swap total. Type:Number. Unit:Bytes.swap_freeโ swap free. Type:Number. Unit:Bytes.swap_free_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.swap_usedโ swap used. Type:Number. Unit:Bytes.swap_used_percentsโ as above but as a percentage of total memory. Type:Number. Unit:Percents.zram_compressedโ compressed zram memory usage. Type:Number. Unit:Bytes.zram_decompressedโ decompressed zram memory usage. Type:Number. Unit:Bytes.`zram_comp_ratio'โ ratio of the decompressed/compressed zram memory. Type:Number. Unit:-.zswap_compressedโ compressed zswap memory usage (>=Linux 5.19). Type:Number. Unit:Bytes.zswap_decompressedโ decompressed zswap memory usage (>=Linux 5.19). Type:Number. Unit:Bytes.zswap_decompressed_percentsโ as above but as a percentage of total zswap memory (>=Linux 5.19). Type:Number. Unit:Percents.`zswap_comp_ratio'โ ratio of the decompressed/compressed zswap memory (>=Linux 5.19). Type:Number. Unit:-.
Actions, because clicking is a love language:
toggle_formatโ toggles betweenformatandformat_alt. Default button:-. DEPRECATED.next_formatโ switches to the next format in the list. Default button:Left.prev_formatโ switches to the previous format in the list. Default button:Right.
โจ Examples โจ
[[block]]
block = "memory"
format = " $icon $mem_used_percents.eng(w:1) "
format_alt = " $icon_swap $swap_free.eng(w:3,u:B,p:Mi)/$swap_total.eng(w:3,u:B,p:Mi)($swap_used_percents.eng(w:2)) "
interval = 30
warning_mem = 70
critical_mem = 90
Show swap and hide if it is zero:
[[block]]
block = "memory"
format = " $icon $swap_used.eng(range:1..) |"
โจ Icons Used โจ
memory_mem($icon)memory_swap($icon_swap)
๐ฝ๏ธ menu ๐ฝ๏ธ
A custom menu. This block lets you quickly run a custom shell command. Left-click on this block to activate it, then scroll through configured items. Left-click on the item to run it and optionally confirm your action by left-clicking again. Right-click any time to deactivate this block.
โจ Configuration โจ
textโ text that will be displayed when the block is inactive. Default:Required.itemsโ a list of โitemsโ. See examples below. Default:Required.
โจ Example โจ
[[block]]
block = "menu"
text = "\uf011"
[[block.items]]
display = " -> Sleep <-"
cmd = "systemctl suspend"
[[block.items]]
display = " -> Power Off <-"
cmd = "poweroff"
confirm_msg = "Are you sure you want to power off?"
[[block.items]]
display = " -> Reboot <-"
cmd = "reboot"
confirm_msg = "Are you sure you want to reboot?"
๐ต music ๐ต
The current song title and artist. also gives you buttons for play/pause, previous and next. iconic behavior.
Supports all music players that implement the MediaPlayer2 Interface. This includes:
- Spotify
- VLC
- mpd (via mpDris2)
and many others.
By default the block tracks all players available on the MPRIS bus. Right clicking on the block will cycle it to the next player. You can pin the widget to a given player via the โplayerโ setting. ๐
Configuration
okay so here's the whole config table for the music block, bestie โ every key, every value, every default, nothing skipped ๐
formatโ a [MultiFormat][MaybeMultiFormatConfig] string so you can customise the output of this block. See below for the available placeholders. Default:
[" $icon {$combo.str(max_w:25,rot_interval:0.5) $play |}"]
playerโ Name(s) of the music player(s) MPRIS interface. This can be either a single music player name or an array of music player names. Run
busctl --user list | grep "org.mpris.MediaPlayer2." | cut -d' ' -f1
and the name is the part after org.mpris.MediaPlayer2.. Default: None.
interface_name_excludeโ a list of regex patterns for player MPRIS interface names to ignore. Default:["playerctld"].separatorโ the string inserted between artist and title. Default:" - ".seek_step_secsโ a positive number of seconds to seek forward/backward when scrolling on the bar. Does not need to be an integer. Default:1.seek_forward_step_secsโ a positive number of seconds to seek forward when scrolling on the bar. Does not need to be an integer. Default:seek_step_secs.seek_backward_step_secsโ a positive number of seconds to seek backward when scrolling on the bar. Does not need to be an integer. Default:seek_step_secs.volume_stepโ the percent volume level is increased/decreased for the selected audio device when scrolling. Capped automatically at50. Default:5.
Note: all placeholders except icon can be absent. Peep the examples below to learn how to handle that, fr fr ๐
Placeholders โจ
iconโ a static icon. Type: Icon.artistโ current artist. Type: Text.titleโ current title. Type: Text.urlโ current song url. Type: Text.comboโ resolves to"$title[sep]$artist","$artist","$title", or"$url"depending on what information is available.[sep]is set by theseparatoroption. Type: Text.combo_reversedโ resolves to"$artist[sep]$title","$artist","$title", or"$url"depending on what information is available.[sep]is set by theseparatoroption. Type: Text.playerโ name of the current player (taken from the last part of its MPRIS bus name). Type: Text.availโ total number of players available to switch between. Type: Number.curโ the current player index of the available players. Type: Number.playโ Play/Pause button. Type: Clickable icon.nextโ Next button. Type: Clickable icon.prevโ Previous button. Type: Clickable icon.volume_iconโ icon based on volume. Missing if unsupported. Type: Icon.volumeโ current volume. Missing if muted or unsupported. Type: Number.
Widgets ๐
play_pause_btnโ$playnext_btnโ$nextprev_btnโ$prev
Actions ๐
play_pauseโ Left onplay_pause_btnnextโ Left onnext_btnprevโ Left onprev_btnnext_playerโ Rightseek_forwardโ Wheel Upseek_backwardโ Wheel Downvolume_upโ-volume_downโ-toggle_formatDEPRECATED โ-next_formatโ Leftprev_formatโ-
Examples ๐ฆ
Show the currently playing song on Spotify only, with play & next buttons, and limit the width to 20 characters:
[[block]]
block = "music"
format = " $icon {$combo.str(max_w:20) $play $next |}"
player = "spotify"
Same thing for any compatible player โ takes the first active one on the bus, but ignores mpd or anything with kdeconnect in the name:
[[block]]
block = "music"
format = " $icon {$combo.str(max_w:20) $play $next |}"
interface_name_exclude = [".*kdeconnect.*", "mpd"]
Same as above, but the text rotates (iconic behaviour, honestly):
[[block]]
block = "music"
format = " $icon {$combo.str(max_w:20,rot_interval:0.5) $play $next |}"
interface_name_exclude = [".*kdeconnect.*", "mpd"]
Click anywhere to play/pause, middle click to toggle format:
[[block]]
block = "music"
format = " format 1 "
format_alt = " format 2 "
[[block.click]]
button = "left"
action = "play_pause"
[[block.click]]
button = "middle"
widget = "."
action = "next_format"
Scroll to change the player volume, use the forward and back buttons to seek:
[[block]]
block = "music"
format = " $icon $volume_icon $combo $play $next| "
seek_step_secs = 10
[[block.click]]
button = "up"
action = "volume_up"
[[block.click]]
button = "down"
action = "volume_down"
[[block.click]]
button = "forward"
action = "seek_forward"
[[block.click]]
button = "back"
action = "seek_backward"
Icons Used ๐ธ
music($icon)music_next($next)music_pause($play)music_play($play)music_prev($prev)volume($volume_icon, as a progression)
net ๐
Network information, bestie.
This block uses sysfs and netlink and thus does not require any external dependencies. Zero. None. We love a low-maintenance queen ๐
Configuration
deviceโ network interface to monitor (as specified in/sys/class/net/). Supports regex. Default: if not set, device will be automatically selected every interval.intervalโ update interval in seconds. Default:2.formatโ a [MultiFormat][MaybeMultiFormatConfig] string to customise the output of this block. See below for available placeholders. Default:
[" $icon ^icon_net_down $speed_down.eng(prefix:K) ^icon_net_up $speed_up.eng(prefix:K) "]
inactive_formatโ same asformatbut for when the interface is inactive. Default:" $icon Down ".missing_formatโ same asformatbut for when the device is missing. Default:" ร ".
Actions โจ
toggle_formatDEPRECATED โ toggles betweenformatandformat_alt. Default button:-.next_formatโ switches to the next format in the list. Default button: Left.prev_formatโ switches to the previous format in the list. Default button: Right.iconโ Icon based on the device's type โจ (type: Icon, unit: none)speed_downโ Download speed ๐ก (type: Number, unit: bytes per second)speed_upโ Upload speed ๐ก (type: Number, unit: bytes per second)graph_downโ Download speed graph ๐ (type: Text, unit: none)graph_upโ Upload speed graph ๐ (type: Text, unit: none)deviceโ The name of device (type: Text, unit: none)ssidโ Network SSID (WiFi only) (type: Text, unit: none)frequencyโ WiFi frequency (type: Number, unit: Hz)signal_strengthโ WiFi signal (type: Number, unit: %)bitrateโ WiFi connection bitrate (type: Number, unit: bits per second)ipโ IPv4 address of the iface (type: Text, unit: none)ipv6โ IPv6 address of the iface (type: Text, unit: none)nameserverโ Nameserver (type: Text, unit: none)enabledโ Present if the device is switched on (not turned off withrfkillorip link set down) (type: Flag, unit: none)
๐ธ Example
Display WiFi info if available ๐
[[block]]
block = "net"
format = " $icon {$signal_strength $ssid $frequency|Wired connection} via $device "
Display exact device โ like, only that one, no cap:
[[block]]
block = "net"
device = "^wlo0$"
Tell a WiFi device that is not connected from one that is switched off (with rfkill for example) ๐ซถ:
[[block]]
block = "net"
device = "^wlan0$"
format = " $icon $signal_strength "
inactive_format = " {$enabled{not connected}|switched off} "
๐ Icons Used
net_loopback($icon)net_vpn($icon)net_wired($icon)net_wireless($icon, as a progression)net_up(^icon_net_up)net_down(^icon_net_down)
๐ notify
Display and toggle the state of notifications daemon. Literally the notification babysitter bestie ๐
Left-clicking on this block will enable/disable notifications.
Configuration
driverโ Which notifications daemon is running. Available drivers are:"dunst"and"swaync". Default:"dunst"formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon "
Placeholders, bestie โจ:
iconโ Icon based on notification's state (type: Icon, unit: none)notification_count[1]โ The number of notification (omitted if0) (type: Number, unit: none)history_count[2]โ The number of notification in history (omitted if0) (type: Number, unit: none)pausedโ Present only if notifications are disabled (type: Flag, unit: none)
Actions and their default buttons ๐:
toggle_pausedโ Default button: Leftshowโ Default button:-show_allโ Default button:-
Theshowandshow_allactions are the same for SwayNC. ๐
Examples
How to use paused flag:
[[block]]
block = "notify"
format = " $icon {$paused{Off}|On} "
How to use notification_count:
[[block]]
block = "notify"
format = " $icon {($notification_count.eng(w:1)) |}"
How to remap actions ๐ฅ:
[[block]]
block = "notify"
driver = "swaync"
[[block.click]]
button = "left"
action = "show"
[[block.click]]
button = "right"
action = "toggle_paused"
๐ฆ Icons Used
bell($icon)bell-slash($icon)
๐ฌ notmuch
Count of notmuch messages. It's giving โจinbox anxietyโจ but make it cute.
This block queries a notmuch database and displays the count of messages.
The simplest configuration will return the total count of messages in the notmuch database stored at $HOME/.mail
Heads up! You need to enable the notmuch feature to use this block ๐ซถ: cargo build --release --features notmuch
Configuration
formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $count "maildirโ Path to the directory containing the notmuch database. Supports path expansions e.g.~. Default:~/.mailqueryโ Query to run on the database. Default:""threshold_criticalโ Mail count that triggers critical state. Default:99999threshold_warningโ Mail count that triggers warning state. Default:99999threshold_goodโ Mail count that triggers good state. Default:99999threshold_infoโ Mail count that triggers info state. Default:99999intervalโ Update interval in seconds. Default:10
Placeholders ๐:
iconโ A static icon (type: Icon, unit: none)countโ Number of messages for the query (type: Number, unit: none)
Example
[[block]]
block = "notmuch"
query = "tag:alert and not tag:trash"
threshold_warning = 1
threshold_critical = 10
[[block.click]]
button = "left"
update = true
๐ Icons Used
mail($icon)
๐ฎ nvidia_gpu
Display the stats of your NVidia GPU. Frames go brrr โจ๐ฅ
By default show_temperature shows the used memory. Clicking the left mouse on the โtemperatureโ part of the block will alternate it between showing used or total available memory.
Clicking the left mouse button on the โfan speedโ part of the block will cause it to enter into a fan speed setting mode. In this mode you can scroll the mouse wheel over the block to change the fan speeds, and left click to exit the mode.
Requiresnvidia-smifor displaying info andnvidia_settingsfor setting fan speed. ๐
On laptops with switchable graphics,nvidia-smipowers on the dedicated GPU every time it runs, which keeps the GPU awake and raises power consumption. Increaseintervalor avoid this block if that matters on battery. ๐ญ (fr fr, battery bestie, watch out)
Configuration
gpu_idโ GPU id in system. Default:0formatโ A string to customise the output of this block. See below for available placeholders. Default:" $icon $utilization $memory $temperature "intervalโ Update interval in seconds. Default:1idleโ Maximum temperature, below which state is set toidle. Default:50goodโ Maximum temperature, below which state is set togood. Default:70infoโ Maximum temperature, below which state is set toinfo. Default:75warningโ Maximum temperature, below which state is set towarning. Default:80
Placeholders ๐:
iconโ Icon, unit: nonenameโ Text, unit: noneutilizationโ Number, percentsmemoryโ Number, bytestemperatureโ Number, degreesfan_speedโ Number, percentsclocksโ Number, hertzpowerโ Number, watts
Widgets โ placeholders ๐:
mem_btnโ$memoryfan_btnโ$fan_speed
Actions and their default buttons ๐ :
toggle_mem_totalโ Left onmem_btntoggle_fan_controlledโ Left onfan_btnfan_speed_upโ Wheel Up onfan_btnfan_speed_downโ Wheel Down onfan_btn
Example
[[block]]
block = "nvidia_gpu"
interval = 1
format = " $icon GT 1030 $utilization $temperature $clocks "
๐ Icons Used
gpu($icon)
TODO
- Provide a mappings option similar to
keyboard_layout's to map GPU names to labels? ๐ค
๐ฆ packages
Pending updates for different package manager like apt, pacman, etc. The "you have 47 updates bestie" block ๐ญ๐ฆ
Currently, these package managers are supported:
apkfor Alpine Linuxaptfor Debian/Ubuntu-based systemsaurfor Arch-based systemsbrewfor the Homebrew Package Managerdnffor Fedora-based systemsflatpakfor Flatpak packagespacmanfor Arch-based systemssnapfor Snap packagesxbpsfor Void Linuxzypperfor openSUSE
Configuration
Okay bestie, here's the config tea โ โ every key, its vibe, and what it defaults to when you don't say anything:
intervalโ Update interval, in seconds. Default:600.package_managerโ Which package manager(s) to check for updates. Default: automatically derived from your format templates, but you can use it to influence the$totalvalue.formatโ A string to customise the output of this block. Peep the placeholders below for what you can drop in. Default:" $icon $total.eng(w:1) ".format_singularโ Same asformat, but for when exactly one update is available. Default:" $icon $total.eng(w:1) ".format_up_to_dateโ Same asformat, but for when no updates are available. Default:" $icon $total.eng(w:1) ".warning_updates_regexโ Display the block as a warning if updates matching this regex are available. Default:None.critical_updates_regexโ Display the block as critical if updates matching this regex are available. Default:None.ignore_updates_regexโ Doesn't include updates matching this regex in the count. Default:None.ignore_phased_updatesโ Doesn't include potentially held-back phased updates in the count (for Debian/Ubuntu-based systems). Default:false.aur_commandโ The AUR command used to check available updates, which outputs in the same format as pacman, e.g.yay -Qua(for Arch-based systems). Required if$auris used.
Placeholders ๐
These are the little cuties you can slot into your format strings:
iconโ A static icon. Type: Icon. Unit:-.apkโ Number of updates available in Alpine Linux. Type: Number. Unit:-.aptโ Number of updates available in Debian/Ubuntu-based systems. Type: Number. Unit:-.aurโ Number of updates available in Arch-based systems. Type: Number. Unit:-.brewโ Number of updates available in the Homebrew Package Manager. Type: Number. Unit:-.dnfโ Number of updates available in Fedora-based systems. Type: Number. Unit:-.flatpakโ Number of updates available in Flatpak packages. Type: Number. Unit:-.pacmanโ Number of updates available in Arch-based systems. Type: Number. Unit:-.snapโ Number of updates available in Snap packages. Type: Number. Unit:-.xbpsโ Number of updates available in Void Linux. Type: Number. Unit:-.zypperโ Number of updates available in openSUSE. Type: Number. Unit:-.totalโ Number of updates available in all package managers listed. Type: Number. Unit:-.
Apt ๐ง
Behind the scenes this literally just uses apt, and so it can run without root privileges, i3status-rust will create its own little package database in /tmp/i3rs-apt/ โ which may take up several MB or more, ngl. If you've got a custom apt config then this block may not work as expected โ in that case, please open an issue, bestie ๐
Tip: You can grab the list of available updates using
APT_CONFIG=/tmp/i3rs-apt/apt.conf apt list --upgradable
Pacman ๐
Requires fakeroot to be installed (only required for pacman, iykyk).
Tip: You can grab the list of available updates using
fakeroot pacman -Qu --dbpath /tmp/checkup-db-i3statusrs-$USER/
If you have the CHECKUPDATES_DB env var set on your system then substitute that dir instead.
Note: pikaur may hang the whole block if there is no internet connectivity reference. In that case, try a different AUR helper. ๐
Pacman hook ๐
Tip: On Arch Linux you can set up a pacman hook to signal i3status-rs to update after packages have been upgraded, so you won't have stale info sitting in your pacman block. Iconic behaviour, honestly.
In the block configuration, set signal = 1 (or another number if 1 is being used by some other block):
[[block]]
block = "packages"
signal = 1
Create /etc/pacman.d/hooks/i3status-rust.hook with the below contents:
[Trigger]
Operation = Upgrade
Type = Package
Target = *
[Action]
When = PostTransaction
Exec = /usr/bin/pkill -SIGRTMIN+1 i3status-rs
Example โจ
Apk-only config:
[[block]]
block = "packages"
package_manager = ["apk"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $apk.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with available updates. Any dmenu alternative should also work.
button = "left"
cmd = "apk --no-cache --upgradable list | dmenu -l 10"
Apt-only config
[[block]]
block = "packages"
interval = 1800
error_interval = 300
max_retries = 5
package_manager = ["apt"]
format = " $icon $apt updates available"
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with cached available updates. Any dmenu alternative should also work.
button = "left"
cmd = "APT_CONFIG=/tmp/i3rs-apt/apt.conf apt list --upgradable | tail -n +2 | rofi -dmenu"
[[block.click]]
# Updates the block on right click
button = "right"
update = true
Brew-only config:
[[block]]
block = "packages"
package_manager = ["brew"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $brew.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with available updates. Any dmenu alternative should also work.
button = "left"
cmd = "brew outdated | dmenu -l 10"
Dnf-only config:
[[block]]
block = "packages"
package_manager = ["dnf"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $dnf.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with cached available updates. Any dmenu alternative should also work.
button = "left"
cmd = "dnf list -q --upgrades | tail -n +2 | rofi -dmenu"
Flatpak-only config:
[[block]]
block = "packages"
package_manager = ["flatpak"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $flatpak.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with cached available updates. Any dmenu alternative should also work.
button = "left"
cmd = "flatpak remote-ls --updates --columns=ref | rofi -dmenu"
Pacman-only config:
[[block]]
block = "packages"
package_manager = ["pacman"]
interval = 600
error_interval = 300
max_retries = 5
format = " $icon $pacman updates available "
format_singular = " $icon $pacman update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# pop-up a menu showing the available updates. Replace wofi with your favourite menu command.
button = "left"
cmd = "fakeroot pacman -Qu --dbpath /tmp/checkup-db-i3statusrs-$USER/ | wofi --show dmenu"
[[block.click]]
# Updates the block on right click
button = "right"
update = true
Pacman and AUR helper config:
[[block]]
block = "packages"
package_manager = ["pacman", "aur"]
interval = 600
error_interval = 300
max_retries = 5
format = " $icon $pacman + $aur = $total updates available "
format_singular = " $icon $total update available "
format_up_to_date = " $icon system up to date "
# aur_command should output available updates to stdout (ie behave as echo -ne "update\n")
aur_command = "yay -Qua"
Snap-only config:
[[block]]
block = "packages"
package_manager = ["snap"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $snap.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with available updates. Any dmenu alternative should also work.
button = "left"
cmd = "snap refresh --list | dmenu -l 10"
Xbps-only config:
[[block]]
block = "packages"
package_manager = ["xbps"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $xbps.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with available updates. Any dmenu alternative should also work.
button = "left"
cmd = "xbps-install -Mun | dmenu -l 10"
Zypper-only config:
[[block]]
block = "packages"
package_manager = ["zypper"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $zypper.eng(w:1) updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
[[block.click]]
# shows dmenu with available updates. Any dmenu alternative should also work.
button = "left"
cmd = "zypper -q list-updates | tail -n +3 | rofi -dmenu -window-title 'Upgradable packages:'"
Bestie. Multiple package managers config?? Yes queen, you can stack them. โจ
Update the list of pending updates every thirty minutes (1800 seconds):
[[block]]
block = "packages"
package_manager = ["apk", "apt", "aur", "brew", "dnf", "flatpak", "pacman", "snap", "xbps", "zypper"]
interval = 1800
error_interval = 300
max_retries = 5
format = " $icon $apk + $apt + $aur + $brew + $dnf + $flatpak + $pacman + $snap + $xbps + $zypper = $total updates available "
format_singular = " $icon One update available "
format_up_to_date = " $icon system up to date "
# If a linux update is available, but no ZFS package, it won't be possible to
# actually perform a system upgrade, so we show a warning.
warning_updates_regex = "(linux|linux-lts|linux-zen)"
# If ZFS is available, we know that we can and should do an upgrade, so we show
# the status as critical.
critical_updates_regex = "(zfs|zfs-lts)"
๐ Icons Used ๐
- update (
$icon)
๐ pomodoro ๐
A pomodoro timer โ literally the focus technique that ate, ngl. Get your life together in 25 minute chunks, it's giving productivity queen ๐
๐ธ Technique ๐ธ
There are six steps in the original technique: 1) Decide on the task to be done. 2) Set the pomodoro timer (traditionally to 25 minutes). 3) Work on the task. 4) End work when the timer rings and put a checkmark on a piece of paper. 5) If you have fewer than four checkmarks, take a short break (3โ5 minutes) and then return to step 2. 6) After four pomodoros, take a longer break (15โ30 minutes), reset your checkmark count to zero, then go to step 1.
Yes the paper checkmark is mandatory bestie, the whole vibe depends on it. ๐ญ
๐ Configuration ๐
formatโ the format used when in idle, prompt, or notify states. Default:" $icon{ $message|} "pomodoro_formatโ the format used when the pomodoro is running or paused. Default:" $icon $status_icon{ $completed_pomodoros.tally()|} $time_remaining.duration(hms:true) "break_formatโ the format used when the pomodoro is during the break. Default:" $icon $status_icon Break: $time_remaining.duration(hms:true) "messageโ message when timer expires. Default:"Pomodoro over! Take a break!"break_messageโ message when break is over. Default:"Break over! Time to work!"notify_cmdโ a shell command to run as a notifier.{msg}will be substituted with eithermessageorbreak_message. Default:Noneblocking_cmdโ isnotify_cmdblocking? If it is, then pomodoro block will wait until the command finishes before proceeding. Otherwise, you will have to click on the block in order to proceed. Default:false
Lowkey important: if blocking_cmd is false you're on click duty, bestie. No free rides ๐
๐ฆ Placeholders ๐ฆ
iconโ a static icon. Type:Icon. Supported by: all formats.status_iconโ an icon that reflects the pomodoro state. Type:Icon. Supported by:pomodoro_format,break_format.messageโ current message. Type:Text. Supported by:format.time_remainingโ how much time is left (minutes). Type:Duration. Supported by:pomodoro_format,break_format.completed_pomodorosโ the number of completed pomodoros. Type:Number. Supported by:pomodoro_format.
โญ Example โญ
Use swaynag as a notifier:
[[block]]
block = "pomodoro"
notify_cmd = "swaynag -m '{msg}'"
blocking_cmd = true
Use notify-send as a notifier:
[[block]]
block = "pomodoro"
notify_cmd = "notify-send '{msg}'"
blocking_cmd = false
๐ Icons Used ๐
- pomodoro (
$icon) - pomodoro_started (
$status_icon, inpomodoro_format) - pomodoro_stopped (
$status_icon, informat) - pomodoro_paused (
$status_icon, inpomodoro_format) - pomodoro_break (
$status_icon, inbreak_format)
๐ privacy ๐
Privacy Monitor โ it's literally watching who's watching you. Main character surveillance energy ๐ต๏ธโโ๏ธ
๐ซถ Configuration ๐ซถ
driverโ the configuration of a driver (see below). Default: Requiredformatโ[MultiFormat][MaybeMultiFormatConfig]string. Default:["{ $icon_audio |}{ $icon_audio_sink |}{ $icon_video |}{ $icon_webcam |}{ $icon_unknown |}", "{ $icon_audio $info_audio |}{ $icon_audio_sink $info_audio_sink |}{ $icon_video $info_video |}{ $icon_webcam $info_webcam |}{ $icon_unknown $info_unknown |}"]
๐ง pipewire Options ๐ง (requires the pipewire feature to be enabled)
nameโ value:pipewire. Required: Yes. Default:Noneexclude_outputโ an output node to ignore, example:["HD Pro Webcam C920"]. Required: No. Default:[]exclude_inputโ an input node to ignore, example:["openrgb"]. Required: No. Default:[]displayโ which node field should be used as a display name, options:name,description,nickname. Required: No. Default:name
๐ vl4 Options ๐
nameโ value:vl4. Required: Yes. Default:Noneexclude_deviceโ a device to ignore, example:["/dev/video5"]. Required: No. Default:[]exclude_consumerโ processes to ignore. Required: No. Default:["pipewire", "wireplumber"]
๐ธ Available Format Keys ๐ธ
icon_{audio,audio_sink,video,webcam,unknown}โ a static icon. Type:Icon. Unit:-info_{audio,audio_sink,video,webcam,unknown}โ the mapping of which source are being consumed. Type:Text. Unit:-
You can use the suffixes noted above to get the following:
audioโ captured audio (ex. Mic)audio_sinkโ audio captured from a sink (ex. openrgb)videoโ video capture (ex. screen capture)webcamโ webcam captureunknownโ anything else
๐ฅ Available Actions ๐ฅ
toggle_formatโ toggles betweenformatandformat_alt. Default button:-. DEPRECATEDnext_formatโ switches to the next format in the list. Default button: Leftprev_formatโ switches to the previous format in the list. Default button: Right
Heads up bestie: toggle_format is flagged DEPRECATED in the original docs. Use the next/prev ones, iykyk ๐
๐ Example ๐
[[block]]
block = "privacy"
[[block.driver]]
name = "v4l"
[[block.driver]]
name = "pipewire"
exclude_input = ["openrgb"]
display = "nickname"
๐ Icons Used ๐
- microphone (
$icon_audio) - volume (
$icon_audio_sink) - xrandr (
$icon_video) - webcam (
$icon_webcam)- unknown (
$icon_unknown)
- unknown (
rofication ๐
The number of pending notifications chilling in rofication-daemon
Lowkey a different color pops up if there are critical notifications, so you can spot the drama at a glance ๐ฅ
Configuration
intervalโ Refresh rate in seconds. Default:1formatโ A string to customise the output of this block. See below for placeholders. Default:" $icon $num.eng(w:1) "socket_pathโ Socket path for the rofication daemon. Supports path expansions e.g.~. Default:"/tmp/rofi_notification_daemon"
Placeholders bestie:
iconโ A static icon. Type: Icon, Unit:-numโ Number of pending notifications. Type: Number, Unit:-
Example
[[block]]
block = "rofication"
interval = 1
socket_path = "/tmp/rofi_notification_daemon"
[[block.click]]
button = "left"
cmd = "rofication-gui"
Icons Used
- bell (
$icon)
scratchpad ๐ฆ
Scratchpad indicator โ it literally just tells you what's up with your scratchpad ๐
Configuration
formatโ A string to customise the output of this block. Default:$icon $count.eng(range:1..) \|
Placeholders:
iconโ A static icon. Type: Icon, Unit:-countโ Number of windows in scratchpad. Type: Number, Unit:-
Example
[[block]]
block = "scratchpad"
Icons Used
- scratchpad (
$icon)
service_status โญ
Display the status of a service โ iconic for keeping an eye on your daemons ngl ๐ซถ
Right now only systemd is supported. Periodt.
Configuration
driverโ Which init system is running the service. Available drivers are:"systemd". Default:"systemd"serviceโ The name of the service. Default: Requireduserโ Iftrue, monitor the status of a user service instead of a system service. Default:falseactive_formatโ A string to customise the output of this block. See below for available placeholders. Default:" $service active "inactive_formatโ A string to customise the output of this block. See below for available placeholders. Default:" $service inactive "active_stateโ A valid[State]. Default:[State::Idle]inactive_stateโ A valid[State]. Default:[State::Critical]
Placeholders:
serviceโ The name of the service. Type: Text, Unit:-
Example
Example using an icon, so cute:
[[block]]
block = "service_status"
service = "cups"
active_format = " ^icon_tea "
inactive_format = " no ^icon_tea "
Example overriding the default inactive_state, for when you're feeling dramatic:
[[block]]
block = "service_status"
service = "shadow"
active_format = ""
inactive_format = " Integrity of password and group files failed "
inactive_state = "Warning"
sound ๐
Volume level โ the moment we've all been waiting for ๐
This block displays the volume level (according to PulseAudio or ALSA). Right click to toggle mute, scroll to adjust volume. Slay.
Requires a PulseAudio installation or alsa-utils for ALSA. No cap.
Note that if you are using PulseAudio commands (such aspactl) to control your volume, you should select the"pulseaudio"(or"auto") driver to see volume changes that exceed 100%. Important bestie, don't skip this ๐
Configuration
driverโ"auto",pipewire,"pulseaudio","alsa". Default:"auto"(Pipewire with Pulseaudio fallback with ALSA fallback)formatโ A[MultiFormat][MaybeMultiFormatConfig]string to customise the output of this block. See below for available placeholders. Default:[" $icon {$volume.eng(w:2) |}"]nameโ PulseAudio device name, or the ALSA control name as found in the output ofamixer -D yourdevice scontrols. Default: PulseAudio:@DEFAULT_SINK@/ ALSA:Masterdeviceโ ALSA device name, usually in the form โhw:Xโ or โhw:X,Yโ where X is the card number and Y is the device number as found in the output ofaplay -l. Default:defaultdevice_kindโ PulseAudio device kind:sourceorsink. Default:"sink"natural_mappingโ When using the ALSA driver, display the โmapped volumeโ as given byalsamixer/amixer -M, which represents the volume level more naturally with respect for the human ear. Default:falsestep_widthโ The percent volume level is increased/decreased for the selected audio device when scrolling. Capped automatically at 50. Default:5max_volโ Max volume in percent that can be set via scrolling. Note it can still be set above this value if changed by another application. Default:Noneshow_volume_when_mutedโ Show the volume even if it is currently muted. Default:falseheadphones_indicatorโ Change icon when headphones are plugged in (pulseaudio only). Default:falsemappingsโ Mapoutput_nameto a custom name. Default:Nonemappings_use_regexโ Let mappings match using regex instead of string equality. The replacement will be regex aware and can contain capture groups. Default:trueactive_port_mappingsโ Mapactive_portto a custom name. The replacement will be regex aware and can contain capture groups. Default:None
Placeholders:
iconโ Icon based on volume. Type: Icon, Unit:-volumeโ Current volume. Missing if muted. Type: Number, Unit:%output_nameโ PulseAudio or ALSA device name. Type: Text, Unit:-output_descriptionโ PulseAudio device description, will fallback tooutput_nameif no description is available and will be overwritten by mappings (mappings will still useoutput_name). Type: Text, Unit:-active_portโ Active port (same as information in Ports section ofpactl list cards). Will be absent if not supported by driver or if mapped to""inactive_port_mappings. Type: Text, Unit:-
Actions, aka the fun clicky stuff ๐ฑ๏ธ:
toggle_muteโ Toggle mute. Default button: Rightvolume_downโ Decrease volume. Default button: Wheel Downvolume_upโ Increase volume. Default button: Wheel Uptoggle_formatโ Toggles betweenformatandformat_alt. DEPRECATED โ ๏ธnext_formatโ Switches to the next format in the list. Default button: Leftprev_formatโ Switches to the previous format in the list. Default button:-
Examples
Change the default scrolling step width to 3 percent:
[[block]]
block = "sound"
step_width = 3
Change the output name shown โ lowkey so useful:
[[block]]
block = "sound"
format = " $icon $output_name{ $volume|} "
[block.mappings]
"alsa_output.usb-Harman_Multimedia_JBL_Pebbles_1.0.0-00.analog-stereo" = "Speakers"
"alsa_output.pci-0000_00_1b.0.analog-stereo" = "Headset"
Since the default value for the device_kind key is sink, to display microphone block you have to use the source value. Iykyk ๐ค:
[[block]]
block = "sound"
driver = "pulseaudio"
device_kind = "source"
Display warning in block if microphone if using the wrong port:
[[block]]
block = "sound"
driver = "pulseaudio"
device_kind = "source"
format = " $icon { $volume|} {$active_port |}"
[block.active_port_mappings]
"analog-input-rear-mic" = "" # Mapping to an empty string makes `$active_port` absent
"analog-input-front-mic" = "ERR!"
๐ Icons Used
microphone_muted($icon, as a progression)microphone($icon, as a progression)volume_muted($icon, as a progression)volume($icon, as a progression)headphones($icon)
๐ฆ speedtest
Ping, jitter, download, and upload speeds ๐ซ
This block uses Cloudflare's networkquality-rs (nq) library to run a speedtest and report the ping, jitter, download speed, and upload speed. Honestly iconic of it.
You can configure the block to use custom endpoints for the speedtest, but bestie, by default Cloudflare's nq endpoints are the ones being used.
So like, for example โ setting config_url to "https://mensura.cdn-apple.com/.well-known/nq" will use Apple's nq endpoints instead of Cloudflare's. Slay.
nq is based on the IETF draft: "Responsiveness under Working Conditions".
That draft defines "responsiveness", measured in Round trips Per Minute (RPM), as a useful measurement of network quality. Periodt.
๐ Configuration
formatโ a string to customise the output of this block. See below for available placeholders. Default:" ^icon_ping $ping.eng(prefix:m) ^icon_net_down $speed_down ^icon_net_up $speed_up "intervalโ update interval in seconds. Default:1800config_urlโ the endpoint to get the responsiveness config from. See[SpeedtestConfig::config_url]for the expected format of the configuration JSON returned by this endpoint. Default:Nonelarge_download_urlโ the large file endpoint which should be multiple GBs. Default:"https://h3.speed.cloudflare.com/__down?bytes=10000000000"small_download_urlโ the small file endpoint which should be very small, only a few bytes. Default:"https://h3.speed.cloudflare.com/__down?bytes=10"upload_urlโ the upload url which accepts an arbitrary amount of data. Default:"https://h3.speed.cloudflare.com/__up"latencyโ arguments for the latency test. See table below. Default: see table belowrpmโ arguments for the RPM test. See table below. Default: see table below
๐ธ Latency Configuration (settings used for ping and jitter)
runsโ the number of latency test runs to perform. Default:20
โญ RPM Configuration (settings used for speed_down and speed_up)
moving_average_distanceโ the number of intervals to use when calculating the moving average. Default:4std_toleranceโ how far a measurement is allowed to be from the previous moving average before the measurement is considered unstable. Default:0.05trimmed_mean_percentโ determines which percentile to use for averaging when calculating the trimmed mean of throughputs or RPM scores. A value of0.95means to only use values in the 95th percentile to calculate an average. Default:0.95max_loaded_connectionsโ the maximum number of loaded connections that the test can use to saturate the network. Default:16interval_duration_msโ the duration between test intervals in milliseconds (ms). Default:500(0.5 seconds)test_duration_msโ the overall test duration in milliseconds (ms). Default:12_000(12 seconds)conn_typeโ the type of connection to use for the speed test. One of"h1","h2", or"h3". Default:"h2"upload_bytes_per_requestโ the number of bytes to upload per request during the speed test. Default:100_000_000
๐ง Available Format Keys
pingโ ping delay โ type: Number โ unit: Secondsjitterโ jitter โ type: Number โ unit: Secondsspeed_downโ download speed โ type: Number โ unit: Bits per secondspeed_upโ upload speed โ type: Number โ unit: Bits per second
โจ Examples
Show only ping (with an icon):
[[block]]
block = "speedtest"
format = " ^icon_ping $ping "
Hide ping and display speed in bytes per second each using 4 characters (without icons):
[[block]]
block = "speedtest"
format = " $speed_down.eng(w:4,u:B) $speed_up(w:4,u:B) "
Advanced configuration:
[[block]]
block = "speedtest"
[block.latency]
runs = 5
[block.rpm]
conn_type = "h1"
๐ Icons Used
ping(^icon_ping)net_down(^icon_net_down)net_up(^icon_net_up)
๐ฅ taskwarrior
The number of tasks from the taskwarrior list. Very "get your life together" of it ๐
Clicking the right mouse button on the icon cycles the view of the block through the user's filters. Cute, right?
๐ Configuration
intervalโ update interval in seconds. Default:600(10min)warning_thresholdโ the threshold of pending (or started) tasks when the block turns into a warning state. Default:10critical_thresholdโ the threshold of pending (or started) tasks when the block turns into a critical state. Default:20filtersโ a list of tables describing filters (see bellow). Default:[{name = "pending", filter = "-COMPLETED -DELETED"}]formatโ a string to customise the output of this block. See below for available placeholders. Default:" $icon $count.eng(w:1) "format_singularโ same asformatbut for when exactly one task is pending. Default:" $icon $count.eng(w:1) "format_everything_doneโ same asformatbut for when all tasks are completed. Default:" $icon $count.eng(w:1) "data_locationโ directory in which taskwarrior stores its data files. Supports path expansions e.g.~. Default:"~/.task"
๐ Filter configuration
nameโ the name of the filterfilterโ specifies the criteria that must be met for a task to be counted towards this filterconfig_overrideโ an array containing configuration overrides, useful for explicitly setting context or other configuration variables. Default:[]
๐ซถ Placeholders
iconโ a static icon โ type: Icon โ unit:-countโ the number of tasks matching current filter โ type: Number โ unit:-filter_nameโ the name of current filter โ type: Text โ unit:-
๐ธ Actions
next_filterโ default button: Right
๐ซ Example
In this example, block will be hidden if count is zero. Iconic behaviour honestly.
[[block]]
block = "taskwarrior"
interval = 60
format = " $icon count.eng(w:1) tasks "
format_singular = " $icon 1 task "
format_everything_done = ""
warning_threshold = 10
critical_threshold = 20
[[block.filters]]
name = "today"
filter = "+PENDING +OVERDUE or +DUETODAY"
[[block.filters]]
name = "some-project"
filter = "project:some-project +PENDING"
config_override = ["rc.context:none"]
๐ Icons Used
tasks($icon)
๐ tea_timer
Timer โณ
โจ Configuration โจ
Okay so here's the vibe check on the knobs you can turn for this block ๐๏ธ
formatโ a string to customise the output of this block. See below for available placeholders. Default:" $icon {$time.duration(hms:true)|}"incrementโ the numbers of seconds to add each time the block is clicked. Default:30done_cmdโ a command to run inshwhen the timer finishes. Default:None
And the placeholders you can drop into that format string ๐
iconโ a static icon โ typeIconโ unit-timeโ the time remaining on the timer โ typeDurationโ unit-hoursโ the hours remaining on the timer โ typeTextโ unithโ DEPRECATEDminutesโ the minutes remaining on the timer โ typeTextโ unitmnโ DEPRECATEDsecondsโ the seconds remaining on the timer โ typeTextโ unitsโ DEPRECATED
fr fr: time, hours, minutes, and seconds are unset when the timer is inactive. So no ghost numbers, bestie โ they literally just vanish ๐ป
Also! hours, minutes, and seconds have been deprecated in favor of time. Use time, she's the main character now ๐
Actions, and which button does what:
incrementโ Left / Wheel Updecrementโ Wheel Downresetโ Right
๐ Example ๐
[[block]]
block = "tea_timer"
format = " $icon {$minutes:$seconds |}"
done_cmd = "notify-send 'Timer Finished'"
๐ง Icons Used ๐ง
- tea (
$icon)
๐ก๏ธ temperature ๐ก๏ธ
The system temperature, coming at you live ๐ฅ This block displays the system temperature, based on the libsensors library.
This block has two modes: "collapsed", which uses only color as an indicator, and "expanded", which shows the content of a format string. The average, minimum, and maximum temperatures are computed using all sensors displayed by sensors, or optionally filtered by chip and inputs.
Requires libsensors and appropriate kernel modules for your hardware โ no cap, check those first ๐ซถ
Run the sensors command to list available chips and inputs. That's your cheat sheet โจ
Heads up! The colour of the block is always determined by the maximum temperature across all sensors, not the average. Keep that in mind if you have a misbehaving sensor โ one chaotic little guy can absolutely hijack the whole vibe ๐ญ
๐ Configuration ๐
formatโ aMultiFormat/MaybeMultiFormatConfigstring to customise the output of this block. See below for available placeholders. Default:[" $icon $average avg, $max max "]intervalโ update interval in seconds. Default:5scaleโ either"celsius"or"fahrenheit". Default:"celsius"goodโ maximum temperature to set state to good. Default:20 ยฐC(68 ยฐF)idleโ maximum temperature to set state to idle. Default:45 ยฐC(113 ยฐF)infoโ maximum temperature to set state to info. Default:60 ยฐC(140 ยฐF)warningโ maximum temperature to set state to warning. Beyond this temperature, state is set to critical. Default:80 ยฐC(176 ยฐF)chipโ narrows the results to a given chip name.*may be used as a wildcard. Default:Noneinputsโ narrows the results to individual inputs reported by each chip. Default:None
Actions:
toggle_formatโ toggles betweenformatandformat_alt. Default button:-โ DEPRECATEDnext_formatโ switches to the next format in the list. Default button: Leftprev_formatโ switches to the previous format in the list. Default button: Right
Placeholders, bestie:
minโ minimum temperature among all inputs โ typeNumberโ unitDegreesaverageโ average temperature among all inputs โ typeNumberโ unitDegreesmaxโ maximum temperature among all inputs โ typeNumberโ unitDegrees
Note that when the block is collapsed, no placeholders are provided. Zero. None. Empty plate ๐ฝ๏ธ
๐ Example ๐
[[block]]
block = "temperature"
format = " $icon $max max "
format_alt = " $icon $min min, $max max, $average avg "
interval = 10
chip = "*-isa-*"
๐ Icons Used ๐
- thermometer (
$icon)
โฐ time โฐ
The current time. Yeah that's it. It's giving clock. Iconic ๐ฐ๏ธ
๐ Configuration ๐
formatโ aMultiFormat/MaybeMultiFormatConfigstring. See the chrono docs athttps://docs.rs/chrono/0.3.0/chrono/format/strftime/index.html#specifiersfor all options. Default:[" $icon $timestamp.datetime() "]intervalโ update interval in seconds. Default:10timezoneโ a timezone specifier (e.g."Europe/Lisbon"). Default: Local timezone
Placeholders:
iconโ a static icon โ typeIconโ unit-timestampโ the current time โ typeDatetimeโ unit-
Actions:
next_timezoneโ default button: Leftprev_timezoneโ default button: Rightnext_formatโ default button:-prev_formatโ default button:-
๐ธ Example ๐ธ
[[block]]
block = "time"
interval = 60
[block.format]
full = " $icon $timestamp.datetime(f:'%a %Y-%m-%d %R %Z', l:fr_BE) "
short = " $icon $timestamp.datetime(f:%R) "
๐ฆ Non Gregorian calendars ๐ฆ
Okay this is the cool part โ you can use calendars other than the Gregorian calendar by adding the calendar specifier in the locale string. But when you use this feature you can't use a chrono style format string, so instead you should use one of the options provided by the icu4x crate: short, medium, long, full. If you set precision to hours/hour/h, minutes/minute/m, or seconds/second/s, then the datetime will be formatted accordingly โ otherwise only the date will be displayed.
Only available using feature icu_calendar. ๐ซถ
โญ Example โญ
[[block]]
block = "time"
interval = 60
format = "$timestamp.datetime(locale:'fa-IR-u-ca-persian', f:'full', precision: minutes)"
๐ Icons Used ๐
- time (
$icon)
๐๏ธ toggle ๐๏ธ
A Toggle block. The switch of your dreams โจ
You can add commands to be executed to disable the toggle (command_off), and to enable it (command_on). If these commands exit with a non-zero status, the block will not be toggled, and the block state will be changed to critical to give you a visual warning of the failure โ dramatic but honest ๐ You also need to specify a command to determine the state of the toggle (command_state). When the command outputs nothing, the toggle is disabled, otherwise it's enabled. By specifying the interval property you can let the command_state be executed continuously.
To run those commands, the shell form $SHELL environment variable is used. If such variable is not presented, sh is used.
๐ Configuration ๐
formatโ a string to customise the output of this block. See below for available placeholders. Default:" $icon "command_onโ shell command to enable the toggle. Default: Requiredcommand_offโ shell command to disable the toggle. Default: Requiredcommand_stateโ shell command to determine the state. Empty output => No, otherwise => Yes. Default: Requiredicon_onโ icon override for the toggle button while on. Default:"toggle_on"icon_offโ icon override for the toggle button while off. Default:"toggle_off"intervalโ update interval in seconds. If not set,command_statewill run only on click. Default:Nonestate_onโ[State](color) of this block while on. Default:[idle][State::Idle]state_offโ[State](color) of this block while off. Default:[idle][State::Idle]iconโ Icon based on toggle's state ยท Icon ยท no unit (-)
and the action situation is literally just:
toggleโ default button: Left
โจ Examples โจ
ok bestie this is the whole thing you'd use to flip between an external monitor setup and your laptop screen, no cap:
[[block]]
block = "toggle"
format = " $icon 4k "
command_state = "xrandr | grep 'DP1 connected 38' | grep -v eDP1"
command_on = "~/.screenlayout/4kmon_default.sh"
command_off = "~/.screenlayout/builtin.sh"
interval = 5
state_on = "good"
state_off = "warning"
๐ Icons Used ๐
toggle_off($icon)toggle_on($icon)
โฑ๏ธ uptime โฑ๏ธ
System's uptime, slay. This block shows your uptime using the two biggest units only โ so it's minutes and seconds, or hours and minutes, or days and hours, or weeks and days. That's it, that's the whole vibe.
Configuration
formatโ a string to customise the output of this block, see below for the placeholders you can use. Default:" $icon $uptime "intervalโ update interval in seconds. Default:60
Placeholders, bestie:
iconโ a static icon ยท Icon ยท no unit (-)textDEPRECATED โ current uptime ยท Text ยท no unit (-)uptimeโ current uptime ยท Duration ยท no unit (-)
heads up:texthas been deprecated in favor ofuptime. Useuptime, ok? ๐ซถ
๐ธ Example ๐ธ
[[block]]
block = "uptime"
interval = 3600 # update every hour
๐ฆ Used Icons ๐ฆ
uptime
๐ vpn ๐
Shows the current connection status for VPN networks. And yes โ this widget toggles the connection on left click, iconic behaviour honestly.
Configuration
driverโ which vpn should be used. Available drivers are:"nordvpn","mullvad","tailscale". Default:"nordvpn"intervalโ update interval in seconds. Default:10format_connectedโ a string to customise the output in case the network is connected. See below for available placeholders. Default:" VPN: $icon "format_disconnectedโ a string to customise the output in case the network is disconnected. See below for available placeholders. Default:" VPN: $icon "format_connectingโ a string to customise the output in case the network is in a connecting state. See below for available placeholders. Default:" VPN: $icon "state_connectedโ the widget's state if the vpn network is connected. Default:infostate_disconnectedโ the widget's state if the vpn network is disconnected. Default:idle
Placeholders ๐ :
iconโ a static icon ยท Icon ยท no unit (-)countryโ country currently connected to ยท Text ยท no unit (-)flagโ country specific flag (depends on a font supporting them) ยท Text ยท no unit (-)profileโ currently selected profile configuration (tailnet) ยท Text ยท no unit (-)errorโ error message if any ยท Text ยท no unit (-)
Actions:
toggleโ default button: Left โ toggles the vpn network connection
๐ง Drivers ๐ง
Mullvad
Behind the scenes the mullvad driver uses the mullvad command line binary. In order for this to work properly the binary should be executable and mullvad daemon should be running.
nordvpn
Behind the scenes the nordvpn driver uses the nordvpn command line binary. In order for this to work properly the binary should be executable without root privileges.
Tailscale
Behind the scenes the tailscale driver uses the tailscale command line binary. In order for this to work properly the tailscale daemon should be running and the user must be configured as operator:
sudo tailscale set --operator=$USER
Cloudflare WARP
Behind the scenes the WARP driver uses the warp-cli command line binary. Just ensure the binary is executable without root privileges.
๐ Example ๐
Shows the current vpn network state:
[[block]]
block = "vpn"
driver = "nordvpn"
interval = 10
format_connected = "VPN: $icon "
format_disconnected = "VPN: $icon "
format_connecting = "VPN: $icon "
state_connected = "good"
state_disconnected = "warning"
Possible values for state_connected and state_disconnected, fr fr:
warning
critical
good
info
idle
โญ Icons Used โญ
net_vpn($icon, informat_connected)net_wired($icon, informat_disconnected)net_wireless($icon, informat_connecting)net_down($icon, informat_disconnected, on errors)- country code flags (if supported by font)
Flags: they are not icons but unicode glyphs. You will need a font that includes them. Tested with: https://www.babelstone.co.uk/Fonts/Flags.html
๐ต๏ธ watson ๐ต๏ธ
Watson statistics. Watson is a simple CLI time tracking application. This block will show the name of your current active project, tags and optionally recorded time. Clicking the widget will toggle the show_time variable dynamically โ cute, right? ๐
Configuration
formatโ a string to customise the output of this block. See below for available placeholders. Default:" $text \|"show_timeโ whether to show recorded time. Default:falsestate_pathโ path to the Watson state file. Supports path expansions e.g.~. Default:$XDG_CONFIG_HOME/watson/stateintervalโ update interval, in seconds. Default:60
Placeholders:
textโ current activity ยท Text ยท no unit (-)
Actions:
toggle_show_timeโ toggle the value ofshow_timeโ default button: Left
๐ Example ๐
[[block]]
block = "watson"
show_time = true
state_path = "~/.config/watson/state"
๐ TODO ๐
- Extend functionality: start / stop watson using this block
๐ค๏ธ weather ๐ค๏ธ
Current weather. This block displays local weather and temperature information. In order to use this block, you will need access to a supported weather API service. At the time of writing, OpenWeatherMap, met.no, and the US National Weather Service are supported.
Configuring this block requires configuring a weather service, which may require API keys and other parameters.
important: if using the autolocate feature, set theautolocateupdate interval such that you do not exceed ipapi.co's free daily limit of 1000 hits. Or useautolocate_interval = "once"to only run on initialization.
Configuration
serviceโ the configuration of a weather service (see below). Default: Requiredformatโ a [MultiFormat][MaybeMultiFormatConfig] string to customise the output of this block. See below for available placeholders. Text may need to be escaped, refer to Escaping Text. Default:[" $icon $weather $temp "]intervalโ update interval, in seconds. Default:600autolocateโ gets your location using the ipapi.co IP location service (no API key required). If the API call fails then the block will fallback to service specific location config. Default:falseautolocate_intervalโ update interval for autolocate in seconds or "once". Default:intervalunitsโ either"metric"(ยฐC, m/s) or"imperial"(ยฐF, mph). If set, will supersede any units setting in the service-specific config. Default:"metric"
๐ OpenWeatherMap Options ๐
To use the service you will need a (free) API key.
Okay so the OpenWeatherMap service keys โ full rundown, no skips, bestie:
nameโ literally justopenweathermap.โ required: Yes, default:Noneapi_keyโ Your OpenWeatherMap API key. โ required: Yes, default:Nonecoordinatesโ GPS latitude longitude coordinates as a tuple, example:["39.2362","9.3317"]โ required: Yes*, default:Nonecity_idโ OpenWeatherMap's ID for the city. (Deprecated) โ required: Yes*, default:Noneplaceโ OpenWeatherMap`By {city name},{state code},{country code}'search query. See here โจhttps://openweathermap.org/api/geocoding-api#direct_nameโฉ. Consumes an additional API call โ required: Yes*, default:Nonezipโ OpenWeatherMap`By {zip code},{country code}'search query. See here โจhttps://openweathermap.org/api/geocoding-api#direct_zipโฉ. Consumes an additional API call โ required: Yes*, default:Noneunitsโ either"metric"or"imperial". โ required: No, default:"metric"langโ โ ๏ธ DEPRECATED. Language code. See here โจhttps://openweathermap.org/current#multiโฉ. Currently only affectsweather_verbosekey. โ required: No, default:"en"forecast_hoursโ how many hours should be forecast (must be increments of 3 hours, max 120 hours) โ required: No, default:12
One of coordinates, city_id, place, or zip is required. And if you hand over more than one? The precedence is a whole hierarchy, bestie, pay attention: coordinates takes precedence over city_id, which takes precedence over place, which takes precedence over zip. ๐
The options api_key, city_id, place, zip, can be omitted from configuration, in which case they must be provided in the environment variables OPENWEATHERMAP_API_KEY, OPENWEATHERMAP_CITY_ID, OPENWEATHERMAP_PLACE, OPENWEATHERMAP_ZIP. (env var girlies stay winning ๐ซถ)
Forecasts are only fetched if forecast_hours > 0 and the format has keys related to forecast. No format keys, no forecast โ that's the deal. โจ
met.no Options
nameโmetno.โ required: Yes, default:Nonecoordinatesโ GPS latitude longitude coordinates as a tuple, example:["39.2362","9.3317"]โ required: Required ifautolocate = false, default:Nonelangโ language code:en,nnornbโ required: No, default:enaltitudeโ meters above sea level of the ground โ required: No, default: Approximated by serverforecast_hoursโ how many hours should be forecast โ required: No, default:12
Met.no does not support location name, but if autolocate is enabled then autolocate's city value is used. (so you still get a name, just borrowed ๐)
US National Weather Service Options
nameโnws.โ required: Yes, default:Nonecoordinatesโ GPS latitude longitude coordinates as a tuple, example:["39.2362","9.3317"]โ required: Required ifautolocate = false, default:Noneforecast_hoursโ how many hours should be forecast โ required: No, default:12unitsโ โ ๏ธ DEPRECATED. Either"metric"or"imperial". โ required: No, default:"metric"
Forecasts gather statistics from each hour between now and the forecast_hours value, and provide predicted weather at the set number of hours into the future. So like, it's doing math for you. Iconic behavior honestly. ๐งฎ
Available Format Keys
locationโ location name (exact format depends on the service) โ type: Text โ unit:-icon{,_ffin}โ icon representing the weather โ type: Icon โ unit:-weather{,_ffin}โ textual brief description of the weather, e.g. "Raining" โ type: Text โ unit:-weather_verbose{,_ffin}โ textual verbose description of the weather, e.g. "overcast clouds" โ type: Text โ unit:-temp{,_{favg,fmin,fmax,ffin}}โ temperature (ยฐC or ยฐF, based onunits) โ type: Number โ unit:degreesapparent{,_{favg,fmin,fmax,ffin}}โ Australian Apparent Temperature (ยฐC or ยฐF, based onunits) โ type: Number โ unit:degreeshumidity{,_{favg,fmin,fmax,ffin}}โ humidity โ type: Number โ unit:%wind{,_{favg,fmin,fmax,ffin}}โ wind speed (m/s or mph, based onunits) โ type: Number โ unit:-wind_kmh{,_{favg,fmin,fmax,ffin}}โ wind speed. The wind speed in km/h โ type: Number โ unit:-direction{,_{favg,fmin,fmax,ffin}}โ wind direction, e.g. "NE" โ type: Text โ unit:-sunriseโ time of sunrise (may be absent if it's a polar day or polar night)[3] โ type: DateTime โ unit:-sunsetโ time of sunset (may be absent if it's a polar day or polar night)[4] โ type: DateTime โ unit:-
You can use the suffixes noted above to get the following:
- None โ current weather
_favgโ average forecast value_fminโ minimum forecast value_fmaxโ maximum forecast value_ffinโ final forecast value
Now the click actions, bestie โ these are how you make it do stuff:
toggle_formatโ toggles betweenformatandformat_altโ โ ๏ธ DEPRECATED โ default button:-next_formatโ switches to the next format in the list โ default button: Leftprev_formatโ switches to the previous format in the list โ default button: Right
Examples
Show detailed weather in San Francisco through the OpenWeatherMap service:
[[block]]
block = "weather"
format = " $icon $weather ($location) $temp, $wind m/s $direction "
format_alt = " $icon_ffin Forecast (9 hour avg) {$temp_favg ({$temp_fmin}-{$temp_fmax})|Unavailable} "
[block.service]
name = "openweathermap"
api_key = "XXX"
city_id = "5398563"
units = "metric"
forecast_hours = 9
Show sunrise and sunset times in null island:
[[block]]
block = "weather"
format = "up $sunrise.datetime(f:'%R') down $sunset.datetime(f:'%R')"
[block.service]
name = "metno"
coordinates = ["0", "0"]
Used Icons
weather_sun($icon$icon_ffin, when weather is reported as "Clear" during the day)weather_moon($icon$icon_ffin, when weather is reported as "Clear" at night)weather_clouds($icon$icon_ffin, when weather is reported as "Clouds" during the day)weather_clouds_night($icon$icon_ffin, when weather is reported as "Clouds" at night)weather_fog($icon$icon_ffin, when weather is reported as "Fog" or "Mist" during the day)weather_fog_night($icon$icon_ffin, when weather is reported as "Fog" or "Mist" at night)weather_rain($icon$icon_ffin, when weather is reported as "Rain" or "Drizzle" during the day)weather_rain_night($icon$icon_ffin, when weather is reported as "Rain" or "Drizzle" at night)weather_snow($icon$icon_ffin, when weather is reported as "Snow")weather_thunder($icon$icon_ffin, when weather is reported as "Thunderstorm" during the day)weather_thunder_night($icon$icon_ffin, when weather is reported as "Thunderstorm" at night)weather_default($icon$icon_ffin, in all other cases)
xrandr
X11 screen information ๐
X11 screen information (name, brightness, resolution, refresh rate). With a click you can toggle through your active screens, and scrolling the wheel up/down, you can adjust the selected screens' brightness. Regarding brightness control, xrandr changes the brightness of the display using gamma rather than changing the brightness in hardware, so if that is not desirable, then consider using the backlight block instead. ๐ก
NOTE: Some users report issues (e.g. here and here) when using this block. The cause is currently unknown, however, setting a higher update interval may help. ๐ญ No cap, if it's acting up, crank that interval.
โ๏ธ Configuration โ๏ธ
Okay bestie, here's the little settings menu for this block โ every knob, every default, no crumbs left behind ๐
formatโ a string that customises the output of this block. Peek below for the available placeholders. Default:" $icon $display $brightness_icon $brightness "step_widthโ how many steps the brightness goes up/down by for the selected screen (if you set it greater than 50, it gets limited to 50, no cap-fighting the cap). Default:5intervalโ update interval in seconds. Default:5invert_iconsโ flips the ordering of the icons, which is super useful if you're rocking colourful emoji. Default:false
โจ Placeholders โจ โ here's what you can drop into your format string:
iconโ a static icon. Type: Icon. Unit:-displayโ the monitor name. Type: Text. Unit:-brightnessโ the monitor brightness. Type: Number. Unit:%brightness_iconโ a static icon. Type: Icon. Unit:-resolutionโ the monitor resolution. Type: Text. Unit:-res_iconโ a static icon. Type: Icon. Unit:-refresh_rateโ the monitor refresh rate. Type: Number. Unit: Hertz
๐ฎ Actions & their default buttons ๐ฎ โ clicky clicky:
cycle_outputsโ Leftbrightness_upโ Wheel Upbrightness_downโ Wheel Down
๐ธ Example ๐ธ
Steal this, it's cute:
[[block]]
block = "xrandr"
format = " $icon $brightness $resolution $refresh_rate "
๐ Used Icons ๐
The icons this block pulls from, bestie:
xrandrbacklightresolution
๐ NOTES ๐
The footnotes, but make them glamorous:
[1] when using notification_count with the dunst driver use dunst > 1.9.0 โ yes, that's a version gate, respect it ๐ค
[2] history_count is the same as notification_count in SwayNC โ twins fr fr
[3] On polar days and polar nights, sunrise or sunset may not occur on a given day, and thus the corresponding value may be absent. This behaviour depends on the weather service used. For met.no and nws, both sunrise and sunset will be absent on polar days and polar nights, but OpenWeatherMap will show the same time for both sunrise and sunset.
[4] On polar days and polar nights, sunrise or sunset may not occur on a given day, and thus the corresponding value may be absent. This behaviour depends on the weather service used. For met.no and nws, both sunrise and sunset will be absent on polar days and polar nights, but OpenWeatherMap will show the same time for both sunrise and sunset.
Yes bestie, [3] and [4] are literally the same note twice. Not a typo on my end โ the manpage said it twice, so I'm saying it twice. Consistency icon ๐
๐ THEMES ๐
Choosing your theme and icon set
Want a theme or icon set that isn't the default? Same, honestly. Drop them into your config file like so:
[theme]
theme = "solarized-dark"
[icons]
icons = "awesome6"
Plot twist: both the theme and the icon set can be loaded from a separate file ๐ฆ
[theme]
theme = "<file>"
[icons]
icons = "<file>"
Where <file> can be either a filename or a full path โ and it gets checked in this exact order:
- If a full absolute path is given, then use it as is:
/home/foo/custom_theme.toml - If a filename is given, e.g. "
custom_theme.toml", then first check$XDG_CONFIG_HOME/i3status-rust/themes - Then look for it in
$XDG_DATA_HOME/i3status-rust/themes - Otherwise look for it in
/usr/share/i3status-rust/themes
Notes, and I'm reading these to you verbatim because they matter:
- In case with icon sets, the file should be in the
iconssubdirectory instead ofthemes. - You can omit the
.tomlextension while specifying file parameters. - All the predefined themes are provided as files, so you use them as examples of how to write your own themes/icon sets.
Available themes
Note: screenshots were generated using this config with this swaybar config.
The lineup, and yes I'm listing every single one ๐
plain(default) [IMAGE: plain]solarized-dark[IMAGE: solarized-dark]solarized-light[IMAGE: solarized-light]slick[IMAGE: slick]modern[IMAGE: modern]bad-wolf[IMAGE: bad-wolf]gruvbox-light[IMAGE: gruvbox-light]gruvbox-dark[IMAGE: gruvbox-dark]space-villain[IMAGE: space-villain]native(likeplainwith no background and native separators) [IMAGE: native]semi-native(likenativebut with background) [IMAGE: semi-native]nord-dark(polar night) [IMAGE: nord-dark]dracula[IMAGE: dracula]srcery[IMAGE: srcery]ctp-frappe[IMAGE: ctp-frappe]ctp-latte[IMAGE: ctp-latte]ctp-macchiato[IMAGE: ctp-macchiato]ctp-mocha[IMAGE: ctp-mocha]tomorrow-night[IMAGE: tomorrow-night]
Available icon sets
none(default. Uses text labels instead of icons)awesome4(Font Awesome 4.x)awesome5(Font Awesome 5.x)awesome6(Font Awesome 6.x)awesome7(Font Awesome 7.x)awesome7pro(Font Awesome 7.x Pro)emojimaterialmaterial-nf(Any font from Nerd Fonts collection)
Note: In order to use the material icon set, you need a patched material icons font which can be found here. Make sure to pass it in your i3 configuration bar block. Don't skip this step, or you'll get sad little boxes ๐ญ
Overriding themes and icon sets
Make a block in the configuration called theme or icons, like so:
[theme]
theme = "solarized-dark"
[theme.overrides]
# Example: redefine `idle` colors
idle_bg = "#123456"
idle_fg = "#abcdef"
# Example: swap `good` and `warning` colors
good_fg = { link = "warning_fg" }
good_bg = { link = "warning_bg" }
warning_fg = { link = "good_fg" }
warning_bg = { link = "good_bg" }
[icons]
icons = "awesome6"
[icons.overrides]
bat = [
"| |",
"|ยผ|",
"|ยฝ|",
"|ยพ|",
"|X|",
]
bat_charging = "|^|"
Besides global overrides, you may also use per-block overrides using the theme_overrides, icons_overrides and icons_format options available for all blocks. For example:
[[block]]
block = "cpu"
icons_format = "{icon}"
[block.theme_overrides]
idle_bg = "#123456"
idle_fg = "#abcdef"
[block.icons_overrides]
cpu_boost_on = "ON"
cpu_boost_off = "OFF"
If you define colors in ~/.Xresources like *background: #aabbcc you can use them like:
[theme]
theme = "solarized-dark"
[theme.overrides]
# Example: redefine `idle_bg` with the background color
idle_bg = "x:background"
And if you use sway, you can also reference a bar color like:
[theme]
theme = "solarized-dark"
[theme.overrides]
# Example: redefine `critical` colors
critical_bg = "sway:urgent_workspace_bg"
critical_fg = "sway:urgent_workspace_text"
These are the available sway colors โ the whole squad ๐
active_workspace_bgactive_workspace_borderactive_workspace_textbackgroundbinding_mode_bgbinding_mode_borderbinding_mode_textfocused_backgroundfocused_separatorfocused_statuslinefocused_workspace_bgfocused_workspace_borderfocused_workspace_textinactive_workspace_bginactive_workspace_borderinactive_workspace_textseparatorstatuslineurgent_workspace_bgurgent_workspace_borderurgent_workspace_text
You can see the current values for your bar with swaymsg -t get_bar_config <bar-name>.
Available theme overrides
All bg and fg overrides are either:
- html hex color codes like
#000000or#789ABC; a fourth byte for alpha (like#acbdef42) works on some systems.00is transparent,FFis opaque, or - a reference to another override, e.g.,
{ link = "idle-bg" }, or - a reference to a color name defined in
~/.Xresources, e.g.,x:backgroundlooks for a line like*background: #aabbccin~/.Xresources(see also .Xresources).
The tints are added to every second block counting from the right. They will therefore always brighten the block and never darken it. The alpha channel, if it works, can also be alternated in the same way.
Feel free to take a look at the provided color schemes for reference ๐
idle_bgidle_fggood_bggood_fgwarning_bgwarning_fgcritical_bgcritical_fginfo_bginfo_fgalternating_tint_bgalternating_tint_fgseparator_bgseparator_fgseparatorend_separatorstart_separator
Available icon overrides
These can be directly set to a string containing the desired unicode codepoint(s) or use a TOML escape sequence like "\uf0f3" for up to 4-nibble codepoints and "\U0001f312" for up to 8-nibble codepoints.
You can find the codepoints in the documentation of the icon font you're using โ go hunt them down, it's lowkey fun ๐ง
Refer to individual block's documentation for a list of used icons or provided icon sets for a complete list of icons.
๐ฆ VERSION ๐ฆ
v0.36.2 (commit )
๐ AUTHORS ๐
Kai Greshake <development@kai-greshake.de>, Contributors on GitHub (https, //github.com/greshake/i3status-rust/graphs/contributors)
And that's the whole page, bestie โ every last crumb ๐
<i3status-rs 0.36.2 (commit ) โ i3status-rs(1)</i3status-rs> โ okay that tag was a bit much, but the footer really does say: i3status-rs 0.36.2 (commit ) on the left and i3status-rs(1) on the right. Slay, go configure your bar ๐โจ
๐ฆ where this page comes from
- arch rolling: i3status-rust 0.36.2-1 ยท GPL-3.0-only
- nixpkgs unstable: i3status-rust 0.36.2
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms