Platform for Orchestrating POPAL Updates & Patching.
A modern .NET 10 application with built-in auto-update functionality via GitHub Releases.
If you find this project useful, consider supporting its development:
Your support helps maintain and improve this project. Thank you!
- Multi-platform: Windows, macOS, Linux
- Auto-update: Automatic updates via GitHub Releases
- Reusable updater:
Popup.Updater.Corecan be used in other projects - Elevation handling: Automatic privilege elevation when needed
- Structured logging: Serilog for comprehensive logs
Popup/
├── src/
│ ├── Popup.Updater.Core/ # Reusable update library
│ ├── Popup.Updater.Launcher/ # Update executor (separate process)
│ └── Popup/ # Main application
└── tests/
└── Popup.Updater.Core.Tests/ # Unit tests
- .NET 10 SDK
- Visual Studio 2026 or later
dotnet restore
dotnet builddotnet run --project src/Popup/Popup.csprojThe updater is configured via updateconfig.json:
{
"updateSource": {
"type": "GitHub",
"owner": "your-github-username",
"repository": "popup",
"preRelease": false,
"assetNamePattern": "Popup-v{Version}-{Platform}-{Architecture}.zip"
},
"application": {
"name": "Popup",
"executableName": "Popup.exe",
"currentVersion": "1.0.0",
"installPath": null
},
"updater": {
"launcherExecutable": "Popup.Updater.Launcher.exe",
"tempDownloadPath": "./temp_updates",
"requestElevation": true
}
}dotnet add package Popup.Updater.Coreusing Popup.Updater.Core;
using Popup.Updater.Core.Services;
// Load configuration
var config = LoadConfiguration();
// Setup services
var platformHelper = new PlatformHelper();
var updateSource = new GitHubUpdateSource(config.UpdateSource, platformHelper, logger);
var updateChecker = new UpdateChecker(config, updateSource, logger);
// Check for updates
var updateInfo = await updateChecker.IsThereAnUpdateAsync();
if (updateInfo != null)
{
// Show update prompt to user
var updateLauncher = new UpdateLauncher(config, updateSource, platformHelper, logger);
await updateLauncher.StartUpdateAsync(updateInfo, progress);
}Releases are automatically created via GitHub Actions when you push a tag:
git tag v1.0.0
git push origin v1.0.0Release assets must follow this pattern:
- Windows:
Popup-v1.0.0-win-x64.zip - macOS Intel:
Popup-v1.0.0-osx-x64.zip - macOS Apple Silicon:
Popup-v1.0.0-osx-arm64.zip - Linux:
Popup-v1.0.0-linux-x64.zip
Each ZIP must contain:
- The application executable
Popup.Updater.Launcher.exe(or equivalent)- All dependencies
updateconfig.json
Logs are stored in:
- Application:
./Logs/popup-{date}.log - Updater:
%TEMP%/Popup/Logs/updater-{date}.log(Windows) or/tmp/Popup/Logs/updater-{date}.log(Unix)
- Updates are downloaded over HTTPS
- Asset URLs come directly from GitHub API
- Optional signature verification (TODO)
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
GPL-3.0 license - see LICENSE file for details
- Digital signature verification for updates
- Delta updates (only download changed files)
- Custom update sources (not just GitHub)
- UI progress window for updates
- Rollback capability