Releases
Versioning
The Payroll Engine uses Semantic Versioning. The current version 0.y.z marks the pre-release phase of initial development.
| ๐ง This is a Pre-Release version. Until release 1.0, breaking changes are possible at any time. |
|---|
Changes that may not be backward compatible during pre-release:
- REST API endpoints
- Database schema โ requires database re-initialization
- JSON schema โ requires adaptation of existing JSON files
Semantic Versioning 2.0.0, Item #4: Major version zero (0.y.z) is for initial development. Anything MAY change at any time. The public API SHOULD NOT be considered stable.
Release Artifacts
A release contains the following artifacts:
Docker Images (GitHub Container Registry)
ghcr.io/payroll-engine/payrollengine.backendโ Backend API serverghcr.io/payroll-engine/payrollengine.payrollconsoleโ Payroll Consoleghcr.io/payroll-engine/payrollengine.webappโ Web Application
See the Container Setup page for installation instructions.
Release Assets (download from Assets section below)
| โก๏ธ Continue to Releases |
|---|
v0.10.0-beta.1 - Mar 2026
Highlights
- Payrun Job Preview โ synchronous single-employee calculation without persisting results
- Async Payrun Job Queue โ background processing with bounded channel and webhook notification
- Parallel Employee Processing โ configurable parallelism with thread-safe state isolation
- Bulk Employee Creation โ high-throughput import via
SqlBulkCopy - Excel Regulation Import โ full regulation import from Excel workbooks
- Load Testing Framework โ generate, setup, execute, and benchmark payrun performance
- CI/CD Release Pipeline โ single-click wave-based release with version guard and dry-run
- Docker & GitHub Packages โ automated container builds and NuGet publishing
- Authentication & Security โ configurable auth modes, CORS, rate limiting, script safety analysis
CI/CD & Infrastructure
- New orchestrated release pipeline with wave-based build ordering and single-click release via GitHub Actions
- Version guard prevents accidental overwrites of existing releases, packages, and tags
Directory.Build.propsauto-updated, committed, and tagged by the workflow- Dry-run mode for pipeline testing without side effects
- GitHub Packages as primary NuGet source for all
PayrollEngine.*packages - New
nuget.configwith package source mapping (PayrollEngine.*โ GitHub Packages,*โ NuGet.org) - Dedicated sync workflow for selective NuGet.org publishing
- Automated Linux container builds for Backend, PayrollConsole, and WebApp published to
ghcr.io/payroll-engine/* swagger.jsonauto-generated from Backend via Swashbuckle CLI and attached to releases- New
ci.ymlworkflow for build and test on pull requests and pushes tomain - Updated exchange schema (
PayrollEngine.Exchange.schema.json)
Backend
New Features
- Payrun job preview endpoint (
POST .../payruns/jobs/preview) - Synchronous single-employee payrun calculation without persisting results
- Returns
PayrollResultSetwith wage type, collector, and payrun results - Supports any
RetroPayMode; returns HTTP 422 if retro is triggered - Asynchronous payrun job processing with background queue
PayrunJobQueuewith bounded channel for backpressure (capacity: 100)PayrunJobWorkerServiceasBackgroundServicefor job dequeuing and processing- Job pre-created and persisted before enqueue, returns HTTP 202 with location header
- Webhook notification on job completion or abort
- Configurable parallel employee processing (
MaxParallelEmployees) - Values:
0/off(sequential, default),half,max,-1(automatic),1โN(explicit) - Per-employee
PayrunEmployeeScopefor mutable state isolation - Thread-safe progress reporting with batched DB persistence (every 10 employees)
- Employee processing timing logs (
LogEmployeeTiming) - Bulk employee creation endpoint (
POST .../employees/bulk) usingSqlBulkCopy - Retro payrun period limit (
MaxRetroPayrunPeriods, default: 0/unlimited) - CORS configuration (
Cors) with AllowedOrigins, AllowedMethods, AllowedHeaders, AllowCredentials, PreflightMaxAgeSeconds - Rate limiting (
RateLimiting) with global policy and dedicated payrun job start policy - Configurable authentication (
Authentication) with modes:None,ApiKey,OAuth - OAuth with Authority, Audience, RequireHttpsMetadata, ClientSecret
- Startup validation for OAuth authority and audience
- Explicit Swagger toggle (
EnableSwagger, default: false) - Per-category audit trail configuration (
AuditTrail) replacing singleAuditTrailDisabledbool - Script safety analysis (
ScriptSafetyAnalysis, default: false) for banned API usage detection - Configurable database collation check (
DbCollation, default: SQL_Latin1_General_CP1_CS_AS) - New
PayrollServerConfigurationfor centralized server settings ConsolidatedPayrunResultQueryfor consolidated payrun result queries- Updated database scripts for schema version 0.9.6
Breaking Change
- Refactored
PayrunJobInvocationfrom id-based to name/identifier-based references - Removed
PayrunIdandUserIdproperties from API and domain models PayrunNameandUserIdentifierare now the required fields
Bug Fixes
- Fixed inverted slot filter logic in
GetCaseValuesAsync - Fixed
NullReferenceExceptionin timeless case value path - Fixed sort lookup values by
RangeValueinBuildRangeBrackets - Fixed calculator cache key to include culture
- Fixed deterministic culture fallback in
CalculateEmployeeAsynctoen-US - Fixed
CodeFactory.CodeFilesrace condition withConcurrentDictionary - Fixed thread-safe timer initialization in
AssemblyCache - Fixed sync-over-async bridge in scripting layer
- Added production
UseExceptionHandlermiddleware for structured JSON error responses
Console
- New
PayrunEmployeePreviewTestcommand for testing payrun job preview results - New
PayrollMergecommand โ merges multiple payroll files (JSON or YAML) into a single file - New load test commands:
LoadTestGenerate,LoadTestSetup,LoadTestSetupCases,PayrunLoadTest - New
.pecmdfile type registration scripts included in the release package Register-PecmdExtension.ps1โ Windows (user-level, no admin required)register-pecmd.shโ Linux (MIME + desktop integration) and macOS (shell wrapper)- Fixed case relation validate script publisher comparing build expression instead of validate expression
- Fixed collector custom result culture validation
Web App
- Fixed SSL certificate validation bypass with config-controlled
AllowInsecureSslsetting - Fixed
HttpClientsingleton disposal inBackendServiceBase - Fixed
NullReferenceExceptioninSetupUserTasks - Fixed
TaskServiceinjection inUserSessionfrom[Inject]attribute to constructor injection - Enabled
UseHstsin production pipeline
Libraries
- Client Services โ fixed inverted condition in
ReportParameterParser, fixedGetContinuePeriodsloop termination, fixedWeekPayrollCycle.GetPayrollPeriodweek offset - Client Test โ new
PayrunEmployeePreviewTestRunner, fixed null reference and collector custom result issues - Client Scripting โ fixed
JsonElementnull handling, deep copy inCaseValue,Date.Tomorrow/Yesterdayas computed properties, off-by-one fixes, updatedIPayrunRuntime; addedRetroSumwage type accessor (^$WageType.RetroSum) andGetRetroWageTypeValueSum(number/name)scripting API - Client Core โ new
NamespaceUpdateTool,AddCasesBulkAsync, async payrun job support, fixed inverted validation and duplicate detection,HttpClientownership pattern - Core โ new
PayrunPreviewRetroException, replaced SHA1 with SHA256, regex timeout for ReDoS prevention, stream and DataTable fixes
v0.9.0-beta17 - Feb 18, 2026
- Backend
- Added OAuth support, configurable in
appsettings.json. -
Assembly cache: added tenant isolation
- All import, export, and test commands now support for
YAML. - New command
PayrollConvert.- Converts payroll files between
JSONandYAML. - Support for file masks and recursive conversions.
- Converts payroll files between
-
Wiki: updated examples to
YAML. -
Client Services
- New
YamlReaderandYamlWriterto read and writeYAMLfiles. - Support for JSON schema embedding in YAML files.
v0.9.0-beta16 - Feb 11, 2026
- Lookup Range Brackets
- New objects lookup range result containing a list of lookup range brackets.
- Each bracket is defined by a numeric range from
RangeStarttoRangeEndincluding the lookup key and value. - The
RangeValuefield in each bracket contains the distributed value for progressive lookups, as well as the amount used from the matching bracket. -
For an example check the Lookup test.
-
Scripting API
- Payroll function: added acces to the lookup range bracktes.
- Payroll function: added access the threshold lookup bracket using a range value.
-
Payroll function: added access to progressive lookup bracktes using a range value.
- Payroll controller: new endpoint to get the payroll lookup ranges.
- Action parser: alternative text added for the logical operators
&&(AND) and operator||(OR). - Regulation audit trail Breaking Change
- The regulation audit trail is now disabled by default.
- Enable the audit trail configuration in
appsettings.json: Script: enable or disbable auditing of scripts.Lookup: enable or disbable auditing of lookups and lookup values.Input: enable or disbable auditing of cases, case fields and case relations.Payrun: enable or disbable auditing of collectors and wage types.Report: enable or disbable auditing of reports, report templates and report parameters.
v0.9.0-beta15 - Feb 5, 2026
- No-Code Actions
- Actions
Min,Max,Range,Contains: support for time range. - New action
Within: test if a value is within a range. - New action
GetTimeSpan: duration between two dates. - New action
YearDiff: calculate years between two dates. - New action
Age: calculate age. - New actions
SameYear,SameMonth,SameDay: test for equal dates. - Action value: added timespan/year/month/day properties.
-
Action value: added methods to add and subtract year/month/day/timespan.
-
Scripting API
-
Payroll function: added properties year/month/day for cycle/period start and end date.
-
Improved bulk data import performance for lookups.
- Regulation page action grid: use italic font style for comments.
v0.9.0-beta14 - Jan 14, 2026
- New feature Async payrun job processing Payroll-Engine/PayrollEngine.Backend#6
- Implement asynchronous payrun job processing using Channel
and BackgroundService. - Return HTTP 202 Accepted immediately with Location header for status polling.
- Prevent HTTP 524 timeout errors when processing large payrolls (500+ employees).
- Backend Breaking Changes:
- POST
/api/tenants/{id}/payruns/jobsnow returns HTTP202 Acceptedinstead of HTTP201 Created. - Response includes Location header for status polling.
- Clients must poll status endpoint to determine job completion.
- Implement asynchronous payrun job processing using Channel
- Test library: added support for async payrun jobs.
- Web App payrun jobs page: added support for async payrun jobs.
See Release Archive for earlier releases.