Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Config File Overview

The config file lives at:

~/.config/wayscriber/config.toml

To start from the defaults:

mkdir -p ~/.config/wayscriber
cp /usr/share/doc/wayscriber/config.example.toml ~/.config/wayscriber/config.toml

If you built from source, use the repo file at config.example.toml. Some distros may install the example under /usr/share/doc/wayscriber/ (path can vary by package).

Applying changes

Use the configurator when you want validation and backups:

wayscriber-configurator

Or edit TOML directly and restart the running overlay or daemon:

systemctl --user restart wayscriber.service

For one-shot mode, close Wayscriber and start it again.

Configured defaults and runtime UI preferences

config.toml is the authored source for configured defaults. The configurator edits those defaults. Wayscriber stores some direct overlay customizations separately so a pin, collapse, or reorder action does not rewrite unrelated configuration:

  • top and side toolbar pin and minimized state;
  • the active legacy side pane and collapsed side sections;
  • individual toolbar item visibility and toolbar item order; and
  • per-board pin state.

The generated file is $XDG_DATA_HOME/wayscriber/runtime-ui.toml, normally ~/.local/share/wayscriber/runtime-ui.toml. Treat it as application state, not as a second configuration file, and do not hand-edit it. The configured values act as startup seeds; retained runtime overrides are applied on top. Toolbar drag positions and authored choices such as toolbar layout and section visibility still update their corresponding fields in config.toml.

Open the overlay’s Settings… popover to see the complete runtime-state path and status, reset runtime preferences, or recover from a failed save. A newer file version is kept read-only. Resetting a newer or invalid file requires confirmation and first preserves its exact bytes in a recovery artifact whose path is shown in Settings.

Writes are conditional on the exact file and parent directory that Wayscriber inspected. If another process changes or retargets the path, Wayscriber does not overwrite it; it blocks further runtime preference changes until you retry or adopt the freshly inspected disk state. If runtime-state persistence cannot start, overlay changes remain process-only and Settings reports that they will not survive restart.

Low-latency drawing

For live demos, teaching, and screen annotation, use low-latency mode when input responsiveness matters more than tear-free presentation:

[performance]
buffer_count = 3
enable_vsync = false
max_fps_no_vsync = 240
ui_animation_fps = 60

This is a high-refresh example. max_fps_no_vsync controls the drawing redraw cap when vsync is off; use 120 (the default) on common systems, or try 144, 165, 240, or higher if it matches your display and the machine handles the extra rendering work. Use max_fps_no_vsync = 0 only for profiling, because uncapped rendering can spin CPU/GPU hard.

ui_animation_fps controls toolbar and UI effects, not the drawing FPS cap. 60 makes those effects smoother than the default 30, at the cost of extra redraws while animations are active.

Keep buffer_count = 3 unless you have a specific reason to tune it. It is the balanced default: 2 uses less render-buffer memory, while 4 uses more. Buffer count affects how many render buffers are available; it does not raise the FPS cap by itself.

If tear-free presentation matters more than input latency, turn vsync back on:

[performance]
enable_vsync = true

Disabling vsync improves input latency but may allow tearing and higher CPU/GPU usage. Enabling vsync gives smoother tear-free synchronization, but usually adds a frame-cadence floor, especially on 60 Hz displays.

Wayscriber’s perf logging can be enabled with:

WAYSCRIBER_PERF_LOG=1 wayscriber

The relevant line is:

perf.input_to_paint_latency proxy=input_to_wayland_commit

This is an input-to-Wayland-commit proxy metric: it measures from input sample receipt inside the app to Wayland surface commit. Wayland compositor scheduling, display scanout, and hardware can add more latency outside the app. In local continuous-drawing measurements, 120 FPS low-latency mode held p95 around 8-9 ms and p99 around 8-9 ms for this proxy metric; isolated max spikes existed, but p99 stayed under 16 ms.

Interface layout and motion

The redesigned interface is configured under [ui] and [ui.toolbar]:

[ui]
theme = "auto"              # auto, dark, or light; auto currently resolves to dark
reduced_motion = "auto"     # auto, on, or off; on disables UI animation
status_bar_interactive = true

[ui.toolbar]
layout_mode = "regular"     # simple, regular, or advanced complexity
side_layout = "pill"        # pill (default) or deprecated panel
top_display_mode = "full"   # full or micro at startup
show_presets = true
show_zoom_actions = true      # Canvas Zoom section + bottom-right zoom chip
show_tool_preview = false

side_layout and layout_mode solve different problems. The default pill side layout removes the standalone side palette: drawing properties move into the contextual style pill; canvas management moves into the Canvas… overflow popover, bottom-right zoom chip, and chip-HUD board picker; presets move into the top strip; and Session / Settings move into overflow popovers. panel restores the legacy four-pane side palette and shows a once-per-session map to these replacement surfaces.

The Canvas popover’s Boards, Pages, Advanced, Zoom, and Step Undo/Redo sections reuse the existing show_* toggles. In particular, show_zoom_actions controls both the popover’s Zoom row and the persistent ⊖ NN% ⊕ Fit chip; Lock appears while zoomed. No new configuration key is required.

layout_mode changes only the baseline complexity of visible sections. Explicit item visibility choices survive switching between Simple, Regular, and Advanced. Changes made in the configurator are authored defaults; item visibility changes made from the overlay are runtime overrides stored in runtime-ui.toml.

F9 toggles toolbar visibility. F2 cycles the top strip through full, a 44px active- tool micro chip, and hidden. The full/micro choice persists; the hidden cycle step does not. When show_tool_preview = true, the cursor preview uses the active color and width, adds the tool glyph, and outlines itself for contrast.

Toolbar visibility and order

Hide individual toolbar items or whole side sections with stable IDs:

[ui.toolbar.items]
hidden = [
  "top.utility.screenshot",
  "top.tool.blur",
  "top.group.quick-colors",
]
shown = []

Checked in the configurator means shown. IDs in hidden are explicitly hidden; IDs in shown stay visible against the Simple/Regular/Advanced layout baseline. These explicit choices survive layout-mode changes. Unknown future IDs are preserved across saves so newer configs do not get destroyed by an older binary.

The same controls in the overlay’s Customize view create runtime overrides instead of rewriting these lists. Use Reset runtime preferences in overlay Settings to return to the configured visibility and order defaults.

top.group.quick-colors controls the quick swatches in the contextual style pill. The current-color chip stays visible so the full picker remains reachable. The 3–5-slot presets island follows show_presets rather than a per-slot item ID.

Reorder the supported groups with ui.toolbar.items.order:

[ui.toolbar.items.order]
top_tools = [
  "top.tool.select",
  "top.tool.pen",
  "top.tool.marker",
  "top.tool.eraser",
]

top_controls = [
  "top.utility.text",
  "top.utility.sticky-note",
  "top.utility.screenshot",
  "top.utility.clear-canvas",
]

side_sections = [
  "side.group.colors",
  "side.group.thickness",
  "side.group.actions",
  "side.group.pages",
  "side.group.boards",
  "side.group.settings",
]

Empty lists use the built-in order. Known IDs omitted from a non-empty list are appended in their default order. Side section ordering uses runtime section blocks; detailed tool-option sections such as eraser mode, polygon sides, and font can be hidden but are not independently orderable.

Named sessions

Default persistence is configured under [session]:

[session]
persist_transparent = true
persist_history = true
restore_tool_state = true
per_output = true
storage = "auto"
max_file_size_mb = 50

Use --session-file when you want a named session for a lecture, meeting, or project:

wayscriber --active --session-file ~/Documents/lecture-04.wayscriber-session
wayscriber --daemon-toggle --session-file ~/Documents/meeting.wayscriber-session
wayscriber --session-info --session-file ~/Documents/lecture-04.wayscriber-session
wayscriber --clear-session --session-file ~/Documents/lecture-04.wayscriber-session

--session-file uses the exact selected file and implies persistence for that run. It does not create missing parent directories, rejects directories/symlinks/special files for foreground Open/Save As flows, and conflicts with --no-resume-session.

See Sessions and Session Manager for CLI, overlay, and configurator workflows.