These are some must-have features, in no particular order, for a well functioning and usable wallet. This list is not exhaustive, so any suggestions would be appreciated.

Automatic node selection. Absolute majority of users doesn’t know or care what node they’re connected to, as long as it works. Also, if node goes down or out of sync, the wallet should connect to a new node without any user input. Maybe even hit multiple nodes in parallel for [a lot of] extra speed (for refreshing balances, for example). Still keep a manual node selection mode for power users, though. Automatic transaction promotion & reattachment. Nobody wants to babysit their transactions. Wallet should promote transactions until confirmed, and reattach only when transaction is inconsistent. Not only should wallet promote outgoing transactions, but preferably also incoming transactions. A nice-to-have would be the ability to spam while wallet has no pending transactions, but only with consent of user. Multiple outgoing transactions. Instead of having to wait for the previous transaction to confirm, the wallet should select different inputs for the new transaction, and, failing that, spending from unconfirmed remainders with a transaction referencing the previous transaction to ensure consistency (keep in mind that in this case, only the top transaction needs to be promoted but both transactions would need to be reattached when inconsistent) Cached Addresses and Balances. Generating an address is expensive (0.35 seconds per core per address, on an i7–7700K!) this means if the wallet is stateless (like the current official wallet), startup times will get longer and longer with more addresses (after just 100 addresses, just generating addresses already takes nearly 10 seconds, and that’s on a very fast CPU! Yikes!), not to mention the time needed to query balance and history from nodes. The wallet should definitely cache addresses, as well as history and balances. The wallet should also update intelligently (i.e what’s more likely to have changed balance and/or history? An address with zero transactions, or one that has already been spent from?). Addresses less likely to have changed should be polled much less frequently. The benefits of a stateless wallet like the current official wallet may be many, but none of them help the typical user (or, indeed, the typical power user). A force-refresh-all button would be nice but not necessary. Automatic seed generation and storage. This is implemented really well in Electrum, where the user is told to write down their seed words (or seed trytes, in this case), then prompted to enter them to continue (to verify that they did, indeed, write it down correctly), and the seed is also written to a symmetrically encrypted wallet file on the user’s computer (hint: all that cached info from #4? The wallet file is a great place to store that stuff too…). No more insecure seed generator bullshit. If after this, people still forget to write down their seed words, that’s not our fault at all. Seamless snapshots. Asking users to reattach addresses until they find their balance is downright shitty UX design, even if it makes perfect sense from a technical standpoint. The wallet should handle snapshots by using cached balance info in wallet file for near-instant recovery of state, and when such info is unavailable (for example, a user recovering their wallet from their seed), the wallet should generate a stretch of at least a few dozen addresses, maybe even a few hundred, upon importing a new seed. Additionally, the wallet could check even-indexed addresses first, as most wallets consist of an enormous string of zero-balances followed by a small clump of addresses with balance. Perhaps the wallet could even try to ensure that there are always two remainder addresses, equally split, and in adjacent indexed addresses such that it can always be discovered quickly after a snapshot. Please do note that this is not an exhaustive list of ideas, but rather to point out that there are more intelligent ways of discovering funds in a seed than just checking addresses sequentially and giving up on the first untouched address.

Since I’m not a good UI developer (or nodejs developer at that), I can’t really contribute to the official wallet; however, I will be working on a CLI wallet implementing all of the principles here.