First off, thank you for considering contributing to FluentTaskScheduler! It is people like you that make this tool actually useful.
Before you submit a pull request or open an issue asking why the project will not compile, please review the following guidelines.
If you want to build this project from source, you cannot just use Notepad. You will need:
- Visual Studio 2022 (17.8 or later)
- .NET 8 SDK
- The "Windows application development" workload installed in Visual Studio. (If you skip this, WinUI 3 will not work, and the build will fail. You have been warned.)
- Fork the repository to your own GitHub account.
- Clone the project to your local machine.
- Create a new branch for your feature or bug fix (
git checkout -b feature/my-brilliant-idea). - Write your code and make sure it actually compiles.
- Test your changes locally. If you add a feature that runs tasks as SYSTEM, please make sure it does not destroy your own OS first.
- Commit your changes with clear, descriptive commit messages. "Fixed stuff" is not a descriptive message.
- Push to your fork and submit a Pull Request against the
mainbranch.
Please try to match the existing code style. We use C# and WinUI 3. Keep things clean, use meaningful variable names, and leave comments if you are doing something overly complicated.
Please use the provided GitHub Issue templates. Fill them out completely. We cannot fix a bug if your entire report is "it crashed".
This project uses VeloPack for auto-updates. If you are a maintainer creating a release, here is the workflow:
-
Install the VeloPack CLI (one-time):
dotnet tool install -g vpk
-
Publish and package — one MSI per architecture, scope chosen by the end user at install time. Requires vpk 0.0.1444-gc245055 or later (
dotnet tool update -g vpkordotnet tool update -g vpk --prereleaseto upgrade). Change 1.X.X to the desired version number.# x64 dotnet publish -c Release -r win-x64 --self-contained -p:Platform=x64 vpk pack -u FluentTaskScheduler -v 1.X.X -o Releases/x64 -p bin/x64/Release/net8.0-windows10.0.19041.0/win-x64/publish -e FluentTaskScheduler.exe --msi --instLocation Either --msiBanner Assets/MSI-Banner.bmp --msiLogo Assets/MSI-Logo.bmp # ARM64 dotnet publish -c Release -r win-arm64 --self-contained -p:Platform=ARM64 vpk pack -u FluentTaskScheduler -v 1.X.X -o Releases/arm64 -p bin/arm64/Release/net8.0-windows10.0.19041.0/win-arm64/publish -e FluentTaskScheduler.exe --msi --instLocation Either --msiBanner Assets/MSI-Banner.bmp --msiLogo Assets/MSI-Logo.bmp # Fix zero-dated entries in Portable ZIPs (vpk sets all timestamps to 1980-01-01) Add-Type -Assembly System.IO.Compression.FileSystem $now = Get-Date foreach ($zip in @("Releases/x64/FluentTaskScheduler-win-Portable.zip", "Releases/arm64/FluentTaskScheduler-win-Portable.zip")) { $archive = [System.IO.Compression.ZipFile]::Open($zip, 'Update') foreach ($entry in $archive.Entries) { $entry.LastWriteTime = $now } $archive.Dispose() } # Copy to dist folder -> Making it ready for release Copy-Item -Path "Releases/x64/FluentTaskScheduler-win-Portable.zip" -Destination "Dist/Portable-x64.zip" -Force; Copy-Item -Path "Releases/x64/FluentTaskScheduler-win.msi" -Destination "Dist/Setup-x64.msi" -Force; Copy-Item -Path "Releases/arm64/FluentTaskScheduler-win-Portable.zip" -Destination "Dist/Portable-arm64.zip" -Force; Copy-Item -Path "Releases/arm64/FluentTaskScheduler-win.msi" -Destination "Dist/Setup-arm64.msi" -Force;
The resulting
Setup-x64.msiandSetup-arm64.msipresents a standard MSI UI where the user selects Per User or Machine-Wide installation. -
Upload
Setup-x64.msi,Setup-arm64.msi,Portable-x64.zip,Portable-arm64.zipfrom the Dist folder to a GitHub Release. The app will pick these up automatically for in-app updates.
Ready-made manifests live in the packaging/ folder. After each GitHub Release you need to update the version number and SHA-256 hashes in these files, then follow the submission steps below.
(Get-FileHash "Dist\Setup-x64.msi" -Algorithm SHA256).Hash
(Get-FileHash "Dist\Setup-arm64.msi" -Algorithm SHA256).Hash
(Get-FileHash "Dist\Portable-x64.zip" -Algorithm SHA256).Hash
(Get-FileHash "Dist\Portable-arm64.zip" -Algorithm SHA256).HashManifests location: packaging/winget/
The three required files follow the winget multi-file manifest schema v1.6:
| File | Purpose |
|---|---|
TRGamer-tech.FluentTaskScheduler.yaml |
Version manifest |
TRGamer-tech.FluentTaskScheduler.locale.en-US.yaml |
Localised metadata |
TRGamer-tech.FluentTaskScheduler.installer.yaml |
Installer URLs + hashes |
Submission steps:
-
Update
PackageVersionin all three files to the new version (e.g.1.8.1). -
In the installer manifest, replace both
InstallerSha256placeholders with the real hashes. -
Update both
InstallerUrlpaths to point to the new GitHub Release tag. -
Validate locally (requires winget CLI 1.6+):
winget validate packaging\winget\
-
Fork microsoft/winget-pkgs and copy the three files to:
manifests/t/TRGamer-tech/FluentTaskScheduler/<version>/ -
Open a Pull Request. Automated validation runs; once it passes a maintainer will merge it.
Tip:
wingetcreate updatecan automate steps 1–3:winget install wingetcreate wingetcreate update TRGamer-tech.FluentTaskScheduler --version 1.8.1 ` --urls "https://github.com/TRGamer-tech/FluentTaskScheduler/releases/download/V1.8.1/Setup-x64.msi|x64|msi" ` "https://github.com/TRGamer-tech/FluentTaskScheduler/releases/download/V1.8.1/Setup-arm64.msi|arm64|msi" ` --submit
Manifest location: packaging/scoop/fluenttaskscheduler.json
Scoop uses the Portable ZIPs (no installer required).
Submission steps:
-
In
fluenttaskscheduler.json, update"version"to the new version string. -
Replace both
"hash"placeholders (<SHA256_OF_Portable-*.zip>) with the real hashes. -
Update both
"url"values in thearchitectureblock to the new release tag. -
Test locally:
scoop install packaging\scoop\fluenttaskscheduler.json
-
Option A — Submit to ScoopInstaller/Extras (preferred for non-mainstream apps):
- Fork the bucket, copy
fluenttaskscheduler.jsonto thebucket/folder, open a PR.
- Fork the bucket, copy
-
Option B — Maintain your own bucket (e.g.
TRGamer-tech/scoop-bucket):-
Create a repo, put the JSON in its root.
-
Users add it with:
scoop bucket add trgamertech https://github.com/TRGamer-tech/scoop-bucket scoop install fluenttaskscheduler
-
autoupdatesupport: The manifest already includescheckverandautoupdatesections. Bucket maintainers can runscoop checkver fluenttaskschedulerto detect new releases and auto-generate updated hashes.
Package location: packaging/chocolatey/
| File | Purpose |
|---|---|
fluenttaskscheduler.nuspec |
Package metadata |
tools/chocolateyInstall.ps1 |
Silent install script |
Submission steps:
-
Update
<version>influenttaskscheduler.nuspecto the new version. -
Update
$versionand$checksum64(with the x64 MSI hash) inchocolateyInstall.ps1. -
Update the
$url64download URL to point to the new release tag. -
Build and test the package locally:
cd packaging\chocolatey choco pack # creates fluenttaskscheduler.<version>.nupkg choco install fluenttaskscheduler --source . -y # local install test choco uninstall fluenttaskscheduler -y # cleanup
-
Submit to the Chocolatey Community Repository:
choco push fluenttaskscheduler.<version>.nupkg --source https://push.chocolatey.org/ --api-key <YOUR_API_KEY>
The package enters a moderation queue. Automated virus scanning and a human review must pass before it goes live (usually 1–3 business days).
Note: Chocolatey currently only supports x64 via
Install-ChocolateyPackage. ARM64 users should install from the MSI directly until native ARM64 package support is mainstream.