Skip to main content
Version: main

Configuration

histuid is configured via ~/.config/histui/histuid.toml.

Minimal Configuration

histuid works with no configuration file. All settings have sensible defaults.

Configuration File Location

~/.config/histui/histuid.toml

The configuration file is automatically loaded from this location if it exists.

Full Reference

log_level

Controls logging verbosity.

ValueDescription
debugVerbose debugging output
infoNormal operational messages (default)
warnWarnings only
errorErrors only
log_level = "info"

Command-line override:

histuid --log-level debug

[display]

Controls notification popup position and behavior.

KeyTypeDefaultDescription
positionstring"top-right"Popup position on screen
offset_xint10Pixels from horizontal screen edge
offset_yint10Pixels from vertical screen edge
max_visibleint5Maximum simultaneous popups (1-20)
monitorint0Display monitor (0 = all, 1+ = specific monitor)
new_on_topboolfalseNew notifications appear at top of stack
image_data_preview_sizebytesize"100 KiB"Minimum size for showing image-data in body
layerstring"top"Wayland layer-shell layer

Valid Positions:

  • top-right (default)
  • top-left
  • top-center
  • bottom-right
  • bottom-left
  • bottom-center
note

Notification width and gap are controlled by the theme layout, not configuration. See Layout Reference for details.

Wayland Layer

The layer setting controls which Wayland layer-shell layer notifications appear on:

ValueDescription
backgroundBottom-most layer, below all windows
bottomAbove background but below normal windows
topAbove normal windows (default, correct for notifications)
overlayTop-most layer, above everything including lock screens
[display]
layer = "top" # Default - notifications appear above windows

# Use overlay to show notifications even on lock screen
layer = "overlay"
caution

Using overlay layer means notifications appear above lock screens. Only use this if you want notifications visible when the screen is locked.

Fullscreen Behavior

By default, Hyprland hides the TOP layer (alpha 0) when a fullscreen window is active. This affects all notification daemons on the TOP layer.

Current solutions:

  1. Use the overlay layer - Notifications on the OVERLAY layer remain visible during fullscreen:
[display]
layer = "overlay"
caution

The OVERLAY layer appears above everything, including lock screens. Only use this if you want notifications visible when the screen is locked.

  1. Accept fullscreen hiding - Keep layer = "top" (default) and notifications will be hidden during fullscreen, which some users prefer for immersive experiences.

Why layerrules don't help:

Hyprland's fullscreen fadeout directly sets layer alpha to 0 without checking layerrules. There is no alpha or nofullscreenfade layerrule - the no_anim rule only makes the hiding instant rather than preventing it.

Image Data Preview

The image_data_preview_size setting controls whether image-data from notifications is displayed in the popup body. Many messaging apps (Signal, Discord) send profile pictures via image-data which can clutter notifications.

ValueMeaning
"never" or "-1"Never display image-data
"always" or "0"Always display image-data
Size threshold (e.g., "100 KiB")Only display if data size >= threshold

The default 100 KiB filters out profile pictures (typically 64-128px = ~64KB raw RGBA) while showing larger content like album art (300px+ = ~360KB+ raw).

tip

The image-path hint is always displayed since explicit file paths indicate intentional content images.

Byte Size Format:

Byte sizes can be specified as:

  • "100" - 100 bytes
  • "100 KB" or "100KB" - 100,000 bytes (SI, base 1000)
  • "100 KiB" - 102,400 bytes (IEC, base 1024)
  • "1 MB" - 1,000,000 bytes
  • "1 MiB" - 1,048,576 bytes

See Icon Aliases for more details on how icons and images are handled.

[timeouts]

Controls how long notifications are displayed by urgency level.

KeyTypeDefaultDescription
lowduration"0"Timeout for low urgency (default: honor client)
normalduration"0"Timeout for normal urgency (default: honor client)
criticalduration"never"Timeout for critical urgency
fallbackduration"10s"Fallback timeout when client says "server decides"

Timeout Values:

ValueMeaning
"0" or "0s"Honor the client's requested timeout
"never" or "-1"Notification never expires (must be dismissed)
Positive duration (e.g., "5s", "30s", "2m")Override with this timeout

Duration Format:

Durations can be specified as:

  • "5s" - 5 seconds
  • "500ms" - 500 milliseconds
  • "2m" - 2 minutes
  • "1h30m" - 1 hour 30 minutes
  • "5000" - 5000 milliseconds (integer)

Client Timeout Behavior:

When set to "0" (honor client), the daemon respects what the sending application requested:

  • If the client requests -1 (server decides), the daemon uses the fallback timeout (default 10s, critical always uses 0/never)
  • If the client requests 0 (never expire), the notification stays until dismissed
  • If the client requests a positive value, that timeout is used

[history]

Controls notification history and retention.

KeyTypeDefaultDescription
max_notificationsint500Maximum notifications to keep (0 = unlimited)
store_imagesbooltrueStore notification images for replay

Auto-Pruning Behavior:

The daemon automatically prunes old notifications to stay within limits:

  • Buffer threshold: Pruning triggers when count exceeds max by 10% (e.g., at 550 for max 500)
  • Debounce: At most one prune operation every 5 minutes
  • Cascade cleanup: Images for pruned notifications are automatically deleted
  • Startup prune: A prune runs on daemon startup to clean up any excess

This design prevents constant disk I/O while keeping history within reasonable bounds.

[behavior]

Controls daemon behavior.

KeyTypeDefaultDescription
stack_duplicatesbooltrueCombine identical notifications
show_countbooltrueShow "(2)" for stacked duplicates
pause_on_hoverbooltruePause timeout when mouse hovers
history_lengthint100Max notifications in session memory

[dnd]

Controls Do Not Disturb mode.

KeyTypeDefaultDescription
enabledboolfalseInitial DnD state on daemon startup
suppress_criticalboolfalseAlso suppress critical notifications in DnD mode

DnD Behavior:

  • When DnD is enabled, notification popups and sounds are suppressed
  • Notifications are still persisted to history for later review
  • By default (suppress_critical = false), critical notifications bypass DnD and are still shown
  • Set suppress_critical = true to also silence critical notifications when DnD is active
  • Use histui dnd on/off/toggle to control DnD state

[mouse]

Controls mouse button actions on notification popups.

KeyTypeDefaultDescription
leftstring"dismiss"Left-click action
middlestring"do-action"Middle-click action
rightstring"close-all"Right-click action

Available Actions:

ActionDescription
dismissClose this notification
do-actionExecute the "default" action if present (see below)
close-allClose all visible notifications
context-menuShow context menu (if supported)
noneDo nothing

Understanding Notification Actions

D-Bus notifications can include actions - interactive buttons or click behaviors. Actions are key/label pairs sent by the application:

  • Key: An identifier sent back to the app when triggered (e.g., "reply", "default")
  • Label: Human-readable text shown to the user (e.g., "Reply", "Open")

Special keys:

KeyMeaning
"default"Action triggered by clicking the notification body (not a button)
Other keysDisplayed as action buttons in the notification

How do-action works:

When you configure a mouse button to do-action, clicking the notification:

  1. Looks for an action with key "default"
  2. If found, sends an ActionInvoked D-Bus signal back to the originating application
  3. The application handles it (e.g., focusing its window, opening a conversation)

Common examples:

ApplicationDefault ActionEffect
kitty/alacrittyFocus terminal window["default", ""]
DiscordOpen conversation["default", ""]
SlackOpen thread["default", "Open"]
FirefoxFocus tab["default", ""]

Visual indicator:

Notifications with a "default" action display a subtle right-hand indicator (an inset shadow effect). This signals to users that the notification is "clickable." The indicator is styled via the .has-default-action CSS class.

See the CSS Reference for styling options.

Viewing actions in histui:

The histui TUI detail view shows all actions with their keys:

Extensions:
Actions:
default (no label) [click body to invoke]
reply: Reply

[audio]

Controls notification sounds.

KeyTypeDefaultDescription
enabledbooltrueEnable notification sounds
volumeint80Global volume (0-100)

Audio Behavior:

  • Sounds are defined in theme manifests (see Theming)
  • Only one sound plays at a time (newer sounds are skipped unless critical)
  • Critical notifications can interrupt any playing sound
  • Per-theme volumes are multiplied with the global volume

Supported Formats:

FormatExtensionNotes
WAV.wavPCM only (16-bit signed little-endian). IEEE Float format is not supported
Ogg Vorbis.oggFully supported
MP3.mp3Fully supported

Command-line Flags:

# Disable all sounds (overrides theme and config)
histuid --no-audio

# Override global volume (0.0 to 1.0)
histuid --volume 0.5

Example Configuration

# Logging: debug, info, warn, error
log_level = "info"

[display]
position = "top-right"
max_visible = 5
offset_x = 10
offset_y = 10
image_data_preview_size = "100 KiB" # Filter small images like profile pics
layer = "top" # Wayland layer: background, bottom, top, overlay

[timeouts]
# Honor whatever the application requests (default for low/normal)
low = "0"
normal = "0"

# Critical notifications never expire (default)
critical = "never"

# Fallback timeout when client says "server decides" (-1)
fallback = "10s"

[behavior]
stack_duplicates = true
pause_on_hover = true

[dnd]
enabled = false # Start with DnD off
suppress_critical = false # Critical notifications bypass DnD (default)

[mouse]
left = "dismiss"
middle = "do-action"
right = "close-all"

[audio]
enabled = true
volume = 80

[history]
max_notifications = 500 # 0 = unlimited
store_images = true # Required for replay with images

Icon Aliases

Icon aliases are configured in a separate file for easy sharing:

~/.config/histui/icon-aliases.toml

This maps application names to standard icon names:

# ~/.config/histui/icon-aliases.toml

[aliases]
zapzap = "whatsapp"
telegram-desktop = "telegram"
firefox-esr = "firefox"
vesktop = "discord"
signal-desktop = "signal"

Built-in aliases are provided for common apps. User aliases take precedence. See Advanced Theming for more details.

See Also