Skip to content

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 server
  • ghcr.io/payroll-engine/payrollengine.payrollconsole โ€” Payroll Console
  • ghcr.io/payroll-engine/payrollengine.webapp โ€” Web Application

See the Container Setup page for installation instructions.

Release Assets (download from Assets section below)

  • REST API swagger.json
  • Scripting developer reference
  • Service developer reference
โžก๏ธ 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.props auto-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.config with 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.json auto-generated from Backend via Swashbuckle CLI and attached to releases
  • New ci.yml workflow for build and test on pull requests and pushes to main
  • 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 PayrollResultSet with wage type, collector, and payrun results
  • Supports any RetroPayMode; returns HTTP 422 if retro is triggered
  • Asynchronous payrun job processing with background queue
  • PayrunJobQueue with bounded channel for backpressure (capacity: 100)
  • PayrunJobWorkerService as BackgroundService for 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 PayrunEmployeeScope for 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) using SqlBulkCopy
  • 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 single AuditTrailDisabled bool
  • Script safety analysis (ScriptSafetyAnalysis, default: false) for banned API usage detection
  • Configurable database collation check (DbCollation, default: SQL_Latin1_General_CP1_CS_AS)
  • New PayrollServerConfiguration for centralized server settings
  • ConsolidatedPayrunResultQuery for consolidated payrun result queries
  • Updated database scripts for schema version 0.9.6

Breaking Change

  • Refactored PayrunJobInvocation from id-based to name/identifier-based references
  • Removed PayrunId and UserId properties from API and domain models
  • PayrunName and UserIdentifier are now the required fields

Bug Fixes

  • Fixed inverted slot filter logic in GetCaseValuesAsync
  • Fixed NullReferenceException in timeless case value path
  • Fixed sort lookup values by RangeValue in BuildRangeBrackets
  • Fixed calculator cache key to include culture
  • Fixed deterministic culture fallback in CalculateEmployeeAsync to en-US
  • Fixed CodeFactory.CodeFiles race condition with ConcurrentDictionary
  • Fixed thread-safe timer initialization in AssemblyCache
  • Fixed sync-over-async bridge in scripting layer
  • Added production UseExceptionHandler middleware for structured JSON error responses

Console

  • New PayrunEmployeePreviewTest command for testing payrun job preview results
  • New PayrollMerge command โ€” merges multiple payroll files (JSON or YAML) into a single file
  • New load test commands: LoadTestGenerate, LoadTestSetup, LoadTestSetupCases, PayrunLoadTest
  • New .pecmd file 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 AllowInsecureSsl setting
  • Fixed HttpClient singleton disposal in BackendServiceBase
  • Fixed NullReferenceException in SetupUserTasks
  • Fixed TaskService injection in UserSession from [Inject] attribute to constructor injection
  • Enabled UseHsts in production pipeline

Libraries

  • Client Services โ€” fixed inverted condition in ReportParameterParser, fixed GetContinuePeriods loop termination, fixed WeekPayrollCycle.GetPayrollPeriod week offset
  • Client Test โ€” new PayrunEmployeePreviewTestRunner, fixed null reference and collector custom result issues
  • Client Scripting โ€” fixed JsonElement null handling, deep copy in CaseValue, Date.Tomorrow/Yesterday as computed properties, off-by-one fixes, updated IPayrunRuntime; added RetroSum wage type accessor (^$WageType.RetroSum) and GetRetroWageTypeValueSum(number/name) scripting API
  • Client Core โ€” new NamespaceUpdateTool, AddCasesBulkAsync, async payrun job support, fixed inverted validation and duplicate detection, HttpClient ownership 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

  • Console

  • All import, export, and test commands now support for YAML.
  • New command PayrollConvert.
    • Converts payroll files between JSON and YAML.
    • Support for file masks and recursive conversions.
  • Wiki: updated examples to YAML.

  • Client Services

  • New YamlReader and YamlWriter to read and write YAML files.
  • 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 RangeStart to RangeEnd including the lookup key and value.
  • The RangeValue field 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.

  • Backend

  • 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.

  • Backend

  • Improved bulk data import performance for lookups.

  • Web App

  • 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/jobs now returns HTTP 202 Accepted instead of HTTP 201 Created.
    • Response includes Location header for status polling.
    • Clients must poll status endpoint to determine job completion.
  • 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.