New Shimano Di2 Workaround for Hammerhead Karoo 2

Hammerhead Karoo users may remember last spring when Shimano and Hammerhead had a falling-out over Hammerhead’s existing Shimano Di2 integration, which has been in the product for years. They demanded that Hammerhead remove the Di2 functionality that showed shifting status and battery status. This was after SRAM acquired Hammerhead a few months prior.

There’s nothing secret about this functionality, it’s simply broadcasting your current shifter position and battery status – no different than any power meter or heart rate sensor data stream. The rest of the industry uses the ANT+ Gear Shifting standard (including Campagnolo, FSA, and SRAM). And further, despite other bike computer companies like Garmin, Stages, and Wahoo all making power meters themselves, Shimano hasn’t demanded removal of Di2 from their units, nor have those companies responded by removing Di2 functionality.

In talking to various people within Shimano over the last 8 months, it’s very clear that adults were not present in the room when this occurred, largely owing to a communications snafu between the two companies. One that apparently nobody wants to just press undo on.

As such, Shimano and SRAM still haven’t come to an agreement on solving this for their end users. However, the power of internet has done so instead!

An individual has uploaded a open source project that adds Shimano shifting info to the Hammerhead Karoo 2, via an Android app. Remember, the Hammerhead Karoo is simply an Android phone under the covers. And as I’ve shown before, that means you can install all sorts of apps – from TrainerRoad to Zwift, YouTube, and yes, even a new Shimano Di2 data page.

Of course, this also means there’s a level of geekiness required to install this. There is no easy button here, but, for those that want their Di2 shifting back, it’s here. At least until Shimano gets upset about it again, and demands that get removed too. Which, it probably will. Frankly, they should spend that energy on trying to make their latest power meters accurate (still).

The Features:

The plug-in includes all the core features you’d want. Here’s the complete list from the GitHub page:

  • Pair and connect to electronic shifting groupsets
  • Configure actions for Hood buttons
  • Change shifting mode
  • Setup Karoo ride profiles with data elements such as:
    • Gears in text format
    • Battery % in text format
    • Shifting mode in text format
    • Ride shift count in text format
    • Gears in graphical format
    • Drivetrain view in graphical format
  • While in a ride, control Karoo from the Hood buttons:
    • Navigate page left/right
    • Pause/Resume ride
    • Mark lap
    • Zoom map
  • Receive notifications when shifting battery is low

What’s notable but not listed above is “geek-a-liciously cool animation of your actual gear shifting”, perhaps I could kindly suggest such an update.

Also, finally note that this is a Hammerhead Karoo 2 only plug-in, since the SDK architecture is different on the Karoo 1.

Quick Install & Usage Overview:

Now again, this isn’t a ‘hard’ install, but it does require a level of geek that you’re comfortable with a command line. There’s very low risk of dorking up your Karoo (far less than going mountain biking with it), but as always, you’re on your own here. Note, there’s no warranty-voiding here. Hammerhead themselves has pointed at my past app side-loading guide, and actively encourages companies to develop apps for their platform. In this case, someone did just that.

There are three notable information places here:

The GitHub page with the download/instructions/release notes/etc…
The Hammerhead Karoo Users Facebook Group, which has a thread on it and might help if you run into snags.
GPLama’s video on it (also embedded above), which also covers the functionality more in-depth out on the road.

I’m going to quickly cover the basics here.

1) Pre-game Stuff: First, you’ll need to get your computer all set for adding sideloaded apps to your Karoo. You can follow my Karoo  sideloading guide here. Do the entire ‘Foundational Bits’ section. Start to finish. Then, come back here.

2) Download the Goods: Next, you’ll need to download the app from the Ki2 download page, under the Releases section. You just need to download the .APK, and of course, download whatever version is newest so you’ve got the latest bug fixes. In my case, I downloaded this to a folder I created called ‘Apps’ within my ADB tools.

3) Install the Goods: Now, going back to the ADB command line we used in the ‘Foundational Bits’ section, we’re going to install the app. If you’re looking for a quick refresher, the second section of my Karoo 2 Sideloading guide covers an example app. It’s 100% the same here, except the name of the app is simply different. Here we’ll type, and then press enter. It should take no more than 8-10 seconds to install.

adb.exe install “Apps\ki2-0.7-release.apk”

Remember: If the version above isn’t 0.7 anymore when you read this (such as 0.8 or 1.2, etc…), change that to match. And again, note that I created a folder called ‘Apps’ to put this in on my computer.

Notice it says ‘Success’ above. If you’re coming back to this guide to install an updated version of the Ki2 app, then you’ll tweak it very slightly, adding a –r to it, such as this currently fictitious 1.5 version below:

adb.exe install –r “Apps\ki2-1.5-release.apk”

4) Open the apps list: On your device, tap the four little squares in the lower left corner of the dashboard, and you’ll see Ki2 towards the bottom of the apps list. In my case I’ve got other apps recorded, but for most people, you’ll just see it listed below ‘Sensors’, called ‘Ki2’:

5) Next, you’ll add your Di2 sensor. Note, if you’re like me and have filled up your sensors list, you need to have…umm…less than 14 ANT devices paired. I had more. You’ll search for it and it should find it. Mine didn’t require pressing the function button for pairing/connection, but yours might (on the Di2 system itself).

6) Things you can change: You can poke at the configuration/settings options, which are pretty self-explanatory for configuring things like the shifter buttons to do various actions such as changing data pages:

7) Add Di2 data pages: With the plug-in installed, you can now add whatever Di2 data pages you want to your ride profile. Note there are two types of data pages: Graphical ones, and non-graphical ones. So you’ll see different things in the list depending on if you’re adjusting a graphical data field versus a text one:

8) Go ride: At this point, you’re ready to ride. You’ll see your Di2 stats shown in your ride profile, just like any other data field. Arguably, I think that’s the coolest thing here – this isn’t some weird separate app or something. It’s just a standard data field at this point.

9) Bask in animation glory: Yes, there’s this animation as you shift, it’s awesome:

There ya go, done. In my case, I haven’t had a chance to test it out on the road yet, as my motivation to go out on a dark and dreary 0°C/32°F day is low right now. However, down in warmer summer-ish Australia, GPLAMA has gone out for said ride, and thus, you can see his test in the video above. He dives into more of the details as well. Note that, at present, it doesn’t yet record the shift information in the .FIT file, but it sounds like that’s on the radar.


This is one of the great things about bike computer platforms that are ‘open’, and allow development. It enables smaller developers to fill in the gaps where the company itself can’t. Of course, there are differences in the platforms between something like what Hammerhead is doing here on Android, versus what Garmin does with Connect IQ. In Garmin’s case, for an end-user, it’s silly easy to tap a button and it installs the 3rd party app. Whereas in Hammerhead’s case, unless it’s one of a couple of approved apps, the process is cumbersome at best – and downright intimidating for most. Of course inversely, there’s more or less nothing that Hammerhead can do to stop this app (if Shimano wanted them to).

Sure, they could play cat & mouse games with blocking app names, but that never really works or scales. And it’s just that – cat and mouse. Change the name, and it’s a new app. As for how long this app stays around before Shimano gets upset? Who knows. But given the code has been published alongside things, it’s unlikely to go away. That’s kinda the magical point of GitHub open source releases.

Ideally – Shimano would either adopt the existing ANT+ Gear Shifting standard, or they’d just let any company use it that wants to (just like Shimano themselves depends on the ANT+ power meter standard for their power meter to work).

Until those things happen though, this is a great little solution, and I’m glad it’s installed on my Karoo 2.

With that – thanks for reading!



Hopefully, you found this post useful. The website is really a labor of love, so please consider becoming a DC RAINMAKER Supporter. This gets you an ad-free experience, and access to our (mostly) bi-monthly behind-the-scenes video series of “Shed Talkin’”.

Support DCRainMaker - Shop on Amazon

Otherwise, perhaps consider using the below link if shopping on Amazon. As an Amazon Associate, I earn from qualifying purchases. It doesn’t cost you anything extra, but your purchases help support this website a lot. It could simply be buying toilet paper, or this pizza oven we use and love.

Post a Comment

Your email address will not be published. Required fields are marked.
If you would like a profile picture, simply register at Gravatar, which works here on DCR and across the web.

Click here to Subscribe without commenting

Add a picture



  1. Frank

    I’m using Ki2 for a few weeks now, works like magic :-)

    Ki2 is even better than the original Hammerhead implementation! You can assign a double click of a head button to zoom in or out of a map. With the original implementation zooming with the hood buttons never really worked, because there was such a big lag between button press and reaction. This lag is still there, but a series of double-clicks is much easier to manage than holding a button for a very specific time without immediately seeing the result.

  2. David

    Looks like the links arent working in this article just yet.

  3. Erwin Röhrl

    Does this also work on an older Di2? I’m using Shimano Ultegra 6870 Di2. Wayback from 2015.

    Thx, Erwin

  4. Dave Lusty

    This will be a good test, if they leave it alone we can trust them and hope they backtrack in the future. If they try to stamp out this app then they will get zero dollars from me going forwards. There is nothing for Shimano to gain here and everything to lose, the Internets can be unkind to bad companies!

  5. Paul S.

    Ray, this is a bit of a side-question, but why don’t all of the drivetrain companies implement the ANT+ Control profile (Is there a BLE equivalent?) in addition to the Shifting profile? The lack of computer control on everything except Dura Ace and Ultegra is pretty frustrating. I’ve been in touch with Keith Wakeham, and it sounds like Kommander might be available in 2023. (Supply chain… Something I deal with at work too.) But the whole ecosystem would be easier if the existing framework just got implemented. Then any drivetrain with auxiliary buttons could be set up to control your computer.

    • usr

      This is not the reason for them not doing it, but ANT+ control is just not very good: it’s based heavily on the ANT+ “secret sauce” of pre-scheduled time slices for transmission so that the *receiving* side can achieve those “years on a coin cell” runtimes. That’s perfectly fine for a sensor connection that’s all about continuous updates, but for interactive remote control, latency is very important and ANT+ control just happens to be very bad at this. Bad at this by design, because back then Dynastream prioritized receiver battery use over latency. The ANT+ profile for remote control *mandates* a schedule of 4 Hz and there’s nothing a piece of control hardware could do about it. 250 millis (or perhaps worse: a random value between 0 and 250, depending on wether the receiver aims for fastest possible reaction or for predictability) might be fine when sending play/pause to an MP3 player (the protocol design appears to be from the iPod age, much effort has been spent on track title transmission and the like that has never been implemented anywhere), but for interactively operating a screen it’s really quite bad. Worse if that happens to be operating a screen while also operating a vehicle at unsafe speeds, because you keep staring at the screen for a reaction which you definitely should not be doing e.g. while descending down to Masca wearing hardly more than a swimsuit. If wireless shifting was implemented on top of vanilla ant+ remote, pros would insist on riding mechanical, because of the latency (real world wireless shifting uses very similar protocols on the same chip, but without pre-scheduled timeslots because their batteries have to be so big for supplying the servo motors that laleaving the receiver open has no noticeable runtime cost at all)

      Note that this would all be a problem beyond solved if Dynastream had included a byte or two to negotiating channel period in the pairing handshake, because then small battery devices could continue advertising a low rate while large-battery devices like an Edge could simply advertize “hit me, any time, I’m not powering down my radio anyways” (which I believe they do these days, for sensor reconnection quality), or anything in between. The remote control would not mind getting allowed to spend less time waiting between getting awoken by the button press and waking up its radio for transmitting at the pre-scheduled timeslot. But unfortunately that’s not the protocol they have.

      (the actual reason is most likely that nobody is getting promoted for putting their weight behind a project for implementing some third party protocol)

    • Stephan

      thank you for the good and concise comment 👍

    • Paul S.

      I don’t agree with your statement that “250ms is too long to wait to watch a screen change”. There are complicated UX effects here, but I would argue (without data) that if you have looked down from the road or trail, decided that the data in front of you is not what you are looking for, hit the button, wait for the ANT+ message to be received and processed, and then read the data, you are already talking about a process that is going take single digit seconds or more. Truly, a good UX experience test would be the only way to prove how much protocol delay begins to interfere with the user’s experience, but again, 0-250ms of added delay is “in the noise”.

      I do believe there are people at the big cycling tech companies that care about offering riders more. Especially if it’s a matter of software, which doesn’t add to the BOM cost, and can minimally impact the NRE and long-term support costs of products. Shimano seems to be the exception, and I do think they care, but they seem to think completely differently than folks that live on Planet Earth.

      Really, I guess my question comes down to “why hasn’t SRAM matched Shimano’s feature offering in Computer control?” (plus Campy, and FSA, which *technically* has a wireless drivetrain). Given the existence of the ANT+ Control profile, it doesn’t seem to be Patent-related? The 4Hz update rate is actually a big help in avoiding increased HW needs to add this to AXS shifters. I’m hoping Ray can shed light on if there is a technical hurdle, or just a Product Management hurdle.

    • usr

      “The 4Hz update rate is actually a big help in avoiding increased HW needs to add this to AXS shifters”

      That’s not how a coin-cell powered remote control works: it’s sitting there, in a very deep idle/off state (completely powered down except for some ram retention which a “some buttons attached to the radio” remote hardly even needs) and when a button is pressed the system fires up, reads its input pins to decide which message to send and then immediately powers down again after receiving an acknowledge or timout. There simply isn’t anything else to do on the shifter board that would be made easier by mandated deferring to some future time slot. The controllers run on NRF that are absurdly overpowered for the simple task of being a remote button. The same chips run entire powermeters that do real-time observation and interpretation of numerous analog inputs.

    • The protocol for “ANT+ generic remote” is bad and nobody uses it. It’s based on sending specific functions like change page or start lap, but also works backwards to support multidevices. This make pairing nearly impossible as you get zero feedback that you’re paired, and it causes the remote to be recieving which means crazy high current consumption on wake every time.

      Officially there are only 3 bike commands out of over 200 in “ANT+ generic remote”, unofficially garmin added 3+ that I’ve reversed out. None of the cycling companies wanted to support this. Wahoo, Hammerhead, Stages. None have ever had that protocol in beta as far as I know.

      Kommander has ruffled some features and pushed for some industry change, hopefully we can talk about it in 2023 and everyone’s lives will be simpler for remote control and such.

    • Paul S.

      That’s fantastic context, Keith! Much appreciated. I look forward to supporting Titan Labs, and hope the supply chain imps are kind to you this year.

    • Paul S.

      It still seems like we are misunderstanding each other. I certainly think I’m not understanding your point. I’ve personally built systems (not ANT+) using TI MSP430s which sit in sleep states and are awoken by external triggers or internal timers, so I’m familiar with the process there.

      If a wireless shifter is running an ANT+ CNTRL profile, it would be doing so on top of already running the ANT+ shifting profile, and the proprietary control profile for the communication between shifter and derailleur. The speed of current electronic drivetrains is certainly much better than a 4Hz update rate, and if it weren’t, I agree we’d all feel that and be really annoyed by it. So the point I was trying to make is that the processor is already running a real time process with a much higher frequency. Running an additional process 4 times per second won’t radically increase the CPU utilization. I definitely agree with you that these processors are wildly overpowered to detect a button press and then send a message. Which leads to…

      The point that Keith made below, that the CNTRL profile was a really complicated invention that is a massive headache to implement, makes a lot of sense to me. It sounds like a new control profile would be needed to make it more palatable, but that’s just not something the sports tech industry can get together on these days.

      But either way, I’ve got my answer about why this won’t be coming to a non-Ultegra/Dura Ace shifter anytime soon, and I’m looking forward to ordering a Kommander ASAP.

    • Paul S.

      My second comment was attempting to respond to “usr”. *facepalm*

  6. Jeffrey Schriesheim

    Yay! Geeky yes, but functional and gives back what Shimano took away. Thanks to the Ki2 developer(s) and to Ray and GPLama for the info and links they provided. I had an issue getting the shifter top buttons to work, but once I added some Ki2 data fields to a profile, they started working. I hadn’t removed the old “native” Karoo Di2 fields from a page I had setup in the hope that they would become functional again, so I had to remove those fields and replace them with fields exported by the Ki2 plug-in. Made me very happy. Is there a way to contribute to the Ki2 developer?

  7. Seth H. Shaw


    Many thanks for this. I’ve been holding out for something like it, all the while not updating my K2. I was just about to capitulate. Glad I didn’t.

    Sideloading subsequent updates is a small price to pay. For those who are intimidated, fear not, just follow the instructions. I’m a geezer and did it, so can you

    Seems like the children are still locking the adults out of the negotiating room? Meanwhile…who wins?

  8. Larey K

    I’m currently buying my first bike with electronic shifting and I ruled out any build with di2 because I use and really like my K2, and I really, really don’t want to deal with anything Garmin again. Shimano needs to straighten this whole thing out.

  9. Andreas

    Not a Hammerhead user, but I find it great that this is open source. Virtually impossible for Shimano to stop this, because everyone can just fork the code and build it themselves. Even Google/Microsoft failed famously to ban youtube-dl from GitHub.

    And on the other side, Hammerhead can just say that they are not affiliated with this project and nobody can demand to ban ADB/Sideloading.

  10. Huge thanks to Valter Costa for his work on this project. 🙌

  11. Sarah Elizabeth

    Corona is a big threat of the century which affects physically, mentally and financially/ To overcome these difficulties and make full use of this hostage period and make online earning.

    For more details visit this.. Pr𝐨fitGuru7.Com

  12. Annie Dunkin

    My Companion mother makes 50 bucks an hour on the PC(Personal Computer). She has been out of w0rk for quite some time however last month her check was 11,500 bucks only w0rking on the PC(Personal Computer) for 9 hours per day.

    For more detail visit this article..

  13. Patrick B

    I was able to load the app, which can connect to my new Di2 setup. However, my Karoo2 can’t sense/connect. What am I doing wrong?

  14. Robert Altman

    Thanks for keeping us updated on this. It is amazingly ridiculous that Shimano is making war on consumers by hamstringing the Karoo. I particularly appreciate your comment that “no adults were in the room” when this happened.

    For my part, I dumped my plans for Di2 on my next bike and went SRAM Force eTap. The bike should be ready in the spring. Yes, Shimano, you lost a customer.

  15. John Lacey

    Anyone know if the Ki2 app handles more than one Di2 equipped bike? I have a gravel and a road bike and use a different profile for each on the Karoo, each profile using a different subset of connected devices. It would be great to have the gravel Di on the Gravel profile and the road bike Di on the Road profile.

    • Valter C.

      You can add multiple Di2 devices to the app. There is no way to assign a Di2 unit to each Karoo profile, but you can configure the profiles with the Ki2 data elements as desired for each bike scenario.
      When you ride, Ki2 will attempt to connect to all saved Di2 units, so if you take a bike, Ki2 will connect to the Di2 unit on that bike and show data from it.
      The next day, if you take another bike, Ki2 will again attempt to connect to all Di2 units, this time it will connect to this bike Di2 unit.

  16. Peter

    Thanks for the step by step instructions. I’m a novice when it comes to this but was able to work my way through following your clear instructions. Another reason to support your site.

  17. Al Bremner

    Have been using the 0.7 release of KI2, all great. There’s now an update to 0.8 with fixes and improvements. But I’ve struggled to install it. Seems to require the original apk to be uninstalled first. Have tried the ./adb uninstall, but that fails with errors. Any ideas anyone. Cheers

    • Valter C.

      You should use the install command with the -r parameter, like the following example:
      adb.exe install -r “ki2-0.8-release.apk”

      This will update the Ki2 on the Karoo without deleting the app configuration.

  18. Jürgen

    Many Thanks. It works very well. I installed the ki2-0.8-release.apk and all is fine :-)

  19. chris

    I installed E-TUBE RIDE_2.0.2_Apkpure.apk in the same way and this also works a treat on Karoo (2).

    link to apkpure.com

  20. Seth H. Shaw

    Am I late to the party to learn that you can now update Ki2 from your Karoo2 directly? No more sideloading. Thank you Valter.

    • DMG

      I just got my Karoo v2 less than two weeks ago and side loaded to install the app.

      Just yesterday (4/10), I updated the version directly on my Karoo. Open the Ki2 app, go to Settings, then Update & then Check for Updates (I also have the Auto Update toggled on).

      The latest version as of now is 4.0 and mine is up to date (it was 3.7 the other week for example when I set it up initially).

      One other user reported a problem of losing the Di2 info during the ride which I’ve also experienced so I may report a problem to see if it can get fixed. It doesn’t come back for me like the Garmin Varia radar sometimes goes in/out but always comes back to connected status so we’ll see.

  21. Jim Schifferns

    How do I get the nice graphic display of gears? When I set up the Ki2 page I use Di2 and all that shows in the display is the number 1-7 but no graphic picture.

  22. Jim Schifferns

    How do I get Ki2 to display gears in a graphical format. My unit only shows text.

    • Valter C.

      Graphical elements can only be added to graphical fields, you cannot replace a text element with a graphical element. In your ride profile, add a data page that supports graphical elements and replace that graphical element with the Ki2 ones.

      More info here: link to support.hammerhead.io

  23. Alastair

    I’d like to say thanks for a great app and more importantly instructions that a non techie could follow and actually make it happen!

    I have it all working and only have one problem (sorry!)

    When I start out everyone is connecting and working and I have a 3rd screen on the Karoo2 so when I scroll along I can see what the gearing is BUT it seems to not hold the connection and the screen displays N/A in all the gear data fields for the rest of my ride :-(

    Any ideas?

    Thanks again


    • DMG

      I’ve been experiencing the same thing on multiple screens (same profile).

      I started on v3.7 a few weeks ago and updated to v4.0 on 4/10 so it’s current (you can check and update Ki2 versions on the Karoo v2 directly instead of side loading again).

      I just logged an issue on the GitHub site (also shows where to log in the Ki2 app – link to github.com). You have to create a free account on GitHub to log a comment.

      Hopefully this improves for all of us.

  24. Stephen R Scott

    This is just the most awesome post ever! Boo shimano for being twits. Yea for DC, GPLama, and most of all Valter Costa. Woo hoo!

  25. Saul

    Huge thanks and kudos to Valter! Can’t appreciate this enough, keep going strong!

  26. Mark

    Your instructions for Mac are horribly impossible for a non-tech person to follow.
    Someone’s comment below has the best instructions.

  27. Michael Bonderup

    I honestly did not think I could do this (I am NOT a seasoned computer user by any standard). But I managed to get the app installed on my karoo 2. Tomorrow I will try to link up my Shimano di2 (new 12 speed version… so I am curious to find out if I can make it work !).
    That little dos prompt is a tricky thing… :-)

  28. Rick Carpenter

    Thank you. To install on a Mac, I had to first manually change the name of the executable file from “adb” to “adb.exe”.

  29. Chip

    Side-loaded ki2 on Karoo 2 but can not pair with di2. “No devices found” message. Any suggestions? Thanks!

    • Seth H. Shaw


      Let me ask the obvious first: battery ok (i.e., fully charged) for Di2 and K2? Rebooted K2 after Ki2 installed? All updates to both installed? Have you tried to pair while riding or using shifters on bike stand? If yes to all, first go to Settings/Apps/Ki2 and click on force stop. Try pairing again and/or reboot. If NG, uninstall and reinstall. Other than that you could wait for Valter to respond here or go to: link to github.com.

      Hope it works.

  30. William Berhow

    Has there been ANY movement by Shimano on this… other than the workaround?

    • Seth Shaw

      Curious question… Mr. Berhow
      It’s now 6 months since the workaround went live, so a reasonable person would believe Shimano is leaving it in place, probably with some relief.

      Valter’s app works, it’s seamless and it’s better than the original. Other than sideloading it initially, updates can be made through the K2.

      Your question seems moot to me. It’s fixed.

  31. Sebastian Daly

    Can you please rewrite this and include instructions for mac if possible? Thank you

  32. Bernd Erler

    Great it worked

  33. Gordon

    Just bought a Karoo 2 took it out the box and followed the instructions. Done an automatic update then found out it did not support shimano Di2 anymore absolutely disgusted. Then I found this article followed the instructions installed the latest updated apk file and I am over the moon. IT WORKS. Thank you soooooo much DC Rainmaker.

  34. Paul Wharton

    I used this method to install the APK Pure app. No more sideloading via Command Prompt and USB, just search in the app on the Karoo and away you go.

  35. Scott

    Does this support with new Shimano R9200-P power meter?

  36. Peter Ekdahl

    I have read all comments and everyone seems to be happy and Ki2 works, nice for you ;)
    I installed Ki2 v5.0 just a few weeks ago and I used it on my gravelbike (GRX Di2) and on my roadbike (DA Di2).
    Unfortunately, the computer takes much longer to start up and sensors for heart rate and power takes much longer to show up on the display. If I take a break, these sensors might not come back live at all… :(
    I just gave up and uninstalled Ki2 and the computer works quickly again!

    Has anyone else have these bad experiences? Does anyone have an idea what to do!?
    I would highly appreciate to get it working as for many of you! Best regards, Peter