Repository navigation
Releases: assembledev/edgepad
Release list
v0.3.0
edgepad 0.3.0
- Firmware palm rejection: palm contacts reported by the touchpad no longer trigger edge gestures or slider actions, reducing accidental actions while typing. Enabled by default; set
palm_rejection = falseand restart to disable it. - Lower daemon memory use: gesture and slider histories no longer accumulate throughout the daemon’s lifetime.
- Shutdown: continuous input can no longer postpone the shutdown timeout indefinitely.
- Installer: the user service now reads the correct configuration when
XDG_CONFIG_HOMEis customized. - Replay: reversed capability ranges are rejected with a parsing error instead of crashing raw replay.
- CLI: consistent help and argument validation. Invalid arguments now exit with code 2.
- Diagnostics:
doctornow reports a missing or inactive daemon service as a failure. - Maintenance: reorganized the recognizer, proxy, CLI, configuration, diagnostics, and action worker into smaller modules, with additional lifecycle and scheduling tests.
v0.2.5
Edgepad 0.2.5 adds double tap gesture to touchpad edge zones.
What’s new
- Bind
direction = "double-tap"on any edge, including edges that also act as sliders. - Configure the sequence with
double_tap_timeout_msanddouble_tap_max_distancein TOML or the Home Manager module. - Combine
tapanddouble-tapon one edge without firing both actions: a completed pair emits onlydouble-tap; an unmatched first tap fires when its deadline expires. - Edges without a
double-tapbinding keep immediate single-tap behavior. - Tap recognition now has a maximum contact duration through
tap_max_duration_ms, preventing stationary holds from turning into taps.
Input correctness
The recognizer works with Type-B multitouch semantics, including slot reuse when the kernel omits unchanged coordinates. It cancels ambiguous sequences on overlapping contacts, excessive movement, long holds, slider steps, physical clicks, center passthrough, and SYN_DROPPED recovery. Pending taps also wake on an idle timer, so a single-tap action never waits for the next input event.
Config reload waits for active contacts and pending tap arbitration to settle, keeping one gesture sequence on one recognition profile.
Upgrade notes
- The default maximum tap duration is
180 ms. If deliberate holds previously counted as taps in your setup, raisetap_max_duration_ms. - The default double-tap gap is
300 ms, and the default normalized distance is0.04. - Double taps are single-finger sequences. Touching the pad with another finger cancels the pair rather than guessing across multi-touch input.
- When an edge has both bindings, its single-tap action can be delayed by up to the configured double-tap timeout. Other edges are unaffected.
The implementation is covered at the recognizer, replay, routing, config, Home Manager, action dispatch, reload, idle-deadline, and /dev/uinput integration layers.
Read the recognition design and exact input contract.
Full changelog: v0.2.4…v0.2.5
v0.2.4
Highlights
EdgePad v0.2.4 makes config iteration immediate and safe, and lets asymmetric touchpads tune each edge independently.
Transactional config reload
The running daemon can now reload its configuration with systemctl --user reload edgepad.service or SIGHUP, without releasing the physical touchpad grab.
- The complete candidate config is validated before it replaces the active one.
- Invalid reloads are rejected while the previous config keeps running.
- Reloads requested during an active contact wait until every finger lifts, so one contact is never interpreted using two configurations.
- Command-line overrides are preserved across reloads.
- Changing the configured input device remains restart-only because it changes physical device ownership.
The packaged systemd unit now exposes ExecReload, and the Home Manager module reloads for config-only changes while still restarting for package or device-selection changes.
Per-edge widths
The global edge_width remains the default, while left_edge_width, right_edge_width, top_edge_width, and bottom_edge_width can optionally override individual edges. Unset edges continue to use the global value, so existing configurations are unchanged.
Home Manager exposes the same behavior through services.edgepad.edgeWidths. The --edge-width CLI override continues to set one global width for all edges.
Compatibility
- Existing configs retain their current behavior.
- Device-selection changes still require a daemon restart.
- The portable systemd service gains reload support through
ExecReload=kill -HUP $MAINPID.
Full Changelog: v0.2.3...v0.2.4
v0.2.3
Highlights
edgepad v0.2.3 fixes two cases where releasing an edge contact could trigger an unintended tap, makes fast intentional taps easier to register, and improves edgepad dump for real-world bug capture.
Correct tap classification
A contact now remains eligible for a tap only while it stays inside the configured movement tolerance for its entire lifetime.
Crossing swipe_min_distance and then returning near the starting point no longer turns the contact back into a tap. Likewise, once a slider emits a step, releasing that contact does not emit an additional tap action.
The default tap_min_duration_ms has been reduced from 80 ms to 40 ms so quick intentional taps are less likely to be discarded.
More reliable dump capture
edgepad dump now supports the same automatic touchpad selection used by the daemon:
edgepad dump --device auto --out bug.ev --frames 300When the running daemon owns the touchpad through EVIOCGRAB, dump prints the selected device and warns after three seconds without events instead of silently producing an empty-looking capture. It continues waiting, so starting input later still works normally.
Frame-limited captures now treat --frames N as a minimum budget. If the budget is reached while a contact is active, dump keeps recording through its release frame and exits only after the touchpad is idle. This prevents replay files from ending in the middle of a gesture.
The devices command now uses --input-root consistently with the rest of the CLI; the previous --root spelling remains available as an alias.
Compatibility
Existing edgepad configuration files remain valid.
- Configurations that omit
tap_min_duration_msnow use 40 ms. Set it explicitly to80to retain the previous timing. dump --frames Nmay write more than N frame boundaries when needed to finish an active contact.
Full Changelog: v0.2.2...v0.2.3
v0.2.2
Highlights
edgepad v0.2.2 fixes physical touchpad button handling and makes capture, replay, and live diagnostics reproduce daemon behavior more accurately.
Physical clicks and click-drag
Physical touchpad buttons are now passed through to the virtual touchpad, including the device properties and button capabilities required by libinput.
On buttonpads and clickpads, a physical button press takes priority over edge recognition. Active edge contacts are promoted to normal passthrough contacts before the button event, allowing physical clicks and click-drag to work even inside configured edge zones.
The press cancels the pending edge gesture, while slider steps already emitted are preserved. Tap-to-click remains unchanged, and touchpads with separate physical buttons retain their existing edge behavior.
Held button state is also restored after SYN_DROPPED recovery and released during output cleanup, preventing stuck virtual buttons.
Config-aware diagnostics
edgepad proxy, edgepad replay, and edgepad replay-raw now use the normal edgepad configuration by default.
This keeps device selection, active zones, edge widths, swipe thresholds, tap timing, and sliders aligned with the running daemon. Use --config <file> to select another configuration or --built-in-defaults for an isolated recognizer profile.
Diagnostic replay and proxy commands report matched gestures and slider steps but never execute configured actions.
Timestamped capture and replay
Capture files now preserve the kernel timestamp for every frame boundary. Replay uses those timestamps to apply tap_min_duration_ms in the same way as the live proxy.
Both parsed and raw replay validate timestamp ordering, which makes tap and timing-related bugs reproducible from saved captures instead of approximating their behavior.
Documentation
Installation and onboarding documentation now follows the complete setup path for release and Nix users, including verification, updates, troubleshooting, emergency shutdown, and warnings before commands that grab the physical touchpad.
Compatibility
Existing edgepad configuration files remain valid.
Diagnostic command behavior has changed:
proxy,replay, andreplay-rawnow expect the default user config unless--configor--built-in-defaultsis provided.- Replay fixtures require a timestamp on every
SYN_REPORTandSYN_DROPPEDboundary. Older captures without timestamps should be regenerated or updated.
Full Changelog: v0.2.1...v0.2.2
v0.2.1
Highlights
edgepad v0.2.1 improves multitouch recovery, makes gesture distance consistent across touchpads, and makes release installs more portable and reliable.
Multitouch recovery after dropped events
edgepad now rebuilds its active multitouch state from the kernel after SYN_DROPPED.
Contacts that were already active are restored as normal passthrough contacts until release, rather than being reclassified as new edge gestures. The virtual touchpad is also settled before resynchronization, preventing stale or ghost contacts after an input queue overrun.
Consistent gesture distance
Swipe detection now uses normalized touchpad travel instead of raw device coordinates. The same physical gesture therefore behaves consistently across touchpads with different coordinate ranges.
The threshold defaults to 2% of the corresponding axis and can be configured explicitly:
swipe_min_distance = 0.02The Home Manager module exposes the same setting as services.edgepad.swipeMinDistance.
Portable release binary
GitHub Releases now ship a statically linked x86_64-unknown-linux-musl binary. It does not depend on the host's glibc loader, so the release installer works on NixOS and other x86_64 Linux distributions without compatibility wrappers.
The release workflow verifies that the binary has no dynamic interpreter before publishing it.
Installer and service readiness
- Re-running the installer now restarts an existing daemon instead of leaving the old process running.
- The installer verifies that
edgepad.serviceis active before running diagnostics. - Packaged systemd units use
Type=notifyand become active only after the virtual touchpad is created and the physical device is grabbed. edgepad statuscan report the ready daemon's PID, version, and selected device through systemd.- CI and release builds now require the locked Cargo dependency graph.
Compatibility
Existing configuration files remain valid. The default swipe threshold is now normalized to 2% of the relevant touchpad axis.
The release asset name changed from edgepad-x86_64-unknown-linux-gnu to edgepad-x86_64-unknown-linux-musl. The installer handles this automatically; manual downloads should use the new asset name.
Full Changelog: v0.2.0...v0.2.1
v0.2.0
Highlights
edgepad v0.2.0 adds continuous edge sliders, improves action responsiveness, filters accidental taps, and fixes a multitouch passthrough bug that could leave a stale virtual contact behind.
Continuous edge sliders
Touchpad edges can now act as step-based continuous controls such as volume and brightness:
[[sliders]]
zone = "left"
step = 0.04
up = ["pamixer", "-i", "3"]
down = ["pamixer", "-d", "3"]Side zones use vertical movement; top and bottom zones use horizontal movement. A slider can share its edge with a tap gesture.
Slider configuration is also available through the Home Manager module.
Accidental tap filtering
Very short edge contacts no longer trigger tap actions by default:
tap_min_duration_ms = 80
Set the value to 0 to restore the previous behavior. Directional swipes are unaffected by the tap-duration guard.
Multitouch passthrough fix
Fixed missing ABS_MT_SLOT context when a contact transitions into passthrough output.
This could leave the virtual touchpad with a stale active contact, causing ghost-finger behavior such as unexpected scrolling after mixed edge and center touches. Regression tests now cover passthrough contacts starting and ending after switching between multitouch slots.
Action and diagnostic improvements
- Reduced action command polling latency for more responsive repeated slider actions.
- Added slider information to status and doctor.
- Added slider-step statistics to proxy and replay summaries.
- Updated the example configuration and Nix documentation.
Compatibility
Existing gesture configurations remain valid. The only default behavior change is the new 80 ms minimum duration for tap gestures.
Full Changelog: v0.1.2...v0.2.0
v0.1.2
Highlights
- Added
edgepad statusfor a short daemon/config/device/zones/actions summary. - Improved
edgepad doctoroutput readability. - Report active and passthrough gesture zones in diagnostics.
- Claim only gesture zones that have configured bindings, leaving inactive edges as passthrough.
Full Changelog: v0.1.1...v0.1.2
v0.1.1
edgepad v0.1.1
Patch release focused on first-run UX, diagnostics, and installer rollback.
Highlights
edgepad daemonnow reads the default user config from~/.config/edgepad/edgepad.tomlwhen--configis not passed.edgepad daemonnow fails early if the config has no[[gestures]], instead of running with no useful actions.edgepad doctornow validates the config file, gesture bindings, configured device, and action executables.- Recognized gestures with no matching configured action are now logged.
- Action command failures now include gesture context.
install.shnow supports--uninstall.install.sh --uninstall --purgealso removes~/.config/edgepad.
Install or upgrade
curl -fsSL https://raw.githubusercontent.com/assembledev/edgepad/main/install.sh | shUninstall
curl -fsSL https://raw.githubusercontent.com/assembledev/edgepad/main/install.sh | sh -s -- --uninstallConfig is kept by default. Use --purge to remove it too.
v0.1.0
edgepad v0.1.0
Initial release.
Highlights
- Touchpad edge gestures for left, right, top, and bottom zones.
- User-session daemon with TOML config and command actions.
- Automatic touchpad detection with explicit
device = "auto"or/dev/input/eventX. edgepad doctorfor runtime diagnostics.- Startup retry for boot-time device/uinput/logind races.
- Release installer for x86_64 Linux with udev rules and systemd user service.
- Nix package, NixOS module, and Home Manager module.
- Debug tooling:
devices,dump,replay,replay-raw, and boundedproxy.
Assets
edgepad-x86_64-unknown-linux-gnu70-edgepad.rulesedgepad.serviceedgepad.toml.examplechecksums