I've recently bought an Elgato Stream Deck*[0] (programmable 15-key LED macro-pad) and would strongly recommend it. Simply: define an icon, define a shell script/app/site and press a button to execute.
It natively supports 'profiles' for contextual actions if a given application is active, and 'folders', to extend the actions available given the 15 key limitation.
I believe there's also a SDK + plugin infrastructure which lets you define live-updating icons, but I haven't given this a try.
[0] https://www.elgato.com/en/stream-deck-mk2
* EDIT to differentiate from Steam Deck