Simple WP Plugin Update handling
A very simple way to handle self-hosted WordPress plugin updates
This uses the "update_plugins_{$hostname}" filter introduced in WP 5.8: https://developer.wordpress.org/reference/hooks/update_plugins_hostname/#parameters
How it works: you can define an "Update URI" parameter in the header of your plugin. If it's defined, it won't check for updates on wordpress.org, instead you can use the above mentioned filter to handle your own update logic. Inside the filter, you can simply return a JSON file from your backend, indicating if theres an update or not.
You can find a sample.json file, you can use that as an example to generate your own version. You can create this manually too, but recommended that you make a simple backend for this, so it is generated dynamically. You can implement licenese key check easily for example.