Ask HN: Is there still a place for native desktop apps?
Modern browsers these days are powerful things - almost an operating system in their own right. So I'm asking the community, should everything now be developed as 'web first', or is there still a place for native desktop applications?
775 comments
[ 5.3 ms ] story [ 372 ms ] threadAs someone who has used Autocad since Ver 9 (1993) this is important.
Also - heavy 3D design. Blender/Alias/whatever these days.
Solidworks as well.
Edit: I presumed that the context of the discussion was apps in a general sense. Obviously not every application is going to be on the web and there are a lot of niche software that will never make the switch. I was thinking more qucad or sketch 3d for woodworkers to plan their desks, not solidworks and all its plugins to handle complex fluid simulation in mission critical areas.
1. Pricing model: For the simulation side of EDA, you need a lot of computing power. With desktop apps, the user already has a powerful machine available that you don't have to pay to use. With the cloud, you need to pay for all the machines so finding a pricing model that works is a challenge.
2. User expectations: The users who are willing to pay > $100k/seat/year expect very advanced features that would probably take 10s or 100s of engineering years to get working. These users also don't care as much about the UI/UX problems that a modern app would solve.
References
0. https://www.multisim.com/
1. https://upverter.com/
The BIM stuff (i.e. Revit) is very Windows-specific so a straight port with WASM is a no-starter.
The actual 3D rendering with WebGL is the least problem, we have that nearly solved (in terms of performance relative to desktop -- we never really needed 60fps anyway). The problem there comes in when you have a huge design that does not fit in the allocated/allowed heap space.
(throwaway for obvious reasons)
Though, I think Google Docs is not a canvas app.
Why do you say that?
User does not need to worry about dependencies and libraries - they just need to make sure they're running a somewhat up-to-date version of a modern browser.
Users are not tied to a single device either.
I basically had no users for one of my desktop apps for seven years, till I ported it to mobile and put it in the normal app store
- control over your software and updates
- no one can pirate your software/service
As for 'pirating', is that a serious concern these days? I've only ever heard about it being an issue at big companies selling software to other big companies, where it's solved with "license servers".
It means they can break a program I'm using at any moment they wish, even after I paid for it.
Huh? Given how most web applications these days are using client-side rendering there's nothing stopping someone from just downloading all of the frontend assets. You can also connect to a server from your desktop application so I don't understand how desktop makes it easier to pirate anything.
Proprietary desktop applications are usually downloaded after a payment, and then the full software is available locally. By hacking the security parts of it one can then have a totally free version and distribute it. That's why it is easier to pirate.
Games and even productivity apps are known to be moving small pieces to their servers so that you cannot run the entire application on your own...
> That's why it is easier to pirate.
There are no technical reasons why a desktop application is inherently easier to pirate. Only implementation details.
I'm sure there's a good web implementation out there for the Dropbox-style sync thing, I just haven't seen it yet.
As will applications like Final Cut Pro and Logic Pro. As I see it, the web platform is neither adequately performant, nor are its timing mechanisms accurate enough.
So no, native is sliding. I argue that >95% of users are happy with browsers and/or electron apps.
Either that, or those peeps move over to iPads. Which by design forces native or psuedo-native apps.
Here are some desktop applications I enjoy and have gladly paid for:
Acorn (image editor) / 1Password / Evernote+Skitch / Pingplotter / djay
I suppose I am increasingly frustrated with the inability to use my computer if it has no internet....
As a trivial example, https://jakearchibald.github.io/svgomg/ (which has no data storage requirements) works just fine offline.
Offline support is a banner feature of the PWA (progressive web apps) movement.
So by trial and error, I found that I need to load the page before disconnecting, and only use the 1st of the 5 buttons on the side (even "About" requires network connectivity). Then it works offline. Which is pretty cool!
But every native application I have works perfectly offline, and I don't need to do anything special ahead of time, or worry about which parts might not be available. There's a big difference between "some parts may work offline sometimes" and "entire app will definitely work offline always".
From decades of experience, when a "trivial" app struggles with demoing a feature, there's little chance it'll be widely supported among real apps. PWAs have been "any day now!" for 10 years now.
The logic that decides whether the browser accepts service workers is a little bit iffy. My vague recollection is that browsers default to something like “when you access the site for the second time, keep the service worker”. (Don’t quote me on that, and if anyone knows better, please correct me.) “Add this to your home screen” functionality will definitely make the service worker go. (That’s mostly for mobile browsers only at this time, though desktop browsers will eventually get it consistently available, as we’ve been promised for… hmm, about 8±2 years, I think.)
Privacy and blocking extensions may block service workers from being registered, too.
If the service worker is loaded, then it loads just fine with no internet connection, and the demo works too. The contribute and about links, being to GitHub, still don’t work.
I first actually discovered this completely by accident: I was offline, and thought “I need to shrink this SVG file, so I’ll open a tab to the SVGOMG URL and that error page will remind me to do it when I reconnect; huh, it loaded, must have a service worker. This is really great.” On later reflection, I realised that it being by Jake Archibald (a big mover in the service worker space) pretty much guaranteed it was going to work offline.
If you, as a website owner, want me to run an application then you should ask for permissions. No ifs, no buts, no ors.
I've seen lots of tools that spin up a local webserver and then use that to serve the webapp even offline. But then the question becomes is this really a webapp if I have to install a native server?
A good example of a recent app that chose to leverage native platforms is Table Plus. They are developing native apps on Mac, Windows, and Linux. I respect the effort/skill and dedication required to pull this off! https://tableplus.com/
And currently taking < 300 MB RAM
"memory are cheap"
"cpus are cheap"
Say the same people who spend a million on AWS every year
Electron apps invariably make such kit feel slower than it actually is. You can get good performance out of even older hardware if you treat it well and load it with good software that respects the hardware.
No electron apps!
I don't know what these companies are doing. Clearly they're not paying attention though. This is not merely low-hanging fruit that's going ignored, it's watermelons.
That sounds like your problem. And I refuse to believe that the new steam UI uses 2gb of memory.
The trouble with Electron apps though (and most Node apps) is the sheer number of dependencies. It's just infeasible to package them for a distro if you care about their dependencies being packaged as well - at least, not without the entire process being automated.
On a whim I just checked how big the copy of Adium still lingering in my Mac is: 60 megs.
And Ripcord (a native discord/slack client) is a mere 40.
Unfortunately it's proprietary, but there's another native client called gtkcord3 [0] that seems to be progressing well.
0: https://github.com/diamondburned/gtkcord3
How big is Spotify now?
If you want to see how it’s done search the package name and AUR and you can see the build script right on the website.
"The emperor wears no clothes" and all... paying for threaded messaging, hmmm that's up there with To-Do MVC and Hello World in complexity... well, ok it's a bit higher. Not to mention their billing system lol...
The core task Slack is charged with WAS done 2 decades ago with significantly lower resource usage?
Why does this matter? because Slack is not your main productivity app (I HOPE) it's just a background process, effectively, most of the time, a communication channel you keep open and check in with from time to time.
Being able to keep an app open while you run your main productivity suite is a clear win. Slack loses in this respect.
But go on, downvote and flag me some more for speaking truth to power... it's rather obvious, i would say...
> OTOH, if you are using Slack, you probably deserve it :P
then you say:
> not saying you have any choice in the matter of using Slack or not
Now, I don't actually run Slack nowadays. I run Teams, which sounds like it's efficient since it only uses 600 MiB RAM rather than a full gigabyte.
But the choice between Slack, Teams, and any other product we might use is determined not by the user, but by the company we work for. Companies have a tendency to decide what works without respect to empirical data. Business people are unconcerned with mere technical matters; they optimise for purchase processes.
I think you got downvoted for saying we have any choice in the matter. When you made a valid criticism, your comment fared much better.
At the same time a native win32 program can pack significant functionality into a 20KB exe. Put these together and you have a program where everything is instant, all the time on any computer. The original uTorrent was just over 100KB and installed then ran in an instant.
These two refinements together are such a massive difference from any electron program that it melts my brain when people say that it isn't a problem to have a chat program feel like using windows 95 on a 386.
People say talk about needing cross platform programs, but something like fltk has everything most people will need and also runs instantly, while adding only a few hundred kilobytes to an executable.
Yes, lower-level languages allow for programs with good performance, small executables, and so forth. There are many domains where they are clearly the way to go.
But higher-level languages allow for better safety, tremendous productivity, portability, exploration, and flexibility.
If you keep your data in an SQL database and you can easily query and update it in any number of ways that you didn't initially realize you wanted. If you instead keep it in hand-crafted C structs, you can probably provide awesome performance. for whatever you originally thought you needed. Once your needs go outside of that box, you'll have to spend significant development effort.
The correct choice depends almost entirely on the domain.
know what everything does. call if from up on high? fine, but only if you literally can trace that high level call down to the machine code it emits :D C compiler suites can do that no problem "gcc -S mycode.c"
For an appropriate dose of humility, so that you know that I'm not elevating myself here, but pointing out reality, check out GCC or LLVM source code.
Something like Lua or Berkeley DB can be defined inside your program in a matter of a few hundred lines of included library code, but what does it DO?
Bringing SQL and a database on board is rather odd for a desktop app, wouldn't you say? Configuration should be flat files, ideally, or managed via the apps gui, in which case an embedded database like Berkeley DB is usually more relevant. Your mention of SQL smacks of "all things are nails, always use hammers", to me at least.
Have you worked with the actual computer itself in any capacity? I mean ASM, C, C++, etc, but essentially being aware of what an ABI is, what types actually are (memory shape patterns so we can define physical memory in terms of our data structures) Javascript is not computer programming, but rather programming the browser, or it's disembodied transplanted javascript engine. the animal is completely different from physical memory and actual instructions.
Computers essentially manipulate memory structures. The further away from this you get, the more likely that your abstractions will be leaky, not fit what computers are actually DOING with your data, and this results in beautiful script driving janky machine code.
Seriously, while we all like to pretend that everyone is equally special, let's recall that someone is a VBscript for Word expert, and that this is basically a virtual machine that itself is just defined inside someone elses program. Technological stacks are defined in terms of semi-arbitrary made-up things other people made-up and that you just need to know how to use.
Let's not bring "in-house web app" into the picture just yet.
My mention of SQL was particularly deliberate. It's an especially successful high level declarative language with clear semantics. Implementations provide sophisticated execution engines for optimizing and efficiently running queries. It is quite a lovely separation of concerns that gives you great flexibility and good performance.
Obviously SQL would be a disastrous choice for, say, storing the pixel data in your video codec. Meanwhile, hand-coded C data structures and algorithms would be a disastrous choice for an inventory management system. Tradeoffs everywhere.
a well DESIGNED technological stack WILL allow for high-level control of low-level structures.
Electron and Browser-based apps make a deliberate tradeoff that may be suitable for some kinds of apps (Balena Etcher, as I mentioned. You click a button and some process starts and alerts you when it's done.)
I would simply say that the OP should reverse the question: "in which cases can an electron app suffice for a desktop application" and not presume the death of desktop apps.
I watched a lecture by Bjarne Stroustrup that he gave to undergraduate CS majors at Texas A&M where he coded a solution to a problem using linear scans and then a "better" solution using better algorithms with better big O performance.
Then he did something interesting. He did a test on a tiny data set to demonstrate that the solution with linear scans was faster, and he asked the audience to guess at what data size the more efficient algorithms would start to beat the linear scan. After the audience members threw out a wide range of guesses he confessed that he didn't know. He had tried to test it that afternoon, but the linear scans outperformed the "better" algorithms on any data set that he could allocate memory for on his laptop.
IIRC he finished by telling them that professionals often do performance optimization the opposite of how the books present it. Using an algorithm with optimal big-O scaling isn't the optimized solution. It's the safe answer that you start with if you aren't bothering to optimize. When you need better performance, you evaluate your algorithms using real data and real machines and qualify your evaluations based on the characteristics (size, etc.) of the data.
That being said... I know exactly what you are talking about and it was always strange to me, because it was actually iterating through every time to find a value first, so the iteration through the linked list would always kill the performance. Even so, basic linked lists are practically obsolete. This is not a good example of algorithmic complexity, because the complexities were actually the same.
Apparently, they trade off still worth it, as many electron apps are popular despite these issues. Many times there is electron app or nothing.
I can make a great chat system that uses fast native client, but it won't change the fact that Corporation A paid for a slack license and won't switch to mine.
No need to hack it with taxes.
What?
We have customers who requires servers with 64GB+ memory, of single applications. This is running on VMs in VMWare. If a ESXi host crashes, you'd want VMWare to migrate your VM to another ESXi host, but that becomes somewhat tricky if you need to locate one with 64GB of available memory. Unless of cause you're way over-provisioned, which is actually pretty expensive. More realistically VMWare will start moving a ton of VMs around to put all those with little memory usage on other hosts, in an attempt to find 64GB for your VM. This takes time.
It can be difficult to explain to people that really this should look at their memory consumption, if nothing else to plan for fail-over.
I am on the other side, building electron apps, I appreciate the flexibility and ease because I would rather iterate on ideas then learn three different OS-hooks.
I do agree that memory usage is too high on these types of apps and we as developers can be lax about performance.
Code reusability between browser/desktop/mobile is one. Easier to find developers, faster development speed due to ecosystem, previous experience/familiarity etc. I guess.
* Email clients (I use Thunderbird)
* Office suites
* Music and media players
* Maps
* Information managers (e.g., password managers)
* Development tools
* Personal productivity tools (e.g., to-do lists)
* Games
As Windows starts on-boarding their unified Electron model (I can't recall what they have named this), I suspect we'll see more lightweight Electron desktop apps. But for the record, I like purpose built, old-fashioned desktop applications. I prefer traditional desktop applications because:
* Traditional applications economize on display real-estate in ways that modern web apps rarely do. The traditional desktop application uses compact controls, very modest spacing, and high information density. While I have multiple monitors, I don't like the idea of wasting an entire monitor for one application at a time.
* Standard user interface elements. Although sadly falling out of favor, many desktop applications retain traditional proven high-productivity user interface elements such as drop-down menus, context menus, hotkeys, and other shortcuts.
* Depth of configuration. Traditional desktop apps tended to avoid the whittling of functionality and customization found in mobile and web apps. Many can be customized extensively to adapt to the tastes and needs of the user.
Bottom-line: Yes, for some users and use-cases, it still makes sense to make desktop apps. It may be a "long-tail" target at this point, but there's still a market.
The way we use email hasn't really changed that much since the 70s.
Email predates the Web, and, imo, has been made much worse by all the Web-adjacent features shoved into it.
Email really is just a protocol for message sending, and it lives on it’s own port with its own server. If you have an email client and access to an email server (POP/SMTP/however), you can use email over the internet but without the “web”.
Basically, the web email client ought not be the only email client.
`Internet`[1] is distinct, and that's the general purpose network of networks that you refer to which the Web is built on top of.
[0] https://en.wikipedia.org/wiki/World_Wide_Web
[1] https://en.wikipedia.org/wiki/Internet
I guess the easiest way to get the name is to see the “Web” as a “web” of hyper text documents, where hyperlinks act as the strands in the web (graph edges, if you will).
Honestly, like you say, it’s all built on top of a computer network (yet another web/graph). As a consequence, the distinction never really made a ton of sense to me, either.
Alas, this is the common parlance, so it is what it is.
If the web didn't exist, which it didn't prior to 1991, email would still work fine. There just wouldn't be any web-based email clients.
changed
Add-on support: Add-ons are only supported if add-on authors have adapted them
changed
Dictionary support: Only WebExtension dictionaries are supported now. Both addons.mozilla.org and addons.thunderbird.net now provide WebExtension dictionaries.
changed
Theme support: Only WebExtension themes are supported now. Both addons.mozilla.org and addons.thunderbird.net now provide WebExtension themes.
https://www.thunderbird.net/en-US/thunderbird/68.0/releaseno...
https://developer.thunderbird.net/add-ons/updating/tb68/chan...
And that's in the add-on documentation, not even just internal development docs.
Also, describing information changed in the most recent stable release, a month and a half ago, hardly qualifies any older as "ridiculously outdated ".
The search is not very good on Thunderbird...
Native Applications in the platform's toolkit (not some cross-platform abstraction on top) will always squeeze a little bit more performance and usability out of the corners.
One area which is really tough to nail is cross-platform support though. Getting a good app on one system is hard enough, getting it in all three - rarely done. This is one of the things where web shines.
From business standpoint, I think web-first with an eye on native works for majority of cases. That is, as long as the majority of users don’t care about the above. In some future, if we start valuing efficiency and especially privacy more, this could turn around. But it feels like, even then, web will probably find a way to make more sense for most people.
If you’re not building something like this, don’t build for desktop.
But there are still many areas where native is king.
- Games
- Audio / Video work
- Adobe type of work (photo editing, motion graphics, vectors, etc)
- 3d
- Office. For me Google docs is enough, but not for heavy users.
- Desktop utilities (eg: Alfred, iStatMenus, etc). You could certainly use a web UI for those, and it would probably be fine , but you'd still need some native integration.
also I've never used the VS Code terminal, iterm works better for me. Also because it's its own dedicated app, so I can actually alt-tab to it instead of having to learn whatever shortcut it would be in the editor.
And the fact that it crashes each time I resume my system seems like a much bigger issue than a person who refuses to keep a few pixels separation manually, or to color the windows differently.
The issue is that developing for a particular OS is, generally, more difficult than developing for the web. The app delivery mechanism is also more convoluted (for native apps) than simply entering a web address in the browser. The web also seems to have more ubiquitous standards that abstract away the differences between OSs - you can, with a high degree of certainty, ensure that your app is usable by 99% of computer users, given the current software they have on their device - with native apps, there is no such guarantee, especially if you're relying on shared libraries.
Browsers are also becoming more feature rich. This has had a negative impact on their memory consumption, but given it's 2020, some may retort "memory is cheap". And while some browsers (Chrome, looking especially at you) do a very poor job of memory management, I believe the competitive nature of the browser market will force a reawakening soon, where a lot of the inefficiencies in memory management will have to be eradicated (or vendors risk losing market share). Think back to 2014/15 when Node.js was really becoming established - the PHP team suddenly felt a need to re-optimise their engine for PHP7 (and with dramatic results)... Point is, only after ~20 years at the top did something spur PHP's team on enough to do something about their inefficiencies.
Finally, I can see a future where the line between web and native apps is even more blurred. WebAssembly is the first step, however things could get even more elaborate. Perhaps we could end up with the ability to start docker-like containers from within web apps (given the right permissions, of course) to spin up servers for audio/video/image processing on the client itself, and interact with them via a web page. If we get to this point, native apps would feel even more obsolete.
I know your question was only about the current state, but I felt the need to talk about the future to highlight the marked difference in the rate of innovation in the web ecosystem (fast) vs the native ecosystem (slower). It would not surprise me if the web ecosystem ends up winning in the end. If I was building an app today, and it only requires features I can deliver via the browser, I would almost certainly go the web app route.
Now, if I was building a video processing app today, I'd almost certainly go native, but in a couple of years, my answer may be very different.
The only non-native app I dont detest that much is VS Code but it still feels painfully slow compared to something like Sublime Text.
Lets look at the chat apps that provide a similar functionality.
* Teams
Takes between 600-800MB on my PC. It's sluggish as hell and will often choke to re-render if I click on something.
* A native chat app Takes 15MB...Is just as eye candy as Teams and yet i dont care if it's running or not.