- {%{{{ item.name }}}%}
+ @for (item of list; track: trackByTenantAccountId) {
+
+ {%{{{ item.name }}}%}
+ }
`,
})
class DemoComponent {
diff --git a/docs/en/framework/ui/common/leptonx-css-variables.md b/docs/en/framework/ui/common/leptonx-css-variables.md
new file mode 100644
index 0000000000..938bc92304
--- /dev/null
+++ b/docs/en/framework/ui/common/leptonx-css-variables.md
@@ -0,0 +1,126 @@
+```json
+//[doc-seo]
+{
+ "Description": "Explore LeptonX CSS Variables to customize theming with ease, controlling colors, spacing, and styles for a cohesive application design."
+}
+```
+
+# LeptonX CSS Variables Documentation
+
+LeptonX uses CSS custom properties (variables) prefixed with `--lpx-*` to provide a flexible theming system. These variables control colors, spacing, shadows, and component-specific styles throughout the application.
+
+## Brand & Semantic Colors
+
+| Variable | Description |
+|----------|-------------|
+| `--lpx-brand` | Brand-specific accent color |
+| `--lpx-brand-text` | Text color used on brand-colored backgrounds |
+
+## Base Colors
+
+| Variable | Description |
+|----------|-------------|
+| `--lpx-light` | Light shade for subtle backgrounds or text |
+| `--lpx-dark` | Dark shade for contrasting elements |
+
+## Layout & Surface Colors
+
+| Variable | Description |
+|----------|-------------|
+| `--lpx-content-bg` | Main content area background color |
+| `--lpx-content-text` | Default text color for content areas |
+| `--lpx-card-bg` | Card component background color |
+| `--lpx-card-title-text-color` | Card title text color |
+| `--lpx-border-color` | Default border color for dividers and outlines |
+| `--lpx-shadow` | Box shadow definition for elevated elements |
+
+## Navigation
+
+| Variable | Description |
+|----------|-------------|
+| `--lpx-navbar-color` | Navbar background color |
+| `--lpx-navbar-text-color` | Navbar default text/icon color |
+| `--lpx-navbar-active-text-color` | Navbar active/hover text color |
+| `--lpx-navbar-active-bg-color` | Navbar active item background color |
+
+## Utility
+
+| Variable | Description |
+|----------|-------------|
+| `--lpx-radius` | Global border-radius value for rounded corners |
+
+## Global Override
+
+Applies to all themes and pages:
+
+```css
+:root {
+ /* Brand & Semantic */
+ --lpx-brand: #f72585;
+
+ /* Base Colors */
+ --lpx-light: #f5f7fb;
+ --lpx-dark: #0b0f19;
+
+ /* Layout & Surface */
+ --lpx-content-bg: #101018;
+ --lpx-content-text: #cfd6e4;
+ --lpx-card-bg: #151a2b;
+ --lpx-card-title-text-color: #ffffff;
+ --lpx-border-color: #242836;
+ --lpx-shadow: 0 10px 30px rgba(0, 0, 0, 0.25);
+
+ /* Navigation */
+ --lpx-navbar-color: #0d1020;
+ --lpx-navbar-text-color: #aab2c8;
+ --lpx-navbar-active-text-color: #ffffff;
+ --lpx-navbar-active-bg-color: rgba(247, 37, 133, 0.15);
+
+ /* Utility */
+ --lpx-radius: 10px;
+}
+
+```
+
+## Theme-Scoped Override
+
+Applies only when a specific theme class is active (e.g., `.lpx-theme-dark` on `` or ``):
+
+```css
+:root .lpx-theme-dark {
+ /* Brand & Semantic */
+ --lpx-brand: #4dd0e1;
+
+ /* Base Colors */
+ --lpx-light: #e0f7fa;
+ --lpx-dark: #020617;
+
+ /* Layout & Surface */
+ --lpx-content-bg: #0b1118;
+ --lpx-content-text: #c7d0e0;
+ --lpx-card-bg: #111a24;
+ --lpx-card-title-text-color: #e6f1ff;
+ --lpx-border-color: #1e2a3a;
+ --lpx-shadow: 0 12px 32px rgba(0, 0, 0, 0.45);
+
+ /* Navigation */
+ --lpx-navbar-color: #0f1a22;
+ --lpx-navbar-text-color: #9fb3c8;
+ --lpx-navbar-active-text-color: #ffffff;
+ --lpx-navbar-active-bg-color: rgba(77, 208, 225, 0.18);
+
+ /* Utility */
+ --lpx-radius: 12px;
+}
+```
+
+## Component/Page-Specific Override
+
+For targeted customizations that should only affect a specific section:
+
+```css
+.my-custom-page {
+ --lpx-brand: #e91e63;
+ --lpx-card-bg: #1a1a2e;
+}
+```
\ No newline at end of file
diff --git a/docs/en/get-started/empty-aspnet-core-application.md b/docs/en/get-started/empty-aspnet-core-application.md
index 78eb744eda..5bcec4ebb6 100644
--- a/docs/en/get-started/empty-aspnet-core-application.md
+++ b/docs/en/get-started/empty-aspnet-core-application.md
@@ -11,7 +11,7 @@ This tutorial explains how to start ABP from scratch with minimal dependencies.
## Create a New Project
-1. Create a new AspNet Core Web Application with Visual Studio 2022 (17.0.0+):
+1. Create a new AspNet Core Web Application with Visual Studio 2026 (18.0.0+):

diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png
index a268e4cde5..3b1a4abe68 100644
Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-optional-modules.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png
index fd811125c7..5f2a9b7938 100644
Binary files a/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png and b/docs/en/get-started/images/abp-studio-new-microservice-solution-dialog-properties.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png
index da7a5f22ea..cb85c3a2b8 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-options-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png
index f7f088804b..6bbf3fb22a 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-additional-services.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png
new file mode 100644
index 0000000000..74cd5066bb
Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-aspire-configuration-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png
index 910b522dd3..e41580ad1e 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-configurations-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png
index 4b8965456c..ed52bac62c 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-database-provider-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png
index 3dedb0aba0..455a6bd574 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-dynamic-localization.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png
new file mode 100644
index 0000000000..705fee9325
Binary files /dev/null and b/docs/en/get-started/images/abp-studio-new-solution-dialog-languages-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png
index e98c96ac07..9b9210b269 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png
index f883555e4a..04e1af7ebe 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-mobile-framework-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png
index 2bc29805ee..3c06ae001d 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-multi-tenancy.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png
index 3dff0567fd..40325a5358 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-public-web-site.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png
index 4a6fbf2d40..27e39f3776 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-framework-microservice.png differ
diff --git a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png
index 553f0ca395..53692d03de 100644
Binary files a/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png and b/docs/en/get-started/images/abp-studio-new-solution-dialog-ui-theme-microservice.png differ
diff --git a/docs/en/get-started/layered-web-application.md b/docs/en/get-started/layered-web-application.md
index dc65e45829..b2bd05454a 100644
--- a/docs/en/get-started/layered-web-application.md
+++ b/docs/en/get-started/layered-web-application.md
@@ -22,8 +22,8 @@ In this quick start guide, you will learn how to create and run a layered (and p
First things first! Let's setup your development environment before creating the first project. The following tools should be installed on your development machine:
-* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development.
-* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
+* [Visual Studio 2026](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 10.0+](https://dotnet.microsoft.com/download/dotnet) development.
+* [.NET 10.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
* [Node v22.11+](https://nodejs.org/){{ end }}{{ if UI == "NG" }}
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node){{ end }}
* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
@@ -276,4 +276,9 @@ You can start the following application(s):
> For example in non-tiered MVC with public website application:
-
\ No newline at end of file
+
+
+## What's next?
+
+- [TODO Application Tutorial with Layered Solution](../tutorials/todo/layered/index.md)
+- [Web Application Development Tutorial](../tutorials/book-store/index.md)
\ No newline at end of file
diff --git a/docs/en/get-started/microservice.md b/docs/en/get-started/microservice.md
index fb8626baef..ee7e31bf85 100644
--- a/docs/en/get-started/microservice.md
+++ b/docs/en/get-started/microservice.md
@@ -15,8 +15,8 @@ In this quick start guide, you will learn how to create and run a microservice s
First things first! Let's setup your development environment before creating the first project. The following tools should be installed on your development machine:
-* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) or another IDE that supports .NET development
-* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet)
+* [Visual Studio 2026](https://visualstudio.microsoft.com/vs/) or another IDE that supports .NET development
+* [.NET 10.0+](https://dotnet.microsoft.com/en-us/download/dotnet)
* [Node v22.11+](https://nodejs.org/)
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node), **This is required for the Angular applications.**
* [Docker Desktop (with Kubernetes enabled)](https://www.docker.com/products/docker-desktop/)
@@ -94,6 +94,25 @@ Once you select the desired modules, click the *Next* button for the *UI Theme*
LeptonX is the suggested UI theme that is proper for production usage. Select one of the themes and configure the additional options if you want.
+Click the Next button to see *Language Selection* selection:
+
+
+
+In this step, you can choose which languages your application will support.
+
+* Default Language: Select the main language for your app.
+
+* Localizable User Interface: Turn this on to support multiple languages.
+
+* Available Languages: Check the languages you want to include.
+
+* Click Add Custom Language if you want to add a language that is not listed.
+
+Click the Next button to see *.NET Aspire* configuration selection:
+
+
+
+In this step, you can enable or disable the .NET Aspire integration for your solution. If you enable it, the solution will be pre-configured to work with .NET Aspire for easier microservice development and deployment. See the [Aspire Integration](../solution-templates/microservice/aspire-integration.md) document for more information about this feature.
Click the Next button to see *Additional Options* selection:
diff --git a/docs/en/get-started/pre-requirements.md b/docs/en/get-started/pre-requirements.md
index 8d3555fb99..8aad4818ab 100644
--- a/docs/en/get-started/pre-requirements.md
+++ b/docs/en/get-started/pre-requirements.md
@@ -108,9 +108,11 @@ If you are using Helm, you can install NGINX Ingress using the following command
```cs
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
-helm upgrade --install --version=4.0.19 ingress-nginx ingress-nginx/ingress-nginx
+helm upgrade --install --version=4.0.19 ingress-nginx ingress-nginx/ingress-nginx --set controller.config.enable-underscores-in-headers="true"
```
+> [enable-underscores-in-headers](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/#enable-underscores-in-headers) is required to allow http request use `__tenant` to pass tenant information to the backend service.
+
### mkcert
Use mkcert to generate trusted certificates for local development. You can install mkcert by following the [official mkcert installation guide](https://github.com/FiloSottile/mkcert#installation).
diff --git a/docs/en/get-started/single-layer-web-application.md b/docs/en/get-started/single-layer-web-application.md
index 06c5ed90f9..9ee87fd439 100644
--- a/docs/en/get-started/single-layer-web-application.md
+++ b/docs/en/get-started/single-layer-web-application.md
@@ -21,8 +21,8 @@ In this quick start guide, you will learn how to create and run a single layer w
First things first! Let's setup your development environment before creating the first project. The following tools should be installed on your development machine:
-* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development.
-* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
+* [Visual Studio 2026](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 10.0+](https://dotnet.microsoft.com/download/dotnet) development.
+* [.NET 10.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
* [Node v22.11+](https://nodejs.org/){{ end }}{{ if UI == "NG" }}
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node){{ end }}
@@ -185,3 +185,7 @@ You can then hit *F5* or *Ctrl + F5* to run the web application. It will run and

You can use `admin` as username and `1q2w3E*` as default password to login to the application.
+
+## What's next?
+
+- [TODO Application Tutorial with Single-Layer Solution](../tutorials/todo/single-layer/index.md)
\ No newline at end of file
diff --git a/docs/en/images/abp-overall-diagram-1600.png b/docs/en/images/abp-overall-diagram-1600.png
index 16d397466a..3b02dd66dc 100644
Binary files a/docs/en/images/abp-overall-diagram-1600.png and b/docs/en/images/abp-overall-diagram-1600.png differ
diff --git a/docs/en/images/add-passkey.png b/docs/en/images/add-passkey.png
new file mode 100644
index 0000000000..345cdd644d
Binary files /dev/null and b/docs/en/images/add-passkey.png differ
diff --git a/docs/en/images/ai-management-widget.png b/docs/en/images/ai-management-widget.png
new file mode 100644
index 0000000000..2f396f3e5a
Binary files /dev/null and b/docs/en/images/ai-management-widget.png differ
diff --git a/docs/en/images/db-options.png b/docs/en/images/db-options.png
index 91d2b51ce7..d25811c49b 100644
Binary files a/docs/en/images/db-options.png and b/docs/en/images/db-options.png differ
diff --git a/docs/en/images/elsa-studio-wasm.png b/docs/en/images/elsa-studio-wasm.png
new file mode 100644
index 0000000000..9365ef6a4c
Binary files /dev/null and b/docs/en/images/elsa-studio-wasm.png differ
diff --git a/docs/en/images/my-passkey.png b/docs/en/images/my-passkey.png
new file mode 100644
index 0000000000..2b40045165
Binary files /dev/null and b/docs/en/images/my-passkey.png differ
diff --git a/docs/en/images/passkey-login.png b/docs/en/images/passkey-login.png
new file mode 100644
index 0000000000..dabf324e7f
Binary files /dev/null and b/docs/en/images/passkey-login.png differ
diff --git a/docs/en/images/passkey-login2.png b/docs/en/images/passkey-login2.png
new file mode 100644
index 0000000000..349d8a2dca
Binary files /dev/null and b/docs/en/images/passkey-login2.png differ
diff --git a/docs/en/images/passkey-setting.png b/docs/en/images/passkey-setting.png
new file mode 100644
index 0000000000..6211e91d9c
Binary files /dev/null and b/docs/en/images/passkey-setting.png differ
diff --git a/docs/en/images/pen-test-alert-list-10.1.png b/docs/en/images/pen-test-alert-list-10.1.png
new file mode 100644
index 0000000000..3a9d10feff
Binary files /dev/null and b/docs/en/images/pen-test-alert-list-10.1.png differ
diff --git a/docs/en/images/ui-options.png b/docs/en/images/ui-options.png
index 6affab9d21..3c30cd16d7 100644
Binary files a/docs/en/images/ui-options.png and b/docs/en/images/ui-options.png differ
diff --git a/docs/en/modules/account-pro.md b/docs/en/modules/account-pro.md
index 62d7a00785..7944c7448a 100644
--- a/docs/en/modules/account-pro.md
+++ b/docs/en/modules/account-pro.md
@@ -7,7 +7,7 @@
# Account Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module implements the Login, Register, Forgot Password, Email Confirmation, Password Reset, sending and confirming Two-Factor Authentication, user lockout, switch between tenants functionalities of an application;
@@ -424,3 +424,4 @@ This module doesn't define any additional distributed event. See the [standard d
* [Linked Accounts](./account/linkedaccounts.md)
* [Session Management](./account/session-management.md)
* [Idle Session Timeout](./account/idle-session-timeout.md)
+* [Web Authentication API (WebAuthn) passkeys](./account/passkey.md)
diff --git a/docs/en/modules/account/impersonation.md b/docs/en/modules/account/impersonation.md
index c6fdae0ebf..3335ea50e5 100644
--- a/docs/en/modules/account/impersonation.md
+++ b/docs/en/modules/account/impersonation.md
@@ -7,7 +7,7 @@
# Tenant impersonation & User impersonation
-User impersonation allows you to temporarily sign in as a different user in your tenant's users. This article introduces how to enable impersonation in ABP. Impersonation is enabled by defautl in ABP v5.0 and above.
+User impersonation allows you to temporarily sign in as a different user in your tenant's users. This article introduces how to enable impersonation in ABP. Impersonation is enabled by default in ABP v5.0 and above.
## Introduction
diff --git a/docs/en/modules/account/passkey.md b/docs/en/modules/account/passkey.md
new file mode 100644
index 0000000000..b8f00ee576
--- /dev/null
+++ b/docs/en/modules/account/passkey.md
@@ -0,0 +1,63 @@
+# Web Authentication API (WebAuthn) passkeys
+
+The `Web Authentication API (WebAuthn) passkeys` feature allows users to authenticate using passkeys, which are more secure and user-friendly alternatives to traditional passwords. Passkeys leverage public key cryptography to provide strong authentication without the need for users to remember complex passwords.
+
+## Enabling Passkeys
+
+You can enable/disable the `Web Authentication API (WebAuthn) passkeys` feature in the `Setting > Account > Passkeys` page. Also, there is an option to allow how many passkeys a user can register:
+
+
+
+## Manage Passkeys
+
+You can add/rename/delete your passkeys in the `Account/Manage` page:
+
+
+
+Click the `Add Passkey` button to register a new passkey. You will be prompted to use your device's built-in biometric authentication (such as fingerprint or facial recognition) or an external security key to complete the registration process:
+
+
+
+## Using Passkey for Login
+
+Once you enable the passkey feature and register at least one passkey, you can use it to log in to your account. On the login page, select the `Passkey login` option and follow the prompts to authenticate using your registered passkey:
+
+
+
+
+
+## Configure passkey options
+
+ASP.NET Core Identity provides various options to configure passkey behavior through the `IdentityPasskeyOptions` class, which include:
+
+- **AuthenticatorTimeout**: Gets or sets the time that the browser should wait for the authenticator to provide a passkey as a TimeSpan. This option applies to both creating a new passkey and requesting an existing passkey. This option is treated as a hint to the browser, and the browser may ignore the option. The default value is 5 minutes.
+- **ChallengeSize**: Gets or sets the size of the challenge in bytes sent to the client during attestation and assertion. This option applies to both creating a new passkey and requesting an existing passkey. The default value is 32 bytes.
+- **ServerDomain**: Gets or sets the effective Relying Party ID (domain) of the server. This should be unique and will be used as the identity for the server. This option applies to both creating a new passkey and requesting an existing passkey. If null, which is the default value, the server's origin is used. For more information, see Relying Party Identifier RP ID.
+
+**Example configuration:**
+
+```csharp
+builder.Services.Configure
(options =>
+{
+ options.ServerDomain = "abp.io";
+ options.AuthenticatorTimeout = TimeSpan.FromMinutes(3);
+ options.ChallengeSize = 64;
+});
+```
+
+For a complete list of configuration options, see [IdentityPasskeyOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.identity.identitypasskeyoptions). For the most up-to-date browser defaults, see the [W3C WebAuthn specification](https://www.w3.org/TR/webauthn-3/).
+
+## HTTPS requirement
+
+All passkey operations require HTTPS. The implementation stores authentication data in encrypted and signed cookies that could be intercepted over unencrypted connections.
+
+## Browser Support
+
+Passkeys are supported in most modern browsers, including: Chrome, Edge, Firefox, and Safari. Ensure that you are using the latest version of your browser to take advantage of passkey functionality.
+
+## Additional resources
+
+For more information on WebAuthn and passkeys, refer to the following resources:
+
+- [Enable Web Authentication API (WebAuthn) passkeys](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/passkeys)
+- [Web Authentication API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API)
diff --git a/docs/en/modules/ai-management/index.md b/docs/en/modules/ai-management/index.md
index b85112efb7..e50253c22c 100644
--- a/docs/en/modules/ai-management/index.md
+++ b/docs/en/modules/ai-management/index.md
@@ -1,9 +1,18 @@
+```json
+//[doc-seo]
+{
+ "Description": "Discover how to implement AI management in your ABP Framework application, enhancing workspace dynamics with easy installation options."
+}
+```
+
# AI Management (Pro)
> You must have an ABP Team or a higher license to use this module.
-This module implements AI (Artificial Intelligence) management capabilities on top of the [Artificial Intelligence Workspaces](../../framework/infrastructure/artificial-intelligence.md) feature of the ABP Framework and allows to manage workspaces dynamically from the application including UI components and API endpoints.
+> **⚠️ Important Notice**
+> The **AI Management Module** is currently in **preview**. The documentation and implementation are subject to change.
+This module implements AI (Artificial Intelligence) management capabilities on top of the [Artificial Intelligence Workspaces](../../framework/infrastructure/artificial-intelligence/index.md) feature of the ABP Framework and allows to manage workspaces dynamically from the application including UI components and API endpoints.
## How to Install
@@ -19,7 +28,6 @@ abp add-module Volo.AIManagement
Open ABP Studio, navigate to your solution explorer, **Right Click** on the project and select **Import Module**. Choose `Volo.AIManagement` from `NuGet` tab and check the "Install this Module" checkbox. Click the "OK" button to install the module.
-
## Packages
This module follows the [module development best practices guide](../../framework/architecture/best-practices) and consists of several NuGet and NPM packages. See the guide if you want to understand the packages and relations between them.
@@ -32,10 +40,10 @@ AI Management module packages are designed for various usage scenarios. Packages
### Menu Items
-AI Management module adds the following items to the "Main" menu, under the "Administration" menu item:
+AI Management module adds the following items to the "Main" menu:
-* **Workspaces**: Workspace management page.
-* **Chat**: AI chat interface for testing workspaces.
+* **AI Management**: Root menu item for AI Management module. (`AIManagement`)
+ * **Workspaces**: Workspace management page. (`AIManagement.Workspaces`)
`AIManagementMenus` class has the constants for the menu item names.
@@ -68,7 +76,7 @@ The AI Management module includes a built-in chat interface for testing workspac
* Test streaming responses
* Verify workspace configuration before using in production
-> Access the chat interface at: `/AIManagement/Chat`
+> Access the chat interface at: `/AIManagement/Workspaces/{WorkspaceName}`
## Workspace Configuration
@@ -78,21 +86,21 @@ Workspaces are the core concept of the AI Management module. A workspace represe
When creating or managing a workspace, you can configure the following properties:
-| Property | Required | Description |
-|----------|----------|-------------|
-| `Name` | Yes | Unique workspace identifier (cannot contain spaces) |
-| `Provider` | Yes* | AI provider name (e.g., "OpenAI", "Ollama") |
-| `ModelName` | Yes* | Model identifier (e.g., "gpt-4", "mistral") |
-| `ApiKey` | No | API authentication key (required by some providers) |
-| `ApiBaseUrl` | No | Custom endpoint URL (defaults to provider's default) |
-| `SystemPrompt` | No | Default system prompt for all conversations |
-| `Temperature` | No | Response randomness (0.0-1.0, defaults to provider default) |
-| `Description` | No | Workspace description |
-| `IsActive` | No | Enable/disable the workspace (default: true) |
-| `ApplicationName` | No | Associate workspace with specific application |
-| `RequiredPermissionName` | No | Permission required to use this workspace |
-| `IsSystem` | No | Whether it's a system workspace (read-only) |
-| `OverrideSystemConfiguration` | No | Allow database configuration to override code-defined settings |
+| Property | Required | Description |
+| ----------------------------- | -------- | -------------------------------------------------------------- |
+| `Name` | Yes | Unique workspace identifier (cannot contain spaces) |
+| `Provider` | Yes* | AI provider name (e.g., "OpenAI", "Ollama") |
+| `ModelName` | Yes* | Model identifier (e.g., "gpt-4", "mistral") |
+| `ApiKey` | No | API authentication key (required by some providers) |
+| `ApiBaseUrl` | No | Custom endpoint URL (defaults to provider's default) |
+| `SystemPrompt` | No | Default system prompt for all conversations |
+| `Temperature` | No | Response randomness (0.0-1.0, defaults to provider default) |
+| `Description` | No | Workspace description |
+| `IsActive` | No | Enable/disable the workspace (default: true) |
+| `ApplicationName` | No | Associate workspace with specific application |
+| `RequiredPermissionName` | No | Permission required to use this workspace |
+| `IsSystem` | No | Whether it's a system workspace (read-only) |
+| `OverrideSystemConfiguration` | No | Allow database configuration to override code-defined settings |
**\*Not required for system workspaces**
@@ -127,7 +135,7 @@ PreConfigure(options =>
#### Dynamic Workspaces
-* **Created through the UI** or programmatically via `IWorkspaceRepository`
+* **Created through the UI** or programmatically via `ApplicationWorkspaceManager` and `IWorkspaceRepository`
* **Fully manageable** - can be created, updated, activated/deactivated, and deleted
* **Stored in database** with all configuration
* **Ideal for** user-customizable AI features
@@ -135,14 +143,30 @@ PreConfigure(options =>
Example (data seeding):
```csharp
-await _workspaceRepository.InsertAsync(new Workspace(
- name: "CustomerSupportWorkspace",
- provider: "OpenAI",
- modelName: "gpt-4",
- apiKey: "your-api-key",
- systemPrompt: "You are a helpful customer support assistant.",
- requiredPermissionName: "MyApp.CustomerSupport"
-));
+public class WorkspaceDataSeederContributor : IDataSeedContributor, ITransientDependency
+{
+ private readonly IWorkspaceRepository _workspaceRepository;
+ private readonly ApplicationWorkspaceManager _applicationWorkspaceManager;
+ public WorkspaceDataSeederContributor(
+ IWorkspaceRepository workspaceRepository,
+ ApplicationWorkspaceManager applicationWorkspaceManager)
+ {
+ _workspaceRepository = workspaceRepository;
+ _applicationWorkspaceManager = applicationWorkspaceManager;
+ }
+
+ public async Task SeedAsync(DataSeedContext context)
+ {
+ var workspace = await _applicationWorkspaceManager.CreateAsync(
+ name: "CustomerSupportWorkspace",
+ provider: "OpenAI",
+ modelName: "gpt-4");
+
+ workspace.ApiKey = "your-api-key";
+ workspace.SystemPrompt = "You are a helpful customer support assistant.";
+
+ await _workspaceRepository.InsertAsync(workspace);
+ }
```
### Workspace Naming Rules
@@ -155,38 +179,31 @@ await _workspaceRepository.InsertAsync(new Workspace(
The AI Management module defines the following permissions:
-### Workspace Management Permissions
-
-| Permission | Description | Default Granted To |
-|------------|-------------|-------------------|
-| `AIManagement.Workspaces` | View workspaces | Admin role |
-| `AIManagement.Workspaces.Create` | Create new workspaces | Admin role |
-| `AIManagement.Workspaces.Update` | Edit existing workspaces | Admin role |
-| `AIManagement.Workspaces.Delete` | Delete workspaces | Admin role |
-
-### Chat Permissions
-
-| Permission | Description | Default Granted To |
-|------------|-------------|-------------------|
-| `AIManagement.Chat` | Access chat interface | Admin role |
+| Permission | Description | Default Granted To |
+| -------------------------------- | ------------------------ | ------------------ |
+| `AIManagement.Workspaces` | View workspaces | Admin role |
+| `AIManagement.Workspaces.Create` | Create new workspaces | Admin role |
+| `AIManagement.Workspaces.Update` | Edit existing workspaces | Admin role |
+| `AIManagement.Workspaces.Delete` | Delete workspaces | Admin role |
### Workspace-Level Permissions
In addition to module-level permissions, you can restrict access to individual workspaces by setting the `RequiredPermissionName` property:
```csharp
-var workspace = new Workspace(
+var workspace = await _applicationWorkspaceManager.CreateAsync(
name: "PremiumWorkspace",
provider: "OpenAI",
- modelName: "gpt-4",
- requiredPermissionName: "MyApp.PremiumFeatures"
+ modelName: "gpt-4"
);
+// Set a specific permission for the workspace
+workspace.RequiredPermissionName = MyAppPermissions.AccessPremiumWorkspaces;
```
When a workspace has a required permission:
-* Only users with that permission can access the workspace
+
+* Only authorized users with that permission can access the workspace endpoints
* Users without the permission will receive an authorization error
-* The workspace will not appear in the workspace selection dropdown for unauthorized users
## Usage Scenarios
@@ -202,6 +219,7 @@ The AI Management module is designed to support various usage patterns, from sim
In this scenario, you only use the ABP Framework's AI features directly. You configure AI providers (like OpenAI) in your code and don't need any database or management UI.
**Required Packages:**
+
- `Volo.Abp.AI`
- Any Microsoft AI extensions (e.g., `Microsoft.Extensions.AI.OpenAI`)
@@ -239,7 +257,7 @@ public class MyService
{
_chatClient = chatClient;
}
-
+
public async Task GetResponseAsync(string prompt)
{
var response = await _chatClient.CompleteAsync(prompt);
@@ -248,7 +266,7 @@ public class MyService
}
```
-> See [Artificial Intelligence](../../framework/infrastructure/artificial-intelligence.md) documentation for more details about workspace configuration.
+> See [Artificial Intelligence](../../framework/infrastructure/artificial-intelligence/index.md) documentation for more details about workspace configuration.
### Scenario 2: AI Management with Domain Layer Dependency (Local Execution)
@@ -259,10 +277,12 @@ In this scenario, you install the AI Management module with its database layer,
**Required Packages:**
**Minimum (backend only):**
+
- `Volo.AIManagement.EntityFrameworkCore` (or `Volo.AIManagement.MongoDB`)
- `Volo.AIManagement.OpenAI` (or another AI provider package)
**Full installation (with UI and API):**
+
- `Volo.AIManagement.EntityFrameworkCore` (or `Volo.AIManagement.MongoDB`)
- `Volo.AIManagement.Application`
- `Volo.AIManagement.HttpApi`
@@ -297,6 +317,7 @@ public class YourModule : AbpModule
**Option 2 - Dynamic Workspace (UI-based):**
No code configuration needed. Define workspaces through:
+
- The AI Management UI (navigate to AI Management > Workspaces)
- Data seeding in your `DataSeeder` class
@@ -321,6 +342,7 @@ public class MyService
In this scenario, your application communicates with a separate AI Management microservice that manages configurations and communicates with AI providers on your behalf. The AI Management service handles all AI provider interactions.
**Required Packages:**
+
- `Volo.AIManagement.Client.HttpApi.Client`
**Configuration:**
@@ -381,7 +403,7 @@ public class MyService
var response = await _chatService.ChatCompletionsAsync(workspaceName, request);
return response.Content;
}
-
+
// For streaming responses
public async IAsyncEnumerable StreamAIResponseAsync(string workspaceName, string prompt)
{
@@ -408,6 +430,7 @@ public class MyService
This scenario builds on Scenario 3, but your application exposes its own HTTP endpoints that other applications can call. Your application then forwards these requests to the AI Management service.
**Required Packages:**
+
- `Volo.AIManagement.Client.HttpApi.Client` (to communicate with AI Management service)
- `Volo.AIManagement.Client.Application` (application services)
- `Volo.AIManagement.Client.HttpApi` (to expose HTTP endpoints)
@@ -420,19 +443,196 @@ Same as Scenario 3, configure the remote AI Management service in `appsettings.j
**Usage:**
Once configured, other applications can call your application's endpoints:
+
- `POST /api/ai-management-client/chat-completion` for chat completions
- `POST /api/ai-management-client/stream-chat-completion` for streaming responses
Your application acts as a proxy, forwarding these requests to the AI Management microservice.
-## Comparison Table
+### Comparison Table
+
+| Scenario | Database Required | Manages Config | Executes AI | Exposes API | Use Case |
+| ------------------------- | ----------------- | -------------- | -------------- | ----------- | ----------------------------------------- |
+| **1. No AI Management** | No | Code | Local | Optional | Simple apps, no config management needed |
+| **2. Full AI Management** | Yes | Database/UI | Local | Optional | Monoliths, services managing their own AI |
+| **3. Client Remote** | No | Remote Service | Remote Service | No | Microservices consuming AI centrally |
+| **4. Client Proxy** | No | Remote Service | Remote Service | Yes | API Gateway pattern, proxy services |
+
+
+
+## Client Usage (MVC UI)
+
+AI Management uses different packages depending on the usage scenario:
-| Scenario | Database Required | Manages Config | Executes AI | Exposes API | Use Case |
-|----------|------------------|----------------|-------------|-------------|----------|
-| **1. No AI Management** | No | Code | Local | Optional | Simple apps, no config management needed |
-| **2. Full AI Management** | Yes | Database/UI | Local | Optional | Monoliths, services managing their own AI |
-| **3. Client Remote** | No | Remote Service | Remote Service | No | Microservices consuming AI centrally |
-| **4. Client Proxy** | No | Remote Service | Remote Service | Yes | API Gateway pattern, proxy services |
+- **`Volo.AIManagement.*` packages**: These contain the core AI functionality and are used when your application hosts and manages its own AI operations. These packages don't expose any application service and endpoints to be consumed by default.
+
+- **`Volo.AIManagement.Client.*` packages**: These are designed for applications that need to consume AI services from a remote application. They provide both server and client side of remote access to the AI services.
+
+**List of packages:**
+- `Volo.AIManagement.Client.Application`
+- `Volo.AIManagement.Client.Application.Contracts`
+- `Volo.AIManagement.Client.HttpApi`
+- `Volo.AIManagement.Client.HttpApi.Client`
+- `Volo.AIManagement.Client.Web`
+
+### The Chat Widget
+The `Volo.AIManagement.Client.Web` package provides a chat widget to allow you to easily integrate a chat interface into your application that uses a specific AI workspace named `ChatClientChatViewComponent`.
+
+#### Basic Usage
+You can invoke the `ChatClientChatViewComponent` Widget in your razor page with the following code:
+
+```csharp
+@await Component.InvokeAsync(typeof(ChatClientChatViewComponent), new ChatClientChatViewModel
+{
+ WorkspaceName = "mylama",
+})
+```
+
+
+
+#### Properties
+You can customize the chat widget with the following properties:
+- `WorkspaceName`: The name of the workspace to use.
+- `ComponentId`: Unique identifier for accessing the component via JavaScript API (stored in abp.chatComponents).
+- `ConversationId`: The unique identifier for persisting and retrieving chat history from client-side storage.
+- `Title`: The title of the chat widget.
+- `ShowStreamCheckbox`: Whether to show the stream checkbox. Allows user to toggle streaming on and off. Default is `false`.
+- `UseStreaming`: Default streaming behavior. Can be overridden by user when `ShowStreamCheckbox` is true.
+
+```csharp
+@await Component.InvokeAsync(typeof(ChatClientChatViewComponent), new ChatClientChatViewModel
+{
+ WorkspaceName = "mylama",
+ ComponentId = "mylama-chat",
+ ConversationId = "mylama-conversation-" + @CurrentUser.Id,
+ Title = "My Custom Title",
+ ShowStreamCheckbox = true,
+ UseStreaming = true
+})
+```
+
+#### Using the Conversation Id
+You can use the `ConversationId` property to specify the id of the conversation to use. When the Conversation Id is provided, the chat will be stored at the client side and will be retrieved when the user revisits the page that contains the chat widget. If it's not provided or provided as **null**, the chat will be temporary and will not be saved, it'll be lost when the component lifetime ends.
+
+```csharp
+@await Component.InvokeAsync(typeof(ChatClientChatViewComponent), new ChatClientChatViewModel
+{
+ WorkspaceName = "mylama",
+ ConversationId = "my-support-conversation-" + @CurrentUser.Id
+})
+```
+
+#### JavaScript API
+The chat components are initialized automatically when the ViewComponent is rendered in the page. All the initialized components in the page are stored in the `abp.chatComponents` object. You can retrieve a specific component by its `ComponentId` which is defined while invoking the ViewComponent.
+
+```csharp
+@await Component.InvokeAsync(typeof(ChatClientChatViewComponent), new ChatClientChatViewModel
+{
+ WorkspaceName = "mylama",
+ ComponentId = "mylama-chat"
+})
+```
+
+You can then use the JavaScript API to interact with the component.
+```js
+var chatComponent = abp.chatComponents.get('mylama-chat');
+```
+
+Once you have the component, you can use the following functions to interact with it:
+
+```js
+// Switch to a different conversation
+chatComponent.switchConversation(conversationId);
+
+// Create a new conversation with a specific model
+chatComponent.createConversation(conversationId, modelName);
+
+// Clear the current conversation history
+chatComponent.clearConversation();
+
+// Get the current conversation ID (returns null for ephemeral conversations)
+var currentId = chatComponent.getCurrentConversationId();
+
+// Initialize with a specific conversation ID
+chatComponent.initialize(conversationId);
+
+// Send a message programmatically
+chatComponent.sendMessage();
+
+// Listen to events
+chatComponent.on('messageSent', function(data) {
+ console.log('Message sent:', data.message);
+ console.log('Conversation ID:', data.conversationId);
+ console.log('Is first message:', data.isFirstMessage);
+});
+
+chatComponent.on('messageReceived', function(data) {
+ console.log('AI response:', data.message);
+ console.log('Conversation ID:', data.conversationId);
+ console.log('Is streaming:', data.isStreaming);
+});
+
+chatComponent.on('streamStarted', function(data) {
+ console.log('Streaming started for conversation:', data.conversationId);
+});
+
+// Remove event listeners
+chatComponent.off('messageSent', callbackFunction);
+```
+
+**Best-practices:**
+- Don't try to access the component at the page load time, it's not guaranteed to be initialized yet. Get the component whenever you need it to make sure it's **initialized** and the **latest state** is applied.
+
+❌ Don't do this
+```js
+(function(){
+ var chatComponent = abp.chatComponents.get('mylama-chat');
+ $('#my-button').on('click', function() {
+ chatComponent.clearConversation();
+ });
+});
+```
+
+✅ Do this
+```js
+(function(){
+ $('#my-button').on('click', function() {
+ var chatComponent = abp.chatComponents.get('mylama-chat');
+ chatComponent.clearConversation();
+ });
+});
+```
+
+## Using Dynamic Workspace Configurations for custom requirements
+
+The AI Management module allows you to access only configuration of a workspace without resolving pre-constructed chat client. This is useful when you want to use a workspace for your own purposes and you don't need to use the chat client.
+The `IWorkspaceConfigurationStore` service is used to access the configuration of a workspace. It has multiple implementations according to the usage scenario.
+
+```csharp
+public class MyService
+{
+ private readonly IWorkspaceConfigurationStore _workspaceConfigurationStore;
+ public MyService(IWorkspaceConfigurationStore workspaceConfigurationStore)
+ {
+ _workspaceConfigurationStore = workspaceConfigurationStore;
+ }
+
+ public async Task DoSomethingAsync()
+ {
+ // Get the configuration of the workspace that can be managed dynamically.
+ var configuration = await _workspaceConfigurationStore.GetAsync("MyWorkspace");
+
+ // Do something with the configuration
+ var kernel = Kernel.CreateBuilder()
+ .AddAzureOpenAIChatClient(
+ config.ModelName!,
+ new Uri(config.ApiBaseUrl),
+ config.ApiKey
+ )
+ .Build();
+ }
+}
+```
## Implementing Custom AI Provider Factories
@@ -501,24 +701,23 @@ public override void ConfigureServices(ServiceConfigurationContext context)
> [!TIP]
> For production scenarios, you may want to add validation for the factory configuration.
-
### Available Configuration Properties
The `ChatClientCreationConfiguration` object provides the following properties from the database:
-| Property | Type | Description |
-|----------|------|-------------|
-| `Name` | string | Workspace name |
-| `Provider` | string | Provider name (e.g., "OpenAI", "Ollama") |
-| `ApiKey` | string? | API key for authentication |
-| `ModelName` | string | Model identifier (e.g., "gpt-4", "mistral") |
-| `SystemPrompt` | string? | Default system prompt for the workspace |
-| `Temperature` | float? | Temperature setting for response generation |
-| `ApiBaseUrl` | string? | Custom API endpoint URL |
-| `Description` | string? | Workspace description |
-| `IsActive` | bool | Whether the workspace is active |
-| `IsSystem` | bool | Whether it's a system workspace |
-| `RequiredPermissionName` | string? | Permission required to use this workspace |
+| Property | Type | Description |
+| ------------------------ | ------- | ------------------------------------------- |
+| `Name` | string | Workspace name |
+| `Provider` | string | Provider name (e.g., "OpenAI", "Ollama") |
+| `ApiKey` | string? | API key for authentication |
+| `ModelName` | string | Model identifier (e.g., "gpt-4", "mistral") |
+| `SystemPrompt` | string? | Default system prompt for the workspace |
+| `Temperature` | float? | Temperature setting for response generation |
+| `ApiBaseUrl` | string? | Custom API endpoint URL |
+| `Description` | string? | Workspace description |
+| `IsActive` | bool | Whether the workspace is active |
+| `IsSystem` | bool | Whether it's a system workspace |
+| `RequiredPermissionName` | string? | Permission required to use this workspace |
### Example: Azure OpenAI Factory
@@ -555,6 +754,7 @@ public class AzureOpenAIChatClientFactory : IChatClientFactory, ITransientDepend
After implementing and registering your factory:
1. **Through UI**: Navigate to the AI Management workspaces page and create a new workspace:
+
- Select your provider name (e.g., "Ollama", "AzureOpenAI")
- Configure the API settings
- Set the model name
@@ -562,14 +762,14 @@ After implementing and registering your factory:
2. **Through Code** (data seeding):
```csharp
-await _workspaceRepository.InsertAsync(new Workspace(
- GuidGenerator.Create(),
- "MyOllamaWorkspace",
- provider: "Ollama",
- modelName: "mistral",
- apiBaseUrl: "http://localhost:11434",
- description: "Local Ollama workspace"
-));
+var workspace = await _applicationWorkspaceManager.CreateAsync(
+ name: "MyOllamaWorkspace",
+ provider: "Ollama",
+ modelName: "mistral"
+);
+workspace.ApiBaseUrl = "http://localhost:11434";
+workspace.Description = "Local Ollama workspace";
+await _workspaceRepository.InsertAsync(workspace);
```
> **Tip**: The provider name you use in `AddFactory("ProviderName")` must match the provider name stored in the workspace configuration in the database.
@@ -593,7 +793,7 @@ The following custom repositories are defined:
#### Domain Services
- `ApplicationWorkspaceManager`: Manages workspace operations and validations.
-- `WorkspaceConfigurationStore`: Retrieves workspace configuration with caching.
+- `WorkspaceConfigurationStore`: Retrieves workspace configuration with caching. Implements `IWorkspaceConfigurationStore` interface.
- `ChatClientResolver`: Resolves the appropriate `IChatClient` implementation for a workspace.
#### Integration Services
@@ -622,10 +822,15 @@ Workspace configurations are cached for performance. The cache key format:
WorkspaceConfiguration:{ApplicationName}:{WorkspaceName}
```
+### HttpApi Client Layer
+
+- `IntegrationWorkspaceConfigurationStore`: Integration service for remote workspace configuration retrieval. Implements `IWorkspaceConfigurationStore` interface.
+
The cache is automatically invalidated when workspaces are created, updated, or deleted.
## See Also
-- [Artificial Intelligence Infrastructure](../../framework/infrastructure/artificial-intelligence.md): Learn about the underlying AI workspace infrastructure
+- [Artificial Intelligence Infrastructure](../../framework/infrastructure/artificial-intelligence/index.md): Learn about the underlying AI workspace infrastructure
- [Microsoft.Extensions.AI](https://learn.microsoft.com/en-us/dotnet/ai/): Microsoft's unified AI abstractions
-- [Semantic Kernel](https://learn.microsoft.com/en-us/semantic-kernel/): Microsoft's Semantic Kernel integration
\ No newline at end of file
+- [Microsoft Agent Framework](https://learn.microsoft.com/en-us/agent-framework/overview/agent-framework-overview): Microsoft's Agent Framework
+- [Semantic Kernel](https://learn.microsoft.com/en-us/semantic-kernel/): Microsoft's Semantic Kernel integration
diff --git a/docs/en/modules/audit-logging-pro.md b/docs/en/modules/audit-logging-pro.md
index 20f220857c..e64b39dc66 100644
--- a/docs/en/modules/audit-logging-pro.md
+++ b/docs/en/modules/audit-logging-pro.md
@@ -7,7 +7,7 @@
# Audit Logging Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module implements the Audit Logging system of an application;
diff --git a/docs/en/modules/chat.md b/docs/en/modules/chat.md
index b6932149fb..fa87a8eef6 100644
--- a/docs/en/modules/chat.md
+++ b/docs/en/modules/chat.md
@@ -7,7 +7,7 @@
# Chat Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module implements real time messaging between users for an application.
diff --git a/docs/en/modules/cms-kit-pro/contact-form.md b/docs/en/modules/cms-kit-pro/contact-form.md
index 6cdb08a569..eafa4b80b3 100644
--- a/docs/en/modules/cms-kit-pro/contact-form.md
+++ b/docs/en/modules/cms-kit-pro/contact-form.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: Contact Management
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
CMS Kit provides a widget to create a contact form on your website.
diff --git a/docs/en/modules/cms-kit-pro/faq.md b/docs/en/modules/cms-kit-pro/faq.md
index 78ec252d17..23d90d9705 100644
--- a/docs/en/modules/cms-kit-pro/faq.md
+++ b/docs/en/modules/cms-kit-pro/faq.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: FAQ System
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
The CMS kit provides a **FAQ** system to allow users to create, edit and delete FAQ's. Here is a screenshot of the FAQ widget:
diff --git a/docs/en/modules/cms-kit-pro/index.md b/docs/en/modules/cms-kit-pro/index.md
index 8a29db2d63..b7ce2f03d4 100644
--- a/docs/en/modules/cms-kit-pro/index.md
+++ b/docs/en/modules/cms-kit-pro/index.md
@@ -7,7 +7,7 @@
# CMS Kit Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module extends the [open-source CMS Kit module](../cms-kit) and adds additional CMS (Content Management System) capabilities to your application.
diff --git a/docs/en/modules/cms-kit-pro/newsletter.md b/docs/en/modules/cms-kit-pro/newsletter.md
index 84cc2ee34c..3097011658 100644
--- a/docs/en/modules/cms-kit-pro/newsletter.md
+++ b/docs/en/modules/cms-kit-pro/newsletter.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: Newsletter System
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
CMS Kit provides a **newsletter** system to allow users to subscribe to newsletters. Here a screenshot of the newsletter subscription widget:
diff --git a/docs/en/modules/cms-kit-pro/page-feedback.md b/docs/en/modules/cms-kit-pro/page-feedback.md
index ac2278d893..559ed98a3a 100644
--- a/docs/en/modules/cms-kit-pro/page-feedback.md
+++ b/docs/en/modules/cms-kit-pro/page-feedback.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: Page Feedback System
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
The CMS Kit Pro module provides a comprehensive **Page Feedback** system that enables you to collect valuable user feedback about your website pages. This system allows visitors to quickly rate their experience and provide comments, helping you understand user satisfaction and identify areas for improvement.
diff --git a/docs/en/modules/cms-kit-pro/poll.md b/docs/en/modules/cms-kit-pro/poll.md
index f10baf080e..dfee545219 100644
--- a/docs/en/modules/cms-kit-pro/poll.md
+++ b/docs/en/modules/cms-kit-pro/poll.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: Poll System
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
CMS Kit provides a **poll** system to allow users to create, edit and delete polls. Here is a screenshot of the poll widget:
diff --git a/docs/en/modules/cms-kit-pro/url-forwarding.md b/docs/en/modules/cms-kit-pro/url-forwarding.md
index cd164ebba0..2a1b639cab 100644
--- a/docs/en/modules/cms-kit-pro/url-forwarding.md
+++ b/docs/en/modules/cms-kit-pro/url-forwarding.md
@@ -7,7 +7,7 @@
# CMS Kit Pro: URL Forwarding System
-> You must have an ABP Team or a higher license to use CMS Kit Pro module's features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use CMS Kit Pro module's features.
CMS Kit provides a **URL forwarding** system to create URLs that redirect to other pages or external websites.
diff --git a/docs/en/modules/cms-kit/dynamic-widget.md b/docs/en/modules/cms-kit/dynamic-widget.md
index 8644f7cd63..f0646cc00f 100644
--- a/docs/en/modules/cms-kit/dynamic-widget.md
+++ b/docs/en/modules/cms-kit/dynamic-widget.md
@@ -124,21 +124,26 @@ In this image, after choosing your widget (on the other case, it changes automat
You can edit this output manually if do any wrong coding for that (wrong value or typo) you won't see the widget, even so, your page will be viewed successfully.
-## Options
-To configure the widget, you should define the below code in YourModule.cs
+## Options
+
+To add content widgets, you should configure the `CmsKitContentWidgetOptions` in your module's `ConfigureServices` method:
```csharp
Configure(options =>
{
options.AddWidget(widgetType: "Today", widgetName: "CmsToday", parameterWidgetName: "Format");
+
+ // Alternatively, you can add a widget conditionally based on a global feature being enabled
+ options.AddWidgetIfFeatureEnabled(typeof(PagesFeature), "Today", "CmsToday", "Format");
});
```
-Let's look at these parameters in detail
-* `widgetType` is used for end-user and more readable names. The following bold word represents widgetType.
-[Widget Type="**Today**" Format="yyyy-dd-mm HH:mm:ss"].
+The `CmsKitContentWidgetOptions` provides two methods for registering widgets:
-* `widgetName` is used for your widget name used in code for the name of the `ViewComponent`.
+- **AddWidget:** Registers a widget that will be available in the content editor. It accepts the following parameters:
+ - `widgetType` (required): A user-friendly name for the widget that appears in the widget selection dropdown and is used in content markup. For example, in `[Widget Type="Today"]`, `"Today"` is the `widgetType`.
+ - `widgetName` (required): The name of the `ViewComponent` that will be rendered. This must match the `Name` attribute of your `ViewComponent` (e.g., `[ViewComponent(Name = "CmsToday")]`).
+ - `parameterWidgetName` (optional): The name of the parameter widget that will be displayed in the "Add Widget" modal to collect parameter values from users. This is only required when your widget needs parameters.
-* `parameterWidgetName` is used the for editor component side to see on the `Add Widget` modal.
-After choosing the widget type from listbox (now just defined `Format`) and renders this widget automatically. It's required only to see UI once using parameters
\ No newline at end of file
+- **AddWidgetIfFeatureEnabled:** Registers a widget conditionally, only if a specified [global feature](../../framework/infrastructure/global-features.md) is enabled. It accepts the same parameters as `AddWidget`, plus an additional first parameter:
+ - `featureType` (required): The type of the global feature that must be enabled for the widget to be available (e.g., `typeof(PagesFeature)`).
\ No newline at end of file
diff --git a/docs/en/modules/elsa-pro.md b/docs/en/modules/elsa-pro.md
index 3a6ec4533b..6b93e42368 100644
--- a/docs/en/modules/elsa-pro.md
+++ b/docs/en/modules/elsa-pro.md
@@ -1,10 +1,17 @@
+```json
+//[doc-seo]
+{
+ "Description": "Integrate Elsa Workflows into your ABP applications with this Pro module. Learn installation and setup for seamless workflow management."
+}
+```
+
# Elsa Module (Pro)
> You must have an ABP Team or a higher license to use this module.
This module integrates [Elsa Workflows](https://docs.elsaworkflows.io/) into ABP Framework applications and is designed to make it easy for developers to use Elsa's capabilities within their ABP-based projects. For creating, managing, and customizing workflows themselves, please refer to [the official Elsa documentation](https://docs.elsaworkflows.io/).
-## How to install
+## How to Install
The Elsa module is not installed in [the startup templates](../solution-templates/layered-web-application) by default and must be installed manually. There are two ways of installing a module into your application and each one of these approaches is explained in the next sections.
@@ -37,6 +44,23 @@ After adding the package references, open the module class of the project (e.g.:
> If you are using Blazor Web App, you need to add the `Volo.Elsa.Admin.Blazor.WebAssembly` package to the **{ProjectName}.Blazor.Client.csproj** project and add the `Volo.Elsa.Admin.Blazor.Server` package to the **{ProjectName}.Blazor.csproj** project.
+### `AbpElsaAspNetCoreModule` and `AbpElsaIdentityModule`
+
+These two modules generally will be added to your authentication project. Please add `Volo.Elsa.Abp.AspNetCore` and `Volo.Elsa.Abp.Identity` packages to your project and add the `AbpElsaAspNetCoreModule` and `AbpElsaIdentityModule` to the `DependsOn` attribute of your module class based on your project structure:
+
+```xml
+
+
+```
+
+```csharp
+[DependsOn(
+ //...
+ typeof(AbpElsaAspNetCoreModule),
+ typeof(AbpElsaIdentityModule)
+)]
+```
+
## The Elsa Module
The Elsa Workflows has its own database provider, and also has a Tenant/Role/User system. They are under active development, so the ABP Elsa module is not yet fully integrated. Below is the current status of each module in the ABP's Elsa Module:
@@ -56,6 +80,49 @@ The rest of the projects/modules are basically empty and will be implemented in
- `AbpElsaBlazorWebAssemblyModule(Volo.Elsa.Abp.Blazor.WebAssembly)`
- `AbpElsaWebModule(Volo.Elsa.Abp.Web)`
+## Configure the Elsa Server
+
+You need to configure Elsa in your ABP application to use its features. You can do that in the `ConfigureServices` method of your `YourElsaAppModule` class as shown below:
+
+> For more information about configuring Elsa, please refer to [the official Elsa documentation](https://docs.elsaworkflows.io/).
+
+```cs
+private void ConfigureElsa(ServiceConfigurationContext context, IConfiguration configuration)
+{
+ var connectionString = configuration.GetConnectionString("Default")!;
+ context.Services
+ .AddElsa(elsa => elsa
+ .UseAbpIdentity(identity => // Use UseAbpIdentity instead of UseIdentity to integrate with ABP Identity module
+ {
+ identity.TokenOptions = options => options.SigningKey = "large-signing-key-for-signing-JWT-tokens";
+ })
+ .UseWorkflowManagement(management => management.UseEntityFrameworkCore(ef => ef.UseSqlServer(connectionString)))
+ .UseWorkflowRuntime(runtime => runtime.UseEntityFrameworkCore(ef => ef.UseSqlServer(connectionString)))
+ .UseScheduling()
+ .UseJavaScript()
+ .UseLiquid()
+ .UseCSharp()
+ .UseHttp(http => http.ConfigureHttpOptions = options => configuration.GetSection("Http").Bind(options))
+ .UseWorkflowsApi()
+ .AddActivitiesFrom()
+ .AddWorkflowsFrom()
+ );
+}
+```
+
+## Elsa Database Migration
+
+Elsa module uses its own database context and migration system, ABP Elsa module doesn't contain any `aggregate root/entity` at the moment. So, **you don't need to create any initial migration for Elsa module**. You just need to configure the Elsa Services as follows:
+
+```cs
+.UseWorkflowManagement(management => management.UseEntityFrameworkCore(ef => ef.UseSqlServer(connectionString)))
+.UseWorkflowRuntime(runtime => runtime.UseEntityFrameworkCore(ef => ef.UseSqlServer(connectionString)))
+```
+
+When you run your application, Elsa will create its own database tables if they do not exist.
+
+> See [how to configure Elsa Workflows to use different database providers for persistence, including SQL Server, PostgreSQL, and MongoDB](https://docs.elsaworkflows.io/getting-started/database-configuration) for more information.
+
### Elsa Module Permissions
The Elsa Workflow API endpoints check permissions. Also, it has a `*` wildcard permission to allow all permissions.
@@ -72,14 +139,24 @@ You can also grant parts of the permissions to a role or user. It will add the `
### Elsa Studio
-Elsa Studio is an **independent** web application that allows you to design, manage, and execute workflows. It is built using **Blazor Server/WebAssembly**.
+[Elsa Studio](https://docs.elsaworkflows.io/application-types/elsa-studio) is a **standalone** web application that allows you to design, manage, and execute workflows. It is built using **Blazor Server/WebAssembly**.
+
+`ElsaDemoApp.Studio.WASM` is a sample Blazor WebAssembly project that demonstrates how to use Elsa Studio with ELSA Server with ABP Framework.
+
+> Elsa Studio has its own layout and theme, and you can't integrate it into an ABP Blazor project for now.
+
+
+
+Please check the [Elsa Workflows - Sample Workflow Demo](../samples/elsa-workflows-demo.md) document to download its source code for review.
+
+#### Elsa Studio Authentication
Elsa Studio requires authentication and there are two ways to authenticate Elsa Studio:
* Password Flow Authentication
* Code Flow Authentication
-#### Elsa Studio - Password Flow Authentication
+##### Elsa Studio - Password Flow Authentication
The `AbpElsaIdentityModule(Volo.Elsa.Abp.Identity)` module is used to integrate with [ABP Identity module](./identity-pro.md) to check Elsa Studio *username* and *password* against ABP Identity.
@@ -109,7 +186,7 @@ Once, you logged in to the application, you can start defining workflows, manage

-#### Elsa Studio - Code Flow Authentication
+##### Elsa Studio - Code Flow Authentication
ABP applications use [OpenIddict](./openiddict-pro.md) for authentication. So, you can use the [Authorization Code Flow](https://oauth.net/2/grant-types/authorization-code/) to authenticate Elsa Studio.
diff --git a/docs/en/modules/feature-management.md b/docs/en/modules/feature-management.md
index 300b232f93..e80098a04d 100644
--- a/docs/en/modules/feature-management.md
+++ b/docs/en/modules/feature-management.md
@@ -72,9 +72,10 @@ namespace Demo
## Feature Management Providers
-Features Management Module is extensible, just like the [features system](../framework/infrastructure/features.md). You can extend it by defining feature management providers. There are 3 pre-built feature management providers registered it the following order:
+Features Management Module is extensible, just like the [features system](../framework/infrastructure/features.md). You can extend it by defining feature management providers. There are 4 pre-built feature management providers registered in the following order:
* `DefaultValueFeatureManagementProvider`: Gets the value from the default value of the feature definition. It can not set the default value since default values are hard-coded on the feature definition.
+* `ConfigurationFeatureManagementProvider`: Gets the value from the [IConfiguration service](../framework/fundamentals/configuration.md).
* `EditionFeatureManagementProvider`: Gets or sets the feature values for an edition. Edition is a group of features assigned to tenants. Edition system has not implemented by the Tenant Management module. You can implement it yourself or purchase the ABP [SaaS Module](https://abp.io/modules/Volo.Saas) which implements it and also provides more SaaS features, like subscription and payment.
* `TenantFeatureManagementProvider`: Gets or sets the features values for tenants.
diff --git a/docs/en/modules/file-management.md b/docs/en/modules/file-management.md
index 5725af4297..8a5f7aae29 100644
--- a/docs/en/modules/file-management.md
+++ b/docs/en/modules/file-management.md
@@ -7,7 +7,7 @@
# File Management Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module is used to upload, download and organize files in a hierarchical folder structure. It is also compatible to multi-tenancy and you can determine total size limit for your tenants.
@@ -144,6 +144,12 @@ You can move files by clicking `Actions -> Move` on the table.
You can rename a file by clicking `Actions -> Rename` on the table.
+###### File Sharing
+
+To share a file, click `Actions -> Share` in the table. Once sharing is enabled, you can copy the shared link directly from the table.
+
+> Anyone with the shared link will be able to access the file while sharing is enabled.
+
## Data Seed
This module doesn't seed any data.
diff --git a/docs/en/modules/forms.md b/docs/en/modules/forms.md
index f903cc471b..f2456b792b 100644
--- a/docs/en/modules/forms.md
+++ b/docs/en/modules/forms.md
@@ -7,7 +7,7 @@
# Forms Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module allows you to create questionnaires to gather information. The forms module can store responses as they come in and you can export the data to a CSV file. You can share your form with others with your form unique link. You can request authentication or allow anonymous reply. It is similar to the Google Form application. Usage area is quite wide, you can create surveys, manage event registrations, collect email addresses for a newsletter, create a quiz, and even receive an order request.
diff --git a/docs/en/modules/gdpr.md b/docs/en/modules/gdpr.md
index f797a3b713..0a0bd7fb09 100644
--- a/docs/en/modules/gdpr.md
+++ b/docs/en/modules/gdpr.md
@@ -7,7 +7,7 @@
# GDPR Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module allows users to download and delete their personal data collected by the application.
diff --git a/docs/en/modules/identity-pro.md b/docs/en/modules/identity-pro.md
index f23b9e801a..0d26154932 100644
--- a/docs/en/modules/identity-pro.md
+++ b/docs/en/modules/identity-pro.md
@@ -7,7 +7,7 @@
# Identity Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module implements the User and Role system of an application;
@@ -434,9 +434,10 @@ This module doesn't define any additional distributed event. See the [standard d
## See Also
* [Import External Users](./identity/import-external-users.md)
-* [LDAP Login](./identity/idap.md)
+* [LDAP Login](./identity/ldap.md)
* [OAuth Login](./identity/oauth-login.md)
* [Periodic Password Change (Password Aging)](./identity/periodic-password-change.md)
* [Two Factor Authentication](./identity/two-factor-authentication.md)
* [Session Management](./identity/session-management.md)
* [Password History](./identity/password-history.md)
+
diff --git a/docs/en/modules/identity-server-pro.md b/docs/en/modules/identity-server-pro.md
index 66e16fcb71..48ead33082 100644
--- a/docs/en/modules/identity-server-pro.md
+++ b/docs/en/modules/identity-server-pro.md
@@ -7,7 +7,7 @@
# Identity Server Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module provides integration and management functionality for Identity Server;
diff --git a/docs/en/modules/identity/import-external-users.md b/docs/en/modules/identity/import-external-users.md
index 562515ceee..00c8e4b824 100644
--- a/docs/en/modules/identity/import-external-users.md
+++ b/docs/en/modules/identity/import-external-users.md
@@ -9,7 +9,7 @@
## Introduction
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
The Identity PRO module has built-in `LdapExternalLoginProvider` and `OAuthExternalLoginProvider` services. They not only support external login but also import users.
diff --git a/docs/en/modules/identity/idap.md b/docs/en/modules/identity/ldap.md
similarity index 95%
rename from docs/en/modules/identity/idap.md
rename to docs/en/modules/identity/ldap.md
index cf4c8fbcaa..c01bc630ef 100644
--- a/docs/en/modules/identity/idap.md
+++ b/docs/en/modules/identity/ldap.md
@@ -9,13 +9,13 @@
## Introduction
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
The Identity PRO module has built-in `LdapExternalLoginProvider` and `OpenLdapManager` services. It implements LDAP authentication and gets user info for [external login](https://github.com/abpframework/abp/issues/4977).
The cross-platform [LdapForNet](https://www.nuget.org/packages/LdapForNet/) library is used for Windows LDAP authentication. See [LdapForNet GitHub repository](https://github.com/flamencist/ldap4net) for more information.
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
## How to enable LDAP external login?
diff --git a/docs/en/modules/identity/oauth-login.md b/docs/en/modules/identity/oauth-login.md
index f628ec8c7b..b36e35cfc1 100644
--- a/docs/en/modules/identity/oauth-login.md
+++ b/docs/en/modules/identity/oauth-login.md
@@ -9,7 +9,7 @@
## Introduction
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
The Identity PRO module has built-in `OAuthExternalLoginProvider` service. It implements OAuth Resource Owner Password authentication and gets user info for [external login](https://github.com/abpframework/abp/issues/4977).
diff --git a/docs/en/modules/identity/periodic-password-change.md b/docs/en/modules/identity/periodic-password-change.md
index 4367ee88bb..2a5acf9634 100644
--- a/docs/en/modules/identity/periodic-password-change.md
+++ b/docs/en/modules/identity/periodic-password-change.md
@@ -9,7 +9,7 @@
## Introduction
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
The Identity PRO module has a built-in password aging function.
diff --git a/docs/en/modules/identity/two-factor-authentication.md b/docs/en/modules/identity/two-factor-authentication.md
index 2acab6ec53..1ac4b5dd75 100644
--- a/docs/en/modules/identity/two-factor-authentication.md
+++ b/docs/en/modules/identity/two-factor-authentication.md
@@ -7,7 +7,7 @@
# Two Factor Authentication
-> You must have an ABP Team or a higher license to use this module & its features.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module & its features.
Two-factor authentication (**2FA**) is a specific type of multi-factor authentication (MFA) that requires the authenticating party to produce two separate identifying factors to verify your identity. The first factor is something you know "**username & password**" and the second factor is something you have "**mobile device or email**" to verify authentication requests. 2FA protects against phishing, social engineering and password brute-force attacks and secures your logins from attackers exploiting weak or stolen credentials.
diff --git a/docs/en/modules/language-management.md b/docs/en/modules/language-management.md
index 8ac9e6088e..a4c2968c2b 100644
--- a/docs/en/modules/language-management.md
+++ b/docs/en/modules/language-management.md
@@ -7,7 +7,7 @@
# Language Management Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module implements the Language management system of an application;
diff --git a/docs/en/modules/openiddict-pro.md b/docs/en/modules/openiddict-pro.md
index 5b681f6461..f531f65531 100644
--- a/docs/en/modules/openiddict-pro.md
+++ b/docs/en/modules/openiddict-pro.md
@@ -7,7 +7,7 @@
# OpenIddict Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module provides integration and management functionality for the OpenIddict library;
diff --git a/docs/en/modules/payment-custom-gateway.md b/docs/en/modules/payment-custom-gateway.md
index a17a225e09..df142f7a8c 100644
--- a/docs/en/modules/payment-custom-gateway.md
+++ b/docs/en/modules/payment-custom-gateway.md
@@ -7,7 +7,7 @@
# Creating a Custom Payment Gateway
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This document explains creating custom a payment gateway that's different than the existing ones in the [Payment Module](payment#packages).
diff --git a/docs/en/modules/payment.md b/docs/en/modules/payment.md
index b0d976b758..29654a2d42 100644
--- a/docs/en/modules/payment.md
+++ b/docs/en/modules/payment.md
@@ -7,7 +7,7 @@
# Payment Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
Payment module implements payment gateway integration of an application. It provides one time payment and recurring payment options.
diff --git a/docs/en/modules/saas.md b/docs/en/modules/saas.md
index d6faa4dbcb..7d78a4e9df 100644
--- a/docs/en/modules/saas.md
+++ b/docs/en/modules/saas.md
@@ -7,7 +7,7 @@
# SaaS Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module is used to manage your tenants and editions in multi-tenant applications;
@@ -40,7 +40,7 @@ Firstly, Payment module must be configured properly:
```bash
abp add-module Volo.Payment
```
- _Or you can install via using ABP Suite._
+ _Or you can install via using ABP Studio._
- Configure Saas module to use Payment.
diff --git a/docs/en/modules/text-template-management.md b/docs/en/modules/text-template-management.md
index c0e19a0523..fa62ee7470 100644
--- a/docs/en/modules/text-template-management.md
+++ b/docs/en/modules/text-template-management.md
@@ -7,7 +7,7 @@
# Text Template Management Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
This module is used to store and edit template contents for [the text templating system](../framework/infrastructure/text-templating/index.md) of the ABP. So, you may need to understand it to better understand the purpose of this module.
diff --git a/docs/en/modules/twilio-sms.md b/docs/en/modules/twilio-sms.md
index 6ea6c7e93f..63ed91a148 100644
--- a/docs/en/modules/twilio-sms.md
+++ b/docs/en/modules/twilio-sms.md
@@ -7,7 +7,7 @@
# Twilio SMS Module (Pro)
-> You must have an ABP Team or a higher license to use this module.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use this module.
[Twilio](https://www.twilio.com) is a cloud communication provider that makes it easy to send and receive SMS. ABP Twilio SMS module implements the SMS sending feature of `ISmsSender` interface with Twilio.
diff --git a/docs/en/others/penetration-test-report.md b/docs/en/others/penetration-test-report.md
index 13086fb2a0..cc80d39b8e 100644
--- a/docs/en/others/penetration-test-report.md
+++ b/docs/en/others/penetration-test-report.md
@@ -7,7 +7,7 @@
# ABP Penetration Test Report
-The ABP Commercial MVC `v9.1.0` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
+The ABP Commercial MVC `v10.0.1` application template has been tested against security vulnerabilities by the [OWASP ZAP v2.14.0](https://www.zaproxy.org/) tool. The demo web application was started on the `https://localhost:44349` address. The below alerts have been reported by the pentest tool. These alerts are sorted by the risk level as high, medium, and low. The informational alerts are not mentioned in this document.
Many of these alerts are **false-positive**, meaning the vulnerability scanner detected these issues, but they are not exploitable. It's clearly explained for each false-positive alert why this alert is a false-positive.
@@ -17,53 +17,75 @@ In the next sections, you will find the affected URLs, attack parameters (reques
There are high _(red flag)_, medium _(orange flag)_, low _(yellow flag)_, and informational _(blue flag)_ alerts.
-
+
-> The informational alerts are not mentioned in this document. These alerts are not raising any risks on your application and they are optional.
+> The informational alerts are not mentioned in this document. These alerts don't raise any risks for your application and they are optional.
-### Spring4Shell [Risk: High] - False Positive
+### Cross Site Scripting (Reflected) [Risk: High] - Positive
-- *[POST] - https://localhost:44349/Account/ForgotPassword* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**)
-- *[POST] - https://localhost:44349/Account/Login* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**)
-- *[POST] - https://localhost:44349/Account/Login?ReturnUrl=%2FSettingManagement* (attack: **class.module.classLoader.DefaultAssertionStatus=nonsense**)
+- *[GET] - https://localhost:44349/Identity/OrganizationUnits/AddMemberModal?title=SelectAUser&organizationUnitId=...&OrganizationUnitName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E*
+- *[GET] - https://localhost:44349/Identity/OrganizationUnits/AddRoleModal?organizationUnitId=...&OrganizationUnitName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E*
+- *[GET] - https://localhost:44349/Saas/Host/Tenants/ImpersonateTenantModal?tenantId=...&tenantName=%3C%2Fh5%3E%3CscrIpt%3Ealert%281%29%3B%3C%2FscRipt%3E%3Ch5%3E*
**Description**:
-The application appears to be vulnerable to CVE-2022-22965 (otherwise known as Spring4Shell) - remote code execution (RCE) via data binding.
+Cross-site Scripting (XSS) is an attack technique that involves echoing attacker-supplied code into a user's browser instance.
**Explanation**:
-ABP Framework is built on top of ASP.NET Core and does not use the Spring Framework. This application does not rely on Java-based technologies, making it immune to vulnerabilities like Spring4Shell. The detection is a false positive as there are no Spring dependencies in the project.
+This is a **Positive** alert. The application reflects the `OrganizationUnitName` and `tenantName` parameters without proper encoding in the modal headers, allowing for the execution of arbitrary JavaScript. We have created an **internal issue** to track this vulnerability, and it will be fixed in the next release.
-### Absence of Anti-CSRF Tokens [Risk: Medium] — False Positive
+### PII Disclosure [Risk: High] - False Positive
-* *[GET] - https://localhost:44349/Account/LinkUsers/LinkUsersModal?returnUrl=/SettingManagement*
-* *[GET] — https://localhost:44349/Account/Manage* (same URL with different query parameters)
-* *[GET] - https://localhost:44349/HostDashboard*
-* *[GET] - https://localhost:44349/SettingManagement?handler=RenderView&id=Volo.Abp.Account* (other several URLs)
+- *[GET] - https://localhost:44349/* (Evidence: 639002492030480000)
+- *[GET] - https://localhost:44349/?page=...*
-**Description**:
+**Description**:
-No Anti-CSRF tokens were found in an HTML submission form.
-A cross-site request forgery is an attack that involves forcing a victim to send an HTTP request to a target destination without their knowledge or intent in order to perform an action as the victim. The underlying cause is application functionality using predictable URL/form actions in a repeatable way. The nature of the attack is that CSRF exploits the trust that a website has for a user. By contrast, cross-site scripting (XSS) exploits the trust that a user has in a website. Like XSS, CSRF attacks are not necessarily cross-site, but they can be. Cross-site request forgery is also known as CSRF, XSRF, one-click attack, session riding, confused deputy, and sea surf.
+The response contains Personally Identifiable Information, such as CC number, SSN and similar sensitive data.
-**Explanation:**
+**Explanation**:
-This is a **false-positive** alert because ABP provides the Anti-CSRF token via a cookie as seen on the following screenshot:
+This is a **false-positive** alert. The detected numbers (e.g., `639002492030480000`) are cache-busting timestamps (`_v` parameter) generated by the framework for static assets. They coincidentally match the pattern of Credit Card numbers (pattern matching) but are not sensitive data.
-
+### Path Traversal [Risk: High] - False Positive
-### Application Error Disclosure [Risk: Medium] - False Positive
+- *[GET] - https://localhost:44349/Account/Login?returnUrl=Login*
+- *[GET] - https://localhost:44349/api/account/security-logs?action=\security-logs*
-- *[GET] — https://localhost:44349/AuditLogs*
+**Description**:
-**Description**:
+The Path Traversal attack technique allows an attacker access to files, directories, and commands that potentially reside outside the web document root directory.
+
+**Explanation**:
+
+This is a **false-positive** alert. ABP Framework automatically validates `returnUrl` parameters and ensures they are local to the application or within a whitelist. The application does not return file contents based on these parameters.
+
+### SQL Injection [Risk: High] - False Positive
+
+- *[GET] - https://localhost:44349/AbpPermissionManagement/PermissionManagementModal?providerKey=AbpSolution16711_Swagger+AND+1%3D1+--+*
+- *[GET] - https://localhost:44349/Account/Manage?CurrentPassword=ZAP%27+AND+%271%27%3D%271%27+--+*
+
+**Description**:
+
+SQL injection may be possible.
-This page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
+**Explanation**:
+
+This is a **false-positive** alert. ABP Framework uses Entity Framework Core, which inherently uses parameterized queries, preventing standard SQL injection attacks. Manual verification showed that injecting SQL syntax into parameters like `providerKey` results in the input being treated as a literal string (resulting in no match or default behavior) rather than altering the query structure.
+
+### SQL Injection - SQLite [Risk: High] - False Positive
+
+- *[POST] - https://localhost:44349/Account/ForgotPassword?returnUrl=%2FAccount%2FManage* (Attack: `case randomblob(100000) ...`)
+- *[POST] - https://localhost:44349/FeatureManagement/FeatureManagementModal*
+
+**Description**:
+
+SQL injection may be possible.
**Explanation**:
-There are only one URL that is reported as exposing error messages. This is a **false-positive** alert. The [Audit Logging Module](../modules/audit-logging.md), shows request & response details and exception information, these are not sensitive information and only can be seen by the users whose related permissions are granted.
+This is a **false-positive** alert. Similar to the standard SQL Injection alert, the application uses parameterized queries. The detected delays are likely due to application processing variations or network latency rather than successful SQL injection.
### Content Security Policy (CSP) Header Not Set [Risk: Medium] — Positive (Fixed)
@@ -238,23 +260,7 @@ A cookie has been set with its `SameSite` attribute set to `none`, which means t
Ensure that the `SameSite` attribute is set to either `lax` or ideally `strict` for all cookies. We discussed setting the **SameSite** attribute to `strict` in the following issue [github.com/abpframework/abp/issues/14215](https://github.com/abpframework/abp/issues/14215) and decided to leave this change to the final developer.
-### Information Disclosure - Debug Error Messages [Risk: Low] — False Positive
-
-* *[GET] - https://localhost:44349/AuditLogs*
-
-**Description:**
-
-The response appeared to contain common error messages returned by platforms such as ASP.NET, and Web-servers such as IIS and Apache. You can configure the list of common debug messages.
-
-**Solution:**
-
-Disable debugging messages before pushing them to production.
-
-**Explanation:**
-
-The response of the endpoints above return localization texts which are not real error messages. As there is no real error in the backend side, this vulnerability is a **false-positive** alert.
-
### Strict-Transport-Security Header Not Set [Risk: Low] - False Positive
diff --git a/docs/en/release-info/migration-guides/abp-10-0.md b/docs/en/release-info/migration-guides/abp-10-0.md
index c4b46a1edd..334adb2f4f 100644
--- a/docs/en/release-info/migration-guides/abp-10-0.md
+++ b/docs/en/release-info/migration-guides/abp-10-0.md
@@ -1,18 +1,43 @@
+```json
+//[doc-seo]
+{
+ "Description": "Upgrade your ABP solutions from v9.x to v10.0 with this comprehensive migration guide, ensuring compatibility and new features with .NET 10.0."
+}
+```
+
# ABP Version 10.0 Migration Guide
-This document is a guide for upgrading ABP v9.x solutions to ABP v10.0. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
+This document is a guide for upgrading ABP v9.x solutions to ABP v10.0. There are some changes in this version that may affect your applications. Please read them carefully and apply the necessary changes to your application.
## Open-Source (Framework)
-### Upgraded to .NET 10.0
+### Upgrade to .NET 10.0
+
+We've upgraded ABP to .NET 10.0, so you need to move your solutions to .NET 10.0 if you want to use ABP 10.0. You can check Microsoft’s [Migrate from ASP.NET Core 9.0 to 10.0](https://learn.microsoft.com/en-us/aspnet/core/migration/90-to-100) documentation to see how to update an existing ASP.NET Core 9.0 project to ASP.NET Core 10.0.
+
+### MySQL Support for .NET 10.0
+
+**If you are using MySQL as your database provider, please be aware of the following compatibility issues before upgrading to ABP 10.0!**
+
+The MySQL Entity Framework Core providers currently have limited support for .NET 10.0:
+
+* **Pomelo.EntityFrameworkCore.MySql**: Does not yet support .NET 10.0. The team is actively working on adding support.
+* **MySql.EntityFrameworkCore**: Currently in Release Candidate (RC) status with known bugs that may affect production applications.
+
+**Recommendation**: If you are using MySQL, we recommend waiting to upgrade to ABP 10.0 until the MySQL providers release stable versions with full .NET 10.0 support.
-We've upgraded ABP to .NET 10.0, so you need to move your solutions to .NET 10.0 if you want to use ABP 10.0. You can check Microsoft’s [Migrate from ASP.NET Core 9.0 to 10.0](https://learn.microsoft.com/en-us/aspnet/core/migration/90-to-100) documentation, to see how to update an existing ASP.NET Core 9.0 project to ASP.NET Core 10.0.
+**Track Progress**:
-### Add new EF Core Migrations
+* [Pomelo Provider - EF Core 10 Support](https://github.com/PomeloFoundation/Pomelo.EntityFrameworkCore.MySql/issues/2007)
+* [MySql.EntityFrameworkCore NuGet Package](https://www.nuget.org/packages/MySql.EntityFrameworkCore/#versions-body-tab)
+
+We will update to support the latest stable MySQL providers as soon as they become available.
+
+### Add New EF Core Migrations
Some entities in certain modules have been modified. If you are using Entity Framework Core, please create a new EF Core migration in your project after upgrading to ABP 10.0.
-> If the migration file is empty, you can remove it by `dotnet ef migrations remove` command.
+> If the migration file is empty, you can remove it by using the `dotnet ef migrations remove` command.
### Razor Runtime Compilation Obsolete
@@ -20,7 +45,13 @@ We removed the Razor Runtime Compilation support since it is obsolete and replac
If you want to keep using it, you can add [Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation) package to your project and configure it manually.
+> If the referenced project also contains Razor Pages that require this feature, add the package to that project as well.
+
```csharp
+using Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.AspNetCore.VirtualFileSystem;
+
public override void ConfigureServices(ServiceConfigurationContext context)
{
if (context.Services.GetHostingEnvironment().IsDevelopment())
@@ -42,31 +73,25 @@ For more information, you can check the [Razor Runtime Compilation Obsolete](htt
### IActionContextAccessor Obsolete
-We removed the `IActionContextAccessor` from dependency injection.
-
-> We are not using `IActionContextAccessor` in ABP core framework and modules.
+We removed the `IActionContextAccessor` from dependency injection and are not using the `IActionContextAccessor` in ABP's core framework and modules.
See [IActionContextAccessor Obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/iactioncontextaccessor-obsolete) for more information.
### Add `BLOB Storing Memory Provider` module.
-In this version, we added the `BLOB Storing Memory Provider` module for unit testing purposes.
+In this version, we have added the `BLOB Storing Memory Provider` module for unit testing purposes.
See the [BLOB Storing Memory Provider](https://github.com/abpframework/abp/blob/dev/docs/en/framework/infrastructure/blob-storing/memory.md) document for more information.
### Always use `MapStaticAssets`
-Provious, the `MapStaticAssets` has performance problems if there are too many static files. and we will use `StaticFileMiddleware` to serve the static files in development mode. NET 10.0 has fixed this problem. We will always use `MapStaticAssets` to serve the static files.
+Previously, the `MapStaticAssets` had performance problems if there were too many static files. NET 10.0 has fixed this problem. We will always use `MapStaticAssets` to serve the static files.
See [Static file serving performance issues](https://github.com/dotnet/aspnetcore/issues/59673) for more information.
### C# 14 overload resolution with span parameters
-NET Core will redirect `array.Contains` extension method to `MemoryExtensions.Contains`, This will cause `MongoDB.Driver` to be unable to translate `IQueryable`, If you are using `array.Contains` in your code, you should use following code to avoid this problem.
-
-> Only array has this problem, other types are not affected. eg List, HashSet, etc.
-
-> MongoDB.Driver will be fixed in the future.
+NET Core will redirect the `array.Contains` extension method to `MemoryExtensions.Contains`. This will cause `MongoDB.Driver` to be unable to translate `IQueryable`. If you are using `array.Contains` in your code, you should use the following code to avoid this problem:
```csharp
M((array, num) => array.Contains(num)); // fails, binds to MemoryExtensions.Contains
@@ -75,13 +100,15 @@ M((array, num) => array.AsEnumerable().Contains(num)); // ok, binds to Enumerabl
M((array, num) => Enumerable.Contains(array, num)); // ok, binds to Enumerable.Contains
```
+> Please note that only the `array` type has this problem. Other types are not affected (e.g. `List`, `HashSet`, etc). **MongoDB.Driver** provider will be fixed in future versions, and we will immediately apply the changes if needed.
+
See the [C# 14 overload resolution with span parameters](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/csharp-overload-resolution#recommended-action) for more information.
-### OpenIddict 7.X
+### OpenIddict Upgrade to 7.X
-We upgraded OpenIddict to 7.X. See the [OpenIddict 6.x to 7.x Migration Guide](https://documentation.openiddict.com/guides/migration/60-to-70.html) for more information.
+We have upgraded **OpenIddict** to **v7.x**. For detailed information about the changes introduced in this release, refer to the [OpenIddict 6.x to 7.x Migration Guide](https://documentation.openiddict.com/guides/migration/60-to-70.html).
-OpenIddict 7.X changed the `OpenIddictToken` entity, you must create a new database migration if you use Entity Framework Core.
+As a developer, you typically only need to **create a new Entity Framework Core migration** and **apply it to your database**, since **OpenIddict v7.x** introduces a modification in the `OpenIddictToken` entity.
### Migrating from AutoMapper to Mapperly
@@ -107,6 +134,3 @@ Starting from **ABP 10.0**, the [`HideErrors`](../../framework/fundamentals/cach
By default, ABP hides and logs cache server errors to keep the application running even when the cache is unavailable.
However, in the **development environment**, errors are no longer hidden so that developers can immediately detect and fix **any cache server issues** (such as connection, configuration, or runtime errors).
-
-## PRO
-
diff --git a/docs/en/release-info/migration-guides/abp-5-0-angular.md b/docs/en/release-info/migration-guides/abp-5-0-angular.md
index f6abcf10f6..66627b1e8a 100644
--- a/docs/en/release-info/migration-guides/abp-5-0-angular.md
+++ b/docs/en/release-info/migration-guides/abp-5-0-angular.md
@@ -104,7 +104,7 @@ If you don't want to use the NGXS, you should remove all NGXS related imports, i
## @angular/localize package
-[`@angular/localize`](https://angular.io/api/localize) dependency has been removed from `@abp/ng.core` package. The package must be installed in your app. Run the following command to install:
+[`@angular/localize`](https://angular.dev/guide/i18n/add-package) dependency has been removed from `@abp/ng.core` package. The package must be installed in your app. Run the following command to install:
```bash
npm install @angular/localize@12
diff --git a/docs/en/release-info/release-notes.md b/docs/en/release-info/release-notes.md
index cb6d5f421d..bf335fa7a2 100644
--- a/docs/en/release-info/release-notes.md
+++ b/docs/en/release-info/release-notes.md
@@ -14,9 +14,21 @@ Also see the following notes about ABP releases:
* [ABP Studio release notes](../studio/release-notes.md)
* [Change logs for ABP pro packages](https://abp.io/pro-releases)
+## 10.0 (2025-11-18)
+
+See the detailed **[blog post / announcement](https://abp.io/community/announcements/abp.io-platform-10.0-final-has-been-released-spknn925)** for the v10.0 release.
+
+* Upgraded to .NET 10.0
+* Upgraded to `Blazorise` **v1.8.6**
+* New PRO Module: [Elsa Workflows](../modules/elsa-pro.md)
+* New Object Mapper: **Mapperly**
+* Localization: Nested Object Support in JSON Files
+* EF Core Shared Entity Types on Repositories
+* Angular SSR Support
+
## 9.3 (2025-06-17)
-This is currently a RC (release-candidate) and you can see the detailed **[blog post / announcement](https://abp.io/community/articles/announcing-abp-9-3-release-candidate-4dqgiryf)** for the v9.3 release.
+See the detailed **[blog post / announcement](https://abp.io/community/announcements/announcing-abp-9-3-stable-release-fw4n9sng)** for the v9.3 release.
* Cron Expression Support for Background Workers
* Docs Module: PDF Export
diff --git a/docs/en/release-info/road-map.md b/docs/en/release-info/road-map.md
index f7b432a39d..0df94ec157 100644
--- a/docs/en/release-info/road-map.md
+++ b/docs/en/release-info/road-map.md
@@ -11,36 +11,39 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions
-### v10.0
+### v10.1
-The next version will be 10.0 and planned to release the stable 10.0 version in December 2025. We will be mostly working on the following topics:
+The next version will be 10.1 and planned to release the stable 10.1 version in January 2026. We will be mostly working on the following topics:
* Framework
- * Upgrading to .NET 10
- * Upgrading 3rd-party dependencies
- * Enhancements in the core points
+ * OpenTelemetry Protocol Support for 3rd-party Integrations
+ * Resource Based Authorization Integration
+ * Upgrading 3rd-party Dependencies
+ * Enhancements in the Core Points
* ABP Suite
- * Define navigation properties without target string property dependency
- * Improvements one-to-many scenarios
- * File Upload Modal enhancements
-
+ * Define Navigation Properties Without Target String Property Dependency
+ * Improvements on Master-Detail Page Desing (making it more compact)
+ * Improvements One-To-Many Scenarios
+ * File Upload Modal Enhancements
* ABP Studio
- * Allow to directly create new solutions with ABP's RC (Release Candidate) versions
- * Automate more details on new service creation for a microservice solution
- * Support multiple concurrent Kubernetes deployment/integration scenarios
- * Improve the module installation experience / installation guides
- * Improve client proxy generation experience
- * Modular Monolith Application Startup Template
-
-* Application modules
- * Account module: Support mixed social/local login scenarios & adding security related features
- * UI/UX improvements on existing application modules
-
-* Updating existing tutorials & documents (with other UI & DB options)
- * Microservice development
- * Modular monolith development
+ * Allow to Directly Create New Solutions with ABP's RC (Release Candidate) Versions
+ * Automate More Details on New Service Creation for a Microservice Solution
+ * Allow to Download ABP Samples from ABP Studio
+ * Task Panel Enhancements (and Documentation)
+ * Support Multiple Concurrent Kubernetes Deployment/Integration Scenarios
+ * Improve the Module Installation Experience / Installation Guides
+
+* Application Modules
+ * Payment Module: Public Page Implementation (for Blazor & Angular UIs)
+ * AI Management Module: UI Implementation for Blazor & Angular UIs
+ * CMS Kit: Enhancements for Some Features (Rating, Dynamic Widgets, FAQ and more...)
+ * UI/UX Improvements on Existing Application Modules
+
+* Updating Existing Tutorials & Documents (with Other UI & DB Options)
+ * Microservice Development
+ * Modular Monolith Development
## Backlog Items
@@ -50,7 +53,6 @@ The *Next Versions* section above shows the main focus of the planned versions.
The ABP framework is [open source](https://github.com/abpframework/abp) and free for everyone. You can see its [public backlog](https://github.com/abpframework/abp/milestone/2). Here, are some of the important features you can expect from next versions:
-* [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system
* [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](../modules/index.md))
* [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure
* [#58](https://github.com/abpframework/abp/issues/58) / Content localization system (multilingual entities)
@@ -85,12 +87,9 @@ Here, are some of the important planned features for next ABP Studio versions:
* Analyze user solutions to explore entities, domain services, application services, pages and other fundamental objects.
* Swagger authentication support for the built-in browser
* Show related requests/events (traces) together in the solution runner panel
-* Integrate common tool dashboards into ABP Studio (such a Garana, Redis, RabbitMQ, Kibana, etc)
* Built-in command terminal
* Automate all steps of new service creation for microservice solutions
-* Container application type support for Solution Runner (to individually control docker dependencies)
* More options while creating new solutions
-* Downloading samples in ABP studio
* Built-in ABP documentation experience
* Auto-execute terminal commands in markdown files
* Compare changes on the startup templates when a new ABP version is published
diff --git a/docs/en/samples/easy-crm.md b/docs/en/samples/easy-crm.md
index eb959a38c8..7aee565171 100644
--- a/docs/en/samples/easy-crm.md
+++ b/docs/en/samples/easy-crm.md
@@ -30,7 +30,7 @@ When you download and open the zip file, you will see two folders:
### Server Side / MVC (Razor Pages) Application
-* Open the solution (inside the aspnet-core folder) in **Visual Studio 2019** or later (or with another IDE that supports ASP.NET Core).
+* Open the solution (inside the aspnet-core folder) in **Visual Studio 2026** or later (or with another IDE that supports ASP.NET Core).
* This project use `Sqlite`, the default database folder is located at appsettings (`"SqliteDbFolder": "sqliteDbs"`, this folder is located in the MVC project).
* Open the `appsettings.json` file in the `Volo.EasyCrm.Web` application and set `"UseDynamicDatabase": "false"`.
> The MVC project is creating new database for each unique visitor. And the visitor id is stored at cookies. When you set `UseDynamicDatabase` as a `true`, you cannot run Blazor & Angular projects because they have no cookie implementation. Be aware it is set as `false` for running Blazor & Angular applications.
diff --git a/docs/en/samples/microservice-demo.md b/docs/en/samples/microservice-demo.md
index 31516b2a55..c31959f6b0 100644
--- a/docs/en/samples/microservice-demo.md
+++ b/docs/en/samples/microservice-demo.md
@@ -60,7 +60,7 @@ To be able to run the solution from source code, following tools should be insta
### Open & Build the Visual Studio Solution
-* Open the `samples\MicroserviceDemo\MicroserviceDemo.sln` in Visual Studio 2017 (15.9.0+).
+* Open the `samples\MicroserviceDemo\MicroserviceDemo.sln` in Visual Studio 2026 (18.0.0+).
* Run `dotnet restore` from the command line inside the `samples\MicroserviceDemo` folder.
* Build the solution in Visual Studio.
diff --git a/docs/en/solution-templates/layered-web-application/mobile-applications.md b/docs/en/solution-templates/layered-web-application/mobile-applications.md
index 5d3c1385f4..553064284f 100644
--- a/docs/en/solution-templates/layered-web-application/mobile-applications.md
+++ b/docs/en/solution-templates/layered-web-application/mobile-applications.md
@@ -21,7 +21,7 @@
}
```
-> You must have an ABP Team or a higher license to be able to create a mobile application project with ABP Studio.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to be able to create a mobile application project with ABP Studio.
Mobile applications are an essential part of modern software solutions. They provide a user-friendly interface to the end-users and allow them to access the system from anywhere. ABP Studio allows you to create mobile applications for your layered solution. You can create a new mobile application project, configure it, and run it on your device.
diff --git a/docs/en/solution-templates/layered-web-application/web-applications.md b/docs/en/solution-templates/layered-web-application/web-applications.md
index 58cc3af078..8400a6dfbe 100644
--- a/docs/en/solution-templates/layered-web-application/web-applications.md
+++ b/docs/en/solution-templates/layered-web-application/web-applications.md
@@ -120,7 +120,7 @@ The required style files are added to the `styles` array in `angular.json`. `App
You should create your tests in the same folder as the file you want to test.
-See the [testing document](https://angular.io/guide/testing).
+See the [testing document](https://angular.dev/guide/testing).
### Depended Packages
diff --git a/docs/en/solution-templates/microservice/aspire-integration.md b/docs/en/solution-templates/microservice/aspire-integration.md
new file mode 100644
index 0000000000..2da2706b34
--- /dev/null
+++ b/docs/en/solution-templates/microservice/aspire-integration.md
@@ -0,0 +1,372 @@
+```json
+//[doc-seo]
+{
+ "Description": "Learn how to integrate .NET Aspire into your ABP-based solution for streamlined development, orchestration, and observability of distributed applications."
+}
+```
+
+# .NET Aspire Integration
+
+````json
+//[doc-nav]
+{
+ "Next": {
+ "Name": "Miscellaneous guides in the Microservice solution",
+ "Path": "solution-templates/microservice/guides"
+ }
+}
+````
+
+> You must have an ABP Business or a higher license to be able to create a microservice solution.
+
+## .NET Aspire Overview
+
+[Aspire](https://aspire.dev/get-started/what-is-aspire/) streamlines building, running, debugging, and deploying distributed apps. Picture your app as a set of services, databases, and frontends—when they’re deployed, they all work together seamlessly, but every time you develop them they need to be individually started and connected. With Aspire, you get a unified toolchain that eliminates complex configs and makes local debugging effortless. Instantly launch and debug your entire app with a single command. Ready to deploy? Aspire lets you publish anywhere—Kubernetes, the cloud, or your own servers. It’s also fully extensible, so you can integrate your favorite tools and services with ease. It provides:
+
+- **Orchestration**: A code-first approach to defining and running distributed applications, managing dependencies, and launch order.
+- **Integrations**: Pre-built components for common services (databases, caches, message brokers) with automatic configuration.
+- **Tooling**: A developer dashboard for real-time monitoring of logs, traces, metrics, and resource health.
+- **Service Discovery**: Automatic service-to-service communication without hardcoded endpoints.
+- **Observability**: Built-in OpenTelemetry support for distributed tracing, metrics, and structured logging.
+
+## ABP Integration
+
+When you enable .NET Aspire in an ABP microservice solution, you get a fully integrated development experience where:
+
+- All microservices, gateways, and applications are orchestrated through a single entry point (AppHost).
+- Infrastructure containers (databases, Redis, RabbitMQ, Elasticsearch, etc.) are managed as code.
+- OpenTelemetry, health checks, and service discovery are automatically configured for all projects via the shared ServiceDefaults project.
+
+## Enabling Aspire
+
+When creating a new microservice solution via ABP Studio:
+
+1. In the solution creation wizard, look for the **".NET Aspire Integration"** step.
+2. Toggle the option to **enable .NET Aspire**.
+3. Complete the wizard—Aspire projects will be generated along with your solution.
+
+
+
+## Solution Structure Changes
+
+When Aspire is enabled, two additional projects are added to your solution:
+
+
+
+### AppHost (Orchestrator)
+
+[`AppHost`](https://aspire.dev/get-started/app-host/) is the .NET Aspire orchestrator project that declares all resources (services, databases, containers, applications) and their dependencies in C# code. All services, gateways, and applications in the solution have their project references added to `AppHost`.
+
+**Why is it added?**
+
+- Centralized orchestration: Start your entire microservice ecosystem with a single command.
+- Code-first infrastructure: Databases, Redis, RabbitMQ, Elasticsearch, and observability tools are defined programmatically.
+- Dependency management: `AppHost` ensures services start in the correct order using `WaitFor()` declarations.
+- Automatic configuration: Connection strings, endpoints, and environment variables are injected automatically.
+
+**Key files in AppHost:**
+| File | Purpose |
+|--------|------------|
+| `AppHost.cs` | Entry point—creates the distributed application builder and adds all resources |
+| `AppHostExtensions.cs` | Extension methods for adding infrastructures, databases, microservices, gateways, and applications |
+
+**What it manages:**
+
+- Database servers (SQL Server, PostgreSQL, MySQL, or MongoDB)
+- Per-service databases
+- Redis (caching)
+- RabbitMQ (messaging)
+- Elasticsearch + Kibana (logging)
+- Prometheus + Grafana (metrics)
+- Jaeger (tracing)
+- OpenTelemetry Collector
+- All microservices, gateways, and web applications
+
+
+
+### ServiceDefaults
+
+[`ServiceDefaults`](https://aspire.dev/fundamentals/service-defaults/) is a shared library that provides common cloud-native configuration for all projects in the solution. The `ServiceDefaults` project reference is added to all services, gateways, and applications in the solution.
+
+**Why is it added?**
+
+- Consistency: Every service uses the same observability, health check, and resilience patterns.
+- Less boilerplate: Add `builder.AddServiceDefaults()` once, get all defaults automatically.
+- Production-ready: OpenTelemetry, health endpoints, and HTTP resilience are preconfigured.
+
+**What it provides:**
+
+| Feature | Description |
+|---------|-------------|
+| OpenTelemetry | Tracing, metrics, and structured logging with automatic instrumentation |
+| Health Checks | `/health` and `/alive` endpoints for Kubernetes-style probes |
+| Service Discovery | Automatic resolution of service endpoints |
+| HTTP Resilience | Retry policies, timeouts, and circuit breakers for HTTP clients |
+
+**Usage example:**
+
+```csharp
+var builder = WebApplication.CreateBuilder(args);
+builder.AddServiceDefaults(); // Adds all cloud-native defaults
+// ... rest of configuration
+```
+
+## Running the Solution
+
+### Without Aspire
+
+1. Open **Solution Runner** in ABP Studio.
+2. Start all resources in Solution Runner (services, gateways, applications, and tools such as databases, Redis, RabbitMQ, etc.) individually or collectively using the `Default` profile.
+
+
+
+### With Aspire
+1. Open **Solution Runner** in ABP Studio.
+2. Select the **Aspire** profile.
+3. Run `MyCompanyName.MyProjectName.AppHost`.
+4. AppHost automatically:
+ - Starts all infrastructure containers (database, Redis, RabbitMQ, Elasticsearch, etc.).
+ - Launches all microservices, gateways, and applications in dependency order.
+ - Injects connection strings and environment variables.
+ - Opens the Aspire Dashboard for monitoring.
+
+
+
+## Aspire Dashboard
+
+The dashboard enables real-time tracking of key aspects of your app, including logs, traces, and environment configurations. It's designed to enhance the development experience by providing a clear and insightful view of your app's state and structure.
+
+Key features of the dashboard include:
+
+- Real-time tracking of logs, traces, and environment configurations.
+- User interface to stop, start, and restart resources.
+- Collects and displays logs and telemetry; view structured logs, traces, and metrics in an intuitive UI.
+- Enhanced debugging with GitHub Copilot, your AI-powered assistant built into the dashboard.
+
+### Opening the Dashboard
+
+When AppHost starts, the Aspire Dashboard opens automatically in ABP Studio's built-in browser at `https://localhost:15105`. Alternatively, you can right-click on AppHost in Solution Runner and select **Browse** to open it manually.
+
+
+
+**Dashboard login token**: `1q2w3E*` (default, configurable via launch settings)
+
+### Dashboard Features
+
+The dashboard includes several tabs, each offering different insights into your application:
+
+#### Resources
+
+View the status of all resources in your application, including projects, containers, and executables. Monitor health checks, view environment variables, and access endpoints for each resource.
+
+
+
+#### Console
+
+Display console logs from all resources in real-time. Filter by resource and log level to quickly find relevant information during development and debugging.
+
+
+
+#### Structured Logs
+
+View structured logs from all resources with advanced filtering capabilities. Search and filter logs by resource, log level, timestamp, and custom properties to diagnose issues efficiently.
+
+
+
+#### Traces
+
+Explore distributed traces across your microservices to understand request flows and identify performance bottlenecks. Visualize how requests propagate through different services and examine timing information.
+
+
+
+#### Metrics
+
+Monitor real-time metrics including HTTP requests, response times, garbage collection, memory usage, and custom metrics. Visualize metric trends with interactive charts to understand application performance.
+
+
+
+## Tools and Their Management UIs
+
+AppHost pre-configures the following observability and tools. The URLs below are for their **management/dashboard interfaces** (these tools may expose additional internal endpoints for service communication).
+
+All URLs and configurations are defined in the `AppHost` project. If you need to change ports or other settings, you can modify them in the `AppHost` project.
+
+After running AppHost, you can access these tools either by opening the URLs directly in your browser or via Solution Runner **Tools** tab.
+
+### Database Management System Admin Tool
+
+The database management admin tool varies by database type:
+
+| Database | Tool | URL |
+|----------|------|-----|
+| SQL Server | DBeaver CloudBeaver | `http://localhost:8081` |
+| MySQL | phpMyAdmin | `http://localhost:8082` |
+| PostgreSQL | pgAdmin | `http://localhost:8083` |
+| MongoDB | Mongo Express | `http://localhost:8084` |
+
+For example, if using PostgreSQL, access **pgAdmin** at `http://localhost:8083` or via Solution Runner Tools tab:
+
+
+
+
+### Grafana
+
+**URL**: `http://localhost:3001`
+**Credentials**: `admin` / `admin`
+
+Grafana is a visualization and analytics platform for monitoring metrics. It provides interactive dashboards with charts and graphs for tracking application performance.
+
+
+
+### Jaeger
+
+**URL**: `http://localhost:16686`
+**Credentials**: No authentication required
+
+Jaeger is a distributed tracing system to monitor and troubleshoot problems on interconnected software components called microservices.
+
+
+
+### Kibana
+
+**URL**: `http://localhost:5601`
+**Credentials**: No authentication required
+
+Kibana is a visualization tool for Elasticsearch data. It provides search and data visualization capabilities for logs stored in Elasticsearch.
+
+
+
+### Prometheus
+
+**URL**: `http://localhost:9090`
+**Credentials**: No authentication required
+
+Prometheus is a monitoring and alerting toolkit. It collects and stores metrics as time series data, allowing you to query and analyze application performance.
+
+
+
+### RabbitMQ Management
+
+**URL**: `http://localhost:15672`
+**Credentials**: `guest` / `guest`
+
+RabbitMQ Management UI provides a web-based interface for managing and monitoring RabbitMQ message broker, including queues, exchanges, and message flows.
+
+
+
+### Redis Insight
+
+**URL**: `http://localhost:5540`
+**Credentials**: No authentication required
+
+Redis Insight is a visual tool for Redis that allows you to browse data, run commands, and monitor Redis performance.
+
+
+
+## Adding New Services, Gateways, or Applications
+
+When you add a new microservice, gateway, or application via **ABP Studio**:
+
+1. `AppHost` is updated automatically - the new project is registered as a resource with appropriate configurations.
+2. `ServiceDefaults` is referenced - the new project gets cloud-native defaults.
+
+> You don't need to manually edit `AppHost` in most cases.
+
+## Adding a Resource Manually
+
+If you need to add a resource manually (not via **ABP Studio**), follow these steps:
+
+### 1. Reference ServiceDefaults in your new project
+
+```xml
+
+```
+
+> Adjust the path as necessary based on your solution structure.
+
+### 2. Add ServiceDefaults in Program.cs
+
+```csharp
+var builder = WebApplication.CreateBuilder(args);
+builder.AddServiceDefaults();
+// ... your configuration
+```
+
+### 3. Add Project Reference to AppHost
+
+Add a reference to your resource project in `MySolutionName.MyProjectName.AppHost/MySolutionName.MyProjectName.AppHost.csproj`:
+
+```xml
+
+```
+
+### 4. Register Resource in AppHost
+
+Edit `AppHostExtensions.cs` and add your resource in the `AddAdditionalResources` method:
+
+```csharp
+var myResource = builder
+ .AddProject("myresource", "MySolutionName.MyProjectName.MyResource")
+ .WaitFor(databases.AdministrationDb)
+ .WaitFor(databases.IdentityDb)
+ .WaitFor(databases.MyResourceDb)
+ .WaitFor(databases.AuditLoggingDb)
+ .WaitFor(databases.SaasDb)
+ .WaitFor(databases.LanguageManagementDb)
+ .WaitFor(redis)
+ .WaitFor(rabbitMq)
+ .WithReference(databases.AdministrationDb)
+ .WithReference(databases.IdentityDb)
+ .WithReference(databases.BlobStoringDb)
+ .WithReference(databases.MyResourceDb)
+ .WithReference(databases.AuditLoggingDb)
+ .WithReference(databases.SaasDb)
+ .WithReference(databases.LanguageManagementDb)
+ .ConfigureRabbitMq(rabbitMq, infrastructureDefaultUser, infrastructureDefaultUserPassword)
+ .ConfigureRedis(redis)
+ .ConfigureElasticSearch(elasticsearch);
+applicationResources["MyResource"] = myResource;
+```
+> Adjust the dependencies and configurations as necessary.
+
+### 5. Configure Gateway (if needed)
+
+If your resource should be accessible through a gateway, add the gateway configuration in the `AddAdditionalResources` method:
+
+```csharp
+var webgateway = applicationResources.FirstOrDefault(x => x.Key == "WebGateway").Value;
+if (webgateway != null)
+{
+ webgateway
+ .WaitFor(applicationResources["MyResource"])
+ .WithReference(applicationResources["MyResource"])
+ .WithEnvironment("ReverseProxy__Clusters__MyResource__Destinations__MyResource__Address", "http://MyResource");
+}
+```
+
+### 6. Configure Authentication Server (if needed)
+
+If your resource needs to be added to `CORS` and `RedirectAllowedUrls` configuration for the authentication server, update the `allowedUrls` variable in the `ConfigureAuthServer` method:
+
+```csharp
+var allowedUrls = ReferenceExpression.Create($"{applicationResources["MyResource"].GetEndpoint("http")},...");
+```
+
+### 7. Add Database (if needed)
+
+If your resource requires a dedicated database, add it in the `AddDatabases` method:
+
+```csharp
+var myResourceDb = databaseServers.Postgres.AddDatabase("MyResource", "MySolutionName.MyProjectName_MyResource");
+```
+> Adjust the database management system as necessary.
+
+### 8. Add to Solution Runner Profiles (optional)
+
+To run your resource in **Solution Runner** profiles(Default or Aspire), add it following the instructions in the [Studio running applications documentation](../../studio/running-applications.md#add).
+
+## Deploying the Application
+
+.NET Aspire supports deployment to Azure Container Apps, Kubernetes, and other cloud platforms. For detailed deployment guidance, see the official documentation: [.NET Aspire Deployment](https://aspire.dev/deployment/overview/)
+
+To learn more about .NET Aspire, visit: https://aspire.dev/get-started/what-is-aspire/
diff --git a/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md b/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md
index 46da70e88c..041ac00712 100644
--- a/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md
+++ b/docs/en/solution-templates/microservice/helm-charts-and-kubernetes.md
@@ -11,8 +11,8 @@
//[doc-nav]
{
"Next": {
- "Name": "Miscellaneous guides in the Microservice solution",
- "Path": "solution-templates/microservice/guides"
+ "Name": "Aspire Integration in the Microservice solution",
+ "Path": "solution-templates/microservice/aspire-integration"
}
}
````
diff --git a/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png b/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png
new file mode 100644
index 0000000000..ae571b64e7
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-apphost-topology.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-configuration.png b/docs/en/solution-templates/microservice/images/aspire-configuration.png
new file mode 100644
index 0000000000..74cd5066bb
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-configuration.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png
new file mode 100644
index 0000000000..8d9d088511
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-console.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png
new file mode 100644
index 0000000000..a3c6ead56b
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-login.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png
new file mode 100644
index 0000000000..b49ea441b4
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-metrics.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png
new file mode 100644
index 0000000000..ea8c3bf017
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-resources.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png
new file mode 100644
index 0000000000..2e732f462b
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-structured-logs.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png b/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png
new file mode 100644
index 0000000000..d099f8659a
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-dashboard-traces.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png b/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png
new file mode 100644
index 0000000000..de857c876d
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-database-postgre-pgadmin.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png
new file mode 100644
index 0000000000..42072e3337
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-grafana-dashboard.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png b/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png
new file mode 100644
index 0000000000..da6b87412c
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-jaeger-traces.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png
new file mode 100644
index 0000000000..7a31ff4fac
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-kibana-dashboard.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png b/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png
new file mode 100644
index 0000000000..c1f4de5b5c
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-prometheus-dashboard.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png b/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png
new file mode 100644
index 0000000000..77438c9b08
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-rabbitmq-management.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-redis-insight.png b/docs/en/solution-templates/microservice/images/aspire-redis-insight.png
new file mode 100644
index 0000000000..37780b38b0
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-redis-insight.png differ
diff --git a/docs/en/solution-templates/microservice/images/aspire-solution-structure.png b/docs/en/solution-templates/microservice/images/aspire-solution-structure.png
new file mode 100644
index 0000000000..3379892b69
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/aspire-solution-structure.png differ
diff --git a/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png b/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png
new file mode 100644
index 0000000000..d11edfe584
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/solution-runner-aspire-profile.png differ
diff --git a/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png b/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png
new file mode 100644
index 0000000000..6867a43872
Binary files /dev/null and b/docs/en/solution-templates/microservice/images/solution-runner-default-profile.png differ
diff --git a/docs/en/studio/installation.md b/docs/en/studio/installation.md
index 1b1ba2cf04..2e1d061920 100644
--- a/docs/en/studio/installation.md
+++ b/docs/en/studio/installation.md
@@ -11,7 +11,7 @@ This document explains how to install the ABP Studio tool.
## Pre-requirements
-ABP Studio automatically instals most of the required dependencies. When you first launch the application, it will check for and install the following components if missed:
+ABP Studio automatically installs most of the required dependencies. When you first launch the application, it will check for and install the following components if missed:
* .NET SDK
* Node.js
@@ -19,7 +19,7 @@ ABP Studio automatically instals most of the required dependencies. When you fir
* mkcert (for HTTPS development)
* WireGuard (for Kubernetes operations)
-However, the followings should be manually installed:
+However, the following should be manually installed:
### Docker (Required for Kubernetes Operations)
@@ -55,7 +55,7 @@ ABP Studio allows you to customize the user interface theme according to your pr
## Upgrading
ABP Studio periodically checks for updates in the background, and when a new version of ABP Studio is available, you will be notified through a modal.
-The modal will prompt you to update to the latest version as below:
+The modal will prompt you to update to the latest version as follows:

@@ -65,3 +65,7 @@ When you see the "New Version Available" window, follow these steps to upgrade A
2. A progress indicator will display the download status.
3. Once the download is complete, a new modal will appear with the "Install and Relaunch" buttons.
4. Click on the "Install and Relaunch" button to complete the installation process.
+
+## Installing a Specific Version
+
+There is no official support for installing an older version of ABP Studio yet. But, if you want to install an older version of ABP Studio, you can use approach explanined here [https://github.com/enisn/AbpDevTools?tab=readme-ov-file#switch-abp-studio-version](https://github.com/enisn/AbpDevTools?tab=readme-ov-file#switch-abp-studio-version)
\ No newline at end of file
diff --git a/docs/en/studio/release-notes.md b/docs/en/studio/release-notes.md
index b0627a887e..d2eba88e0f 100644
--- a/docs/en/studio/release-notes.md
+++ b/docs/en/studio/release-notes.md
@@ -9,6 +9,112 @@
This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version.
+## 2.1.3 (2025-12-15) Latest
+
+* Updated `createCommand` and CLI help for multi-tenancy.
+* Fixed `BookController` templating problem.
+
+## 2.1.2 (2025-12-11)
+
+* Fixed `SLNX` files in templates for macOS.
+* Fixed `DbMigrator` problem on nolayers template.
+
+## 2.1.1 (2025-12-11)
+
+* Fixed duplicate workspace seeding issue.
+* Fixed books sample problems when solution is tiered.
+* Added AI Management module to `abpmdl` file.
+* Improved skip running initial tasks text.
+* Fixed unit test failures.
+* Added `LanguageManagementDbContext` table creation in tests.
+* Removed `ConfigureHttpClientProxies` method.
+* Fixed issue with adding new services to existing Microservices.
+* Fixed AI Management template issues.
+* Reverted browser notification overlay fix.
+
+## 2.1.0 (2025-12-08)
+
+* Enhanced Module Installation UI with improved user experience.
+* Added `AI Management` option to Startup Templates (app-nolayers, app).
+* Added support for new `SLNX` solution file format.
+* Enhanced modularity step in solution creation process.
+* Fixed Swagger authorization issues when projects run via .NET Aspire.
+* Fixed browser notification overlay problems.
+* Added missing `Unit of Work` namespace in solution templates.
+* Fixed JSON file formatting issues.
+* Updated ABP Framework to `10.0.1` and LeptonX to `5.0.1`.
+* Added MySQL compatibility warnings.
+* Fixed initial tasks problems.
+* Improved AI Assistant control UI with better margins and borders.
+
+## 2.0.2 (2025-11-26)
+
+* Fixed `.NET 10` installation problems.
+* Added custom styles for code blocks in **Markdown** view.
+* Fixed `OpenIddictCoreOptions` injection to use `IOptions`.
+* Added IdentityModel package after KubernetesClient.
+
+## 2.0.1 (2025-11-21)
+
+* Added build step before adding EF Core migration.
+* Updated `KubernetesClient` to version `18.0.5`.
+
+## 2.0.0 (2025-11-20)
+
+* Major upgrade to `.NET 10.0` and `ABP Framework 10.0`
+* Replaced `IdentityModel` with `Duende.IdentityModel`.
+* Added "Open on Start in Browser" option for .NET applications in Solution Runner.
+* Added `Mapperly` configuration.
+* Enabled user and tenant impersonation in Blazor client modules.
+* Enhanced notification system to allow text copying.
+* Added environment variable support for DesignTime DbContext.
+* Used C# instead of JSON for Aspire AppHost project configuration.
+* Fixed MongoDB image pulling problems.
+* Improved AI Assistant with better code block visibility across themes.
+* Added different cache paths for each browser instance.
+* Fixed various UI issues including mouse pointer problems in trees and horizontal scrolling.
+* Added `FileManagement` download URL configuration for tiered projects.
+* Added chat SignalR configuration to Microservice Blazor apps.
+* Updated `Blazorise` packages to version `1.8.6`.
+* Fixed `BackToImpersonator` button in Microservice Template.
+* Added log recording while crashing for better debugging.
+* Enhanced tab headers for **Solution Runner** and **Kubernetes**.
+
+## 1.4.2 (2025-10-30)
+
+* Upgraded template dependencies for ABP Framework and LeptonX. (targeting ABP `9.3.6`)
+* AI Assistant is now enabled for all customers.
+* Fixed CLI default language problem during solution creation.
+* Improved task auto-start logic and notification handling.
+* Fixed Angular localization function inputs.
+* Set default mobile frameworks to **None** in the UI.
+* Disallowed dots (.) in module names of microservice sub-templates.
+* Solution Runner: show vertical scrollbar when needed and disable the Properties window while the app is running.
+
+## 1.4.1 (2025-10-16)
+
+* Fixed AI Assistant chat problems.
+* Added custom steps if built with CLI.
+* Fixed Release configuration builds.
+
+## 1.4.0 (2025-10-15)
+
+* The **Task Panel** has been introduced, providing a centralized place to manage and monitor background operations.
+* Added **CLI application properties** window, making it easier to configure and manage command-line tool settings directly within the Studio UI.
+* Added suggestion modal for building after creating service/web/gateway module.
+* Fixed mismatching hosts file record namespace problem.
+* Allow selecting `Default Profile` in Solution Runner.
+* Refactored Angular scripts.
+* Fixed: tools not browsable in Solution Runner with Aspire after Kubernetes deployment.
+
+## 1.3.3 (2025-10-06)
+
+* Upgraded template dependencies for ABP Framework and LeptonX. (targeting ABP `9.3.5`)
+* Fixed welcome page tutorial links.
+* Improved error handling during Helm chart installation and custom command execution.
+* Fixed microservice problems.
+* Fixed connection string problems.
+
## 1.3.2 (2025-09-25)
* Enhanced AI Assistant with bug fixes and improvements.
diff --git a/docs/en/studio/version-mapping.md b/docs/en/studio/version-mapping.md
index 6bd879f2ab..f399c97390 100644
--- a/docs/en/studio/version-mapping.md
+++ b/docs/en/studio/version-mapping.md
@@ -11,14 +11,17 @@ This document provides a general overview of the relationship between various ve
| **ABP Studio Version** | **ABP Version of Startup Template** |
|------------------------|---------------------------|
+| 2.1.0 - 2.1.3 | 10.0.1 |
+| 2.0.0 to 2.0.2 | 10.0.0 |
+| 1.4.2 | 9.3.6 |
+| 1.3.3 to 1.4.1 | 9.3.5 |
| 1.3.0 - 1.3.2 | 9.3.4 |
| 1.2.2 | 9.3.2 |
| 1.2.1 | 9.3.1 |
| 1.1.2 | 9.2.3 |
| 1.1.0 - 1.1.1 | 9.2.2 |
| 1.0.2 | 9.2.1 |
-| 1.0.1 | 9.2.0 |
-| 1.0.0 | 9.2.0 |
+| 1.0.0 - 1.0.1 | 9.2.0 |
| 0.9.26 | 9.1.1 |
| 0.9.24 - 0.9.25 | 9.1.0 |
| 0.9.22 - 0.9.23 | 9.0.4 |
diff --git a/docs/en/suite/editing-templates.md b/docs/en/suite/editing-templates.md
index 9c859ba0de..354adc8ead 100644
--- a/docs/en/suite/editing-templates.md
+++ b/docs/en/suite/editing-templates.md
@@ -27,7 +27,7 @@ There's a search box on the templates page. To find the related template, pick a
There's a naming convention for the template files.
* If the template name has `Server` prefix, it's used for backend code like repositories, application services, localizations, controllers, permissions, mappings, unit tests.
-* If the template name has `Frontend.Angular` prefix, it's used for Angular code generation. The Angular code is being generated via [Angular Schematics](https://angular.io/guide/schematics).
+* If the template name has `Frontend.Angular` prefix, it's used for Angular code generation. The Angular code is being generated via [Angular Schematics](https://angular.dev/tools/cli/schematics).
* If the template name has `Frontend.Mvc` prefix, it's used for razor pages, menus, JavaScript, CSS files.
* If the template name has `Frontend.Blazor` prefix, it's used for razor components.
diff --git a/docs/en/suite/generating-crud-page.md b/docs/en/suite/generating-crud-page.md
index cc9df3ee32..afc2536709 100644
--- a/docs/en/suite/generating-crud-page.md
+++ b/docs/en/suite/generating-crud-page.md
@@ -294,7 +294,7 @@ There are some adjustments you may need to make before generating CRUD pages for
- Check if your environment variables have `rootNamespace` defined as explained [here](../framework/ui/angular/service-proxies.md#angular-project-configuration).
-- Check if your [workspace configuration](https://angular.io/guide/workspace-config) satisfies one of the following. Examples assume your solution namespace is `BookStore`, `Acme.BookStore`, or `Acme.Retail.BookStore`.
+- Check if your [workspace configuration](https://angular.dev/reference/configs/workspace-config) satisfies one of the following. Examples assume your solution namespace is `BookStore`, `Acme.BookStore`, or `Acme.Retail.BookStore`.
- Project key is in pascal case. E.g. `BookStore`.
- Project key is in camel case. E.g. `bookStore`.
- Project key is in kebab case. E.g. `book-store`.
diff --git a/docs/en/suite/index.md b/docs/en/suite/index.md
index 20005ecb21..b1c8d43fa7 100644
--- a/docs/en/suite/index.md
+++ b/docs/en/suite/index.md
@@ -17,7 +17,7 @@
}
````
-> You must have an ABP Team or a higher license to use the ABP Suite.
+> You must have an [ABP Team or a higher license](https://abp.io/pricing) to use the ABP Suite.
ABP Suite is a complementary tool to the ABP Platform. ABP Suite allows you to build web pages in a matter of minutes.
diff --git a/docs/en/suite/solution-structure.md b/docs/en/suite/solution-structure.md
index d36ea35e7f..4b15be2f07 100644
--- a/docs/en/suite/solution-structure.md
+++ b/docs/en/suite/solution-structure.md
@@ -303,7 +303,7 @@ Lepton theme uses two logos for each style. You can change these logos with your
You should create your tests in the same folder as the file file you want to test.
-See the [testing document](https://angular.io/guide/testing).
+See the [testing document](https://angular.dev/guide/testing).
### Depended Packages
diff --git a/docs/en/testing/integration-tests.md b/docs/en/testing/integration-tests.md
index dce7813e45..c87d270747 100644
--- a/docs/en/testing/integration-tests.md
+++ b/docs/en/testing/integration-tests.md
@@ -350,7 +350,7 @@ There are multiple overloads of the `WithUnitOfWorkAsync` method that you can us
## Working with DbContext
-In some cases, you may want to directory work with the [Entity Framework's `DbContext` object](https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext) to perform database operations in your test methods. In this case, you can use `IDbContextProvider`service to obtain a `DbContext` instance inside a unit of work.
+In some cases, you may want to directly work with the [Entity Framework's `DbContext` object](https://learn.microsoft.com/en-us/dotnet/api/system.data.entity.dbcontext) to perform database operations in your test methods. In this case, you can use `IDbContextProvider`service to obtain a `DbContext` instance inside a unit of work.
The following example shows how you can create a `DbContext` object in a test method:
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png
index adebe653b5..94dfb63a56 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-opening.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects-mongo.png b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects-mongo.png
index a0ecbd469d..e3032dfbde 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects-mongo.png and b/docs/en/tutorials/book-store-with-abp-suite/images/abp-suite-solution-test-projects-mongo.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-angular.png b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-angular.png
index 687dca3593..5c4a377b4a 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-angular.png and b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-angular.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-blazor.png b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-blazor.png
index 5535659b45..e690e9b0e9 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-blazor.png and b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-blazor.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mauiblazor.png b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mauiblazor.png
index 1bf3253fe7..961e7565a7 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mauiblazor.png and b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mauiblazor.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mvc.png b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mvc.png
index 54860a5e9f..7a2850afc2 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mvc.png and b/docs/en/tutorials/book-store-with-abp-suite/images/book-store-studio-run-app-mvc.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png
index 47a37bbd9b..bf1394a0a2 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png and b/docs/en/tutorials/book-store-with-abp-suite/images/studio-browser-suite.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png
index dbb1890c14..b1e4a7d06e 100644
Binary files a/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png and b/docs/en/tutorials/book-store-with-abp-suite/images/suite-book-entity-1.png differ
diff --git a/docs/en/tutorials/book-store-with-abp-suite/index.md b/docs/en/tutorials/book-store-with-abp-suite/index.md
index 9a2f9372b7..204380bdf0 100644
--- a/docs/en/tutorials/book-store-with-abp-suite/index.md
+++ b/docs/en/tutorials/book-store-with-abp-suite/index.md
@@ -46,4 +46,4 @@ This tutorial is organized as the following parts:
### Download the Source Code
-After logging in to the ABP website, you can download the source code from [here](https://abp.io/api/download/samples/suite-bookstore-mvc-ef).
\ No newline at end of file
+After logging in to the ABP website, you can download the source code from [here](https://abp.io/api/download/samples/bookstore-mvc-ef).
diff --git a/docs/en/tutorials/book-store-with-abp-suite/part-02.md b/docs/en/tutorials/book-store-with-abp-suite/part-02.md
index 11725201cb..f9462b9130 100644
--- a/docs/en/tutorials/book-store-with-abp-suite/part-02.md
+++ b/docs/en/tutorials/book-store-with-abp-suite/part-02.md
@@ -96,7 +96,7 @@ Here is the all details for the `Book` entity:
* `Name` is **required**, it's a **string** property and maximum length is **128**.
* `Type` is an **enum** and the enum file path is *\Acme.BookStore.Domain.Shared\Books\BookType.cs*.
* `PublishDate` is a **DateTime** property and **not nullable**.
-* `Price` is a **float** property and **required**.
+* `Price` is a **float** property.
You can leave the other configurations as default.
diff --git a/docs/en/tutorials/book-store/part-02.md b/docs/en/tutorials/book-store/part-02.md
index 750808fe4d..1fe21c2848 100644
--- a/docs/en/tutorials/book-store/part-02.md
+++ b/docs/en/tutorials/book-store/part-02.md
@@ -315,7 +315,7 @@ This is a fully working, server side paged, sorted and localized table of books.
## Install NPM packages
-> Notice: This tutorial is based on the ABP v3.1.0+ If your project version is older, then please upgrade your solution. Check the [migration guide](../../framework/ui/angular/migration-guide-v3.md) if you are upgrading an existing project with v2.x.
+> Notice: This tutorial is based on the ABP v9.3.0+ If your project version is older, then please upgrade your solution. Check the [migration guide](../../framework/ui/angular/migration-guide-v3.md) if you are upgrading an existing project with v2.x.
If you haven't done it before, open a new command line interface (terminal window) and go to your `angular` folder and then run the `yarn` command to install the NPM packages:
@@ -330,69 +330,42 @@ It's time to create something visible and usable! There are some tools that we w
- [Ng Bootstrap](https://ng-bootstrap.github.io/#/home) will be used as the UI component library.
- [Ngx-Datatable](https://swimlane.gitbook.io/ngx-datatable/) will be used as the datatable library.
-Run the following command line to create a new module, named `BookModule` in the root folder of the angular application:
+Run the following command line to create a new component, named `BookComponent` in the root folder of the angular application:
```bash
-yarn ng generate module book --module app --routing --route books
+yarn ng generate component book
```
This command should produce the following output:
````bash
-> yarn ng generate module book --module app --routing --route books
-
-yarn run v1.19.1
-$ ng generate module book --module app --routing --route books
-CREATE src/app/book/book-routing.module.ts (336 bytes)
-CREATE src/app/book/book.module.ts (335 bytes)
-CREATE src/app/book/book.component.html (19 bytes)
-CREATE src/app/book/book.component.spec.ts (614 bytes)
-CREATE src/app/book/book.component.ts (268 bytes)
+> yarn ng generate component book
+
+yarn run v1.22.22
+$ ng generate component book
+CREATE src/app/book/book.component.spec.ts (537 bytes)
+CREATE src/app/book/book.component.ts (189 bytes)
CREATE src/app/book/book.component.scss (0 bytes)
-UPDATE src/app/app-routing.module.ts (1289 bytes)
+CREATE src/app/book/book.component.html (20 bytes)
Done in 3.88s.
````
-### BookModule
-
-Open the `/src/app/book/book.module.ts` and replace the content as shown below:
-
-````js
-import { NgModule } from '@angular/core';
-import { SharedModule } from '../shared/shared.module';
-import { BookRoutingModule } from './book-routing.module';
-import { BookComponent } from './book.component';
-
-@NgModule({
- declarations: [BookComponent],
- imports: [
- BookRoutingModule,
- SharedModule
- ]
-})
-export class BookModule { }
-
-````
-
-* Added the `SharedModule`. `SharedModule` exports some common modules needed to create user interfaces.
-* `SharedModule` already exports the `CommonModule`, so we've removed the `CommonModule`.
-
### Routing
-The generated code places the new route definition to the `src/app/app-routing.module.ts` file as shown below:
+The generated code places the new route definition to the `src/app/app.routes.ts` file as shown below:
````js
-const routes: Routes = [
+export const routes: Routes = [
// other route definitions...
- { path: 'books', loadChildren: () => import('./book/book.module').then(m => m.BookModule) },
+ { path : 'books', loadComponent: () => import('./book/book.component').then(c => c.BookComponent) },
];
````
Now, open the `src/app/route.provider.ts` file and replace the `configureRoutes` function declaration as shown below:
```js
-function configureRoutes(routes: RoutesService) {
- return () => {
+function configureRoutes() {
+ const routes = inject(RoutesService);
routes.add([
{
path: '/',
@@ -416,7 +389,6 @@ function configureRoutes(routes: RoutesService) {
},
]);
};
-}
```
`RoutesService` is a service provided by the ABP to configure the main menu and the routes.
@@ -497,7 +469,7 @@ Open the `/src/app/book/book.component.html` and replace the content as shown be