Although I can understand the desire to have a small, fast app to provide this functionality, it's fairly easy to do with AHK, and I don't find AHK that much of a system hog anyway. Using AHK also has the advantage that you can do plenty of other things besides sending alternative keystrokes, if you need to.
I've just added a simple double tap feature to my default AHK script (which runs at startup and provides most of my global hotkeys). One nice thing about this is that it's one less tray icon to worry about, and also minimises the overhead of running multiple hotkey processes.
The code for this is pretty simple. Near the top of my script, I have the following function:
DoubleKey(key, timeout, sendKeys)
{
global
if(tapped%key% and (A_TickCount - tapTime%key% < timeout))
{
Send, %sendKeys%
tapped%key% = 0
}
else
{
tapped%key% = 1
tapTime%key% := A_TickCount
}
}
And then to use it, I just create a hotkey which calls this function. For example, my FARR double tap hotkey is as follows:
Ctrl:: DoubleKey("ctrl", 500, "^!k")
The "^!k" is the CTRL+ALT+K key sequence I use to bring up FARR normally, and the 500 is the time allowed between the two taps in milliseconds - if you wait any longer before pressing CTRL again, it resets and you have to tap twice again.
The "crtl" is used by the function to distinguish between different double tap keys. For example, if I also set up a hotkey for a double tap of SHIFT, it's probably better if the state of the double tap is kept separate from the state of any CTRL double tap, so the "ctrl" is used as part of the state variable names. The SHIFT hotkey would use "shift" (or anything else, so long as it's different from "ctrl"). If you don't do this, then SHIFT followed quickly by CTRL would fire the CTRL sequence, as if CTRL had been pressed twice.
Interestingly, it might be possible to make use of this kind of sequence, e.g. SHIFT then CTRL could fire a different sequence from CTRL-CTRL or SHIFT-SHIFT, as could CTRL-SHIFT. My current script can't do this, but it should be possible.
The only thing I haven't managed to solve yet is using the left and right SHIFT/CONTROL keys separately. If you use the LCtrl/RCtrl/LShift/RShift hotkeys in AHK, there seems to be some sort of repetition happening, which causes the sequence to fire any time you hold those particular keys down. I'll see if I can fix that when I have more time, but the current code seems to work very well for the Ctrl, Shift and Alt hotkeys.