diff --git a/docs/en/Community-Articles/2026-06-28-working-with-dapr-workflows/POST.md b/docs/en/Community-Articles/2026-06-28-working-with-dapr-workflows/POST.md
new file mode 100644
index 0000000000..04ef9f648e
--- /dev/null
+++ b/docs/en/Community-Articles/2026-06-28-working-with-dapr-workflows/POST.md
@@ -0,0 +1,439 @@
+# Working with Dapr Workflows in the ABP Framework
+
+Most real business processes don't finish in a single request.
+
+An order gets placed, inventory gets checked, a payment gets charged, and the customer gets notified. Each step can fail, time out, or need a retry. And the whole thing has to survive a process restart without losing its place or charging someone twice.
+
+We usually solve this with a pile of queues, a state table, and a lot of defensive code to track where each process is. It works, but the business logic ends up scattered across handlers and database rows, and nobody can read the flow top to bottom anymore.
+
+[I covered **Elsa** in two earlier articles](https://abp.io/community/search?tag=elsa) as one way to handle workflows in ABP. **Dapr Workflow** takes a different path: instead of an in-app engine, the workflow engine runs in the [**Dapr sidecar**](https://docs.dapr.io/concepts/dapr-services/sidecar/), and you write the process as ordinary C# code that Dapr makes durable. If the host crashes halfway through, the workflow picks up right where it left off.
+
+In this article, we'll build a small Dapr Workflow inside a fresh ABP project and run it end to end. By the time you reach the bottom, you should be able to copy the code, run it, and watch a workflow march through its steps.
+
+> **Note:** Versions matter here, because both ABP and Dapr move fast. This article is written in June 2026 against **ABP 10.4** (.NET 10), **Dapr 1.18**, and the **`Dapr.Workflow` 1.18.x** package. The `Dapr.Workflow` package was rewritten in Dapr 1.17, so older tutorials you find online may use a different API.
+
+## What Dapr Workflow Actually Is?
+
+You define a [**workflow**](https://docs.dapr.io/developing-applications/building-blocks/workflow/) that orchestrates a process, and [**activities**](https://docs.dapr.io/developing-applications/building-blocks/workflow/workflow-overview/#workflows-and-activities) that do the actual work (call a database, hit an API, send an email).
+
+> **This is orchestration rather than choreography:** one place drives the process, instead of services reacting to each other's events. The definitions live in your app, but the engine that executes them runs in the Dapr sidecar next to it.
+
+```mermaid
+flowchart LR
+ subgraph App["Your ABP App"]
+ WF["OrderProcessingWorkflow"]
+ ACT["Activities CheckInventory, ProcessPayment, NotifyCustomer"]
+ end
+ subgraph Sidecar["Dapr Sidecar"]
+ ENGINE["Workflow Engine (durable execution)"]
+ end
+ STORE[("State Store Redis")]
+
+ App -->|gRPC| Sidecar
+ Sidecar -->|reads / writes history| STORE
+```
+
+The key idea is **durable execution**. Dapr records every step to a state store, so the workflow can be replayed from history at any time. A crash, a deployment, or a scale-out event doesn't lose progress, and a workflow can run for seconds or for months.
+
+> ⚠️ One rule follows from this: **workflow code must be deterministic**. No `DateTime.Now`, no random values, no direct I/O. Anything non-deterministic goes into an activity. Even logging is affected, so inside a workflow you use `context.CreateReplaySafeLogger()` instead of a normal logger, otherwise every replay repeats your log lines.
+
+Under the hood, this all runs on [**Dapr actors**](https://docs.dapr.io/developing-applications/building-blocks/actors/actors-overview/), which is why the state store has to support actors. The good news is that the default local setup already handles this, as you'll see in a moment.
+
+---
+
+## A Quick Note on ABP and Dapr
+
+ABP already ships a set of Dapr integration packages: `Volo.Abp.Dapr` (the core package), `Volo.Abp.EventBus.Dapr` and `Volo.Abp.AspNetCore.Mvc.Dapr.EventBus` (distributed event bus over Dapr pub/sub), `Volo.Abp.Http.Client.Dapr` (service invocation), and `Volo.Abp.DistributedLocking.Dapr` (distributed locking). You can read all about them in the [ABP Dapr integration documentation](https://abp.io/docs/latest/framework/dapr).
+
+These cover pub/sub, service-to-service calls, and locking. **Workflows are not part of ABP's Dapr integration**, and that's fine. Dapr Workflow has its own first-class .NET SDK (`Dapr.Workflow`), and you plug it straight into your ABP app like any other .NET library. So in this article we use the Dapr SDK directly, inside an ABP startup template.
+
+> **Note:** If you'd like to see deeper Dapr integration in ABP, or you'd like us to build a dedicated piece around Dapr Workflow, feel free to open a new issue on the [ABP GitHub repository](https://github.com/abpframework/abp/issues). Telling us what you need is the best way to help us prioritize it.
+
+---
+
+## What We'll Build
+
+To keep this concrete, we'll build a small **order processing** workflow, the classic example for this kind of thing.
+
+The workflow takes an order, checks inventory, charges the customer, then notifies them. If the item is out of stock, it stops early and returns a rejected result. Nothing fancy on the business side, but it's enough to show the parts that matter: how a workflow chains activities, how state survives across steps, and how you start and track an instance.
+
+Here's the flow we're aiming for:
+
+- An order comes in with a product, a quantity, and a price
+- **Check inventory**: if there isn't enough stock, reject the order and stop
+- **Process payment**: charge the customer
+- **Notify the customer**: let them know the order went through
+- Return a final result
+
+Each of those steps will be an **activity**, and the workflow is the code that orchestrates them. Let's set up the project and build it.
+
+## Prerequisites
+
+Before we start, make sure you have these installed:
+
+- **.NET 10 SDK**
+- **ABP CLI** (the current Studio CLI). Install it with `dotnet tool install -g Volo.Abp.Studio.Cli` (or update with `dotnet tool update -g Volo.Abp.Studio.Cli`)
+- **Docker**, running on your machine
+- [**Dapr CLI**, initialized once with `dapr init`](https://docs.dapr.io/getting-started/)
+
+That last step matters. When you run `dapr init` in self-hosted mode, Dapr pulls a few containers (including Redis) and writes a default `statestore.yaml` component. That default state store already has `actorStateStore: "true"` set, which is exactly what Dapr Workflow needs. So once `dapr init` finishes, you can run workflows locally with zero extra configuration.
+
+
+
+> **Pro Tip:** If you ever swap the default Redis store for your own component, double-check that it sets `actorStateStore: "true"`. Without it, workflows silently fail to start, and it's the line people forget most often.
+
+## Create the Project
+
+In this article I'll create a new layered solution with **EF Core** as the database provider, using the ABP CLI.
+
+> If you already have an ABP project, you don't need a new one. You can apply the following steps to your existing solution and skip this section.
+
+Create a new solution named `DaprWorkflowDemo` (or whatever you want):
+
+```bash
+abp new DaprWorkflowDemo
+```
+
+Once the download finishes, your project boilerplate is ready. Open the solution in your IDE and run the `DaprWorkflowDemo.Web` project once to confirm the app starts and the UI works.
+
+> Since, we have created the solution via ABP Studio CLI, it automatically runs the initial-tasks, which init database, seed initial data and run `abp install-libs` command, so, no need run the **DbMigrator* project.
+
+> Default admin username is **admin** and the password is **1q2w3E***. You can use these credentials to login...
+
+We'll do all the workflow work inside the `DaprWorkflowDemo.Web` project, since that's the running host where the workflow engine connects to the sidecar.
+
+## Install the Dapr.Workflow Package
+
+Open a terminal in the `DaprWorkflowDemo.Web` project folder and add the package:
+
+```bash
+dotnet add package Dapr.Workflow
+```
+
+-> **This single package gives you everything:** the base `Workflow` and `WorkflowActivity` types, the `AddDaprWorkflow` registration helper, and the `DaprWorkflowClient` you use to start and query workflows from code.
+
+## Define the Workflow and Its Activities
+
+Now let's write the order processing flow we sketched out earlier.
+
+First, create a `Workflows` folder in the `DaprWorkflowDemo.Web` project. We'll keep everything there for simplicity.
+
+Every input and output in a workflow gets serialized to the state store, so the types you pass around should be simple, JSON-friendly records (**_ensure they are serializable!_**). Let's define them:
+
+```csharp
+namespace DaprWorkflowDemo.Web.Workflows;
+
+public record OrderPayload(string OrderId, string ProductName, int Quantity, decimal TotalPrice);
+
+public record InventoryResult(bool InStock);
+
+public record OrderResult(string OrderId, string Status);
+```
+
+Now the workflow itself. A workflow derives from `Workflow` and reads top to bottom like a normal method, even though every step is durably persisted:
+
+```csharp
+using Dapr.Workflow;
+using Microsoft.Extensions.Logging;
+using System.Threading.Tasks;
+
+namespace DaprWorkflowDemo.Web.Workflows;
+
+public class OrderProcessingWorkflow : Workflow
+{
+ public override async Task RunAsync(WorkflowContext context, OrderPayload order)
+ {
+ var logger = context.CreateReplaySafeLogger();
+ logger.LogInformation("Starting order {OrderId}: {Quantity} x {ProductName}",
+ order.OrderId, order.Quantity, order.ProductName);
+
+ // 1. Check inventory
+ var inventory = await context.CallActivityAsync(
+ nameof(CheckInventoryActivity), order);
+
+ if (!inventory.InStock)
+ {
+ logger.LogWarning("Order {OrderId} rejected: out of stock", order.OrderId);
+ return new OrderResult(order.OrderId, "Rejected: out of stock");
+ }
+
+ // 2. Process the payment
+ await context.CallActivityAsync(nameof(ProcessPaymentActivity), order);
+
+ // 3. Notify the customer
+ await context.CallActivityAsync(nameof(NotifyCustomerActivity), order);
+
+ logger.LogInformation("Order {OrderId} completed", order.OrderId);
+ return new OrderResult(order.OrderId, "Completed");
+ }
+}
+```
+
+A couple of things worth pointing out here.
+
+- `CallActivityAsync` does not invoke the activity directly. It schedules the work with the workflow engine, which records the result once the activity completes. If the process dies right after the payment step, Dapr replays the workflow, feeds it the already-recorded results for the completed steps, and resumes at the notification step. The customer never gets charged twice. This is the **task chaining** pattern.
+- Notice the replay-safe logger too. Because the engine replays the workflow to rebuild its state, a normal logger would print the same lines over and over. `context.CreateReplaySafeLogger()` logs only on the first real pass.
+- Now the activities. An activity is where the real work happens, and the only place you're allowed to be non-deterministic. It derives from `WorkflowActivity` and supports constructor injection, so you can pull in your ABP services, repositories, or any registered dependency:
+
+```csharp
+using Dapr.Workflow;
+using Microsoft.Extensions.Logging;
+using System.Threading.Tasks;
+
+namespace DaprWorkflowDemo.Web.Workflows;
+
+public class CheckInventoryActivity : WorkflowActivity
+{
+ private readonly ILogger _logger;
+
+ public CheckInventoryActivity(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public override Task RunAsync(WorkflowActivityContext context, OrderPayload order)
+ {
+ _logger.LogInformation("Checking inventory for {ProductName}", order.ProductName);
+
+ // Pretend we queried a stock service or a repository here.
+ var inStock = order.Quantity <= 100;
+
+ return Task.FromResult(new InventoryResult(inStock));
+ }
+}
+
+public class ProcessPaymentActivity : WorkflowActivity
+{
+ private readonly ILogger _logger;
+
+ public ProcessPaymentActivity(ILogger logger)
+ {
+ _logger = logger;
+ }
+
+ public override Task