[Solved] - Keyboard duplicate keys

I have problems with the keyboard producing double characters on a regular basis.

The problem has been present ever since I got the laptop but is not always equally annoying so I have lived with it until now.

Fiddling with libinput and the like and keyboard repeat rates have not shown any improvement.

Today I have used a python script listening on evdev (on /dev/input/event2: AT Translated Set 2 keyboard) to debug the keyboard events and found that the double keys typically appear at a close to 30ms repeat rate, so there is no chance that it is mechanical or even my typing.

I wonder what my best chance is at solving this is. So far I have only the idea of opening the laptop up again and trying to check on the keyboard connections. Any ideas ?

Cheers Thomas

My system specs are:

inxi -b
System:
Host: zeno Kernel: 7.1.1-3-MANJARO arch: x86_64 bits: 64
Desktop: Cosmic v: N/A Distro: Manjaro Linux
Machine:
Type: Laptop System: Framework product: Laptop 13 (AMD Ryzen AI 300 Series)
v: A7 serial:
Mobo: Framework model: FRANMGCP07 v: A7 serial:
Firmware: UEFI vendor: INSYDE v: 03.05 date: 10/30/2025
Battery:
ID-1: BAT1 charge: 49.6 Wh (80.6%) condition: 61.5/60.6 Wh (101.6%)
CPU:
Info: 8-core AMD Ryzen AI 7 350 w/ Radeon 860M [MT MCP] speed (MHz):
avg: 623 min/max: 623/5091:3506
Graphics:
Device-1: Advanced Micro Devices [AMD/ATI] Krackan [Radeon 840M / 860M
Graphics] driver: amdgpu v: kernel
Device-2: Framework Laptop Webcam Module (2nd Gen) driver: uvcvideo
type: USB
Display: wayland server: X.org v: 1.21.1.23 with: Xwayland v: 24.1.12
compositor: cosmic-comp driver: X: loaded: amdgpu
unloaded: modesetting,radeon dri: radeonsi gpu: amdgpu
resolution: no compositor data resolution: 2256x1504
API: OpenGL v: 4.6 vendor: amd mesa v: 26.1.2-arch1.2 renderer: AMD
Radeon 860M Graphics (radeonsi krackan1 ACO DRM 3.64 7.1.1-3-MANJARO)
Info: Tools: api: eglinfo,glxinfo x11: xprop
Network:
Device-1: MEDIATEK MT7925 Wi-Fi 7 160MHz driver: mt7925e
Drives:
Local Storage: total: 931.51 GiB used: 338.47 GiB (36.3%)
Info:
Memory: total: 32 GiB note: est. available: 30.63 GiB
used: 11.19 GiB (36.5%)
Processes: 484 Uptime: 48m Shell: Zsh inxi: 3.3.41

Welcome to the community!

It’s either a hardware problem, a software problem, or human error. From what you’ve said, I agree that it doesn’t sound like human error.

I’ve never seen a software problem that would cause something like this, though technically it could happen. Have you ever reinstalled your OS? You could also try an external (wired or wireless) keyboard, if you have or can borrow one, to see if it shows the same symptoms. If it does, it’s almost certainly a software problem.

If it’s neither of those, the only thing left is a hardware problem. I’m not all that familiar with the FW13 (never used one, I’ve got FW16s), but carefully taking the system apart, and checking and re-seating the keyboard connections, does seem to be the logical next step.

That may well solve the problem with no further effort, but if it doesn’t, I’d suggest talking to Framework’s support team. It may turn out to be a lemon of a keyboard, which could be replaced under warranty.

This may be incorrect but I thought I’d throw it out there as something to try. I vaguely recall having repeated characters and skipping on one of my machines, and disabling power saving for the keyboard resolved it. Best of luck getting to the bottom of things, I will be following along to see how you wind up resolving the issue.

Weirdly it is not working although it appears my problem might be connected. I had a lengthy period with no double characters detected (by me or my script) while I was charging the device. Soon after I pulled the plug I got double characters again.
I did ``echo on | sudo tee /sys/bus/serio/devices/serio0/power/control``` to switch off power saving. Do you remember what you did ?

After talking framework support into sending me a new input cover, the problem was not fixed, so I set an AI agent (claude) on to the task. Should have done that earlier: The report from claude is as follows:

The rapid duplicate letters come from the keyboard firmware, not from you. Your imprecise typing does play a part, but only as the trigger. That’s why the new input cover didn’t help.

What the log shows. I parsed all 4,125 reports in ~/chatter-detector.log (2026-07-07 to today). 2,878 of them have the same shape:

  • First press held 15–25 ms. A normal tap of yours is 50–100 ms.
  • Then a gap of 29–34 ms before the same key goes down again.
  • The rate never changed: about 50 a day from July to today, with no drop after the cover swap.

Every gap lands on a ~3.3 ms grid, which is the keyboard controller’s scan clock. Only 3.6% of these happened while another key was held, so it isn’t from hitting two keys at once. The median time since your previous keystroke was 334 ms, so these are calm keystrokes, not fast mashing.

Why it happens. Framework’s own firmware source (FrameworkComputer/EmbeddedController, branch fwk-lilac-27116, keyboard_customization_13.c) sets two waiting times:

  • after a key goes down, the controller ignores that key for 20 ms;
  • after a key comes up, it ignores it for 30 ms.

These timings are reported the instant they’re seen and only blocked afterwards. Framework could switch on a stricter debounce mode that waits for the contact to settle first (CONFIG_KEYBOARD_STRICT_DEBOUNCE), but it doesn’t. So when the contact flickers open for a single scan during a press, this happens:

  1. At 20 ms the controller reports the key as released.
  2. It waits 30 ms.
  3. Your finger is still on the key, so it reports a new press.

One physical stroke becomes two characters. The 20 ms and 30 ms values match your two clusters exactly.

Where your typing comes in. Without per-key press counts this is only a rough comparison against normal letter frequency, but it’s clear:

  • Frequent: stretch and bottom-row keys (V, G, B, C, M) and pinky/ring-finger keys (A, L, Backspace, Up).
  • Rare: top-row keys you hit with a curled finger (E, R, T, O, I), even though E is the most common letter. T and R are wired on the same line as G, V and B, so it isn’t a bad circuit.

Hitting a key off-centre makes the contact flicker. Both covers behave the same because the cause is your finger angle combined with the firmware. The “fine while charging” pattern from your July forum post didn’t show up here: today you’ve been on AC all day and still got 41.

What you can do:

  1. Filter it in software (recommended). Have the detector grab the keyboard, hold back each key-release for about 36 ms, and drop a release followed by a re-press of the same key inside that window. That gives the strict behaviour Framework doesn’t ship. It’s safe because nobody can deliberately press the same key twice that fast; real repeats are at least ~60 ms apart. Key-presses get no extra delay, only releases do. I can build this into chatter-detector if you want.
  2. Ask Framework to enable the stricter debounce in the controller firmware. Add the evidence above to your forum thread ( Keyboard duplicate keys ).
  3. Type with more vertical strikes on the stretch and pinky keys. That reduces it but won’t fully stop it.

The findings are recorded in the cachyos skill under Keyboard double presses (commit 79ae5fd). The analysis scripts are in ~/claude-sysadm/tmp/.

result: Your duplicate keys come from the controller firmware: it reports changes instantly and only then waits 20/30 ms, so a contact flicker from off-centre hits types twice; a software filter in chatter-detector would fix it.

Sources:

  • Framework forum: Keyboard duplicate keys (
  • Framework forum: Keyboard adding extra keys
  • Chromium EC keyboard_scan.c
  • FrameworkComputer/EmbeddedController

I installed the fix that claude suggested (a rust binary he wrote earlier to analyse the keyboard output, now also filtering the duplicate events) and it works fine for me in my setup. I have seen multiple duplicate keys in the logs but they don’t make it into my writing any more.

The fix works for linux, probably needs a little configuration depending on flavor, because it filters the events into a virtual keyboard that then replaces your main keyboard.

If you want to try the fix, I am happy to share it.

According to these findings the problem is at its root a combination of my fat fingers and an insufficient debouncer in Framework BIOS firmware.

Cheers Thomas

I started noticing the issue ever since I upgrade the firmware on my keyboard. I’m running a 70 series Framework 16 with Rocky 9. The firmware I upgraded to was 0.31

Is there a way to resolve this on our own or will we have to wait for a patch from Framework?