Files
wayscriber/config.example.toml
T
devmobasa fcbc437816 feat(cli): choose and list the interface language from the command line
`--language CODE` sets the interface language for one run of --active,
--freeze, --daemon or --about without changing config.toml. It accepts
the spellings `[ui] language` does and takes precedence over both
WAYSCRIBER_LANGUAGE and the config. A daemon started with it gives it to
the About windows it opens, and to its overlays as an optional
environment input that an older overlay ignores. The process broker
strips that input from every other helper, so a configurator opened from
an overlay keeps previewing its own Language row. With --daemon-toggle or
an overlay action the flag is an error, since a running daemon's
overlays cannot be changed from outside.

`--list-languages` prints each language's code and name, the configured
language, and the language in effect with the setting that decided it.

Languages now carry their native and English names, and the
configurator's Language row takes its labels from them. The help text,
README, CONFIG.md, I18N.md and config.example.toml describe both options.
2026-10-16 18:42:33 +02:00

1645 lines
66 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# wayscriber configuration file
# Location: ~/.config/wayscriber/config.toml
#
# All settings are optional. If not specified, defaults will be used.
# Floating-point settings must be finite (not nan, inf, or -inf).
# Load-time fallbacks never rewrite this file; see docs/CONFIG.md for the policy.
#
# Every value here is a configured default: the value Wayscriber starts from.
# Edit them in the graphical configurator (`wayscriber-configurator`, or F11
# from the overlay) or by hand. Two things write this file: the configurator's
# Save, and the overlay's three narrow editors — shortcut edit/unbind/reset,
# preset save/clear, and quick-color recoloring — each of which rewrites only
# its own key at the moment you confirm the edit and copies the previous file
# to a timestamped .bak. Running, using, and quitting Wayscriber never changes
# it on its own, and a preference you flip from the overlay applies to that run
# only.
#
# Overlay changes to toolbar pins, minimized/pane/collapsed state, toolbar item
# visibility/order, and board pins are direct interaction state, stored
# separately in $XDG_DATA_HOME/wayscriber/runtime-ui.toml (normally
# ~/.local/share/wayscriber/runtime-ui.toml). Reset those generated runtime
# preferences from the overlay Settings panel; do not hand-edit them.
#
# Delete this config file only to reset authored settings to built-in defaults.
# Which generation of shipped keybinding defaults this file was written
# against. Loading never changes it; the configurator offers a reviewed update
# when it is behind. Keep this value when editing the file.
config_revision = 3
# ═══════════════════════════════════════════════════════════════════════════════
# KEYBINDING SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[keybindings]
# Customize keyboard shortcuts for all actions
# Format: key names with modifiers separated by +
# Examples: "Escape", "Ctrl+Z", "Super+X", "Ctrl+Shift+T", "F10",
# "MouseBack", "Ctrl+MouseForward", "StylusPrimary",
# "Ctrl+K > Ctrl+C"
# Super also accepts Meta, Logo, Win, and Windows.
# Auxiliary mouse buttons: MouseBack, MouseForward, MouseExtra1–MouseExtra4.
# Stylus barrel buttons: StylusPrimary, StylusSecondary.
# Keyboard sequences use `>` between two or three chords (Ctrl+K > Ctrl+C).
# Commas still separate independent shortcuts: F5, Ctrl+K > Ctrl+C
# A standalone chord cannot also be a sequence prefix.
# Left, middle, and right cannot be bound as actions.
# Each action can have multiple keybindings (e.g., ["+", "="])
# Exit overlay (or cancel current action)
exit = ["Escape", "Ctrl+Q"]
# Enter text mode
enter_text_mode = ["T"]
# Enter sticky note mode
enter_sticky_note_mode = ["N"]
# Clear all annotations on current canvas
clear_canvas = ["E"]
# Undo last annotation
undo = ["Ctrl+Z"]
# Redo last undone annotation
redo = ["Ctrl+Shift+Z", "Ctrl+Y"]
# Optional undo/redo batch actions
undo_all = []
redo_all = []
undo_all_delayed = []
redo_all_delayed = []
# Duplicate currently selected annotations
duplicate_selection = ["Ctrl+D"]
# Copy/paste selected annotations
copy_selection = ["Ctrl+Alt+C"]
paste_selection = ["Ctrl+Alt+V"]
# Select all annotations
select_all = ["Ctrl+A"]
# Reorder selected annotations within the stack
move_selection_to_front = ["]"]
move_selection_to_back = ["["]
# Nudge selected annotations (hold Shift for a larger step)
nudge_selection_up = ["ArrowUp"]
nudge_selection_down = ["ArrowDown"]
nudge_selection_left = ["ArrowLeft", "Shift+PageUp"]
nudge_selection_right = ["ArrowRight", "Shift+PageDown"]
# Nudge selected annotations (large step)
nudge_selection_up_large = ["PageUp"]
nudge_selection_down_large = ["PageDown"]
# Move selection to horizontal edges (left/right)
move_selection_to_start = ["Home"]
move_selection_to_end = ["End"]
# Move selection to vertical edges
move_selection_to_top = ["Ctrl+Home"]
move_selection_to_bottom = ["Ctrl+End"]
# Delete selected annotations
delete_selection = ["Delete"]
# Adjust pen thickness
increase_thickness = ["+", "="]
decrease_thickness = ["-", "_"]
# Adjust marker opacity (when using the marker tool)
increase_marker_opacity = ["Ctrl+Alt+ArrowUp"]
decrease_marker_opacity = ["Ctrl+Alt+ArrowDown"]
# Tool selection shortcuts (optional; keep empty to rely on modifiers)
select_selection_tool = ["V"]
select_pen_tool = ["F"]
select_live_shape_tool = ["S"]
select_marker_tool = ["H"]
select_step_marker_tool = []
select_eraser_tool = ["D"]
# Toggle eraser behavior mode
toggle_eraser_mode = ["Ctrl+Shift+E"]
# Step the text font through drawing.font_cycle
cycle_font_family = ["Shift+T"]
# Open the font picker over every installed family (unbound by default;
# also on the command palette as "Font Picker")
open_font_picker = []
# Step stroke smoothing up and down (unbound by default)
increase_pen_smoothing = []
decrease_pen_smoothing = []
# Step Shape Pen recognition sensitivity up and down (unbound by default)
increase_shape_recognition_sensitivity = []
decrease_shape_recognition_sensitivity = []
# Select the spotlight tool (unbound by default)
select_spotlight_tool = []
# Step the blur tool through blur/pixelate/secure/black-out (unbound by default)
cycle_blur_style = []
# Step the arrow style through standard/pointy/curved/double (unbound by default).
# With arrows selected it restyles those instead of the next arrow.
cycle_arrow_style = []
select_line_tool = []
select_rect_tool = []
select_ellipse_tool = []
select_triangle_tool = []
select_parallelogram_tool = []
select_rhombus_tool = []
select_regular_polygon_tool = []
select_freeform_polygon_tool = []
select_arrow_tool = []
select_blur_tool = []
select_highlight_tool = []
select_laser_tool = ["L"]
toggle_highlight_tool = ["Ctrl+Alt+H"]
# Reset label counters
reset_arrow_labels = ["Ctrl+Shift+R"]
reset_step_markers = []
# Adjust font size
increase_font_size = ["Ctrl+Shift++", "Ctrl+Shift+="]
decrease_font_size = ["Ctrl+Shift+-", "Ctrl+Shift+_"]
# Board mode toggles (only if board.enabled = true)
toggle_whiteboard = ["Ctrl+W"]
toggle_blackboard = ["Ctrl+B"]
return_to_transparent = ["Ctrl+Shift+T"]
# Cycle overlay focus across monitors (layer-shell + xdg fullscreen fallback)
focus_prev_output = ["Ctrl+Alt+Shift+ArrowLeft"]
focus_next_output = ["Ctrl+Alt+Shift+ArrowRight"]
# Board slots and board management
board_1 = ["Ctrl+Shift+1"]
board_2 = ["Ctrl+Shift+2"]
board_3 = ["Ctrl+Shift+3"]
board_4 = ["Ctrl+Shift+4"]
board_5 = ["Ctrl+Shift+5"]
board_6 = ["Ctrl+Shift+6"]
board_7 = ["Ctrl+Shift+7"]
board_8 = ["Ctrl+Shift+8"]
board_9 = ["Ctrl+Shift+9"]
board_prev = ["Ctrl+Shift+ArrowLeft"]
board_next = ["Ctrl+Shift+ArrowRight"]
board_new = ["Ctrl+Shift+N"]
board_duplicate = ["Ctrl+Shift+D"]
board_delete = ["Ctrl+Shift+Delete"]
board_picker = ["Ctrl+Shift+B"]
# Edit the active board's paper (unbound by default; also in the command palette)
board_paper_edit = []
# Page navigation
# Ubuntu/GNOME defaults avoid Ctrl+Alt workspace shortcuts (Ctrl+ArrowLeft/Right, Ctrl+PageUp/PageDown).
page_prev = ["Ctrl+Alt+ArrowLeft", "Ctrl+Alt+PageUp"]
page_next = ["Ctrl+Alt+ArrowRight", "Ctrl+Alt+PageDown"]
page_new = ["Ctrl+Alt+N"]
page_duplicate = ["Ctrl+Alt+D"]
page_delete = ["Ctrl+Alt+Delete"]
# Toggle help overlay
toggle_help = ["F10", "F1"]
# Toggle quick reference overlay
toggle_quick_help = ["Shift+F1"]
# Toggle status bar
toggle_status_bar = ["F12", "F4"]
# Show/hide the floating board/page badge (unbound; also in the command palette)
toggle_floating_badge = []
# Show/hide the bottom-right zoom chip (unbound; also in the command palette)
toggle_zoom_chip = []
# Focus mode: hide all UI chrome at once, press again to restore exactly
# (unbound; also in the command palette)
toggle_focus_mode = []
# Toggle the unified top toolbar
toggle_toolbar = ["F9"]
# Cycle the top toolbar's display: full strip -> micro chip -> hidden
# (F2 used to toggle the toolbars; the cycle still reaches hidden)
cycle_toolbar_display = ["F2"]
# Toggle click highlight
toggle_click_highlight = ["Ctrl+Shift+H"]
# Toggle the input HUD (on-screen keystrokes and clicks)
toggle_input_hud = ["Ctrl+Shift+K"]
# Toggle presenter mode
toggle_presenter_mode = ["Ctrl+Shift+M"]
# Toggle light passthrough mode while the overlay has focus.
# Once passthrough is active, use compositor/global shortcuts that call
# `wayscriber --light-toggle` for reliable control, including exit.
toggle_light_mode = ["F6"]
# Optional in-overlay toggle between light drawing and passthrough.
# In passthrough, use `wayscriber --light-draw-toggle`
# or `--light-draw-on` / `--light-draw-off` from a compositor shortcut.
toggle_light_mode_drawing = []
# Optional render color profile preview controls
render_profile_next = []
render_profile_previous = []
render_profile_off = []
# Toggle fill for fill-capable shapes
toggle_fill = []
# Optional keyboard binding to toggle radial menu at cursor
toggle_radial_menu = []
# Toggle selection properties panel
toggle_selection_properties = ["Ctrl+Alt+P"]
# Toggle context menu (keyboard alternative to right-click)
open_context_menu = ["Shift+F10", "Menu"]
# Launch the desktop configurator (requires wayscriber-configurator)
open_configurator = ["F11"]
# Open the About window (version, links, update status). Unbound by default;
# also available from the toolbar chrome, the Settings popover, the help
# overlay footer, and the command palette. Opening it closes the overlay,
# because About is a normal window and the overlay draws above those.
open_about = []
# Toggle command palette
toggle_command_palette = ["Ctrl+K", "Ctrl+Shift+P"]
# Color selection shortcuts
set_color_red = ["R"]
set_color_green = ["G"]
set_color_blue = ["B"]
set_color_yellow = ["Y"]
set_color_orange = ["O"]
set_color_pink = ["P"]
set_color_white = ["W"]
set_color_black = ["K"]
# Screen eyedropper (also available from color UIs and command palette)
pick_screen_color = ["I"]
# Screenshot shortcuts
capture_full_screen = ["Ctrl+Alt+F"]
capture_active_window = ["Ctrl+Shift+O"]
capture_selection = ["Ctrl+Shift+I"]
# Clipboard/File capture variants
capture_clipboard_full = ["Ctrl+C"]
capture_file_full = ["Ctrl+S"]
# Unbound by default: Ctrl+Shift+C now opens the interactive picker below,
# whose Copy action reaches the same clipboard result. Bind a chord here to get
# the one-step region copy back.
capture_clipboard_selection = []
capture_file_selection = ["Ctrl+Shift+S"]
capture_clipboard_region = ["Ctrl+6"]
capture_file_region = ["Ctrl+Alt+6"]
# Open the region review/action bar. Also available from the command palette.
capture_region_interactive = ["Ctrl+Shift+C"]
# Show a logical-pixel screen ruler without capturing anything. Available from
# the command palette and unbound by default.
measure_mode = []
export_canvas_file = []
export_canvas_clipboard = []
export_canvas_clipboard_and_file = []
export_board_pdf_file = []
export_all_boards_pdf_file = []
# Open the most recent capture folder
open_capture_folder = ["Ctrl+Alt+O"]
# Select a screen region and copy the text recognized in it (needs Tesseract).
# Ctrl+A inside the selector reads the whole screen instead.
copy_text_from_screen = ["Ctrl+Shift+X"]
# Toggle frozen mode
toggle_frozen_mode = ["Ctrl+Shift+F"]
# Zoom controls
zoom_in = ["Ctrl+Alt++", "Ctrl+Alt+="]
zoom_out = ["Ctrl+Alt+-", "Ctrl+Alt+_"]
reset_zoom = ["Ctrl+Alt+0"]
toggle_zoom_lock = ["Ctrl+Alt+L"]
refresh_zoom_capture = ["Ctrl+Alt+R"]
# Preset slots (apply/save/clear).
apply_preset_1 = ["1"]
apply_preset_2 = ["2"]
apply_preset_3 = ["3"]
apply_preset_4 = ["4"]
apply_preset_5 = ["5"]
save_preset_1 = ["Shift+1"]
save_preset_2 = ["Shift+2"]
save_preset_3 = ["Shift+3"]
save_preset_4 = ["Shift+4"]
save_preset_5 = ["Shift+5"]
clear_preset_1 = ["Ctrl+1"]
clear_preset_2 = ["Ctrl+2"]
clear_preset_3 = ["Ctrl+3"]
clear_preset_4 = ["Ctrl+4"]
clear_preset_5 = ["Ctrl+5"]
# ───────────────────────────────────────────────────────────────────────────────
# Keybinding Examples
# ───────────────────────────────────────────────────────────────────────────────
# Vim-style keybindings:
# exit = ["Escape", "Q"]
# clear_canvas = ["D"]
# undo = ["U"]
# redo = ["R"]
# Emacs-style keybindings:
# exit = ["Ctrl+G"]
# undo = ["Ctrl+/"]
# redo = ["Ctrl+?"]
# clear_canvas = ["Ctrl+K"]
# Gaming-friendly (WASD area):
# exit = ["Q"]
# toggle_help = ["H"]
# undo = ["Z"]
# redo = ["X"]
# clear_canvas = ["C"]
# ═══════════════════════════════════════════════════════════════════════════════
# SYSTEM TRAY
# ═══════════════════════════════════════════════════════════════════════════════
[tray]
# Main tray icon rendering strategy:
# - "auto": theme-adaptive symbolic icon where supported, colored fallback otherwise
# - "symbolic": always request the theme-adaptive symbolic icon
# - "colored": always use the yellow fallback pixmaps
icon_style = "auto"
# ═══════════════════════════════════════════════════════════════════════════════
# UPDATE NOTIFICATIONS
# ═══════════════════════════════════════════════════════════════════════════════
[updates]
# Wayscriber never installs updates. This section only controls whether it tells
# you that a newer release exists and points at the instructions for your
# install method (https://wayscriber.com/docs/getting-started/updating.html).
# Ask https://wayscriber.com/latest.json whether a newer release exists.
# No Wayscriber or user identifier is sent, and the client version is suppressed.
# Set WAYSCRIBER_DISABLE_UPDATE_CHECK=1 to override this for a single run.
# If this file ever fails to parse, the check is skipped entirely rather than
# falling back to "on".
check = true
# Show one desktop notification per release. With this off, the notice still
# appears in the About window and the tray menu.
notify = true
# Hours between checks (minimum 1, maximum 720).
interval_hours = 24
# ═══════════════════════════════════════════════════════════════════════════════
# UI SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[ui]
# Overlay chrome theme
# Options: "auto", "dark", "light" ("auto" currently resolves to dark;
# "light" takes effect as overlay surfaces adopt the runtime theme)
theme = "auto"
# Reduce UI motion (disable animations)
# Options: "auto", "on", "off". "on" disables UI animations. "auto" is
# reserved for a future desktop-portal (system preference) query and
# currently behaves like "off" (full motion).
reduced_motion = "auto"
# UI language: overlay chrome (help, toolbars, menus, toasts, settings), the
# About window, background mode's tray and notices, and the configurator.
# Options: "auto", "en", "zh-CN". "auto" follows the desktop locale
# (WAYSCRIBER_LANGUAGE, then LANGUAGE/LC_ALL/LC_MESSAGES/LANG) and falls back
# to English when that locale has no translation. Each process reads this when
# it starts: the overlay and About window on their next open, background mode
# after a restart. `wayscriber --list-languages` shows the choices and the one
# in effect; `--language CODE` overrides this for one run.
language = "auto"
# Show the status bar and its configured contents
show_status_bar = true
# Allow clicking status bar segments to open their related controls (resting
# the pointer on one shows what it does); set false for a display-only status
# bar whose clicks pass through
status_bar_interactive = true
# Status-bar contents. Each item can be hidden independently. Visible items
# keep this fixed order; narrow layouts may compact labels and temporarily
# shed items without changing these choices. Mode badges such as
# FROZEN/ZOOM/PAN are separate.
# The active output appears only while two or more outputs are connected
# (and an output label is available); a single output's name is noise.
active_output_badge = true
# Show the active output even with a single output connected
active_output_badge_always = false
# Selection dimensions appear only while one or more shapes are selected.
show_status_selection_info = true
# Show board label in the status bar
show_status_board_badge = true
# Show page counter in the status bar
show_status_page_badge = true
# Show the current color dot
show_status_color = true
# Show the active tool name
show_status_tool = true
# Show the active tool size as a separate segment
show_status_size = true
# Show transient text/highlight context indicators when applicable
show_status_context_indicators = true
# Show a clickable status-bar hint chip (e.g. "F9 Toolbar") while every
# toolbar surface is hidden; set false if you run toolbar-less on purpose
show_toolbar_hint = true
# Show the Help shortcut segment
show_status_help = true
# Show the About/version segment. Off by default; the toolbar and the help
# overlay keep About one click away.
show_status_about = false
# Master visibility for the floating board/page badge. The
# toggle_floating_badge palette/keyboard action flips it for the current run
# only; this is the default it starts from.
show_floating_badge = true
# Also show the floating board/page badge when the status bar is visible
show_floating_badge_always = false
# Show a "FROZEN" badge when frozen mode is active
show_frozen_badge = false
# Status bar position
# Options: "top-left", "top-right", "bottom-left", "bottom-right"
status_bar_position = "bottom-left"
# Filter help overlay sections based on enabled features
help_overlay_context_filter = true
# Show compositor capabilities warning toast each time the overlay starts
show_capabilities_warning = true
# Show automatic first-run guidance, discovery tips, and shortcut coaching.
# Replay Tour still runs the first-run cards on request when this is false.
show_onboarding_hints = true
# Show rectangle and ellipse preview dimensions in logical board pixels, and
# the shape Shape Pen has recognized with its size (a line shows its length).
# This is separate from capture.region.show_size_readout.
show_shape_size_readout = true
# Command palette action toast duration (ms)
command_palette_toast_duration_ms = 1500
# Preferred monitor for GNOME fallback (xdg-shell) overlay. Case-insensitive match
# against monitor identity; leave empty to use the current/first monitor.
#preferred_output = "eDP-1"
# Enable output-cycling shortcuts on layer-shell compositors.
multi_monitor_enabled = true
# Request fullscreen for the GNOME fallback overlay. Disable if fullscreen appears opaque.
#xdg_fullscreen = false
# Behavior when GNOME fallback (xdg-shell) loses keyboard focus.
# "stay" (default on Ubuntu/GNOME) keeps it open. "exit" closes the overlay.
#xdg_focus_loss_behavior = "exit"
# Mouse button that toggles radial menu
# Options: "middle", "right", "disabled"
radial_menu_mouse_binding = "middle"
# ───────────────────────────────────────────────────────────────────────────────
# Floating Toolbar (F9 toggles; F2 cycles full -> micro -> hidden)
# ───────────────────────────────────────────────────────────────────────────────
[ui.toolbar]
# Toolbar frontend: "auto" uses GTK4-rendered toolbars on compositors where
# the bars get their own layer surfaces (Hyprland, KWin, Wayfire, ...) and
# the built-in toolbars everywhere else (GNOME, forced-inline, builds
# without the toolbar-gtk feature). "gtk" requests GTK4 explicitly (warns
# and falls back when unsupported); "builtin" always uses the built-in bars.
# Env override: WAYSCRIBER_TOOLBAR_BACKEND
backend = "auto"
# Toolbar layout preset: "simple", "regular" (the default), or "advanced"
# Simple: core pens and one Shapes picker. Regular adds Shape Pen, Line,
# Arrow, presets, and Clear. Advanced also puts Rectangle, Ellipse, Blur, and
# Spotlight on the strip (only polygons stay in the picker) and turns on the
# advanced actions and multi-step undo in the Canvas popover.
# "full" is accepted as a legacy alias for "regular"
layout_mode = "regular"
# Optional per-mode overrides for toolbar sections
# Use true/false to override a section; omit to use the mode default.
#
# [ui.toolbar.mode_overrides.simple]
# show_presets = false
# show_actions_section = true
# show_actions_advanced = false
# show_zoom_actions = true
# show_pages_section = true
# show_boards_section = true
# show_step_section = false
# show_text_controls = true
#
# [ui.toolbar.mode_overrides.regular] # Full mode overrides
# show_presets = true
# show_actions_section = true
# show_actions_advanced = false
# show_zoom_actions = true
# show_pages_section = true
# show_boards_section = true
# show_step_section = false
# show_text_controls = true
#
# [ui.toolbar.mode_overrides.advanced] # Legacy mode overrides
# show_presets = true
# show_actions_section = true
# show_actions_advanced = true
# show_zoom_actions = true
# show_pages_section = true
# show_boards_section = true
# show_step_section = true
# show_text_controls = true
# Show top toolbar on startup (pinned)
# These are the authored defaults. The pin buttons and the toolbar toggle
# keybinding update the remembered pinned state in runtime-ui.toml, which
# overrides these values; editing a value again takes over from that saved
# choice
top_pinned = true
# Start the top toolbar minimized to its edge restore tab
# The minimize button updates this; a minimized bar always leaves a
# clickable tab on screen to bring it back
top_minimized = false
# Display form of the top strip restored at startup: "full" or "micro"
# (one 44px round chip: active tool glyph + a ring in the current color).
# This is the authored default. The cycle keybinding and the micro chip
# persist their choice to runtime-ui.toml instead, and editing this value
# again takes over from that saved choice. A cycle-hidden strip is
# runtime-only and comes back per top_pinned
top_display_mode = "full"
# The unified top toolbar is the only layout. Drawing properties live in
# the top strip's contextual style pill; canvas management in the status
# HUD, board picker, and Canvas overflow popover; Session/Settings in
# popovers from the top strip's overflow menu. Older keys such as
# side_layout, side_pinned, side_minimized, side_active_pane,
# collapsed_sections, side_offset(_x), show_settings_section, and the
# retired items.order lists (side_sections, actions, pages, boards,
# presets, tool_options, sessions) remain readable and are preserved on
# save, but they no longer affect the running overlay.
# Use icons instead of text labels in toolbars
# Icons are more compact; text labels are more explicit
use_icons = true
# Scale factor for toolbar UI (icons + layout)
scale = 1.0
# Show extended color palette in top toolbar
# When enabled, displays additional color options beyond the basic 8
show_more_colors = false
# Show basic actions (undo/redo/clear) in the Canvas overflow popover
show_actions_section = true
# Show advanced actions (undo all, delay, freeze, etc.)
show_actions_advanced = false
# Show zoom actions (zoom in/out/reset/lock)
show_zoom_actions = true
# When the bottom-right zoom chip is shown
# Options: "always" (default; the chip is also the mouse entry point for
# zooming), "while-zoomed" (only while zoom is active — keeps the corner
# clean at 100%; zooming still starts via keyboard/scroll bindings)
zoom_chip_display = "always"
# Master visibility for the bottom-right zoom chip. The toggle_zoom_chip
# palette/keyboard action flips it for the current run only; this is the
# default it starts from.
show_zoom_chip = true
# Show page controls section (prev/next/new/dup/del)
show_pages_section = true
# Show board controls section (prev/next/new/del)
show_boards_section = true
# Show presets island in the top strip
show_presets = true
# Show step undo/redo section
show_step_section = false
# Keep text controls visible on every tool when context_aware_ui = false.
# With context-aware UI, font controls appear only for tools that draw text
show_text_controls = true
# Show timing delay sliders in the Canvas popover's Step section
# Allows configuring delayed undo/redo all timing
show_delay_sliders = false
# Keep the marker opacity control available in the style pill even when the marker tool isn't active
# Enable to keep marker transparency control visible at all times
show_marker_opacity_section = false
# Enable context-aware UI that shows/hides controls based on the active tool
# When enabled, only relevant controls appear (e.g., no color picker for eraser,
# and font controls only for text, sticky notes, numbered arrows, and step markers)
# Disable to always show all controls regardless of the active tool
context_aware_ui = true
# Show preset action toast notifications on apply/save/clear
show_preset_toasts = true
# Hide the top strip after ~4 seconds without drawing or toolbar use. It
# fades back in when the pointer comes near it or the top screen edge, and
# briefly after a tool or color shortcut. Set false to keep the bar always
# visible (accessibility).
idle_fade = true
# Show cursor tool preview bubble near the pointer
show_tool_preview = false
# Authored default top-toolbar offsets (layer-shell/inline). Dragging the
# strip persists its position to runtime-ui.toml instead of rewriting these;
# editing these values again takes over from the saved drag.
# Horizontal offset for the top toolbar
top_offset = 0.0
# Vertical offset for the top toolbar (move top bar down/up)
top_offset_y = 0.0
# Force inline toolbars even when layer-shell is available
force_inline = false
# Hold this modifier chord while clicking a bindable toolbar control to edit
# its shortcut. The captured chord applies immediately and is written back to
# that action's [keybindings] entry here, with the previous file copied to a
# timestamped .bak. A chord another action already owns is refused and nothing
# is written. Values: "ctrl_shift", "ctrl_alt", "shift_alt",
# "ctrl_shift_alt", or "disabled".
rebind_modifier = "ctrl_shift"
# How the style pill shows pen smoothing and Shape Pen recognition
# sensitivity while the Pen, Marker, or Shape Pen is up:
# "panel" (default): one "Pen feel" chip that opens a small panel with a
# level meter for each setting, a live preview of the smoothing, and a
# one-line description of each level
# "meter": inline level meters captioned Smooth / Shapes (click a bar or
# scroll over them)
# "stepper": inline "- value +" steppers captioned Smooth / Detect
stroke_controls = "panel"
[ui.toolbar.items]
# Checked in the configurator means shown; IDs listed here are hidden.
# Nothing is hidden by default; add "top.utility.screenshot" to hide the
# capture button beside Undo/Redo.
# Copy text (OCR) is hidden by a built-in baseline instead of by this list,
# so upgrading a config written before it existed cannot reveal it; enable it
# through toolbar customization, which records an entry in `shown` below.
# Section-level ids (side.group.*) act as explicit overrides that beat the
# layout-mode baseline and survive mode switches.
hidden = []
# IDs explicitly shown, overriding the layout-mode baseline (for example
# keeping presets visible in simple mode). The overlay updates this as you
# toggle sections.
shown = []
[ui.toolbar.items.order]
# Optional order overrides. Empty lists use the built-in order.
# Known IDs omitted from a non-empty list are appended in the default order.
# Historically named side.* item IDs still customize top-toolbar controls
# (Canvas/Session/Settings popovers, section visibility); do not rename them.
top_tools = [
"top.tool.select",
"top.tool.pen",
"top.tool.live-shape",
"top.tool.marker",
"top.tool.laser",
"top.tool.step-marker",
"top.tool.eraser",
"top.tool.line",
"top.tool.rect",
"top.tool.ellipse",
"top.tool.arrow",
"top.tool.blur",
]
top_controls = [
"top.utility.text",
"top.utility.sticky-note",
"top.utility.screenshot",
"top.utility.ocr",
"top.utility.clear-canvas",
"top.utility.highlight",
]
# ───────────────────────────────────────────────────────────────────────────────
# Status Bar Styling
# ───────────────────────────────────────────────────────────────────────────────
[ui.status_bar_style]
# Font size for status bar text
font_size = 15.0
# Padding around status bar text
padding = 11.0
# Background color [R, G, B, A] (0.0-1.0 range)
# Default: semi-transparent black (85% opaque for visibility)
bg_color = [0.0, 0.0, 0.0, 0.85]
# Text color [R, G, B, A] (0.0-1.0 range)
# Default: white
text_color = [1.0, 1.0, 1.0, 1.0]
# Color indicator dot radius
dot_radius = 6.0
# ───────────────────────────────────────────────────────────────────────────────
# Click Highlight (visual feedback for mouse clicks)
# ───────────────────────────────────────────────────────────────────────────────
[ui.click_highlight]
# Start with the highlight effect enabled when the overlay launches
enabled = false
# Show a persistent ring while the highlight tool is active
show_on_highlight_tool = false
# Radius of the highlight circle in pixels (16 - 160)
radius = 24.0
# Outline thickness in pixels (1 - 12)
outline_thickness = 4.0
# Highlight lifetime in milliseconds (150 - 1500)
duration_ms = 750
# Fill color [R, G, B, A]
fill_color = [1.0, 0.8, 0.0, 0.35]
# Outline color [R, G, B, A]
outline_color = [1.0, 0.6, 0.0, 0.9]
# Use current pen color for highlight fill/outline (alpha still comes from above colors)
# Note: active highlights update immediately when the pen color changes
use_pen_color = true
# Force-enable click highlights when entering light mode.
# Set false to keep the current click highlight state on light mode entry.
force_in_light_mode = true
# ─────────────────────────────────────────────────────────────────────────────
# Input HUD (on-screen keystrokes and clicks, for demos and screencasts)
# ─────────────────────────────────────────────────────────────────────────────
[ui.input_hud]
# Start with the input HUD enabled when the overlay launches
enabled = false
# Input source:
# "auto" - system-wide capture when available, else overlay-only (default)
# "overlay" - never reads /dev/input; shows only what Wayscriber receives
# "system" - requires system-wide capture; falls back to overlay with a
# warning toast. Needs a build with the `input-monitor` feature
# and read access to /dev/input (usually `input` group
# membership). System mode sees every keystroke on the seat,
# including passwords typed into other apps.
mode = "auto"
# Screen anchor for the chip row: top-left | top-center | top-right |
# center-left | center | center-right |
# bottom-left | bottom-center | bottom-right
position = "bottom-center"
# Show mouse buttons and scroll wheel
show_mouse = true
# Show taps of bare modifiers (Ctrl, Shift, Alt, Super) as their own chips
show_bare_modifiers = true
# How long a chip stays after its last press, before fading (200 - 30000 ms)
display_ms = 1600
# Fade-out duration (0 - 5000 ms)
fade_ms = 350
# Maximum number of simultaneous chips (1 - 16)
max_entries = 6
# Coalesce immediate repeats into a single chip with a xN counter
combine_repeats = true
# Chip label size in points (6 - 72)
font_size = 18.0
[ui.context_menu]
# Enable right-click / keyboard context menus
enabled = true
# ───────────────────────────────────────────────────────────────────────────────
# Presenter Mode
# ───────────────────────────────────────────────────────────────────────────────
[presenter_mode]
# Hide UI chrome while presenting
hide_status_bar = true
hide_toolbars = true
hide_tool_preview = true
# What hide_toolbars does to the top strip: "hidden" removes it entirely,
# "micro" collapses it to the 44px micro chip
toolbar_mode = "hidden"
# Close the help overlay when entering presenter mode
close_help_overlay = true
# Force click highlights on while presenting
enable_click_highlight = true
# Force the input HUD on while presenting
enable_input_hud = false
# Tool behavior while presenting:
# "keep" / "force-highlight" / "force-highlight-locked"
tool_behavior = "force-highlight"
# Show enter/exit toast notifications
show_toast = true
# Light passthrough mode requires layer-shell support:
# - toggle_light_mode enters a minimal click-through overlay while Wayscriber has focus.
# - wayscriber --light-toggle is the reliable compositor/global toggle once passthrough is active.
# Do not rely on the in-overlay F6 binding to exit after input is passed through.
# - wayscriber --light-draw-toggle switches between drawing and passthrough.
# - wayscriber --light-draw-on / --light-draw-off support press/release shortcuts.
# ───────────────────────────────────────────────────────────────────────────────
# Help Overlay Styling (Press F10 to toggle)
# ───────────────────────────────────────────────────────────────────────────────
[ui.help_overlay_style]
# Font size for help overlay text
font_size = 14.0
# Font family for help overlay text (comma-separated fallback list)
font_family = "Noto Sans, DejaVu Sans, Liberation Sans, Sans"
# Line height for help text
line_height = 22.0
# Padding around help box
padding = 32.0
# Background color [R, G, B, A] (0.0-1.0 range)
# Default: opaque deep slate, so the canvas never shows through the panel
bg_color = [0.09, 0.1, 0.13, 1.0]
# Border color [R, G, B, A] (0.0-1.0 range)
# Default: muted steel
border_color = [0.33, 0.39, 0.52, 0.88]
# Border line width
border_width = 2.0
# Text color [R, G, B, A] (0.0-1.0 range)
# Default: near-white
text_color = [0.95, 0.96, 0.98, 1.0]
# ═══════════════════════════════════════════════════════════════════════════════
# BOARD SETTINGS (Named Boards + Backgrounds)
# ═══════════════════════════════════════════════════════════════════════════════
[boards]
# Maximum number of boards allowed
max_count = 9
# Auto-create boards when switching to an empty slot
auto_create = true
# Show board name/slot in the status bar
show_board_badge = true
# Allow panning on solid-color boards with Space + left-drag
pan_enabled = true
# Show the pan hint in the status bar or as a floating badge
show_pan_badge = true
# Deprecated no-op, kept so older files still load without a warning.
# Board renames, recolors, additions, and deletions belong to the running
# session; the [[boards.items]] list below is the set of templates a new
# session starts from. This key is ignored and will be removed.
persist_customizations = true
# Default board id on startup
default_board = "transparent"
[[boards.items]]
id = "transparent"
name = "Overlay"
background = "transparent"
persist = true
[[boards.items]]
id = "whiteboard"
name = "Whiteboard"
# Paper: none, cartesian, isometric, or isometric-dots. Spacing: 8–200 logical px.
# Spacing is the square/triangle side length; 20 and 40 are convenient presets.
grid = { kind = "none", spacing = 40 }
background = { rgb = [0.992, 0.992, 0.992] }
# Tuned black #241F31; the built-in default bit-matches the "black" quick color
default_pen_color = { rgb = [0.141, 0.122, 0.192] }
auto_adjust_pen = true
[[boards.items]]
id = "blackboard"
name = "Blackboard"
background = { rgb = [0.067, 0.067, 0.067] }
default_pen_color = { rgb = [1.0, 1.0, 1.0] }
auto_adjust_pen = true
[[boards.items]]
id = "blueprint"
name = "Blueprint"
background = { rgb = [0.063, 0.125, 0.251] }
default_pen_color = { rgb = [0.902, 0.945, 1.0] }
auto_adjust_pen = true
[[boards.items]]
id = "corkboard"
name = "Corkboard"
background = { rgb = [0.420, 0.294, 0.165] }
default_pen_color = { rgb = [0.969, 0.890, 0.784] }
auto_adjust_pen = true
# ───────────────────────────────────────────────────────────────────────────────
# Color Theme Examples
# ───────────────────────────────────────────────────────────────────────────────
# Chalkboard Theme (green board):
# [[boards.items]]
# id = "chalkboard"
# name = "Chalkboard"
# background = { rgb = [0.11, 0.18, 0.13] }
# default_pen_color = { rgb = [0.95, 0.95, 0.8] }
# auto_adjust_pen = true
# Sepia Theme (vintage whiteboard):
# [[boards.items]]
# id = "sepia"
# name = "Sepia"
# background = { rgb = [0.96, 0.93, 0.86] }
# default_pen_color = { rgb = [0.29, 0.23, 0.18] }
# auto_adjust_pen = true
# ═══════════════════════════════════════════════════════════════════════════════
# RENDER COLOR PROFILES
# ═══════════════════════════════════════════════════════════════════════════════
[render_profiles]
# Optional profile id to preview on startup
# active = "print"
# Apply profiles to board backgrounds, annotations, and canvas-space previews
apply_to_canvas = true
# Apply profiles to screen-space UI chrome, toolbars, popups, and status text
apply_to_ui = true
# Accepted values: "off", "active", "profile".
# Explicit canvas PNG export applies this selector to persisted canvas content.
export = "off"
# Used only when export = "profile".
# export_profile = "print"
# Render profiles remap final rendered pixels by exact RGB match. Alpha is
# preserved, and colors not listed here are unchanged.
#
# [[render_profiles.profiles]]
# id = "print"
# name = "Print"
# mappings = [
# { from = "#000000", to = "#FFFFFF" },
# { from = "#FFFFFF", to = "#000000" },
# { from = "#FFFF00", to = "#8B4513" },
# { from = "#00FF00", to = "#006400" },
# ]
# ═══════════════════════════════════════════════════════════════════════════════
# SESSION PERSISTENCE
# ═══════════════════════════════════════════════════════════════════════════════
[session]
# Enable persistence per mode (default to true)
persist_transparent = true
persist_whiteboard = true
persist_blackboard = true
# Persist undo/redo history alongside shapes (set false to save only visible drawings)
persist_history = true
# Restore pen colour/thickness/font size (and arrow placement) between runs.
# When true, the last-used tool state overrides config defaults at startup.
# Set to false if you always want to use the values above (e.g., arrow head placement).
restore_tool_state = true
# Autosave session data while the overlay is running
autosave_enabled = true
# Save after this much idle time following a change (ms)
autosave_idle_ms = 5000
# Maximum interval between saves while dirty (ms)
autosave_interval_ms = 45000
# Backoff before retrying autosave after a failure (ms)
autosave_failure_backoff_ms = 5000
# Storage location: "auto" (XDG data dir), "config" (next to config), or "custom"
storage = "auto"
# CLI note: --session-file PATH bypasses this storage directory for that run and
# saves to exactly PATH, without creating missing parent directories.
# The overlay Session panel can Open, Save As, inspect, clear, and reopen recent
# named sessions. Save As appends .wayscriber-session when no extension is used.
# The configurator Session tab can rename/reveal/forget catalog entries, and can
# duplicate, move, or clear inactive session files when no overlay/daemon is running.
# Store separate sessions per monitor (set false to reuse one file per display)
per_output = true
# When storage = "custom", set the directory here (supports ~ expansion)
# custom_directory = "/path/to/persistent/sessions"
# Clamp runaway files by limiting shapes per frame
max_shapes_per_frame = 10000
# Optional cap for serialized undo history (defaults to runtime undo limit)
# max_persisted_undo_depth = 200
# Maximum session file size (in megabytes); image paste and autosave warn near this cap
max_file_size_mb = 50
# Compression mode: "auto", "on", or "off"
compress = "auto"
# For compress = "auto": minimum file size (KiB) before gzip is used
auto_compress_threshold_kb = 100
# Number of rotated backups to retain (0 disables backups)
backup_retention = 1
# ═══════════════════════════════════════════════════════════════════════════════
# DRAWING SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[drawing]
# Default pen color
# Options: "red", "green", "blue", "yellow", "orange", "pink", "white", "black"
# (named colors resolve to the tuned quick color palette, e.g. "red" = #F5333F)
# Or #RRGGBB hex: "#FFB3BA", or #RRGGBBAA for alpha: "#FFB3BA80"
# Or RGB array: [255, 0, 0], or RGBA array: [255, 0, 0, 128]
default_color = "red"
# Default pen thickness in pixels (1.0 - 50.0)
default_thickness = 3.0
# Default eraser size in pixels (1.0 - 50.0)
default_eraser_size = 12.0
# Default eraser mode: "brush" (pixel erase) or "stroke" (erase whole stroke)
default_eraser_mode = "brush"
# How the blur tool obscures its region by default
# "gaussian" - softens detail (historical behavior)
# "pixelate" - coarse mosaic of averaged blocks; block size follows the tool size
# "secure" - collapses the region to one averaged color; no detail survives
# "black-out" - opaque black fill; needs no captured background
default_blur_style = "gaussian"
# Default marker opacity multiplier (0.05 - 0.90). Multiplies the current color alpha.
marker_opacity = 0.32
# Font families the "Cycle Font Family" action steps through (Shift+T).
# Any installed family name works. An empty list turns the action off.
# Names are matched without case, so ["Sans", "sans"] loads as one entry.
# The configurator edits this as a row per font, each picking from the
# families installed on the machine.
font_cycle = ["Sans", "Monospace", "Serif"]
# How much a finished freehand or marker stroke is smoothed (0 - 6).
#
# 0 keeps the exact path the pointer drew. Higher values clean up the shake of
# the hand. Smoothing runs when you lift the pen, never while you draw, so the
# live stroke always sits exactly on the pointer. Neither endpoint ever moves.
#
# Also on the toolbar while the Pen, Marker, or Shape Pen is up, in the style
# pill's "Pen feel" panel (or its Smooth meter/stepper; see
# [ui.toolbar] stroke_controls).
# A session remembers the level it was saved at; this is the starting value.
pen_smoothing = 3
# Shape Pen recognition sensitivity (0 - 4): 0 is precise, 3 (the default)
# is forgiving, and 4 accepts the roughest lines and closed shapes. Applies to
# lines, ellipses, rectangles, and triangles; it does not change the dedicated
# shape tools or grid spacing.
#
# Also on the toolbar while Shape Pen is up, in the style pill's "Pen feel"
# panel (or its Shapes meter / Detect stepper; see [ui.toolbar]
# stroke_controls).
# A session remembers the level it was saved at; this is the starting value.
shape_recognition_sensitivity = 3
# Snap Shape Pen results to board paper: lines to nearby grid lines,
# rectangle and oval edges to Cartesian lines, and triangle corners to
# Cartesian lines or isometric points. Set to false to keep recognized shapes
# exactly where you drew them.
shape_recognition_grid_snap = true
# Briefly name the shape Shape Pen recognized, next to it, with the undo
# shortcut that turns it back into ink (for example "Circle · Ctrl+Z keeps
# ink"). The chip fades after about 1.5 seconds and never appears in exports,
# captures, or saved sessions. Set to false to hide it.
shape_recognition_feedback = true
# Default fill state for fill-capable shapes
default_fill_enabled = false
# Default regular polygon side count (3 - 12)
polygon_sides = 5
# Default font size for text mode (8.0 - 72.0)
default_font_size = 32.0
# Hit-test tolerance in pixels (1.0 - 20.0)
hit_test_tolerance = 6.0
# Number of shapes processed linearly before spatial indexing kicks in
hit_test_linear_threshold = 400
# Undo history size (10 - 1000)
undo_stack_limit = 100
# Drag gesture tool mapping (defaults match existing behavior)
# Allowed values use kebab-case drag-bindable tool names, e.g. "pen",
# "arrow", "eraser", "triangle", "regular-polygon".
# Freeform polygon is selectable from the toolbar picker but is not drag-bindable.
drag_tool = "pen"
shift_drag_tool = "line"
ctrl_drag_tool = "rect"
ctrl_shift_drag_tool = "arrow"
tab_drag_tool = "ellipse"
# Optional per-mouse-button drag mapping. These override the flat drag_tool
# fields above when present. Right/middle default to their built-in behavior
# unless configured here. Use "default" for a button's built-in behavior.
# Colors are optional and can be names, #RRGGBB or #RRGGBBAA hex strings, or
# RGB/RGBA arrays.
#
# [drawing.drag_tools.left]
# drag_tool = "pen"
# shift_drag_tool = "pen"
# shift_drag_color = "red"
#
# [drawing.drag_tools.right]
# drag_tool = "pen"
# drag_color = "blue"
#
# [drawing.drag_tools.middle]
# drag_tool = "default"
# ───────────────────────────────────────────────────────────────────────────────
# Font Configuration (Pango-based text rendering)
# ───────────────────────────────────────────────────────────────────────────────
# Font family name for text rendering
# Install fonts system-wide and reference by family name
# Examples to try:
# font_family = "Sans" # Default sans-serif
# font_family = "Monospace" # Fixed-width font
# font_family = "Serif" # Serif font
# font_family = "JetBrains Mono" # If installed
# font_family = "Fira Code" # If installed
# font_family = "Maple Mono NF" # If installed
# font_family = "DejaVu Sans" # Common on Linux
# font_family = "Liberation Sans" # Common on Linux
# font_family = "Noto Sans" # Google Noto fonts
# Falls back to "Sans" if the specified font is not available
font_family = "Sans"
# Font weight: "normal", "bold", "light", "ultralight", "heavy", "ultrabold"
# Or numeric: 100-900 (400 is regular; 700 renders at a bold weight).
# The toolbar Bold toggle is checked only for the literal word "bold" and writes
# "bold" or "normal"; numeric weights such as 700 therefore leave it unchecked.
# Try different weights:
# font_weight = "normal" # Regular weight
# font_weight = "bold" # Bold (default, best visibility)
# font_weight = "light" # Light weight
# font_weight = "600" # Semi-bold (numeric)
font_weight = "bold"
# Font style: "normal", "italic", "oblique"
# Try different styles:
# font_style = "normal" # Standard upright text
# font_style = "italic" # Italic/cursive
# font_style = "oblique" # Slanted text
font_style = "normal"
# Enable semi-transparent background box behind text for better contrast
# Set to true if you find text hard to read against complex backgrounds
# Default: false (no background, cleaner look with just stroke outline)
text_background_enabled = false
# Draw a contrasting outline around text and text-entry carets.
# Set to false for plain glyphs without the light/dark halo.
# Default: true
text_halo_enabled = true
# Ordered quick colors used by shortcuts, toolbar swatches, and radial menu.
# The first eight entries map to R/G/B/Y/O/P/W/K; if fewer are configured by
# hand, missing shortcut positions use built-in defaults and help-overlay badges
# follow those shortcut-backed entries. Extra entries have no shortcut action
# binding. Explicit extra entries appear in toolbar/radial palette UIs, capped
# to the first 24 rendered colors. Use known color names, #RRGGBB hex (or
# #RRGGBBAA to carry alpha), or RGB/RGBA arrays. The hex values below are the
# tuned built-in defaults; named colors ("red", "green", ...) resolve to these
# same tuned values, so named entries, the default pen color, and board
# auto-adjust pens all match these swatches.
#
# Right-clicking a swatch in the overlay opens the color picker for that slot
# and saves the accepted color back here as an RGB array, or an RGBA array when
# the color is translucent, keeping the slot's label and shortcut. Recoloring a
# slot this file only implies writes the palette out up to that slot, so a
# palette left out of this file stops tracking future built-in defaults from
# there on. That picker's "Default" button loads the color shipped for the slot
# again (built-in slots only), still requiring OK to save.
[[drawing.quick_colors]]
label = "Red"
color = "#F5333F"
[[drawing.quick_colors]]
label = "Green"
color = "#2EC27E"
[[drawing.quick_colors]]
label = "Blue"
color = "#3584E4"
[[drawing.quick_colors]]
label = "Yellow"
color = "#F6D32D"
[[drawing.quick_colors]]
label = "Orange"
color = "#FF7800"
[[drawing.quick_colors]]
label = "Pink"
color = "#C061CB"
[[drawing.quick_colors]]
label = "White"
color = "#FFFFFF"
[[drawing.quick_colors]]
label = "Black"
color = "#241F31"
[[drawing.quick_colors]]
label = "Cyan"
color = "#00FFFF"
[[drawing.quick_colors]]
label = "Purple"
color = "#9966CC"
[[drawing.quick_colors]]
label = "Gray"
color = "#666666"
# Example custom entry:
# [[drawing.quick_colors]]
# label = "Blush"
# color = "#FFB3BA"
# ═══════════════════════════════════════════════════════════════════════════════
# PRESET SLOTS
# ═══════════════════════════════════════════════════════════════════════════════
[presets]
# Number of visible preset slots (3-5)
slot_count = 5
# Each preset requires tool + color + size (thickness or eraser size).
# Optional fields let you capture fill, marker opacity, font size, etc.
[presets.slot_1]
# Optional label shown in UI tooltips
name = "Red pen"
# Tool: "pen", "line", "rect", "ellipse", "triangle", "parallelogram",
# "rhombus", "regular-polygon", "freeform-polygon", "arrow", "marker",
# "highlight", "eraser", "select"
tool = "pen"
# Color: name, #RRGGBB or #RRGGBBAA hex string, or RGB/RGBA array
color = "red"
# Size: pen thickness or eraser size
size = 3.0
# Optional overrides
marker_opacity = 0.32
fill_enabled = false
# Optional fill color, when a fill differs from `color` (written when a
# preset is saved from a shape filled with its own color)
# fill_color = "blue"
font_size = 32.0
text_background_enabled = false
arrow_length = 20.0
arrow_angle = 30.0
arrow_head_at_end = false
show_status_bar = true
# [presets.slot_2]
# name = "Blue marker"
# tool = "marker"
# color = "blue"
# size = 8.0
# marker_opacity = 0.32
# ═══════════════════════════════════════════════════════════════════════════════
# ARROW SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[arrow]
# Minimum arrowhead length in pixels. The head also scales with stroke width
# (three times the thickness), so this acts as the floor for thin strokes.
length = 20.0
# Arrowhead half-angle in degrees (15-60). Smaller is a sharper, narrower head.
angle_degrees = 26.0
# Place the arrowhead at the end of the line instead of the start
head_at_end = true
# Shape of the next arrow drawn: "standard", "pointy", "curved", or "double".
# Every arrow stores its own style, so this only seeds new ones — nothing
# already drawn is restyled, and the Cycle Arrow Style action changes it at
# runtime. "double" ignores head_at_end; "curved" starts with a gentle arc you
# can reshape by dragging the round handle at its midpoint.
style = "standard"
# ═══════════════════════════════════════════════════════════════════════════════
# PERFORMANCE SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
# Laser pointer: glowing ink that fades away on its own. Press `L`, click the
# laser next to Marker on the toolbar (Regular and Advanced layouts), or choose
# Laser Pointer Tool from the command palette. Laser ink is never saved, never
# undone, never selected, and never appears in captures or exports.
[laser]
# Ink color as [red, green, blue, alpha], each 0.0 - 1.0. Independent of the
# pen color; the color picker and quick colors do not change it.
color = [1.0, 0.16, 0.12, 1.0]
# Width of the bright core in pixels (2.0 - 30.0). The glow around it is about
# three times as wide.
width = 6.0
# How long the ink stays fully visible after you release, in ms (0 - 30000).
# Another stroke drawn before the ink has faded keeps the whole group on
# screen, so they all fade together.
hold_ms = 1200
# How long the ink then takes to fade out, in ms (0 - 5000). 0 removes it at
# once. With [ui] reduced_motion the ink stays solid and disappears in one step
# at the end of hold_ms + fade_ms.
fade_ms = 500
# Spotlight tool: dims the whole overlay except the regions you draw, so
# attention lands where you point. Select the tool from the toolbar or bind
# `select_spotlight_tool`.
[spotlight]
# Starting magnification for newly drawn spotlights (1.0 - 4.0). Existing
# spotlights keep their own saved value. The toolbar changes this in 0.25 steps.
magnification = 1.0
# How strongly the area outside every spotlight is dimmed (0.1 - 0.95)
dim_opacity = 0.6
# Fraction of each spotlight radius spent fading out at the edge (0.0 - 0.9).
# 0.0 gives a hard-edged opening.
feather = 0.35
[performance]
# Number of buffers for rendering (2, 3, or 4)
# 2 = double buffering (low memory)
# 3 = triple buffering (recommended, smooth)
# 4 = quad buffering (ultra-smooth on high refresh displays)
buffer_count = 3
# Enable vsync frame synchronization
# false lowers drawing latency; true prevents tearing and limits rendering to display refresh rate
enable_vsync = false
# Max FPS when VSync is disabled (0 = unlimited)
# 120 keeps pen latency low without uncapped CPU usage; set to 0 only for profiling
max_fps_no_vsync = 120
# UI animation frame rate (0-240; 0 = unlimited)
# Higher values smooth UI effects at the cost of more redraws
ui_animation_fps = 30
# ═══════════════════════════════════════════════════════════════════════════════
# HISTORY / STEP UNDO SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[history]
# Delay in milliseconds between steps for undo-all (50 - 5000)
undo_all_delay_ms = 1000
# Delay in milliseconds between steps for redo-all (50 - 5000)
redo_all_delay_ms = 1000
# Show the custom step undo/redo section in the toolbar
custom_section_enabled = false
# Delay in milliseconds between steps for custom undo (50 - 5000)
custom_undo_delay_ms = 1000
# Delay in milliseconds between steps for custom redo (50 - 5000)
custom_redo_delay_ms = 1000
# Number of steps to run for custom undo/redo (1 - 500)
custom_undo_steps = 5
custom_redo_steps = 5
# ═══════════════════════════════════════════════════════════════════════════════
# TABLET / STYLUS INPUT (Wayland tablet-unstable-v2)
# Build with `--features tablet-input` to use
# ═══════════════════════════════════════════════════════════════════════════════
[tablet]
# Enable tablet/stylus input at runtime (set false to opt out)
enabled = true
# Map pressure to thickness for pressure-sensitive freehand Pen strokes.
# Marker/Textmarker, Step Marker, and shape tools keep their selected sizes.
pressure_enabled = true
# Freehand Pen thickness range for pressure mapping
min_thickness = 1.0
max_thickness = 8.0
# Automatically switch to eraser when physical eraser is detected
auto_eraser_switch = true
# Threshold (in pixels) before saving a stroke as pressure-sensitive
pressure_variation_threshold = 0.1
# How thickness edits apply to pressure strokes: disabled, add, scale
pressure_thickness_edit_mode = "disabled"
# When to show thickness entry for pressure strokes: never, pressure_only, any_pressure
pressure_thickness_entry_mode = "pressure_only"
# Per-step scale factor when using scale mode (0.1 = +/-10%)
pressure_thickness_scale_step = 0.1
# Barrel button bindings.
#
# Each button can trigger a keybinding action on press (e.g. "toggle_radial_menu").
# Omit action to ignore the button.
# Prefer StylusPrimary / StylusSecondary under [keybindings]; these tablet
# nodes keep working until you move them in the configurator.
# Eraser switching is handled automatically via the physical tool type
# (controlled by auto_eraser_switch above), not via barrel buttons.
# Primary barrel button (BTN_STYLUS / button 331): open tool wheel
[tablet.stylus_button]
action = "toggle_radial_menu"
# Secondary barrel button (BTN_STYLUS2 / button 332): unbound
[tablet.stylus_button2]
# action = "undo"
# ═══════════════════════════════════════════════════════════════════════════════
# CAPTURE SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[capture]
# Enable screenshot shortcuts (set to false to disable all capture actions)
enabled = true
# Directory where PNG files are saved (supports ~ expansion)
save_directory = "~/Pictures/Wayscriber"
# Filename template (strftime-like subset: %Y, %m, %d, %H, %M, %S).
# Must be a single file name, not a path.
filename_template = "screenshot_%Y-%m-%d_%H%M%S"
# Image format for saved screenshots: png, jpg, or jpeg
format = "png"
# Copy screenshots to clipboard by default. Image writes smaller than 64 MiB
# are read back and retried once unless the PNG bytes match; larger writes
# trust wl-copy.
# Shortcut-specific actions may override this.
copy_to_clipboard = true
# Composite the active board's committed annotations into full-screen and
# region screenshots. Set to false for raw desktop pixels by default; the
# interactive region Review toggle can still override this per capture.
include_drawings = true
# Exit overlay after any capture completes (forces exit for all capture types)
# When false, clipboard-only captures still auto-exit by default.
# Use --no-exit-after-capture to keep the overlay open for a run.
exit_after_capture = false
# Languages used by "Copy text from screen" (OCR), in Tesseract's
# plus-separated form, for example "eng" or "eng+deu". The matching Tesseract
# language packages must be installed. OCR also needs `enabled = true` above.
ocr_languages = "eng"
[capture.region]
# "native" draws Wayscriber's picker over a frozen desktop image.
# "slurp" keeps the external selector. Native falls back to slurp when no
# screen capture backend is available.
# Native region selections are encoded and named as PNG. The explicit "slurp"
# picker keeps [capture].format for compatibility with the legacy grim path.
# On Hyprland and Sway, native selection also offers Space-triggered window
# snapping for visible windows on the active output and workspace when the
# picker creates a fresh auto-freeze (not when reusing an older Freeze/Zoom).
# Candidates reflect the workspace visible when the compositor query runs.
picker = "native"
# Pointer-side readout: position while idle, W x H in export pixels while dragging.
show_size_readout = true
# Magnified pixel loupe next to the pointer while dragging.
show_loupe = false
# Short hotkey legend at the top centre until the first drag.
show_legend = true
# ═══════════════════════════════════════════════════════════════════════════════
# EXPORT SETTINGS
# ═══════════════════════════════════════════════════════════════════════════════
[export.pdf]
# Optional PDF filename template. Leave unset or blank to reuse [capture].filename_template.
# filename_template = "board_%Y-%m-%d_%H%M%S"
# Optional all-board PDF filename template. Falls back to filename_template, then [capture].
# all_boards_filename_template = "boards_%Y-%m-%d_%H%M%S"
# page_size: "viewport", "a4", "letter", or "custom"
page_size = "viewport"
# orientation: "auto", "portrait", or "landscape"
orientation = "auto"
# fit: "viewport", "fit-viewport-to-page", or "fit-content-to-page"
fit = "viewport"
# transparent_background: "none" keeps transparent PDF pages blank; "desktop" captures
# the live desktop after hiding the overlay and places it behind transparent pages.
transparent_background = "none"
# Used only when page_size = "custom" (PDF points)
custom_width = 800.0
custom_height = 600.0
# Source-coordinate padding around content when fit = "fit-content-to-page"
content_source_padding = 24.0
[export.pdf.labels]
enabled = false
# position: "top-left", "top-right", "bottom-left", "bottom-right", or "bottom-center"
position = "bottom-center"
# content: "custom-template", "board-and-page", "document-page", "board-name", or "page-name"
content = "custom-template"
template = "{board_name} - {page_name} ({document_page}/{document_pages})"
font_family = "Sans"
font_size = 10.0
margin = 12.0
padding_x = 6.0
padding_y = 3.0
text_color = [0.1, 0.1, 0.1, 1.0]
background_enabled = true
background_color = [1.0, 1.0, 1.0, 0.85]