Bluetooth on chromeOS sucks, but there's a workaround

Bluetooth on chromeOS sucks, but there's a workaround
Photo by Davide Boscolo / Unsplash

As a prerequisite to making bluetooth better on chromeOS, you'll need an external USB bluetooth dongle. I used this one that's available on Amazon pretty cheaply.

ChromeOS is probably my favourite operating system. I love the simplicity of it. I love seamlessly combining Web apps, Android apps and Linux apps all on one machine, and without much effort in the setup too. It's powerful and, with the regular update cycle, gets better over time.

ChromeOS isn't perfect though. There are a few things that bug me and some of those are more of a problem than others. One particular problem is bluetooth. On every chromebook I've used, and with all the different bluetooth devices I've tried, there's always been a problem cropping up that lowers the experience for me.

Time and time again bluetooth devices - in particular keyboards - seem to have problems. Things like typing delays are noticable to the point of distraction, key presses registering too many times like a key being held down toooooooo long. I've also seen mice (a few different brands) having a weird scrolling problem whereby scrolling down or up a webpage would suddenly jump me to a position on a page further than I intended.

For a while I thought I was buying junk devices with poor implementations of bluetooth, but as I spent more money, and did more testing, I was still seeing the same issues on chromeOS. Trying those same devices on different operating systems also showed me that it wasn't always the device to blame.

I searched online for a couple of months on and off just trying to find any hints on how to fix this issue. ChromeOS being stripped down as much as it is, also means making changes and fixes, like the kind you can with any normal Linux distro, is somewhat limited. At one point there was a chrome flag that could be changed to enable something called "New Blue" which was supposed to help with the bluetooth troubles plaguing chromeOS. New Blue soon disappeared but the problems remained.

A New Hope

Then, one day, I stumbled upon a reddit post where one of the comments just below the surface of the thread mentioned "bluetoothctl". I did a quick search for this term and found that the terminal command had changed. Now it was called "bt_console". When combined with a cheap USB dongle, this command line tool will help work around the problems faced when using bluetooth on chromeOS.

You might be thinking that having a bluetooth dongle ruins the look of the laptop by having a small rectangular purtrusion sticking out of the side of the device like a technology hernia, and you'd be right. And it's made much worse by having no USB type A ports on a device. For me though, and possibly you, it's less of a problem if you only plan to use a keyboard and mouse when your laptop is docked, say for instance, when you're working from home.

I've been using the Pixelbook Go as my daily driver for a while now and I've got my desk setup just the way I like it: With one single USB-C cable on the desk that goes to a hub mounted under my desk where I plug in the bluetooth dongle. That cable handles charging the laptop, data for the dongle, and DisplayPort to my monitor. When I'm not plugged into the desk, I rarely use an external keyboard and mouse; when I do, it's usually just the mouse and for a very short period of time.

The Magic Commands

Before getting started, you should go to the chromeOS bluetooth settings and forget the paired devices to avoid confusing the OS and yourself.

Getting to the command prompt is simple: press ctrl + alt + t and then type bt_console.

The message you see after entering the command might be slightly different to the above. Ignore that. The important part is that you get the blue "bluetooth" shell prompt. Note: even the word "bluetooth" might be different.

Here you can enter a number of different commands, but I recommend starting with help. Type that to see a list of commands and a short description of what they do. We're interested in just a small number of them.

Next up: list - type that, hit enter and you'll see a list of bluetooth controllers, not devices, controllers. If you've got your bluetooth dongle plugged in, you should see a list of two controllers - One should be the built in Chromebook one, and the other should be the dongle you've plugged in. One of the controllers listed will be marked as [default] and it's likely going to be the built-in controller.

You can change the default controller with the select command. Copy the mac address of the controller you want to be the new default (the USB one you just plugged in) and paste it after the select command (to paste into the command prompt you can either right click mouse (or trackpad if you're trying to pair a mouse) or press ctrl + shift + V).

[bluetooth]# list
Controller C8:34:8E:7E:60:BD Chromebook_397E [default]
Controller 00:1A:7D:DB:71:15 Chromebook_5F26
[bluetooth]# select 00:1A:7D:DB:71:15

Now that you've selected the new USB dongle as the default controller, you're ready to pair your devices.

Choose the device you want to pair and put it into pairing mode.

Next you need to use the scan on command. Before typing, you should know that it will likely list a lot of bluetooth devices and you'll need to type scan off while the devices are being listed. Just ignore the fact that it looks like it's overwriting what you're typing; it's not. Use scan off to stop the list when you see the device you want to pair. If you don't see because it goes past too fast, just type scan off and scroll up to see if your device is listed. It should have a recognisable name.

Copy the mac address of your device and now use the pair command with the mac address you've copied:

[bluetooth]# pair C6:2A:90:26:97:CA
Attempting to pair with C6:2A:90:26:97:CA
[CHG] Device C6:2A:90:26:97:CA Connected: yes
...
[CHG] Device C6:2A:90:26:97:CA Paired: yes
...
Pairing successful

Running that command should pair the devices together and spit out a load of information you don't really need, other than a few key things. You should see it say Connected: yes, Paired: yes, and Pairing successful. If you get any errors along the lines of 'failed blueZ in progress' or words to that effect, just unplug the bluetooth dongle and try again. Note: you may need to select the dongle controller again.

And that's it. Repeat the scan and pair commands for each device you want to pair. Once you're done pairing all the devices you want to use, you won't need to go through this process again until you want to add a new device.

Note: I've found the bt_console to be a little buggy at times. If you start seeing weird things happening, just close the command prompt tab and start again.

I'm not entirely sure why this solves the problem of poor bluetooth. I guess by using a dongle, it's telling chromeOS to use different firmware drivers. Someone with more knowledge than myself would likely know the answer.

While writing this article, I've switched away from the Google Pixelbook Go and am now using the Surface Laptop 3 as my daily driver with chromeOS installed on it using the Brunch Framework. The bluetooth issues were still present and this same set of commands also fixes it.

Conclusion

It's a hacky way of getting bluetooth to work better on chromeOS, but it works. Now you can enjoy typing and scrolling on wireless devices without problems. I should add that I haven't tested this on audio devices since audio hasn't ever been a problem for me. As far as I've tested too, you can also use both the built-in bluetooth controller and the dongle at the same time. I've been using my headphones, keyboard and mouse in this way for months without any issues. I recommend unplugging the dongle before attempting to pair other devices through the normal chromeOS pairing menu though. Again, this avoids any confusion around the controller you're pairing to.