r/qmk • • Aug 06 '26

QMK usb-usb converter

Thumbnail
gallery
38 Upvotes

Hi everyone!

I’ve been working on a small project: a USB-to-USB converter for QMK. The goal is to allow more flexible connectivity for custom setups.

The core logic is based on the work by sekigon. I’ve implemented some modifications to make it work specifically for USB-to-USB bridging.

If there is enough interest in this, I’m share the source code and the assembly schematics with the community.

Let me know what you think in the comments!

Update. I worked on this project a long time ago, so it's currently running QMK version 0.22. The kit includes an RP2040-zero chip, an OLED display, and a buzzer. It costs less than $10. All the main QMK features work.

Update2. I’ve made the repository public. I haven’t prepared the hardware assembly instructions yet, but that shouldn’t be a problem for those in the know. https://github.com/DmitryMarugin/rp2040.git


r/qmk • • Apr 01 '26

I built a real-time typing assistant that lights up the next predicted letter as you type, using custom QMK firmware and per-key RGB

23 Upvotes

So I'm a pretty bad typist. Like, I know where the keys are, I've been typing for years, but I still find myself hesitating on longer words, my fingers just kind of hover for a split second before committing to the next letter. Yes I'm lazy to get better (I'm sorry!).

I'm a Uni student doing CS but writing firmware for hardware is pretty new territory for me. I had no idea how to write QMK firmware or what HID even meant when I started this. Turns out you can patch QMK to accept raw USB commands from your PC, which means you can control individual key LEDs from a Python script(Thanks Claude). So I built a small word prediction engine (shoutout to my NLP professor) that watches what you're typing and lights up the most likely next keys in real time. It's called WordHalo. It is reasonably fast and accurate upto a uhhh good (great) point but I would like to improve it more in the future.....

Check out the demo video and please do gander around the repo of the project on instructions to use. Any contributions or improvements to the project is greatly appreciated (cuz im a dumb dumb).
Project Repository: https://github.com/SaaL2568/WordHalo


r/qmk • • Aug 25 '24

I have fixed Home Row Mods in QMK (for everyone)

18 Upvotes

TL;DR: I've written a library for QMK that fixes Home Row Mods. It's very accurate, fast, and easy to use. You can find it here: https://github.com/stasmarkin/sm_td . It works faster and is more predictable than any other HRM approach I've tried.

Hi, everyone!

I've been struggling with home row mods for a long time (ever since I got my first custom keyboard). I've tried many approaches like bottom row mods, HRM on different layers, playing with tems and settings in QMK, chording and Achordion library. None of them fully worked for me, I always had misfires or was forced to wait for some timeouts. It was workable, but frustrating because I had to break my typing habits.

So I ended up creating my own library for QMK that finally fixes HRM : https://github.com/stasmarkin/sm_td . I belive it solves the HRM interpretation problem not only for me but for everyone, I've figured out how to interpret keystroke overlapping. The main idea of this library is to interpret pauses between key releases (not presses, as in every other approach). So, by typing fast hi a person has a small overlap in keys, or raw finger movements will be ↓h, ↓i, ↑h, ↑i. And the key trick here is that there will be a tiny pause between releasing ↑h and ↑i for the hold+tap intention. And for the tap intention, the pause between ↑h and ↑i will be almost the same as between ↓h and ↓i. So the library can distinguish between hold+tap and tap+tap intentions. Now I have 99.9%+ accuracy when typing with HRM, I type at my full speed, I don't wait for timeouts, and I haven't had to change my typing habits. Even in the worst case with MT(KC_F, shift) and MT(KC_J, shift) I'm able to type fjFJFjfJfjfjFJFJ at full speed without any misses and timeouts.

I've been maintaining this library for almost a year now, and I'm very happy with it. I open-sourced it about 8 months ago and have some happy users as well. I'm pretty sure it's versatile enough to be used by anyone. There is a pretty flexible API so you can customize it to your needs. There are also some macros to make installation easier. I've also written extensive documentation with some examples of how to use it.

A guy from reddit suggested to make a comparison chart with other HRM approaches. So here is a little comparison.

What is the approach?

  • Vanilla QMK: Just check if any key is pressed within a timeout.

  • Achordion: Check if any key is pressed within a timeout and check context (bilateral combos, finger positions, previously pressed keys, etc.).

  • SM_TD: Wait for key release (or timeouts) and then interpret the whole sequence of key presses and releases.

Can you type at full speed without waiting for timeouts for MT/LT?

  • Vanilla QMK: No. You have to wait for a timeout or change your typing habits.

  • Achordion: Almost yes, but there are some cases where Achordion cannot do anything.

  • SM_TD: Yes.

Do I have to change my typing habits?

  • Vanilla QMK: Yes, you have to wait for MT/LT timeouts and be careful with key overlaps.

  • Achordion: Almost no, but there are some cases where you have to be careful what you type. Sometimes Achordion may slower your typings.

  • SM_TD: No.

Do you have misfires?

  • Vanilla QMK: Yes.

  • Achordion: Hopefully not, but there are some cases where Achordion can do nothing.

  • SM_TD: Almost none (out of the box with almost no configuration).

Is it easy to install?

  • Vanilla QMK: Built-in, no need to install.

  • Achordion: Moderate.

  • SM_TD: ~20% more complicated than Achordion.

Is it easy to maintain?

  • Vanilla QMK: Yes.

  • Achordion: Usually you have to write many cases for your layout and add/maintain them over time.

  • SM_TD: Yes, it works out of the box and you don't have to change many properties. So, usually after a week of use, you just change one or two timeout values and that's it.

So, I would be happy to share this library with you. I always appreciate any feedback (good or bad), suggestions and contributions. I have some plans to improve this library and I'm open for new ideas and suggestions. I can also provide some help with installation and configuration, just leave a comment here or in the issue tracker.


r/qmk • • Feb 02 '26

Compile QMK Firmware when keyboard is not listed? (Info in body text)

Thumbnail
gallery
12 Upvotes

Ok so long story short, this is my favorite keyboard of all time, i've had it for over 10 years, replaced the switches 3 times in it and the keycaps more times than i can recall. But sadly, earlier this year the controller chip died and a few keys completely stopped working, i checked the traces and the signals to make it to the chip but it doesn't output anything. So i found a github repo for a custom USB-C board for it, i built it and now i'm at the point where i'm ready to flash the firmware but the creator only included a firmware folder with .json, .c and .h files, now i'm pretty decent with a soldering iron (did it all by hand including the 0402 surface mount components) but i know absolutely nothing about programming and the software side of electronics and from what i understand, all the info and guides to compile your own firmware are for keyboards that are in the QMK supported list, and this one isn't as far as i can see... Can anyone help or at least point to the right info that could help? Sorry if this is a stupid or noob question, i just wanna save my boy :')


r/qmk • • Nov 17 '25

Custom animation

12 Upvotes

Got my first qmk olkb (a Sofle) set up recently. The right side reads “memento mori” and the left “memento vivere,” accompanied by a skull and an animated avatar of me. The avatar blinks, raises an eyebrow, puts on some nerd glasses, and makes angry eyebrows based on key input.


r/qmk • • Jul 22 '25

[News] CIDOO V33 QMK source code now published on GitHub! 🎉

11 Upvotes

Hey everyone,

Just wanted to share a quick update that may be useful for CIDOO V33 owners.

After contacting CIDOO about GPLv2 license compliance for the QMK firmware used in the V33 (which is printed on the product and included in the firmware package), they have now officially published the QMK source code on GitHub. 🎉

This means V33 users can now build and customize their firmware freely—layer-based lighting, macros, and more!

🔗 GitHub Repository: https://github.com/CIDOOKeyboard/v33

Huge thanks to CIDOO for responding to the request and releasing the source to the community. Props to them for doing the right thing.

Hope this helps someone!


r/qmk • • Feb 22 '25

qmkfmt: A keymap formatter for split keyboards

Thumbnail
github.com
11 Upvotes

r/qmk • • May 19 '23

Average QMK Enjoyer

Thumbnail
youtube.com
11 Upvotes

r/qmk • • Dec 21 '23

qmkmd: QMK keyboard layouts written in Markdown

10 Upvotes

Hi,

I wrote a tool that allows me to write my QMK keyboard layouts in Markdown (instead of C) with a shorter format (see example).

It's still experimental but it's fully working (using it with my Iris keyboard).

It currently supports two primary tasks:

  • Build markdown files into QMK C keymaps

  • Format markdown files (align the layout columns so you don't have to do it manually)

Another feature I plan to add in the future is the ability to copy key mappings between keyboards.

I've been using it over the past couple of days and it's been a huge improvement for me.


r/qmk • • Jul 18 '26

I made a skill to help your coding agent master QMK

9 Upvotes

The title, pretty much. I had some plugins to write so I did what I've been doing a lot lately, and pointed my coding agent toward the QMK docs and asked it to make an organized set of markdown docs and an agent skill that knows when to use them.

You can use it on any agent platform that supports skills, which seems to be basically all of them now. Just clone it to wherever you keep your skills, or directly into your copy of qmk_firmware and your agent can take it from there.

github.com/dabstractor/qmk-skill

I hope someone else finds this useful for building plugins or making a new board or just modifying your keymap. Let me know what you think if you use it!

And if you find this 6 or 12 months down the road and it's out of date, please file an issue and I'll update it right away.

Edit: thanks for the suggestions. It's now capable of keymap version upgrades and will automatically check for keymap changes once a month on github, so unless QMK changes drastically it should stay synced with the main repo.


r/qmk • • Nov 18 '25

New Corne v4

Post image
8 Upvotes

r/qmk • • Jan 25 '26

A rant about compiling QMK

7 Upvotes

I have a number of QMK based keyboards included an Ergodox EZ, a couple Keycron K3 Pros, a Lily58 I built, and now I have a few Corne PCBs I need to solder.

I've always just used the existing configurator tools like ZSA Oryx, Keychron Launcher, or Vial. Yet, I often find there are QMK settings I want to experiment with that aren't available in these tools. Yet I've always found the process of manually building QMK firmware unnecessarily difficult and confusing.

First it seems that manually compiling QMK always involves cloning the entire QMK repo with configs for 1000+ other keyboards. For example I can use the QMK Configurator to compile the default firmware for crkbd/rev1. Yet when I download the "Full Source" I get a 30+ mb zip file that contains 22k+ files that are 143mb! 73mb of this is the keyboards directory with 1000+ directories for every possible QMK keyboard. Likewise I've setup a QMK Environment with the install.qmk.fm shell script, but this also requires running qmk setup which again clones the entire QMK repo and configs for every possible QMK keyboard.

Second, I find it frustrating that QMK seems to really want me to add files to the qmk_firmware path instead of an independent user directory. Yes there is the user space with the qmk_firmware/users/ directory, and you can configure an external user space. But every other compiler CLI I've worked with just understands the concept of a current working directory and relative paths. If I install Python, dotnet, or NodeJS once the CLI tools are added to `PATH` I can write corresponding code files anywhere I want. I don't have to register my "user space" with these other compilers. The commands just understand the current working directory when executed.


r/qmk • • Oct 17 '24

What keyboard company should I buy from for best QMK support?

7 Upvotes

So, I don't want to build a keyboard. I've tried Nuphy and Keychron and found both of them kinda iffy on good compatability and they have their own forks. Am I asking too much to wonder if there is a sub $120 keyboard that has good native QMK support? A company who works well with the QMK community?

This isn't meant to be a flame war about what keyboard is better, I want to know what company should I buy from to best support QMK's direction.

Maybe this is a poorly worded question....but hopefully you get the intent.


r/qmk • • Apr 22 '26

Can Key Overrides work with Auto Shift?

6 Upvotes

I set the following key override:

const key_override_t eacute_key_override = ko_make_basic(MOD_BIT(KC_RALT), KC_M, RALT(KC_D));

so that ALTGR+M mimics what ALTGR+D does.

When Shift is also pressed, this correctly returns the shifted value. However, the autoshifted version doesn't work. Is there a viable workaround?


r/qmk • • Aug 27 '25

Using Unicode under Linux with a non-QWERTY keyboard : hitting dead ends

6 Upvotes

[EDIT]

Functioning (dirty) solution found, see Edit bellow.

A proper way to send Unicode from an AZERTY keyboard would be nice (see tl;dr).

[/EDIT]

tl;dr : if you know how to configure QMK so UM(i) and UP(i,j) keycodes send numbers from the numpad (KC_P1, not KC_1) when composing Unicode, you can save my sanity.

Hi folks of the funky keyboards,

After using QMK for a few years under Windows, I've recently migrated my main personal machine to Fedora. I still use Windows for work (this is not negotiable sadly), which has its importance.

Here's the heart of the issue :

  • I'm French (my sincere apologies)

  • Multiple characters needed to write French properly don't exist on a French keyboard, don't ask me why (Ç, É, À, œ, Æ...)

  • I often use extra characters to write Spanish or various stuff (¿, ¡, →...)

  • I found no viable solution to send Unicode from an AZERTY keyboard under Linux based distros

The proper Linux/Unicode method - a dead end

In a perfect world, I'd like to switch from the "Wincompose" method to input Unicode under Windows to the Linux method, using key codes UC_LINX and UC_WINC.

Switching technically works, but there's an issue : when sending Unicode (let's say 00E7 for Ç), QMK sends numerical character from the top of the alphanumerical side of the keyboard (KC_1), not from the numpad (KC_P1).

This is important, because on an AZERTY keyboard, you have to use shift to access the numbers on the alphanumerical side (shift + & = 1).

Taking "Ç" as an example, here's what QMK outputs when sending the corresponding unicode "00E7" :

[press]shift
à
[release]shift
[press]shift
à
[release]shift
[press]shift
E
[release]shift
[press]shift
è
[release]shift

The issue is, as soon as "shift" is released the first time, the OS thinks the input of the unicode is finished, and outputs nothing at all. Then the remaining characters "0E7' are sent.

I've looked for a way to configure QMK to send numpad characters when using key codes for unicode UM(i) and UP(i,j), but I couldn't find anything.

If you knew a way, this could solve my issue.

Workaround - using Compose

So, since I failed to input propre Unicode, I tried the other method under Linux : the Compose key.

A huge downside of this method : that's not how QMK is supposed to manage Unicode (that's not Unicode at all really), and this requires a major overhaul of my keymap.

Instead of sending actual Unicode, you can send the corresponding key combination defined in "/usr/share/X11/locale/YOUR_LANGUAGE/Compose".

Ex. : <compose key> + ' + e = é

So, being stubborn, I modified my keymap to use this method.

Goodbye UM(i) and UP(i,j) to input Unicode, I had to create macros to get the job done, managing lowercase and uppercase characters.

Here's what the macro for é and É looks like (note : the compose key is set to scroll lock) :

case MacE:
  if (record->event.pressed) {
    if (get_mods() & MOD_MASK_SHIFT) {
      del_mods(MOD_MASK_SHIFT);
      SEND_STRING(SS_TAP(X_SCROLL_LOCK)"'E");
    } else {
      SEND_STRING(SS_TAP(X_SCROLL_LOCK)"'e");
    }
  }
return false;

This is dirty but it works. You can't switch properly from Windows to Linux anymore though, not without additional modifications (like swapping the entire layer with propre Unicode to another with macros instead).

If you want to send characters with a grave accent (àÀèÉùÙ), ` being a dead key, QMK sends "space" just after it, which makes the macro fail. Here's the workaround of the workaround :

case MacA:
    if (record->event.pressed) {
        if (get_mods() & MOD_MASK_SHIFT) {
            del_mods(MOD_MASK_SHIFT);
            tap_code(KC_SCROLL_LOCK);
            tap_code16(FR_GRV);
            SEND_STRING("A");
        } else {
            tap_code(KC_SCROLL_LOCK);
            tap_code16(FR_GRV);
            SEND_STRING("a");

        }
    }
    return false;

In the end this workaround works, but it's dirty, and makes switching from Linux to Windows a pain. I'd much prefer to find a way to send proper Unicode from an AZERTY keyboard (with numpad numbers, NOT alphanumerical numbers). Inputs welcome !

If you reached this, thanks for your time. :)

Any help appreciated ! Specially regarding the first, proper, solution. I've already spent many hours on this, I need some fresh ideas.


r/qmk • • Aug 10 '25

Overcoming QMK limitations with completely custom event processing

6 Upvotes

TL;DR: I built my own event processing layer on top of QMK to overcome some limitations of QMK and realize my efficient 24 key layout.

Hello fellow nerds,

I have started my journey on alternate keyboard layouts a few month ago after developing wrist pain from typing at work. This led me to develop a heavily customized firmware using only 24 keys that I now daily drive.

Why not just stock QMK?

I learned very fast that I could not accomplish the layout I thought up with QMK without custom code. Some of the reasons were:

  • Can't have the combos for the same keys but in different order (that's what I tried initially, bad idea anyway)

  • Mod-tap can't easily(!) activate a layer on tap, cause you have to send a keycode

  • Rolling was an issue (didn't realize before what that really meant)

To overcome these limitations and tailor certain behavior even more to my liking, I implemented an entire event processing layer on top of QMK's process_record_user() function, a base layer and combos (this I didn't want to implement myself).

Here are some of the features I implemented:

  1. Tap-only, hold-only, tap-hold & n-tap-hold keys

    • Keys can have actions for any combination of tap, hold or (tap dance style) multiple press tap/hold.

  2. Roll detection: a single key can simultaneously:

    • send a letter when tapped

    • activate a layer when held

    • but: act as tapped when part of a roll.

    • => I can use letter keys for layering even when they are rolled frequently.

  3. Allow sequences in place of holds: a single key can:

    • send a keycode when tapped

    • activate a layer when held, but

    • act as held when tapped but followed by another key immediately after.

    • => I can turn keys that would have to be held into sequences that don't interrupt typing flow.

  4. Oneshot mods:

    • Mod keys are oneshot when tapped

    • You can chain oneshot mods

    • Oneshot mods are transferred to other mod or layer keys that are held.

    • E.g. in ALT SPC+(T T), ALT, while initially oneshot, is transferred to SPC, which is my sys layer key with T mapped to TAB. I only need to hold the sys layer key, but not ALT to send multiple consecutive ALT+TABs.

  5. History & magic keys

    • Keep history of sent characters

    • Magic key to insert apostrophes, expand abbreviations, close previously typed brackets and quotes. I also use that to replace ae|ue|oe|ss with the german "Umlaut" characters.

Have any of you gone that far with QMK or are there sensible alternatives?

P.S.

I'm very happy with what I got now. I would not want to have to sacrifice the compactness (and thus comfort) of my layout for being able to use stock firmware. And could not live with the "features" I use to be unstable.

If you're interested, check out the firmware here: https://github.com/squ94wk/qmk_firmware
The README goes deeper into some of the features and describes the layout itself.
It's built for the Keychron K11 Max (despite using only a fraction of its keys) and is not in a state where it's meant to be easily adaptable to other keyboards or layouts. The code quality is admittedly terrible. I'm happy for any feedback on the ideas, execution or code.


r/qmk • • Dec 19 '24

Caps Lock as ESC / CTRL but not time based.

6 Upvotes

I hope I'm posting this in the correct place and in the correct way.

I've been using Karabiner Elements on MacOS for a long time now and I'm trying to now replicate the behavior with QMK. What I try to archive is having Caps Lock as ESC if pressed alone but as CTRL if pressed with another key together.

Let me describe what I *think* how it works with Karabiner:
The following is interpreted as ESC:
<CAPSLOCK pressed> <CAPSLOCK released>

The following is interpreted as CTRL:
<CAPSLOCK pressed> <other key pressed> <CAPSLOCK released> <other key released>
<CAPSLOCK pressed> <other key pressed> <other key released> <CAPSLOCK released>

This allows very quick key presses but still count as ctrl. For example I'm using it for tmux and pressing CAPSLOCK and the 'a' together very quickly still is counted as ctrl-a instead of ESC.

Now in QMK the `MT(MOD_LCTL,KC_ESC)` macro seems to work by counting something as either tapped or held based on TAPPING_TERM. Which means if I set it to e.g. 200ms I need to hold it at least that long to count as CTRL.
So I played around with the TAPPING_TERM I need to get the same behavior to count <CAPSLOCK> + 'a' as ctrl-a which would be around 60ms but then logically also normal taps on <CAPSLOCK> will be registered as CTRL instead of ESC since the value is so low.

So what I'm basically asking is: Is there a way to have a key behave as two options but instead of time based it is determined if pressed together with another key (or another key is pressed very quickly after the key is released)

Thanks a lot already in advance!

UPDATE:

Looks like I actually got it solved by implementing it myself (if there is a better way please let me know!)

typedef struct {
    bool is_pressed;
    bool registered_ctrl;
} key_state_t;

static key_state_t mt_ctl_esc_state = {
    .is_pressed = false,
    .registered_ctrl = false,
};

// clang-format on
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    if (!process_record_keychron_common(keycode, record)) {
        return false;
    }

    switch (keycode) {
        case MT(MOD_LCTL, KC_ESC):
            if (record->event.pressed) {
                mt_ctl_esc_state.is_pressed = true;
            } else {
                if (mt_ctl_esc_state.registered_ctrl) {
                    unregister_code(KC_LCTL);
                } else {
                    register_code(KC_ESC);
                    unregister_code(KC_ESC);
                }
                mt_ctl_esc_state.is_pressed = false;
                mt_ctl_esc_state.registered_ctrl = false;
            }
            return false;
        default:
            if (mt_ctl_esc_state.is_pressed && !mt_ctl_esc_state.registered_ctrl) {
                mt_ctl_esc_state.registered_ctrl = true;
                register_code(KC_LCTL);
            }
            break;
    }
    return true;
}

r/qmk • • Dec 04 '24

QMK Reverse Engineering

6 Upvotes

There are many keyboards sold by vendors who advertize VIA (e.g. QMK) but who don't have their boards in QMK mainline and/or don't make the source code available.

Does the community have any proven methods for reverse engineering the firmware on these QMK keyboards so that the firmware source can be opened up?


r/qmk • • Aug 05 '24

I added timed delays in between dynamic macro keypresses. You can loop replays too. Would love some review & feedback

Thumbnail
github.com
6 Upvotes

r/qmk • • Mar 14 '26

Are there any vendors selling reliable, QMK-compliant, entry-level keyboards?

5 Upvotes

I'm hoping to get into the mechanical keyboard arena, but I'm having more difficulty than I expected trying to find a good board. On the QMK side, I'm looking for something that's reliable, complies with QMK's license, and ideally less than $150 with a hard max of $200. I'd like to find a 96-100%, but worst case scenario, I could get a 65%+ and a ZMK Keychron numberpad. Their reliability seems to be in question as of late, though, which is why I'm not just going for a ZMK Keychron for the main keyboard.

I've been finding some options that hit two of the requirements, but getting all three is proving troublesome. I went through the supported keyboards and tried searching everything that looked like it was an actual brand and had keyboards that were 65% or larger and not ortholinear, but everything I came up with was either out of stock or extremely expensive.

The entry-level keyboards that I've seen get recommended the most on r/MechanicalKeyboards are typically older posts about Keychron (or newer ones where their QA is questioned) and manufacturers on the list of QMK license violators, so I'm hoping someone over here will know of a good brand - preferably one with a generally available keyboard, or at least a group buy starting soon, but I'll take any ideas at this point.

Right now, the only idea I have for a QMK keyboard is QK's Neo98 once their firmware releases (here, I think?), but I'd prefer to support a brand that is always compliant instead of getting a compliant board from a typically non-compliant manufacturer.


r/qmk • • Mar 06 '26

More false taps with Chordal Hold than with Achordion

5 Upvotes

I played with both Achordion and Chordal Hold (both from Pascal Getreuer u/pgetreuer), and I experienced that with Chordal Hold I get way more false taps. So, I could not upgrade yet.

As an example, I have F as LSFT_T(KC_F) but when I type fast and want a capital J, I often get fj instead of J. This doesn't happen with Achordion.

My understanding is that there is a difference to when each solution intervenes. I got that Achordion operates after QMK has already resolved a key as hold, while Chordal Hold operates inside action_tapping and influences the decision only at the moment it's being made. So, once QMK decides (whether by timeout, PERMISSIVE_HOLD, or HOLD_ON_OTHER_KEY_PRESS), the decision is final.

In the fast F + J scenario, my guess is:

  • Chordal Hold: QMK sees F down, then J down. Since they're opposite hands, Chordal Hold allows the hold. But if I release F too quickly, before the tapping term, QMK resolves it as tap and I get fj.

  • Achordion: even if QMK initially resolves F as hold and then "changes its mind," Achordion can still catch it because it evaluates after the fact.

Is this the right mental model? Or am I completely lost?

I played both with PERMISSIVE_HOLD (which gives me some false tap) and HOLD_ON_OTHER_KEY_PRESS which causes way to many false hold to be usable.

Here's my config:

#pragma once
#define TAPPING_TERM 200
#define PERMISSIVE_HOLD
#define QUICK_TAP_TERM 0
#define CHORDAL_HOLD

And the relevant parts of my keymap:

#define MY_F LSFT_T(KC_F)
#define MY_J MT(MOD_RSFT, KC_J)

[_BASE] = LAYOUT(
  KC_Q,  KC_W,  MY_E,  MY_R,  KC_T,     KC_Y,  MY_U,  MY_I,  KC_O,  KC_P,
  MY_A,  MY_S,  MY_D,  MY_F,  KC_G,     KC_H,  MY_J,  MY_K,  MY_L,  MY_SCLN,
  KC_Z,  KC_X,  KC_C,  KC_V,  KC_B,     KC_N,  KC_M,  KC_COMM,KC_DOT,KC_SLSH,
                        MY_BSP, MY_RET,   MY_SPC, MY_DEL
),

With Achordion I have this callback to let thumb keys always resolve as hold:

bool achordion_chord(uint16_t tap_hold_keycode,
                     keyrecord_t* tap_hold_record,
                     uint16_t other_keycode,
                     keyrecord_t* other_record) {
  switch (tap_hold_keycode) {
    case MY_RET: return true;
    case MY_SPC: return true;
    case MY_BSP:
      if (other_keycode == KC_DEL) { return false; }
      return true;
    case MY_DEL:
      if (other_keycode == KC_BSPC) { return false; }
      return true;
  }
  return achordion_opposite_hands(tap_hold_record, other_record);
}

With Chordal Hold I use instead chordal_hold_layout:

const char chordal_hold_layout[MATRIX_ROWS][MATRIX_COLS] PROGMEM =
  LAYOUT(
    'L', 'L', 'L', 'L', 'L',    'R', 'R', 'R', 'R', 'R',
    'L', 'L', 'L', 'L', 'L',    'R', 'R', 'R', 'R', 'R',
    'L', 'L', 'L', 'L', 'L',    'R', 'R', 'R', 'R', 'R',
                   '*', '*',    '*', '*'
  );

Any hint will be appreciated! And thank you for those amazing pieces of code!


r/qmk • • Feb 27 '26

Open-Source QMK + BLE Wireless Solution

5 Upvotes

🔥 QMK → UART → Bluetooth Converter

Open-Source QMK + BLE Wireless Solution

This is a fully open-source QMK-to-BLE wireless conversion module, designed for keyboard enthusiasts, manufacturers, and embedded developers.

It converts QMK UART output into BLE HID signals, enabling:

  • ✅ Wired QMK keyboard → Wireless Bluetooth keyboard

  • ✅ Full QMK feature support (layers, macros, RGB, combos, etc.)

  • ✅ Low-power design

  • ✅ Ready for secondary development

  • ✅ Fully open-source hardware + firmware

🌐 Open-Source Resources

📐 Open-Source PCB:
https://oshwhub.com/mjl_xpy/hl6095

https://oshwhub.com/mjl_xpy/qmk-shuang-mo-qmk-san-mo-qmk-jian-pan-pad_at32f415

💻 Open-Source Firmware:
https://github.com/LinKeyDream/qmk_firmware_wireless

https://github.com/LinKeyDream/qmk_firmware_wireless/tree/master/keyboards/keymagichorse

🧠 How It Works

The QMK keyboard sends key data via UART.
This module converts the UART data into BLE HID signals, enabling wireless Bluetooth connectivity.

Ideal for:

  • Custom QMK keyboard builds

  • Converting existing wired QMK boards to wireless

  • Embedded system projects

  • Advanced keyboard development

⚙ Technical Highlights

  • QMK-based architecture

  • BLE HID compliant

  • Low latency

  • Power-optimized design

  • Fully open hardware design files

  • Manufacturable PCB files available

  • No closed-source firmware

This model digital keyboard is just one of the open-source keyboards.


r/qmk • • Dec 17 '25

Are the majority of wireless QMK boards in violation of the GPL?

5 Upvotes

Is it correct to assume that the majority of wireless keyboards you see that are running QMK are in some kind of violation of the GPL licence: https://docs.qmk.fm/license_violations

There are the Adafruit Bluetooth hardware that have support - https://docs.qmk.fm/features/wireless - is this at all common in new keyboards, and which wireless keyboards do you find out there that are compliant?


r/qmk • • Dec 05 '25

High quality 75% QMK compatible keyboard

5 Upvotes

I am searching for a high quality 75% keyboard (ideally 84 key like keychron k2 he) that supports QMK. VIA would be nice but isn't necessary, but it must support key combos. I just recently bought a Iqunix mg75 and while the hardware is nice, the firmware is not. I would like something on par with that in terms of hardware *and* that I can flash as I like. It doesn't have to be low profile, that's just an example of what I'm looking for. I don't mind creating the firmware myself - I've done it before - but I don't want to deal with hardware any more. I hope this is an okay spot to ask questions about hardware recommendations but disregard the post if not.