My desktop app has been used over 70 thousand times. Here’s what I learned.calendar_today Posted 9 months ago · 8 minute-read · Technology
I have built a desktop application that is currently installed on over 15 thousand user PCs and has been used by over 70 thousand users in its lifetime. It’s an Electron app. Here’s a few points I’ve learned after years of having the app in production.
- Updates are crazy difficult to get right for everyone.
I’ve tried many ways to make updates work most of the time, but there’ll always be someone that isn’t able to update their software. It may be their antivirus, firewall, or something else going on with their PC.
What I’ve come to find is that downloading the entire installer packaged with the updated binaries is the best way. If the user has been able to install the app once, updating it shouldn’t be problem if updates are done this way. Installers usually request admin permissions when being run, so this also clears up any permission issues.
The downside of this is that depending on the size of your app, requiring your users to download the whole app every time they update may be annoying, you know? In my case, this was an Electron app, so you can expect at least a size of 100MB. This shouldn’t be a problem in 2019, however, the smaller the better.
- Users will download fake/malicious versions of your application by accident.
There’s some really bad people on the internet. Once an application gains traction and starts getting used more, some awful people will brand malicious apps with your app’s name.
This is exactly what happened to my app. People started reporting fake versions of the app, most likely spyware or virus. This is dangerous because it can harm your reputation. And we all know how the internet likes to blow things out of proportion!
One way to deal with this is educating users on what the installer and app itself should look like, provide a hash of the original installer and inform users on how to check hashes of files download from the internet.
- Improving little details of the UI every now and then keeps the app looking fresh.
Every time I had to do an update, I made sure I included at least a few tweaks to the UI. Although a user might not notice it at first, I believe it’s a subconscious thing. The app looks like it’s always evolving and this will make the app live longer before it feels ‘too old’.
“Oh look! That button looks nicer”, “A surprise halloween theme? Sweet!” are comments I’ve seen about my app. For example, when Google went all “rounded-corners” with Material Design, I added some rounded corners in the same way MD does them, making the app look a bit nicer than before.
Another reason I introduce small UI tweaks in every update is to know what version of the app a user is running when they submit a screenshot report of a bug. There’s been countless times I’ve identified the version just by seeing these small changes. No need to ask the user what version they’re running if their screenshot doesn’t show.
- Try not to break your app after an update.
Your update system might work something like this: your app checks a remote server for the latest version. If the app running is on a lower version, then download and install the update.
Make sure you put this server behind a domain name to mask the IP address, because you WILL change servers in the future, and you will most likely NOT have the same IP. At first I did not consider this, and I unfortunately had to break the updater for previous versions of the app since I had to switch server providers, and therefore, server IPs.
- Allow a way for users to submit feedback for your app.
Value your users! Provide a feedback form, an email address, Discord server or something so they can tell you what they think about your app, and what they think should be added, or what they dread the most. They are the one that know the most about your app, after all.
- Provide a welcome guide, or, preferably, bake it into the app.
My app has sort of a “guided” tour once the user opens the app for the first time. Tooltips appear to show the user where to click next to do the most common actions in the app. The user is also always capable of closing this guide if they wish.
This makes a big difference in the amount of support requests you’ll get. Not everyone may know how to navigate your application!
- Don’t let the platform or UI framework completely choose your product’s LAF (look and feel) for you.
My typical example for this is Java Swing interfaces. Sure, Swing might be easy to use, but the amount of customization you can do is pretty limited without investing a lot of time on building custom components.
My point is that it may be worth investing in other frameworks that allow more customization, so that you can make your app look like YOU want it to, and not let it be dictated by a framework or native platform.
A good idea is to mix native LAF and your own LAF. For example, if you’re developing an app for Windows, Fluent design is killing it right now! Design your own buttons, text, font, etc… but keep the frosty, translucent backgrounds. Take a look at native apps of the platform and how their UI looks, combine them with your own look.
- Use a versioning standard for your app versions.
Using versioning standards makes your app’s versions recognizable and understandable by everyone. For example, use and follow the Semantic Versioning standard. Basically, <Major>.<Minor>.<Patch>.
- Provide visual feedback to your users using progress indicators.
When something is happening, show a “Loading…” toast message, or something. When a button is pressed, make it move down a few pixels to let the user know they pressed it. Use loading bars. Disable text inputs that the user should not be able to edit.
Users also like to know when downloads will finish, so if your app downloads stuff, make sure you show an accurate remaining time counter. We’ve all hated downloads that stall at 99% for two hours… and suddenly, done!
- Include information about the app in an early screen of the installation process.
If your app uses an installer to install itself, make sure you let the user know in detail what they are installing. Let them know what information is being collected (if any) and what services the application interacts with (possible sharing this information to). What version they’re installing. The main features the version has.
Also leave contact info just in case the user has doubts about installing your app. Make the user feel comfortable about installing the app.
- Test your app in every situation imaginable.
Although most developers are bound to get surprised from bugs users encounter even after thoroughly testing the app, here I am to remind you again!
Test your app in every situation imaginable: without an internet connection (if it should be able to function without internet anyway), in a sandboxed environment/VM, with a few antivirus installed. Enable the firewall on the worst settings possible. Try your app with low disk space. Assign a low CPU count to your VM. Make it as sluggish as possible. This might also be a great moment to improve your app’s performance on devices with low specifications.
- Make it easy to completely uninstall your app.
It sure is sad to see our users go 😥. But make sure you let them if so they wish… Users can get really frustrated when a program doesn’t get uninstalled properly and/or leaves files behind.
Most installer packagers generate an uninstaller once the user installs the app (which is able to completely sweep all files that are part of your app), so this shouldn’t take too much of your time. For example, InnoSetup or InstallShield do this. If you’re developing for Windows, be a good Samaritan and make sure you get rid of any registry entries your app creates, if any.
If they can uninstall your app easily, they will trust your products more, and probably try out other apps you’ve made and be confident that if it’s not to their liking, they’ll be able to get rid of it easily. Make the uninstallation process as easy as possible.
As you’ve seen, there’s a lot to keep in mind when making a desktop application. Your users need to feel comfortable using your app, so make sure you make it easier for them.
I’m still working on the desktop app to this day, however, I’m working on a complete redesign. It’s had pretty much the same design since 2016, and I thought our users might appreciate a complete refresh. However, I’ll continue to support older stable versions, since not all users like change. Gotta think about everyone.
As always, thanks for reading this post. See ya around! 😀