Releases: Arcenox-co/TickerQ
Release list
v10.3.0
What's New in v10.3.0
Source Generator Overhaul
- Replaced
StringBuildercode generation with const string templates — cleaner, more maintainable - Extracted analyzers into dedicated classes:
MethodAnalyzer,ConstructorAnalyzer,InterfaceMethodAnalyzer - Generated
TickerFunctionRef/TickerFunctionRef<T>structs for type-safe function references - Uses
global::prefix for all generated type references (namespace-safe) - Handles C# keyword aliases (
string→System.String,int→System.Int32,byte[]→System.Byte[])
New MapTicker API
MapTicker<T>()— interface-based function registration with DI (no reflection, AOT-safe)MapTicker("name", lambda)— lambda-based function registrationMapTickerGroup()— group functions with shared config (max concurrency, lifetime)- Inline callback style:
services.MapTickerGroup("Orders", group => { ... }) - Variable style:
var group = services.MapTickerGroup("Orders"); group.MapTicker<ProcessOrder>();
- Inline callback style:
- Group prefixes function names:
"GroupName.ClassName"
ITickerQueryable Abstraction
- New
ITickerQueryable<T>interface — provider-agnostic fluent query builder - Supports:
Where(),OrderBy(),OrderByDescending(),Skip(),Take(),AsNoTracking(),WithRelated() - Terminal methods:
ToArrayAsync(),FirstOrDefaultAsync(),CountAsync(),ToPaginatedAsync() - EF Core implementation (
EfTickerQueryable) — translates to LINQ-to-SQL - In-memory implementation (
InMemoryTickerQueryable) — for Redis and other providers - New persistence provider methods:
TimeTickersQuery(),CronTickersQuery(),CronTickerOccurrencesQuery()
Dashboard AOT Compatibility
- Rewrote all endpoint handlers to accept only
HttpContext(NativeAOT compatible) - Replaced
Results.JsonwithWriteJsonhelper usingJsonTypeInfo - Rewrote
JsonExampleGeneratorto useJsonTypeInfo.Properties(zero reflection) - Fixed
StringToByteArrayConverterto useJsonTypeInfooverloads - Removed
DefaultJsonTypeInfoResolverfromDashboardJsonOptions - Added
IsAotCompatibleto Dashboard csproj - Zero AOT warnings from Dashboard code
AOT-Safe Request Serialization
WithJsonContext()API for user-provided AOTJsonSerializerContext- SignalR and exception serialization are now AOT-safe
Redis Provider Refactor
- Extracted
BaseRedisPersistenceProviderwith core scheduler logic (mirrors EF Core pattern) - Extracted helpers:
RedisKeyBuilder,RedisIndexManager,RedisSerializer - Moved Lua scripts to embedded
.luafiles (Acquire, Release, RecoverDeadNode) - AOT: source-gen
JsonSerializerContext,JsonTypeInfooverloads throughout - Added
TickerQRedisOptionBuilder.JsonSerializerContextfor user-provided AOT contexts - Added predicate filtering inside deserialization loop (reduced memory allocation)
Bug Fixes
- Fix startup cron occurrence duplicate scheduling (#776) — stale past-due occurrences from a previous app lifecycle are now optionally skipped on startup via
SkipStaleCronOccurrencesOnStartup()(opt-in, configurable threshold) - Fix
TickerFunctionProvider.Build()with concurrent test hosts (#784) — added locking to function and request type registrations to prevent lost registrations during concurrent host startup - Fix Dashboard host authentication (#786) — simplified to click-to-authenticate flow, removed direct access key input
Other
- Added cron validator with normalizer
- Updated logo from PNG to SVG
- Comprehensive unit tests for Redis persistence (32 persistence + 14 manager integration + 5 on-demand)
Contributors
Thanks to all contributors for this release! 🎉
- @HulinCedric — Fix TickerFunctionProvider.Build() with concurrent test hosts (#784)
- @vlevshits — Simplify host authentication flow (#786)
Full Changelog: v10.2.5...v10.3.0
v10.2.5
What's Changed
- Fix PostgreSQL incompatible boolean default in CronTicker by @arcenox in #779
- Adjust WebAPI sample with dashboard integration. by @RafaelJCamara in #777
Full Changelog: v10.2.4...v10.2.5
v10.2.4
What's New in 10.2.4
Bug Fixes
- Fix dashboard
InvalidOperationExceptionwith Host authentication (#408) — AddsUseAuthorization()to the dashboard'sMap()branch pipeline when auth is enabled, fixing the errorEndpoint contains authorization metadata, but a middleware was not found that supports authorizationwhen usingWithHostAuthentication()
Improvements
- Switch Sample.WorkerService to ProjectReference — Fixes sync build failures on net8/net9 branches where
$(Version)resolved to a NuGet version that doesn't exist yet. All sample projects now consistently use ProjectReference - Fix build pipeline restore — Restore only build targets instead of full solution to avoid sample project dependency issues in CI
No Breaking Changes
All changes are fully backwards-compatible. No API changes required.
v10.2.3
What's New in 10.2.3
Bug Fixes
- Fix
TickerFunctionProvider.Build()race condition (#705) —Build()is now thread-safe with alock, preventing concurrent hosts (e.g. multipleWebApplicationFactoryinstances in integration tests) from overwriting a populatedFrozenDictionarywith an empty one - Fix
NullReferenceExceptionon dashboard API — StaticFrozenDictionaryfields are now initialized to.Emptyinstead ofnull, preventing crashes whenUseTickerQ()is not called
Improvements
- Deferred initialization to hosted service (#712) —
UseTickerQ()no longer performs I/O (DB seeding, function discovery). All initialization is deferred toTickerQInitializerHostedService.StartAsync(), which means design-time tools (dotnet-ef,dotnet-getdocument, OpenAPI generators) no longer crash when building the host - Proper async seeding — DB seeding is now properly
awaited instead of using.GetAwaiter().GetResult(), eliminating potential deadlocks - Startup validation warnings — New
TickerQStartupValidatorhosted service warns at startup when:UseTickerQ()was not called- No
[TickerFunction]methods are found in the application
- Source Link & symbol packages — NuGet packages now include
.snupkgsymbol packages and Source Link metadata for improved debugging
Dashboard
- Fix timezone parsing for dashboard date/time display (#757)
No Breaking Changes
All changes are fully backwards-compatible. No API changes required.
TickerQ v10.2.0 / v9.2.0 / v8.2.0
What's New
Features
- Per-function concurrency control — New
maxConcurrencyparameter on ticker attributes to limit concurrent executions per function (#670) - IsEnabled property for CronTickerEntity — Enable/disable individual cron tickers with full-stack support (API, Dashboard, EF Core) (#632)
- JSON-serializable tracking fields — Added serializable tracking fields to
TimeTickerEntityfor better observability (#609) — thanks @stevewoj - Dashboard OpenAPI group name — Custom group name support for Dashboard OpenAPI endpoints (#585)
Bug Fixes
- Dashboard date formatting — Fixed timezone-region-aware date formatting and cron ticker toggle bug (#683)
- Dashboard date format — Use locale-independent
YYYY-MM-DDformat (#666, #663) - Redis overriding EF Core — Fixed
AddStackExchangeRedisoverriding the EF Core persistence provider (#676) - Empty request deserialization — Fixed
JsonExceptionon empty request body (#658) - Source generator namespace sanitization — Fixed namespace generation for assemblies with invalid C# identifier characters (#657)
- Design-time DbContext — Fixed failure when
TickerQEfCoreOptionBuilderis unavailable at design time (#652) - Dashboard BasePath — Fixed
BasePathnot working withUsePathBase(#651) - CSP compliance — Eliminated inline scripts from Dashboard for
script-src 'self'Content Security Policy support (#648) - Legacy Startup.cs pattern — Fixed Dashboard failing when
IHostdoesn't implementIApplicationBuilder(#641) - Reflection-free Dashboard JSON — Replaced reflection-based JSON serialization in Dashboard with source generators (#638)
- Schema customizer — Fixed
TickerModelCustomizernot applying the configured schema (#635) - MySQL type mapping — Fixed EF Core type mapping error for MySQL providers in
MigrateDefinedCronTickers(#631) - UseApplicationDbContext — Fixed
UseApplicationDbContextimplementation (#590) — thanks @Kedireng - Authorization policy — Fixed
AuthorizeagainstHostAuthorizationPolicywhen set (#591) — thanks @stevewoj - Fix issue #522 — Resolved reported issue (#587)
- Unit testing fix — Fixed test infrastructure issue (#586)
Infrastructure & Testing
- Centralized test project versions for cross-branch compatibility (#673)
- Relaxed abstractions version constraints and fixed sync workflow version handling (#645, #647)
- Improved branch sync workflow, migrated to
.slnx, and cleaned up repo (#628) - Added comprehensive unit tests for core TickerQ components (#582, #623)
- Fixed Redis registration test and removed redundant
Hosting.Abstractionsreference (#680) - Added worker service sample project
- Added TickerQ Hub to README
NuGet Packages
| Package | v10.x | v9.x | v8.x |
|---|---|---|---|
| TickerQ | 10.2.0 | 9.2.0 | 8.2.0 |
| TickerQ.EntityFrameworkCore | 10.2.0 | 9.2.0 | 8.2.0 |
| TickerQ.Dashboard | 10.2.0 | 9.2.0 | 8.2.0 |
| TickerQ.StackExchangeRedis | 10.2.0 | 9.2.0 | 8.2.0 |
| TickerQ.OpenTelemetry | 10.2.0 | 9.2.0 | 8.2.0 |
| TickerQ.Utilities | 10.2.0 | 9.2.0 | 8.2.0 |
Contributors
Thank you to everyone who contributed to this release! 🎉
- @Kedireng (Ingmar Olmaru) — Fix UseApplicationDbContext implementation (#590)
- @stevewoj (Steve) — JSON-serializable tracking fields (#609), Fix authorization policy (#591)
Full Changelog: 10.1.1...10.2.0
v10.1.1
What's Changed
- fix update ExecutionTime for CronTickerOccurrence by @AlexeyKhlebnikov in #461
- feat: add configurable policy name for Host auth by @jods4 in #482
- fix: Host auth. should not depend on Authorization header by @jods4 in #481
- [Feature] Remove ASP.NET Core dependency from TickerQ.Utilities to support all .NET platforms by @EarlJester in #480
- Fix PR #481: missing await to AuthenticateHostAsync call by @jods4 in #494
- Add missing
Zsuffix when formating execution time by @jods4 in #503 - Fix stackoverflow in JsonExampleGenerator by @stevewoj in #519
- Feature/tickerq hub by @arcenox in #508
- Add missing ASP.NET Core package references to TickerQ.SDK by @arcenox in #537
- Claude/fix aspnetcore namespace xuvot by @arcenox in #540
- Remove invalid ASP.NET Core package references by @arcenox in #541
- Claude/remove invalid aspnetcore packages xuvot by @arcenox in #542
- Claude/remove invalid aspnetcore packages xuvot by @arcenox in #543
- Enable NuGet package generation for Web SDK projects by @arcenox in #546
- Fix #511 and #517: null reference and orphaned cron ticker bugs by @arcenox in #549
- Fix thread-safety bugs, resource leaks, and scheduling issues by @desty2k in #550
- Convert array parameters to lists in LINQ queries for EF Core by @arcenox in #574
New Contributors
- @AlexeyKhlebnikov made their first contribution in #461
- @jods4 made their first contribution in #482
- @EarlJester made their first contribution in #480
- @stevewoj made their first contribution in #519
- @desty2k made their first contribution in #550
Full Changelog: 10.0...10.1.1
TickerQ v10.0
What's Changed
- Adding unit test by @aryanriyahi in #81
- ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
- docs: update Discord link in README by @RafaelJCamara in #103
- Implement Human Readable Cron Expression by @teesofttech in #96
- Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
- refactor: remove unused variables and using statements. by @RafaelJCamara in #116
- Updated Readme docs by @teesofttech in #119
- Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
- #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
- chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
- feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
- feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
- feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
- Updated the invoke on condition if is declated only by @arcenox in #137
- Fixed the creation of CronTicker from api by @arcenox in #148
- Add ability to override default schema by @Arthur9205 in #144
- Add Tarc94 to backers on Readme by @arcenox in #156
- feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
- Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
- docs: update readme with more developer tips by @RafaelJCamara in #162
- V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
- Fixed the update cron ticker by @arcenox in #191
- Fix authorization host authorization with roles by @vaital3000 in #197
- Border Radius table style fix by @jacokok in #196
- Minimal Readme file for github by @arcenox in #194
- Added pragmas into source generators. by @zetroot in #212
- UI assets basepath runtime by @arcenox in #213
- open ticker clock interface by @arcenox in #214
- fixed the missing generated id on models by @arcenox in #215
- Target .NET 8 and .NET 9 by @0xced in #169
- Beta version of net8.0 by @arcenox in #321
- Enhance UseTickerSeeder by @mdemrulkayes in #325
- Change the delete behavior of TimeTicker by @mdemrulkayes in #329
- Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
- updated source generator to netstandard2.0 by @arcenox in #352
- Hotfix/serialization request fix by @arcenox in #350
- Fixed the json options to be isolated by @arcenox in #375
- Fix/schedulerbackground by @arcenox in #376
- beta version 17 release by @arcenox in #382
- Feature/improvements by @arcenox in #386
- Feature/new improvements by @arcenox in #397
- Fix schema assignment logic and add SetSchema method by @SpaceOgre in #415
- Add support for enabling/disabling background services by @SpaceOgre in #413
- Fix retry logic and add unit tests for ExecuteTaskAsync by @SpaceOgre in #429
- fix: Namespace conflicts for ModuleInitializer attribute by @HulinCedric in #433
New Contributors
- @RafaelJCamara made their first contribution in #101
- @teesofttech made their first contribution in #96
- @neozhu made their first contribution in #117
- @jova1971 made their first contribution in #124
- @Arthur9205 made their first contribution in #144
- @ewilliams0305 made their first contribution in #164
- @vaital3000 made their first contribution in #197
- @jacokok made their first contribution in #196
- @zetroot made their first contribution in #212
- @0xced made their first contribution in #169
- @mdemrulkayes made their first contribution in #325
- @SpaceOgre made their first contribution in #415
- @HulinCedric made their first contribution in #433
Full Changelog: v2.4.0...10.0
TickerQ v9.0
What's Changed
- Adding unit test by @aryanriyahi in #81
- ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
- docs: update Discord link in README by @RafaelJCamara in #103
- Implement Human Readable Cron Expression by @teesofttech in #96
- Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
- refactor: remove unused variables and using statements. by @RafaelJCamara in #116
- Updated Readme docs by @teesofttech in #119
- Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
- #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
- chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
- feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
- feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
- feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
- Updated the invoke on condition if is declated only by @arcenox in #137
- Fixed the creation of CronTicker from api by @arcenox in #148
- Add ability to override default schema by @Arthur9205 in #144
- Add Tarc94 to backers on Readme by @arcenox in #156
- feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
- Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
- docs: update readme with more developer tips by @RafaelJCamara in #162
- V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
- Fixed the update cron ticker by @arcenox in #191
- Fix authorization host authorization with roles by @vaital3000 in #197
- Border Radius table style fix by @jacokok in #196
- Minimal Readme file for github by @arcenox in #194
- Added pragmas into source generators. by @zetroot in #212
- UI assets basepath runtime by @arcenox in #213
- open ticker clock interface by @arcenox in #214
- fixed the missing generated id on models by @arcenox in #215
- Target .NET 8 and .NET 9 by @0xced in #169
- Beta version of net8.0 by @arcenox in #321
- Enhance UseTickerSeeder by @mdemrulkayes in #325
- Change the delete behavior of TimeTicker by @mdemrulkayes in #329
- Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
- updated source generator to netstandard2.0 by @arcenox in #352
- Hotfix/serialization request fix by @arcenox in #350
New Contributors
- @RafaelJCamara made their first contribution in #101
- @teesofttech made their first contribution in #96
- @neozhu made their first contribution in #117
- @jova1971 made their first contribution in #124
- @Arthur9205 made their first contribution in #144
- @ewilliams0305 made their first contribution in #164
- @vaital3000 made their first contribution in #197
- @jacokok made their first contribution in #196
- @zetroot made their first contribution in #212
- @0xced made their first contribution in #169
- @mdemrulkayes made their first contribution in #325
Full Changelog: v2.4.0...9.0
TickerQ v8.0
What's Changed
- Adding unit test by @aryanriyahi in #81
- ci: add simple GH action to run when a PR is open. by @RafaelJCamara in #101
- docs: update Discord link in README by @RafaelJCamara in #103
- Implement Human Readable Cron Expression by @teesofttech in #96
- Merge branch 'main' of https://github.com/Arcenox-co/TickerQ by @neozhu in #117
- refactor: remove unused variables and using statements. by @RafaelJCamara in #116
- Updated Readme docs by @teesofttech in #119
- Fixed the properties to make it compatible with lazy load and also ch… by @arcenox in #120
- #93 Dashboard displays incorrect executed at time after refresh (when… by @jova1971 in #124
- chore: add dashboard sample with basic authentication by @RafaelJCamara in #126
- feat(dashboard): add tooltip to Cron Ticker page by @RafaelJCamara in #127
- feat(dashboard): add tooltips for time ticker view. by @RafaelJCamara in #134
- feat(dashboard): route to dashboard when we click on logo or TickerQ name. by @RafaelJCamara in #132
- Updated the invoke on condition if is declated only by @arcenox in #137
- Fixed the creation of CronTicker from api by @arcenox in #148
- Add ability to override default schema by @Arthur9205 in #144
- Add Tarc94 to backers on Readme by @arcenox in #156
- feat(dashboard): add pagination to declared functions and used machines by @RafaelJCamara in #165
- Added example in readme to start TickerQ manually. by @ewilliams0305 in #164
- docs: update readme with more developer tips by @RafaelJCamara in #162
- V2.5.0-preview, Updated dashboard view and major fixes in Multinode and functionality by @arcenox in #179
- Fixed the update cron ticker by @arcenox in #191
- Fix authorization host authorization with roles by @vaital3000 in #197
- Border Radius table style fix by @jacokok in #196
- Minimal Readme file for github by @arcenox in #194
- Added pragmas into source generators. by @zetroot in #212
- UI assets basepath runtime by @arcenox in #213
- open ticker clock interface by @arcenox in #214
- fixed the missing generated id on models by @arcenox in #215
- Target .NET 8 and .NET 9 by @0xced in #169
- Beta version of net8.0 by @arcenox in #321
- Enhance UseTickerSeeder by @mdemrulkayes in #325
- Change the delete behavior of TimeTicker by @mdemrulkayes in #329
- Extended Termination of a job with detailed and also with adjustable … by @arcenox in #349
- updated source generator to netstandard2.0 by @arcenox in #352
- Hotfix/serialization request fix by @arcenox in #350
New Contributors
- @RafaelJCamara made their first contribution in #101
- @teesofttech made their first contribution in #96
- @neozhu made their first contribution in #117
- @jova1971 made their first contribution in #124
- @Arthur9205 made their first contribution in #144
- @ewilliams0305 made their first contribution in #164
- @vaital3000 made their first contribution in #197
- @jacokok made their first contribution in #196
- @zetroot made their first contribution in #212
- @0xced made their first contribution in #169
- @mdemrulkayes made their first contribution in #325
Full Changelog: v2.4.0...8.0.0
TickerQ 2.4.0
🚀 TickerQ v2.4.0
✅ What's New
-
Execution on Demand
Introduced support for programmatically triggering cron ticker executions. -
Console Application Support
TickerQ now runs as a standalone console application, making it suitable for headless environments.
Includes example usage and setup.
Fixes & Improvements
-
#78 – Added reference to
Microsoft.Extensions.Hosting.Abstractionsto ensure hosting compatibility.
by @snargledorf -
#77 – Added console runner support along with usage examples.
by @arcenox -
#76 – Add support for on-demand execution in cron ticker.
by @snargledorf -
#74 – Display a dedicated exception dialog when cron ticker execution fails.
by @snargledorf -
#73 – Explicitly call
AddApplicationPart()with theTickerQControllerassembly for proper controller discovery in ASP.NET hosts.
by @snargledorf
🛠 Internal / Misc
- Improved modularity and structure in runners
- Cleaned up hosting logic for better extensibility
- Refactored examples to be clearer for first-time users
📌 Tag: v2.4.0
📅 Released: 2025-07-14