Add a new community article announcing the upcoming official React UI template for ABP Framework, providing an early overview of architecture, features, and technology choices. Includes the post markdown and three supporting images under docs/en/Community-Articles/2026-03-12-official-react-ui-is-coming-to-abp-framework.
Updated the article to improve clarity and fix grammatical errors. Enhanced the explanation of the Tutorial Validator's functionality and importance in maintaining accurate documentation.
Add schedule validation and make dynamic workers replaceable. Introduced DynamicBackgroundWorkerSchedule.Validate (checks Period > 0) and call Validate() in all provider managers (in-memory, Hangfire, Quartz, TickerQ). Switched in-memory dynamic worker storage to ConcurrentDictionary and ensure adding a worker with an existing name stops/removes the previous instance before registering the new one; removals use TryRemove. Updated docs to clarify that adding a worker replaces an existing one and that CronExpression is only supported by scheduler-backed providers. Added tests for replacement behavior and invalid period values.
Introduce RemoveAsync and UpdateScheduleAsync to IBackgroundWorkerManager and implement them for the default in-memory manager, Hangfire, Quartz and TickerQ providers. The default BackgroundWorkerManager now tracks dynamic workers in a dictionary, supports stopping/removing workers and recreating workers with a new schedule; provider-specific managers update scheduler entries or remove recurring jobs accordingly. Documentation updated with usage examples for removing and updating schedules, and unit tests added to cover removal, schedule updates and non-existent worker behavior.
Introduce runtime dynamic background workers: add DynamicBackgroundWorkerExecutionContext, DynamicBackgroundWorkerSchedule, IDynamicBackgroundWorkerHandlerRegistry and its implementation. Extend IBackgroundWorkerManager with AddAsync overloads to register handlers by name and schedule. Provide InMemoryDynamicBackgroundWorker for in-process execution and provider-specific adapters/implementations for Hangfire, Quartz and TickerQ (including Hangfire/Quartz/TickerQ adapters and manager changes) to schedule and execute dynamic handlers. Update BackgroundWorkerManager to hold IServiceProvider and the handler registry and wire DI through constructors. Add a docs example and unit tests to verify handler registration and execution.
Rename the internal anonymous transport job name from "AnonymousJob" to "Abp.AnonymousJob" and update docs accordingly. Add null/whitespace argument checks (Check.NotNull / Check.NotNullOrWhiteSpace) in anonymous handler registration and lookup APIs. Change background job managers (Hangfire, Quartz, RabbitMQ, TickerQ, Default) to only wrap jobs as anonymous when an anonymous handler is registered and there is no typed job configuration (check via BackgroundJobOptions.GetJobOrNull). Wire AbpBackgroundJobOptions into affected managers and update tests with a new case verifying that a typed job prevents anonymous wrapping.
Introduce AnonymousJobExecutionContext and switch anonymous job handler APIs to accept it (Func<AnonymousJobExecutionContext, CancellationToken, Task> / Action<AnonymousJobExecutionContext, CancellationToken>). Update AbpBackgroundJobOptions, IAnonymousJobHandlerRegistry, AnonymousJobHandlerRegistry and AnonymousJobExecutorAsyncBackgroundJob to use the new context and to obtain a cancellation token via ICancellationTokenProvider. Update all callsites (tests, demo module, sample job creator) and documentation to show registering/enqueuing anonymous handlers by name and explain Hangfire display behavior. Also add a .cursor hooks state file. The demo no longer skips enqueuing anonymous jobs for RabbitMQ in this change.
Add a new Community-Articles post introducing TutorialValidator and its purpose, architecture, and usage. Adds docs/en/Community-Articles/2026-03-10-Tutorial-Validator/article.md and three supporting images (image.png, image-1.png, image-2.png). The article links to the project repo and explains phases (Analyst, Executor, Reporter), modes (Docker/local), and extensibility.
Refactor scripting examples to consistently await db.query(...) into named table variables (e.g. productTable, customerTable, orderTable, entityTable, orderLineTable) and use those variables for subsequent operations. Adjusted examples to await where() when needed and updated aggregation/collection examples accordingly. Also clarified semantics for first/last/single variants in the API table. Changes applied to docs/en/low-code/scripting-api.md and docs/en/low-code/custom-endpoints.md to keep example patterns consistent and clearer for consumers.
Replace setting CommandName property with the CommandInterceptorDescriptor(string) constructor in examples. Updated docs/en/low-code/fluent-api.md and docs/en/low-code/interceptors.md to pass "Create" and "Delete" as constructor arguments to simplify and clarify interceptor declarations; no functional change to behavior.
Rename documentation headings and links from "Fluent API & Attributes" to "Attributes & Fluent API" across the low-code docs and navigation for consistency. Add a Fluent API example for registering interceptors (with sample C#) and a reference link in interceptors.md. Fix a typo changing "DefaultsLayer" to "DefaultLayer" and add a license notice and minor formatting fixes in the low-code index.
Update low-code scripting API docs to clarify and expose configurable limits. Adds a new Configuration section with an example Configure<AbpLowCodeScriptingOptions> showing script and query limits (null = no limit). Changes many default values in Sandbox Constraints and Query Security Limits from concrete numbers to "No limit", removes per-group/item rows (MaxItemsPerGroup, MaxTotalGroupedItems) and consolidates group limits to MaxGroupCount. Notes that all limits default to null and should be set according to security requirements and expected workload.