Why Industry Developers Recommend Web Apps Over Python Desktop Apps
The Problem
I spent three weeks building a Python desktop application with a beautiful PyQt interface. It worked perfectly on my machine. Then I tried to distribute it to users.
The nightmare began.
User A: "It says 'module not found' when I try to run it"User B: "The installer crashed my antivirus"User C: "It works but crashes when I open large files"User D: "Why can I see your source code in the bundle?"I had 50 users. Each had a different problem. Each needed individual support.
What I Tried First
I used PyInstaller to bundle the app:
pyinstaller --onefile --windowed myapp.pyThe resulting executable was 150MB. Users downloaded it. Half couldn’t run it.
Then I tried creating proper installers with Inno Setup on Windows and a DMG on macOS. That helped some users, but I was now maintaining three different distribution channels.
Then version 1.1 came out. I had to ask everyone to re-download and re-install.
The Industry Reality Check
I posted about my struggles on Reddit. The responses were brutal:
"Distributing and updating desktop applications in python is an absolutehellscape" (bjorneylol, 23 votes)
"I'd personally recommend a web app 100% of the time for python. It completelyavoids any dependency chaos you'd encounter with a true desktop app"(j01101111sh, 30 votes)
"Real industry experience here: Build a web app. For installable applications,ship compiled binaries built with rust, c++, .net. Shipping python applicationsis a pain. The customer gets the source code" (Substantial-Bed8167, 36 votes)
"If it's external software... an actual desktop application written in pythonwould make me seriously question the software house" (konwiddak, 1 vote)The message was clear: Python desktop apps are for internal tools. For production software, use web apps or compiled languages.
The Four Core Problems
1. Dependency Chaos Across Environments
With a web app, I deploy to one server. I control that server. Python version, packages, environment variables - all consistent.
Web App Deployment:┌─────────────┐│ Server │ ← One environment to manage│ Python ││ Packages ││ Config │└──────┬──────┘ │ ▼┌─────────────────────────────────────────┐│ Users access via browser (any device) │└─────────────────────────────────────────┘
Desktop App Deployment:┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐│ User A │ │ User B │ │ User C │ │ User D ││ Python? │ │ Python? │ │ Python? │ │ Python? ││ Ver??? │ │ Ver??? │ │ Ver??? │ │ Ver??? │└─────────┘ └─────────┘ └─────────┘ └─────────┘ ↑ ↑ ↑ ↑ └────────────┴────────────┴────────────┘ │ Every machine is differentWith desktop apps, each user’s machine is a unique snowflake of Python versions, installed packages, system libraries, and permissions.
2. Source Code Exposure
I bundled my app with PyInstaller and thought my code was safe. Then a user sent me this:
# They extracted my bundled code in 30 seconds$ pyi-archive_extractor myapp.exe$ ls extracted/ myapp.pyc # My compiled Python bytecode utils.pyc database.pyc api_keys.pyc # Oh no...PyInstaller bundles Python bytecode. Decompilers exist. Anyone with moderate technical skills can recover most of the source code.
With a web app, my code runs on my server. Users see HTTP responses. They never see the code.
3. Update Management is Hell
Desktop App Update Cycle:─────────────────────────Developer pushes code ↓Test on 3 operating systems ↓Build 3 different installers ↓Upload to distribution ↓Users must: - Know update exists - Download new version - Close running app - Install update - Restart app ↓Half your users are on old versions
Web App Update Cycle:─────────────────────Developer pushes code ↓Users refresh browser ↓Done (everyone on latest version)The desktop update cycle takes days or weeks. Users procrastinate. Versions fragment. I had to maintain backward compatibility with my own API because users refused to update.
4. Professional Credibility
This one stung. When I released a Python desktop app to a client, their technical lead asked:
“Why didn’t you use .NET? Or Electron? Is this a prototype?”
In enterprise software, Python desktop apps signal “internal tool” or “prototype.” Compiled binaries (Rust, C++, Go, .NET) signal “production software.”
Whether fair or not, this perception matters when selling software or presenting to clients.
When Desktop Actually Makes Sense
After all this, Python desktop apps still have valid use cases:
| Scenario | Why Desktop Works |
|---|---|
| Hardware interfacing | USB devices, serial ports, sensors need local access |
| Internal tools | You control all machines, know all configurations |
| Small user base | Under 50 users with known setups |
| Offline-first | Field work, remote locations, no internet |
For these cases, tools like PyInstaller, Briefcase, or Nuitka can work. But I now budget extra time for distribution headaches.
What I Do Now
For most projects, I build web apps with Python backends:
┌──────────────────────────────────────────────────┐│ Browser ││ ┌─────────────────────────────────────────────┐ ││ │ JavaScript/Vue/React Frontend (Optional) │ ││ └─────────────────────────────────────────────┘ │└──────────────────────┬───────────────────────────┘ │ HTTP ▼┌──────────────────────────────────────────────────┐│ Python Backend ││ ┌─────────────┐ ┌─────────────┐ ┌──────────┐ ││ │ FastAPI/ │ │ Business │ │ Database │ ││ │ Flask API │ │ Logic │ │ │ ││ └─────────────┘ └─────────────┘ └──────────┘ │└──────────────────────────────────────────────────┘ ↑ One deployment, all users benefitBenefits I get:
- One server to manage
- Source code stays private
- Updates happen instantly
- Works on any device with a browser
- I can use Python where it excels (backend logic)
Summary
In this post, I shared my experience struggling with Python desktop distribution and why industry developers recommend web apps instead. The four main problems are dependency chaos, source code exposure, update management, and professional credibility concerns.
If you need local execution, consider Rust, Go, or .NET for desktop apps. If you love Python, use it for web backends. The distribution model alone will save you weeks of headaches.
Final Words + More Resources
My intention with this article was to help others share my knowledge and experience. If you want to contact me, you can contact by email: Email me
Here are also the most important links from this article along with some further resources that will help you in this scope:
Oh, and if you found these resources useful, don’t forget to support me by starring the repo on GitHub!
Comments