Skip to content

Releases: assembledev/edgepad

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Oct 12:29
1240f56

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 = false and 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_HOME is 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: doctor now 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

Choose a tag to compare

@github-actions github-actions released this 24 Aug 09:13
ce30e4a

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_ms and double_tap_max_distance in TOML or the Home Manager module.
  • Combine tap and double-tap on one edge without firing both actions: a completed pair emits only double-tap; an unmatched first tap fires when its deadline expires.
  • Edges without a double-tap binding 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, raise tap_max_duration_ms.
  • The default double-tap gap is 300 ms, and the default normalized distance is 0.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

Choose a tag to compare

@github-actions github-actions released this 10 Aug 13:56
5232e91

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

Choose a tag to compare

@github-actions github-actions released this 24 Jul 12:06
51c932d

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 300

When 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_ms now use 40 ms. Set it explicitly to 80 to retain the previous timing.
  • dump --frames N may write more than N frame boundaries when needed to finish an active contact.

Full Changelog: v0.2.2...v0.2.3

v0.2.2

Choose a tag to compare

@github-actions github-actions released this 18 Jul 14:56
b6d876a

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, and replay-raw now expect the default user config unless --config or --built-in-defaults is provided.
  • Replay fixtures require a timestamp on every SYN_REPORT and SYN_DROPPED boundary. Older captures without timestamps should be regenerated or updated.

Full Changelog: v0.2.1...v0.2.2

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 11 Jul 11:01
b334b4d

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.02

The 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.service is active before running diagnostics.
  • Packaged systemd units use Type=notify and become active only after the virtual touchpad is created and the physical device is grabbed.
  • edgepad status can 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

Choose a tag to compare

@github-actions github-actions released this 10 Jul 09:14
ac96845

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

Choose a tag to compare

@github-actions github-actions released this 07 Jul 19:19
5f9310f

Highlights

  • Added edgepad status for a short daemon/config/device/zones/actions summary.
  • Improved edgepad doctor output 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

Choose a tag to compare

@github-actions github-actions released this 05 Jul 09:34
b0da562

edgepad v0.1.1

Patch release focused on first-run UX, diagnostics, and installer rollback.

Highlights

  • edgepad daemon now reads the default user config from ~/.config/edgepad/edgepad.toml when --config is not passed.
  • edgepad daemon now fails early if the config has no [[gestures]], instead of running with no useful actions.
  • edgepad doctor now 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.sh now supports --uninstall.
  • install.sh --uninstall --purge also removes ~/.config/edgepad.

Install or upgrade

curl -fsSL https://raw.githubusercontent.com/assembledev/edgepad/main/install.sh | sh

Uninstall

curl -fsSL https://raw.githubusercontent.com/assembledev/edgepad/main/install.sh | sh -s -- --uninstall

Config is kept by default. Use --purge to remove it too.

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Jul 14:50

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 doctor for 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 bounded proxy.

Assets

  • edgepad-x86_64-unknown-linux-gnu
  • 70-edgepad.rules
  • edgepad.service
  • edgepad.toml.example
  • checksums