A long time ago, in a place not so far away, I wrote a framework which allowed a corporation to update an application it had deployed to 100+ remote locations with slow internet connections. Back then there were a few alternatives to rolling your own, but nothing seemed to have the feature set and development commitment from a Delphi component vendor. As a result, it was decided that I should implement one.
The entire AutoUpdate Framework was initially written in Delphi XE2. Although BITS was going to be used to transfer the ﬁles since it offers the ability to throttle bandwidth, in the end, for simplicity sake, web services were employed instead. Rather than a simple call to download an MSI, the framework provides a large degree of flexibility:
Do you simply want to generate and apply a binary patch?
Do you need to be able to apply a series of updates to bring the installation up to the current version?
Do you want to compress/zip the files to be delivered?
What about deploying additional files and removing obsolete ones?
Do you want to display a list of changes so the user can choose whether they update?
Do you want to notify the user that updates are available while they are using the application?
Do you want to make the update mandatory so bug fixes that are causing data issues are squashed ASAP?
Do you want to schedule the application of an update silently in the background at a given time in the middle of the night?
All these scenarios are supported and with a custom deployment application, you can see what version each user is running, any errors in the update process and when they last launched the application. It would be easy to extend the Server to accept bug reports and create an integration to your bug tracking system and/or CRM. Usage Telemetry could also be added, and if user’s don’t pay, an update can render your software inoperable.
Recently I resurrected the code to provide updates to a client during COVID, so I added Firebird support and changed the data model to track registrations (new application users). It would be very easy to extend the system with your own custom licensing code and track where your new users are located and how many “conversions” from trialware or lite to full versions you’re getting.
That’s the power of open source; no waiting for a vendor to implement the features you want for your use cases.
In subsequent posts, I will describe the moving parts of the system.