Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
96bff10
Updated for the net10 support
arcenox Nov 16, 2025
e4b0215
update to release version
arcenox Nov 16, 2025
62c3ffa
added release for net9
arcenox Nov 16, 2025
e5037dd
added pattern to skip commits using comments on commit for cherry pic…
arcenox Nov 16, 2025
ade2439
remove unecessary build command
arcenox Nov 16, 2025
ae2a674
fixed the sync
arcenox Nov 16, 2025
03bd174
updated cherry detections
arcenox Nov 16, 2025
cf21cac
try merge based on commit
arcenox Nov 16, 2025
15acdce
Fixed the json options to be isolated (#375)
arcenox Nov 17, 2025
f7b961a
Fix/schedulerbackground (#376)
arcenox Nov 17, 2025
0af984b
beta version 17 release (#382)
arcenox Nov 17, 2025
15dee40
Feature/improvements (#386)
arcenox Nov 19, 2025
9d82d89
Update README.md
arcenox Nov 19, 2025
7ce13e5
Update README.md
arcenox Nov 19, 2025
5ae6cc7
updated beta version
arcenox Nov 20, 2025
2ea014a
Feature/new improvements (#397)
arcenox Nov 23, 2025
c7eb219
releas of stable version
arcenox Nov 23, 2025
593c553
Update README.md
arcenox Nov 23, 2025
7d50613
Release of stable version.
arcenox Nov 23, 2025
e4c1801
Fix schema assignment logic and add SetSchema method (#415)
SpaceOgre Nov 27, 2025
5251bd4
Add support for enabling/disabling background services (#413)
SpaceOgre Nov 27, 2025
6f6a580
Update Directory.Build.props
arcenox Nov 27, 2025
2e06180
Added logo locally
arcenox Nov 27, 2025
5c8216b
Fix retry logic and add unit tests for ExecuteTaskAsync (#429)
SpaceOgre Nov 29, 2025
4f888cb
fix: namespace conflicts for ModuleInitializer attribute in TickerQIn…
HulinCedric Dec 1, 2025
ebb26bf
Update Directory.Build.props
arcenox Dec 10, 2025
d7716b9
Update Directory.Build.props
arcenox Dec 10, 2025
298ca68
fix update ExecutionTime for CronTickerOccurrence (#461)
AlexeyKhlebnikov Dec 26, 2025
baed026
feat: add configurable policy name for Host auth (#482)
jods4 Jan 12, 2026
f47b7fd
fix: Host auth. should not depend on Authorization header (#481)
jods4 Jan 12, 2026
42d42c6
[Feature] Remove ASP.NET Core dependency from TickerQ.Utilities to su…
EarlJester Jan 12, 2026
52039f1
Fix missing await to AuthenticateHostAsync call (#494)
jods4 Jan 13, 2026
d24022f
Fix #497 (#503)
jods4 Jan 18, 2026
79fbbb2
Fix stackoverflow in JsonExampleGenerator (#519)
stevewoj Feb 4, 2026
da2d6d3
Feature/tickerq hub (#508)
arcenox Feb 4, 2026
ea1da0d
pre-release
arcenox Feb 4, 2026
e591557
fix references
arcenox Feb 4, 2026
af1cfda
Add missing ASP.NET Core package references to TickerQ.SDK (#537)
arcenox Feb 5, 2026
0e26c20
Claude/fix aspnetcore namespace xuvot (#540)
arcenox Feb 5, 2026
b427a77
Remove invalid ASP.NET Core package references (#541)
arcenox Feb 5, 2026
6e233eb
Claude/remove invalid aspnetcore packages xuvot (#542)
arcenox Feb 5, 2026
b4c0fe1
Claude/remove invalid aspnetcore packages xuvot (#543)
arcenox Feb 5, 2026
8c7d16d
Enable NuGet package generation for Web SDK projects (#546)
arcenox Feb 5, 2026
c686a9d
Fix #511 and #517: null reference and orphaned cron ticker bugs (#549)
arcenox Feb 9, 2026
fd743f1
Fix thread-safety bugs, resource leaks, and scheduling issues (#550)
desty2k Feb 9, 2026
7d576b0
added extension method for WebApplication
arcenox Feb 9, 2026
ff0d780
pre-release
arcenox Feb 9, 2026
ab9165a
fix and pre-release
arcenox Feb 9, 2026
abc83f1
removed the not-needed reference from the Tickerq.
arcenox Feb 9, 2026
831cd76
fixed based on the tickerq architecture.
arcenox Feb 9, 2026
a0221d3
update version
arcenox Feb 9, 2026
75cf665
fix and pre-release...
arcenox Feb 9, 2026
f3814bb
release a stable version
arcenox Feb 9, 2026
f862640
release a stable version along with the new libs for the hub.
arcenox Feb 9, 2026
39b9b90
Fix .NET 9+ EF Core query failures caused by ReadOnlySpan array.Conta…
arcenox Feb 10, 2026
b2684f4
fix the dashboard...
arcenox Feb 10, 2026
61c72a8
Add comprehensive unit tests for core TickerQ components (#582)
arcenox Feb 11, 2026
cbbd680
added rickerq hub to readme file.
arcenox Feb 11, 2026
898f713
Fix authorize against HostAuthorizationPolicy when set (#591)
stevewoj Feb 12, 2026
6fe6bff
Added dashboard group name for the openapi (#585)
arcenox Feb 13, 2026
5776656
fixed unit testing and issue of (#586)
arcenox Feb 13, 2026
646a75a
added the sample for worker service
arcenox Feb 16, 2026
d79bf98
fix issue 522 (#587)
arcenox Feb 25, 2026
d664833
Add JSON-serializable tracking fields to TimeTickerEntity (#609)
stevewoj Mar 6, 2026
4ddd580
Fix UseApplicationDbContext implementation #498 (#590)
Kedireng Mar 6, 2026
094dff7
added unit tests for more edge cases coverage. (#623)
arcenox Mar 13, 2026
257e222
Improve branch sync workflow, migrate to slnx, and clean up repo (#628)
arcenox Mar 13, 2026
0a48b8e
Fix EF Core type mapping error for MySQL providers in MigrateDefinedC…
arcenox Mar 14, 2026
b9507cc
Add IsEnabled property to CronTickerEntity with full-stack support (#…
arcenox Mar 14, 2026
55cb507
Fix TickerModelCustomizer not applying configured schema (#635)
arcenox Mar 14, 2026
2656d5a
Replace reflection-based JSON serialization in Dashboard with source …
arcenox Mar 14, 2026
544edf1
Fix Dashboard failing with old Startup.cs pattern (IHost not implemen…
arcenox Mar 14, 2026
ed1cd1c
Relax abstractions version constraints and fix sync workflow version …
arcenox Mar 14, 2026
88202f9
Relax abstractions version constraints and fix sync workflow version …
arcenox Mar 14, 2026
0ffa7b0
Eliminate inline scripts from Dashboard for CSP script-src 'self' sup…
arcenox Mar 14, 2026
757d148
Fix Dashboard BasePath not working with UsePathBase (#332) (#651)
arcenox Mar 14, 2026
0370af5
Fix design-time DbContext failure when TickerQEfCoreOptionBuilder is …
arcenox Mar 14, 2026
1a11f10
Fix source generator namespace sanitization for assemblies with inval…
arcenox Mar 14, 2026
f193634
Fix empty request deserialization throwing JsonException (#463) (#658)
arcenox Mar 14, 2026
b639ed1
Fix dashboard date format to use browser locale (#581) (#663)
arcenox Mar 14, 2026
e6f328b
Fix dashboard date format to use locale-independent YYYY-MM-DD (#666)
arcenox Mar 14, 2026
252c472
Add per-function concurrency control via maxConcurrency parameter (#670)
arcenox Mar 14, 2026
d8d2255
Centralize test project versions for cross-branch compatibility (#673)
arcenox Mar 14, 2026
d45691f
Fix AddStackExchangeRedis overriding EF Core persistence provider (#676)
arcenox Mar 15, 2026
ea1268e
Fix Redis registration test and remove redundant Hosting.Abstractions…
arcenox Mar 15, 2026
53ef0e5
Fix dashboard date formatting by timezone region and cron ticker togg…
arcenox Mar 15, 2026
cb6fd30
new release 10.2.0
arcenox Mar 15, 2026
f281df8
Simplify EF Core DbContext session pattern (#688)
arcenox Mar 16, 2026
23b8e53
Add unit tests for DbContextLease resolution across DI configurations…
arcenox Mar 16, 2026
816fbdc
release for fix/ef-core-dbcontext-session-cleanup
arcenox Mar 16, 2026
c3e6a32
Add head-to-head BenchmarkDotNet comparisons vs Hangfire & Quartz (#697)
arcenox Mar 16, 2026
aa6c831
Register scoped DbContext from factory for direct injection (#700) (#…
arcenox Mar 16, 2026
0e54aa3
Restructure hub projects: move RemoteExecutor and SDKs into hub/ fold…
arcenox Mar 18, 2026
b0e7b1d
Add CLA workflow, CLA document, and contributing guidelines (#722)
arcenox Mar 21, 2026
29d3e62
Scope CLA workflow to main branch only
arcenox Mar 21, 2026
6d47f9c
Update README.md (#726)
albert-miden Mar 21, 2026
5a79497
Rewrite README: cleaner structure, feature highlights, contributors s…
arcenox Mar 21, 2026
90f0f6e
Fix Discord badge to use static badge instead of invalid server ID
arcenox Mar 21, 2026
157b270
Update README tagline and subtitle
arcenox Mar 21, 2026
c1da63e
Update copyright to Arcenox LLC, add Authors/Copyright to NuGet metadata
arcenox Mar 21, 2026
97e4f63
Add SECURITY.md with vulnerability reporting policy
arcenox Mar 21, 2026
d9fdb93
Rewrite branch sync from cherry-pick to merge-based approach (#744)
arcenox Mar 21, 2026
4598a48
Fix sync-overrides loading from target branch instead of main
arcenox Mar 21, 2026
f667d43
Fix sync workflow: load exclude/overrides from main, escape sed regex
arcenox Mar 21, 2026
539ef27
Fix version-range sed regex error by using awk for replacements
arcenox Mar 21, 2026
0cc8981
Fix sync builds: use $(DotNetVersion) for packages, detect .NET versi…
arcenox Mar 21, 2026
d7e38e5
Centralize version props in src/Directory.Build.props
arcenox Mar 21, 2026
32e6e96
Add CustomizerServiceDescriptor.cs to .sync-exclude
arcenox Mar 21, 2026
4aee441
Add retry for PR comment in sync workflow
arcenox Mar 21, 2026
4e56cfb
Fix dashboard WebSocket 405 when host uses MapStaticAssets (#456) (#723)
arcenox Mar 21, 2026
cfe67fe
Fix Oracle-incompatible boolean default in CronTicker migration (#716…
arcenox Mar 21, 2026
aef8825
Switch build and sync workflows to trigger on release
arcenox Mar 21, 2026
415f8c0
Add test step to release build workflow
arcenox Mar 21, 2026
287321d
Add Source Link and symbol package support (#743)
arcenox Mar 21, 2026
061d1ec
Fix dashboard date/time display for Windows timezone IDs (#717) (#719)
arcenox Mar 21, 2026
01f4e24
Skip TickerQ initialization in design-time tools (#712) (#763)
arcenox Mar 21, 2026
493e77d
Fix TickerFunctionProvider Build() race condition and add startup val…
arcenox Mar 21, 2026
eb6d8a3
Bump version to 10.2.3
arcenox Mar 21, 2026
c12c8ae
Fix build pipeline: restore only build targets, not samples
arcenox Mar 21, 2026
53f9d2b
Switch Sample.WorkerService from PackageReference to ProjectReference
arcenox Mar 21, 2026
053a50d
Merge main into net9
github-actions[bot] Mar 21, 2026
47926ea
Apply version-specific overrides for net9
github-actions[bot] Mar 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 30 additions & 22 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
name: Build NuGet Packages

on:
push:
branches:
- main
- net8
- net9
release:
types: [published]
workflow_dispatch:

jobs:
check-nuget:
Expand Down Expand Up @@ -95,7 +93,17 @@ jobs:
run: dotnet nuget add source "$(pwd)/nupkgs" --name LocalNupkgs

- name: Restore packages with local source
run: dotnet restore
run: |
dotnet restore src/TickerQ/TickerQ.csproj
dotnet restore src/TickerQ.EntityFrameworkCore/TickerQ.EntityFrameworkCore.csproj
dotnet restore src/TickerQ.Dashboard/TickerQ.Dashboard.csproj
dotnet restore src/TickerQ.Instrumentation.OpenTelemetry/TickerQ.Instrumentation.OpenTelemetry.csproj
dotnet restore src/TickerQ.Caching.StackExchangeRedis/TickerQ.Caching.StackExchangeRedis.csproj
dotnet restore hub/sdks/dotnet/TickerQ.SDK/TickerQ.SDK.csproj
dotnet restore hub/remoteExecutor/TickerQ.RemoteExecutor/TickerQ.RemoteExecutor.csproj
dotnet restore tests/TickerQ.Tests/TickerQ.Tests.csproj
dotnet restore tests/TickerQ.EntityFrameworkCore.Tests/TickerQ.EntityFrameworkCore.Tests.csproj
dotnet restore tests/TickerQ.Caching.StackExchangeRedis.Tests/TickerQ.Caching.StackExchangeRedis.Tests.csproj

- name: Build TickerQ.SourceGenerator
run: dotnet build src/TickerQ.SourceGenerator/TickerQ.SourceGenerator.csproj --configuration Release
Expand All @@ -109,6 +117,15 @@ jobs:
dotnet build src/TickerQ.Caching.StackExchangeRedis/TickerQ.Caching.StackExchangeRedis.csproj --configuration Release
dotnet build hub/sdks/dotnet/TickerQ.SDK/TickerQ.SDK.csproj --configuration Release
dotnet build hub/remoteExecutor/TickerQ.RemoteExecutor/TickerQ.RemoteExecutor.csproj --configuration Release
dotnet build tests/TickerQ.Tests/TickerQ.Tests.csproj --configuration Release
dotnet build tests/TickerQ.EntityFrameworkCore.Tests/TickerQ.EntityFrameworkCore.Tests.csproj --configuration Release
dotnet build tests/TickerQ.Caching.StackExchangeRedis.Tests/TickerQ.Caching.StackExchangeRedis.Tests.csproj --configuration Release

- name: Run tests
run: |
dotnet test tests/TickerQ.Tests/ --configuration Release --no-build
dotnet test tests/TickerQ.EntityFrameworkCore.Tests/ --configuration Release --no-build
dotnet test tests/TickerQ.Caching.StackExchangeRedis.Tests/ --configuration Release --no-build

- name: Pack other projects
run: |
Expand All @@ -120,12 +137,11 @@ jobs:
dotnet pack hub/sdks/dotnet/TickerQ.SDK/TickerQ.SDK.csproj --configuration Release --output ./nupkgs
dotnet pack hub/remoteExecutor/TickerQ.RemoteExecutor/TickerQ.RemoteExecutor.csproj --configuration Release --output ./nupkgs

- name: Show .nupkg file sizes
- name: Show package file sizes
run: |
echo "📦 Package sizes:"
for pkg in ./nupkgs/*.nupkg; do
size=$(du -h "$pkg" | cut -f1)
echo " - $(basename "$pkg"): $size"
for pkg in ./nupkgs/*.nupkg ./nupkgs/*.snupkg; do
[ -f "$pkg" ] && size=$(du -h "$pkg" | cut -f1) && echo " - $(basename "$pkg"): $size"
done

- name: Upload nupkgs artifact
Expand Down Expand Up @@ -172,7 +188,7 @@ jobs:
'Accept': 'application/vnd.github.v3+json'
},
body: JSON.stringify({
ref: 'main',
ref: '${{ github.event.release.target_commitish || github.ref_name }}',
inputs: {
version: version,
artifact_id: artifactId
Expand All @@ -190,18 +206,10 @@ jobs:
- name: Send Discord Notification
if: always()
run: |
# Safely handle the commit message
REPO_NAME="${GITHUB_REPOSITORY#*/}"
BRANCH="${GITHUB_REF#refs/heads/}"

if [[ "${{ github.event.head_commit.message }}" =~ ^Merge\ pull\ request ]]; then
PR_BRANCH=$(echo "${{ github.event.head_commit.message }}" | sed -n "s/Merge pull request #[0-9]\+ from [^/]*\/\(.*\)/\1/p")
MESSAGE="📦 *${REPO_NAME}* | Branch: \`${BRANCH}\` | Merged from: \`${PR_BRANCH}\`"
else
# Use a shortened commit message to avoid issues
SHORT_MSG=$(echo "${{ github.event.head_commit.message }}" | head -n1)
MESSAGE="📦 *${REPO_NAME}* | Branch: \`${BRANCH}\` | Commit: \`${SHORT_MSG}\`"
fi
BRANCH="${{ github.event.release.target_commitish || github.ref_name }}"
TAG="${{ github.event.release.tag_name || 'manual' }}"
MESSAGE="📦 *${REPO_NAME}* | Branch: \`${BRANCH}\` | Release: \`${TAG}\`"

# Determine status based on check-nuget and build results
if [ "${{ needs.check-nuget.result }}" != "success" ]; then
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,19 @@ jobs:
continue-on-error: true
run: |
for f in ./nupkgs/*.nupkg; do
echo "📦 Pushing $(basename "$f")..."
dotnet nuget push "$f" \
--source https://api.nuget.org/v3/index.json \
--api-key ${{ secrets.NUGET_API_KEY }} \
--skip-duplicate
done

- name: Publish symbols to NuGet
continue-on-error: true
run: |
for f in ./nupkgs/*.snupkg; do
[ -f "$f" ] || continue
echo "🔗 Pushing symbols $(basename "$f")..."
dotnet nuget push "$f" \
--source https://api.nuget.org/v3/index.json \
--api-key ${{ secrets.NUGET_API_KEY }} \
Expand Down
7 changes: 3 additions & 4 deletions .github/workflows/sync-version-branches.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
name: Sync Version Branches

on:
push:
branches:
- main
release:
types: [published]
workflow_dispatch:
inputs:
target_branches:
Expand All @@ -26,7 +25,7 @@ jobs:
pull-requests: write
issues: write

if: github.ref == 'refs/heads/main'
if: github.event_name == 'release' || github.event_name == 'workflow_dispatch'

strategy:
matrix:
Expand Down
5 changes: 3 additions & 2 deletions .sync-exclude
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ src/TickerQ.EntityFrameworkCore/Infrastructure/BasePersistenceProvider.cs
src/TickerQ.EntityFrameworkCore/Infrastructure/TickerQueryExtensions.cs
src/TickerQ.EntityFrameworkCore/Customizer/CustomizerServiceDescriptor.cs

# Solution file — main uses .slnx (net10+), older branches use .sln
TickerQ.sln
# Solution files — main uses .slnx (net10+), older branches use .sln
TickerQ.slnx
src/src.sln
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,13 @@

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="$(DotNetVersion)" />
<PackageReference Include="TickerQ" Version="$(Version)" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\src\TickerQ.SourceGenerator\TickerQ.SourceGenerator.csproj"
OutputItemType="Analyzer"
ReferenceOutputAssembly="false" />
<ProjectReference Include="..\..\src\TickerQ\TickerQ.csproj" />
</ItemGroup>


Expand Down
14 changes: 13 additions & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Version>9.2.2</Version>
<Version>9.2.3</Version>
<DotNetVersion>[9.0.0,10.0.0)</DotNetVersion>
<DotNetAbstractionsVersion>[10.0.0,11.0.0)</DotNetAbstractionsVersion>
<RepositoryUrl>https://github.com/arcenox-co/TickerQ</RepositoryUrl>
Expand All @@ -14,11 +14,23 @@
<PackageIcon>icon.jpg</PackageIcon>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<LangVersion>default</LangVersion>

<!-- Source Link -->
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<EmbedUntrackedSources>true</EmbedUntrackedSources>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<Deterministic>true</Deterministic>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>

<ItemGroup>
<None Include="..\..\icon.jpg" Pack="true" PackagePath="\" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="10.0.102" PrivateAssets="All" />
</ItemGroup>

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
using System.Text.Json;
using System.Text.Json.Serialization.Metadata;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Routing;
using TickerQ.Utilities.Entities;

namespace TickerQ.Dashboard.DependencyInjection
Expand Down Expand Up @@ -344,6 +345,15 @@ private static void MapPathBaseAware(this IApplicationBuilder app, string basePa
context.Request.PathBase = originalPathBase.Add(matchedPath);
context.Request.Path = remainingPath;

// Clear any endpoint matched by host-level routing so the branch's
// own UseRouting() re-evaluates against dashboard endpoints.
// Without this, host Map*() calls (e.g. MapStaticAssets().ShortCircuit())
// can cause the branch's routing middleware to skip evaluation — the
// EndpointRoutingMiddleware short-circuits when GetEndpoint() is non-null.
// This results in 405 responses for SignalR/WebSocket requests (#456).
context.SetEndpoint(null);
context.Request.RouteValues?.Clear();

try
{
await branch(context);
Expand Down
21 changes: 20 additions & 1 deletion src/TickerQ.Dashboard/Endpoints/DashboardEndpoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ private static IResult GetOptions<TTimeTicker, TCronTicker>(
IdleWorkerTimeOut = schedulerOptions.IdleWorkerTimeOut,
CurrentMachine = schedulerOptions.NodeIdentifier,
LastHostExceptionMessage = executionContext.LastHostExceptionMessage,
SchedulerTimeZone = schedulerOptions.SchedulerTimeZone?.Id
SchedulerTimeZone = ToIanaTimeZoneId(schedulerOptions.SchedulerTimeZone)
}, dashboardOptions.DashboardJsonOptions);
}

Expand Down Expand Up @@ -737,5 +737,24 @@ private static async Task<IResult> GetMachineJobs<TTimeTicker, TCronTicker>(
return Results.Json(machineJobs.Select(x => new TupleResponse<string, int> { Item1 = x.Item1, Item2 = x.Item2 }).ToArray(), dashboardOptions.DashboardJsonOptions);
}

internal static string? ToIanaTimeZoneId(TimeZoneInfo? timeZone)
{
if (timeZone == null)
return null;

var id = timeZone.Id;

// Already an IANA id (contains '/')
if (id.Contains('/') || id == "UTC")
return id;

// Convert Windows timezone id to IANA
if (TimeZoneInfo.TryConvertWindowsIdToIanaId(id, out var ianaId))
return ianaId;

// Fallback: return the original id
return id;
}

#endregion
}
Loading
Loading