I've been happy to replace smex with fido-mode in emacs 28, as fido-mode generally has much nicer behavior. However, one thing that I miss from smex is that smex would remember which strings correspond to which commands and persist them, so that the suggested commands over time would correspond to the commands I actually use.
As an example, with fido-mode, when I type M-x repl, it always shows me the options
coffee-repl
message-reply
replace-regexp
replace-string
uce-reply-to-uce
replace-rectangle (string-rectangle)
gnus-button-reply
message-wide-reply
ethio-replace-space
replace-buffer-contents
replace-buffer-in-windows
But I am basically always looking for replace-string. With smex, after the first time I would chose replace-string it would always suggest this first when I did M-x repl. But fido seems to have no such memory, even within the same emacs session.