diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml
index cf133debab..f916789293 100644
--- a/.github/workflows/auto-pr.yml
+++ b/.github/workflows/auto-pr.yml
@@ -1,13 +1,13 @@
-name: Merge branch rel-10.0 with rel-9.3
+name: Merge branch dev with rel-10.0
on:
push:
branches:
- - rel-9.3
+ - rel-10.0
permissions:
contents: read
jobs:
- merge-rel-10-0-with-rel-9-3:
+ merge-dev-with-rel-10-0:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@@ -15,17 +15,17 @@ jobs:
steps:
- uses: actions/checkout@v2
with:
- ref: rel-10.0
+ ref: dev
- name: Reset promotion branch
run: |
- git fetch origin rel-9.3:rel-9.3
- git reset --hard rel-9.3
+ git fetch origin rel-10.0:rel-10.0
+ git reset --hard rel-10.0
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
- branch: auto-merge/rel-9-3/${{github.run_number}}
- title: Merge branch rel-10.0 with rel-9.3
- body: This PR generated automatically to merge rel-10.0 with rel-9.3. Please review the changed files before merging to prevent any errors that may occur.
+ branch: auto-merge/rel-10-0/${{github.run_number}}
+ title: Merge branch dev with rel-10.0
+ body: This PR generated automatically to merge dev with rel-10.0. Please review the changed files before merging to prevent any errors that may occur.
reviewers: maliming
draft: true
token: ${{ github.token }}
@@ -34,5 +34,5 @@ jobs:
GH_TOKEN: ${{ secrets.BOT_SECRET }}
run: |
gh pr ready
- gh pr review auto-merge/rel-9-3/${{github.run_number}} --approve
- gh pr merge auto-merge/rel-9-3/${{github.run_number}} --merge --auto --delete-branch
+ gh pr review auto-merge/rel-10-0/${{github.run_number}} --approve
+ gh pr merge auto-merge/rel-10-0/${{github.run_number}} --merge --auto --delete-branch
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index b31eff690a..86df2d8748 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -58,7 +58,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-dotnet@master
with:
- dotnet-version: 9.0.100
+ dotnet-version: 10.0.x
- name: Build All
run: ./build-all.ps1
working-directory: ./build
diff --git a/Directory.Build.props b/Directory.Build.props
index f601750180..2e45c55d44 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -5,8 +5,9 @@
- all
- runtime; build; native; contentfiles; analyzers
+ 6.0.4
+ all
+ runtime; build; native; contentfiles; analyzers
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 6642d4eb7f..132138d1ba 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -1,190 +1,194 @@
true
+ true
-
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
+
+
-
+
-
-
-
+
+
+
-
+
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
\ No newline at end of file
+
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization.sln b/abp_io/AbpIoLocalization/AbpIoLocalization.sln
deleted file mode 100644
index 87b9fecdd5..0000000000
--- a/abp_io/AbpIoLocalization/AbpIoLocalization.sln
+++ /dev/null
@@ -1,25 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29009.5
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AbpIoLocalization", "AbpIoLocalization\AbpIoLocalization.csproj", "{35D94BAB-22DF-47E0-AB4A-99CB6495CF50}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {35D94BAB-22DF-47E0-AB4A-99CB6495CF50}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {2CF52C6D-D914-44A3-8F02-7E7BEA0644C5}
- EndGlobalSection
-EndGlobal
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization.slnx b/abp_io/AbpIoLocalization/AbpIoLocalization.slnx
new file mode 100644
index 0000000000..6301168950
--- /dev/null
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization.slnx
@@ -0,0 +1,3 @@
+
+
+
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj
index 6e7bbc184e..a1c99ce4aa 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/AbpIoLocalization.csproj
@@ -1,7 +1,7 @@
- netstandard2.0;netstandard2.1;net8.0;net9.0
+ netstandard2.0;netstandard2.1;net8.0;net9.0;net10.0
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
index eebf13731a..4f19fd9299 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
@@ -721,6 +721,61 @@
"NuGetApiKey": "NuGet API key",
"QuestionCount": "Question Count",
"MakeAnnouncement": "Make Announcement",
- "MakeAnnouncementInfo": "Check it if you want to make an announcement for this post"
+ "MakeAnnouncementInfo": "Check it if you want to make an announcement for this post",
+ "Permission:ViewCounts": "View counts",
+ "ReadCount": "Read Count",
+ "Menu:Solution": "Solution",
+ "Enum:LicenseType:1": "Personal",
+ "Enum:LicenseType:2": "Team",
+ "Enum:LicenseType:3": "Business",
+ "Enum:LicenseType:4": "Enterprise",
+ "Enum:SolutionTemplate:0": "Unknown",
+ "Enum:SolutionTemplate:1": "App No Layers",
+ "Enum:SolutionTemplate:2": "App Layered",
+ "Enum:SolutionTemplate:3": "Microservice",
+ "Enum:UiFramework:0": "Unknown",
+ "Enum:UiFramework:1": "None",
+ "Enum:UiFramework:2": "MVC Razor Pages",
+ "Enum:UiFramework:3": "Angular",
+ "Enum:UiFramework:4": "Blazor WASM",
+ "Enum:UiFramework:5": "Blazor Server",
+ "Enum:UiFramework:6": "Blazor WebApp",
+ "Enum:UiFramework:7": "Blazor MAUI",
+ "Enum:DatabaseProvider:0": "Unknown",
+ "Enum:DatabaseProvider:1": "None",
+ "Enum:DatabaseProvider:2": "EfCore",
+ "Enum:DatabaseProvider:3": "MongoDB",
+ "Enum:Dbms:0": "Unknown",
+ "Enum:Dbms:1": "None",
+ "Enum:Dbms:2": "SQL Server",
+ "Enum:Dbms:3": "PostgreSQL",
+ "Enum:Dbms:4": "Oracle",
+ "Enum:Dbms:5": "Oracle Devart",
+ "Enum:Dbms:6": "MySQL",
+ "Enum:Dbms:7": "SQLite",
+ "Enum:UiTheme:0": "Unknown",
+ "Enum:UiTheme:1": "None",
+ "Enum:UiTheme:2": "Basic",
+ "Enum:UiTheme:3": "LeptonX",
+ "Enum:UiTheme:4": "LeptonX Lite",
+ "Enum:UiTheme:5": "Lepton",
+ "Enum:UiThemeStyle:0": "Unknown",
+ "Enum:UiThemeStyle:1": "System",
+ "Enum:UiThemeStyle:2": "Dim",
+ "Enum:UiThemeStyle:3": "Dark",
+ "Enum:UiThemeStyle:4": "Light",
+ "Enum:MobileApp:0": "Unknown",
+ "Enum:MobileApp:1": "None",
+ "Enum:MobileApp:2": "MAUI",
+ "Enum:MobileApp:3": "React Native",
+ "Enum:AbpTool:0": "Unknown",
+ "Enum:AbpTool:1": "Studio UI",
+ "Enum:AbpTool:2": "Studio CLI",
+ "Enum:AbpTool:3": "Old CLI",
+ "Menu:TelemetryMenu": "Telemetry Reports",
+ "Menu:Studio": "Studio",
+ "Menu:Solutions": "Solutions",
+ "Menu:Users": "Users",
+ "Menu:UserReports": "Users"
}
}
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
index 31f6186258..35c4766f8b 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Base/Localization/Resources/en.json
@@ -253,6 +253,8 @@
"AbpConferenceDescription": "ABP Conference is a virtual event for .NET developers to learn and connect with the community.",
"Mobile": "Mobile",
"MetaTwitterCard": "summary_large_image",
- "IPAddress": "IP Address"
+ "IPAddress": "IP Address",
+ "LicenseBanner:InfoText": "Your license will expire in {0} days.",
+ "LicenseBanner:CallToAction": "Please extend your license."
}
}
\ No newline at end of file
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
index 456e8ebd05..dcbfaa303e 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json
@@ -847,6 +847,7 @@
"BlazoriseSupportExplanation3": "Log into the Blazorise support website at blazorise.com/support/login.",
"BlazoriseSupportExplanation4": "If you have an active ABP Commercial license, you will also have a Blazorise PRO license. You can get your Blazorise license key at blazorise.com/support/user/manage/license.",
"BlazoriseSupportExplanation5": "You can post your questions on the support website and generate a product token for your application.",
+ "BlazoriseSupportMoreInfo": "For more information click here.",
"AbpLiveTrainingPackages": "ABP Live Training Packages",
"Releases": "Releases",
"ReleasesDescription": "This page contains detailed information about each release. You can see all the closed pull requests for a specific release. For overall milestone developments, you can check out the brief release notes page.",
diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
index f5fea908de..e3d8c34c72 100644
--- a/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
+++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
@@ -431,6 +431,9 @@
"WhoWeAre_Expert": "About Me",
"CreateSolutionFolder": "Create Solution Folder",
"CreateSolutionFolderOption": "Specifies if the project will be in a new folder in the output folder or directly the output folder.",
+ "CreateCrudPage": "Create CRUD Page",
+ "CreateCrudPageOption": "Generates a sample CRUD page with a Book entity to demonstrate basic operations (Create, Read, Update, Delete).",
+ "ConnectionString": "Connection string",
"BooksPageTitle": "ABP Books",
"BooksPageDescription": "Explore ABP books to deepen your understanding and mastery of ABP.",
"PackageDetailPage_NuGetPackageInstallationOptions": "There are three ways to install {0} NuGet package to your project",
@@ -534,7 +537,7 @@
"WhenShouldIRenewMyLicenseExplanation2": "{0} for Team Licenses;",
"WhenShouldIRenewMyLicenseExplanation3": "{0} for Business and Enterprise Licenses;",
"WhenShouldIRenewMyLicenseExplanation4": "However, if you renew your license more than {0} days after the expiry date, the renewal price will be the same as the initial purchase price of the license, with no discounts applied to your renewal.",
- "DoesTheSubscriptionRenewAutomaticallyExplanationAutoRenewal": "ABP Platform allows you to auto-renew your license. This is an optional free service. You can toggle this feature when you purchase a new license or later enable it from your organization management page. If you want to turn on or off the auto-renewal, visit the organization management page, go to the 'Payments Method' section and either check or uncheck the 'Automatic Renewal' checkbox. When you turn off the auto-renewal feature, it will be your responsibility to renew your license manually.",
+ "DoesTheSubscriptionRenewAutomaticallyExplanationAutoRenewal": "ABP Platform allows you to auto-renew your license. This is an optional free service. You can toggle this feature when you purchase a new license or later enable it from your organization management page. If you want to turn on or off the auto-renewal, visit the organization management page, go to the 'Payments Method' section and either check or uncheck the 'Automatic Renewal' checkbox. When you turn off the auto-renewal feature, it will be your responsibility to renew your license manually. The renewals (manual) are non-refundable. On the other hand, all subscription auto-renewals are non-refundable after 10 calendar days from the auto-renewal date. If you don't wish to continue your license, it is your responsibility to manage the renewal settings and cancel the subscription before the automatic renewal date.",
"TrialPlanExplanation": "Yes, to start your free trial, please contact sales@volosoft.com. We also offer a 30-day money-back guarantee for the Team license, with no questions asked! You can request a full refund within the first 30 days of purchasing the license. For Business and Enterprise licenses, we provide a 60% refund if requested within 30 days of purchase. This policy is due to the inclusion of the full source code for all modules and themes in the Business and Enterprise licenses.",
"BlazoriseLicenseExplanation": "We have an agreement between Volosoft and Megabit, according to which the Blazorise license is bundled with the ABP Platform’s commercial licenses. Therefore, our paid users do not need to purchase an additional Blazorise license.",
"HowToUpgradeExplanation1": "When you create a new application using the ABP startup templates, all the modules and themes are used as NuGet and NPM packages. This setup allows for easy upgrades to newer versions of the packages.",
@@ -907,6 +910,7 @@
"ProudToWorkWith": "Proud to Work With",
"JoinOurConsumers": "Join them and build amazing products fast.",
"AdditionalServicesExplanation": "Do you need additional or custom services? We and our partners can provide;",
+ "CustomLicense": "Custom License",
"CustomProjectDevelopment": "Custom Project Development",
"CustomProjectDevelopmentExplanation": "Dedicated developers for your custom projects.",
"PortingExistingProjects": "Porting Existing Projects",
@@ -1059,7 +1063,7 @@
"BuyNow": "Buy Now",
"PayViaAmexCard": "How can I pay via my AMEX card?",
"PayViaAmexCardDescription": "The default payment gateway 'Iyzico' may decline some AMEX credit cards due to security measures. In this case, you can pay through the alternative payment gateway '2Checkout'.",
- "InvalidReCaptchaErrorMessage": "There was an error verifying reCAPTCHA. Please try again.",
+ "InvalidReCaptchaErrorMessage": "There was an error verifying reCAPTCHA.",
"YourCompanyName": "Your company name",
"FirstName": "First name",
"LastName": "Last name",
@@ -1425,7 +1429,7 @@
"TotalDevelopers": "Total {0} developer(s)",
"CustomPurchaseExplanation": "Tailored to your specific needs",
"WhereDidYouHearAboutUs": "Where did you hear about us?",
- "Twitter": "Twitter",
+ "Twitter": "Twitter (X)",
"Facebook": "Facebook",
"Youtube": "YouTube",
"Google": "Google",
@@ -1460,6 +1464,7 @@
"BlazoriseSupportExplanation3": "Log into the Blazorise support website at blazorise.com/support/login.",
"BlazoriseSupportExplanation4": "If you have an active ABP Commercial License, you will also have a Blazorise PRO license. You can get your Blazorise license key at blazorise.com/support/user/manage/license.",
"BlazoriseSupportExplanation5": "You can post your questions on the support website and generate a product token for your application.",
+ "BlazoriseSupportMoreInfo": "For more information click here.",
"AbpLiveTrainingPackages": "ABP Live Training Packages",
"Releases": "Releases",
"ReleasesDescription": "This page contains detailed information about each release. You can see all the closed pull requests for a specific release. For overall milestone developments, you can check out the brief release notes page.",
@@ -1795,7 +1800,7 @@
"SpecialDiscount": "Special Discount",
"YourOrganizationOverview": "Your Organization Overview",
"TrainingDetailsHeaderInfo_TrainingHourSingular": "{0} hour",
- "ContactPageError": "Please send your message via email to info@abp.io Here's what you wrote :",
+ "ContactPageError": "You can also send your message via email. Copy your message below and send to info@abp.io ",
"GoBack": "Go back",
"HereWhatYouWrote": "Here's what you wrote :",
"Sales": "Sales",
@@ -1891,6 +1896,23 @@
"CreatePostSEOTitleInfo": "SEO URL is a clean, readable, keyword-rich URL that helps both users and search engines understand what this post is about. Keep it short with 60 characters. SEO titles over 60 characters will be truncated. Use hyphens (-) to separate words (not underscores). Include target keywords near the start. Lowercase only. No stop words unless needed (e.g: \"and\", \"or\", \"the\").",
"SEOTitle": "SEO URL",
"InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again.",
- "SelectAnOption": "Select an option"
+ "SelectAnOption": "Select an option",
+ "MostPopular": "Most Popular",
+ "AnnouncmentsPageTitle": "ABP Community Announcements | Stay Updated with the Latest News",
+ "AnnouncmentsPageDescription": "Get the latest news, feature updates, release notes, and important announcements about the ABP framework and .NET ecosystem. Stay ahead with timely information directly from the ABP team.",
+ "CanIUseABPProductsOnMoreThanOneComputer": "Can I use ABP products on more than one computer?",
+ "ABPProductsOnMoreThanOneComputerExplanation": "Yes. Each developer can install the software on up to two machines. A third machine requires approval via email. When you stop using one of your computers, the system understands and automatically invalidates that computer from your paired computer list.",
+ "CanIShareTheLicensedABPCommercialProducts": "Can I share the licensed ABP commercial products publicly or make them open source?",
+ "ShareTheLicensedABPCommercialProductsExplanation": "No! Sharing or sublicensing a Commercial (PRO) ABP package is strictly prohibited.",
+ "AreSubscriptionRenewalsAutomatic": "Are subscription renewals automatic?",
+ "SubscriptionRenewalsAutomaticExplanation": "By default, no, the renewals are manual. On the other hand, when you purchase a new license and use the payment gateway 'Iyzico' with your credit card, you will see a checkbox called 'Automatic Renewal' in the purchase steps which allows ABP system automatically renew your license. When you check that checkbox, the auto-renewal process lets you renew your license without losing this discount, and your development will never be interrupted. ABP does not save your credit card information, but our payment gateway does secure savings. You can disable auto-renewal at any time by accessing your Organization Management page.",
+ "DoYouProvideSupportForThird-partyLibraries": "Do you provide support for third-party libraries?",
+ "ProvideSupportForThird-partyExplanation": "No. Support only covers ABP Framework, ABP commercial packages and products which have been created by Volosoft.",
+ "DoYouSupportCustomABPArchitectures": "Do you support custom ABP architectures?",
+ "SupportCustomABPArchitecturesExplanation": "No. Support is only provided for standard ABP solution structures. On the other hand, you can always get support for your custom needs with a paid consultancy from the ABP Team.",
+ "DoesABPCollectAnyPersonalOrTechnicalData": "Does ABP collect any personal or technical data?",
+ "ABPCollectAnyDataExplanation": "The software may collect information about you and your use of the software, and send that to Volosoft. Volosoft as the software and service provider may use this information to provide services and improve its products & services. You may opt-out of these scenarios, as described in the EULA under PRIVACY AND COLLECTION OF PERSONAL DATA topic .",
+ "InThisDocument": "In this document",
+ "RecommendedArticles": "Recommended Articles"
}
}
diff --git a/common.props b/common.props
index 3bc4fdbe01..4272d7ff58 100644
--- a/common.props
+++ b/common.props
@@ -1,8 +1,8 @@
latest
- 9.3.6
- 4.3.6
+ 10.0.0-rc.2
+ 5.0.0-rc.2$(NoWarn);CS1591;CS0436https://abp.io/assets/abp_nupkg.pnghttps://abp.io/
@@ -18,6 +18,11 @@
+
+
+
+
+ all
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/POST.md b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/POST.md
new file mode 100644
index 0000000000..08c375eeb3
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/POST.md
@@ -0,0 +1,203 @@
+# ABP Platform 9.3 RC Has Been Released
+
+We are happy to release [ABP](https://abp.io) version **9.3 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version.
+
+Try this version and provide feedback for a more stable version of ABP v9.3! Thanks to you in advance.
+
+## Get Started with the 9.3 RC
+
+You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli).
+
+By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI:
+
+
+
+## Migration Guide
+
+There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.2 or earlier: [ABP Version 9.3 Migration Guide](https://abp.io/docs/9.3/release-info/migration-guides/abp-9-3)
+
+## What's New with ABP v9.3?
+
+In this section, I will introduce some major features released in this version.
+Here is a brief list of titles explained in the next sections:
+
+* Cron Expression Support for Background Workers
+* Docs Module: PDF Export
+* Angular UI: Standalone Package Structure
+* Upgraded to Blazorise v1.7.7
+* Audit Logging Module: Excel Export
+
+### Cron Expression Support for Background Workers
+
+We've enhanced the [Background Workers System](https://abp.io/docs/9.3/framework/infrastructure/background-workers) by adding support for Cron expressions when using [Hangfire](https://abp.io/docs/9.3/framework/infrastructure/background-workers/hangfire) or [Quartz](https://abp.io/docs/9.3/framework/infrastructure/background-workers/quartz) as the background worker manager. This new feature provides more flexibility in scheduling background tasks compared to the simple period-based timing system.
+
+Now you can define complex scheduling patterns using standard Cron expressions. For example, you can schedule a task to run: "Every day at midnight", "Every Monday at 9 AM", or "First day of every month".
+
+Here's how you can use it in your background worker:
+
+```csharp
+public class MyPeriodicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase
+{
+ public MyPeriodicBackgroundWorker(
+ AbpAsyncTimer timer,
+ IServiceScopeFactory serviceScopeFactory)
+ : base(timer, serviceScopeFactory)
+ {
+ // You can either use Period for simple intervals
+ Timer.Period = 600000; //10 minutes
+
+ // 👇 or use CronExpression for more complex scheduling 👇
+ CronExpression = "0 0/10 * * * ?"; //Run every 10 minutes
+ }
+
+ protected async override Task DoWorkAsync(
+ PeriodicBackgroundWorkerContext context)
+ {
+ // Your background work...
+ }
+}
+```
+
+The `CronExpression` property takes precedence over the `Period` property when both are set. This feature is available when you use either the [Hangfire](https://abp.io/docs/9.3/framework/infrastructure/background-workers/hangfire) or [Quartz](https://abp.io/docs/9.3/framework/infrastructure/background-workers/quartz) background worker managers.
+
+> See the [Background Workers documentation](https://abp.io/docs/9.3/framework/infrastructure/background-workers) for more information about configuring and using background workers with Cron expressions.
+
+### Docs Module: PDF Export
+
+We're excited to introduce a new feature in the Docs Module that allows users to export documentation as PDF files. This feature makes it easier for users to access documentation offline or share it with team members who might not have immediate access to the online documentation system.
+
+**Administrators can generate PDF files from the back-office side**:
+
+
+
+and **then a "Download PDF" button appears in the document system** (as shown in the image below - the bottom right of the navigation menu -), allowing users to download the compiled documentation as a PDF file:
+
+
+
+The feature supports multiple versions of documentation, different language variants, and ensures proper formatting of all content including code blocks and technical documentation.
+
+### Angular UI: Standalone Package Structure
+
+ABP v9.3 introduces support for Angular's standalone components architecture while maintaining **full compatibility with existing module-based applications**. This update aligns with Angular's strategic direction toward standalone components as the recommended approach for building Angular applications.
+
+The key improvements include:
+
+* **Dual-support routing configurations** that work seamlessly with both module-based and standalone approaches
+* **ABP Suite integration** for generating code that supports standalone components
+* **Updated schematics** that provide templates for both development patterns
+
+This enhancement gives developers the flexibility to choose their preferred Angular architecture. Existing module-based applications **continue to work without modifications**, while new projects can leverage the standalone approach for simplified dependency management, reduced boilerplate code, and better lazy-loading capabilities.
+
+> For developers interested in migrating to standalone components or starting new projects, we'll be publishing a comprehensive blog post with detailed guidance and best practices. In the meantime, you can check [#22829](https://github.com/abpframework/abp/pull/22829) for implementation details of the standalone package structure and make the necessary changes to your project.
+
+### Upgraded to Blazorise v1.7.7
+
+Upgraded the [Blazorise](https://blazorise.com/) library to v1.7.7 for Blazor UI. If you are upgrading your project to v9.3.0, please ensure that all the Blazorise-related packages are using v1.7.7 in your application. Otherwise, you might get errors due to incompatible versions.
+
+> See [#23013](https://github.com/abpframework/abp/pull/23013) for the updated NuGet packages.
+
+### Audit Logging Module: Excel Export
+
+In this version, we've added Excel export capabilities to the [Audit Logging Module](https://abp.io/docs/latest/modules/audit-logging-pro), allowing administrators to export audit logs and entity changes to Excel files for further analysis or reporting purposes.
+
+
+
+This feature enables users to:
+
+- Export audit logs with filtering options
+- Export entity changes with detailed information
+- Receive email notifications when exports are completed or fail
+- Download exported files via secure links
+
+The export process runs in the background, and once completed, users receive an email with a download link. This approach ensures that even large audit log exports don't block the UI or time out during processing.
+
+You can configure various aspects of this feature using the `AuditLogExcelFileOptions` in your module's configuration:
+
+```csharp
+Configure(options =>
+{
+ // How long to keep exported files before cleanup
+ options.FileRetentionHours = 48;
+
+ // Base URL for download links in notification emails
+ options.DownloadBaseUrl = "https://yourdomain.com";
+
+ // Configure the cleanup worker schedule
+ options.ExcelFileCleanupOptions.Period = (int)TimeSpan.FromHours(24).TotalMilliseconds;
+
+ // Use cron expression for more advanced scheduling (requires Hangfire or Quartz)
+ options.ExcelFileCleanupOptions.CronExpression = "0 2 * * *"; // Run at 2 AM daily
+});
+```
+
+The module includes pre-configured email templates for notifications about completed or failed exports, ensuring users are always informed about the status of their export requests.
+
+> **Note**: This feature requires a configured BLOB storage provider to store the generated Excel files. See the [BLOB Storing documentation](https://abp.io/docs/9.3/framework/infrastructure/blob-storing) for more information.
+
+For more details about the Audit Logging Module and its Excel export capabilities, please refer to the [official documentation](https://abp.io/docs/9.3/modules/audit-logging-pro).
+
+## Community News
+
+### Announcing ABP Studio 1.0 General Availability 🚀
+
+
+
+We are thrilled to announce that ABP Studio has reached version 1.0 and is now generally available! This marks a significant milestone for our integrated development environment designed specifically for ABP developers. The stable release brings several powerful features including:
+
+* Enhanced Solution Runner with health monitoring capabilities
+* Theme style selection during project creation (Basic, LeptonX Lite, and LeptonX Themes)
+* New "Container" application type for better Docker container management
+* Improved handling of multiple DbContexts for migration operations
+
+> For a detailed overview of these features and to learn more about what's coming next, check out our [announcement post](https://abp.io/community/articles/announcing-abp-studio-1-0-general-availability-82yw62bt).
+
+### ABP Community Talks 2025.05: Empower Elsa Workflows with AI in .NET + ABP Framework
+
+In this episode of ABP Community Talks, 2025.05, we are thrilled to host [**Sipke Schoorstra**](https://github.com/sfmskywalker), the creator of the [Elsa Workflows](https://docs.elsaworkflows.io/) library! This month's session is all about **"Empower Elsa Workflows with AI in .NET + ABP Framework"**.
+
+
+
+Sipke will join us to demonstrate how you can leverage AI within Elsa Workflows using .NET and the ABP Framework. The session will explore practical techniques and showcase how to integrate AI capabilities to enhance and automate your business processes within the Elsa workflow engine.
+
+> 👉 Don't miss this opportunity to learn directly from the creator of Elsa and see real-world examples of building intelligent, automated workflows! You can register from [here](https://kommunity.com/volosoft/events/abp-community-talks-202505empower-elsa-workflows-with-ai-in-netabp-framework-3965dd32).
+
+### ABP Bootcamp: Mastering Infrastructure & Features
+
+We are excited to announce the very first **ABP Bootcamp: Mastering Infrastructure & Features**! This is a live training program designed to give you hands-on, practical experience with ABP's core infrastructure and features.
+
+
+
+Join the ABP Bootcamp to learn directly from the core team in a focused, hands-on program designed for busy developers. Over four days, you'll gain a deep understanding of ABP's infrastructure, best practices, and practical skills you can immediately apply to your projects.
+
+> **Seats are limited!** Don't miss this opportunity to level up your ABP skills with direct guidance from the experts.
+>
+> 👉 [See full details and reserve your seat!](https://abp.io/bootcamp)
+
+### New ABP Community Articles
+
+There are exciting articles contributed by the ABP community as always. I will highlight some of them here:
+
+* [Prabhjot Singh](https://abp.io/community/members/prabhjot) has published 3 new articles:
+ * [Accessing Multiple Remote ABP based Backends Using HttpApi.Client](https://abp.io/community/articles/consume-multi-backends-using-clients-6f4vcggh)
+ * [Adopting the new .slnx format to organize applications and services](https://abp.io/community/articles/adopting-the-new-.slnx-format-to-organize-applications-6cm3vl8k)
+ * [Replacing Dynamic client proxies with Static client proxies](https://abp.io/community/articles/replacing-dynamic-client-proxies-with-static-client-proxies-g30lf0vx)
+* [Liming Ma](https://github.com/maliming) has published 2 new articles:
+ * [Resolving Tenant from Route in ABP Framework](https://abp.io/community/articles/resolving-tenant-from-route-in-abp-framework-ah7oru97)
+ * [Integrating .NET AI Chat Template with ABP Framework](https://abp.io/community/articles/integrating-.net-ai-chat-template-with-abp-framework-qavb5p2j)
+* [Engincan Veske](https://engincanveske.substack.com/) has published 2 new articles:
+ * [Understanding HttpApi.Client Project & Remote Services in an ABP Based Application](https://abp.io/community/articles/http-api-client-and-remote-services-in-abp-based-application-xkknsp6m)
+ * [Using Elsa 3 with the ABP Framework: A Comprehensive Guide](https://abp.io/community/articles/using-elsa-3-workflow-with-abp-framework-usqk8afg)
+* [Enis Necipoğlu](https://github.com/enisn) has published 2 new articles:
+ * [White Labeling in ABP Framework](https://abp.io/community/articles/white-labeling-in-abp-framework-5trwmrfm) by [Enis Necipoğlu](https://github.com/enisn)
+ * [You do it wrong! Customizing ABP Login Page Correctly](https://abp.io/community/articles/you-do-it-wrong-customizing-abp-login-page-correctly-bna7wzt5)
+* [New in ABP Studio: Docker Container Management](https://abp.io/community/articles/abp-studio-docker-container-management-ex7r27y8) by [Yunus Emre Kalkan](https://github.com/yekalkan)
+* [Solving MongoDB GUID Issues After an ABP Framework Upgrade](https://abp.io/community/articles/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n) by [Burak Demir](https://abp.io/community/members/burakdemir)
+
+
+Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
+
+## Conclusion
+
+This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/9.3/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v9.3 RC and provide feedback to help us release a more stable version.
+
+Thanks for being a part of this community!
\ No newline at end of file
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/abp-studio.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/abp-studio.png
new file mode 100644
index 0000000000..76b24a8573
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/abp-studio.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/audit-logs-export-to-excel.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/audit-logs-export-to-excel.png
new file mode 100644
index 0000000000..4c10f516db
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/audit-logs-export-to-excel.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/bootcamp.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/bootcamp.png
new file mode 100644
index 0000000000..e07293c13c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/bootcamp.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/community-talk-2025-5.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/community-talk-2025-5.png
new file mode 100644
index 0000000000..3989dde47a
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/community-talk-2025-5.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/cover-image.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/cover-image.png
new file mode 100644
index 0000000000..291da0d04f
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/cover-image.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/download-pdf-on-docs.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/download-pdf-on-docs.png
new file mode 100644
index 0000000000..ce5b1b3727
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/download-pdf-on-docs.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/generate-pdf-docs.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/generate-pdf-docs.png
new file mode 100644
index 0000000000..2a1de4398d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/generate-pdf-docs.png differ
diff --git a/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/studio-switch-to-preview.png b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/studio-switch-to-preview.png
new file mode 100644
index 0000000000..32f6d01edb
Binary files /dev/null and b/docs/en/Blog-Posts/2025-06-18 v9_3_Preview/studio-switch-to-preview.png differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg
new file mode 100644
index 0000000000..7cd0f2aa47
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15924-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15924-min.jpg
new file mode 100644
index 0000000000..3730feed30
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15924-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15933-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15933-min.jpg
new file mode 100644
index 0000000000..5c4348c2a6
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15933-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15934-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15934-min.jpg
new file mode 100644
index 0000000000..bfaec7bc9d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15934-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg
new file mode 100644
index 0000000000..8539d5be5c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg
new file mode 100644
index 0000000000..2502d8904c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15946-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15946-min.jpg
new file mode 100644
index 0000000000..da423629c7
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15946-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg
new file mode 100644
index 0000000000..372f41e3a5
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg
new file mode 100644
index 0000000000..9d98fe4585
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg
new file mode 100644
index 0000000000..dac9184cf3
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15956-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15956-min.jpg
new file mode 100644
index 0000000000..73ef867711
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15956-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg
new file mode 100644
index 0000000000..af4c2b300a
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg
new file mode 100644
index 0000000000..e2c3a297f7
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15964-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15964-min.jpg
new file mode 100644
index 0000000000..4ed6c26b33
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15964-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15966-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15966-min.jpg
new file mode 100644
index 0000000000..80296b7ead
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15966-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15968-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15968-min.jpg
new file mode 100644
index 0000000000..6f915ee94c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15968-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15969-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15969-min.jpg
new file mode 100644
index 0000000000..de112a11ea
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15969-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15970-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15970-min.jpg
new file mode 100644
index 0000000000..acdd4bb0b0
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15970-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15971-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15971-min.JPG
new file mode 100644
index 0000000000..5fd55d58e1
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15971-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15972-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15972-min.JPG
new file mode 100644
index 0000000000..c1956daebd
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15972-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15973-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15973-min.JPG
new file mode 100644
index 0000000000..3d1a5b0789
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15973-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15974-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15974-min.JPG
new file mode 100644
index 0000000000..147f7ef967
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15974-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15975-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15975-min.JPG
new file mode 100644
index 0000000000..173610a7ec
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15975-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15976-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15976-min.JPG
new file mode 100644
index 0000000000..c48a7944d6
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15976-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15977-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15977-min.JPG
new file mode 100644
index 0000000000..6f5cb19831
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15977-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15979-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15979-min.JPG
new file mode 100644
index 0000000000..9ca4140717
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15979-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15980-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15980-min.JPG
new file mode 100644
index 0000000000..0ebf59d8b8
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15980-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15981-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15981-min.JPG
new file mode 100644
index 0000000000..10e02621cf
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15981-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15982-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15982-min.JPG
new file mode 100644
index 0000000000..63bc90cc76
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15982-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15983-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15983-min.JPG
new file mode 100644
index 0000000000..14e1f16c9a
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15983-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15984-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15984-min.jpg
new file mode 100644
index 0000000000..0984be8e2e
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15984-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15985-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15985-min.JPG
new file mode 100644
index 0000000000..8d30f62cd3
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15985-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15986-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15986-min.JPG
new file mode 100644
index 0000000000..55f48e13a9
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15986-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15987-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15987-min.JPG
new file mode 100644
index 0000000000..9cbd57efaa
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15987-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15989-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15989-min.jpg
new file mode 100644
index 0000000000..f4c0bb2cfc
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15989-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15994-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15994-min.jpg
new file mode 100644
index 0000000000..35201fee15
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15994-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg
new file mode 100644
index 0000000000..bc4220f83a
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg
new file mode 100644
index 0000000000..e5dd4c0c9d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg
new file mode 100644
index 0000000000..d2ae92ff0e
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg
new file mode 100644
index 0000000000..22c32abd22
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16001-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16001-min.jpg
new file mode 100644
index 0000000000..1f8a500948
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16001-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16002-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16002-min.jpg
new file mode 100644
index 0000000000..8753a09cfe
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16002-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16003-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16003-min.jpg
new file mode 100644
index 0000000000..4f4eec7b54
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16003-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16006-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16006-min.JPG
new file mode 100644
index 0000000000..eef991dd38
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16006-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16007-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16007-min.jpg
new file mode 100644
index 0000000000..48cb26cd40
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16007-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16008-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16008-min.jpg
new file mode 100644
index 0000000000..3eadec4490
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16008-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16009-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16009-min.jpg
new file mode 100644
index 0000000000..0e8387065d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16009-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg
new file mode 100644
index 0000000000..392a680bdf
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg
new file mode 100644
index 0000000000..15a3fbf143
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16013-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16013-min.jpg
new file mode 100644
index 0000000000..256c2bc22c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16013-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16019-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16019-min.JPG
new file mode 100644
index 0000000000..e657a682ad
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16019-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16021-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16021-min.JPG
new file mode 100644
index 0000000000..5a81fddee1
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16021-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16022-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16022-min.JPG
new file mode 100644
index 0000000000..ed8660fdbd
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16022-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16023-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16023-min.JPG
new file mode 100644
index 0000000000..05b2040d18
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16023-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16024-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16024-min.JPG
new file mode 100644
index 0000000000..2cc6f9fbee
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16024-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16025-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16025-min.JPG
new file mode 100644
index 0000000000..0ede12db76
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16025-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16026-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16026-min.JPG
new file mode 100644
index 0000000000..268e4a4454
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16026-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16027-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16027-min.JPG
new file mode 100644
index 0000000000..68d288fc19
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16027-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16028-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16028-min.JPG
new file mode 100644
index 0000000000..72d060a6e1
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16028-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16029-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16029-min.JPG
new file mode 100644
index 0000000000..47bc5a910c
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16029-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16030-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16030-min.JPG
new file mode 100644
index 0000000000..5180e62195
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16030-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16031-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16031-min.JPG
new file mode 100644
index 0000000000..3085d54f3d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16031-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16032-min.jpg b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16032-min.jpg
new file mode 100644
index 0000000000..26ddb2dc75
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16032-min.jpg differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16040-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16040-min.JPG
new file mode 100644
index 0000000000..4bf5c04712
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16040-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16041-min.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16041-min.JPG
new file mode 100644
index 0000000000..3b38f0c487
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16041-min.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png
new file mode 100644
index 0000000000..595446cefa
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png
new file mode 100644
index 0000000000..8b8f3a978b
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-1.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-1.JPG
new file mode 100644
index 0000000000..6be6b041d3
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-1.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-2.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-2.JPG
new file mode 100644
index 0000000000..b05c488c4d
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-2.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-3.JPG b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-3.JPG
new file mode 100644
index 0000000000..51dd5e7e57
Binary files /dev/null and b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-3.JPG differ
diff --git a/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/post.md b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/post.md
new file mode 100644
index 0000000000..1b996e4867
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/post.md
@@ -0,0 +1,101 @@
+# WeAreDevelopers 2025: A Speaker’s Impressions
+
+
+
+After speaking at DotNext Moscow, I had high expectations for WeAreDevelopers 2025—and the event delivered on all fronts. Held in Berlin / Germany, it brought together a truly global crowd of developers, tech leaders, and innovators. As a speaker and software architect , I’m sharing my first-hand highlights, favorite moments, and candid scenes from this 2025’s conference.
+
+## 🗣 My Talk
+
+We have a good experience on multi-tenancy topic in SaaS development. My talk's topic was "Building Multi-Tenant ASP.NET Core Applications: Best Practices and Real-World Solutions". It was on the stage 4, 11 July Friday 10:20 am - 10:50 am and [this my presentation file](https://github.com/ebicoglu/presentations/blob/main/multi-tenancy-wearedevelopers-2025_30mins.pptx).
+
+
+
+
+
+
+
+
+## 🏛 Huge Venue
+
+
+*The image is credited to WeAreDevelopers organization*
+
+First of all, I had been in numerous software conferences, I must say that I've never seen such a big software event. The event spanned **500+ sessions across 20+ stages**, including the HR Leaders Summit for **2 full days**.
+
+
+
+
+------
+
+## 🎤 Opening Keynote from GitHub
+
+GitHub CEO Thomas Dohmke initiated the conference on the main stage with a talk on *“Agents for the Sake of Happiness”*. Having introduced Copilot three years ago here, he now launched bold predictions about autonomous AI—a fascinating evolution... He demonstrated GitHub Co-Pilot's AI and created a snake game. Altough it didn't work as he planned, we're developers we know live coding is hard. Actually that's because we shouldn't rely on AI. AI is not deterministic even though we set all those temperature, TopP, TopK parameters to minimum.
+
+> AI is a good but not trustable friend!
+
+
+
+------
+
+## 🧭 11 Parallel Stages: Rush
+
+There were 11 stages where 11 different topics were being explained. And the sessions were 30 minutes. Actually that's the downside of this event. Because there were so nice talks that needs to be minimum 40 minutes. But anyway I understand the organization team because there are many smart speakers whose needs to be included in this event. So as a attendee I was on a hurry to pick the next talk even when I was listening to a talk :)
+
+The venue consists of 3 buildings. So if you pick a talk on another building, you have 10 mins to go to toilet or drink something and catch the next session on that far building...
+
+There was HR track with **3 stages and 2 full days** of HR/Talent Acquisition programming, it attracted a notable overlap of developers and HR pros. Themes included AI‑powered recruiting, remote work culture, mental health, diversity & inclusion, and building AI agents
+
+
+
+
+
+------
+
+## 🤖 AI & AI & AI & Others...
+
+I'm one of those AI lovers. I love learning cutting-edge information. And as I see AI is being more trendy everyday. That's why most of the talks were about AI. Everything related to AI. I generaly attended AI related talks because I'm also working on some AI topics in Volosoft at the moment.
+
+
+------
+
+## 🤝 Expo Floor & Networking
+
+The expo was a developer’s playground—cloud services, open‑source tools, startups, and enterprise platforms. I found new partners and reconnected with peers in a buzzing atmosphere. Everywhere was full of talking's even outside. If you want to get fresh air and drink coffee, you can go out and listen to the outside talks.
+
+
+
+
+
+
+Networking wasn't just daytime chatter—hallway meetups and evening socials were unforgettable.
+
+
+
+
+------
+
+## 😂 Candid & Fun Moments
+
+Swag stations, sponsor games, “developer selfies”—these lighter moments kept the vibe upbeat and human.
+
+
+
+
+------
+
+## ✅ Final Thoughts & Looking Ahead
+
+WeAreDevelopers 2025 was an unforgettable three-day ride: **15,000 tech minds**, **500+ sessions**, and a true **bridge between developers and HR**
+I’m leaving with:
+
+- Fresh strategies in GenAI and SaaS growth
+- Stronger HR-tech understanding and crossover potential
+- New professional connections—and fun memories
+
+
+------
+
+
+
+
+
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md
new file mode 100644
index 0000000000..3acf9a7dd0
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/POST.md
@@ -0,0 +1,79 @@
+# ABP.IO Platform 9.3 Final Has Been Released!
+
+We are glad to announce that [ABP](https://abp.io/) 9.3 stable version has been released today.
+
+## What's New With Version 9.3?
+
+All the new features were explained in detail in the [9.3 RC Announcement Post](https://abp.io/community/announcements/announcing-abp-9-3-release-candidate-4dqgiryf), so there is no need to review them again. You can check it out for more details.
+
+## Getting Started with 9.3
+
+### Creating New Solutions
+
+You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli) to create new solutions.
+
+> **Note**: ABP Studio **v1.2.1** has been released with support for **ABP 9.3**. If you already have ABP Studio installed, update it to v1.2.1 (or later, if available) to create new applications targeting 9.3. ABP Studio checks for updates automatically and will prompt you in-app modal to update to the latest version, or you can download the latest installer from the [Studio](https://abp.io/studio) page. See the [upgrading guide](https://abp.io/docs/latest/studio/installation#upgrading) for details. After updating, the New Solution wizard will create applications with ABP 9.3 by default. You can check the [ABP Studio and ABP Startup Template Version Mappings](https://abp.io/docs/latest/studio/version-mapping) documentation to see the corresponding ABP versions for other versions of Studio.
+
+### How to Upgrade an Existing Solution
+
+You can upgrade your existing solutions with either ABP Studio or ABP CLI. In the following sections, both approaches are explained:
+
+### Upgrading via ABP Studio
+
+If you are already using the ABP Studio, you can upgrade it to the latest version. 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. Then, you can update it by confirming the opened modal. See [the documentation](https://abp.io/docs/latest/studio/installation#upgrading) for more info.
+
+After upgrading the ABP Studio, then you can open your solution in the application, and simply click the **Upgrade ABP Packages** action button to instantly upgrade your solution:
+
+
+
+### Upgrading via ABP CLI
+
+Alternatively, you can upgrade your existing solution via ABP CLI. First, you need to install the ABP CLI or upgrade it to the latest version.
+
+If you haven't installed it yet, you can run the following command:
+
+```bash
+dotnet tool install -g Volo.Abp.Studio.Cli
+```
+
+Or to update the existing CLI, you can run the following command:
+
+```bash
+dotnet tool update -g Volo.Abp.Studio.Cli
+```
+
+After installing/updating the ABP CLI, you can use the [`update` command](https://abp.io/docs/latest/CLI#update) to update all the ABP related NuGet and NPM packages in your solution as follows:
+
+```bash
+abp update
+```
+
+You can run this command in the root folder of your solution to update all ABP related packages.
+
+## Migration Guides
+
+There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.2: [ABP Version 9.3 Migration Guide](https://abp.io/docs/9.3/release-info/migration-guides/abp-9-3)
+
+## Community News
+
+### New ABP Community Articles
+
+As always, exciting articles have been contributed by the ABP community. I will highlight some of them here:
+
+* [Fahri Gedik](https://abp.io/community/members/fahrigedik) has published 2 new articles:
+ * [A Modern Approach to Angular Dependency Injection using inject function](https://abp.io/community/articles/a-modern-approach-to-angular-dependency-injection-using-8np4o1ap)
+ * [Angular Application Builder: Transitioning from Webpack to Esbuild](https://abp.io/community/articles/angular-application-builder-transitioning-from-webpack-to-3yzhzfl0)
+* [Benjamin Fadina](https://abp.io/community/members/benjaminsqlserver@gmail.com) has published several videos on various topics such as **Blazor Web Assembly Using ABP.IO**, **CQRS Implementation with MediatR in ABP** and more. You can see all his videos [here](https://abp.io/community/members/benjaminsqlserver@gmail.com).
+* [Mansur Besleney](https://abp.io/community/members/mansur.besleney) has published [How to Build Persistent Background Jobs with ABP Framework and Quartz](https://abp.io/community/articles/how-to-build-persistent-background-jobs-with-abp-framework-n9aloh93)
+* [Halil Ibrahim Kalkan](https://x.com/hibrahimkalkan) has published [Multitenancy with Separate Databases in .NET and ABP](https://abp.io/community/articles/multitenancy-with-separate-databases-in-dotnet-and-abp-51nvl4u9)
+* [Alex Maiereanu](https://abp.io/community/members/alex.maiereanu@3sstudio.com) has published [ABP-Hangfire-AzurePostgreSQL](https://abp.io/community/articles/abphangfireazurepostgresql-s1jnf3yg)
+* [Jack Fistelmann](https://abp.io/community/members/jfistelmann) has published [ABP and maildev](https://abp.io/community/articles/abp-and-maildev-gy13cr1p)
+* [Harsh Gupta](https://abp.io/community/members/harshgupta) has published [How to Add a Module in the ABP.io Application?](https://abp.io/community/articles/how-to-add-a-module-in-the-abp.io-application-sdeajkn6)
+* [Tarık Özdemir](https://abp.io/community/members/mtozdemir) has published [AI-First Architecture for .NET Projects: A Modern Blueprint Inspired by McKinsey](https://abp.io/community/articles/AI-First%20Architecture%20for%20.NET%20Projects%3A%20A%20Modern%20Blueprint-h2wgcoq3)
+* [Liming Ma](https://github.com/maliming) has published [Using Hangfire Dashboard in ABP API Website](https://abp.io/community/articles/using-hangfire-dashboard-in-abp-api-website--r32ox497)
+
+Thanks to the ABP Community for all the content they have published. You can also [post your ABP related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
+
+## About the Next Version
+
+The next feature version will be 10.0. You can follow the [release planning here](https://github.com/abpframework/abp/milestones). Please [submit an issue](https://github.com/abpframework/abp/issues/new) if you have any problems with this version.
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png
new file mode 100644
index 0000000000..291da0d04f
Binary files /dev/null and b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/cover-image.png differ
diff --git a/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png
new file mode 100644
index 0000000000..ad5e9bd462
Binary files /dev/null and b/docs/en/Blog-Posts/2025-08-08 v9_3_Release_Stable/upgrade-abp-packages.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/POST.md b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/POST.md
new file mode 100644
index 0000000000..0c88d1751c
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/POST.md
@@ -0,0 +1,257 @@
+# ABP Platform 10.0 RC Has Been Released
+
+We are happy to release [ABP](https://abp.io) version **10.0 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version.
+
+Try this version and provide feedback for a more stable version of ABP v10.0! Thanks to you in advance.
+
+## Get Started with the 10.0 RC
+
+You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli).
+
+By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI:
+
+
+
+## Migration Guide
+
+There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.3 or earlier: [ABP Version 10.0 Migration Guide](https://abp.io/docs/10.0/release-info/migration-guides/abp-10-0).
+
+## What's New with ABP v10.0?
+
+In this section, I will introduce some major features released in this version.
+Here is a brief list of titles explained in the next sections:
+
+* Upgraded to .NET 10.0
+* Upgraded to Blazorise 1.8.2
+* New Module: **Workflow (Elsa)**
+* New Object Mapper: **Mapperly**
+* Localization: Nested object support in JSON files
+* Support EF Core Shared Entity Types on Repositories
+* Add failure retry policy to InboxProcessor
+* Migrate to New Esbuild-based Angular Builder
+* Angular SSR support
+
+### Upgraded 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.
+
+> Since the stable version of .NET 10 hasn't been released yet, we upgraded ABP to .NET v10.0-rc.1. Stable NET 10 is scheduled to launch as a **Long-Term Support (LTS)** release during .NET Conf 2025, which takes place November 11-13, 2025. We'll update the ABP Platform to the .NET 10 as soon as possible official .NET 10 release is completed.
+
+### Upgraded to Blazorise v1.8.2
+
+Upgraded the [Blazorise](https://blazorise.com/) library to v1.8.2 for Blazor UI. If you are upgrading your project to v10.0 RC, please ensure that all the Blazorise-related packages are using v1.8.2 in your application. Otherwise, you might get errors due to incompatible versions.
+
+> See [#23717](https://github.com/abpframework/abp/issues/23717) for the updated NuGet packages.
+
+### New Module: **Workflow (Elsa)**
+
+ABP now ships a Workflow module that integrates [Elsa Workflows](https://github.com/elsa-workflows/elsa-core) to build visual, long-running, event-driven workflows in your ABP solutions (monolith or microservices). It provides seamless integration with ABP authentication/authorization, distributed event bus, persistence, background processing and includes support for hybrid UIs via Elsa Studio.
+
+For a hands-on reference showcasing an end-to-end order/payment workflow across services, see the sample: [Elsa Workflows - Sample Workflow Demo](https://abp.io/docs/10.0/samples/elsa-workflows-demo). For capabilities, installation and configuration details (activities, storage, hosting, dashboard), see the module docs: [Workflow (Elsa) module](https://abp.io/docs/10.0/modules/elsa-pro).
+
+
+
+### New Object Mapper: **Mapperly**
+
+ABP modules now use Mapperly as the default object-to-object mapper. Mapperly is a compile-time, source generator–based mapper that removes runtime reflection and offers better performance with simpler maintenance. For background and implementation details, see the planning issue and the PR: [Switch to another object mapping library](https://github.com/abpframework/abp/issues/23243) and [Use Mapperly to replace AutoMapper in all modules](https://github.com/abpframework/abp/pull/23277).
+
+The `Volo.Abp.AutoMapper` package remains available for backward compatibility. You can keep using AutoMapper in your solutions, but you are responsible for obtaining and managing its license if needed. For upgrade guidance and practical steps, follow the migration guide: [AutoMapper to Mapperly](https://abp.io/docs/10.0/release-info/migration-guides/AutoMapper-To-Mapperly).
+
+### Localization: Nested object support in JSON files
+
+ABP now supports nested objects (and arrays) in JSON localization files, allowing you to organize translations hierarchically and access them using the double underscore (`__`) separator. This improves maintainability for larger resource files and aligns lookups with familiar key paths.
+
+> See the PR for details: [feat(l8n): add support for nested objects in localization files](https://github.com/abpframework/abp/pull/23701).
+
+**Declaration (nested objects)**:
+```json
+{
+ "culture": "en",
+ "texts": {
+ "MyNestedTranslation": {
+ "SomeKey": "Some nested value",
+ "SomeOtherKey": "Some other nested value"
+ }
+ }
+}
+```
+
+**Usage**:
+```csharp
+L["MyNestedTranslation__SomeKey"];
+L["MyNestedTranslation__SomeOtherKey"];
+```
+
+**Declaration (arrays)**:
+```json
+{
+ "culture": "en",
+ "texts": {
+ "Menu": {
+ "Items": ["Home", "About", "Contact"]
+ }
+ }
+}
+```
+
+**Usage**:
+```csharp
+L["Menu__Items__0"]; // Home
+L["Menu__Items__2"]; // Contact
+```
+
+### Support EF Core Shared Entity Types on Repositories
+
+ABP repositories now support EF Core **shared-type entity** types by allowing a custom entity name to be set on a repository before performing operations. Internally, this uses EF Core's `DbContext.Set(string name)` to target the correct `DbSet`/table for the same CLR type, enabling scenarios like per-tenant tables, archives, or partitioning, and you can switch the target at runtime. See the PR: [Support EF Core Shared Entity Types on Repositories](https://github.com/abpframework/abp/pull/23588) and the EF Core documentation on [shared-type entity types](https://learn.microsoft.com/en-us/ef/core/modeling/entity-types?tabs=data-annotations#shared-type-entity-types).
+
+**Example**:
+```csharp
+// Set the shared entity name so repository operations target that table
+var repo = serviceProvider.GetRequiredService>();
+repo.SetCustomEntityName("MyEntity_TenantA");
+var list = await repo.GetListAsync();
+
+// Switch to another shared name later on the same instance
+repo.SetCustomEntityName("MyEntity_Archive");
+await repo.InsertAsync(new MyEntity { /* ... */ });
+```
+
+### Add failure retry policy to InboxProcessor
+
+`InboxProcessor` now supports configurable failure handling strategies per event: **Retry** (default; reprocess in the next cycle), **RetryLater** (skip the failing event and retry it later with exponential backoff; the backoff factor and maximum retries are configurable), and **Discard** (drop the failing event). This prevents a single failing handler from blocking subsequent events and improves resiliency.
+
+> **Note**: This is a breaking change because `IncomingEvent` entity properties were updated. See the PR for details: [Add failure retry policy to InboxProcessor](https://github.com/abpframework/abp/pull/23563).
+
+### Migrate to New Esbuild-based Angular Builder
+
+We've migrated ABP Angular templates and packages to Angular's new esbuild-based build system (introduced in Angular 17+ and fully supported in Angular 20) to deliver faster builds, modern ESM support, built-in SSR/prerender capabilities, and a better development experience. This change is non-breaking for existing apps. See the tracking issue and PR: [Angular - Migrate to New Esbuild-based Angular Builder](https://github.com/abpframework/abp/issues/23242), [feat: Update Angular templates to Angular 20 new build system](https://github.com/abpframework/abp/pull/23363).
+
+**Key updates in templates/config**:
+- Builder switched from `@angular-devkit/build-angular:browser` to `@angular-devkit/build-angular:application`.
+- `main` option replaced by `browser`; `polyfills` moved to array form.
+- TypeScript updated to `es2020` with `esModuleInterop: true`; module target `esnext`.
+
+**More Angular updates**:
+- Unit tests have been updated for the new builder and configuration: [#23460](https://github.com/abpframework/abp/pull/23460).
+
+**Warnings**:
+- Constructor injections migrated to Angular's `inject()` function. If you extend a class and previously called `super(...)` with injected params, remove those parameters. See: [Angular inject() migration](https://angular.dev/reference/migrations/inject-function).
+- `provideLogo` and `withEnvironmentOptions` have moved from LeptonX packages to `@abp/ng.theme-shared`.
+- If you use the new application builder and have `tsconfig.json` path mappings that point into `node_modules`, remove those mappings and prefer symlinks instead. See a symlink reference: [Creating symbolic links](https://hostman.com/tutorials/creating-symbolic-links-in-linux/).
+
+### Angular SSR support
+
+ABP Angular templates now support Server-Side Rendering (SSR) with the Angular Application Builder, enabling hybrid rendering (SSR + CSR) for improved first paint, SEO and perceived performance. This includes SSR-safe platform checks (no direct `window`/`location`/`localStorage`), OIDC auth compatibility via cookie-backed storage, and `TransferState` to prevent duplicate HTTP GETs during hydration. For implementation highlights and usage (including how to run the SSR dev server and the `transferStateInterceptor`), see the issue and PR: [Angular SSR](https://github.com/abpframework/abp/issues/23055), [Hybrid Rendering & Application Builder](https://github.com/abpframework/abp/pull/23416).
+
+> See Angular's official guide for details on hybrid rendering (prerender + SSR + CSR): [Angular SSR](https://angular.dev/guide/ssr) and on the builder migration: [Angular build system migration](https://angular.dev/tools/cli/build-system-migration).
+
+
+## Community News
+
+### Recent Events
+
+We recently hosted two sessions of ABP Community Talks:
+
+#### Community Talks 2025.06: Microservices with ABP Template
+
+The Easiest Way to Get Started with Microservices on .NET Using ABP Microservice Solution Template: a deep dive into ABP’s microservice template, showing how ABP Studio streamlines creating, running, and scaling distributed systems. See the event page: [Community Talks: Microservices with ABP Template](https://abp.io/community/events/community-talks/the-easiest-way-to-get-started-with-microservices-on-.net-using-abp-microservice-solution-template-fd2comfn).
+
+
+
+#### Community Talks 2025.07: Developer-Friendly CMS for .NET
+
+Beyond WordPress: A Developer-Friendly CMS for .NET: an overview of building custom web apps with ABP CMS Kit, integrating content management with your application code. Learn more: [Community Talks: Developer-Friendly CMS for .NET](https://abp.io/community/events/community-talks/beyond-wordpress-a-developerfriendly-cms-for-.net-mubtips6).
+
+
+
+### Weekly Webinar: Discover ABP Platform
+
+We’ve started a **weekly live webinar series** designed for developers who want to get the most out of the **ABP Platform**. This event is designed for those new to ABP to help you understand its core features, capabilities, and licensing models.
+
+
+
+Every webinar features live coding demos, practical examples, and an open Q&A segment where you can get your questions answered directly by the ABP team. Whether you’re just starting with ABP or looking to explore advanced scenarios, these sessions will help you build better apps faster.
+
+[👉 Register here to join an upcoming session!](https://abp.io/webinars/discover-abp-platform)
+
+### New ABP Community Articles
+
+There are exciting articles contributed by the ABP community as always. I will highlight some of them here:
+
+- [Alper Ebiçoğlu](https://abp.io/community/members/alper):
+ - [High-Performance .NET Libraries You Didn’t Know You Needed](https://abp.io/community/articles/high-performance-net-libraries-you-did-not-know-nu5t88sz)
+ - [.NET 10: What You Need to Know (LTS Release, Coming November 2025)](https://abp.io/community/articles/net-10-preview-features-breaking-changes-enhancements-xennnnky)
+ - [Best Free Alternatives to AutoMapper in .NET — Why We Moved to Mapperly](https://abp.io/community/articles/best-free-alternatives-to-automapper-in-net-l9f5ii8s)
+- [Liming Ma](https://abp.io/community/members/maliming):
+ - [Keep Track of Your Users in an ASP.NET Core Application](https://abp.io/community/articles/keep-track-of-your-users-in-an-asp.net-core-application-jlt1fxvb)
+ - [App Services vs Domain Services](https://abp.io/community/articles/app-services-vs-domain-services-4dvau41u)
+ - [Using Hangfire Dashboard in ABP API Website](https://abp.io/community/articles/using-hangfire-dashboard-in-abp-api-website--r32ox497)
+- [Fahri Gedik](https://abp.io/community/members/fahrigedik):
+ - [Backward‑Compatible REST APIs in .NET Microservices](https://abp.io/community/articles/backward-compatible-rest-apis-dotnet-microservices-9rzlb4q6)
+ - [Best Practices for Designing Backward‑Compatible REST APIs in a Microservice Solution for .NET Developers](https://abp.io/community/articles/best-practices-for-designing-backward‑compatible-rest-apis-in-a-microservice-solution-for-.net-developers-t1m4kzfa)
+ - [Stepbystep AWS Secrets Manager Integration in ABP](https://abp.io/community/articles/stepbystep-aws-secrets-manager-integration-in-abp-3dcblyix)
+- [Engincan Veske](https://abp.io/community/members/engincanv):
+ - [Building a Permission-Based Authorization System for ASP.NET Core](https://abp.io/community/articles/building-a-permission-based-authorization-system-for-asp-net-owyszy0b)
+ - [Where and How to Store Your Blob Objects in .NET](https://abp.io/community/articles/where-and-how-to-store-your-blob-objects-in-dotnet-r2r1vjjd)
+- [Salih Özkara](https://abp.io/community/members/salih):
+ - [Truly Layering a .NET Application Based on DDD Principles](https://abp.io/community/articles/truly-layering-a-net-application-based-on-ddd-principles-428jhn3a)
+- [Kori Francis](https://abp.io/community/members/kfrancis@clinicalsupportsystems.com):
+ - [ABP Postmark Email Integration, Templated Emails](https://abp.io/community/articles/abp-postmark-email-integration-templated-emails-gvgc6pfj)
+ - [Universal Redis Configuration in ABP Aspire Deployment](https://abp.io/community/articles/universal-redis-configuration-abp-aspire-deployment-qp90c7u4)
+- [Sajankumar Vijayan](https://abp.io/community/members/connect):
+ - [Multi-tenant SaaS apps, Cloudflare DNS](https://abp.io/community/articles/multi-tenant%20SaaS%20apps,%20Cloudflare%20DNs-dar977al)
+- [Selman Koc](https://abp.io/community/members/selmankoc):
+ - [Azure DevOps, CI/CD pipelines, Azure DevOps best practices](https://abp.io/community/articles/Azure%20DevOps,%20CI%2FCD%20pipelines,%20Azure%20DevOps%20best%20practices,-wiguy1ew)
+- [Sümeyye Kurtuluş](https://abp.io/community/members/sumeyye.kurtulus):
+ - [ABP Now Supports Angular Standalone Applications](https://abp.io/community/articles/abp-now-supports-angular-standalone-applications-zzi2rr2z)
+ - [Supercharge your Angular app: A developer's guide to unlock](https://abp.io/community/articles/supercharge-your-angular-app-a-developers-guide-to-unlock-0dmu7tkr)
+- [Mansur Besleney](https://abp.io/community/members/mansur.besleney):
+ - [Demystified Aggregates in DDD & .NET: From Theory to Practice](https://abp.io/community/articles/demystified-aggregates-in-ddd-and-dotnet-2becl93q)
+ - [How to Build Persistent Background Jobs with ABP Framework and Quartz](https://abp.io/community/articles/how-to-build-persistent-background-jobs-with-abp-framework-n9aloh93)
+ - [Angular Application Builder: Transitioning from Webpack to Esbuild](https://abp.io/community/articles/angular-application-builder-transitioning-from-webpack-to-3yzhzfl0)
+- [Muhammet Ali Özkaya](https://abp.io/community/members/m.aliozkaya):
+ - [Implementing Unit of Work with ASP.NET Core](https://abp.io/community/articles/implementing-unit-of-work-with-asp.net-core-lv4v2tyf)
+- [Enis Necipoğlu](https://abp.io/community/members/enisn):
+ - [Integration Services Explained: What They Are & When to Use](https://abp.io/community/articles/integration-services-explained-what-they-are-when-to-use-lienmsy8)
+- [Berkan Şaşmaz](https://abp.io/community/members/berkansasmaz):
+ - [How to Dynamically Set the Connection String in EF Core](https://abp.io/community/articles/how-to-dynamically-set-the-connection-string-in-ef-core-30k87fpj)
+- [Emre Kara](https://abp.io/community/members/emre.kara):
+ - [A Developer's Guide to Distributed Event Buses in .NET](https://abp.io/community/articles/a-developers-guide-to-distributed-event-buses-in-.net-oehl23kb)
+- [Oğuzhan Ağır](https://abp.io/community/members/oguzhan.agir):
+ - [In-Memory Background Job Queue in ASP.NET Core](https://abp.io/community/articles/in-memory-background-job-queue-aspnet-core-pai2zmtr)
+- [Alperen Samurlu](https://abp.io/community/members/alperen.samurlu):
+ - [How Can We Apply the DRY Principle in a Better Way?](https://abp.io/community/articles/how-can-we-apply-the-dry-principle-in-a-better-way-pmc4eao2)
+- [Ahmet Çelik](https://abp.io/community/members/ahmet.celik):
+ - [Best Practices Guide for REST API Design](https://abp.io/community/articles/best-practices-guide-for-rest-api-design-oexc1euj)
+- [Elanur Oğuz](https://abp.io/community/members/s.elanuroguz):
+ - [Web Design Basics for Graphic Designers Who Don't Code](https://abp.io/community/articles/web-design-basics-for-graphic-designers-who-dont-code-0c2jgt2v)
+- [Seda Şen](https://abp.io/community/members/seda.sen):
+ - [Color Psychology in Web Design](https://abp.io/community/articles/color-psychology-in-web-design-z383jph8)
+- [Halime Karayay](https://abp.io/community/members/halimekarayay):
+ - [10 Modern HTML CSS Techniques Every Designer Should Know](https://abp.io/community/articles/10-modern-html-css-techniques-every-designer-should-know-zxnwilf4)
+- [Anto Subash](https://abp.io/community/members/antosubash):
+ - [ABP React CMS Module: Building Dynamic Pages with Puck](https://abp.io/community/articles/abp-react-cms-module-building-dynamic-pages-with-puck-auxvrwgf)
+- [Yağmur Çelik](https://abp.io/community/members/yagmur.celik):
+ - [Integration Testing Best Practices for Building a Robust API](https://abp.io/community/articles/integration-testing-best-practices-for-building-a-robust-udcwef71)
+- [Suhaib Mousa](https://abp.io/community/members/suhaib-mousa):
+ - [Visual Studio 2026 - What's New and Why I'm Excited About It](https://abp.io/community/articles/visual-studio-2026-e4s5hed7)
+- [Alex Maiereanu](https://abp.io/community/members/alex.maiereanu@3sstudio.com):
+ - [ABP-Hangfire-AzurePostgreSQL](https://abp.io/community/articles/abphangfireazurepostgresql-s1jnf3yg)
+- [Jack Fistelmann](https://abp.io/community/members/jfistelmann):
+ - [ABP and maildev](https://abp.io/community/articles/abp-and-maildev-gy13cr1p)
+- Tarık Özdemir:
+ - [AI-First Architecture for .NET Projects: A Modern Blueprint](https://abp.io/community/articles/AI-First%20Architecture%20for%20.NET%20Projects%3A%20A%20Modern%20Blueprint-h2wgcoq3)
+- [Prabhjot Singh](https://abp.io/community/members/prabhjot):
+ - [Switching from Project References to Package References](https://abp.io/community/articles/switching-from-project-references-to-package-references-ql16qwx0)
+- [Yunus Emre Kalkan](https://abp.io/community/members/yekalkan):
+ - [New in ABP Studio: Docker Container Management](https://abp.io/community/articles/abp-studio-docker-container-management-ex7r27y8)
+- [Burak Demir](https://abp.io/community/members/burakdemir):
+ - [Solving MongoDB GUID Issues After an ABP Framework Upgrade](https://abp.io/community/articles/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n)
+
+Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
+
+## Conclusion
+
+This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/10.0/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v10.0 RC and provide feedback to help us release a more stable version.
+
+Thanks for being a part of this community!
\ No newline at end of file
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/abp-webinar.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/abp-webinar.png
new file mode 100644
index 0000000000..049aac018e
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/abp-webinar.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-06.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-06.png
new file mode 100644
index 0000000000..9993e2753b
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-06.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-07.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-07.png
new file mode 100644
index 0000000000..5a14d765f4
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-07.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/cover-image.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/cover-image.png
new file mode 100644
index 0000000000..5453dcd4e8
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/cover-image.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/discover-abp.svg b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/discover-abp.svg
new file mode 100644
index 0000000000..d5400ab44b
--- /dev/null
+++ b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/discover-abp.svg
@@ -0,0 +1,21 @@
+
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/elsa-workflow-instances.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/elsa-workflow-instances.png
new file mode 100644
index 0000000000..88a5697194
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/elsa-workflow-instances.png differ
diff --git a/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/studio-switch-to-preview.png b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/studio-switch-to-preview.png
new file mode 100644
index 0000000000..0c9b4d56ed
Binary files /dev/null and b/docs/en/Blog-Posts/2025-10-02 v10_0_Preview/studio-switch-to-preview.png differ
diff --git a/docs/en/Community-Articles/2022-04-18-abp-community-talks-20223/post.md b/docs/en/Community-Articles/2022-04-18-abp-community-talks-20223/post.md
index fcd7043594..5d9c9e0d3e 100644
--- a/docs/en/Community-Articles/2022-04-18-abp-community-talks-20223/post.md
+++ b/docs/en/Community-Articles/2022-04-18-abp-community-talks-20223/post.md
@@ -6,7 +6,7 @@
* ABP Community Talks are scheduled to be held on a monthly basis.
* ABP Community Talks are and always will be completely free to attend. Everyone is welcome to join, ask questions and make suggestions before, during and after the event.
* ABP Community Talks are created and announced on [Kommunity](https://kommunity.com/volosoft/events).
- * ABP Community Talks are announced regularly on [ABP Framework Twitter Account](https://twitter.com/abpframework), [Volosoft LinkedIn account](https://www.linkedin.com/company/volosoft), [Volosoft Facebook Account](https://www.facebook.com/volosoftcompany), [ABP Community Discord Server](https://discord.gg/CrYrd5vcGh). We highly encourage everyone to follow us and make suggestions.
+ * ABP Community Talks are announced regularly on [ABP Framework Twitter Account](https://twitter.com/abpframework), [Volosoft LinkedIn account](https://www.linkedin.com/company/volosoft), [Volosoft Facebook Account](https://www.facebook.com/volosoftcompany), [ABP Community Discord Server](https://abp.io/join-discord). We highly encourage everyone to follow us and make suggestions.
* ABP Community Talks are available to watch after the event on YouTube. See [ABP Community Talks YouTube Playlist](https://www.youtube.com/playlist?list=PLsNclT2aHJcOsPustEkzG6DywiO8eh0lB).
# ABP Community Talks 2022.3
diff --git a/docs/en/Community-Articles/2022-04-19-official-abp-discord-server-is-here/post.md b/docs/en/Community-Articles/2022-04-19-official-abp-discord-server-is-here/post.md
index 5d099cc1c3..ca765a5860 100644
--- a/docs/en/Community-Articles/2022-04-19-official-abp-discord-server-is-here/post.md
+++ b/docs/en/Community-Articles/2022-04-19-official-abp-discord-server-is-here/post.md
@@ -1,9 +1,9 @@
- We are excited to announce Official ABP Discord Server is created! You can join the ABP Discord Community by clicking [here](https://discord.gg/wbcQAsUrs9).
+ We are excited to announce Official ABP Discord Server is created! You can join the ABP Discord Community by clicking [here](https://abp.io/join-discord).
In the first week of opening ABP Discord Server, member amount reached more than 500. We are grateful to and blessed by your interest. Thanks to all of you! This also made us sure that an ABP Discord Server was actually a need for the community members to interact with each other.
ABP Community is growing by the second, and we are grateful for all your contributions towards ABP Framework. We noticed that ABP Community’s communication were significant on ABP Framework’s GitHub, we wanted to take it to the next level and have an area where all of us can easily chat with each other.
-> [Join ABP Discord Server Now](https://discord.gg/wbcQAsUrs9)
+> [Join ABP Discord Server Now](https://abp.io/join-discord)
# What Can You Do on ABP Community Discord Server?
@@ -42,11 +42,11 @@
# How Can You Join To ABP Discord Server?
- You can join ABP Discord Server by simply clicking to [https://discord.gg/abp](https://discord.gg/wbcQAsUrs9).
+ You can join ABP Discord Server by simply clicking to [https://abp.io/join-discord](https://abp.io/join-discord).
We are excited to welcome you in ABP Discord Server!
-> [Click Here to Join ABP Discord Server Now](https://discord.gg/wbcQAsUrs9)
+> [Click Here to Join ABP Discord Server Now](https://abp.io/join-discord)
### What is Discord?
@@ -62,4 +62,4 @@
In Discord Servers, users communicate with each other in a way that is convenient for them. Discord allows people to make voice calls, video chats, or simply text messages. Communities are created by wether fans of a specific topic(games, open-source frameworks, NFT, etc.) or by the official authorities of that specific topic(game creator, framework core team, creator of a token, etc).
- In ABP Community Discord Server’s case, it is a server created by official authorities with core team being present in the server along with the community members. Even though it is created for the framework community members to communicate with each other easily, everyone who is interested in following the latest news about ABP Platform are welcome to [join ABP Discord Server](https://discord.gg/wbcQAsUrs9)!
\ No newline at end of file
+ In ABP Community Discord Server’s case, it is a server created by official authorities with core team being present in the server along with the community members. Even though it is created for the framework community members to communicate with each other easily, everyone who is interested in following the latest news about ABP Platform are welcome to [join ABP Discord Server](https://abp.io/join-discord)!
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2022-05-10-abpio-platform-53-rc-has-been-published/post.md b/docs/en/Community-Articles/2022-05-10-abpio-platform-53-rc-has-been-published/post.md
index eb157010b8..cc0e57db93 100644
--- a/docs/en/Community-Articles/2022-05-10-abpio-platform-53-rc-has-been-published/post.md
+++ b/docs/en/Community-Articles/2022-05-10-abpio-platform-53-rc-has-been-published/post.md
@@ -254,4 +254,4 @@ We've created an official ABP Discord server so the ABP Community can interact w
Thanks to the ABP Community, **700+** people joined our Discord Server so far and it grows every day.
-You can join our Discord Server from [here](https://discord.gg/abp), if you haven't yet.
\ No newline at end of file
+You can join our Discord Server from [here](https://abp.io/join-discord), if you haven't yet.
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2023-02-21-abp-year-review-2022-wrap-up/post.md b/docs/en/Community-Articles/2023-02-21-abp-year-review-2022-wrap-up/post.md
index 6abf2f3d12..a27aeb9f2c 100644
--- a/docs/en/Community-Articles/2023-02-21-abp-year-review-2022-wrap-up/post.md
+++ b/docs/en/Community-Articles/2023-02-21-abp-year-review-2022-wrap-up/post.md
@@ -1,100 +1,200 @@
-
ABP Framework is an open source infrastructure that enables developers to create modern web applications by following the best practices and conventions of software development. In 2022, ABP Framework continued to thrive, achieving significant milestones and making waves in the software development community. With more than 9K GitHub stars and over 10 millions of downloads on NuGet, ABP Framework has become a go-to framework for developers seeking a reliable and efficient way to build web applications.
-
-
As ABP Team, we owe our success to our vibrant community, and we are immensely grateful for the support and contributions of each and every member. With your help, we achieved a lot in 2022. We remained committed to our values of transparency, openness, and collaboration, engaging with our community members as much as possible to ensure that we are creating a framework that meets their needs.
-
-
One of the major highlights of 2022 was the release of .NET Core 7, which provided a powerful platform for ABP Framework to build upon. Additionally, ABP Commercial and our training programs continued to help developers and businesses to leverage the power of the ABP Framework, enabling them to build modern web applications more efficiently and effectively than ever before.
-
-
In this article, we'll take a closer look at the key highlights of 2022 for ABP Framework, from major updates to achivements and the community insights. We are excited to share our progress with you and provide insights into how ABP Framework is continuing to shape the future of software development. So, let's dive in!
- br>
-
-
-
-
NuGet Downloads
-
NuGet is a package manager designed specifically for the .NET ecosystem. It simplifies the process of creating and consuming packages, thanks to the NuGet client tools. By using these tools, developers can easily manage their project dependencies and improve their workflow.
Implementing Domain Driven Design: You can download it for free from here.
-
Building Microservice Solutions: You can download it for free from here.
-
-
-
-
Tutorial Videos
-
In 2022, we tried to be as much active as we could. To give you more insight and let you understand ABP Framework with short videos according to your interests, we published 48 tutorial videos. Though the videos were created by overall team members of ABP Framework, someone deserves a special mention here. Shout out to our ABP Core Team member Hamza Albreem for his hard work.
ABP Framework GitHub repository reached more than 9K stars. We appreciate your interest and support for ABP Framework GitHub repository. We are working hard to be worthy of your interest and reach out to more people to simplify and streamline their development processes.
-
-
Community Talks
-
ABP Community Talks is our monthly event that brings together members of the ABP Framework community to discuss and exchange ideas. Prior to each event, we collect suggestions from our contributors, monitor trending topics in the industry, and review updates and news related to the ABP Platform to curate the topics for discussion. Once the topics are finalized, we announce them through our social media and community channels to ensure everyone is aware and can join in on the conversation.
The ABP Community is a hub that offers resources such as articles, video tutorials, and updates on ABP's development progress and events for ABP Framework, .NET, and software development. Developers can also connect with others, help each other, and share their expertise in ABP Community.
-
You can check out each source from the list below.
-
ABP Community Events: You can reach them from here.
ABP Community Videos: You can reach them from here.
-
ABP Community Stackoverflow: You can reach them from here.
-
-
In 2022, the community's contribution reached a point where more than 100 resources. Thank you for all your effort! Please keep it going! It is becoming a more and more rich resource thanks to your variety of contributions and help.
-
-
-
ABP Community Discord Server
-
To take community interaction to the next level, we created the official ABP Discord server, providing a platform for the ABP Community to connect and communicate instantly through chatting.
-
We were so excited announcing the official ABP Discord Server. In the first week of announcing it, the server quickly attracted over 500 members. We're grateful for your interest and support, which confirms the need for a dedicated platform for community interaction.
In 2022, ABP Core Team worked hard to achieve milestones and give the best value with ABP Framework so users can benefit from its features. Additional to our team's work, ABP Framework is perfected in 2022 with ABP Community members' contributions, 3157 commits pushed from 48 different contributors.
-
We appreciate your hard work and effort you put into making ABP Framework better and improved.
-
-
-
Events/Summits
-
We try to contribute to the developers community as much as we can since day 1. This year was no different. We tried to give value through sponsorships for developer communities. Especially with us leaving the pandemic behind every day, we try to keep up with the in-person events as well as online events. We plan to do more in next year. So, stay tuned!
ABP Framework released 4 versions from 5.1 to 7.1 in 2022. You can check the release logs from ABP Framework Release Logs.
-
The most important milestone in these releases is that we upgraded ABP Framework to .NET 7.0 in ABP v7.0.
-
Additionally, we switched to OpenIddict for the startup templates in ABP v6.0.
-
-
-
ABP Commercial
-
It has been a successful year for ABP Commercial as well as ABP Framework. We have already reached to more than 100 countries over the years of ABP Commercial's release. This year, we continued to be streamline businesses' development processes with ABP Commercial.
-
-
We have served to different sizes of businesses from more than 50 countries and more than 40 industries .
-
We performed 286 hours of training to simplify users' learning curve of ABP Framework.
-
1771 support tickets resolved in the premium support forum in which ABP Commercial users can ask their questions directly to ABP Core Team members via ABP Commercial Support Center in addition to community support we provide for ABP Framework users/developers.
-
We received 39 new testimonials, all from satisfied customers which led us to the other headline, Gartner Badges.
-
-
-
-
LeptonX Theme
-
The Lepton Theme is a module that offers a theme for abp.io-based applications, featuring an Admin Dashboard designed by the ABP Platform. We released a version we called LeptonX Theme which is an upgraded version of Lepton Theme. You can view a live preview of the LeptonX Theme. While the LeptonX theme is currently exclusive to ABP Commercial users, ABP Framework users can still access the Lite version. You can see the documentation for ABP LeptonX Theme light from here.
-
-
-
Gartner Badges
-
Gartner badges are given as an award to the listed softwares within their software review/suggestion platforms. To be able to get these awards, certain criterias have to be met such as ease of use, likelihood of recommend, functionality, etc. and they are calculated completely according to the users' real reviews.
-
In 2022, ABP Commercial reached to such success thanks to its users' support on Gartner, it has been recognized with 2 badges in Application Development category.
-
ABP Commercial was selected in the following platforms of Gartner:
-
Thank you all for all these recognition you deemed us worthy of.
+
ABP Framework is an open source infrastructure that enables developers to create modern web applications by following the best practices and conventions of software development. In 2022, ABP Framework continued to thrive, achieving significant milestones and making waves in the software development community. With more than 9K GitHub stars and over 10 millions of downloads on NuGet, ABP Framework has become a go-to framework for developers seeking a reliable and efficient way to build web applications.
+
+
+
+
As ABP Team, we owe our success to our vibrant community, and we are immensely grateful for the support and contributions of each and every member. With your help, we achieved a lot in 2022. We remained committed to our values of transparency, openness, and collaboration, engaging with our community members as much as possible to ensure that we are creating a framework that meets their needs.
+
+
+
+
One of the major highlights of 2022 was the release of .NET Core 7, which provided a powerful platform for ABP Framework to build upon. Additionally, ABP Commercial and our training programs continued to help developers and businesses to leverage the power of the ABP Framework, enabling them to build modern web applications more efficiently and effectively than ever before.
+
+
+
+
In this article, we'll take a closer look at the key highlights of 2022 for ABP Framework, from major updates to achivements and the community insights. We are excited to share our progress with you and provide insights into how ABP Framework is continuing to shape the future of software development. So, let's dive in!
+
+ br>
+
+
+
+
+
+
+
+
NuGet Downloads
+
+
NuGet is a package manager designed specifically for the .NET ecosystem. It simplifies the process of creating and consuming packages, thanks to the NuGet client tools. By using these tools, developers can easily manage their project dependencies and improve their workflow.
Implementing Domain Driven Design: You can download it for free from here.
+
+
Building Microservice Solutions: You can download it for free from here.
+
+
+
+
+
+
+
+
Tutorial Videos
+
+
In 2022, we tried to be as much active as we could. To give you more insight and let you understand ABP Framework with short videos according to your interests, we published 48 tutorial videos. Though the videos were created by overall team members of ABP Framework, someone deserves a special mention here. Shout out to our ABP Core Team member Hamza Albreem for his hard work.
ABP Framework GitHub repository reached more than 9K stars. We appreciate your interest and support for ABP Framework GitHub repository. We are working hard to be worthy of your interest and reach out to more people to simplify and streamline their development processes.
+
+
+
+
Community Talks
+
+
ABP Community Talks is our monthly event that brings together members of the ABP Framework community to discuss and exchange ideas. Prior to each event, we collect suggestions from our contributors, monitor trending topics in the industry, and review updates and news related to the ABP Platform to curate the topics for discussion. Once the topics are finalized, we announce them through our social media and community channels to ensure everyone is aware and can join in on the conversation.
The ABP Community is a hub that offers resources such as articles, video tutorials, and updates on ABP's development progress and events for ABP Framework, .NET, and software development. Developers can also connect with others, help each other, and share their expertise in ABP Community.
+
+
You can check out each source from the list below.
+
+
ABP Community Events: You can reach them from here.
ABP Community Videos: You can reach them from here.
+
+
ABP Community Stackoverflow: You can reach them from here.
+
+
+
+
In 2022, the community's contribution reached a point where more than 100 resources. Thank you for all your effort! Please keep it going! It is becoming a more and more rich resource thanks to your variety of contributions and help.
+
+
+
+
+
+
ABP Community Discord Server
+
+
To take community interaction to the next level, we created the official ABP Discord server, providing a platform for the ABP Community to connect and communicate instantly through chatting.
+
+
We were so excited announcing the official ABP Discord Server. In the first week of announcing it, the server quickly attracted over 500 members. We're grateful for your interest and support, which confirms the need for a dedicated platform for community interaction.
In 2022, ABP Core Team worked hard to achieve milestones and give the best value with ABP Framework so users can benefit from its features. Additional to our team's work, ABP Framework is perfected in 2022 with ABP Community members' contributions, 3157 commits pushed from 48 different contributors.
+
+
We appreciate your hard work and effort you put into making ABP Framework better and improved.
+
+
+
+
+
+
Events/Summits
+
+
We try to contribute to the developers community as much as we can since day 1. This year was no different. We tried to give value through sponsorships for developer communities. Especially with us leaving the pandemic behind every day, we try to keep up with the in-person events as well as online events. We plan to do more in next year. So, stay tuned!
ABP Framework released 4 versions from 5.1 to 7.1 in 2022. You can check the release logs from ABP Framework Release Logs.
+
+
The most important milestone in these releases is that we upgraded ABP Framework to .NET 7.0 in ABP v7.0.
+
+
Additionally, we switched to OpenIddict for the startup templates in ABP v6.0.
+
+
+
+
+
+
ABP Commercial
+
+
It has been a successful year for ABP Commercial as well as ABP Framework. We have already reached to more than 100 countries over the years of ABP Commercial's release. This year, we continued to be streamline businesses' development processes with ABP Commercial.
+
+
+
+
We have served to different sizes of businesses from more than 50 countries and more than 40 industries .
+
+
We performed 286 hours of training to simplify users' learning curve of ABP Framework.
+
+
1771 support tickets resolved in the premium support forum in which ABP Commercial users can ask their questions directly to ABP Core Team members via ABP Commercial Support Center in addition to community support we provide for ABP Framework users/developers.
+
+
We received 39 new testimonials, all from satisfied customers which led us to the other headline, Gartner Badges.
+
+
+
+
+
+
+
+
LeptonX Theme
+
+
The Lepton Theme is a module that offers a theme for abp.io-based applications, featuring an Admin Dashboard designed by the ABP Platform. We released a version we called LeptonX Theme which is an upgraded version of Lepton Theme. You can view a live preview of the LeptonX Theme. While the LeptonX theme is currently exclusive to ABP Commercial users, ABP Framework users can still access the Lite version. You can see the documentation for ABP LeptonX Theme light from here.
+
+
+
+
+
+
Gartner Badges
+
+
Gartner badges are given as an award to the listed softwares within their software review/suggestion platforms. To be able to get these awards, certain criterias have to be met such as ease of use, likelihood of recommend, functionality, etc. and they are calculated completely according to the users' real reviews.
+
+
In 2022, ABP Commercial reached to such success thanks to its users' support on Gartner, it has been recognized with 2 badges in Application Development category.
+
+
ABP Commercial was selected in the following platforms of Gartner:
+
+
Thank you all for all these recognition you deemed us worthy of.
+
diff --git a/docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md b/docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md
index 33dd9eb292..e5196dde34 100644
--- a/docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md
+++ b/docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md
@@ -51,7 +51,7 @@ public class MyBlazorWebAssemblyBundlingModule : AbpModule
options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global).AddContributors(typeof(MyModuleBundleScriptContributor));
// Style Bundles
- options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global).AddContributors(typeof(MyModuleBundleStyleBundleContributor));
+ options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global).AddContributors(typeof(MyModuleBundleStyleBundleContributor));
});
}
}
diff --git a/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/POST.md b/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/POST.md
new file mode 100644
index 0000000000..4fcb9860bc
--- /dev/null
+++ b/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/POST.md
@@ -0,0 +1,250 @@
+# Using Hangfire Dashboard in ABP API Website 🚀
+
+## Introduction
+
+In this article, I'll show you how to integrate and use the Hangfire Dashboard in an ABP API website.
+
+Typically, API websites use `JWT Bearer` authentication, but the Hangfire Dashboard isn't compatible with `JWT Bearer` authentication. Therefore, we need to implement `Cookies` and `OpenIdConnect` authentication for the Hangfire Dashboard access.
+
+## Creating a New ABP Demo Project 🛠️
+
+We'll create a new ABP Demo `Tiered` project that includes `AuthServer`, `API`, and `Web` projects.
+
+```bash
+abp new AbpHangfireDemoApp -t app --tiered
+```
+
+Now let's add the Hangfire Dashboard to the `API` project and configure it to use `Cookies` and `OpenIdConnect` authentication for accessing the dashboard.
+
+## Adding a New Hangfire Application 🔧
+
+We need to add a new Hangfire application to the `appsettings.json` file in the `DbMigrator` project:
+
+> **Note:** Replace `44371` with your `API` project's port.
+
+```json
+"OpenIddict": {
+ "Applications": {
+ //...
+ "AbpHangfireDemoApp_Hangfire": {
+ "ClientId": "AbpHangfireDemoApp_Hangfire",
+ "RootUrl": "https://localhost:44371/"
+ }
+ //...
+ }
+}
+```
+
+2. Update the `OpenIddictDataSeedContributor`'s `CreateApplicationsAsync` method in the `Domain` project to seed the new Hangfire application.
+
+```csharp
+ //Hangfire Client
+var hangfireClientId = configurationSection["AbpHangfireDemoApp_Hangfire:ClientId"];
+if (!hangfireClientId.IsNullOrWhiteSpace())
+{
+ var hangfireClientRootUrl = configurationSection["AbpHangfireDemoApp_Hangfire:RootUrl"]!.EnsureEndsWith('/');
+
+ await CreateApplicationAsync(
+ applicationType: OpenIddictConstants.ApplicationTypes.Web,
+ name: hangfireClientId!,
+ type: OpenIddictConstants.ClientTypes.Confidential,
+ consentType: OpenIddictConstants.ConsentTypes.Implicit,
+ displayName: "Hangfire Application",
+ secret: configurationSection["AbpHangfireDemoApp_Hangfire:ClientSecret"] ?? "1q2w3e*",
+ grantTypes: new List //Hybrid flow
+ {
+ OpenIddictConstants.GrantTypes.AuthorizationCode, OpenIddictConstants.GrantTypes.Implicit
+ },
+ scopes: commonScopes,
+ redirectUris: new List { $"{hangfireClientRootUrl}signin-oidc" },
+ postLogoutRedirectUris: new List { $"{hangfireClientRootUrl}signout-callback-oidc" },
+ clientUri: hangfireClientRootUrl,
+ logoUri: "/images/clients/aspnetcore.svg"
+ );
+}
+```
+
+3. Run the `DbMigrator` project to seed the new Hangfire application.
+
+### Adding Hangfire Dashboard to the `API` Project 📦
+
+1. Add the following packages and modules dependencies to the `API` project:
+
+```bash
+
+
+
+```
+
+```cs
+typeof(AbpBackgroundJobsHangfireModule),
+typeof(AbpAspNetCoreAuthenticationOpenIdConnectModule)
+```
+
+2. Add the `HangfireClientId` and `HangfireClientSecret` to the `appsettings.json` file in the `API` project:
+
+```csharp
+"AuthServer": {
+ "Authority": "https://localhost:44358",
+ "RequireHttpsMetadata": true,
+ "MetaAddress": "https://localhost:44358",
+ "SwaggerClientId": "AbpHangfireDemoApp_Swagger",
+ "HangfireClientId": "AbpHangfireDemoApp_Hangfire",
+ "HangfireClientSecret": "1q2w3e*"
+}
+```
+
+3. Add the `ConfigureHangfire` method to the `API` project to configure Hangfire:
+
+```csharp
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ var configuration = context.Services.GetConfiguration();
+ var hostingEnvironment = context.Services.GetHostingEnvironment();
+
+ //...
+
+ //Add Hangfire
+ ConfigureHangfire(context, configuration);
+ //...
+}
+
+private void ConfigureHangfire(ServiceConfigurationContext context, IConfiguration configuration)
+{
+ context.Services.AddHangfire(config =>
+ {
+ config.UseSqlServerStorage(configuration.GetConnectionString("Default"));
+ });
+}
+```
+
+4. Modify the `ConfigureAuthentication` method to add new `Cookies` and `OpenIdConnect` authentication schemes:
+
+```csharp
+private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
+{
+ context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+ .AddAbpJwtBearer(options =>
+ {
+ options.Authority = configuration["AuthServer:Authority"];
+ options.RequireHttpsMetadata = configuration.GetValue("AuthServer:RequireHttpsMetadata");
+ options.Audience = "AbpHangfireDemoApp";
+
+ options.ForwardDefaultSelector = httpContext => httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase)
+ ? CookieAuthenticationDefaults.AuthenticationScheme
+ : null;
+ })
+ .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
+ .AddAbpOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
+ {
+ options.Authority = configuration["AuthServer:Authority"];
+ options.RequireHttpsMetadata = Convert.ToBoolean(configuration["AuthServer:RequireHttpsMetadata"]);
+ options.ResponseType = OpenIdConnectResponseType.Code;
+
+ options.ClientId = configuration["AuthServer:HangfireClientId"];
+ options.ClientSecret = configuration["AuthServer:HangfireClientSecret"];
+
+ options.UsePkce = true;
+ options.SaveTokens = true;
+ options.GetClaimsFromUserInfoEndpoint = true;
+
+ options.Scope.Add("roles");
+ options.Scope.Add("email");
+ options.Scope.Add("phone");
+ options.Scope.Add("AbpHangfireDemoApp");
+
+ options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
+ });
+
+ //...
+}
+```
+
+5. Add a custom middleware and `UseAbpHangfireDashboard` after `UseAuthorization` in the `OnApplicationInitialization` method:
+
+```csharp
+//...
+app.UseAuthorization();
+
+app.Use(async (httpContext, next) =>
+{
+ if (httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase))
+ {
+ var authenticateResult = await httpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
+ if (!authenticateResult.Succeeded)
+ {
+ await httpContext.ChallengeAsync(
+ OpenIdConnectDefaults.AuthenticationScheme,
+ new AuthenticationProperties
+ {
+ RedirectUri = httpContext.Request.Path + httpContext.Request.QueryString
+ });
+ return;
+ }
+ }
+ await next.Invoke();
+});
+app.UseAbpHangfireDashboard("/hangfire", options =>
+{
+ options.AsyncAuthorization = new[]
+ {
+ new AbpHangfireAuthorizationFilter()
+ };
+});
+
+//...
+```
+
+Perfect! 🎉 Now you can run the `AuthServer` and `API` projects and access the Hangfire Dashboard at `https://localhost:44371/hangfire`.
+
+> **Note:** Replace `44371` with your `API` project's port.
+
+The first time you access the Hangfire Dashboard, you'll be redirected to the login page of the `AuthServer` project. After you log in, you'll be redirected back to the Hangfire Dashboard.
+
+
+
+## Key Points 🔑
+
+### 1. Authentication Scheme Selection
+
+The default authentication scheme in API websites is `JWT Bearer`. We've implemented `Cookies` and `OpenIdConnect` specifically for the Hangfire Dashboard.
+
+We've configured the `JwtBearerOptions`'s `ForwardDefaultSelector` to use `CookieAuthenticationDefaults.AuthenticationScheme` for Hangfire Dashboard requests.
+
+This means that if the request path starts with `/hangfire`, the request will be authenticated using the `Cookies` authentication scheme; otherwise, it will use the `JwtBearer` authentication scheme.
+
+```csharp
+options.ForwardDefaultSelector = httpContext => httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase)
+ ? CookieAuthenticationDefaults.AuthenticationScheme
+ : null;
+```
+
+### 2. Custom Middleware for Authentication
+
+We've also implemented a custom middleware to handle `Cookies` authentication for the Hangfire Dashboard. If the current request isn't authenticated with the `Cookies` authentication scheme, it will be redirected to the login page.
+
+```csharp
+app.Use(async (httpContext, next) =>
+{
+ if (httpContext.Request.Path.StartsWithSegments("/hangfire", StringComparison.OrdinalIgnoreCase))
+ {
+ var authenticateResult = await httpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
+ if (!authenticateResult.Succeeded)
+ {
+ await httpContext.ChallengeAsync(
+ OpenIdConnectDefaults.AuthenticationScheme,
+ new AuthenticationProperties
+ {
+ RedirectUri = httpContext.Request.Path + httpContext.Request.QueryString
+ });
+ return;
+ }
+ }
+ await next.Invoke();
+});
+```
+
+## References 📚
+
+- [ABP Hangfire Background Job Manager](https://abp.io/docs/latest/framework/infrastructure/background-jobs/hangfire)
+- [Use cookie authentication in ASP.NET Core](https://learn.microsoft.com/en-us/aspnet/core/security/authentication/cookie?view=aspnetcore-9.0)
diff --git a/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/gif.gif b/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/gif.gif
new file mode 100644
index 0000000000..e4fa879eb4
Binary files /dev/null and b/docs/en/Community-Articles/2025-06-20-Using-Hangfire-Dashboard-in-ABP-API-website/gif.gif differ
diff --git a/docs/en/Community-Articles/2025-07-17-summar-campaign/post.md b/docs/en/Community-Articles/2025-07-17-summar-campaign/post.md
new file mode 100644
index 0000000000..d1ac596c29
--- /dev/null
+++ b/docs/en/Community-Articles/2025-07-17-summar-campaign/post.md
@@ -0,0 +1,28 @@
+**It is going to get hotter with ABP’s Summer Campaign!**
+
+Since it’s summer time, we wanted to make it even hotter by announcing a summer campaign! From July 21 to 31 we are offering a 20% discount on all ABP licenses. Now is the best time to invest in ABP and start developing asp net applications faster without wasting your time with repetitive tasks.
+
+## Summer Campaign Terms
+
+Please review the following terms and conditions carefully.
+
+* This offer is available for extensions and new purchases.
+* Developer seat purchases are also included to the campaign.
+* Campaign is available from July 21st to July 31st.
+* Discounts are valid on selected licenses only.
+* This offer cannot be combined with other promotions or discounts.
+
+**Why Choose ABP?**
+
+ABP offers a powerful infrastructure, simplifying modern ASP.NET core development. It helps develop modern ASP.NET applications, including ASP.NET core MVC web applications, blazor front-end projects, and angular .NET Core solutions.
+
+-The core framework and pre-built modules are designed with microservice architecture in mind.
+-ABP provides a module system that allows you to develop reusable application modules.
+-Helps implement a DDD based layered architecture and build a maintainable code base.
+-Easily manage SaaS applications with integrated multi-tenancy, from database to UI.
+
+**This Offer Ends July 31, So Hurry Up!**
+
+This summer campaign is running from July 21 to July 31, so don’t miss your chance. Now is the perfect opportunity to enhance your asp net web development with ABP and benefit from our exclusive features.
+
+Get Your Discount Now: [https://abp.io/pricing?utm_source=abpwebsite&utm_medium=referral&utm_campaign=summer25_blog](https://abp.io/pricing?utm_source=abpwebsite&utm_medium=referral&utm_campaign=summer25_blog)
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/Drawings.pptx b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/Drawings.pptx
new file mode 100644
index 0000000000..7a59c08c25
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/Drawings.pptx differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/POST.md b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/POST.md
new file mode 100644
index 0000000000..e63db935a5
--- /dev/null
+++ b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/POST.md
@@ -0,0 +1,480 @@
+# Multi-Tenancy with Separate Databases in .NET and ABP Framework
+
+[Multi-tenancy](https://abp.io/architecture/multi-tenancy) is a common architectural concept for modern SaaS applications, enabling a single application to serve multiple customers (each known as a tenant) while maintaining data isolation, scalability, and operational efficiency. The "Separate database per tenant" approach offers the highest level of data isolation, making it ideal for scenarios with strict data privacy, security, and performance requirements.
+
+In this article, we’ll explore how to use this advanced multi-tenancy model using the powerful capabilities of the ABP Framework and the .NET platform.
+
+> In this article, I will use [ABP Studio](https://abp.io/studio) for creating the application. ABP Studio allows to select "separate database per tenant" option only for [commercial licenses](https://abp.io/pricing).
+
+## Understanding Database Models for a Multi-Tenant Application
+
+In the next sections, I will explain various models for database models of a multi-tenant solution:
+
+* Single (shared) Database Model
+* Separate Tenant Databases Model
+* Hybrid Multi-Tenant Database Model
+
+Let's start with the first one...
+
+### Single (shared) Database Model
+
+In the shared database model, all the application data stored in a single physical database. In the following diagram, you see different kind of users use the application, and the application stored their data in a main database:
+
+
+
+This is the default behavior when you [create a new ABP application](https://abp.io/docs/latest/get-started), because it is simple to begin with and proper for most applications.
+
+In this model, a single database table may contain data of multiple tenants. Each row in these tables have a `TenantId` field which is used to distinguish the tenant data and isolate a tenant's data from other tenant users. To make your entities multi-tenant aware, all you have to do is to implement the `IMultiTenant` interface provided by the ABP Framework.
+
+Here, is an example `Product` entity that should support multi-tenancy:
+
+````csharp
+using System;
+using Volo.Abp.Domain.Entities;
+using Volo.Abp.MultiTenancy;
+
+namespace MtDemoApp
+{
+ public class Product : AggregateRoot, IMultiTenant //Implementing the interface
+ {
+ public Guid? TenantId { get; set; } //Defined by the IMultiTenant interface
+ public string Name { get; set; }
+ public float Price { get; set; }
+ }
+}
+````
+
+In this way, ABP Framework automatically isolates data using the `TenantId` property. You don't need to care about how to set `TenantId` or filter data when you need to query from database - all automated.
+
+### Separate Tenant Databases Model
+
+In the separate tenant database model, each tenant has a dedicated physical database (with a separate connection string), as shown below:
+
+
+
+ABP Framework can automatically select the right database from the current user's tenant context. Again, it is completely automated. You just need to set a connection string for a tenant, as we will do later in this article.
+
+Even each tenant has a separate database, we still need to a main database to store host-side data, like a table of tenants, their connection strings and some other management data for tenants. Also, tenant-independent (or tenant-shared) application data is stored in the main database.
+
+### Hybrid Multi-Tenant Database Model
+
+Lastly, you may want to have a hybrid model, where some tenants shares a single database (they don't have separate databases) but some of them have dedicated databases. In the following figure, Tenant C has its own physical database, but all other tenants data stored in the main database of the application.
+
+
+
+ABP Framework handles the complexity: If a tenant has a separate database it uses that tenant's database, otherwise it filters the tenant data by the `TenantId` field in shared tables.
+
+## Understanding the Separate Tenant Schema Approach
+
+When you create a new ABP solution, it has a single `DbContext` class (for Entity Framework Core) by default. It also includes the necessary EF Core code-first database migrations to create and update the database. As a result of this approach, the main database schema (tables and their fields) will be identical with a tenant database schema. As a drawback of that, tenant databases have some tables that are not meaningful and not used. For example, Tenants table (a list of tenants) will be created in the tenant database, but will never be used (because tenant list is stored in the main database).
+
+As a solution to that problem, ABP Studio provides a "Use separate tenant schema" option on the Multi-Tenancy step of the solution creation wizard:
+
+
+
+This option is only available for the [Layered Monolith (optionally Modular) Solution Template](https://abp.io/docs/latest/get-started/layered-web-application). We don't provide that option in other templates, because:
+
+* [Single-Layer](https://abp.io/docs/latest/get-started/single-layer-web-application) template is recommended for more simpler applications with an easy-to-understand architecture. We don't want to add these kind of complications in that template.
+* [Microservice](https://abp.io/docs/latest/get-started/microservice) template already has a separate database for each service. Having multiple database schema (and multiple `DbContext` classes) for each service makes it over complicated without bringing much value.
+
+While you can manually convert your applications so they support separate database schema approach (ABP is flexible), it is not recommended to do it for these solution types.
+
+> Note that "Separate database per tenant" approach is already supported by default for the Single-Layer template too. "Separate tenant schema" is something different as I explained in this section.
+
+## Creating a new Application
+
+Follow the *[Get Started tutorial](https://abp.io/docs/latest/get-started/layered-web-application)* to create a new ABP application. Remember to select the "*Use separate tenant schema*" option since I want to demonstrate it in this article.
+
+## Understanding the DbContext Structure
+
+When you open the solution in your IDE, you will see the following structure under the `.EntityFrameworkCore` project:
+
+
+
+There are 3 DbContext-related classes here (MtDemoApp is your application name):
+
+* `MtDemoAppDbContext` class is used to map entities for the main (host + shared) database.
+* `MtDemoAppTenantDbContext` class is used to map entities for tenant that have separate physical databases.
+* `MtDemoAppDbContextBase` is an abstract base class for the classes explained above. In this way, you can configure common mapping logic here.
+
+Let's see these classes a bit closer...
+
+### The Main `DbContext` Class
+
+Here the main `DbContext` class:
+
+````csharp
+public class MtDemoAppDbContext : MtDemoAppDbContextBase
+{
+ public MtDemoAppDbContext(DbContextOptions options)
+ : base(options)
+ {
+ }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ builder.SetMultiTenancySide(MultiTenancySides.Both);
+
+ base.OnModelCreating(builder);
+ }
+}
+````
+
+* It inherits from the `MtDemoAppDbContextBase` as I mentioned before. So, any configuration made in the base class is also valid here.
+* `OnModelCreating` overrides the base method and sets the multi-tenancy side as `MultiTenancySides.Both`. `Both` means this database can store host data as well as tenant data. This is needed because we store data in this database for the tenants who don't have a separate database.
+
+### The Tenant `DbContext` class
+
+Here is the tenant-specific `DbContext` class:
+
+````csharp
+public class MtDemoAppTenantDbContext : MtDemoAppDbContextBase
+{
+ public MtDemoAppTenantDbContext(DbContextOptions options)
+ : base(options)
+ {
+ }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ builder.SetMultiTenancySide(MultiTenancySides.Tenant);
+
+ base.OnModelCreating(builder);
+ }
+}
+````
+
+The only difference is that we used `MultiTenancySides.Tenant` as the multi-tenancy side here, since this `DbContext` will only have entities/tables for tenants that have separate databases.
+
+### The Base `DbContext` Class
+
+Here is the base `DbContext` class:
+
+````csharp
+public abstract class MtDemoAppDbContextBase : AbpDbContext
+ where TDbContext : DbContext
+{
+
+ public MtDemoAppDbContextBase(DbContextOptions options)
+ : base(options)
+ {
+
+ }
+
+ protected override void OnModelCreating(ModelBuilder builder)
+ {
+ base.OnModelCreating(builder);
+
+ /* Include modules to your migration db context */
+
+ builder.ConfigurePermissionManagement();
+ builder.ConfigureSettingManagement();
+ builder.ConfigureBackgroundJobs();
+ builder.ConfigureAuditLogging();
+ builder.ConfigureIdentityPro();
+ builder.ConfigureOpenIddictPro();
+ builder.ConfigureFeatureManagement();
+ builder.ConfigureLanguageManagement();
+ builder.ConfigureSaas();
+ builder.ConfigureTextTemplateManagement();
+ builder.ConfigureBlobStoring();
+ builder.ConfigureGdpr();
+
+ /* Configure your own tables/entities inside here */
+
+ //builder.Entity(b =>
+ //{
+ // b.ToTable(MtDemoAppConsts.DbTablePrefix + "YourEntities", MtDemoAppConsts.DbSchema);
+ // b.ConfigureByConvention(); //auto configure for the base class props
+ // //...
+ //});
+
+ //if (builder.IsHostDatabase())
+ //{
+ // /* Tip: Configure mappings like that for the entities only
+ * available in the host side,
+ // * but should not be in the tenant databases. */
+ //}
+ }
+}
+````
+
+This `DbContext` class configures database mappings for all the [application modules](https://abp.io/docs/latest/modules) used by this application by calling their extension methods, like `builder.ConfigureBackgroundJobs()`. Each of these extension methods are defined as multi-tenancy aware and care about what you've set for the multi-tenancy side.
+
+### Where to Configure Your Entities?
+
+You can configure your entity mappings in the `OnModelCreating` method in any of the `DbContext` classes that was explained:
+
+* If you configure in the main `DbContext` class, these configuration will be valid only for the main database. So, don't configure tenant-related configuration here, otherwise, it won't be applied for the tenants who have separate databases.
+* If you configure in the tenant `DbContext` class, it will be valid only for the tenants with separate databases. You rarely need to do that. You typically want to make same configuration in the base `DbContext` to support hybrid scenarios (some tenants use the main (shared) database and some tenants have separate databases).
+* If you configure in the base `DbContext` class, it will be valid for the main database and tenant databases. You typically define tenant-related configuration here. That means, if you have a multi-tenant `Product` entity, then you should define its EF Core database mapping configuration here, so the Products table is created in the main database as well as in the tenant databases.
+
+The recommended approach is to configure all the mapping in the base class, but add controls like `builder.IsHostDatabase()` and `builder.IsTenantDatabase()` to conditionally configure the mappings:
+
+
+
+## Adding Database Migrations
+
+In this section, I will show how to configure your entity mappings, generate database migrations and apply to the database.
+
+### Defining an Entity
+
+Let's define a `Product` entity in the `.Domain` layer of your application:
+
+````csharp
+using System;
+using Volo.Abp.Domain.Entities;
+using Volo.Abp.MultiTenancy;
+
+namespace MtDemoApp
+{
+ public class Product : AggregateRoot, IMultiTenant
+ {
+ public Guid? TenantId { get; set; }
+ public string Name { get; set; }
+ public float Price { get; set; }
+ }
+}
+````
+
+### Configuring the Database Mapping
+
+Open the `MtDemoAppDbContextBase` class and add the following property to the class:
+
+````csharp
+public DbSet Products { get; set; }
+````
+
+Then add the following mapping code inside the `OnModelCreating` method (after all other existing code):
+
+````csharp
+builder.Entity(b =>
+{
+ b.ToTable(MtDemoAppConsts.DbTablePrefix + "Products", MtDemoAppConsts.DbSchema);
+ b.ConfigureByConvention(); //auto-configure for the base class props
+ b.Property(x => x.Name).IsRequired().HasMaxLength(100);
+});
+````
+
+We made the configuration in the base class since the `Products` table should be created in all databases, not only in the main database.
+
+>`DbTablePrefix` and `DbSchema` are optional and configurable in your application. You can change or remove them.
+
+### Add a New Database Migration for the Main Database
+
+To add a new EF Core database migration, we can use ABP Studio UI or EF Core command-line commands. I will show both of these approaches here.
+
+#### Using the ABP Studio "Add Migrations" UI
+
+You can right-click the `.EntityFrameworkCore` package in the ABP Studio's *Solution Explorer* panel and select *EF Core CLI* -> *Add Migration* command as shown below:
+
+
+
+You set a migration name on the opened dialog:
+
+
+
+If you select the *Update Database* checkbox it will apply changes to the database after generating the migration code.
+
+Lastly, select the main DbContext class for this migration:
+
+
+
+This dialog is shown when your application has multiple `DbContext` classes. Once you click the *OK* button, a new migration class is added under the `Migrations` folder of the `.EntityFrameworkCore` project (you can see in your coding editor):
+
+
+
+Since we selected the *Update Database* option, the database table is also created. The following screenshot shows the `AppProducts` table (`App` is the default prefix for your tables, but you can change or remove it) in Microsoft SQL Server Management Studio:
+
+
+
+#### Using a Command-Line Terminal
+
+If you prefer to use the command-line terminal (instead of ABP Studio UI), open a command-line terminal in the directory of the `.EntityFrameworkCore` project. As a shortcut, you can right-click the `.EntityFrameworkCore` project in ABP Studio, then select *Open with* -> *Terminal* command as shown in the following figure:
+
+
+
+Then you can use the [EF Core command-line tool](https://learn.microsoft.com/en-us/ef/core/cli/dotnet) to add a new database migration:
+
+````bash
+dotnet ef migrations add "Added_Product_Entity" --context MtDemoAppDbContext
+````
+
+It is important to set the `--context` parameter since we have two DbContext classes in the same project.
+
+After adding the migration, you can update the database:
+
+````bash
+dotnet ef database update "Added_Product_Entity" --context MtDemoAppDbContext
+````
+
+> If you are using Visual Studio, you can also use the [Package Manager Console](https://learn.microsoft.com/en-us/ef/core/cli/powershell) inside your IDE to add migrations and update the database.
+
+### Add a New Database Migration for the Tenant Database
+
+We added a database migration for the main (shared) database. We also need to add a new database migration for tenants who have separate databases.
+
+This time, no need to configure the DbContext since we did it in the base DbContext class, so it is valid for both of the DbContext classes. Just right-click the `.EntityFrameworkCore` package in the ABP Studio's *Solution Explorer* panel and select *EF Core CLI* -> *Add Migration* command as shown below:
+
+
+
+You can set the same or a different migration name here:
+
+
+
+The important part is to select the Tenant DbContext in the next dialog, because we want to change the tenant database this time:
+
+
+
+After clicking the *OK* button, it will add a new database migration class, but this time to the `TenantMigrations` folder:
+
+
+
+ABP Studio is smart enough to select the right folder name for the new migration by mapping with the DbContext name. However, you could manually type `TenantMigrations` in the *Output directory* textbox.
+
+Since we selected the *Update Database* option, it also applied changes to the database. But, which database? Interestingly, it automatically creates a second database for tenants with the project name + `_Tenant` suffix:
+
+
+
+> This new database is never used on runtime or production. It is only created to allow you to see the schema (tables and their fields) on development time to be sure that everything is as expected. As you see, some tables (like `Saas*` and `OpenIddict*`) are not available in that database, since they are used on the host side and only necessary to be in the main database.
+>
+> So, where is the real tenant database? If a tenant's database is dedicated (separate), it is created on runtime as I will explain in the *Managing Tenant Databases and Connection Strings* section later.
+
+You can see that database's connection string in the `appsettings.development.json` file of the `.DbMigrator` project in the solution. If you want to understand how it works, you can check source code of the `DbContextFactory` classes in the `.EntityFrameworkCore` project:
+
+
+
+These factory classes are used to create `DbContext` instances when you execute *Add Migration* and *Update Database* commands.
+
+## Managing Tenant Databases and Connection Strings
+
+Until now, we even didn't run the application. It is the time to do it.
+
+### Running the Application with ABP Studio
+
+You can run the `.Web` project in your IDE. But I prefer to use ABP Studio's *[Solution Runner](https://abp.io/docs/latest/studio/running-applications)* feature here. You can open the *Solution Runner* panel in *ABP Studio* and click the play icon near to the solution root (`MyDemoApp`):
+
+
+
+Once the application runs (and you see the blue link icon near to it), right click and select the *Browse* command:
+
+
+
+It will open the application's UI in the built-in browser of ABP Studio. You can Login the application (with `admin` as user name and `1q2w3E*` as the default password) and navigate to the *Saas* -> *Tenants* page.
+
+### Creating a New Tenant with the Shared Database
+
+The *Tenants* page of the [SaaS module](https://abp.io/modules/Volo.SaaS) is shown below:
+
+
+
+As you see, there is no tenant at the beginning. I can click the *+ New tenant* button to create the first tenant:
+
+
+
+On this screen, we can set the base tenant information. If you click the *Database connection strings* tab, you can see the following UI:
+
+
+
+For this first tenant, I will keep it as default and use the shared (main) database for this tenant's data. After clicking the *Save* button, the tenant is created and an initial [data seed](https://abp.io/docs/latest/framework/infrastructure/data-seeding) operation is automatically performed for us. To see an example, you can open the database, show rows of the `AbpUsers` table:
+
+
+
+As you see, a new `admin` user has been created with a `TenantId`. The first row is the `admin` user of the host side. So, ABP allows to define same user name in different tenants, because their data (users in this example) are completely isolated from each other.
+
+### Sign in with the new Tenant
+
+We created a new tenant. In this step, we will sign in with the new tenant's `admin` user to see the application UI by that new tenant. To do that, we should logout from the host admin user first. Click the user name (`admin`) on the top right area of the application and select the *Log out* command:
+
+
+
+Click the *Login* button again, which redirects you to the *Login* page:
+
+
+
+In this page, click the *switch* button near to the *TENANT* selection area and type `acme` as *Name*:
+
+
+
+Once you click the *Save* button, you are now in the acme tenant's context. You can see it on the *TENANT* selection area:
+
+
+
+> This kind of tenant switch feature is very useful in development to quickly change tenants to test your application. However, in production, you typically want to use subdomain/domain names or another mechanism to determine tenants automatically. When you configure domain based resolution, the tenant selection area is automatically disappears from the login page. You can check the [multi-tenant document](https://abp.io/docs/latest/framework/architecture/multi-tenancy) to learn how to configure it.
+
+After switching to the `acme` tenant, we can use `admin` as user name and the password you set during the tenant creation (I had set it as `1q2w3E*`) to login to the application.
+
+Here a screenshot from the *Roles* page after signing in as the `acme` tenant's `admin` user:
+
+
+
+> Notice that each tenant has its own roles, users, permissions, and other data. If you change roles here, it doesn't affect other tenants or the host side.
+>
+> Also, you can see that there are less menu items compared to host side. For example, tenant management page is not available for tenants as you can expect.
+
+### Switch Back to the Host Side
+
+To switch back to the host side to add a new tenant, logout from the application, click the *Login* button again to open the login page and then again click the *switch* button to change the current tenant context:
+
+
+
+In this dialog, clear the *Name* field and then *Save* the dialog to switch back to the host side. Then you can use the standard `admin` user name with `1q2w3E*` password to login to the application as the host administrator.
+
+### Creating a New Tenant with a Separate Database
+
+Finally, we came to the point that we will create a new tenant with a separate, dedicated database. Open the *Tenants* page of the SaaS module and click the *+ New tenant* button:
+
+
+
+Just fill these information as you wish, then open the *Database connection strings* tab:
+
+
+
+Uncheck the *Use the shared database* option and set a connection string to the *Default connection string* for this tenant. I used `Server=(LocalDb)\MSSQLLocalDB;Database=MtDemoApp_Volosoft;Trusted_Connection=True;TrustServerCertificate=true` as the connection string value. The database name is `MtDemoApp_Volosoft`. You can Test the connection string to be sure that it is a valid connection string.
+
+Once you click the *Save* button, the new tenant is created, a new database is created on the fly, all the database migrations are applied and the initial data seed is performed. You can open the SQL Server Management Studio to see the new database:
+
+
+
+You can check the tables (e.g. `AbpUsers`) to see that only this new tenant's data is stored in this database. To test the application, switch to the Volosoft tenant (as like explained in the *Sign in with the new Tenant* section before), create a new role or user and check the database.
+
+## Migrating Existing Tenant Databases
+
+In the previous section, we've seen that a tenant database is automatically created on runtime if you set a connection string for that tenant. Also, all the current migrations are automatically applied to the database, so it becomes up to date.
+
+But what about existing tenant databases when a new migration is added to the application? Maybe you have a few tenants with their separate databases, or you may have thousands of tenants with separate databases. How will you apply database schema changes to all of these databases?
+
+The startup template comes with a solution to this problem. There is a `.DbMigrator` console application in the solution that is responsible to apply schema (table and their fields) changes to all of the databases in the system (the main database and all the separate tenant databases). It also executes the data seeding if seed data is available. All you need to do is to execute this application on your production environment while deploying a new version of your application (of course, it is also very useful in the development environment). It checks and upgrades all the databases before the new version of your application is deployed.
+
+Here is the console log screen when I run the `.DbMigrator` application on my development environment:
+
+
+
+As you can see in the logs, it first migrates for the main (host) database, then migrates the tenant databases one by one. It doesn't make schema migration for the `acme` tenant since it has not a separate database, but uses the main database.
+
+In brief, when you make changes on your entity classes;
+
+1) Add a new migration for the main DbContext class as I explained in this article.
+2) Add a new migration for the tenant DbContext class as I explained in this article.
+3) Run the `.DbMigrator` application in your development environment to ensure all the databases are up to date.
+4) When you deploy your application to production or test environments, remember to run the `.DbMigrator` application first, then update your application. Or better, setup a CI/CD pipeline that automates this process. You can run the `.DbMigrator` every time while deploying the application, regardless of whether there is a schema change or not.
+
+> If you have too many tenants with separate database, then the migration process may take too much time. `.DbMigrator` provides the fundamental solution. But for more advanced scenarios or bigger systems, you can always develop your own solution. Just check the `.DbMigrator` application to understand how it was implemented. All the necessary code located in your solution, so you can easily understand and freely customize.
+
+## Conclusion
+
+In this article, I covered two important aspects of multi-tenant application development:
+
+* How ABP startup templates provide a multi-tenant application setup, so some tenants may store their data in a single (main, shared) database while some others may have their own dedicated database.
+* Demonstrate how it can manage database migration process on the fly for multiple databases.
+
+I started by defining different database models for multi-tenant applications (Single database, separate databases, and hybrid), showed how to create an ABP application that supports hybrid model, explained the DbContext structure that is coming with the solution template, demonstrated how to define entities, create and apply database migrations in such an application.
+
+I hope this article gives you a good understanding the problem and the solution provided by the ABP Framework. Please write your questions or comments under this article.
+
+Enjoy coding! :)
+
+## Further Reading
+
+* [ABP Multi-Tenancy document](https://abp.io/docs/latest/framework/architecture/multi-tenancy)
+* [Multi-Tenancy Architecture with .NET](https://abp.io/architecture/multi-tenancy)
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png
new file mode 100644
index 0000000000..9f3a0ce5ca
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-saas-tenants-page.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png
new file mode 100644
index 0000000000..17b89bee80
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-select-dbcontext.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png
new file mode 100644
index 0000000000..9ff5ea75f4
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration-set-name.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png
new file mode 100644
index 0000000000..fe59e93230
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-add-migration.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png
new file mode 100644
index 0000000000..3134203343
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-browse.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png
new file mode 100644
index 0000000000..dc1a993088
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-context-selection.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png
new file mode 100644
index 0000000000..17dd1fa4dd
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-open-with-terminal.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png
new file mode 100644
index 0000000000..a246d01c81
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/abp-studio-solution-runner.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png
new file mode 100644
index 0000000000..65f7aa5b48
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/acme-tenant-screen.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png
new file mode 100644
index 0000000000..a727bcea86
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-main-context.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png
new file mode 100644
index 0000000000..f77c5e1e75
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/added-product-entity-migration-tenant-context.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png
new file mode 100644
index 0000000000..8b913d4292
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/builder-check-tenant-side.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png
new file mode 100644
index 0000000000..b7f72d9a32
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbcontext-factories.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png
new file mode 100644
index 0000000000..648d9ccaa8
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/dbmigrator-logs.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png
new file mode 100644
index 0000000000..45930e7fb9
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/hybrid-database-multi-tenancy.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png
new file mode 100644
index 0000000000..5bb7ad8410
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/multi-tenancy-dbcontext-structure.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png
new file mode 100644
index 0000000000..76a2a33087
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-1.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png
new file mode 100644
index 0000000000..614689552e
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-2.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png
new file mode 100644
index 0000000000..5c6aee61d9
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-1.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png
new file mode 100644
index 0000000000..9404e38a26
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/new-tenant-dialog-conn-string-2.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png
new file mode 100644
index 0000000000..58ef8463f2
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/product-database-table.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png
new file mode 100644
index 0000000000..1ec6c36ad7
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png
new file mode 100644
index 0000000000..69c2bb4940
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-database-multi-tenancy.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png
new file mode 100644
index 0000000000..40c9c42770
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/separate-tenant-schema-option.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png
new file mode 100644
index 0000000000..4363dc792e
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/single-shared-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png
new file mode 100644
index 0000000000..e4e5f8943d
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-host-side.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png
new file mode 100644
index 0000000000..2828906d1e
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/switch-tenant-dialog.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png
new file mode 100644
index 0000000000..a08537ee4e
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-acme-name.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png
new file mode 100644
index 0000000000..32f7292e3c
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/tenant-database.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png
new file mode 100644
index 0000000000..39cdac5aaf
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-login.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png
new file mode 100644
index 0000000000..ae7885fa0e
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/user-logout.png differ
diff --git a/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png
new file mode 100644
index 0000000000..0433da73b5
Binary files /dev/null and b/docs/en/Community-Articles/2025-07-26-Separate-Tenant-Schema/users-table-new-tenant.png differ
diff --git a/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md b/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md
new file mode 100644
index 0000000000..eb69c93908
--- /dev/null
+++ b/docs/en/Community-Articles/2025-07-31-How-to-build-persistent-background-jobs-with-abp-framework-and-quartz/Post.md
@@ -0,0 +1,548 @@
+
+# How to Build Persistent Background Jobs with ABP Framework and Quartz
+
+## Introduction
+
+In modern SaaS applications, automated background processing is essential for delivering reliable user experiences. Whether you're sending subscription reminders, processing payments, or generating reports, background jobs ensure critical tasks happen on schedule without blocking your main application flow.
+
+### What is `Quartz.NET`?
+
+`Quartz.NET` is a powerful, open-source job scheduling library for .NET applications that provides cron-based scheduling for complex time patterns, job persistence across application restarts, clustering support for high-availability scenarios, flexible trigger types, and the ability to pass parameters to jobs through job data maps. It's the de facto standard for enterprise-grade job scheduling in the .NET ecosystem.
+
+### Quartz Storage Options: In-Memory vs Persistent
+
+When configuring **Quartz**, you have two primary storage options, each with significant implications for how your application behaves:
+
+### 🧠 In-Memory Storage (`RAMJobStore`)
+- Keeps all job information in application memory.
+- **Very fast** – no database overhead.
+- **Volatile** – all jobs, triggers, and schedules are lost when the application stops or restarts.
+- Best suited for:
+ - Development environments.
+ - Scenarios where job loss is acceptable.
+
+### 🗃️ Persistent Storage (`JobStoreTX` or similar)
+- Stores all job information in a database.
+- **Reliable** – schedules persist across:
+ - Application restarts
+ - Server crashes
+ - Deployments
+- **Supports horizontal scaling** – multiple application instances can share the same job queue.
+- **Slight performance overhead** due to database I/O.
+- Best choice for:
+ - Production systems.
+ - Any scenario where **business continuity and reliability** are critical.
+
+### How ABP Simplifies Quartz Integration
+
+ABP handles Quartz configuration, dependency injection, and lifecycle management automatically. Developers define jobs using `QuartzBackgroundWorkerBase` and access services via `ICachedServiceProvider`, following ABP's standard conventions and leveraging optimal service caching for background job scenarios.
+
+### Benefits of the Integration
+
+- Full support for ABP’s cross-cutting concerns (e.g., multi-tenancy, localization)
+- Robust scheduling powered by Quartz
+- Built-in logging, error handling, and performance monitoring
+- Scales easily without modifying business logic
+
+### Real-World Use Case: Subscription Reminders
+
+In this tutorial, we'll build a subscription reminder system that monitors client subscriptions, identifies those nearing expiration, sends professional email reminders seven days before expiration, tracks reminder history to prevent duplicates, and runs automatically every day at 9:00 AM using Quartz scheduling with PostgreSQL persistence. This system demonstrates how ABP and Quartz work together to solve real business problems with clean, maintainable code that follows enterprise-grade patterns.
+
+## Installing and Configuring Quartz
+
+Getting Quartz up and running in an ABP application is straightforward thanks to ABP's dedicated integration package. We'll replace the default background job system with Quartz for persistent job storage and robust scheduling capabilities.
+
+### Adding the Quartz Package
+
+The easiest way to add Quartz support to your ABP application is using the ABP CLI. Open a terminal in your project directory and run:
+
+```bash
+abp add-package Volo.Abp.BackgroundWorkers.Quartz
+```
+
+This command automatically adds the necessary NuGet package reference and updates your module dependencies. The ABP CLI handles all the heavy lifting, ensuring you get the correct version that matches your ABP Framework version.
+
+### Configuring Quartz for Persistent Storage
+
+Once the package is installed, you need to configure Quartz to use your database (in my case it is PostgreSQL) for job persistence. This configuration goes in your main module's `PreConfigureServices` method:
+
+```csharp
+[DependsOn(
+ // ... other dependencies
+ typeof(AbpBackgroundJobsQuartzModule),
+ typeof(AbpBackgroundWorkersQuartzModule)
+)]
+public class MySaaSApplicationModule : AbpModule
+{
+ public override void PreConfigureServices(ServiceConfigurationContext context)
+ {
+ var hostingEnvironment = context.Services.GetHostingEnvironment();
+ var configuration = context.Services.GetConfiguration();
+
+ ConfigureAuthentication(context, configuration);
+ ConfigureUrls(configuration);
+ ConfigureImpersonation(context, configuration);
+ ConfigureQuartz(); // Add this line
+ }
+
+ private void ConfigureQuartz()
+ {
+ PreConfigure(options =>
+ {
+ options.Properties = new NameValueCollection
+ {
+ ["quartz.scheduler.instanceName"] = "QuartzScheduler",
+ ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz",
+ ["quartz.jobStore.tablePrefix"] = "qrtz_",
+ ["quartz.jobStore.dataSource"] = "myDS",
+ ["quartz.dataSource.myDS.connectionString"] = _configuration.GetConnectionString("Default"),
+ ["quartz.dataSource.myDS.provider"] = "Npgsql",
+ ["quartz.serializer.type"] = "json"
+ };
+ });
+ }
+}
+```
+
+This configuration tells Quartz to store all job information in your PostgreSQL database using tables prefixed with "qrtz_". The key points are:
+
+- **Job Store Type**: Uses ADO.NET with transaction support for reliable job persistence
+- **Connection String**: Shares your application's existing database connection
+- **Table Prefix**: Keeps Quartz tables separate with the "qrtz_" prefix
+- **JSON Serialization**: Makes job data readable and debuggable
+- **PostgreSQL Provider**: Uses Npgsql for optimal PostgreSQL integration
+
+When your application starts, ABP automatically initializes the Quartz scheduler with these settings. Any background workers you create will be registered and scheduled automatically, with their state persisted to the database for reliability across application restarts.
+
+For detailed installation options and advanced configuration scenarios, check the official [ABP documentation.](https://abp.io/docs/latest/framework/infrastructure/background-workers/quartz)
+
+
+## Database Setup for Quartz
+
+With Quartz configured for persistent storage, we need to create the necessary database tables where Quartz will store job definitions, triggers, and execution history. Rather than running SQL scripts directly against the database, we'll use Entity Framework migrations to maintain consistency with ABP's database management approach.
+
+### Creating an Empty Migration for Quartz Tables
+
+Instead of executing raw SQL scripts against the database, we created an empty Entity Framework migration and populated it with the required Quartz table definitions. This approach keeps all database changes within the migration system, ensuring they're version-controlled, repeatable, and consistent across different environments.
+
+To create the empty migration, we used the standard Entity Framework CLI command:
+
+```bash
+dotnet ef migrations add AddQuartzTables
+```
+
+This generates a new migration file with empty `Up` and `Down` methods that we can populate with the Quartz table creation scripts.
+
+### Adding Quartz SQL Schema to Migration
+
+Once the empty migration was created, we populated it with the PostgreSQL-specific SQL needed to create all Quartz tables. The SQL scripts were obtained from the official Quartz repository, which provides database schema scripts for various database providers:
+
+```csharp
+public partial class AddQuartzTables : Migration
+{
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql(@"
+ CREATE TABLE qrtz_job_details (
+ sched_name VARCHAR(120) NOT NULL,
+ job_name VARCHAR(200) NOT NULL,
+ job_group VARCHAR(200) NOT NULL,
+ description VARCHAR(250) NULL,
+ job_class_name VARCHAR(250) NOT NULL,
+ is_durable BOOLEAN NOT NULL,
+ is_nonconcurrent BOOLEAN NOT NULL,
+ is_update_data BOOLEAN NOT NULL,
+ requests_recovery BOOLEAN NOT NULL,
+ job_data BYTEA NULL,
+ PRIMARY KEY (sched_name, job_name, job_group)
+ );
+
+ CREATE TABLE qrtz_triggers (
+ sched_name VARCHAR(120) NOT NULL,
+ trigger_name VARCHAR(200) NOT NULL,
+ trigger_group VARCHAR(200) NOT NULL,
+ job_name VARCHAR(200) NOT NULL,
+ job_group VARCHAR(200) NOT NULL,
+ -- ... additional columns and constraints
+ PRIMARY KEY (sched_name, trigger_name, trigger_group),
+ FOREIGN KEY (sched_name, job_name, job_group) REFERENCES qrtz_job_details(sched_name, job_name, job_group)
+ );
+
+ -- Additional tables: qrtz_simple_triggers, qrtz_cron_triggers,
+ -- qrtz_simprop_triggers, qrtz_blob_triggers, qrtz_calendars,
+ -- qrtz_paused_trigger_grps, qrtz_fired_triggers, qrtz_scheduler_state, qrtz_locks
+ ");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql(@"
+ DROP TABLE IF EXISTS qrtz_locks;
+ DROP TABLE IF EXISTS qrtz_scheduler_state;
+ -- ... drop all other Quartz tables in reverse order
+ DROP TABLE IF EXISTS qrtz_triggers;
+ DROP TABLE IF EXISTS qrtz_job_details;
+ ");
+ }
+}
+```
+
+The complete SQL scripts for all supported database providers, including PostgreSQL, MySQL, SQL Server, and others, can be found in the official `Quartz.NET` repository. You should use the script that matches your specific database provider and version requirements.
+
+### Why Use Migrations Instead of Direct SQL Scripts?
+
+This migration-based approach offers several important advantages over running SQL scripts directly:
+
+**Version Control Integration**: The migration becomes part of your codebase, tracked in source control alongside your application changes. This means every developer and deployment environment gets the exact same database schema.
+
+**Rollback Capability**: The `Down` method provides a clean way to remove Quartz tables if needed, something that's much harder to manage with standalone SQL scripts.
+
+**Environment Consistency**: Whether you're setting up a development machine, staging server, or production deployment, running DBMigrator or `dotnet ef database update` command ensures the same schema is created everywhere.
+
+**Integration with ABP's Database Management**: This approach aligns perfectly with how ABP manages all other database changes, keeping your database evolution strategy consistent.
+
+The Quartz tables created by this migration handle all aspects of job persistence - from storing job definitions and triggers to tracking execution history and managing scheduler state. With these tables in place, your Quartz scheduler can reliably persist jobs across application restarts and coordinate work across multiple application instances if needed.
+
+After creating this migration, running DBMigrator `dotnet ef database update` will create all the necessary Quartz infrastructure in your PostgreSQL database, ready to store and manage your background jobs.
+
+For complete SQL scripts for your specific database provider, visit the official [Quartz documentation.](https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html#creating-and-initializing-database)
+## Building the Business Logic
+
+Before implementing our Quartz background job, we needed to create the essential business entities and services that our subscription reminder system would work with. Since this article focuses on Quartz integration rather than general ABP development patterns, we'll keep this section brief and move quickly to the background job implementation.
+
+### Core Entities and Services
+
+For our subscription reminder system, we created the following core components:
+
+**Entities:**
+- **`Client`**: Represents customers with subscription information (Name, Email, SubscriptionEnd, IsActive)
+- **`ReminderLog`**: Tracks when reminder emails have been sent to prevent duplicates
+
+**Application Services:**
+- **`ClientAppService`**: Handles CRUD operations and provides methods to find clients with expiring subscriptions
+- **`ReminderLogAppService`**: Manages reminder history and prevents duplicate notifications
+- **`EmailService`**: Sends professional HTML reminder emails via SMTP
+
+**Data Transfer Objects (DTOs):**
+- Complete set of DTOs for both entities following ABP conventions
+- Input/output DTOs for all service operations
+
+### Business Logic Overview
+
+The system follows standard ABP patterns with entities inheriting from `FullAuditedAggregateRoot`, services implementing `ICrudAppService` interfaces, and proper AutoMapper configurations for entity-DTO mapping. We also included a data seeder to create sample clients for testing purposes.
+
+The key business methods our background job will use are:
+- `GetExpiringClientsAsync()` - Finds clients whose subscriptions expire in the next 7 days
+- `CreateAsync()` - Logs when a reminder has been sent
+- `SendSubscriptionExpiryReminderAsync()` - Sends professional email reminders
+
+### Focus on Background Operations
+
+Rather than diving deep into ABP entity creation, repository patterns, or service layer implementation details, we'll move directly to the heart of this article: implementing robust background jobs with Quartz. The entities and services we created simply provide the business context for our background job to operate within.
+
+The real value of this tutorial lies in showing how ABP's `QuartzBackgroundWorkerBase` integrates seamlessly with your business logic to create reliable, persistent background operations that survive application restarts and scale across multiple instances.
+
+Let's now implement the background job that ties everything together and demonstrates the power of ABP + Quartz integration.
+
+
+## Implementing the Background Job (The ABP Way)
+
+This is where the magic happens. ABP's integration with Quartz provides a clean, powerful way to create background jobs that follow framework conventions while leveraging Quartz's robust scheduling capabilities. Let's dive into how we implemented our subscription reminder job and explore the advanced features ABP provides.
+
+### Creating a QuartzBackgroundWorkerBase Job
+
+Instead of implementing Quartz's raw `IJob` interface, ABP provides `QuartzBackgroundWorkerBase`, which integrates seamlessly with ABP's dependency injection, logging, and lifecycle management systems:
+
+```csharp
+public class SubscriptionExpiryNotifierJob : QuartzBackgroundWorkerBase
+{
+ public SubscriptionExpiryNotifierJob()
+ {
+ // Configure the job to run daily at 9:00 AM
+ JobDetail = JobBuilder.Create()
+ .WithIdentity(nameof(SubscriptionExpiryNotifierJob))
+ .Build();
+
+ Trigger = TriggerBuilder.Create()
+ .WithIdentity(nameof(SubscriptionExpiryNotifierJob))
+ .WithCronSchedule("0 0 9 * * ?") // Every day at 9:00 AM
+ .Build();
+
+ ScheduleJob = async scheduler =>
+ {
+ if (!await scheduler.CheckExists(JobDetail.Key))
+ {
+ await scheduler.ScheduleJob(JobDetail, Trigger);
+ }
+ };
+ }
+
+ public override async Task Execute(IJobExecutionContext context)
+ {
+ // Use ICachedServiceProvider for better performance and proper scoping
+ var serviceProvider = ServiceProvider.GetRequiredService();
+
+ // These services will be cached and reused throughout the job execution
+ var clientAppService = serviceProvider.GetRequiredService();
+ var reminderLogAppService = serviceProvider.GetRequiredService();
+ var emailService = serviceProvider.GetRequiredService();
+
+ Logger.LogInformation("🔄 Starting subscription expiry notification job...");
+
+ // 1. Get clients expiring in 7 days
+ var expiringClients = await clientAppService.GetExpiringClientsAsync(7);
+
+ Logger.LogInformation("📋 Found {Count} clients with expiring subscriptions", expiringClients.Count);
+
+ // 2. Process each client
+ foreach (var client in expiringClients)
+ {
+ await ProcessClientAsync(client, emailService, reminderLogAppService);
+ }
+
+ Logger.LogInformation("✅ Job completed successfully");
+ }
+}
+```
+
+### Key Implementation Features
+
+**Constructor-Based Configuration**: Unlike traditional Quartz jobs that require external scheduling code, ABP's approach lets you define both the job and its schedule directly in the constructor. This keeps related configuration together and makes the job self-contained.
+
+**ABP Service Integration**: The `ICachedServiceProvider` gives you access to any service in ABP's dependency injection container, enabling you to use application services, repositories, domain services, or any other ABP component with optimized caching and proper scoping.
+
+**Built-in Logging**: The `Logger` property provides access to ABP's logging infrastructure, automatically including context like correlation IDs and tenant information in multi-tenant applications.
+
+**Custom Scheduling Logic**: The `ScheduleJob` property allows you to customize how the job gets registered with Quartz. In our example, we check if the job already exists before scheduling it, preventing duplicate registrations during application restarts.
+
+### Understanding Quartz Trigger Types
+
+Quartz provides several trigger types to handle different scheduling requirements. Choosing the right trigger type is crucial for your job's behavior and performance.
+
+#### CronTrigger - Complex Time-Based Scheduling
+
+CronTrigger uses cron expressions for sophisticated scheduling patterns. This is what we used for our daily subscription reminders:
+
+```csharp
+// Daily at 9:00 AM
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("DailyReminder")
+ .WithCronSchedule("0 0 9 * * ?")
+ .Build();
+
+// Every weekday at 2:30 PM
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("WeekdayReport")
+ .WithCronSchedule("0 30 14 ? * MON-FRI")
+ .Build();
+
+// First day of every month at midnight
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("MonthlyCleanup")
+ .WithCronSchedule("0 0 0 1 * ?")
+ .Build();
+```
+
+**Cron Expression Format**: `Seconds Minutes Hours Day-of-Month Month Day-of-Week Year(optional)`
+- `0 0 9 * * ?` = 9:00 AM every day
+- `0 */15 * * * ?` = Every 15 minutes
+- `0 0 12 ? * SUN` = Every Sunday at noon
+
+#### SimpleTrigger - Interval-Based Scheduling
+
+SimpleTrigger is perfect for jobs that need to run at regular intervals or a specific number of times:
+
+```csharp
+// Run every 30 seconds indefinitely
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("HealthCheck")
+ .StartNow()
+ .WithSimpleSchedule(x => x
+ .WithIntervalInSeconds(30)
+ .RepeatForever())
+ .Build();
+
+// Run every 5 minutes, but only 10 times
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("LimitedRetry")
+ .StartNow()
+ .WithSimpleSchedule(x => x
+ .WithIntervalInMinutes(5)
+ .WithRepeatCount(9)) // 0-based, so 9 = 10 executions
+ .Build();
+
+// One-time execution after 1 hour delay
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("DelayedCleanup")
+ .StartAt(DateTimeOffset.UtcNow.AddHours(1))
+ .Build();
+```
+
+#### CalendarIntervalTrigger - Calendar-Aware Intervals
+
+CalendarIntervalTrigger handles intervals that need to respect calendar boundaries:
+
+```csharp
+// Every month on the same day (handles varying month lengths)
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("MonthlyBilling")
+ .WithCalendarIntervalSchedule(x => x
+ .WithIntervalInMonths(1))
+ .Build();
+
+// Every week, starting Monday
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("WeeklyReport")
+ .WithCalendarIntervalSchedule(x => x
+ .WithIntervalInWeeks(1))
+ .Build();
+```
+
+#### DailyTimeIntervalTrigger - Time Windows
+
+DailyTimeIntervalTrigger runs jobs within specific time windows on certain days:
+
+```csharp
+// Every 2 hours between 8 AM and 6 PM, Monday through Friday
+Trigger = TriggerBuilder.Create()
+ .WithIdentity("BusinessHoursSync")
+ .WithDailyTimeIntervalSchedule(x => x
+ .OnMondayThroughFriday()
+ .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0))
+ .EndingDailyAt(TimeOfDay.HourAndMinuteOfDay(18, 0))
+ .WithIntervalInHours(2))
+ .Build();
+```
+
+### Choosing the Right Trigger Type
+
+For different scenarios, you'd choose different trigger types:
+
+- **Daily/Weekly/Monthly Operations**: Use **CronTrigger** for maximum flexibility
+- **High-Frequency Tasks**: Use **SimpleTrigger** for performance (every few seconds/minutes)
+- **Business Calendar Operations**: Use **CalendarIntervalTrigger** for month-end reports, quarterly tasks
+- **Business Hours Operations**: Use **DailyTimeIntervalTrigger** for operations that should only run during specific hours
+
+### Automatic Job Registration
+
+One of ABP's most powerful features is automatic job discovery and registration. When your application starts, ABP automatically:
+
+1. **Scans for Background Workers**: ABP discovers all classes inheriting from `QuartzBackgroundWorkerBase`
+2. **Registers with DI Container**: Each job is registered as a service in the dependency injection container
+3. **Schedules with Quartz**: ABP calls the `ScheduleJob` delegate to register the job with the Quartz scheduler
+4. **Handles Lifecycle**: ABP manages starting and stopping jobs with the application lifecycle
+
+This means you simply create your job class, and ABP handles everything else. No manual registration, no startup code, no configuration files - it just works.
+
+### Understanding Misfire Handling
+
+Misfires occur when a scheduled job cannot execute at its intended time, typically due to system downtime, resource constraints, or the scheduler being paused. Quartz provides several misfire instructions to handle these scenarios:
+
+#### CronTrigger Misfire Instructions
+
+For cron-based schedules like our daily reminder job, Quartz offers these misfire behaviors:
+
+**`MisfireInstruction.DoNothing`** (Default):
+```csharp
+Trigger = TriggerBuilder.Create()
+ .WithIdentity(nameof(SubscriptionExpiryNotifierJob))
+ .WithCronSchedule("0 0 9 * * ?", x => x.WithMisfireHandlingInstructionDoNothing())
+ .Build();
+```
+- Skips all missed executions
+- Waits for the next naturally scheduled time
+- Best for jobs where missing executions is acceptable
+
+**`MisfireInstruction.FireOnceNow`**:
+```csharp
+.WithCronSchedule("0 0 9 * * ?", x => x.WithMisfireHandlingInstructionFireAndProceed())
+```
+- Immediately executes one missed job upon recovery
+- Then continues with the normal schedule
+- Useful when you need to catch up on missed work
+
+**`MisfireInstruction.IgnoreMisfires`**:
+```csharp
+.WithCronSchedule("0 0 9 * * ?", x => x.WithMisfireHandlingInstructionIgnoreMisfires())
+```
+- Executes all missed jobs immediately upon recovery
+- Can cause a burst of executions after extended downtime
+- Use carefully to avoid overwhelming the system
+
+#### SimpleTrigger Misfire Instructions
+
+Simple triggers have their own set of misfire behaviors:
+
+**`MisfireInstruction.FireNow`**: Execute immediately when recovered
+**`MisfireInstruction.RescheduleNowWithExistingRepeatCount`**: Start over with remaining repeat count
+**`MisfireInstruction.RescheduleNowWithRemainingRepeatCount`**: Continue as if no misfire occurred
+**`MisfireInstruction.RescheduleNextWithExistingCount`**: Wait for next interval, keep original repeat count
+
+### Real-World Misfire Considerations
+
+For our subscription reminder system, we chose the default `DoNothing` behavior because:
+
+- **Business Logic**: Sending yesterday's reminder today might confuse customers
+- **Duplicate Prevention**: Our job checks for existing reminders, so running late won't cause duplicate emails
+- **Resource Management**: We avoid overwhelming the email system after extended downtime
+
+However, for other scenarios you might choose differently:
+- **Financial reporting**: Use `FireOnceNow` to ensure reports are always generated
+- **Data synchronization**: Use `IgnoreMisfires` to process all missed sync operations
+- **Cache warming**: Use `DoNothing` since stale cache warming provides no value
+
+### Advanced Job Features
+
+**Error Handling and Resilience**: Our job implementation includes comprehensive error handling for individual client processing, ensuring one failed email doesn't stop the entire batch:
+
+```csharp
+try
+{
+ await emailService.SendSubscriptionExpiryReminderAsync(/*...*/);
+ await LogReminderAsync(client.Id, client.SubscriptionEnd, "Email sent successfully", reminderLogAppService);
+}
+catch (Exception ex)
+{
+ Logger.LogError(ex, "❌ Failed to send reminder to {ClientName}", client.Name);
+ await LogReminderAsync(client.Id, client.SubscriptionEnd, $"Failed: {ex.Message}", reminderLogAppService);
+}
+```
+
+**Duplicate Prevention**: The job checks for existing reminders to prevent sending multiple emails on the same day, even if the job runs multiple times:
+
+```csharp
+private async Task AlreadySentTodayAsync(Guid clientId, IReminderLogAppService reminderLogAppService)
+{
+ var todayReminders = await reminderLogAppService.GetByClientIdAsync(clientId);
+ var today = DateTime.UtcNow.Date;
+
+ return todayReminders.Any(r => r.ReminderDate.Date == today);
+}
+```
+
+This implementation demonstrates how ABP's `QuartzBackgroundWorkerBase` provides a clean, powerful foundation for building robust background jobs that integrate seamlessly with your business logic while leveraging Quartz's enterprise-grade scheduling capabilities.
+
+## Conclusion
+
+You've successfully built a production-ready subscription reminder system that demonstrates the powerful synergy between ABP Framework and `Quartz.NET`. This isn't just a tutorial example - it's a robust, enterprise-grade solution that handles real business requirements.
+
+### What We Accomplished
+
+**✅ Enterprise-Grade Reliability**: PostgreSQL persistence ensures jobs survive restarts and deployments
+**✅ ABP Best Practices**: Used `QuartzBackgroundWorkerBase`, `ICachedServiceProvider`, and ABP's logging infrastructure
+**✅ Real Business Value**: Automated subscription reminders with duplicate prevention and audit logging
+**✅ Flexible Scheduling**: Explored cron expressions, trigger types, and misfire handling strategies
+
+### The Power of ABP + Quartz Integration
+
+The combination delivers exceptional value through automatic job discovery, persistent scheduling, built-in dependency injection, and seamless framework integration. You get enterprise reliability with developer-friendly simplicity.
+
+### Final Thoughts
+
+Complex background processing doesn't have to be complicated to implement. ABP's thoughtful abstractions combined with Quartz's proven engine create a development experience that's both powerful and enjoyable.
+
+Whether you're building subscription management, financial reporting, or data synchronization, these patterns provide a solid foundation for reliable, maintainable solutions.
+
+You can reach sample project's source code from [here](https://github.com/MansurBesleney/MySaaSApplication)
+
+**Happy coding, and may your background jobs never miss a beat!** 🚀
diff --git a/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg
new file mode 100644
index 0000000000..19b1392843
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/integration-services.jpeg differ
diff --git a/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md
new file mode 100644
index 0000000000..0e11c505da
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-12-Integration-Services-Explained/post.md
@@ -0,0 +1,138 @@
+# Integration Services in ABP — What they are, when to use them, and how they behave 🚦
+
+If you’ve been building with ABP for a while, you’ve probably used Application Services for your UI and APIs in your .NET and ASP.NET Core apps. Integration Services are similar—but with a different mission: they exist for service-to-service or module-to-module communication, not for end users.
+
+If you want the formal spec, see the official doc: [Integration Services](../../framework/api-development/integration-services.md). This post is the practical, no-fluff guide.
+
+## What is an Integration Service?
+
+An Integration Service is an application service or ASP.NET Core MVC controller marked with the `[IntegrationService]` attribute. That marker tells ABP “this endpoint is for internal communication.”
+
+- They are not exposed by default (safer for reusable modules and monoliths).
+- When exposed, their route prefix is `/integration-api` (so you can easily protect them at your gateway or firewall).
+- Auditing is disabled by default for them (less noise for machine-to-machine calls).
+
+Quick look:
+
+```csharp
+[IntegrationService]
+public interface IProductIntegrationService : IApplicationService
+{
+ Task> GetProductsByIdsAsync(List ids);
+}
+
+public class ProductIntegrationService : ApplicationService, IProductIntegrationService
+{
+ public Task> GetProductsByIdsAsync(List ids)
+ {
+ // fetch and return minimal product info for other services/modules
+ }
+}
+```
+
+## Are they HTTP endpoints?
+
+- By default: no (they won’t be reachable over HTTP in the ASP.NET Core routing pipeline).
+- If you need them over HTTP (typically for microservices), explicitly enable:
+
+```csharp
+Configure(options =>
+{
+ options.ExposeIntegrationServices = true;
+});
+```
+
+Once exposed, ABP puts them under `/integration-api/...` instead of `/api/...` in the ASP.NET Core routing pipeline. That’s your hint to restrict them from public internet access.
+
+## Enable auditing (optional)
+
+If you want audit logs for integration calls, enable it explicitly:
+
+```csharp
+Configure(options =>
+{
+ options.IsEnabledForIntegrationServices = true;
+});
+```
+
+## When should you use Integration Services?
+
+- Internal, synchronous operations between services or modules.
+- You need a “thin” API designed for other services (not for UI): minimal DTOs, no view concerns, predictable contracts.
+- You want to hide these endpoints from public clients, or only allow them inside your private network or k8s cluster.
+- You’re packaging a reusable module that might be used in both monolith and microservice deployments.
+
+## When NOT to use them
+
+- Public APIs or anything intended for browsers/mobile apps → use regular application services/controllers.
+- Asynchronous cross-service workflows → consider domain events + outbox/inbox; use Integration Services for sync calls.
+- Complex, chatty UI endpoints → those belong to your external API surface, not internal integration.
+
+## Common use-cases and examples
+
+- Identity lookups across services: an Ordering service needs basic user info from the Identity service.
+- Permission checks from another module: a CMS module asks a Permission service for access decisions.
+- Product data hydrations: a Cart service needs minimal product details (price, name) from Catalog.
+- Internal admin/maintenance operations that aren’t meant for end users but are needed by other services.
+
+## Example: microservice-to-microservice call
+
+1) Mark and expose the integration service in the target service:
+
+```csharp
+[IntegrationService]
+public interface IUserIntegrationService : IApplicationService
+{
+ Task FindByIdAsync(Guid id);
+}
+
+Configure(o => o.ExposeIntegrationServices = true);
+```
+
+2) In the caller service, add an HTTP client proxy only for Integration Services if you like to keep things clean:
+
+```csharp
+services.AddHttpClientProxies(
+ typeof(TargetServiceApplicationModule).Assembly,
+ remoteServiceConfigurationName: "TargetService",
+ asDefaultServices: true,
+ applicationServiceTypes: ApplicationServiceTypes.IntegrationServices);
+```
+
+3) Call it just like a local service (ABP’s HTTP proxy handles the wire):
+
+```csharp
+public class OrderAppService : ApplicationService
+{
+ private readonly IUserIntegrationService _userIntegrationService;
+
+ public OrderAppService(IUserIntegrationService userIntegrationService)
+ {
+ _userIntegrationService = userIntegrationService;
+ }
+
+ public async Task PlaceOrderAsync(CreateOrderDto input)
+ {
+ var user = await _userIntegrationService.FindByIdAsync(CurrentUser.GetId());
+ // validate user status, continue placing order...
+ }
+}
+```
+
+## Monolith vs. Microservices
+
+- Monolith: keep them unexposed and call via DI in-process. You get the same clear contract with zero network overhead.
+- Microservices: expose them and route behind your gateway. The `/integration-api` prefix makes it easy to firewall/gateway-restrict.
+
+## Practical tips
+
+- Keep integration DTOs lean and stable. These are machine contracts—don’t mix UI concerns.
+- Name them clearly (e.g., `UserIntegrationService`) so intent is obvious.
+- Guard your ASP.NET Core gateway application: block `/integration-api/*` from public traffic.
+- Enable auditing only if you truly need the logs for these calls.
+
+## Further reading
+
+- Official docs: [Integration Services](../../framework/api-development/integration-services.md)
+
+That’s it! Integration Services give you a clean, intentional way to design internal APIs—great in monoliths, essential in microservices.
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png
new file mode 100644
index 0000000000..4864281a32
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/0-cover.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png
new file mode 100644
index 0000000000..63cebfca62
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/1-pipeline-yaml.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png
new file mode 100644
index 0000000000..a974610907
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/3-release.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png
new file mode 100644
index 0000000000..c5771a8447
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/4-safe-deploy.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png
new file mode 100644
index 0000000000..5afe59b991
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/5-summarizing.png differ
diff --git a/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md
new file mode 100644
index 0000000000..e297aedb13
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-19-Best-Practices-Azure-Devops/POST.md
@@ -0,0 +1,83 @@
+# 🚀 Best Practices for Azure DevOps CI/CD Pipelines
+
+**CI/CD (Continuous Integration / Continuous Delivery)** is not just fancy tech talk - it's now a must-have for modern software teams.
+Microsoft's **Azure DevOps** helps make these processes easier to manage.
+But how do you create pipelines that work well for your team? Let's look at some practical tips that will make your life easier.
+
+---
+
+## 1. 📜 Define Your Pipeline as Code
+
+Don't use the manual setup method that's hard to track. Azure DevOps lets you use **YAML files** for your pipelines, which gives you:
+
+- A record of all changes - who made them and when
+- The same setup across all environments
+- The ability to undo changes when something goes wrong
+
+This stops the common problem where something works on one computer but not another.
+
+
+
+---
+
+## 2. 🔑 Store Sensitive Information Safely
+
+Never put passwords directly in your code, even temporarily.
+Each environment should have its own settings, and keep sensitive information in **Azure Key Vault** or **Library Variable Groups**.
+
+You'll avoid security problems later.
+
+
+---
+
+## 3. 🏗️ Keep Building and Releasing Separate
+
+Think of **Building** like cooking a meal - you prepare everything and package it up.
+**Releasing** is like delivering that meal to different people.
+
+Keeping these as separate steps means:
+
+- You create your package once, then send it to multiple places
+- You save time and resources by not rebuilding the same thing over and over
+
+
+
+---
+
+## 4. 🧪 Add Automatic Testing
+
+Don't waste time testing the same things manually over and over.
+Set up **different types of tests** to run automatically. When tests run every time you make changes:
+
+- You catch problems before your customers do
+- Your software quality stays high without extra manual work
+
+Azure DevOps has tools to help you see test results easily without searching through technical logs.
+
+---
+
+## 5. 🛡️ Add Safety Checks
+
+Automatic doesn't mean pushing everything to your live system right away.
+For important environments, add **human approval steps** or **automatic checks** like security scans.
+
+This helps you avoid emergency problems in the middle of the night.
+
+
+
+
+---
+
+## ✅ Conclusion
+
+Good Azure DevOps pipelines aren't just about automation - they help you feel confident in your process.
+Remember these main points:
+
+✔ Use YAML files to keep everything visible and trackable
+✔ Keep passwords and sensitive data in secure storage (not in your code)
+✔ Build once, deploy to many places
+✔ Let automatic tests find problems before users do
+✔ Add safety checks for important systems
+
+
+---
diff --git a/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md b/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md
new file mode 100644
index 0000000000..1f5c284cb1
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-19-abp-now-supports-angular-standalone-applications/POST.md
@@ -0,0 +1,398 @@
+# ABP Now Supports Angular Standalone Applications
+
+We are excited to announce that **ABP now supports Angular’s standalone component structure** in the latest Studio update. This article walks you through how to generate a standalone application, outlines the migration steps, and highlights the benefits of this shift over traditional module-based architecture.
+
+---
+
+## Why Standalone?
+
+Angular's standalone component architecture, which is introduced in version 14 and made default in version 19, is a major leap forward for Angular development. Here is why it matters:
+
+### 🔧 Simplified Project Structure
+
+Standalone components eliminate the need for `NgModule` wrappers. This leads to:
+
+- Fewer files to manage
+- Cleaner folder organization
+- Reduced boilerplate
+
+Navigating and understanding your codebase becomes easier for everyone on your team.
+
+### 🚀 Faster Bootstrapping
+
+Standalone apps simplify app initialization:
+
+```ts
+bootstrapApplication(AppComponent, appConfig);
+```
+
+This avoids the need for `AppModule` and speeds up startup times.
+
+### 📦 Smaller Bundle Sizes
+
+Since components declare their own dependencies, Angular can more effectively tree-shake unused code. Result? Smaller bundle sizes and faster load times.
+
+### 🧪 Easier Testing & Reusability
+
+Standalone components are self-contained. They declare their dependencies within the `imports` array, making them:
+
+- Easier to test in isolation
+- Easier to reuse in different contexts
+
+### 🧠 Clearer Dependency Management
+
+Standalone components explicitly define what they need. No more hidden dependencies buried in shared modules.
+
+### 🔄 Gradual Adoption
+
+You can mix and match standalone and module-based components. This allows for **incremental migration**, reducing risk in larger codebases. Here is the related document for the [standalone migration](https://angular.dev/reference/migrations/standalone).
+
+---
+
+## Getting Started: Creating a Standalone Angular App
+
+Angular CLI makes it easy to start:
+
+```bash
+ng new my-app
+```
+
+With Angular 19, new apps follow this bootstrapping model:
+
+```ts
+// main.ts
+import { bootstrapApplication } from "@angular/platform-browser";
+import { appConfig } from "./app/app.config";
+import { AppComponent } from "./app/app.component";
+
+bootstrapApplication(AppComponent, appConfig).catch((err) =>
+ console.error(err)
+);
+```
+
+The `app.config.ts` file replaces `AppModule`:
+
+```ts
+// app.config.ts
+import { ApplicationConfig, provideZoneChangeDetection } from "@angular/core";
+import { provideRouter } from "@angular/router";
+import { routes } from "./app.routes";
+
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideZoneChangeDetection({ eventCoalescing: true }),
+ provideRouter(routes),
+ ],
+};
+```
+
+Routing is defined in a simple `Routes` array:
+
+```ts
+// app.routes.ts
+import { Routes } from "@angular/router";
+
+export const routes: Routes = [];
+```
+
+---
+
+## ABP Studio Support for Standalone Structure
+
+Starting with the latest release (insert version number here), ABP Studio fully supports Angular's standalone structure. While the new format is encouraged, module-based structure will continue to be supported for backwards compatibility.
+
+To try it out, simply update your ABP Studio to create apps with the latest version.
+
+---
+
+## What’s New in ABP Studio Templates?
+
+When you generate an app using the latest ABP Studio, the project structure aligns with Angular's standalone architecture.
+
+This migration is split into four parts:
+
+1. **Package updates**
+2. **Schematics updates**
+3. **Suite code generation updates**
+4. **Template refactors**
+
+---
+
+## Package Migration Details
+
+Migration has been applied to packages in the [ABP GitHub repository](https://github.com/abpframework/abp/tree/dev/npm/ng-packs/packages). Here is an example from the Identity package.
+
+### 🧩 Migrating Components
+
+Components are made standalone, using:
+
+```bash
+ng g @angular/core:standalone
+```
+
+Example:
+
+```ts
+@Component({
+ selector: 'abp-roles',
+ templateUrl: './roles.component.html',
+ providers: [...],
+ imports: [
+ ReactiveFormsModule,
+ LocalizationPipe,
+ ...
+ ],
+})
+export class RolesComponent implements OnInit { ... }
+```
+
+### 🛣 Updating Routing
+
+Old lazy-loaded routes using `forLazy()`:
+
+```ts
+{
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(m => m.IdentityModule.forLazy({...}))
+}
+```
+
+Now replaced with:
+
+```ts
+{
+ path: 'identity',
+ loadChildren: () => import('@abp/ng.identity').then(c => c.createRoutes({...}))
+}
+```
+
+### 🧱 Replacing Module Declarations
+
+The old setup:
+
+```ts
+// identity.module.ts
+@NgModule({
+ imports: [IdentityRoutingModule, RolesComponent, UsersComponent],
+})
+export class IdentityModule {...}
+```
+
+```ts
+//identity-routing.module
+const routes: Routes = [...];
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class IdentityRoutingModule {}
+```
+
+New setup:
+
+```ts
+// identity-routes.ts
+export function provideIdentity(options: IdentityConfigOptions = {}): Provider[] {
+ return [...];
+}
+export const createRoutes = (options: IdentityConfigOptions = {}): Routes => [
+ {
+ path: '',
+ component: RouterOutletComponent,
+ providers: provideIdentity(options),
+ children: [
+ {
+ path: 'roles',
+ component: ReplaceableRouteContainerComponent,
+ data: {
+ requiredPolicy: 'AbpIdentity.Roles',
+ replaceableComponent: {
+ key: eIdentityComponents.Roles,
+ defaultComponent: RolesComponent,
+ },
+ },
+ title: 'AbpIdentity::Roles',
+ },
+ ...
+ ],
+ },
+];
+```
+
+---
+
+## ABP Schematics Migration Details
+
+You can reach details by checking [ABP Schematics codebase](https://github.com/abpframework/abp/tree/dev/npm/ng-packs/packages/schematics).
+
+### 📚 Library creation
+
+When you run the `abp create-lib` command, the prompter will ask you the `templateType`. It supports both module and standalone templates.
+
+```ts
+"templateType": {
+ "type": "string",
+ "description": "Type of the template",
+ "enum": ["module", "standalone"],
+ "x-prompt": {
+ "message": "Select the type of template to generate:",
+ "type": "list",
+ "items": [
+ { "value": "module", "label": "Module Template" },
+ { "value": "standalone", "label": "Standalone Template" }
+ ]
+ }
+},
+```
+
+---
+
+## ABP Suite Code Generation Migration Details
+
+ABP Suite will also be supporting both structures. If you have a project that is generated with the previous versions, the Suite will detect the structure in that way and generate the related code accordingly. Conversely, here is what is changed for the standalone migration:
+
+**❌ Discarded module files**
+
+```ts
+// entity-one.module.ts
+@NgModule({
+ declarations: [],
+ imports: [EntityOneComponent, EntityOneRoutingModule],
+})
+export class EntityOneModule {}
+```
+
+```ts
+// entity-one-routing.module.ts
+export const routes: Routes = [
+ {
+ path: "",
+ component: EntityOneComponent,
+ canActivate: [authGuard, permissionGuard],
+ },
+];
+
+@NgModule({
+ imports: [RouterModule.forChild(routes)],
+ exports: [RouterModule],
+})
+export class EntityOneRoutingModule {}
+```
+
+```ts
+// app-routing.module.ts
+{
+ path: 'entity-ones',
+ loadChildren: () =>
+ import('./entity-ones/entity-one/entity-one.module').then(m => m.EntityOneModule),
+},
+```
+
+**✅ Added routes configuration**
+
+```ts
+// entity-one.routes.ts
+export const ENTITY_ONE_ROUTES: Routes = [
+ {
+ path: "",
+ loadComponent: () => {
+ return import("./components/entity-one.component").then(
+ (c) => c.EntityOneComponent
+ );
+ },
+ canActivate: [authGuard, permissionGuard],
+ },
+];
+```
+
+```ts
+// app.routes.ts
+{ path: 'entity-ones', children: ENTITY_ONE_ROUTES },
+```
+
+---
+
+## Template Migration Details
+
+### 🧭 Routing: `app.routes.ts`
+
+```ts
+// app.routes.ts
+import { Routes } from '@angular/router';
+
+export const APP_ROUTES: Routes = [
+ {
+ path: '',
+ pathMatch: 'full',
+ loadComponent: () => import('./home/home.component').then(m => m.HomeComponent),
+ },
+ {
+ path: 'account',
+ loadChildren: () => import('@abp/ng.account').then(m => m.createRoutes()),
+ },
+ ...
+];
+```
+
+### ⚙ Configuration: `app.config.ts`
+
+```ts
+// app.config.ts
+export const appConfig: ApplicationConfig = {
+ providers: [
+ provideRouter(APP_ROUTES),
+ APP_ROUTE_PROVIDER,
+ provideAbpCore(
+ withOptions({
+ environment,
+ registerLocaleFn: registerLocale(),
+ ...
+ })
+ ),
+ provideAbpOAuth(),
+ provideAbpThemeShared(),
+ ...
+ ],
+};
+
+```
+
+### 🧼 Removed: `shared.module.ts`
+
+This file has been removed to reduce unnecessary shared imports. Components now explicitly import what they need—leading to better encapsulation and less coupling.
+
+---
+
+## Common Problems
+
+You may encounter these common problems that you would need to manage.
+
+### 1. Missing Imports
+
+In standalone structure, components must declare all their dependencies in `imports`. Forgetting this often causes template errors.
+
+### 2. Mixed Structures
+
+Combining modules and standalone in the same feature leads to confusion. Migrate features fully or keep them module-based.
+
+### 3. Routing Errors
+
+Incorrect migration from `forLazy()` to `createRoutes()` or `loadComponent` can break navigation. Double-check route configs.
+
+### 4. Service Injection
+
+Services provided in old modules may be missing. Add them in the component’s `providers` or `app.config.ts`.
+
+### 5. Shared Module Habit
+
+Reintroducing a shared module reduces the benefits of standalone. Import dependencies directly where needed.
+
+---
+
+## Conclusion
+
+Angular’s standalone component architecture is a significant improvement for scalability, simplicity, and performance. With latest version of ABP Studio, you can adopt this modern approach with ease—without losing support for existing module-based projects.
+
+**Ready to modernize your Angular development?**
+
+Update your ABP Studio today and start building with standalone power!
diff --git a/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/POST.md b/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/POST.md
new file mode 100644
index 0000000000..534dc1abe1
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/POST.md
@@ -0,0 +1,213 @@
+# App Services vs Domain Services: Deep Dive into Two Core Service Types in ABP Framework
+
+In ABP's layered architecture, we frequently encounter two types of services that appear similar but serve distinctly different purposes: Application Services and Domain Services. Understanding the differences between them is crucial for building clear and maintainable enterprise applications.
+
+## Architectural Positioning
+
+In ABP's layered architecture:
+
+- **Application Services** reside in the application layer and are responsible for coordinating use case execution
+- **Domain Services** reside in the domain layer and are responsible for implementing core business logic
+
+This layered design follows Domain-Driven Design (DDD) principles, ensuring clear separation of business logic and system maintainability.
+
+## Application Services: Use Case Orchestrators
+
+### Core Responsibilities
+
+Application Services are stateless services primarily used to implement application use cases. They act as a bridge between the presentation layer and domain layer, responsible for:
+
+- **Parameter Validation**: Input validation is automatically handled by ABP using data annotations
+- **Authorization**: Checking user permissions and access control using `[Authorize]` attribute or manual authorization checks via `IAuthorizationService`
+- **Transaction Management**: Methods automatically run as Unit of Work (transactional by default)
+- **Use Case Orchestration**: Organizing and coordinating multiple domain objects to complete specific business use cases
+- **Data Transformation**: Handling conversion between DTOs and domain objects using ObjectMapper
+
+### Design Principles
+
+1. **DTO Boundaries**: Application service methods should only accept and return DTOs, never directly expose domain entities
+2. **Use Case Oriented**: Each method should correspond to a clear user use case
+3. **Thin Layer Design**: Avoid implementing complex business logic in application services
+
+### Typical Execution Flow
+
+A standard application service method typically follows this pattern:
+
+```csharp
+[Authorize(BookPermissions.Create)] // Declarative authorization
+public virtual async Task CreateBookAsync(CreateBookDto input) // input is automatically validated
+{
+ // Get related data
+ var author = await _authorRepository.GetAsync(input.AuthorId);
+
+ // Call domain service to execute business logic (if needed)
+ // You can also use the entity constructor directly if no complex business logic is required
+ var book = await _bookManager.CreateAsync(input.Title, author, input.Price);
+
+ // Persist changes
+ await _bookRepository.InsertAsync(book);
+
+ // Return DTO
+ return ObjectMapper.Map(book);
+}
+```
+
+### Integration Services: Special kind of Application Service
+
+It's worth mentioning that ABP also provides a special type of application service—Integration Services. They are application services marked with the `[IntegrationService]` attribute, designed for inter-module or inter-microservice communication.
+
+We have a community article dedicated to integration services: [Integration Services Explained — What they are, when to use them, and how they behave](https://abp.io/community/articles/integration-services-explained-what-they-are-when-to-use-lienmsy8)
+
+## Domain Services: Guardians of Business Logic
+
+### Core Responsibilities
+
+Domain Services implement core business logic and are particularly needed when:
+
+- **Core domain logic depends on services**: You need to implement logic that requires repositories or other external services
+- **Logic spans multiple aggregates**: The business logic is related to more than one aggregate/entity and doesn't properly fit in any single aggregate
+- **Complex business rules**: Complex domain rules that don't naturally belong in a single entity
+
+### Design Principles
+
+1. **Domain Object Interaction**: Method parameters and return values should be domain objects (entities, value objects), never DTOs
+2. **Business Logic Focus**: Focus on implementing pure business rules
+3. **Stateless Design**: Maintain the stateless nature of services
+4. **State-Changing Operations Only**: Domain services should only define methods that mutate data, not query methods
+5. **No Authorization Logic**: Domain services should not perform authorization checks or depend on current user context
+6. **Specific Method Names**: Use descriptive, business-meaningful method names (e.g., `AssignToAsync`) instead of generic names (e.g., `UpdateAsync`)
+
+### Implementation Example
+
+```csharp
+public class IssueManager : DomainService
+{
+ private readonly IRepository _issueRepository;
+
+ public virtual async Task AssignToAsync(Issue issue, Guid userId)
+ {
+ // Business rule: Check user's unfinished task count
+ var openIssueCount = await _issueRepository.GetCountAsync(i => i.AssignedUserId == userId && !i.IsClosed);
+
+ if (openIssueCount >= 3)
+ {
+ throw new BusinessException("IssueTracking:ConcurrentOpenIssueLimit");
+ }
+
+ // Execute assignment logic
+ issue.AssignedUserId = userId;
+ issue.AssignedDate = Clock.Now;
+ }
+}
+```
+
+## Key Differences Comparison
+
+| Dimension | Application Services | Domain Services |
+|-----------|---------------------|-----------------|
+| **Layer Position** | Application Layer | Domain Layer |
+| **Primary Responsibility** | Use Case Orchestration | Business Logic Implementation |
+| **Data Interaction** | DTOs | Domain Objects |
+| **Callers** | Presentation Layer/Client Applications | Application Services/Other Domain Services |
+| **Authorization** | Responsible for permission checks | No authorization logic |
+| **Transaction Management** | Manages transaction boundaries (Unit of Work) | Participates in transactions but doesn't manage |
+| **Current User Context** | Can access current user information | Should not depend on current user context |
+| **Return Types** | Returns DTOs | Returns domain objects only |
+| **Query Operations** | Can perform query operations | Should not define GET/query methods |
+| **Naming Convention** | `*AppService` | `*Manager` or `*Service` |
+
+## Collaboration Patterns in Practice
+
+In real-world development, these two types of services typically work together:
+
+```csharp
+// Application Service
+public class BookAppService : ApplicationService
+{
+ private readonly BookManager _bookManager;
+ private readonly IRepository _bookRepository;
+
+ [Authorize(BookPermissions.Update)]
+ public virtual async Task UpdatePriceAsync(Guid id, decimal newPrice)
+ {
+ var book = await _bookRepository.GetAsync(id);
+
+ await _bookManager.ChangePriceAsync(book, newPrice);
+
+ await _bookRepository.UpdateAsync(book);
+
+ return ObjectMapper.Map(book);
+ }
+}
+
+// Domain Service
+public class BookManager : DomainService
+{
+ public virtual async Task ChangePriceAsync(Book book, decimal newPrice)
+ {
+ // Domain service focuses on business rules
+ if (newPrice <= 0)
+ {
+ throw new BusinessException("Book:InvalidPrice");
+ }
+
+ if (book.IsDiscounted && newPrice > book.OriginalPrice)
+ {
+ throw new BusinessException("Book:DiscountedPriceCannotExceedOriginal");
+ }
+
+ if (book.Price == newPrice)
+ {
+ return;
+ }
+
+ // Additional business logic: Check if price change requires approval
+ if (await RequiresApprovalAsync(book, newPrice))
+ {
+ throw new BusinessException("Book:PriceChangeRequiresApproval");
+ }
+
+ book.ChangePrice(newPrice);
+ }
+
+ private Task RequiresApprovalAsync(Book book, decimal newPrice)
+ {
+ // Example business rule: Large price increases require approval
+ var increasePercentage = ((newPrice - book.Price) / book.Price) * 100;
+ return Task.FromResult(increasePercentage > 50); // 50% increase threshold
+ }
+}
+```
+
+## Best Practice Recommendations
+
+### Application Services
+- Create a corresponding application service for each aggregate root
+- Use clear naming conventions (e.g., `IBookAppService`)
+- Implement standard CRUD operation methods (`GetAsync`, `CreateAsync`, `UpdateAsync`, `DeleteAsync`)
+- Avoid inter-application service calls within the same module/application
+- Always return DTOs, never expose domain entities directly
+- Use the `[Authorize]` attribute for declarative authorization or manual checks via `IAuthorizationService`
+- Methods automatically run as Unit of Work (transactional)
+- Input validation is handled automatically by ABP
+
+### Domain Services
+- Use the `Manager` suffix for naming (e.g., `BookManager`)
+- Only define state-changing methods, avoid query methods (use repositories directly in Application Services for queries)
+- Throw `BusinessException` with clear, unique error codes for domain validation failures
+- Keep methods pure, avoid involving user context or authorization logic
+- Accept and return domain objects only, never DTOs
+- Use descriptive, business-meaningful method names (e.g., `AssignToAsync`, `ChangePriceAsync`)
+- Do not implement interfaces unless there's a specific need for multiple implementations
+
+## Summary
+
+Application Services and Domain Services each have their distinct roles in the ABP framework: Application Services serve as use case orchestrators, handling authorization, validation, transaction management, and DTO transformations; Domain Services focus purely on business logic implementation without any infrastructure concerns. Integration Services are a special type of Application Service designed for inter-service communication.
+
+Correctly understanding and applying these service patterns is key to building high-quality ABP applications. Through clear separation of responsibilities, we can not only build more maintainable code but also flexibly switch between monolithic and microservice architectures—this is precisely the elegance of ABP framework design.
+
+## References
+
+- [Application Services](https://abp.io/docs/latest/framework/architecture/domain-driven-design/application-services)
+- [Integration Services](https://abp.io/docs/latest/framework/api-development/integration-services)
+- [Domain Services](https://abp.io/docs/latest/framework/architecture/domain-driven-design/domain-services)
diff --git a/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/cover.png b/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/cover.png
new file mode 100644
index 0000000000..a59643d12a
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-25-App-Services-vs-Domain-Services/cover.png differ
diff --git a/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/AutoMapper-Alternatives.md b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/AutoMapper-Alternatives.md
new file mode 100644
index 0000000000..e9c4dec4ee
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/AutoMapper-Alternatives.md
@@ -0,0 +1,338 @@
+# Best Free Alternatives to AutoMapper in .NET — Why We Moved to Mapperly
+
+---
+
+## Introduction
+
+[AutoMapper](https://automapper.io/) has been one of the most popular mapping library for .NET apps. It has been free and [open-source](https://github.com/LuckyPennySoftware/AutoMapper) since 2009. On 16 April 2025, Jimmy Bogard (the owner of the project) decided to make it commercial for his own reasons. You can read [this announcement](https://www.jimmybogard.com/automapper-and-mediatr-licensing-update/) about what happened to AutoMapper.
+
+
+
+### Why AutoMapper’s licensing change matters
+
+In ABP Framework we have been also using AutoMapper for object mappings. After its commercial transition, we also needed to replace it. Because ABP Framework is open-source and under [LGPL-3.0 license](https://github.com/abpframework/abp#LGPL-3.0-1-ov-file).
+
+**TL;DR**
+
+> That's why, **we decided to replace AutoMapper with Mapperly**.
+
+In this article, we'll discuss the alternatives of AutoMapper so that you can cut down on costs and maximize performance while retaining control over your codebase. Also I'll explain why we chose Mapperly.
+
+Also AutoMapper uses heavily reflection. And reflection comes with a performance cost if used indiscriminately, and compile-time safety is limited. Let's see how we can overcome these...
+
+
+
+## Cost-Free Alternatives to AutoMapper
+
+Check out the comparison table for key features vs. AutoMapper.
+
+| | **AutoMapper (Paid)** | **Mapster (Free)** | **Mapperly (Free)** | **AgileMapper (Free)** | **Manual Mapping** |
+| ------------------- | ----------------------------------------------- | ----------------------------------------- | -------------------------------------------- | ------------------------------------------- | ------------------------------------------------ |
+| **License & Cost** | Paid/commercial | Free, MIT License | Free, MIT License | Free, Apache 2.0 | Free (no library) |
+| **Performance** | Slower due to reflection & conventions | Very fast (runtime & compile-time modes) | Very fast (compile-time code generation) | Good, faster than AutoMapper | Fastest (direct assignment) |
+| **Ease of Setup** | Easy, but configuration-heavy | Easy, minimal config | Easy, but different approach from AutoMapper | Simple, flexible configuration | Manual coding required |
+| **Features** | Rich features, conventions, nested mappings | Strong typed mappings, projection support | Strong typed, compile-time safe mappings | Dynamic & conditional mapping | Whatever you code |
+| **Maintainability** | Hidden mappings can be hard to debug | Explicit & predictable | Very explicit, compiler-verified mappings | Readable, good balance | Very explicit, most maintainable |
+| **Best For** | Large teams used to AutoMapper & willing to pay | Teams wanting performance + free tool | Teams prioritizing type-safety & performance | Developers needing flexibility & simplicity | Small/medium projects, performance-critical apps |
+
+There are other libraries such as [**ExpressMapper**](https://github.com/fluentsprings/ExpressMapper) **(308 GitHub stars)**, [**ValueInjecter**](https://github.com/omuleanu/ValueInjecter) **(258 GitHub stars)**, [**AgileMapper**](https://github.com/agileobjects/AgileMapper) **(463 GitHub stars)**. These are not very popular but also free and offer a different balance of simplicity and features.
+
+
+
+## Why We Chose Mapperly
+
+We filtered down all the alternatives into 2: **Mapster** and **Mapperly**.
+
+The crucial factor was maintainability! As you see from the screenshots below, Mapster is already stopped development. Mapster’s development appears stalled, and its future maintenance is uncertain. On the other hand, Mapperly regularly gets commits. The community support is valuable.
+
+We looked up different alternatives of AutoMapper also, here's the initial issue of AutoMapper replacement [github.com/abpframework/abp/issues/23243](https://github.com/abpframework/abp/issues/23243).
+
+The ABP team started Mapperly integration with this initial commit [github.com/abpframework/abp/commit/178d3f56d42b4e5acb7e349470f4a644d4c5214e](https://github.com/abpframework/abp/commit/178d3f56d42b4e5acb7e349470f4a644d4c5214e). And this is our Mapperly integration package : [github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.Mapperly.](https://github.com/abpframework/abp/tree/dev/framework/src/Volo.Abp.Mapperly.)
+
+
+
+Here are some considerations for developers who are used to ABP and AutoMapper.
+
+### [Mapster](https://github.com/MapsterMapper/Mapster):
+
+* ✔ It is similar to AutoMapper, configuring mappings through code.
+* ✔ Support for dependency injection and complex runtime configuration.
+* ❌ It is looking additional Mapster maintainers ([Call for additional Mapster maintainers MapsterMapper/Mapster#752](https://github.com/MapsterMapper/Mapster/discussions/752))
+
+### [Mapperly](https://github.com/riok/Mapperly):
+
+- ✔ It generates mapping code(` source generator`) during the build process.
+- ✔ It is actively being developed and maintained.
+- ❌ It is a static `map` method, which is not friendly to dependency injection.
+- ❌ The configuration method is completely different from AutoMapper, and there is a learning curve.
+
+
+
+**Mapperly** → generates mapping code at **compile time** using source generators.
+
+**Mapster** → has two modes:
+
+- By default, it uses **runtime code generation** (via expression trees and compilation).
+
+- But with **Mapster.Tool** (source generator), it can also generate mappings at **compile time**.
+
+
+
+This is important because it guarantees the mappings are working well. Also they provide type safety and improved performance. Another advantages of these libraries, they eliminate runtime surprises and offer better IDE support.
+
+---
+
+## When Mapperly Will Come To ABP
+
+Mapperly integration will be delivered with ABP v10. If you have already defined AutoMapper configurations, you can still keep and use them. But the framework will use Mapperly. So there'll be 2 mapping integrations in your app. You can also remove AutoMapper from your final application and use one mapping library: Mapperly. It's up to you! Check [AutoMapper pricing table](https://automapper.io/#pricing).
+
+
+
+## Migrating from AutoMapper to Mapperly
+
+In ABP v10, we will be migrating from AutoMapper to Mapperly. The document about the migration is not delivered by the time I wrote this article, but you can reach the document in our dev docs branch
+
+* [github.com/abpframework/abp/blob/dev/docs/en/release-info/migration-guides/AutoMapper-To-Mapperly.md](https://github.com/abpframework/abp/blob/dev/docs/en/release-info/migration-guides/AutoMapper-To-Mapperly.md).
+
+Also for ABP, you can check out how you will define DTO mappings based on Mapperly at this document
+
+* [github.com/abpframework/abp/blob/dev/docs/en/framework/infrastructure/object-to-object-mapping.md](https://github.com/abpframework/abp/blob/dev/docs/en/framework/infrastructure/object-to-object-mapping.md)
+
+
+
+## Mapping Code Examples for AutoMapper, Mapster, AgileMapper
+
+### AutoMapper vs Mapster vs Mapperly Performance
+
+Here are concise, drop-in **side-by-side C# snippets** that map the same model with AutoMapper, Mapster, AgileMapper, and manual mapping.
+
+ Models used in all examples
+
+We'll use these models to show the mapping examples for AutoMapper, Mapster, AgileMapper.
+
+```csharp
+public class Order
+{
+ public int Id { get; set; }
+ public Customer Customer { get; set; } = default!;
+ public List Lines { get; set; } = new();
+ public DateTime CreatedAt { get; set; }
+}
+
+public class Customer
+{
+ public int Id { get; set; }
+ public string Name { get; set; } = "";
+ public string? Email { get; set; }
+}
+
+public class OrderLine
+{
+ public int ProductId { get; set; }
+ public int Quantity { get; set; }
+ public decimal UnitPrice { get; set; }
+}
+
+public class OrderDto
+{
+ public int Id { get; set; }
+ public string CustomerName { get; set; } = "";
+ public int ItemCount { get; set; }
+ public decimal Total { get; set; }
+ public string CreatedAtIso { get; set; } = "";
+}
+```
+
+
+
+#### AutoMapper Example (Paid)
+
+```csharp
+public sealed class OrderProfile : Profile
+{
+ public OrderProfile()
+ {
+ CreateMap()
+ .ForMember(d => d.CustomerName, m => m.MapFrom(s => s.Customer.Name))
+ .ForMember(d => d.ItemCount, m => m.MapFrom(s => s.Lines.Sum(l => l.Quantity)))
+ .ForMember(d => d.Total, m => m.MapFrom(s => s.Lines.Sum(l => l.Quantity * l.UnitPrice)))
+ .ForMember(d => d.CreatedAtIso,m => m.MapFrom(s => s.CreatedAt.ToString("O")));
+ }
+}
+
+// registration
+services.AddAutoMapper(typeof(OrderProfile));
+
+// mapping
+var dto = mapper.Map(order);
+
+// EF Core projection (common pattern)
+var list = dbContext.Orders
+ .ProjectTo(mapper.ConfigurationProvider)
+ .ToList();
+```
+
+**NuGet Packages:**
+
+- https://www.nuget.org/packages/AutoMapper
+- https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection
+
+---
+
+#### Mapperly (Free, Apache-2.0)
+
+This is compile-time generated mapping.
+
+```csharp
+[Mapper] // generates the implementation at build time
+public partial class OrderMapper
+{
+ // Simple property mapping: Customer.Name -> CustomerName
+ [MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))]
+ public partial OrderDto ToDto(Order source);
+
+ // Update an existing target (like MapToExisting)
+ [MapProperty(nameof(Order.Customer) + "." + nameof(Customer.Name), nameof(OrderDto.CustomerName))]
+ public partial void UpdateDto(Order source, OrderDto target);
+
+ public OrderDto Map(Order s)
+ {
+ var d = ToDto(s);
+ AfterMap(s, d);
+ return d;
+ }
+
+ public void Map(Order source, OrderDto d)
+ {
+ UpdateDto(source, d);
+ AfterMap(source, d);
+ }
+
+ private void AfterMap(Order source, OrderDto d)
+ {
+ d.ItemCount = source.Lines.Sum(l => l.Quantity);
+ d.Total = source.Lines.Sum(l => l.Quantity * l.UnitPrice);
+ d.CreatedAtIso = source.CreatedAt.ToString("O");
+ }
+}
+
+
+//USAGE
+var mapper = new OrderMapper();
+var order = new Order
+{
+ Id = 1,
+ Customer = new Customer { Id = 1, Name = "John Doe", Email = "johndoe@abp.io" },
+ Lines =
+ [
+ new OrderLine {ProductId = 1, Quantity = 2, UnitPrice = 10.0m},
+ new OrderLine {ProductId = 2, Quantity = 1, UnitPrice = 20.0m}
+ ]
+};
+
+// Map to a new object
+var dto = mapper.Map(order);
+
+// Map to an existing object
+var target = new OrderDto();
+mapper.Map(order, target);
+```
+
+**NuGet Packages:**
+
+* https://www.nuget.org/packages/Riok.Mapperly/
+
+---
+
+#### Mapster Example (Free, MIT)
+
+```csharp
+TypeAdapterConfig.NewConfig()
+ .Map(d => d.CustomerName, s => s.Customer.Name)
+ .Map(d => d.ItemCount, s => s.Lines.Sum(l => l.Quantity))
+ .Map(d => d.Total, s => s.Lines.Sum(l => l.Quantity * l.UnitPrice))
+ .Map(d => d.CreatedAtIso, s => s.CreatedAt.ToString("O"));
+
+// one-off
+var dto = order.Adapt();
+
+// DI-friendly registration
+services.AddSingleton(TypeAdapterConfig.GlobalSettings);
+services.AddScoped();
+
+// EF Core projection (strong suit)
+var mappedList = dbContext.Orders
+ .ProjectToType() // Mapster projection
+ .ToList();
+```
+
+**NuGet Packages:**
+
+- https://www.nuget.org/packages/Mapster
+- https://www.nuget.org/packages/Mapster.DependencyInjection
+- https://www.nuget.org/packages/Mapster.SourceGenerator (for performance improvement)
+
+---
+
+#### AgileMapper Example (Free, Apache-2.0)
+
+```csharp
+var mapper = Mapper.CreateNew(cfg =>
+{
+ cfg.WhenMapping
+ .From()
+ .To()
+ .Map(ctx => ctx.Source.Customer.Name).To(dto => dto.CustomerName)
+ .Map(ctx => ctx.Source.Lines.Sum(l => l.Quantity)).To(dto => dto.ItemCount)
+ .Map(ctx => ctx.Source.Lines.Sum(l => l.Quantity * l.UnitPrice)).To(dto => dto.Total)
+ .Map(ctx => ctx.Source.CreatedAt.ToString("O")).To(dto => dto.CreatedAtIso);
+});
+
+var mappedDto = mapper.Map(order).ToANew();
+```
+
+**NuGet Packages:**
+
+* https://www.nuget.org/packages/AgileObjects.AgileMapper
+
+
+---
+
+#### Manual (Pure) Mapping (no library)
+
+Straightforward, fastest, and most explicit. Good for simple applications which doesn't need long term maintenance. Hand-written mapping is faster, safer, and more maintainable. And for tiny mappings, you can still use manual mapping.
+
+* Examples of when manual mapping is better than libraries.
+
+```csharp
+public static class OrderMapping
+{
+ public static OrderDto ToDto(this Order s) => new()
+ {
+ Id = s.Id,
+ CustomerName = s.Customer.Name,
+ ItemCount = s.Lines.Sum(l => l.Quantity),
+ Total = s.Lines.Sum(l => l.Quantity * l.UnitPrice),
+ CreatedAtIso = s.CreatedAt.ToString("O")
+ };
+}
+
+// usage
+var dto = order.ToDto();
+
+// EF Core projection (best for perf + SQL translation)
+var mappedList = dbContext.Orders.Select(s => new OrderDto
+ {
+ Id = s.Id,
+ CustomerName = s.Customer.Name,
+ ItemCount = s.Lines.Sum(l => l.Quantity),
+ Total = s.Lines.Sum(l => l.Quantity * l.UnitPrice),
+ CreatedAtIso = s.CreatedAt.ToString("O")
+ }).ToList();
+```
+
+
+
+### Conclusion
+
+If you rely on AutoMapper today, it’s time to evaluate alternatives. For ABP Framework, we chose **Mapperly** due to active development, strong community, and compile-time performance. But your team may prefer **Mapster** for flexibility or even manual mapping for small apps. Your requirements might be different, your project is not a framework so you decide the best one for you.
diff --git a/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/cover.png b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/cover.png
new file mode 100644
index 0000000000..d1c7e26166
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/cover.png differ
diff --git a/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/mapster-mapperly-community-powers.png b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/mapster-mapperly-community-powers.png
new file mode 100644
index 0000000000..c2e3adbbfc
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-25-AutoMapper-Alternatives/mapster-mapperly-community-powers.png differ
diff --git a/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/POST.md b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/POST.md
new file mode 100644
index 0000000000..2d6c98102f
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/POST.md
@@ -0,0 +1,174 @@
+# Building a Permission-Based Authorization System for ASP.NET Core
+
+In this article, we'll explore different authorization approaches in ASP.NET Core and examine how ABP's permission-based authorization system works.
+
+First, we'll look at some of the core authorization types that come with ASP.NET Core, such as role-based, claims-based, policy-based, and resource-based authorization. We'll briefly review the pros and cons of each approach.
+
+Then, we'll dive into [ABP's Permission-Based Authorization System](https://abp.io/docs/latest/framework/fundamentals/authorization#permission-system). This is a more advanced approach that gives you fine-grained control over what users can do in your application. We'll also explore ABP's Permission Management Module, which makes managing permissions through the UI easily.
+
+## Understanding ASP.NET Core Authorization Types
+
+Before diving into permission-based authorization, let's examine some of the core authorization types available in ASP.NET Core:
+
+- **[Role-Based Authorization](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-9.0)** checks if the current user belongs to specific roles (like **"Admin"** or **"User"**) and grants access based on these roles. (For example, only users in the **"Manager"** role can access the employee salary management page.)
+
+- **[Claims-Based Authorization](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-9.0)** uses key-value pairs (claims) that describe user attributes, such as age, department, or security clearance. (For example, only users with a **"Department=Finance"** claim can view financial reports.) This provides more granular control but requires careful claim management (such as grouping claims under policies).
+
+- **[Policy-Based Authorization](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-9.0)** combines multiple requirements (roles, claims, custom logic) into reusable policies. It offers flexibility and centralized management, and **this is exactly why ABP's permission system is built on top of it!** (We'll discuss this in more detail later.)
+
+- **[Resource-Based Authorization](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/resourcebased?view=aspnetcore-9.0)** determines access by examining both the user and the specific item they want to access. (For example, a user can edit only their own blog posts, not others' posts.) Unlike policy-based authorization which applies the same rules everywhere, resource-based authorization makes decisions based on the actual data being accessed, requiring more complex implementation.
+
+Here's a quick comparison of these approaches:
+
+| Authorization Type | Pros | Cons |
+|-------------------|------|------|
+| **Role-Based** | Simple implementation, easy to understand | Becomes inflexible with complex role hierarchies |
+| **Claims-Based** | Granular control, flexible user attributes | Complex claim management, potential for claim explosion |
+| **Policy-Based** | Centralized logic, combines multiple requirements | Can become complex with numerous policies |
+| **Resource-Based** | Fine-grained per-resource control | Implementation complexity, resource-specific code |
+
+## What is Permission-Based Authorization?
+
+Permission-based authorization takes a different approach from other authorization types by defining specific permissions (like **"CreateUser"**, **"DeleteOrder"**, **"ViewReports"**) that represent granular actions within your application. These permissions can be assigned to users directly or through roles, providing both flexibility and clear action-based access control.
+
+ABP Framework's permission system is built on top of this approach and extends ASP.NET Core's policy-based authorization system, working seamlessly with it.
+
+## ABP Framework's Permission System
+
+ABP extends [ASP.NET Core Authorization](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/introduction?view=aspnetcore-9.0) by adding **permissions** as automatic [policies](https://learn.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-9.0) and allows the authorization system to be used in application services as well.
+
+This system provides a clean abstraction while maintaining full compatibility with ASP.NET Core's authorization infrastructure.
+
+ABP also provides a [Permission Management Module](https://abp.io/docs/latest/modules/permission-management) that offers a complete UI and API for managing permissions. This allows you to easily manage permissions in the UI, assign permissions to roles or users, and much more. (We'll see how to use it in the following sections.)
+
+### Defining Permissions in ABP
+
+In ABP, permissions are defined in classes (typically under the `*.Application.Contracts` project) that inherit from the `PermissionDefinitionProvider` class. Here's how you can define permissions for a book management system:
+
+```csharp
+public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider
+{
+ public override void Define(IPermissionDefinitionContext context)
+ {
+ var bookStoreGroup = context.AddGroup("BookStore");
+
+ var booksPermission = bookStoreGroup.AddPermission("BookStore.Books", L("Permission:Books"));
+ booksPermission.AddChild("BookStore.Books.Create", L("Permission:Books.Create"));
+ booksPermission.AddChild("BookStore.Books.Edit", L("Permission:Books.Edit"));
+ booksPermission.AddChild("BookStore.Books.Delete", L("Permission:Books.Delete"));
+ }
+
+ private static LocalizableString L(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
+```
+
+ABP automatically discovers this class and registers the permissions/policies in the system. You can then assign these permissions/policies to users/roles. There are two ways to do this:
+
+* Using the [Permission Management Module](https://abp.io/docs/latest/modules/permission-management)
+* Using the `IPermissionManager` service (via code)
+
+#### Setting Permissions to Roles and Users via Permission Management Module
+
+When you define a permission, it also becomes usable in the ASP.NET Core authorization system as a **policy name**. If you are using the [Permission Management Module](https://abp.io/docs/latest/modules/permission-management), you can manage the permissions through the UI:
+
+
+
+In the permission management UI, you can grant permissions to roles and users through the **Role Management** and **User Management** pages within the "permissions" modals. You can then easily check these permissions in your code. In the screenshot above, you can see the permission modal for the user's page, clearly showing the permissions granted to the user by their role. (**(R)** in the UI indicates that the permission is granted by one of the current user's roles.)
+
+#### Setting Permissions to Roles and Users via Code
+
+You can also set permissions for roles and users programmatically. You just need to inject the `IPermissionManager` service and use its `SetForRoleAsync` and `SetForUserAsync` methods (or similar methods):
+
+```csharp
+public class MyService : ITransientDependency
+{
+ private readonly IPermissionManager _permissionManager;
+
+ public MyService(IPermissionManager permissionManager)
+ {
+ _permissionManager = permissionManager;
+ }
+
+ public async Task GrantPermissionForUserAsync(Guid userId, string permissionName)
+ {
+ await _permissionManager.SetForUserAsync(userId, permissionName, true);
+ }
+
+ public async Task ProhibitPermissionForUserAsync(Guid userId, string permissionName)
+ {
+ await _permissionManager.SetForUserAsync(userId, permissionName, false);
+ }
+}
+```
+
+### Checking Permissions in AppServices and Controllers
+
+ABP provides multiple ways to check permissions. The most common approach is using the `[Authorize]` attribute and passing the permission/policy name.
+
+Here is an example of how to check permissions in an application service:
+
+```csharp
+[Authorize("BookStore.Books")]
+public class BookAppService : ApplicationService, IBookAppService
+{
+ [Authorize("BookStore.Books.Create")]
+ public async Task CreateAsync(CreateBookDto input)
+ {
+ //logic here
+ }
+}
+```
+
+> Notice that you can use the `[Authorize]` attribute at both class and method levels. In the example above, the `CreateAsync` method is marked with the `[Authorize]` attribute, so it will check the user's permission before executing the method. Since the application service class also has a permission requirement, both permissions must be granted to the user to execute the method!
+
+And here is an example of how to check permissions in a controller:
+
+```csharp
+[Authorize("BookStore.Books")]
+public class CreateBookController : AbpController
+{
+ //omitted for brevity...
+}
+```
+
+### Programmatic Permission Checking
+
+To conditionally control authorization in your code, you can use the `IAuthorizationService` service:
+
+```csharp
+public class BookAppService : ApplicationService, IBookAppService
+{
+ public async Task CreateAsync(CreateBookDto input)
+ {
+ // Checks the permission and throws an exception if the user does not have the permission
+ await AuthorizationService.CheckAsync(BookStorePermissions.Books.Create);
+
+ // Your logic here
+ }
+
+ public async Task CanUserCreateBooksAsync()
+ {
+ // Checks if the permission is granted for the current user
+ return await AuthorizationService.IsGrantedAsync(BookStorePermissions.Books.Create);
+ }
+}
+```
+
+You can use the `IAuthorizationService`'s helpful methods for authorization checking, as shown in the example above:
+
+- `IsGrantedAsync` checks if the current user has the given permission.
+- `CheckAsync` throws an exception if the current user does not have the given permission.
+- `AuthorizeAsync` checks if the current user has the given permission and returns an `AuthorizationResult`, which has a `Succeeded` property that you can use to verify if the user has the permission.
+
+Also notice that we did not inject the `IAuthorizationService` in the constructor, because we are using the `ApplicationService` base class, which already provides property injection for it. This means we can directly use it in our application services, just like other helpful base services (such as `ICurrentUser` and `ICurrentTenant`).
+
+## Conclusion
+
+Permission-based authorization in ABP Framework provides a powerful and flexible approach to securing your applications. By building on ASP.NET Core's policy-based authorization, ABP offers a clean abstraction that simplifies permission management while maintaining the full power of the underlying system.
+
+The ability to check permissions in both application services and controllers makes ABP Framework's authorization system very flexible and powerful, yet easy to use.
+
+Additionally, the Permission Management Module makes it very easy to manage permissions and roles through the UI. You can learn more about how it works in the [documentation](https://abp.io/docs/latest/modules/permission-management).
diff --git a/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/cover-image.png b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/cover-image.png
new file mode 100644
index 0000000000..f0a0796034
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/cover-image.png differ
diff --git a/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/permission-management-module.png b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/permission-management-module.png
new file mode 100644
index 0000000000..e22de787af
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-27-Building-a-permission-based-authorization-system-for-net-core/permission-management-module.png differ
diff --git a/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/article.md b/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/article.md
new file mode 100644
index 0000000000..f88bb0e41c
--- /dev/null
+++ b/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/article.md
@@ -0,0 +1,169 @@
+# Best Practices for Designing Backward‑Compatible REST APIs in a Microservice Solution for .NET Developers
+
+## Introduction
+With microservice architecture, each service develops and ships independently at its own pace, and clients infrequently update in lockstep. **Backward compatibility** means that when you release new versions, current consumers continue to function without changing code. This article provides a practical, 6–7 minute tutorial specific to **.NET developers**.
+
+---
+## What Counts as “Breaking”? (and what doesn’t)
+A change is **breaking** if a client that previously conformed can **fail at compile time or runtime**, or exhibit **different business‑critical behavior**, **without** changing that client in any way. In other words: if an old client needs to be altered in order to continue functioning as it did, your change is breaking.
+
+### Examples of breaking changes
+- **Deleting or renaming an endpoint** or modifying its URL/route.
+- **Making an existing field required** (e.g., requiring `address`).
+- **Data type or format changes** (e.g., `price: string` → `price: number`, or date format changes).
+- **Altering default behavior or ordering** that clients implicitly depend on (hidden contracts).
+- **Changing the error model** or HTTP status codes in a manner that breaks pre-existing error handling.
+- **Renaming fields** or **making optional fields required** in requests or responses.
+- **Reinterpreting semantics** (e.g., `status="closed"` formerly included archived items, but no longer does).
+
+### Examples of non‑breaking changes
+- **Optional fields or query parameters can be added** (clients may disregard them).
+- **Adding new enum values** (if the clients default to a safe behavior for unrecognized values).
+- **Adding a new endpoint** while leaving the previous one unchanged.
+- **Performance enhancements** that leave input/output unchanged.
+- **Including metadata** (e.g., pagination links) without changing the current payload shape.
+
+> Golden rule: **Old clients should continue to work exactly as they did before—without any changes.**
+
+---
+## Versioning Strategy
+Versioning is your master control lever for managing change. Typical methods:
+
+1) **URI Segment** (simplest)
+```
+GET /api/v1/orders
+GET /api/v2/orders
+```
+Pros: Cache/gateway‑friendly; explicit in docs. Cons: URL noise.
+
+2) **Header‑Based**
+```
+GET /api/orders
+x-api-version: 2.0
+```
+Pros: Clean URLs; multiple reader support. Cons: Needs proxy/CDN rules.
+
+3) **Media Type**
+ Accept: application/json;v=2
+
+ Pros: Semantically accurate. Cons: More complicated to test and implement. **Recommendation:** For the majority of teams, favor **URI segments**, with an optional **`x-api-version`** header for flexibility.
+
+### Quick Setup in ASP.NET Core (Asp.Versioning)
+```csharp
+// Program.cs
+using Asp.Versioning;
+
+builder.Services.AddControllers();
+builder.Services.AddApiVersioning(o =>
+{
+ o.DefaultApiVersion = new ApiVersion(1, 0);
+ o.AssumeDefaultVersionWhenUnspecified = true;
+ o.ReportApiVersions = true; // response header: api-supported-versions
+ o.ApiVersionReader = ApiVersionReader.Combine(
+ new UrlSegmentApiVersionReader(),
+ new HeaderApiVersionReader("x-api-version")
+ );
+});
+
+builder.Services.AddVersionedApiExplorer(o =>
+{
+ o.GroupNameFormat = "'v'VVV"; // v1, v2
+ o.SubstituteApiVersionInUrl = true;
+});
+```
+```csharp
+// Controller
+using Asp.Versioning;
+
+[ApiController]
+[Route("api/v{version:apiVersion}/orders")]
+public class OrdersController : ControllerBase
+{
+ [HttpGet]
+ [ApiVersion("1.0", Deprecated = true)]
+ public IActionResult GetV1() => Ok(new { message = "v1" });
+
+ [HttpGet]
+ [MapToApiVersion("2.0")]
+ public IActionResult GetV2() => Ok(new { message = "v2", includes = new []{"items"} });
+}
+```
+
+---
+## Schema Evolution Playbook (JSON & DTO)
+Obey the following rules for compatibility‑safe evolution:
+
+- **Add‑only changes**: Favor adding **optional** fields; do not remove/rename fields.
+- **Maintain defaults**: When the new field is disregarded, the old functionality must not change.
+- **Enum extension**: Clients should handle unknown enum values gracefully (default behavior).
+- **Deprecation pipeline**: Mark fields/endpoints as deprecated **at least one version** prior to removal and publicize extensively. - **Stability by contract**: Record any unspoken contracts (ordering, casing, formats) that clients depend on.
+
+### Example: adding a non‑breaking field
+```csharp
+public record OrderDto(
+ Guid Id,
+ decimal Total,
+ string Currency,
+ string? SalesChannel // new, optional
+);
+```
+
+---
+## Compatibility‑Safe API Behaviors
+- **Error model**: Use a standard structure (e.g., RFC 7807 `ProblemDetails`). Avoid ad‑hoc error shapes on a per-endpoint basis.
+- **Versioning/Deprecation communication** through headers:
+- `api-supported-versions: 1.0, 2.0`
+- `Deprecation: true` (in deprecated endpoints)
+- `Sunset: Wed, 01 Oct 2025 00:00:00 GMT` (planned deprecation date)
+- **Idempotency**: Use an `Idempotency-Key` header for retry-safe POSTs.
+- **Optimistic concurrency**: Utilize `ETag`/`If-Match` to prevent lost updates.
+- **Pagination**: Prefer cursor tokens (`nextPageToken`) to protect clients from sorting/index changes.
+- **Time**: Employ ISO‑8601 in UTC; record time‑zone semantics and rounding conventions.
+
+---
+## Rollout & Deprecation Policy
+A good deprecation policy is **announce → coexist → remove**:
+
+1) **Announce**: Release changelog, docs, and comms (mail/Slack) with v2 information and the sunset date.
+2) **Coexist**: Operate v1 and v2 side by side. Employ gateway percentage routing for progressive cutover.
+3) **Observability**: Monitor errors/latency/usage **by version**. When v1 traffic falls below ~5%, plan for removal. 4) **Remove**: Post sunset date, return **410 (Gone)** with a link to migration documentation.
+
+**Canary & Blue‑Green**: Initialize v2 with a small traffic portion and compare error/latency budgets prior to scaling up.
+
+---
+## Contract & Compatibility Testing
+- **Consumer‑Driven Contracts**: Write expectations using Pact.NET; verify at provider CI.
+- **Golden files / snapshots**: Freeze representative JSON payloads and automatically detect regressions.
+- **Version-specific smoke tests**: Maintain separate, minimal test suites for v1 and v2.
+- **SemVer discipline**: Minor = backward‑compatible; Major = breaking (avoid when possible).
+
+Minimal example (xUnit + snapshot style):
+```csharp
+[Fact]
+public async Task Orders_v1_contract_should_match_snapshot()
+{
+ var resp = await _client.GetStringAsync("/api/v1/orders");
+ Approvals.VerifyJson(resp); // snapshot comparison
+}
+```
+
+---
+## Tooling & Docs (for .NET)
+- **Asp.Versioning (NuGet)**: API versioning + ApiExplorer integration.
+- **Swashbuckle / NSwag**: Generate an OpenAPI definition **for every version** (`/swagger/v1/swagger.json`, `/swagger/v2/swagger.json`). Display both in Swagger UI.
+- **Polly**: Client‑side retries/fallbacks to handle transient failures and ensure resilience.
+- **Serilog + OpenTelemetry**: Collect metrics/logs/traces by version for observability and SLOs.
+
+Swagger UI configuration by group name:
+```csharp
+app.UseSwagger();
+app.UseSwaggerUI(c =>
+{
+c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1");
+c.SwaggerEndpoint("/swagger/v2/swagger.json", "API v2");
+});
+```
+---
+
+## Conclusion
+Backward compatibility is not a version number—it is **disciplined change management**. When you use add‑only schema evolution, a well‑defined versioning strategy, strict contract testing, and rolling rollout, you maintain microservice independence and safeguard consumer experience.
diff --git a/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/cover.png b/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/cover.png
new file mode 100644
index 0000000000..07f0782775
Binary files /dev/null and b/docs/en/Community-Articles/2025-08-27-backcompat-rest-apis-ms-dotnet/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-02-training-campaign/post.md b/docs/en/Community-Articles/2025-09-02-training-campaign/post.md
new file mode 100644
index 0000000000..20f2bcf4bd
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-02-training-campaign/post.md
@@ -0,0 +1,29 @@
+# IMPROVE YOUR ABP SKILLS WITH 33% OFF LIVE TRAININGS!
+
+We have exciting news to share\! As you know, we offer live training packages to help you improve your skills and knowledge of ABP. From September 8th to 19th, we are giving you 33% OFF our live trainings, so you can learn more about the product at a discounted price\!
+
+#### Why Join ABP.IO Training?
+
+ABP training programs are designed to help developers, architects, and teams master the ABP Framework efficiently. Whether you're new to the framework or looking to deepen your knowledge, our courses cover everything you need to build robust and scalable applications with ABP.
+
+#### What You’ll Gain:
+
+✔ Comprehensive live training from ABP Experts
+✔ Hands-on learning with real-world applications
+✔ Best practices for building modern web applications
+✔ Certification to showcase your expertise
+
+#### [Limited-Time 33% Discount – Don’t Miss Out\!](https://abp.io/trainings?utm_source=referral&utm_medium=website&utm_campaign=training_abpblogpost)
+
+For a short period, all training packages are available at a 33% discount. This is a great opportunity to upskill yourself or train your team at a significantly reduced cost.
+
+#### How to Get the Discount?
+
+Simply visit our training page, select your preferred package, add your note if needed and send your training request, that's all\! ABP Training Team will reply to your request via email soon.
+
+#### Take Advantage of This Offer Today
+
+Invest in your skills and advance your career with ABP.IO training. This offer won’t last long, so grab your spot now\!
+
+### 🔗[Pick your package and send your training request now!](https://abp.io/trainings?utm_source=referral&utm_medium=website&utm_campaign=training_abpblogpost)
+
diff --git a/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/1.png b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/1.png
new file mode 100644
index 0000000000..9168907741
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/1.png differ
diff --git a/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/2.png b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/2.png
new file mode 100644
index 0000000000..ff84b51766
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/2.png differ
diff --git a/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/POST.md b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/POST.md
new file mode 100644
index 0000000000..076e623ad8
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/POST.md
@@ -0,0 +1,335 @@
+# Keep Track of Your Users in an ASP.NET Core Application
+
+Tracking what users do in your app matters for security, debugging, and business insights. Doing it by hand usually means lots of boilerplate: managing request context, logging operations, tracking entity changes, and more. It adds complexity and makes mistakes more likely.
+
+## Why Applications Need Audit Logs
+
+Audit logs are time-ordered records that show what happened in your app.
+
+A good audit log should capture details for every web request, including:
+
+### 1. Request and Response Details
+- Basic info like **URL, HTTP method, browser**, and **HTTP status code**
+- Network info like **client IP address** and **user agent**
+- **Request parameters** and **response content** when needed
+
+### 2. Operations Performed
+- **Controller actions** and **application service method calls** with parameters
+- **Execution time** and **duration** for performance tracking
+- **Call chains** and **dependencies** where helpful
+
+### 3. Entity Changes
+- **Entity changes** that happen during requests
+- **Property-level changes**, with old and new values
+- **Change types** (create, update, delete) and timestamps
+
+### 4. Exception Information
+- **Errors and exceptions** during request execution
+- **Exception stack traces** and **error context**
+- Clear records of failed operations
+
+### 5. Request Duration
+- Key metrics for **measuring performance**
+- **Finding bottlenecks** and optimization opportunities
+- Useful data for **monitoring system health**
+
+## The Challenge with Doing It by Hand
+
+In ASP.NET Core, developers often use middleware or MVC filters for tracking. Here’s what that looks like and the common problems you’ll hit.
+
+### Using Middleware
+
+Middleware are components in the ASP.NET Core pipeline that run during request processing.
+
+Manual tracking typically requires:
+- Writing custom middleware to intercept HTTP requests
+- Extracting user info (user ID, username, IP address, and so on)
+- Recording request start time and execution duration
+- Handling both success and failure cases
+- Saving audit data to logs or a database
+
+### Tracking Inside Business Methods
+
+In your business code, you also need to:
+- Log the start and end of important operations
+- Capture errors and related context
+- Link business operations to the request-level audit data
+- Make sure you track all critical actions
+
+### Problems with Manual Tracking
+
+Manual tracking has some big downsides:
+
+**Code duplication and maintenance pain**: Each controller ends up repeating similar tracking logic. Changing the rules means touching many places, and it’s easy to miss some.
+
+**Consistency and reliability issues**: Different people implement tracking differently. Exception paths are easy to forget. It’s hard to ensure complete coverage.
+
+**Performance and scalability concerns**: Homegrown tracking can slow the app if not designed well. Tuning and extending it takes effort.
+
+**Entity change tracking is especially hard**. It often requires:
+- Recording original values before updates
+- Comparing old and new values for each property
+- Handling complex types, collections, and navigation properties
+- Designing and saving change records
+- Capturing data even when exceptions happen
+
+This usually leads to:
+- **A lot of code** in every update method
+- **Easy-to-miss edge cases** and subtle bugs
+- **High maintenance** when entity models change
+- **Extra queries and comparisons** that can hurt performance
+- **Incomplete coverage** for complex scenarios
+
+## ABP Framework’s Built-in Solution
+
+ABP Framework includes a built-in audit logging system. It solves the problems above and adds useful features on top.
+
+### Simple Setup vs. Manual Tracking
+
+Instead of writing lots of code, you configure it once:
+
+```csharp
+// Configure audit log options in the module's ConfigureServices method
+Configure(options =>
+{
+ options.IsEnabled = true; // Enable audit log system (default value)
+ options.IsEnabledForAnonymousUsers = true; // Track anonymous users (default value)
+ options.IsEnabledForGetRequests = false; // Skip GET requests (default value)
+ options.AlwaysLogOnException = true; // Always log on errors (default value)
+ options.HideErrors = true; // Hide audit log errors (default value)
+ options.EntityHistorySelectors.AddAllEntities(); // Track all entity changes
+});
+```
+
+```csharp
+// Add middleware in the module's OnApplicationInitialization method
+public override void OnApplicationInitialization(ApplicationInitializationContext context)
+{
+ var app = context.GetApplicationBuilder();
+
+ // Add audit log middleware - one line of code solves all problems!
+ app.UseAuditing();
+}
+```
+
+By contrast, manual tracking needs middleware, controller logic, exception handling, and often hundreds of lines. With ABP, a couple of lines enable it and it just works.
+
+## What You Get with ABP
+
+Here’s how ABP removes tracking code from your application and still captures what you need.
+
+### 1. Application Services: No Tracking Code
+
+Manual approach: You’d log inside each method and still risk missing cases.
+
+ABP approach: Tracking is automatic—no tracking code in your methods.
+
+```csharp
+public class BookAppService : ApplicationService
+{
+ private readonly IRepository _bookRepository;
+ private readonly IRepository _authorRepository;
+
+ [Authorize(BookPermissions.Create)]
+ public virtual async Task CreateAsync(CreateBookDto input)
+ {
+ // No need to write any tracking code!
+ // ABP automatically tracks:
+ // - Method calls and parameters
+ // - Calling user
+ // - Execution duration
+ // - Any exceptions thrown
+
+ var author = await _authorRepository.GetAsync(input.AuthorId);
+ var book = new Book(input.Title, author, input.Price);
+
+ await _bookRepository.InsertAsync(book);
+
+ return ObjectMapper.Map(book);
+ }
+
+ [Authorize(BookPermissions.Update)]
+ public virtual async Task UpdateAsync(Guid id, UpdateBookDto input)
+ {
+ var book = await _bookRepository.GetAsync(id);
+
+ // No need to write any entity change tracking code!
+ // ABP automatically tracks entity changes:
+ // - Which properties changed
+ // - Old and new values
+ // - When the change happened
+
+ book.ChangeTitle(input.Title);
+ book.ChangePrice(input.Price);
+
+ await _bookRepository.UpdateAsync(book);
+
+ return ObjectMapper.Map(book);
+ }
+}
+```
+
+With manual code, each method might need 20–30 lines for tracking. With ABP, it’s zero—and you still get richer data.
+
+For entity changes, ABP also saves you from writing comparison code. It handles:
+- Property change detection
+- Recording old and new values
+- Complex types and collections
+- Navigation property changes
+- All with no extra code to maintain
+
+### 2. Entity Change Tracking: One Line to Turn It On
+
+Manual approach: You’d compare properties, serialize complex types, track collection changes, and write to storage.
+
+ABP approach: Mark the entity or select entities globally.
+
+```csharp
+// Enable audit log for specific entity - one line of code solves all problems!
+[Audited]
+public class MyEntity : Entity
+{
+ public string Name { get; set; }
+ public string Description { get; set; }
+
+ [DisableAuditing] // Exclude sensitive data - security control
+ public string InternalNotes { get; set; }
+}
+```
+
+```csharp
+// Or global configuration - batch processing
+Configure(options =>
+{
+ // Track all entities - one line of code tracks all entity changes
+ options.EntityHistorySelectors.AddAllEntities();
+
+ // Or use custom selector - precise control
+ options.EntityHistorySelectors.Add(
+ new NamedTypeSelector(
+ "MySelectorName",
+ type => typeof(IEntity).IsAssignableFrom(type)
+ )
+ );
+});
+```
+
+### 3. Extension Features
+
+Manual approach: Adding custom tracking usually spreads across many places and is hard to test.
+
+ABP approach: Use a contributor for clean, centralized extensions.
+
+```csharp
+public class MyAuditLogContributor : AuditLogContributor
+{
+ public override void PreContribute(AuditLogContributionContext context)
+ {
+ var currentUser = context.ServiceProvider.GetRequiredService();
+
+ // Easily add custom properties - manual implementation needs lots of work
+ context.AuditInfo.SetProperty(
+ "MyCustomClaimValue",
+ currentUser.FindClaimValue("MyCustomClaim")
+ );
+ }
+
+ public override void PostContribute(AuditLogContributionContext context)
+ {
+ // Add custom comments - business logic integration
+ context.AuditInfo.Comments.Add("Some comment...");
+ }
+}
+
+// Register contributor - one line of code enables extension features
+Configure(options =>
+{
+ options.Contributors.Add(new MyAuditLogContributor());
+});
+```
+
+### 4. Precise Control
+
+Manual approach: You end up with complex conditional logic.
+
+ABP approach: Use attributes for simple, precise control.
+
+```csharp
+// Disable audit log for specific controller - precise control
+[DisableAuditing]
+public class HomeController : AbpController
+{
+ // Health check endpoints won't be audited - avoid meaningless logs
+}
+
+// Disable for specific action - method-level control
+public class HomeController : AbpController
+{
+ [DisableAuditing]
+ public async Task Home()
+ {
+ // This action won't be audited - public data access
+ }
+
+ public async Task OtherActionLogged()
+ {
+ // This action will be audited - important business operation
+ }
+}
+```
+
+### 5. Visual Management of Audit Logs
+
+ABP also provides a UI to browse and inspect audit logs:
+
+
+
+
+
+## Manual vs. ABP: A Quick Comparison
+
+The benefits of ABP’s audit log system compared to doing it by hand:
+
+| Aspect | Manual Implementation | ABP Audit Logs |
+|--------|----------------------|----------------|
+| **Setup Complexity** | High — Write middleware, services, repository code | Low — A few lines of config, works out of the box |
+| **Code Maintenance** | High — Tracking code spread across the app | Low — Centralized, convention-based |
+| **Consistency** | Variable — Depends on discipline | Consistent — Automated and standardized |
+| **Performance** | Risky without careful tuning | Built-in optimizations and scope control |
+| **Functionality Completeness** | Basic tracking only | Comprehensive by default |
+| **Error Handling** | Easy to miss edge cases | Automatic and reliable |
+| **Data Integrity** | Manual effort required | Handled by the framework |
+| **Extensibility** | Custom work is costly | Rich extension points |
+| **Development Efficiency** | Weeks to build | Minutes to enable |
+| **Learning Cost** | Understand many details | Convention-based, low effort |
+
+## Why ABP Audit Logs Matter
+
+ABP’s audit logging removes the boilerplate from user tracking in ASP.NET Core apps.
+
+### Core Idea
+
+Manual tracking is error-prone and hard to maintain. ABP gives you a convention-based, automated system that works with minimal setup.
+
+### Key Benefits
+
+ABP runs by convention, so you don’t need repetitive code. You can control behavior at the request, entity, and method levels. It automatically captures request details, operations, entity changes, and exceptions, and you can extend it with contributors when needed.
+
+### Results in Practice
+
+| Metric | Manual Implementation | ABP Implementation | Improvement |
+|--------|----------------------|-------------------|-------------|
+| Development Time | Weeks | Minutes | **99%+** |
+| Lines of Code | Hundreds of lines | 2 lines of config | **99%+** |
+| Maintenance Cost | High | Low | **Significant** |
+| Functionality Completeness | Basic | Comprehensive | **Significant** |
+| Error Rate | Higher risk | Lower risk | **Improved** |
+
+### Recommendation
+
+If you need audit logs, start with ABP’s built-in system. It reduces effort, improves consistency, and stays flexible as your app grows. You can focus on your business logic and let the framework handle the infrastructure.
+
+## References
+
+- [ABP Audit Logging](https://abp.io/docs/latest/framework/infrastructure/audit-logging)
+- [ABP Audit Logging UI](https://abp.io/modules/Volo.AuditLogging.Ui)
diff --git a/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/cover.png b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/cover.png
new file mode 100644
index 0000000000..7030e285b2
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-03-Keep-Track-of-Your-Users-in-an-ASP.NET-Core-Application/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/Post.md b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/Post.md
new file mode 100644
index 0000000000..3de235e86d
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/Post.md
@@ -0,0 +1,173 @@
+# .NET 10: What You Need to Know (LTS Release, Coming November 2025)
+
+The next version of .NET is .NET 10 and it is coming with **Long-Term Support (LTS)**, scheduled for **November 2025**.
+
+On **September 9, 2025**, Microsoft released **.NET 10 Release Candidate 1 (RC1)**, which supports go-live usage and is compatible with [Visual Studio 2026 Insider](https://visualstudio.microsoft.com/insiders/) and [Visual Studio Code Insider](https://code.visualstudio.com/insiders/) via the [C# Dev Kit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) extension.
+
+------
+
+## .NET 10 Runtime Enhancements
+
+- **JIT Speed-ups**: Enhanced struct argument handling—members now go directly into registers, reducing memory load/store operations.
+- **Advanced Loop Optimization**: New graph-based loop inversion improves precision and boosts further optimizations.
+- **Array Interface De-virtualization**: Critical for performance, now array-based enumerations inline and skip virtual calls including de-abstraction of array enumeration and small-array stack allocation.
+- **General JIT Improvements**: Better code layout and branch reduction support overall efficiency.
+
+------
+
+## Language & Library Upgrades
+
+### C# 14 Enhancements
+
+- Field-backed properties: easier custom getters/setters.
+- `nameof` for unbound generics like `List<>`.
+- Implicit conversions for `Span` and `ReadOnlySpan`.
+- Lambda parameter modifiers (`ref`, `in`, `out`).
+- Partial constructors/events.
+- `extension` blocks for static extension members.
+- Null-conditional assignment (`?.=`) and custom compound/increment operators.
+
+### F# & Visual Basic Enhancements
+
+- F# improvements via `preview`, updated `FSharp.Core`, and compiler fixes.
+- VB compiler supports `unmanaged` generics and respects `OverloadResolutionPriorityAttribute` for performance and overload clarity.
+
+## .NET Libraries & SDK
+
+### Libraries:
+
+- Better ZipArchive performance (lazy entry loading).
+- JSON improvements, including `JsonSourceGenerationOptions` and reference-handling tweaks.
+- Enhanced `OrderedDictionary`, ISOWeek date APIs, PEM data and certificate handling, `CompareOptions.NumericOrdering`
+
+### SDK & CLI:
+
+- No major new SDK features in RC1—you should expect stability fixes rather than additions.
+- Earlier previews brought JSON support improvements (e.g., `PipeReader` for JSON, WebSocketStream, ML-DSA crypto, AES KeyWrap), TLS 1.3 for macOS
+
+------
+
+## ASP.NET Core & Blazor
+
+### Blazor & Web App Security:
+
+Enhanced OIDC and Microsoft Entra ID integration, including encrypted token caching and Key Vault use.
+
+### UI Enhancements:
+
+- `QuickGrid` gains `RowClass` for conditional styling.
+- Scripts now served as static assets with compression and fingerprinting.
+- NavigationManager no longer scrolls to top for same-page updates.
+
+### API Improvements:
+
+Full support for OpenAPI 3.1 (JSON Schema draft 2020-12), and metrics for authentication/authorization events (e.g., sign-ins, logins) .
+
+------
+
+## .NET MAUI
+
+Updates include multiple file selection, image compression, WebView request interception, and support for Android API 35/36.
+
+## EF Core
+
+LINQ enhancements, performance boosts, better Azure Cosmos DB support, and more flexible named query filters.
+
+
+
+## Breaking Changes in .NET 10
+
+### ASP.NET Core - Breaking Changes in .NET 10:
+
+.NET 10 Preview 7 brings **several deprecations + behavior changes**, while **RC1 removes the old WebHost model**.
+
+- **[Cookie login redirects disabled](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/cookie-authentication-api-endpoints)** → Redirects no longer occur for API endpoints; APIs now return `401`/`403`. *(Behavioral change)*
+- **[WithOpenApi deprecated](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/withopenapi-deprecated)** → Extension method removed; use updated OpenAPI generator features. *(Source incompatible)*
+- **[Exception diagnostics suppressed](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/exception-handler-diagnostics-suppressed)** → When `TryHandleAsync` returns true, exception details aren’t logged. *(Behavioral change)*
+- **[IActionContextAccessor obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/iactioncontextaccessor-obsolete)** → Marked obsolete; may break code depending on it. *(Source/behavioral change)*
+- **[IncludeOpenAPIAnalyzers deprecated](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/openapi-analyzers-deprecated)** → Property and MVC API analyzers removed. *(Source incompatible)*
+- **[IPNetwork & KnownNetworks obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/ipnetwork-knownnetworks-obsolete)** → Old networking APIs removed in favor of new ones. *(Source incompatible)*
+- **[ApiDescription.Client package deprecated](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/apidescription-client-deprecated)** → No longer maintained; migrate to other tools. *(Source incompatible)*
+- **[Razor run-time compilation obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/razor-runtime-compilation-obsolete)** → Disabled at runtime; precompilation required. *(Source incompatible)*
+- **[WebHostBuilder, IWebHost, WebHost obsolete](https://learn.microsoft.com/en-us/dotnet/core/compatibility/aspnet-core/10/webhostbuilder-deprecated)** → Legacy hosting model deprecated; use `WebApplicationBuilder`. *(Source incompatible, RC1)*
+
+### EF Core - Breaking Changes in .NET 10:
+
+You can find the complete list at [Microsoft EF Core 10 Breaking Changes page](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-10.0/breaking-changes). Here's the brief summary:
+
+#### EF Core - SQL Server
+
+- **JSON column type by default (Azure SQL / compat level ≥170).** Primitive collections and owned types mapped to JSON now use SQL Server’s native `json` type instead of `nvarchar(max)`. A migration may alter existing columns. Mitigate by setting compat level <170 or explicitly forcing `nvarchar(max)`.
+- **`ExecuteUpdateAsync` signature change.** Column setters now take a regular `Func<…>` (not an expression). Dynamic expression-tree code won’t compile; replace with imperative setters inside the lambda.
+
+#### Microsoft.Data.Sqlite
+
+- **`GetDateTimeOffset` (no offset) assumes UTC.** Previously assumed local time. You can temporarily revert via `AppContext.SetSwitch("Microsoft.Data.Sqlite.Pre10TimeZoneHandling", true)`.
+- **Writing `DateTimeOffset` to REAL stores UTC.** Conversion now happens before writing; revertable with the same switch.
+- **`GetDateTime` (with offset) returns UTC `DateTime` (`DateTimeKind.Utc`).** Was `Local` before. Same temporary switch if needed.
+
+#### Who’s most affected
+
+- Apps on **Azure SQL / SQL Server 2025** using JSON mapping.
+- Codebases building **expression trees** for bulk updates.
+- Apps using **SQLite** with date/time parsing or REAL timestamp storage.
+
+#### Quick mitigations
+
+- Set SQL Server compatibility <170 or force column type.
+- Rewrite `ExecuteUpdateAsync` callers to use the new delegate form.
+- For SQLite, update handling to UTC or use the temporary AppContext switch while transitioning.
+
+### Containers - Breaking Changes in .NET 10:
+
+Default .NET images now use [Ubuntu](https://learn.microsoft.com/en-us/dotnet/core/compatibility/containers/10.0/default-images-use-ubuntu).
+
+### Core Libraries - Breaking Changes in .NET 10:
+
+[ActivitySource](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/activity-sampling) behavior tweaks; [generic math](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/generic-math) shift behavior aligned; W3C trace context is [default](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/default-trace-context-propagator); [DriveInfo](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/driveinfo-driveformat-linux) reports Linux FS types; InlineArray size rules tightened; [System.Linq.AsyncEnumerable](https://learn.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/10.0/asyncenumerable) included in core libs...
+
+### Cryptography - Breaking Changes in .NET 10:
+
+[Stricter X500](https://learn.microsoft.com/en-us/dotnet/core/compatibility/cryptography/10.0/x500distinguishedname-validation) name validation; [OpenSSL](https://learn.microsoft.com/en-us/dotnet/core/compatibility/cryptography/10.0/openssl-macos-unsupported) primitives unsupported on macOS; [some key members](https://learn.microsoft.com/en-us/dotnet/core/compatibility/cryptography/10.0/mldsa-slhdsa-secretkey-to-privatekey) nullable/renamed; env var [rename to](https://learn.microsoft.com/en-us/dotnet/core/compatibility/cryptography/10.0/version-override) `DOTNET_OPENSSL_VERSION_OVERRIDE`.
+
+### Extensions - Breaking Changes in .NET 10:
+
+[Config preserves](https://learn.microsoft.com/en-us/dotnet/core/compatibility/extensions/10.0/configuration-null-values-preserved) nulls; [logging](https://learn.microsoft.com/en-us/dotnet/core/compatibility/extensions/10.0/console-json-logging-duplicate-messages)/[package](https://learn.microsoft.com/en-us/dotnet/core/compatibility/extensions/10.0/provideraliasattribute-moved-assembly)/trim annotations changes; some [trim-unsafe](https://learn.microsoft.com/en-us/dotnet/core/compatibility/extensions/10.0/dynamically-accessed-members-configuration) code annotations removed.
+
+### Globalization & Interop - Breaking Changes in .NET 10:
+
+[ICU](https://learn.microsoft.com/en-us/dotnet/core/compatibility/globalization/10.0/version-override) env var renamed; single-file apps stop probing executable dir for native libs; [DllImport](https://learn.microsoft.com/en-us/dotnet/core/compatibility/interop/10.0/search-assembly-directory) search path tightened.
+
+Networking:
+
+[HTTP/3 disabled ](https://learn.microsoft.com/en-us/dotnet/core/compatibility/networking/10.0/http3-disabled-with-publishtrimmed) by default when trimming; [default cert revocation](https://learn.microsoft.com/en-us/dotnet/core/compatibility/networking/10.0/ssl-certificate-revocation-check-default) check now Online; [browser clients](https://learn.microsoft.com/en-us/dotnet/core/compatibility/networking/10.0/default-http-streaming) stream responses by default; [URI length limits](https://learn.microsoft.com/en-us/dotnet/core/compatibility/networking/10.0/uri-length-limits-removed) removed.
+
+### SDK & MSBuild/NuGet - Breaking Changes in .NET 10:
+
+`dotnet --interactive` [defaults to true](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/dotnet-cli-interactive); tool packages are [RID-specific](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/dotnet-tool-pack-publish); [workload](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/default-workload-config) sets default; `dotnet new sln` uses [SLNX](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/dotnet-new-sln-slnx-default); restore audits transitives; [local tool](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/dotnet-tool-install-local-manifest) install creates manifest by default; `project.json` [not supported](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/dotnet-restore-project-json-unsupported); stricter NuGet [validation](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/nuget-packageid-validation)/[errors](https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/10.0/http-warnings-to-errors).
+
+WinForms/WPF:
+
+Multiple [API obsoletions](https://learn.microsoft.com/en-us/dotnet/core/compatibility/windows-forms/10.0/obsolete-apis)/parameter [renames](https://learn.microsoft.com/en-us/dotnet/core/compatibility/windows-forms/10.0/insertadjacentelement-orientation); [rendering](https://learn.microsoft.com/en-us/dotnet/core/compatibility/windows-forms/10.0/statusstrip-renderer)/behavior tweaks; stricter XAML rules (e.g., [disallow empty row](https://learn.microsoft.com/en-us/dotnet/core/compatibility/wpf/10.0/empty-grid-definitions)/column definitions or incorrect usage of [DynamicResource](https://learn.microsoft.com/en-us/dotnet/core/compatibility/wpf/10.0/dynamicresource-crash) will crash).
+
+
+
+------
+
+
+
+## Support Policy for .NET 10
+As you can see from the picture below, **.NET 10 has long term support** therefore it will be maintained for 3 years **until November 2028**.
+
+[](https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core)
+
+
+
+## Download .NET10
+
+Click 👉 https://dotnet.microsoft.com/en-us/download/dotnet/10.0 to download the latest release candidate (currently RC.1).
+
+[](https://dotnet.microsoft.com/en-us/download/dotnet/10.0)
+
+Also to use the latest features, download/update your Visual Studio to the latest 👉 https://visualstudio.microsoft.com/downloads/
+
diff --git a/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/cover.png b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/cover.png
new file mode 100644
index 0000000000..e85f53b9ec
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-1.png b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-1.png
new file mode 100644
index 0000000000..970f3194bc
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-1.png differ
diff --git a/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-2.png b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-2.png
new file mode 100644
index 0000000000..6e5b57c588
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-10-NET10-What-You-Need-To-Know/image-2.png differ
diff --git a/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/coverimage.png b/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/coverimage.png
new file mode 100644
index 0000000000..41499bea9a
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/coverimage.png differ
diff --git a/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/post.md b/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/post.md
new file mode 100644
index 0000000000..03981e04c6
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-10-Truly-Layering-a-NET-Application-Based-on-DDD-Principles/post.md
@@ -0,0 +1,191 @@
+# **Truly Layering a .NET Application Based on DDD Principles**
+
+Okay, so we ALL been there, right? You start new project thinking "this time will be different" - clean code, perfect architecture, everything organized. Fast forward 3 months and your codebase look like someone throw grenade into bowl of spaghetti. Business logic everywhere, your controllers doing database work, and every new feature feel like defusing bomb.
+
+I been there too many times, and honestly, it suck. But here thing - there actually way to build .NET apps that not turn into maintenance nightmare. It called **Layered Architecture** + **Domain-Driven Design (DDD)**, and once you get it, it game changer.
+
+Let me walk you through this step by step, no fluff, just practical stuff that actually work.
+
+### **Layered Architecture 101 (The Foundation)**
+
+So layered architecture basically about keeping your code organized. Instead of having everything mixed together like bad smoothie, you separate concerns into different layers. Think like organizing your room - clothes go in closet, books on shelf, etc.
+
+Here how it typically break down:
+
+ * **Presentation Layer (UI):** This what users actually see and click on - your ASP.NET Core MVC stuff, Razor Pages, Blazor, whatever float your boat.
+ * **Application Layer:** The conductor of orchestra. It not do heavy lifting itself, but tell everyone else what to do. It like middle manager of your code.
+ * **Domain Layer:** The VIP section. This where all your business rules live - entities, value objects, whole nine yards. This layer pure and not give damn about databases or UI.
+ * **Infrastructure Layer:** The "how-to" guy. Database stuff, email sending, API calls - basically all technical plumbing that make everything work.
+
+The golden rule? **Dependency Rule**: Layers can only talk to layers below them (or more central). UI talk to Application, Application talk to Domain, but Domain? Domain not talk to anyone. It the cool kid that everyone want to hang out with.
+
+### **DDD: Where Magic Happen**
+
+Alright, so DDD not some fancy framework you install from NuGet. It more like mindset - basically saying "hey, let make our code actually reflect business we building for." Instead of having bunch of random classes, we organize everything around actual business domain.
+
+Think like this: if you building e-commerce app, your code should scream "I'M E-COMMERCE APP" not "I'M BUNCH OF RANDOM CLASSES."
+
+Here toolkit DDD give you (all living in your Domain Layer):
+
+ * **Entity:** This something that have identity. Like `Customer` - two customers with same name still different people because they have different IDs. It like having two friends named John - they not same person.
+ * **Value Object:** Opposite of entity. It defined by what it contain, not who it is. `Address` perfect for this - if two addresses have same street, city, and zip code, they same address. Usually immutable too.
+ * **Aggregate & Aggregate Root:** This where it get interesting. Aggregate like family of related objects that stick together. **Aggregate Root** head of family - only one you talk to when you want change something. Like `Order` that contain `OrderItem`s. You not mess with `OrderItem` directly, you tell `Order` to handle it.
+ * **Repository (Interface):** Think like your data access contract. It say "here how you can get and save stuff" without caring about whether it SQL Server, MongoDB, or file on your desktop. Interface live in Domain, implementation go in Infrastructure.
+ * **Domain Service:** When business logic too complex for single entity or value object, this your go-to. It like utility class but for business rules.
+
+### **Putting It All Together: Real C# Code**
+
+Alright, enough theory. Let see what this actually look like in real .NET solution. You typically have projects like:
+
+ * `MyProject.Domain` (or `.Core`) - The VIP section
+ * `MyProject.Application` - The middle manager
+ * `MyProject.Infrastructure` - The technical guy
+ * `MyProject.Web` (or whatever UI you using) - The pretty face
+
+**1. The Domain Layer (`MyProject.Domain`) - The Heart**
+
+This where magic happen. Zero dependencies on other projects (maybe some basic utility libraries, but that it). Pure business logic, no database nonsense, no UI concerns.
+
+```csharp
+// In MyProject.Domain/Orders/Order.cs
+public class Order : AggregateRoot
+{
+ public Address ShippingAddress { get; private set; }
+ private readonly List _orderItems = new();
+ public IReadOnlyCollection OrderItems => _orderItems.AsReadOnly();
+
+ // Private constructor for ORM
+ private Order() { }
+
+ public Order(Guid id, Address shippingAddress) : base(id)
+ {
+ ShippingAddress = shippingAddress;
+ }
+
+ public void AddOrderItem(Guid productId, int quantity, decimal price)
+ {
+ if (quantity <= 0)
+ {
+ throw new BusinessException("Quantity must be greater than zero.");
+ }
+ // More business rules...
+ _orderItems.Add(new OrderItem(productId, quantity, price));
+ }
+}
+
+// In MyProject.Domain/Orders/IOrderRepository.cs
+public interface IOrderRepository
+{
+ Task GetAsync(Guid id);
+ Task AddAsync(Order order);
+ Task UpdateAsync(Order order);
+}
+```
+
+See what I mean? The `Order` class all about business rules (`AddOrderItem` with validation and all that jazz). It not give damn about databases or how it get saved. That someone else problem.
+
+**2. The Application Layer (`MyProject.Application`) - The Conductor**
+
+This where we orchestrate everything. It talk to domain objects and use repositories to get/save data. Think like middle manager that coordinate work but not do heavy lifting.
+
+```csharp
+// In MyProject.Application/Orders/OrderAppService.cs
+public class OrderAppService
+{
+ private readonly IOrderRepository _orderRepository;
+
+ public OrderAppService(IOrderRepository orderRepository)
+ {
+ _orderRepository = orderRepository;
+ }
+
+ public async Task CreateOrderAsync(CreateOrderDto input)
+ {
+ var shippingAddress = new Address(input.Street, input.City, input.ZipCode);
+ var order = new Order(Guid.NewGuid(), shippingAddress);
+
+ foreach (var item in input.Items)
+ {
+ order.AddOrderItem(item.ProductId, item.Quantity, item.Price);
+ }
+
+ await _orderRepository.AddAsync(order);
+ }
+}
+```
+
+The application service coordinate everything but let domain objects handle actual business rules. Clean separation!
+
+**3. The Infrastructure Layer (`MyProject.Infrastructure`) - The Technical Guy**
+
+This where we implement all interfaces we defined in domain. Entity Framework Core, email services, API clients - all technical plumbing live here.
+
+```csharp
+// In MyProject.Infrastructure/Orders/EfCoreOrderRepository.cs
+public class EfCoreOrderRepository : IOrderRepository
+{
+ private readonly MyDbContext _dbContext;
+
+ public EfCoreOrderRepository(MyDbContext dbContext)
+ {
+ _dbContext = dbContext;
+ }
+
+ public async Task GetAsync(Guid id)
+ {
+ // EF Core logic to get the order
+ return await _dbContext.Orders.FindAsync(id);
+ }
+
+ public async Task AddAsync(Order order)
+ {
+ await _dbContext.Orders.AddAsync(order);
+ }
+
+ // ... other implementations
+}
+```
+
+### **ABP Framework: The Shortcut (Because We Lazy)**
+
+Look, setting all this up from scratch pain. That where **ABP Framework** come in clutch. It basically DDD and layered architecture on steroids, and it do all boring setup work for you.
+
+ABP not just talk talk - it walk walk. When you create new ABP solution, boom! Perfect project structure, all layered and DDD-compliant, ready to go.
+
+Here what you get out of box:
+
+ * **Base Classes:** `AggregateRoot`, `Entity`, `ValueObject` - all with good stuff like optimistic concurrency and domain events. No more writing boilerplate.
+ * **Generic Repositories:** No more writing `IRepository` interfaces for every single entity. ABP give you `IRepository` with all standard CRUD methods. Just inject it and go.
+ * **Application Services:** Inherit from `ApplicationService` and boom - you done. It handle validation, authorization, exception handling, all that cross-cutting concern stuff without cluttering your actual business logic.
+
+With ABP, our `OrderAppService` become way cleaner:
+
+```csharp
+// In ABP project, this much cleaner
+public class OrderAppService : ApplicationService, IOrderAppService
+{
+ private readonly IRepository _orderRepository;
+
+ public OrderAppService(IRepository orderRepository)
+ {
+ _orderRepository = orderRepository;
+ }
+
+ public async Task CreateAsync(CreateOrderDto input)
+ {
+ // ... same logic as before, but using ABP generic repository
+ var order = new Order(...);
+ await _orderRepository.InsertAsync(order);
+ }
+}
+```
+
+### **Wrapping Up**
+
+Look, I get it - this stuff take discipline and it not always fastest way to get features out door. But here thing: when you actually layer your app properly and put solid Domain Model at center, you end up with software that not suck to maintain.
+
+Your code start speaking language of business instead of some random technical jargon. That whole point of DDD - make your code reflect what you actually building for.
+
+Yeah, it take work upfront, but payoff huge. And frameworks like ABP make journey way less painful. Trust me, your future self will thank you when you not debugging spaghetti code at 2 AM.
+
+What you think? You try this approach before, or you still stuck in spaghetti code phase? Let me know in comments!
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2025-09-11-Best-Practices-Guide-for-REST-API-Design/post.md b/docs/en/Community-Articles/2025-09-11-Best-Practices-Guide-for-REST-API-Design/post.md
new file mode 100644
index 0000000000..6a20336307
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-11-Best-Practices-Guide-for-REST-API-Design/post.md
@@ -0,0 +1,333 @@
+# Best Practices Guide for REST API Design
+
+This guide compiles best practices for building robust, scalable, and sustainable RESTful APIs, based on information gathered from various sources.
+
+## 1. Fundamentals of REST Architecture
+
+REST is based on specific constraints and principles that support features like simplicity, scalability, and statelessness. The six core principles of RESTful architecture are:
+
+- **Uniform Interface**: This is about consistency. You use standard HTTP methods (GET, POST, PUT, DELETE) and URIs to interact with resources. The client knows how to talk to the server without needing some custom instruction manual.
+
+- **Client-Server**: The client (e.g., a frontend app) and the server are separate. The server handles data and logic, the client handles the user interface. They can evolve independently as long as the API contract doesn't change.
+
+- **Stateless**: This is a big one. The server doesn't remember anything about the client between requests. Every single request must contain all the info needed to process it (like an auth token). This is key for scalability.
+
+- **Cacheable**: Responses should declare whether they can be cached or not. Good caching can massively improve performance and reduce server load.
+
+- **Layered System**: You can have things like proxies or load balancers between the client and the server without the client knowing. It just talks to one endpoint, and the layers in between handle the rest.
+
+- **Code on Demand (Optional)**: This is the only optional one. It means the server can send back executable code (like JavaScript) to the client. Less common in the world of modern SPAs, but it's part of the spec.
+
+## 2. URI Design and Naming Conventions
+
+The URI structure is critical for making your API understandable and intuitive.
+
+### Use Nouns Instead of Verbs
+
+Your URIs should represent things (resources), not actions. The HTTP method already tells you what the action is.
+
+- **Good:** `/api/users`
+
+- **Bad:** `/api/getUsers`
+
+### Use Plural Nouns for Resource Names
+
+Stick with plural nouns for collections. It keeps things consistent, even when you're accessing a single item from that collection.
+
+- **Get all users:** `GET /api/users`
+
+- **Get a single user:** `GET /api/users/{id}`
+
+### Use Nested Routes to Show Relationships
+
+If a resource only exists in the context of another (like a user's orders), reflect that in the URL.
+
+- **Good:** `/api/users/{userId}/orders` (All orders for a user)
+
+- **Bad:** `/api/orders?userId={userId}`
+
+- **Good:** `/api/users/{userId}/orders/{orderId}` (A specific order for a user)
+
+**Note:** Use this structure only if the child resource is tightly coupled to the parent. Avoid nesting deeper than two or three levels, as this can complicate the URIs.
+
+### Path Parameters vs. Query Parameters
+
+Use the correct parameter type based on its function.
+
+- **Path Parameters (`/users/{id}`):** Use these to identify a specific resource or a collection. They are mandatory for the endpoint to resolve.
+
+ - *Example:* `GET /api/users/123` uniquely identifies user 123.
+
+- **Query Parameters (`?key=value`):** Use these for optional actions like filtering, sorting, or pagination on a collection.
+
+ - *Example:* `GET /api/users?role=admin&sort=lastName` filters the user collection.
+
+### Keep the URL Structure Consistent
+
+- **Use lowercase letters:** Since some systems are case-sensitive, always use lowercase in URIs for consistency.
+
+ - *Example:* Use `/api/product-offers` instead of `/api/Product-Offers`.
+
+- **Use special characters correctly:** Use characters like `/`, `?`, and `#` only for their defined purposes.
+
+ - *Example:* To get comments for a specific post, use the path `/posts/123/comments`. To filter those comments, use a query parameter: `/posts/123/comments?authorId=45`.
+
+## 3. Correct Usage of HTTP Methods
+
+Each HTTP method has a specific purpose. Sticking to these standards makes your API predictable.
+
+| **HTTP Method** | **Description** | **Idempotent*** | **Safe**** |
+| --------------- | --------------------------------------------------------------------------- | --------------- | ---------- |
+| **GET** | Retrieves a resource or a collection of resources. | Yes | Yes |
+| **POST** | Creates a new resource. | No | No |
+| **PUT** | Updates an existing resource completely or creates it if it does not exist. | Yes | No |
+| **PATCH** | Partially updates an existing resource. | No | No |
+| **DELETE** | Deletes a resource. | Yes | No |
+
+- **Idempotent:** Doing it once has the same effect as doing it 100 times. Deleting a user is idempotent; once it's gone, it's gone.
+
+- **Safe:** The request doesn't change anything on the server. GET is safe.
+
+**Example in practice:**
+
+Let's consider a resource endpoint for a collection of articles: `/api/articles`.
+
+- **`GET /api/articles`**: Retrieves a list of all articles.
+
+- **`GET /api/articles/123`**: Retrieves the specific article with ID 123.
+
+- **`POST /api/articles`**: Creates a new article. The data for the new article is sent in the request body.
+
+- **`PUT /api/articles/123`**: Replaces the entire article with ID 123 using the new data sent in the request body.
+
+- **`PATCH /api/articles/123`**: Partially updates the article with ID 123. For example, you could send only the `{"title": "New Title"}` in the request body to update just the title.
+
+- **`DELETE /api/articles/123`**: Deletes the article with ID 123.
+
+## 4. Data Exchange and Responses
+
+### Prefer the JSON Format
+
+It's the standard. It's lightweight, human-readable, and every language can parse it easily. Send and receive your data as JSON.
+
+- *Example Request Body:*
+
+ ```
+ {
+ "title": "Best Practices for APIs",
+ "authorId": 5,
+ "content": "An article about designing great APIs..."
+ }
+ ```
+
+### Use Appropriate HTTP Status Codes
+
+Use standard HTTP status codes to provide clear information to the client about the outcome of their request.
+
+- **2xx (Success):**
+
+ - `200 OK`: The request was successful. (For GET, PUT, PATCH)
+
+ - `201 Created`: The resource was successfully created. (For POST) The response should include a `Location` header with the URI of the new resource.
+
+ - *Example:* `POST /api/articles` responds with `201 Created` and the header `Location: /api/articles/124`.
+
+ - `204 No Content`: The request was successful, but there is no response body. (For DELETE)
+
+- **4xx (Client Error):**
+
+ - `400 Bad Request`: Invalid request (e.g., missing or incorrect data).
+
+ - `401 Unauthorized`: Authentication is required.
+
+ - `403 Forbidden`: No permission.
+
+ - `404 Not Found`: The requested resource could not be found.
+
+- **5xx (Server Error):**
+
+ - `500 Internal Server Error`: An unexpected error occurred on the server.
+
+### Provide Clear and Consistent Error Responses
+
+When something goes wrong, give back a useful JSON error message. Your future self and any developer using your API will thank you.
+
+- *Example of a detailed error response:*
+
+```
+{
+ "type": "[https://---.com/probs/validation-error](https://example.com/probs/validation-error)",
+ "title": "Your request parameters didn't validate.",
+ "status": 400,
+ "detail": "The 'email' field must be a valid email address.",
+ "instance": "/api/users"
+}
+```
+
+## 5. Performance Optimization
+
+Optimizing API performance is crucial for providing a good user experience and ensuring the scalability of your service. Key strategies include caching, efficient data retrieval, and controlling traffic.
+
+### Caching
+
+Caching is one of the most effective ways to improve performance. By storing and reusing frequently accessed data, you can significantly reduce latency and server load.
+
+- **How it works:** Caching can be implemented at various levels (client-side, CDN, server-side). REST APIs can facilitate this by using standard HTTP caching headers.
+
+- **Key Headers:**
+
+ - `Cache-Control`: Tells the client how long to cache something (e.g., `public, max-age=600`).
+
+ - `ETag`: A unique version identifier for a resource. The client can send this back in an `If-None-Match` header. If the data hasn't changed, you can just return `304 Not Modified` with an empty body, saving bandwidth.
+
+ - `Last-Modified`: Indicates when the resource was last changed. Similar to `ETag`, it can be used for conditional requests with the `If-Modified-Since` header.
+
+- *Example Response Header for Caching:*
+
+ ```
+ Cache-Control: public, max-age=600
+ ETag: "x234dff"
+ ```
+
+### Filtering, Sorting, and Pagination
+
+For endpoints that return lists of resources, it's inefficient to return the entire dataset at once, especially if it's large. Implementing these features gives clients more control over the data they receive.
+
+- **Filtering:** Allows clients to narrow down the result set based on specific criteria. This reduces the amount of data transferred and makes it easier for the client to find what it needs.
+
+ - *Example:* `GET /api/orders?status=shipped&customer_id=123`
+
+- **Sorting:** Enables clients to request the data in a specific order. A common convention is to specify the field to sort by and the direction (ascending or descending).
+
+ - *Example:* `GET /api/users?sort=lastName_asc` or `GET /api/products?sort=-price` (the `-` indicates descending order).
+
+- **Pagination:** Breaks down a large result set into smaller, manageable chunks called "pages". This prevents overloading the server and client with massive amounts of data in a single response.
+
+ - *Example:* `GET /api/articles?page=2&pageSize=20` (retrieves the second page, with 20 articles per page).
+
+### Rate Limiting
+
+Protect your API from abuse by limiting how many requests a client can make in a given time. If they exceed the limit, return a `429 Too Many Requests`.
+It's also super helpful to return these headers so the client knows what's going on:
+
+- `X-RateLimit-Limit`: Total requests allowed.
+
+- `X-RateLimit-Remaining`: How many requests they have left.
+
+- `Retry-After`: How many seconds they should wait before trying again.
+
+## 6. Security
+
+Security is not an optional feature; it must be a core part of your API design.
+
+- **Always Use HTTPS (TLS):** Encrypt all traffic to prevent man-in-the-middle attacks. There are no exceptions to this rule for production APIs.
+
+- **Authentication & Authorization:**
+
+ - **Authentication** (Who are you?): Use a standard like OAuth 2.0 or JWT Bearer Tokens.
+
+ - **Authorization** (What are you allowed to do?): Check permissions for every request. Just because a user is logged in doesn't mean they can delete another user's data.
+
+- **Input Validation**: Always validate and sanitize data coming from the client to prevent injection attacks. If the data is bad, reject it with a `400 Bad Request`.
+
+- **Use Security Headers**: Add headers like `Strict-Transport-Security` and `Content-Security-Policy` to add extra layers of browser-level protection.
+
+## 7. API Lifecycle Management
+
+### Versioning
+
+Your API will change. Versioning lets you make breaking changes without messing up existing clients. The most common way is in the URI.
+
+- **URI Versioning (Most Common):** `https://api.example.com/v1/users`
+
+ - **Pros:** Simple, explicit, and easy to explore in a browser.
+
+- **Header Versioning:** The client requests a version via a custom HTTP header.
+
+ - *Example:* `Accept-Version: v1`
+
+ - **Pros:** Keeps the URI clean.
+
+- **Media Type Versioning (Content Negotiation):** The version is included in the `Accept` header.
+
+ - *Example:* `Accept: application/vnd.example.v1+json`
+
+ - **Pros:** Technically the "purest" REST approach.
+
+### Backward Compatibility & Deprecation
+
+When you release v2, don't just kill v1. Keep it running for a while and communicate a clear shutdown schedule to your users.
+
+### Documentation
+
+An API is only as good as its documentation. Use tools like the **OpenAPI Specification (formerly Swagger)** to generate interactive, machine-readable documentation. Good docs should include:
+
+- Authentication instructions.
+
+- Clear explanations of each endpoint.
+
+- Request/response examples.
+
+- Error code definitions.
+
+## 8. Monitoring and Testing
+
+### Monitoring and Logging
+
+To ensure your API is reliable, you must monitor its health and log important events.
+
+- **Structured Logging:** Log in a machine-readable format like JSON. Include a `correlationId` to track a single request across multiple services.
+
+- **Monitoring:** Track key metrics like latency (response time), error rate, and requests per second. Use tools like Prometheus, Grafana, or Datadog to visualize these metrics and set up alerts.
+
+### API Testing
+
+Thorough testing is essential to prevent bugs and regressions.
+
+- **Unit Tests:** Test individual components and business logic in isolation.
+
+- **Integration Tests:** Test the interaction between different parts of your API, including the database.
+
+- **Contract Tests:** Verify that your API adheres to its documented contract (e.g., the OpenAPI spec).
+
+## 9. Advanced Level: HATEOAS
+
+**HATEOAS (Hypermedia as the Engine of Application State)** is a REST principle that allows your API to be self-documenting and more discoverable. It involves including hyperlinks in responses for actions that can be performed on the relevant resource.
+
+For example, a response for a user resource might look like this:
+
+```
+{
+ "id": 1,
+ "name": "Deo Steel",
+ "links": [
+ { "rel": "self", "href": "/users/1", "method": "GET" },
+ { "rel": "update", "href": "/users/1", "method": "PUT" },
+ { "rel": "delete", "href": "/users/1", "method": "DELETE" }
+ ]
+}
+```
+
+This way, the client can follow the links in the response to take the next step, rather than manually constructing the URIs.
+
+## 10. A Practical Shortcut: Leveraging Frameworks like ABP.IO
+
+Okay, that was a lot. While it's crucial to understand all these principles, you don't have to build everything from scratch. Modern frameworks can handle a ton of this for you. I work a lot in the .NET space, and **ABP Framework** is a great example of this.
+
+Here’s how it automates many of the things we just talked about:
+
+- **Automatic API Controllers**: You write your business logic in an "Application Service," and ABP automatically creates the REST API endpoints for you, following all the correct naming and HTTP method conventions. (Covers sections 2 & 3).
+
+- **Built-in Best Practices**:
+
+ - **Standardized Error Responses**: It has a built-in exception handling system that automatically generates clean, consistent JSON error responses. (Covers section 4).
+
+ - **Input Validation**: It has automatic validation for your DTOs. If a request is invalid, it returns a detailed `400 Bad Request` without you writing a single line of code for it. (Covers section 6).
+
+ - **Paging, Sorting, Filtering**: You get these out of the box by just using their predefined interfaces. (Covers section 5).
+
+- **Integrated Security**: It comes with a full auth system. You just add an `[Authorize]` attribute to a method, and it handles the rest. It also automatically manages database transactions per API request (Unit of Work) to ensure data consistency. (Covers section 6).
+
+- **Automatic Documentation**: It automatically generates an OpenAPI/Swagger UI for your API, which is a massive help for anyone who needs to use it. (Covers section 7).
+
+Using a framework like this lets you focus on your core business logic, confident that the foundation is built on solid, established best practices.
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/BenchmarkDotnet.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/BenchmarkDotnet.png
new file mode 100644
index 0000000000..ed81071118
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/BenchmarkDotnet.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Disruptor.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Disruptor.png
new file mode 100644
index 0000000000..d66333865c
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Disruptor.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MemoryPack.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MemoryPack.png
new file mode 100644
index 0000000000..cdb4f81e38
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MemoryPack.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MessagePack.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MessagePack.png
new file mode 100644
index 0000000000..dc7d76dd2f
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/MessagePack.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Polly.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Polly.png
new file mode 100644
index 0000000000..18a930df0e
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Polly.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Post.md b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Post.md
new file mode 100644
index 0000000000..fbe358c8cb
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/Post.md
@@ -0,0 +1,157 @@
+# High-Performance .NET Libraries You Didn’t Know You Needed
+
+Whether you’re building enterprise apps, microservices, or SaaS platforms, using the right libraries can help you ship faster and scale effortlessly.
+Here are some **high-performance .NET libraries** you might not know but definitely should.
+
+
+
+## 1. BenchmarkDotNet – Measure before you optimize
+
+
+
+BenchmarkDotNet makes it simple to **benchmark .NET code with precision**.
+
+- Easy setup with `[Benchmark]` attributes
+- Generates detailed performance reports
+- Works with .NET Core, .NET Framework, and Mono
+
+Perfect for spotting bottlenecks in APIs, background services, or CPU-bound operations.
+
+- **NuGet** (40M downloads) 🔗 https://www.nuget.org/packages/BenchmarkDotNet
+- **GitHub** (11k stars) 🔗 https://github.com/dotnet/BenchmarkDotNet
+
+
+
+## 2. MessagePack – Fastest JSON serializer
+
+Need speed beyond System.Text.Json or Newtonsoft.Json? MessagePack is the fastest serializer for C# (.NET, .NET Core, Unity, Xamarin). MessagePack has a compact binary size and a full set of general-purpose expressive data types. Ideal for high-traffic APIs, IoT data processing, and microservices.
+
+
+
+- **NuGet** (204M downloads) 🔗 https://www.nuget.org/packages/messagepack
+- **GitHub** (6.4K stars) 🔗 https://github.com/MessagePack-CSharp/MessagePack-CSharp
+
+
+
+## 3. Polly – Resilience at scale
+
+
+
+In distributed systems, failures are inevitable. **Polly** provides a fluent way to add **retry, circuit-breaker, and fallback** strategies.
+
+- Handle transient faults gracefully
+- Improve uptime and user experience
+- Works seamlessly with HttpClient and gRPC
+
+A must-have for cloud-native .NET applications.
+
+- **NuGet** (1B downloads) 🔗 https://www.nuget.org/packages/polly/
+- **GitHub** (14K stars) 🔗 https://github.com/App-vNext/Polly
+
+
+
+## 4. MemoryPack – Zero-cost binary serialization
+
+If you need **blazing-fast serialization** for in-memory caching or network transport, **MemoryPack** is a game-changer.
+
+- Zero-copy, zero-alloc serialization
+- Perfect for high-performance caching or game servers
+- Strongly typed and version-tolerant
+
+
+
+Great for real-time multiplayer games, chat apps, or financial systems.
+
+- **NuGet** (5.3M downloads) 🔗 https://www.nuget.org/packages/MemoryPack
+- **GitHub** (4K stars) 🔗 https://github.com/Cysharp/MemoryPack
+
+
+
+## 5. WolverineFx – Ultra-low latency messaging
+
+
+
+MediatR was one of the best mediator libraries, but now it's a paid library. Wolverine is a toolset for command execution and message handling within .NET applications. The killer feature of Wolverine is its very efficient command execution pipeline that can be used as:
+
+- An [inline "mediator" pipeline](https://wolverinefx.net/tutorials/mediator.html) for executing commands
+- A [local message bus](https://wolverinefx.net/guide/messaging/transports/local.html) for in-application communication
+- A full-fledged [asynchronous messaging framework](https://wolverinefx.net/guide/messaging/introduction.html) for robust communication and interaction between services when used in conjunction with low-level messaging infrastructure tools like RabbitMQ
+- With the [WolverineFx.Http](https://wolverinefx.net/guide/http/) library, Wolverine's execution pipeline can be used directly as an alternative ASP.NET Core Endpoint provider
+
+*image below is from [codecrash.net](https://www.codecrash.net/2024/02/06/Mediatr-versus-Wolverine-performance.html)*
+
+
+WolverineFx is great for cleanly separating business logic from controllers while unifying in-process mediator patterns with powerful distributed messaging in a single, high-performance .NET library.
+
+- **NuGet** (1.5M downloads) 🔗 https://www.nuget.org/packages/WolverineFx
+- **GitHub** (1.7K stars) 🔗 https://github.com/JasperFx/wolverine
+
+
+## 6. Disruptor-net – Next generation free .NET mediator
+
+The Disruptor is a high-performance inter-thread message passing framework. A lock-free ring buffer for ultra-low latency messaging.
+Features are:
+
+- Zero memory allocation after initial setup (the events are pre-allocated).
+
+- Push-based consumers.
+
+- Optionally lock-free.
+
+- Configurable wait strategies.
+
+
+
+- **NuGet** (1.2M downloads) 🔗 https://www.nuget.org/packages/Disruptor/
+- **GitHub** (1.3K stars) 🔗 https://github.com/disruptor-net/Disruptor-net
+
+
+## 7. CliWrap - Running command-line processes
+
+
+
+CliWrap makes it easy to **run and manage external CLI processes in .NET**.
+
+- Fluent, task-based API for starting commands
+- Streams standard input/output and error in real time
+- Supports cancellation, timeouts, and piping between processes
+
+Ideal for automation, build tools, and integrating external executables.
+
+- **NuGet** (14.1M downloads) 🔗 https://www.nuget.org/packages/CliWrap
+- **GitHub** (4.7K stars) 🔗 https://github.com/Tyrrrz/CliWrap
+
+
+---
+
+
+## Hidden Libs from the Community
+
+### Sylvan.Csv & **Sep**
+
+- **Sylvan.Csv**: Up to *10× faster* and *100× less memory allocations* than `CsvHelper`, making CSV processing lightning-fast. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+- **Sep**: Even faster than Sylvan, but trades off some flexibility. Great when performance matters more than API richness. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+
+### String Parsing: **csFastFloat**
+
+- Parses `float` and `double` around *8–9× faster* than `.Parse` methods—perfect for high-volume parsing tasks. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+
+### CySharp’s Suite: MemoryPack, MasterMemory, SimdLinq
+
+- **MemoryPack**: One of the fastest serializers available, with low allocations and high throughput. Ideal for Web APIs or microservices. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+- **MasterMemory**: Designed for databases or config storage. Claims *4,700× faster than SQLite* with zero-allocations per query. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+- **SimdLinq**: SIMD-accelerated LINQ operations supporting a broader set of methods than .NET's built-in SIMD. Works when slight floating-point differences are acceptable. ([Reddit](https://www.reddit.com/r/csharp/comments/191rwgt/extremely_highperformance_libraries_for_common/?utm_source=chatgpt.com))
+
+### Jil – JSON Deserializer
+
+- Ultra-fast JSON (de)serializer with low memory overhead, used in high-scale systems. ([Performance is a Feature!](https://www.mattwarren.org/2014/09/05/stack-overflow-performance-lessons-part-2/?utm_source=chatgpt.com))
+
+### StackExchange.NetGain – WebSocket Efficiency
+
+- High-performance WebSocket server library designed for low-latency IO scenarios. (Now mostly replaced by Kestrel's built-in support, but worth knowing.) ([GitHub](https://github.com/StackExchange/NetGain?utm_source=chatgpt.com))
+
+### Math Libraries: Math.NET Numerics & ILNumerics
+
+- **Math.NET Numerics**: Core numerical methods and matrix math, similar to BLAS/LAPACK. ([Wikipedia](https://en.wikipedia.org/wiki/Math.NET_Numerics?utm_source=chatgpt.com))
+- **ILNumerics**: Efficient numerical arrays with parallelized processing, loop unrolling and cache optimizations. Great for scientific computing. ([Wikipedia](https://en.wikipedia.org/wiki/ILNumerics?utm_source=chatgpt.com))
+
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cliwrap.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cliwrap.png
new file mode 100644
index 0000000000..718d1b558b
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cliwrap.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cover.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cover.png
new file mode 100644
index 0000000000..a1b4c825e2
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine-logo.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine-logo.png
new file mode 100644
index 0000000000..b14dc2b7ed
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine-logo.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine.png b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine.png
new file mode 100644
index 0000000000..5ef73f0149
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-High-Perf-DotNet-Libs/wolverine.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_1.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_1.png
new file mode 100644
index 0000000000..9889c8d813
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_1.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_2.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_2.png
new file mode 100644
index 0000000000..5e00300c81
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_2.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_3.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_3.png
new file mode 100644
index 0000000000..3675376cb3
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_3.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_4.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_4.png
new file mode 100644
index 0000000000..e0b94bb47c
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_4.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_5.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_5.png
new file mode 100644
index 0000000000..4ed8c4eabe
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_5.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_6.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_6.png
new file mode 100644
index 0000000000..ad2640da1f
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_6.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_7.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_7.png
new file mode 100644
index 0000000000..cfdf76ea7e
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_7.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_8.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_8.png
new file mode 100644
index 0000000000..f399892ee8
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_8.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_9.png b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_9.png
new file mode 100644
index 0000000000..171ff61851
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/images/img_9.png differ
diff --git a/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/post.md b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/post.md
new file mode 100644
index 0000000000..cfd4db30bf
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-11-Web-Design-Basics-for-Graphic-Designers-Who-Dont-Code/post.md
@@ -0,0 +1,282 @@
+# Web Design Basics for Graphic Designers Who Don't Code
+
+## Introduction
+
+As a **designer**, I have been working on **logos**, **posters**, and **social media announcement** **visuals** for years. However, when it comes to the web, I used to hold back saying “I **don’t know how to code**.” We have all thought about this at some point and unfortunately, we still think about it from time to time.
+
+🚀 **Good news**: We can learn **web design** without writing code and design **user-friendly**, **aesthetic, and functional web interfaces** using basic knowledge.
+
+In this article, we will talk about the **basics of web design**, its **differences from graphic design**, and whether it is possible to do **web design without knowing how to code**.
+
+## Differences Between Graphic Design & Web Design
+
+
+
+### What is Graphic Design?
+
+Graphic design is creating **visual content** that conveys a message to a **specific audience**. Graphic designers use various **visual elements** such as **color**, **typography**, **imagery**, and **layout** to communicate a message effectively. They work on a wide range of projects, including **logos**, **websites**, **packaging**, **advertisements, and branding**.
+
+### What is Web Design?
+
+Web design is the process of creating a website that can be viewed on computers or mobile devices. Like graphic design, web design also involves creating **graphics**, **typography**, **and visuals**, but they use the **internet** as the communication channel.
+
+### Graphic Design
+
+* Graphic Design is concerned with **visuals** and **appearance**.
+* Graphic design focuses on visually conveying specific messages or ideas through **typography**, **visuals**, **colors**, and i**llustrations**.
+* Graphic design focuses on how objects **look**.
+* Graphic designers **do not need coding knowledge**.
+* Graphic design is **static**.
+
+### Web Design
+
+* Web design is user experience–focused.
+* Web design aims to create **functional** and **user-friendly** **websites** that provide the **best experience** for users.
+* Web design considers **search engine optimization** when creating websites.
+* Web designers need to have **knowledge of HTML**, **CSS**, and other web development languages to create **functional and responsive designs**.
+* Web design is **dynamic**.
+
+## Fundamental Principles of Web Design (Applicable Without Coding)
+
+Companies and **brands** from almost every sector request the **creation of their own websites**. This way, they gain the opportunity to introduce their **services**, **prices**, and themselves to their **target audiences**. However, for this to have the desired effect, the website must be **designed properly**. What are the **fundamental principles** to pay attention to when designing a website? Now, it’s time to answer this question by introducing the basics. Here are the **indispensable principles in web design**.
+
+ ### 1\) User-Centered Designs:
+
+Users always value **ease and practicality** when receiving a service. For this reason, it is important for websites to be designed in a user-centered way. **Easy to find menus**, **fast usage**, and the **easy to locate any information** are very important. With **user centered design**, it is possible to create websites that are **easy to use** and also **satisfy users**.
+
+
+ ### 2\) Responsive Designs:
+
+It is very important for the website and its design to be **usable on every digital platform**. Therefore, the designed sites must have a **responsive design**. This means easy access to the site on a **phone**, **tablet**, or **computer**. This also ensures that users continue to prefer the site.
+
+ ### 3\) Visual Hierarchy:
+
+The page must have **visuals related to itself**, and **product content** should be matched with the **correct visuals**. It is also very important for visual elements to be placed according to their order of importance. On web pages, content compatible with visuals must be provided with **sufficient and accurate information**.
+
+ ### 4\) Color and Typography Selection:
+
+Color and typography selection is very important for handling visuals, colors, and text in a certain **harmony**. For the site to **attract attention** or for the relevant pages to achieve the expected interaction, the use of color and the chosen font style and font color must be harmonious. A design that is both **easy to read** and **eye catching** without causing any disturbance should be preferred.
+
+ ### 5\) Content and Layout Structure:
+
+One of the most desired features on web pages is **content organization**. Content that is **unrelated to the pages, creates confusion while reading**, or **lacks simplicity**, such as overly frequent paragraphs, incorrect fonts, and similar factors, causes web pages to have less impact. **Content structure** also includes **placing related topics sequentially** and **adding them to the menu**. For example, on a website created for shoes, if shoe types are grouped separately, users find it easier. Options like high heels, sandals, and sneakers help users find what they are looking for more easily, which in turn ensures positive site feedback.
+
+ ### 6\) Speed Optimization:
+
+As with every type of service, speed is very important for services provided through web pages. Easy navigation between pages, error-free performance, and ease of use are very important for users. No one wants to shop or use a service on a website that takes a long time to load, because everyone prefers websites to save time.
+
+ ### 7\) Consistency:
+
+For a service to be preferred, it must first be reliable. This is directly related to the information, visuals, and everything on the website. The information in the content, visuals, and content details must be consistent and should not raise any questions in visitors’ minds. Otherwise, negative feedback can later affect customer preferences and damage the brand image.
+
+## Is It Possible to Do Web Design Without Coding?
+
+In the past, it was not possible to create a website without at least some basic coding knowledge. However, today, almost anyone can build a website. Even if you have not written a **single line of code**.
+
+The biggest helpers for those who want to do **web development without coding** are **No-Code** and **Low-Code** platforms. These tools help users **design websites** without dealing with **technical details**.
+
+Systems like **Wix**, **Webflow**, **Shopify**, and **WordPress** are very common in this area.
+
+
+
+The web development process on these platforms is carried out through practical methods such as **drag-and-drop**, selecting **ready-made templates**, and filling out forms.
+
+### **No Code**
+
+As the name suggests, it allows you to create websites, mobile applications, automations, and workflows **without writing a single line of code**.
+
+* **How Does It Work**? They usually have a visual editor. You create the skeleton of your application by dragging and dropping ready “building blocks” such as buttons, forms, and visuals onto your canvas. Then, you determine what these elements will do (for example, “go to this page when this button is clicked”) by selecting options from the menus.
+* **Who Uses It**? It is perfect for entrepreneurs, marketers, product managers, designers, and anyone who wants to quickly test an idea.
+* **Examples**: Platforms like Webflow, Bubble, Adalo, and Glide allow you to create a wide range of products, from complex web applications to mobile apps.
+
+### **Low Code**
+
+Low-Code systems require a bit more **technical knowledge** but still **do not require learning full-scale programming**.
+
+* **How Does It Work**? You handle 80% of the work with drag-and-drop, and for the remaining 20% that requires customization, you add small code snippets.
+* **Who Uses It**? It is generally preferred by IT departments of corporate companies and technical teams that want to develop more complex, scalable applications.
+* **Examples**: Platforms like OutSystems and Mendix are used to build large, integrated systems that manage a company’s internal processes.
+
+## What Should the Web Design Process be Like?
+
+
+
+**Web design** is a passionate field but can be **overwhelming** at times. When starting out, coming up with a plan on how to tackle your website or a web app idea often feels daunting: Where should you begin?Web designers often think about the **web design process** with a focus on **technical matters** such as wireframes, code, and content management. But great
+
+design isn’t about how you integrate the social media buttons or even slick visuals. **Great design** is actually about having **a website creation process** that aligns with an **overarching strategy.**
+
+Doing all the thinking beforehand ensures that you don’t forget anything crucial. It also frees up headspace for doing the actual work, avoids overwhelm, improves efficiency, and allows you to build better websites on repeat.
+
+But how do you achieve that harmonious synthesis of elements? Through a **holistic web design** process that takes both **form and function** into account.
+
+We have already covered the fundamentals, now, I'll share the steps to an **effective web design process.**
+
+Let's get started.
+
+### 1\) Goal Identification
+
+In this **initial stage**, the designer needs to identify the end goal of the website design, usually in close collaboration with the client or other stakeholders. Questions to explore and answer in this stage of the design and website development process include:
+
+* Who is the site for?
+* What do they hope to find or do there?
+* Is the main purpose of this website to inform, to sell (e-commerce, for everyone?), or to entertain?
+* Does the website need to clearly convey the **brand's core message**, or is it part of a broader **brand strategy** with its own unique focus?
+* If there are any, which **competitor sites** exist, and how should this site be **inspired by them** / how should it differ from them?
+
+To have clear answers to above questions will lead to the **successful execution** of the project.
+
+### What Purpose Will the Website Serve?
+
+Whatever the project you’re taking on, you always want each and every initiative you take to achieve the goals you’ve set for it. **Goal setting is critical** because it will be key in making decisions throughout the project by asking yourself the right questions and **prioritizing tasks and efforts**.
+
+As basic as it may seem, following the **SMART framework** is always a great idea when setting your goals, to **ensure effectiveness:**
+
+**S \- SPECIFIC**
+Your goal is direct, detailed, and meaningful.
+
+**M \- MEASURABLE**
+Your goal is quantifiable to track progress or success.
+
+**A \- ATTAINABLE**
+Your goal is realistic and you have the tools and/or resources to attain it.
+
+**R \- RELEVANT**
+Your goal aligns with your company mission.
+
+**T \- TIME-BASED**
+Your goal has a deadline.
+
+### 2\) Scope Definition
+
+This is easier said than done when starting out, so it is best to approach it with caution : Everyone has once been guilty of saying a project “will be done by next week” before realizing they dramatically **underestimated** how hard it would be.
+
+Nevertheless, **setting** a timeline will help a lot with **accountability**, both internal and external, and will help **break down the project in distinct stages**.
+
+You don’t have to reinvent anything from scratch, as a lot of tools such as Airtable’s timeline view will help you put the timeline together.
+
+
+
+Source: [Airtable](https://blog.airtable.com/introducing-airtables-new-timeline-view/)
+
+### 3\) Sitemap and Wireframe Creation
+
+The site map forms the foundation of a well-designed website. It gives web designers a clear idea of the **information architecture** of the website and explains the **relationships** between various **pages and content elements**.
+
+
+
+Building a web site without a site map is like building a house without a plan. And it rarely ends well.
+
+Time to start building the first iteration of your project\! To put it shortly, **wireframes** serve as a blueprint, a visual guide representing the skeletal framework of a website or application. It will be a raw version of your project, a great way to get your **initial idea down** in its first “physical” form.
+
+
+
+Source: [Afolayan Daniel](https://medium.com/fbdevclagos/4-reasons-why-wire-frame-is-important-during-website-or-mobile-app-development-46fabdf47190)
+
+While it won’t be functional yet, it’ll be a major web design step to share with your team, potential leads or even investors, and will highlight issues that you might not have thought about previously. Wireframes are a great opportunity to move fast, once they’re ready, you’ll be able to:
+
+* Gather early feedback;
+* Run UX testing groups;
+* Iterate on your timeline if necessary;
+* Get concept validation.
+
+There are different ways to create wireframes. You can of course sketch them out on paper to start with, but creating a digital version will eventually be much more practical to share them.
+
+#### Tools for sitemapping and wireframing;
+
+* Pen/pencil and paper.
+* Balsamiq.
+* Moqups.
+* Sketch.
+* Axure.
+* Webflow.
+* Slickplan.
+* Writemaps.
+* Mindnode.
+* Figma.
+* Sketch.
+
+### 4\) Content Creation
+A website should offer more than just a simple design and attractive graphics. An effective content strategy is essential to capture users’ interest and to make the site stand out in search engines.
+
+
+When it comes to content, search engine optimization is only
+half of the battle.
+
+There are two main goals that you need to focus on while creating content.
+
+#### **Goal 1 Content encourages engagement and action:**
+
+First of all, content drives readers to take action and encourages them to perform the actions necessary to achieve a site's goals. This is influenced both by the content itself (writing) and by the way it is presented (typography and structural elements).
+
+Boring, lifeless, and lengthy writing rarely holds visitors' attention for long enough. Short, fluent, and engaging content captures them and makes them click through to other pages. Even if your pages need a lot of content (which they often do), properly "breaking it up" into short paragraphs supported by visuals can help create a light and engaging feel.
+
+#### **Goal 2 Search Engine Optimization**:
+
+Content also increases a site's visibility in the eyes of search engines. The practice of creating and developing content to achieve a good ranking in search results is called search engine optimization or SEO.
+
+Identifying your keywords and key phrases correctly is very important for the success of any website.
+
+### 5\) Visual Elements
+
+
+
+Style Tile: a free style tile / moodboard template built by Mat Vogels.
+
+It is time to create the **visual style** of the site. This part of the design process is usually shaped by **existing brand elements, color choices**, and **logos** specified by the client. However, it is also the stage of the web design process where a **good web designer can truly shine**.
+
+**Visuals play a more important** **role** in web design than ever before. High quality visuals not only give a website a professional look and feel, but also convey a message, are mobile friendly, and help build trust.
+
+**Visual design is a way of communicating** with the web site users to make the site as **appealing to them** as possible. When done right, it can determine the site’s being one of the major successes amongst competitors. On the other hand, any mistake might put it in risk of becoming just another ordinary web site.
+
+**Tools for visual elements**:
+
+* (Sketch, Illustrator, Photoshop, Figma, vb.)
+* Visual Style Guides.
+
+
+
+### 6\) Development & Platforms
+
+**Front-End Development**: The parts that users interact with (HTML, CSS, JavaScript).
+
+**Back-End Developmen**t: Database and server-side processes (PHP, Python, Node.js).
+
+**No-Code Platforms**: Publishing on platforms like Webflow, Bubble, Adalo, Glide.
+
+### 7\) Testing
+
+When your site has all the visuals and content, you are ready to test.
+Once the **first iteration** of your website/web app is ready, it’s time for some **testing** to make sure it **runs smoothly**.
+
+A website should undergo a detailed testing process before going live.
+Items to check during the testing process:
+
+* Mobile Compatibility.
+* Functionality across different browsers.
+* Functionality of forms and buttons.
+
+Alongside these steps, setting up website uptime monitoring is essential to ensure the site remains functional after launch, providing immediate alerts if any downtime occurs. Ultimately, while testing is an important part of the web design process, it’s not worth losing sleep over. **Done is always better than perfect** and when in doubt, keep this quote in mind.
+
+*“If you are not embarrassed by the first version of your product, you've launched too late.” \- Reid Hoffman, founder of LinkedIn*
+
+### 8\) Website Launch
+
+Now it’s time for everyone’s favorite part of the website design process: When everything has been thoroughly tested and you’re happy with the site, you can start.
+
+Don’t expect this to go perfectly. There may still be some elements that need fixing. Web design is a fluid and ongoing process that requires constant maintenance.
+
+Web design and design in general is about finding the right balance between form and function. You need to use the right fonts, colors, and design motifs. But the way users navigate and experience your site is just as important.
+
+## Conclusion
+
+Previously, when we wanted to turn our designs into reality, the barrier of learning and using a programming language tool stood in our way. This barrier has now been removed thanks to **No-Code tools**. With these tools, even without coding knowledge, there is now a way to bring your designs to life.
+
+## Resources
+
+* Bulut, B. (2025, July 20). *Kod yazmayı bilmeden yazılımcı olmak nasıl mümkün oldu?* Webtekno. [https://www.webtekno.com/kod-bilmeden-yazilimci-olmak-nasil-mumkun-oldu-h159799.html](https://www.webtekno.com/kod-bilmeden-yazilimci-olmak-nasil-mumkun-oldu-h159799.html)
+
+* Ectasarim. (2024, Kasım 10). *Web tasarım ilkeleri nelerdir? Önemli hususlar*. [https://www.ectasarim.com/web-tasarim-ilkeleri/](https://www.ectasarim.com/web-tasarim-ilkeleri/?utm_source=chatgpt.com)
+
+* Meazey, M. (2020, February 12). *The web design process in 7 simple steps*. *Webflow Blog*. [https://webflow.com/blog/the-web-design-process-in-7-simple-steps](https://webflow.com/blog/the-web-design-process-in-7-simple-steps)
+
+* University of California Office of the President. (2016). *How to write SMART goals: A how-to guide.* University of California. [https://www.ucop.edu/local-human-resources/\_files/performance-appraisal/How+to+write+SMART+Goals+v2.pdf](https://www.ucop.edu/local-human-resources/_files/performance-appraisal/How+to+write+SMART+Goals+v2.pdf)
diff --git a/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/article.md b/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/article.md
new file mode 100644
index 0000000000..bcd96834b8
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/article.md
@@ -0,0 +1,803 @@
+# Step-by-Step AWS Secrets Manager Integration in ABP Framework Projects
+
+## Introduction
+In this article, we are going to discuss how to secure sensitive data in ABP Framework projects using AWS Secrets Manager and explain various aspects and concepts of _secret_ data management. We will explain step-by-step AWS Secrets Manager integration.
+
+
+## What is the Problem?
+Modern applications must store sensitive data such as API keys, database connection strings, OAuth client credentials, and other similar sensitive data. These are at the center of functionality but if stored in the wrong place can be massive security issues.
+
+At build time, the first place that comes to mind is usually **appsettings.json**. This is a configuration file; it is not a secure place to store secret information, especially in production.
+
+### Common Security Risks:
+- **Plain text storage**: Plain text storage of passwords
+- **Exposure to version control**: Secrets are rendered encrypted in Git repositories
+- **No access control**: Anyone who has file access can see the secrets
+- **No rotation**: We must change them manually
+- **No audit trail**: Who accessed which secret when is not known
+
+## .NET User Secrets Tool vs AWS Secrets Manager
+
+**User Secrets (.NET Secret Manager Tools)** is a dev environment only, local file-based solution that keeps sensitive information out of the repository.
+
+**AWS Secrets Manager** is production. It's a centralized, encrypted, and audited secret management service.
+
+| Feature | User Secrets (Dev) | AWS Secrets Manager (Prod) |
+| ---------------------- | ---------------------------- | ------------------------------ |
+| Scope | Local developer machine | All environments (dev/stage/prod) |
+| Storage | JSON in user profile | Managed service (centralized) |
+| Encryption | None (plain text file) | Encrypted with KMS |
+| Access Control | OS file permissions | IAM policies |
+| Rotation | None | Yes (automatic) |
+| Audit / Traceability | None | Yes (CloudTrail) |
+| Typical Usage | Quick dev outside repo | Production secret management |
+
+---
+
+## AWS Secrets Manager
+Especially designed to securely store and handle sensitive and confidential data for our applications. It even supports features such as secret rotation, replication, and many more.
+
+AWS Secrets Manager offers a trial of 30 days. After that, there is a $0.40 USD/month charge per stored secret. There is also a $0.05 USD fee per 10,000 API requests.
+
+### Key Features:
+- **Automatic encryption**: KMS automatic encryption
+- **Automatic rotation**: Scheduled secret rotation
+- **Fine-grained access control**: IAM fine-grained access control
+- **Audit logging**: Full audit logging with CloudTrail
+- **Cross-region replication**: Cross-region replication
+- **API integration**: Programmatic access support
+
+---
+
+## Step 1: AWS Secrets Manager Setup
+
+### 1.1 Creating a Secret in AWS Console
+First, search for the Secrets Manager service in the AWS Management Console.
+
+1. **AWS Console** → **Secrets Manager** → **Store a new secret**
+2. Select **Secret type**:
+ - **Other type of secret** (For custom key-value pairs)
+ - **Credentials for RDS database** (For databases)
+ - **Credentials for DocumentDB database**
+ - **Credentials for Redshift cluster**
+
+
+
+3. Enter **Secret value**:
+```json
+{
+ "ConnectionString": "Server=myserver;Database=mydb;User Id=myuser;Password=mypassword;"
+}
+```
+
+4. Set **Secret name**: `prod/ABPAWSTest/ConnectionString`
+5. Add **Description**: "ABP Framework connection string for production"
+6. Choose **Encryption key** (default KMS key is sufficient)
+7. Configure **Automatic rotation** settings (optional)
+
+### 1.2 IAM Permissions
+Create an IAM policy for secret access:
+
+```json
+{
+ "Version": "2012-10-17",
+ "Statement": [
+ {
+ "Effect": "Allow",
+ "Action": [
+ "secretsmanager:GetSecretValue",
+ "secretsmanager:DescribeSecret"
+ ],
+ "Resource": "arn:aws:secretsmanager:eu-north-1:588118819172:secret:prod/ABPAWSTest/ConnectionString-*"
+ }
+ ]
+}
+```
+
+---
+
+## Step 2: ABP Framework Project Setup
+
+### 2.1 NuGet Packages
+Add the required AWS packages to your project:
+
+```bash
+dotnet add package AWSSDK.SecretsManager
+dotnet add package AWSSDK.Extensions.NETCore.Setup
+```
+
+### 2.2 Configuration Files
+
+**appsettings.json** (Development):
+```json
+{
+ "AWS": {
+ "Profile": "default",
+ "Region": "eu-north-1",
+ "AccessKey": "YOUR_ACCESS_KEY",
+ "SecretKey": "YOUR_SECRET_KEY"
+ },
+ "SecretsManager": {
+ "SecretName": "prod/ABPAWSTest/ConnectionString",
+ "SecretArn": "arn:aws:secretsmanager:eu-north-1:588118819172:secret:prod/ABPAWSTest/ConnectionString-xtYQxv"
+ }
+}
+```
+
+**appsettings.Production.json** (Production):
+```json
+{
+ "AWS": {
+ "Region": "eu-north-1"
+ // Use environment variables or IAM roles in production
+ },
+ "SecretsManager": {
+ "SecretName": "prod/ABPAWSTest/ConnectionString"
+ }
+}
+```
+
+### 2.3 Environment Variables (Production)
+```bash
+export AWS_ACCESS_KEY_ID=your_access_key
+export AWS_SECRET_ACCESS_KEY=your_secret_key
+export AWS_DEFAULT_REGION=eu-north-1
+```
+
+---
+
+## Step 3: AWS Integration Implementation
+
+### 3.1 Program.cs Configuration
+
+```csharp
+using Amazon;
+using Amazon.SecretsManager;
+
+public class Program
+{
+ public async static Task Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+
+ // AWS Secrets Manager configuration
+ var awsOptions = builder.Configuration.GetAWSOptions();
+
+ // Read AWS credentials from appsettings
+ var accessKey = builder.Configuration["AWS:AccessKey"];
+ var secretKey = builder.Configuration["AWS:SecretKey"];
+ var region = builder.Configuration["AWS:Region"];
+
+ if (!string.IsNullOrEmpty(accessKey) && !string.IsNullOrEmpty(secretKey))
+ {
+ awsOptions.Credentials = new Amazon.Runtime.BasicAWSCredentials(accessKey, secretKey);
+ }
+
+ if (!string.IsNullOrEmpty(region))
+ {
+ awsOptions.Region = RegionEndpoint.GetBySystemName(region);
+ }
+
+ builder.Services.AddDefaultAWSOptions(awsOptions);
+ builder.Services.AddAWSService();
+
+ // ... ABP configuration
+ await builder.AddApplicationAsync();
+ var app = builder.Build();
+
+ await app.InitializeApplicationAsync();
+ await app.RunAsync();
+ }
+}
+```
+
+### 3.2 Secrets Manager Service
+
+**Interface:**
+```csharp
+public interface ISecretsManagerService
+{
+ Task GetSecretAsync(string secretName);
+ Task GetSecretAsync(string secretName) where T : class;
+ Task GetConnectionStringAsync();
+}
+```
+
+**Implementation:**
+```csharp
+using Amazon.SecretsManager;
+using Amazon.SecretsManager.Model;
+using Volo.Abp.DependencyInjection;
+using System.Text.Json;
+
+public class SecretsManagerService : ISecretsManagerService, IScopedDependency
+{
+ private readonly IAmazonSecretsManager _secretsManager;
+ private readonly IConfiguration _configuration;
+ private readonly ILogger _logger;
+
+ public SecretsManagerService(
+ IAmazonSecretsManager secretsManager,
+ IConfiguration configuration,
+ ILogger logger)
+ {
+ _secretsManager = secretsManager;
+ _configuration = configuration;
+ _logger = logger;
+ }
+
+ public async Task GetSecretAsync(string secretName)
+ {
+ try
+ {
+ var request = new GetSecretValueRequest
+ {
+ SecretId = secretName
+ };
+
+ var response = await _secretsManager.GetSecretValueAsync(request);
+
+ _logger.LogInformation("Successfully retrieved secret: {SecretName}", secretName);
+
+ return response.SecretString;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Failed to retrieve secret: {SecretName}", secretName);
+ throw;
+ }
+ }
+
+ public async Task GetSecretAsync(string secretName) where T : class
+ {
+ var secretValue = await GetSecretAsync(secretName);
+
+ try
+ {
+ return JsonSerializer.Deserialize(secretValue)
+ ?? throw new InvalidOperationException($"Failed to deserialize secret {secretName}");
+ }
+ catch (JsonException ex)
+ {
+ _logger.LogError(ex, "Failed to deserialize secret {SecretName}", secretName);
+ throw;
+ }
+ }
+
+ public async Task GetConnectionStringAsync()
+ {
+ var secretName = _configuration["SecretsManager:SecretName"]
+ ?? throw new InvalidOperationException("SecretsManager:SecretName configuration is missing");
+
+ return await GetSecretAsync(secretName);
+ }
+}
+```
+
+---
+
+## Step 4: Usage Examples
+
+### 4.1 Using in Application Service
+
+```csharp
+[RemoteService(false)]
+public class DatabaseService : ApplicationService
+{
+ private readonly ISecretsManagerService _secretsManager;
+
+ public DatabaseService(ISecretsManagerService secretsManager)
+ {
+ _secretsManager = secretsManager;
+ }
+
+ public async Task GetDatabaseConnectionAsync()
+ {
+ // Get connection string from AWS Secrets Manager
+ var connectionString = await _secretsManager.GetConnectionStringAsync();
+
+ // Use the connection string
+ return connectionString;
+ }
+
+ public async Task GetApiConfigAsync()
+ {
+ // Deserialize JSON secret
+ var config = await _secretsManager.GetSecretAsync("prod/MyApp/ApiConfig");
+
+ return config;
+ }
+}
+```
+
+### 4.2 DbContext Configuration
+
+```csharp
+public class YourDbContextConfigurer
+{
+ public static void Configure(DbContextOptionsBuilder builder, string connectionString)
+ {
+ builder.UseSqlServer(connectionString);
+ }
+
+ public static void Configure(DbContextOptionsBuilder builder, DbConnection connection)
+ {
+ builder.UseSqlServer(connection);
+ }
+}
+
+// Usage in Module
+public override void ConfigureServices(ServiceConfigurationContext context)
+{
+ var configuration = context.Services.GetConfiguration();
+ var secretsManager = context.Services.GetRequiredService();
+
+ // Get secret at startup and pass to DbContext
+ var connectionString = await secretsManager.GetConnectionStringAsync();
+
+ context.Services.AddAbpDbContext(options =>
+ {
+ options.AddDefaultRepositories(includeAllEntities: true);
+ options.DbContextOptions.UseSqlServer(connectionString);
+ });
+}
+```
+
+---
+
+## Step 5: Best Practices & Security
+
+### 5.1 Security Best Practices
+
+1. **Environment-based Configuration:**
+ - Development: appsettings.json
+ - Production: Environment variables or IAM roles
+
+2. **Principle of Least Privilege:**
+ ```json
+ {
+ "Effect": "Allow",
+ "Action": "secretsmanager:GetSecretValue",
+ "Resource": "arn:aws:secretsmanager:region:account:secret:specific-secret-*"
+ }
+ ```
+
+3. **Secret Rotation:**
+ - Set up automatic rotation
+ - Custom rotation logic with Lambda functions
+
+4. **Caching Strategy:**
+ ```csharp
+ public class CachedSecretsManagerService : ISecretsManagerService
+ {
+ private readonly IMemoryCache _cache;
+ private readonly SecretsManagerService _secretsManager;
+
+ public async Task GetSecretAsync(string secretName)
+ {
+ var cacheKey = $"secret:{secretName}";
+
+ if (_cache.TryGetValue(cacheKey, out string cachedValue))
+ {
+ return cachedValue;
+ }
+
+ var value = await _secretsManager.GetSecretAsync(secretName);
+
+ _cache.Set(cacheKey, value, TimeSpan.FromMinutes(30));
+
+ return value;
+ }
+ }
+ ```
+
+### 5.2 Error Handling
+
+```csharp
+public async Task GetSecretWithRetryAsync(string secretName)
+{
+ const int maxRetries = 3;
+ var delay = TimeSpan.FromSeconds(1);
+
+ for (int i = 0; i < maxRetries; i++)
+ {
+ try
+ {
+ return await GetSecretAsync(secretName);
+ }
+ catch (AmazonSecretsManagerException ex) when (i < maxRetries - 1)
+ {
+ _logger.LogWarning(ex, "Retry {Attempt} for secret {SecretName}", i + 1, secretName);
+ await Task.Delay(delay);
+ delay = TimeSpan.FromMilliseconds(delay.TotalMilliseconds * 2); // Exponential backoff
+ }
+ }
+
+ throw new InvalidOperationException($"Failed to retrieve secret {secretName} after {maxRetries} attempts");
+}
+```
+
+### 5.3 Performance Optimization
+
+```csharp
+public class PerformantSecretsManagerService : ISecretsManagerService
+{
+ private readonly IAmazonSecretsManager _secretsManager;
+ private readonly IMemoryCache _cache;
+ private readonly ILogger _logger;
+ private readonly SemaphoreSlim _semaphore = new(1, 1);
+
+ public async Task GetSecretAsync(string secretName)
+ {
+ var cacheKey = $"secret:{secretName}";
+
+ // Try to get from cache first
+ if (_cache.TryGetValue(cacheKey, out string cachedValue))
+ {
+ return cachedValue;
+ }
+
+ // Use semaphore to prevent multiple concurrent requests for the same secret
+ await _semaphore.WaitAsync();
+ try
+ {
+ // Double-check pattern
+ if (_cache.TryGetValue(cacheKey, out cachedValue))
+ {
+ return cachedValue;
+ }
+
+ // Fetch from AWS
+ var value = await GetSecretFromAwsAsync(secretName);
+
+ // Cache for 30 minutes
+ _cache.Set(cacheKey, value, TimeSpan.FromMinutes(30));
+
+ return value;
+ }
+ finally
+ {
+ _semaphore.Release();
+ }
+ }
+}
+```
+
+---
+
+## Step 6: Testing & Debugging
+
+### 6.1 Unit Testing
+
+```csharp
+public class SecretsManagerServiceTests : AbpIntegratedTest
+{
+ private readonly ISecretsManagerService _secretsManager;
+
+ public SecretsManagerServiceTests()
+ {
+ _secretsManager = GetRequiredService();
+ }
+
+ [Fact]
+ public async Task Should_Get_Connection_String()
+ {
+ // Act
+ var connectionString = await _secretsManager.GetConnectionStringAsync();
+
+ // Assert
+ connectionString.ShouldNotBeNullOrEmpty();
+ connectionString.ShouldContain("Server=");
+ }
+
+ [Fact]
+ public async Task Should_Deserialize_Json_Secret()
+ {
+ // Arrange
+ var secretName = "test/json/config";
+
+ // Act
+ var config = await _secretsManager.GetSecretAsync(secretName);
+
+ // Assert
+ config.ShouldNotBeNull();
+ config.ApiKey.ShouldNotBeNullOrEmpty();
+ }
+}
+```
+
+### 6.2 Mock Implementation for Testing
+
+```csharp
+public class MockSecretsManagerService : ISecretsManagerService, ISingletonDependency
+{
+ private readonly Dictionary _secrets = new()
+ {
+ ["prod/ABPAWSTest/ConnectionString"] = "Server=localhost;Database=TestDb;Trusted_Connection=true;",
+ ["prod/MyApp/ApiKey"] = "test-api-key",
+ ["prod/MyApp/Config"] = """{"ApiUrl": "https://api.test.com", "Timeout": 30}"""
+ };
+
+ public Task GetSecretAsync(string secretName)
+ {
+ if (_secrets.TryGetValue(secretName, out var secret))
+ {
+ return Task.FromResult(secret);
+ }
+
+ throw new ArgumentException($"Unknown secret: {secretName}");
+ }
+
+ public async Task GetSecretAsync(string secretName) where T : class
+ {
+ var json = await GetSecretAsync(secretName);
+ return JsonSerializer.Deserialize(json)
+ ?? throw new InvalidOperationException($"Failed to deserialize {secretName}");
+ }
+
+ public Task GetConnectionStringAsync()
+ {
+ return GetSecretAsync("prod/ABPAWSTest/ConnectionString");
+ }
+}
+```
+
+### 6.3 Integration Testing
+
+```csharp
+public class SecretsManagerIntegrationTests : IClassFixture>
+{
+ private readonly WebApplicationFactory _factory;
+ private readonly HttpClient _client;
+
+ public SecretsManagerIntegrationTests(WebApplicationFactory factory)
+ {
+ _factory = factory;
+ _client = _factory.CreateClient();
+ }
+
+ [Fact]
+ public async Task Should_Connect_To_Database_With_Secret()
+ {
+ // Arrange & Act
+ var response = await _client.GetAsync("/api/health");
+
+ // Assert
+ response.EnsureSuccessStatusCode();
+ }
+}
+```
+
+---
+
+## Step 7: Monitoring & Observability
+
+### 7.1 CloudWatch Metrics
+
+```csharp
+public class MonitoredSecretsManagerService : ISecretsManagerService
+{
+ private readonly ISecretsManagerService _inner;
+ private readonly IMetrics _metrics;
+ private readonly ILogger _logger;
+
+ public async Task GetSecretAsync(string secretName)
+ {
+ using var activity = Activity.StartActivity("SecretsManager.GetSecret");
+ activity?.SetTag("secret.name", secretName);
+
+ var stopwatch = Stopwatch.StartNew();
+
+ try
+ {
+ var result = await _inner.GetSecretAsync(secretName);
+
+ _metrics.Counter("secrets_manager.requests")
+ .WithTag("secret_name", secretName)
+ .WithTag("status", "success")
+ .Increment();
+
+ _metrics.Timer("secrets_manager.duration")
+ .WithTag("secret_name", secretName)
+ .Record(stopwatch.ElapsedMilliseconds);
+
+ return result;
+ }
+ catch (Exception ex)
+ {
+ _metrics.Counter("secrets_manager.requests")
+ .WithTag("secret_name", secretName)
+ .WithTag("status", "error")
+ .WithTag("error_type", ex.GetType().Name)
+ .Increment();
+
+ _logger.LogError(ex, "Failed to retrieve secret {SecretName}", secretName);
+ throw;
+ }
+ }
+}
+```
+
+### 7.2 Health Checks
+
+```csharp
+public class SecretsManagerHealthCheck : IHealthCheck
+{
+ private readonly IAmazonSecretsManager _secretsManager;
+ private readonly ILogger _logger;
+
+ public SecretsManagerHealthCheck(
+ IAmazonSecretsManager secretsManager,
+ ILogger logger)
+ {
+ _secretsManager = secretsManager;
+ _logger = logger;
+ }
+
+ public async Task CheckHealthAsync(
+ HealthCheckContext context,
+ CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ // Try to list secrets to verify connection
+ var request = new ListSecretsRequest { MaxResults = 1 };
+ await _secretsManager.ListSecretsAsync(request, cancellationToken);
+
+ return HealthCheckResult.Healthy("AWS Secrets Manager is accessible");
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "AWS Secrets Manager health check failed");
+ return HealthCheckResult.Unhealthy("AWS Secrets Manager is not accessible", ex);
+ }
+ }
+}
+
+// Register in Program.cs
+builder.Services.AddHealthChecks()
+ .AddCheck("secrets-manager");
+```
+
+---
+
+## Step 8: Advanced Scenarios
+
+### 8.1 Dynamic Configuration Reload
+
+```csharp
+public class DynamicSecretsConfigurationProvider : ConfigurationProvider, IDisposable
+{
+ private readonly ISecretsManagerService _secretsManager;
+ private readonly Timer _reloadTimer;
+ private readonly string _secretName;
+
+ public DynamicSecretsConfigurationProvider(
+ ISecretsManagerService secretsManager,
+ string secretName)
+ {
+ _secretsManager = secretsManager;
+ _secretName = secretName;
+
+ // Reload every 5 minutes
+ _reloadTimer = new Timer(ReloadSecrets, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
+ }
+
+ private async void ReloadSecrets(object state)
+ {
+ try
+ {
+ var secretValue = await _secretsManager.GetSecretAsync(_secretName);
+ var config = JsonSerializer.Deserialize>(secretValue);
+
+ Data.Clear();
+ foreach (var kvp in config)
+ {
+ Data[kvp.Key] = kvp.Value;
+ }
+
+ OnReload();
+ }
+ catch (Exception ex)
+ {
+ // Log error but don't throw to avoid crashing the timer
+ Console.WriteLine($"Failed to reload secrets: {ex.Message}");
+ }
+ }
+
+ public void Dispose()
+ {
+ _reloadTimer?.Dispose();
+ }
+}
+```
+
+### 8.2 Multi-Region Failover
+
+```csharp
+public class MultiRegionSecretsManagerService : ISecretsManagerService
+{
+ private readonly List _clients;
+ private readonly ILogger _logger;
+
+ public MultiRegionSecretsManagerService(
+ IConfiguration configuration,
+ ILogger logger)
+ {
+ _logger = logger;
+ _clients = new List();
+
+ // Create clients for multiple regions
+ var regions = new[] { "us-east-1", "us-west-2", "eu-west-1" };
+ foreach (var region in regions)
+ {
+ var config = new AmazonSecretsManagerConfig
+ {
+ RegionEndpoint = RegionEndpoint.GetBySystemName(region)
+ };
+ _clients.Add(new AmazonSecretsManagerClient(config));
+ }
+ }
+
+ public async Task GetSecretAsync(string secretName)
+ {
+ Exception lastException = null;
+
+ foreach (var client in _clients)
+ {
+ try
+ {
+ var request = new GetSecretValueRequest { SecretId = secretName };
+ var response = await client.GetSecretValueAsync(request);
+
+ _logger.LogInformation("Retrieved secret from region {Region}",
+ client.Config.RegionEndpoint.SystemName);
+
+ return response.SecretString;
+ }
+ catch (Exception ex)
+ {
+ lastException = ex;
+ _logger.LogWarning(ex, "Failed to retrieve secret from region {Region}",
+ client.Config.RegionEndpoint.SystemName);
+ }
+ }
+
+ throw new InvalidOperationException(
+ "Failed to retrieve secret from all regions", lastException);
+ }
+}
+```
+
+---
+
+## Conclusion
+
+AWS Secrets Manager integration with ABP Framework significantly enhances the security of your applications. With this integration:
+
+ **Centralized Secret Management**: All secrets are managed centrally
+ **Better Security**: Encryption through KMS and access control through IAM
+ **Audit Trail**: Complete recording of who accessed which secret when
+ **Automatic Rotation**: Secrets can be rotated automatically
+ **High Availability**: AWS high availability guarantee
+**Easy Integration**: Native integration with ABP Framework
+**Cost Effective**: Pay only for what you use
+**Scalable**: Scales with your application needs
+
+With this post, you can securely utilize AWS Secrets Manager in your ABP Framework applications and bid farewell to secret management concerns in production.
+
+### Key Benefits:
+- **Developer Productivity**: No hardcoded secrets in config files
+- **Operational Excellence**: Automation of rotation and monitoring
+- **Security Compliance**: Meet enterprise security requirements
+- **Peace of Mind**: Professional-grade secret management
+
+---
+
+## Additional Resources
+
+- [AWS Secrets Manager Documentation](https://docs.aws.amazon.com/secretsmanager/)
+- [ABP Framework Documentation](https://docs.abp.io/)
+- [AWS SDK for .NET](https://docs.aws.amazon.com/sdk-for-net/)
+- [AWS Security Best Practices](https://aws.amazon.com/architecture/security-identity-compliance/)
+- [Sample Project Repository](https://github.com/fahrigedik/AWSIntegrationABP)
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/cover.png b/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/cover.png
new file mode 100644
index 0000000000..ac2b5557a5
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-11-aws-secrets-manager-in-abp-framework/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-12-Demystified-Aggregates-in-DDD-&-.NET/post.md b/docs/en/Community-Articles/2025-09-12-Demystified-Aggregates-in-DDD-&-.NET/post.md
new file mode 100644
index 0000000000..a06eecb3d8
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-12-Demystified-Aggregates-in-DDD-&-.NET/post.md
@@ -0,0 +1,316 @@
+
+# Demystified Aggregates in DDD & .NET: From Theory to Practice
+
+## Introduction
+
+Domain-Driven Design (DDD) is one of the key foundations of modern software architecture and has taken a strong place in the .NET world. At the center of DDD are Aggregates, which protect the consistency of business rules. While they are one of DDD’s biggest strengths, they’re also one of the most commonly misunderstood ideas. Trying to follow “pure” DDD rules to the letter often clashes with the complexity and performance needs of real-world projects, leaving developers in tough situations. The goal of this article is to take a fresh, practical look at Aggregates and show how they can be applied in a way that works in real life.
+
+----------
+
+### **Chapter 1: Laying the Groundwork: What Is a Classic Aggregate?**
+
+Before jumping into pragmatic shortcuts, let’s make sure we’re all on the same page. To do that, we’ll start with the classic “by the book” definition of an Aggregate and the rules that make it tick.
+
+#### **What Exactly Is an Aggregate?**
+
+At its simplest, an **Aggregate** is a group of related objects (Entities and Value Objects) that are treated as **one unit of change**. And this group has a leader: the **Aggregate Root**.
+
+- **Aggregate Root** → Think of it as the gatekeeper. All outside commands (like “add a product to the order”) must go through the root. You can’t just poke around and change stuff inside.
+
+- **Entity** → Objects within the Aggregate that have their own identity (ID). Example: an `OrderLine` inside an `Order`.
+
+- **Value Object** → Objects without an identity. They’re defined entirely by their values, like an `Address` or `Money`.
+
+
+The Aggregate’s main purpose isn’t just grouping things together—it’s about **protecting business rules (invariants).** For example: _“an order’s total amount can never be negative.”_ The Aggregate Root makes sure rules like this are never broken.
+
+
+#### **The Role of Aggregates: Transaction Boundaries**
+
+The most important job of an Aggregate is defining the **transactional consistency boundary**. In other words:
+
+👉 Any change you make inside an Aggregate either **fully succeeds** or **fully fails**. There’s no half-done state.
+
+From a database perspective, when you call `SaveChanges()` or `Commit()`, everything within one Aggregate gets saved in a single transaction. If you add a product and update the total price, those two actions are atomic—they succeed together. Thanks to Aggregates, you’ll never end up in weird states like _“product was added but total wasn’t updated.”_
+
+
+#### **The Golden Rules of Aggregates**
+
+Classic DDD lays out three golden rules for working with Aggregates:
+
+1. **Talk Only to the Root**
+ You can’t directly update something like an `OrderLine`. You must go through the root: `Order.AddOrderLine(...)` or `Order.RemoveOrderLine(...)`. That way, the root always enforces the rules.
+
+2. **Reference Other Aggregates by ID Only**
+ An `Order` shouldn’t hold a `Customer` object directly. Instead, it should just store `CustomerId`. This keeps Aggregates independent and avoids loading massive object graphs.
+
+3. **Change Only One Aggregate per Transaction**
+ Need to create an order _and_ update loyalty points? Classic DDD says: do it in two steps. First, save the `Order`. Then publish a **domain event** to update the `Customer`. This enables scalability but introduces **eventual consistency**.
+
+
+
+#### **A Classic Example: The Order Aggregate in .NET**
+
+Here’s a simple example showing an `Order` Aggregate that enforces a business rule:
+
+```csharp
+// Aggregate Root: The entry point and rule enforcer
+public class Order
+{
+ public Guid Id { get; private set; }
+ public Guid CustomerId { get; private set; }
+
+ private readonly List _orderLines = new();
+ public IReadOnlyCollection OrderLines => _orderLines.AsReadOnly();
+
+ public decimal TotalPrice { get; private set; }
+
+ public Order(Guid id, Guid customerId)
+ {
+ Id = id;
+ CustomerId = customerId;
+ }
+
+ public void AddOrderLine(Guid productId, int quantity, decimal price)
+ {
+ // Rule 1: Max 10 order lines
+ if (_orderLines.Count >= 10)
+ throw new InvalidOperationException("An order can contain at most 10 products.");
+
+ // Rule 2: No duplicate products
+ var existingLine = _orderLines.FirstOrDefault(ol => ol.ProductId == productId);
+ if (existingLine != null)
+ throw new InvalidOperationException("This product is already in the order.");
+
+ var orderLine = new OrderLine(productId, quantity, price);
+ _orderLines.Add(orderLine);
+
+ RecalculateTotalPrice();
+ }
+
+ private void RecalculateTotalPrice()
+ {
+ TotalPrice = _orderLines.Sum(ol => ol.TotalPrice);
+ }
+}
+
+public class OrderLine
+{
+ public Guid Id { get; private set; }
+ public Guid ProductId { get; private set; }
+ public int Quantity { get; private set; }
+ public decimal UnitPrice { get; private set; }
+ public decimal TotalPrice => Quantity * UnitPrice;
+
+ public OrderLine(Guid productId, int quantity, decimal unitPrice)
+ {
+ Id = Guid.NewGuid();
+ ProductId = productId;
+ Quantity = quantity;
+ UnitPrice = unitPrice;
+ }
+}
+
+```
+
+Here, the `Order` enforces the rule _“an order can have at most 10 items”_ inside its `AddOrderLine` method. Nobody outside the class can bypass this, because `_orderLines` is private.
+
+👉 That’s the real strength of a classic Aggregate: **business rules are always protected at the boundary.**
+
+----------
+
+### **Chapter 2: Theory in Books vs. Reality in Code — Why Classic Aggregates Struggle**
+
+In Chapter 1, we painted the “ideal” world of DDD. Aggregates were like fortresses guarding our business rules…
+But what happens when we try to build that fortress in a real project with tools like Entity Framework Core? That’s when the gap between theory and practice starts to show up.
+
+#### **1. That `.Include()` Chain — Do We Really Need It? The Performance Trap**
+
+DDD books tell us: _“To validate a business rule, you must load the entire aggregate into memory.”_
+Sounds reasonable if consistency is the goal.
+
+But let’s picture a scenario: we have an `Order` aggregate with **500 order lines** inside it. And all we want to do is change its status to `Confirmed`.
+
+```csharp
+// Just to update a single field...
+var order = await _context.Orders
+ .Include(o => o.OrderLines) // <-- 500 rows pulled in!
+ .SingleOrDefaultAsync(o => o.Id == orderId);
+
+order.Confirm(); // Just sets order.Status = "Confirmed";
+
+await _context.SaveChangesAsync();
+
+```
+
+This query pulls **all 500 order lines into memory** just so we can flip a single `Status` field. Even in small projects, this is a silent performance killer. As the system grows, it will drag your app down.
+
+
+#### **2. The Abandoned Fortress — Sliding into Anemic Domain Models**
+
+Now, what’s a developer’s natural reaction to this? Something like:
+
+_“Pulling this much data is expensive. Maybe I should strip down the aggregate into a plain POCO with properties only, and move the logic into an `OrderService` class.”_
+
+This is how we slip straight into the **Anemic Domain Model** trap. Our classes lose their behavior, becoming nothing more than data bags.
+The whole DDD principle of _“keep behavior close to data”_ evaporates. Business logic leaks out of the aggregate and spreads across services. We think we’re doing DDD, but in reality, we’ve fallen back into classic transaction-script style coding.
+
+
+#### **3. One Model Doesn’t Fit All — The Clash of Command and Query**
+
+Aggregates are designed for **commands** — write operations where business rules must be enforced.
+
+But what about **queries**? Imagine a dashboard where we just want to list the last 10 orders. All we need is `OrderId`, `CustomerName`, and `TotalAmount`.
+
+Loading 10 fully-hydrated `Order` aggregates (with all their order lines) just for that list? That’s like using a cannon to hunt a sparrow. Wasteful, slow, and clumsy.
+Aggregates simply aren’t built for reporting or read-heavy scenarios.
+
+
+And there you have it — the three usual suspects that make developers doubt DDD in real life:
+
+- Performance headaches
+
+- The risk of falling into an Anemic Model
+
+- Aggregates being too heavy for read operations
+
+
+So, should we give up on DDD? Absolutely not!
+The key is to stop following the rules blindly and instead focus on their **real intent**. In the next chapter, we’ll explore the pragmatic approach — **Demystified Aggregates** — and how they can actually help us solve these problems.
+
+----------
+
+### **Chapter 3: Enter the Solution — What Exactly Is a "Demystified Aggregate"?**
+
+The issues we listed in the last chapter don’t mean DDD is bad. They just show that blindly applying textbook rules without considering the realities of your project creates friction.
+
+A **Demystified Aggregate** isn’t a library or a framework. It’s a **way of thinking**. Its philosophy is simple: focus on the Aggregate’s real job, and make sure it does that job **as efficiently as possible.**
+
+
+#### **1. Philosophy: Focus on Purpose, Not Rules**
+
+What’s the Aggregate’s most sacred duty?
+**To protect business rules (invariants) during a data change (command).**
+
+Here’s the key: an Aggregate’s job isn’t to always hold all data in memory. Its job is to **ensure consistency while performing an operation**.
+
+Think of it like a security guard at a bank vault. Their job is to make sure transfers are done correctly. They don’t need to memorize the serial number of every single banknote. They just need the critical info for the current operation: the balance and the transfer amount.
+
+The Demystified Aggregate says the same thing: when running a method, you **only load the data that method actually needs**, not the entire Aggregate.
+
+
+#### **2. The Core Idea: What “State” Does a Behavior Actually Need?**
+
+To apply this idea in code, ask yourself:
+_“What data does the `Confirm()` method on my `Order` Aggregate actually need?”_
+
+- Maybe just the order’s current `Status`. (`"Pending"` can become `"Confirmed"`, `"Cancelled"` throws an error.)
+
+- What about `AddItem(product, quantity)`?
+
+ - It needs the `Status` (can’t add items to a cancelled order).
+
+ - And maybe the existing `OrderLines` (to increase quantity if the item already exists).
+
+
+See the pattern? Each behavior needs different data. So why load everything every single time?
+
+
+#### **3. How Do We Do This in .NET & EF Core? Practical Solutions**
+
+Putting this philosophy into code is easier than you might think.
+
+**The Approach: Purpose-Built Repository Methods**
+
+Instead of a generic `GetByIdAsync()`, create methods tailored to the operation at hand. Let’s revisit our classic **Order Confirmation** scenario in a “Before & After” style.
+
+**BEFORE (Classic & Inefficient Approach)**
+
+```csharp
+// Repository Layer
+public async Task GetByIdAsync(Guid id)
+{
+ // LOAD EVERYTHING!
+ return await _context.Orders
+ .Include(o => o.OrderLines)
+ .SingleOrDefaultAsync(o => o.Id == id);
+}
+
+// Application Service Layer
+public async Task ConfirmOrderAsync(Guid orderId)
+{
+ var order = await _orderRepository.GetByIdAsync(orderId);
+ order.Confirm(); // This method might not even care about OrderLines!
+ await _unitOfWork.SaveChangesAsync();
+}
+
+```
+
+**AFTER (Demystified & Focused Approach)**
+
+```csharp
+// Repository Layer
+public async Task GetForConfirmationAsync(Guid id)
+{
+ // LOAD ONLY WHAT WE NEED! (No OrderLines needed)
+ return await _context.Orders
+ .SingleOrDefaultAsync(o => o.Id == id);
+}
+
+// Application Service Layer
+public async Task ConfirmOrderAsync(Guid orderId)
+{
+ // Intent is crystal clear in the code!
+ var order = await _orderRepository.GetForConfirmationAsync(orderId);
+
+ // Aggregate still protects the business rule.
+ // Confirm() checks status, etc.
+ order.Confirm();
+
+ await _unitOfWork.SaveChangesAsync();
+}
+
+```
+
+**What Do We Gain?**
+
+1. **Awesome Performance:** We avoid unnecessary JOINs and data transfer.
+
+2. **Clear Intent:** Anyone reading `GetForConfirmationAsync` immediately knows this operation only cares about the order itself, not its items. Code documents itself.
+
+3. **No Compromise:** Our Aggregate still enforces the business rules via `Confirm()`. DDD’s spirit remains intact.
+
+
+For **read/query operations**, the answer is even simpler: skip Aggregates altogether! Use optimized queries that return DTOs via `Select` projections, or even raw SQL with Dapper.
+
+That’s the essence of a Demystified Aggregate: **using the right tool for the right job.**
+
+In the next chapter, we’ll wrap everything up and tie all the concepts together.
+
+----------
+
+### **Conclusion: Pragmatism Beats Dogmatism in DDD**
+
+We’ve reached the finish line. We started with the “pure” textbook definition of Aggregates in the ideal world of Domain-Driven Design. Then we hit the real-world walls of performance and complexity. Finally, we learned how to break through those walls.
+
+The biggest lesson from the **Demystified Aggregates** approach is simple:
+
+**DDD isn’t a rigid rulebook — it’s a way of thinking.**
+
+Our goal isn’t to implement the “most pure DDD ever written in a book.” It’s to make our domain logic clean, solid, understandable, and performant. In this journey, patterns and rules should serve us, not the other way around.
+
+
+### **Key Takeaways**
+
+1. **Focus on the Core Purpose:**
+ The primary reason an Aggregate exists is to enforce business rules (invariants) and ensure consistency while handling a command. Every design decision should revolve around this purpose.
+
+2. **Load Only What You Need:**
+ You don’t have to load the entire Aggregate to execute a behavior. Use purpose-built repository methods (`GetForX()`) to fetch just the data needed for the operation. This can drastically improve both performance and readability.
+
+3. **Separate Writing from Reading:**
+ Use rich, protected Aggregates for commands (write operations). For queries (read operations), don’t burden your Aggregates. Instead, rely on projections, DTOs, or optimized queries. This is one of the simplest, most practical ways to embrace CQRS principles.
+
+Don’t be afraid to shape your Aggregates based on your project and the realities of your tools (like Entity Framework Core). The power of DDD lies in its **flexibility and pragmatism**.
+
+
diff --git a/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-1.png b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-1.png
new file mode 100644
index 0000000000..834769912a
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-1.png differ
diff --git a/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-2.png b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-2.png
new file mode 100644
index 0000000000..03ae54f4a3
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-2.png differ
diff --git a/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-3.png b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-3.png
new file mode 100644
index 0000000000..8694547875
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/img-3.png differ
diff --git a/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/post.md b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/post.md
new file mode 100644
index 0000000000..c9722795da
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-16-Color-Psychology-in-Web-Design-How-to-Choose-the-Perfect-Palette-in-2025/post.md
@@ -0,0 +1,138 @@
+# Color Psychology in Web Design: How to Choose the Perfect Palette in 2025
+
+## The Importance of Color Psychology in Web Design
+
+First impressions online happen in under 50 milliseconds, and studies show that up to 90% of a user’s initial perception is based on color. In 2025, as digital competition intensifies, brands cannot rely on functionality alone—users expect emotionally engaging and visually strategic designs.
+
+Whether you’re designing for e-commerce, SaaS, lifestyle blogs, or creative portfolios, the right color palette is more than decoration. It directly influences:
+
+- Trust and credibility (blue = reliability, green = balance)
+- Conversions and urgency (red for CTAs, orange for enthusiasm)
+- Brand recall (consistent use of signature colors builds recognition)
+- User comfort and inclusivity (high contrast, accessibility standards)
+
+
+
+👉 In short, color psychology is not a design afterthought—it’s a core driver of user engagement, retention, and revenue growth.
+
+## The Psychology of Color: How Hues Shape Human Behavior
+
+Color psychology explains how different hues influence emotion, perception, and decision-making. Let’s explore the most common colors in web design:
+
+- 🔴 **Red** – Sparks urgency and excitement. Common in sales promotions, e-commerce banners, and notifications.
+ Example: YouTube’s red play button signals attention and action.
+
+- 🟠 **Orange** – Represents energy, warmth, and enthusiasm.
+ Example: Amazon’s orange “Add to Cart” button guides users toward purchases.
+
+- 🟡 **Yellow** – Radiates optimism, creativity, and energy.
+ Example: Snapchat’s bright yellow interface reflects playfulness and innovation.
+
+- 🟢 **Green** – Suggests growth, sustainability, and wellness.
+ Example: Whole Foods and health apps use green to symbolize balance and eco-conscious values.
+
+- 🔵 **Blue** – Signals trust, calm, and stability.
+ Example: PayPal and LinkedIn use blue to reinforce security and professionalism.
+
+- 🟣 **Purple** – Symbolizes luxury, creativity, and imagination.
+ Example: Beauty brands like Urban Decay use purple to highlight creativity and exclusivity.
+
+- ⚫ **Black** – Conveys sophistication and exclusivity.
+ Example: Apple and Chanel use black to emphasize premium value.
+
+- ⚪ **White** – Symbolizes purity, simplicity, and clarity.
+ Example: Apple’s predominantly white interfaces highlight elegance and minimalism.
+
+👉 Pro Insight: Combine psychology with analytics. Tools like Hotjar and Google Optimize reveal how color placement (e.g., green vs. red CTA buttons) impacts conversion rates.
+
+## Beyond Psychology: Cultural Differences in Color Meaning
+
+In global web design, one palette does not fit all. Colors have different cultural associations that can influence user perception:
+
+- **White** – Purity and minimalism in Western cultures, but associated with mourning in parts of East Asia.
+- **Red** – Danger in the West, but luck and prosperity in China.
+- **Green** – Islamically significant in the Middle East, while in the West it often symbolizes money.
+- **Black** – Luxury in the West, but mourning in many cultures.
+
+
+
+👉 For international brands, it’s crucial to localize website color palettes to avoid misinterpretations.
+
+## Web Design Color Trends for 2025
+
+The digital landscape evolves rapidly, and so do color preferences. The biggest color palette trends in 2025 include:
+
+**Neo-Minimalist Neutrals** ✨
+Soft beiges, warm grays, and creamy whites offer calm, distraction-free interfaces—ideal for B2B websites and productivity apps.
+
+**Vibrant Gradients & Neon Accents** 🌈
+Tech and e-commerce brands embrace multi-tone gradients and neon highlights to reflect energy and innovation.
+
+**Dark Mode with High-Contrast Highlights** 🌑
+Now a default in many apps, dark mode improves eye comfort while allowing accent colors to stand out for easier navigation.
+
+**Nature-Inspired Palettes** 🍃
+Eco-conscious businesses are adopting earthy greens, ocean blues, and muted browns to connect with sustainability-minded users.
+
+**Soft Pastels for Inclusivity** 💕
+Gentle tones—lavenders, light pinks, and mints—are trending in lifestyle, wellness, and community-driven platforms thanks to their approachable feel.
+
+**Dynamic AI-Driven Palettes** 🤖
+AI enables adaptive color systems that change in real-time based on time of day, user mood, or demographics.
+
+👉 Case Study: Spotify uses dark backgrounds but personalizes accents with vibrant colors that align with playlists and campaigns.
+
+## Best Practices for Choosing the Perfect Website Color Palette
+
+A successful palette balances brand identity, psychology, accessibility, and testing. Follow these steps:
+
+**Anchor in Brand Identity**
+Select a primary color that embodies your company’s values.
+Example: Tiffany & Co.’s teal blue has become globally iconic.
+**Apply the 60-30-10 Rule**
+
+- 60% background
+- 30% secondary tone
+- 10% accent (CTAs, highlights)
+ This ratio maintains visual balance.
+
+ **Leverage Color Theory**
+ Use complementary or triadic harmonies for better contrast and consistency.
+
+ **Prioritize Accessibility (WCAG Standards)**
+ Ensure a minimum 4.5:1 contrast ratio for text and use color-blind–friendly palettes.
+
+ **Account for Cultural Meanings**
+ Research local associations before targeting global markets.
+
+ **Test Across Devices & Modes**
+ Preview palettes in both light and dark modes, and across desktop, mobile, and tablet.
+
+ **A/B Test for Conversions**
+ Experiment with button colors, background shades, and highlights to find what performs best.
+
+## The Role of Color in Branding and SEO
+
+Color impacts brand authority and indirectly influences SEO by shaping user behavior:
+
+- **Bounce Rate** – Engaging palettes keep users onsite longer.
+- **Dwell Time** – Comfortable color schemes encourage scrolling.
+- **Conversion Rates** – Optimized CTAs improve click-throughs.
+- **Social Sharing** – Bold, appealing colors increase shareability
+
+
+
+## Future Outlook: Where Color Psychology Is Headed
+
+- **Mood-Adaptive Websites**
+ Platforms will adjust palettes based on detected user mood or behavior.
+- **AR & VR Color Experiences**
+ Immersive 3D design will require palettes that adapt across realities.
+- **Inclusive Color Systems**
+ Accessibility-first palettes will become the standard, ensuring usability for all.
+
+## Final Thoughts
+
+In 2025, the perfect color palette blends psychological insights, cultural awareness, and data-driven testing. Colors are no longer just visual accents—they are storytelling tools that build trust, guide behavior, and boost conversions.
+
+👉 Brands that embrace color psychology in web design today will not only stand out visually but also gain lasting competitive and business advantages.
diff --git a/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/article.md b/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/article.md
new file mode 100644
index 0000000000..f5e02c6ff3
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/article.md
@@ -0,0 +1,257 @@
+# Integration Testing Best Practices for Building a Robust Application Layer
+
+## 1. Introduction to Integration Testing
+
+For software development purposes, it is not sufficient to validate individual components individually in a vacuum. In practical usage, programs consist of holistic systems comprising a myriad of components such as **databases, services, APIs, and existing tools**, which **must work together**. An application would fail testing parameters for an individual component sufficiently but fail as a whole if such components fail to interact appropriately.
+
+Whereas unit tests verify individual parts one by one, **integration tests confirm software reliability with integrated parts**. Integration testing guarantees that the overall system performs as per design parameters whenever parts of the system are interfederated.
+
+**Why Integration Testing Is Important:**
+
+* **Reliability:** Checks the system works as it should, even with network problems, service stops, or incorrect data.
+* **Easy to Update:** Makes sure adding or changing parts doesn't break what already works.
+* **Good Quality:** Finds problems before users do.
+* **Strong Application Layer:** Checks that database actions, service handling, and API communications all work together correctly.
+
+**Example: Detailed Integration Test with Dependency Injection**
+
+```csharp
+[Fact]
+public async Task OrderCreation_WithValidInput_ShouldPersistAndReturnSuccess()
+{
+ // Set up: Use a complete Test Server
+ var factory = new WebApplicationFactory();
+ var client = factory.CreateClient();
+
+ // Do:
+ var request = new CreateOrderRequest { ProductId = 1, Quantity = 2 };
+ var response = await client.PostAsJsonAsync("/api/orders", request);
+
+ // Check
+ response.EnsureSuccessStatusCode(); // Stops if the code isn't successful
+ var order = await response.Content.ReadFromJsonAsync();
+ Assert.NotNull(order);
+ Assert.Equal(2, order.Quantity);
+}
+```
+
+This example uses a memory `TestServer` to act like the full HTTP process, from the controller to the database, for a more real test.
+
+## 2. Setting Up an Isolated Integration Test Environment
+
+Integration tests should happen in their own area to prevent:
+
+* **Slow tests** because of network issues or big data amounts
+* **Unreliable results** from live data changes
+* **Tests messing with each other**
+
+**Tips for Keeping Tests Separate:**
+
+* **Memory databases:** Fast and easy to reset for simple data tasks.
+* **Container-based areas (Docker/TestContainers):** Copy real areas safely for complex setups (like PostgreSQL, Redis).
+* **Database Actions:** Undo changes after each test to keep things separate and fast.
+
+**Example: Using Actions to Keep Things Separate**
+
+```csharp
+[Fact]
+public async Task OrderCreation_RollsBack_AfterTest()
+{
+ // Set up: Start an action that will be undone later
+ await using var transaction = await _dbContext.Database.BeginTransactionAsync();
+
+ var service = new OrderService(_dbContext);
+ var result = service.CreateOrder(1, 2);
+ Assert.True(result.IsSuccess);
+
+ // Do & Check
+ var orderCount = await _dbContext.Orders.CountAsync();
+ Assert.Equal(1, orderCount);
+
+ // Clean up: Undo the action to reset all changes
+ await transaction.RollbackAsync();
+}
+```
+
+Using actions makes sure tests stay separate and can run at the same time safely.
+
+## 3. Seeding Test Data for Consistent Integration Results
+
+Start data gives a steady base for tests. Include complex links for real situations.
+
+```csharp
+// Use a special way to get the data started
+private static async Task SeedData(AppDbContext dbContext)
+{
+ await dbContext.Products.AddRangeAsync(
+ new Product { Id = 1, Name = "Coffee", Price = 5, Stock = 50 },
+ new Product { Id = 2, Name = "Tea", Price = 3, Stock = 20 }
+ );
+ await dbContext.Users.AddAsync(new User { Id = 1, Name = "Alice", IsActive = true });
+ await dbContext.Orders.AddAsync(new Order { Id = 1, UserId = 1, ProductId = 1, Quantity = 2 });
+
+ await dbContext.SaveChangesAsync();
+}
+```
+
+**Tip:** Use the Builder style or a special `TestSeeder` class to make detailed, reusable data setups.
+
+## 4. Validating API and Service Layer Interactions
+
+Integration tests should copy what real users do to check the whole request-response process.
+
+```csharp
+// Detailed API Test with CancellationToken and Custom Headers
+var request = new CreateOrderRequest { ProductId = 1, Quantity = 2 };
+var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/api/orders")
+{
+ Content = JsonContent.Create(request)
+};
+requestMessage.Headers.Add("X-Request-Id", Guid.NewGuid().ToString());
+
+// Act like a timeout is happening
+var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(50));
+await Assert.ThrowsAsync(async () =>
+{
+ await _client.SendAsync(requestMessage, cts.Token);
+});
+```
+
+Test both normal uses and unusual ones like timeouts, bad requests, and too many users at once for a truly reliable API.
+
+## 5. Mocking External Dependencies in Integration Tests
+
+Use copies or fake versions for services like payment systems, emails, or other APIs to keep your application logic separate.
+
+```csharp
+// Set up: Copy an outside payment service
+var paymentServiceMock = new Mock();
+paymentServiceMock.Setup(x => x.ProcessPayment(It.IsAny(), It.IsAny()))
+ .ThrowsAsync(new TimeoutException("Payment gateway timeout"));
+
+// Do: Put the copy into the test area
+services.AddScoped(_ => paymentServiceMock.Object);
+
+// Check: See how the system handles the timeout
+var response = await _client.PostAsJsonAsync("/api/payments", new { Amount = 100 });
+Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+Assert.Contains("Payment service unavailable", await response.Content.ReadAsStringAsync());
+```
+
+Mimicking lets you act like things are failing (like APIs timing out or services being down) and check that your application handles these issues well without using real network calls.
+
+## 6. Covering Success and Failure Scenarios in Tests
+
+A good test set has full coverage of both successful actions and error handling.
+
+```csharp
+// Normal use: A successful order creation
+var validOrder = new CreateOrderRequest { ProductId = 1, Quantity = 1 };
+var successResponse = await _client.PostAsJsonAsync("/api/orders", validOrder);
+Assert.Equal(HttpStatusCode.Created, successResponse.StatusCode);
+
+// Bad request: Wrong product ID
+var invalidProductOrder = new CreateOrderRequest { ProductId = 999, Quantity = 1 };
+var badProductResponse = await _client.PostAsJsonAsync("/api/orders", invalidProductOrder);
+Assert.Equal(HttpStatusCode.NotFound, badProductResponse.StatusCode);
+
+// Conflict: Not enough stock
+var largeOrder = new CreateOrderRequest { ProductId = 1, Quantity = 1000 };
+var stockResponse = await _client.PostAsJsonAsync("/api/orders", largeOrder);
+Assert.Equal(HttpStatusCode.Conflict, stockResponse.StatusCode);
+```
+
+Testing everything makes sure your application layer gives helpful and correct error messages to users.
+
+## 7. Ensuring Cleanup and Test Isolation
+
+Keep test results steady by making sure each test is totally separate from others.
+
+```csharp
+// Use a special cleanup method or a test setup
+public class OrderTests : IDisposable
+{
+ private readonly AppDbContext _dbContext;
+
+ public OrderTests()
+ {
+ _dbContext = new AppDbContext(GetDbContextOptions());
+ // Setup logic here
+ }
+
+ // Cleanup logic
+ public void Dispose()
+ {
+ _dbContext.Database.EnsureDeleted();
+ _dbContext.Dispose();
+ }
+}
+```
+
+Clean up automatically for tests that run at the same time using `IDisposable` or by putting each test in a database action.
+
+## 8. Automating Integration Tests with CI/CD Pipelines
+
+Automate tests in CI/CD lines for regular, consistent checking.
+
+```yaml
+jobs:
+ test-and-build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 7.0.x
+ - name: Build
+ run: dotnet build --configuration Release
+ - name: Run Integration Tests
+ run: dotnet test --filter Category=Integration --logger trx;LogFileName=testresults.trx
+```
+
+Regular testing finds integration problems early, saving effort over time.
+
+## 9. Complete Integration Test Example with a Basic Comparison
+
+```csharp
+[Fact]
+public async Task CompleteOrderWorkflow_ShouldPersistAllSteps()
+{
+ // Set up: Start complex data for a full action
+ await SeedData(_dbContext);
+
+ // Do: Act like a real user request
+ var request = new CreateOrderRequest { ProductId = 1, Quantity = 2, UserId = 1 };
+ var response = await _client.PostAsJsonAsync("/api/orders", request);
+ Assert.Equal(HttpStatusCode.Created, response.StatusCode);
+
+ // Check 1: See the database state
+ var order = await _dbContext.Orders.FirstOrDefaultAsync(o => o.UserId == 1 && o.ProductId == 1);
+ Assert.NotNull(order);
+ Assert.Equal(2, order.Quantity);
+
+ // Check 2: See side effects (like stock going down)
+ var product = await _dbContext.Products.FirstOrDefaultAsync(p => p.Id == 1);
+ Assert.Equal(48, product.Stock);
+}
+```
+
+🍪 **Cookie Comparison**
+
+* **Starting products** are like the dough you have ready.
+* **The new order** is like the new stuff you mix in.
+* **The oven (application)** mixes both, baking (business logic).
+* **The cookie** is the right outcome, using the old dough and new stuff well.
+
+This shows how a good application layer uses new and old data well together.
+
+---
+
+### 10. Summary:
+
+* **Separate Area:** Ensures tests run on their own.
+* **Start Data:** Gives results that are consistent.
+* **Mimicking Outside Parts:** Keeps tests stable.
+* **Testing Both Good and Bad:** Makes the situation solid.
+* **CI/CD Automation:** Keeps the system stable.
diff --git a/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/cover.png b/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/cover.png
new file mode 100644
index 0000000000..9ff6df4764
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-17-Integration-Testing-Best-Practices-for-Building-a-Robust-Application-Layer/cover.png differ
diff --git a/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-1.png b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-1.png
new file mode 100644
index 0000000000..82609db662
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-1.png differ
diff --git a/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-2.png b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-2.png
new file mode 100644
index 0000000000..1c9c0fc091
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-2.png differ
diff --git a/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-3.png b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-3.png
new file mode 100644
index 0000000000..5efff2b07f
Binary files /dev/null and b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/img-3.png differ
diff --git a/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/post.md b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/post.md
new file mode 100644
index 0000000000..701a9e985b
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-17-Unit-of-Work-with-Aspnetcore/post.md
@@ -0,0 +1,820 @@
+# Unit of Work Pattern with Generic Repository in ASP.NET Core
+
+Picture this: You're building an e-commerce system and a customer places an order. You need to create the order record, update inventory, charge payment, and send a confirmation email. What happens if the payment succeeds but the inventory update fails? You're left with inconsistent data and an angry customer.
+
+This is exactly where the Unit of Work pattern becomes invaluable. Instead of managing transactions manually across multiple repositories, this pattern coordinates all your data changes as a single, atomic operation.
+
+## Understanding the Unit of Work Pattern
+
+The Unit of Work pattern maintains a list of objects affected by a business transaction and coordinates writing out changes while resolving concurrency problems. Think of it as your transaction coordinator that ensures all-or-nothing operations.
+
+### The Problem: Scattered Transaction Management
+
+Without proper coordination, you often end up with code like this:
+
+```csharp
+// Each repository manages its own context - risky!
+await _productRepository.CreateAsync(product);
+await _inventoryRepository.UpdateStockAsync(productId, -quantity);
+await _orderRepository.CreateAsync(order);
+```
+
+This approach has several problems:
+- Each operation might use a different database context
+- No automatic rollback if one operation fails
+- Manual transaction management becomes complex
+- Data consistency isn't guaranteed
+
+### The Solution: Coordinated Operations
+
+With Unit of Work, the same scenario becomes much cleaner:
+
+```csharp
+await _unitOfWork.BeginTransactionAsync();
+
+try
+{
+ var productRepo = _unitOfWork.Repository();
+ var inventoryRepo = _unitOfWork.Repository();
+ var orderRepo = _unitOfWork.Repository();
+
+ await productRepo.AddAsync(product);
+ await inventoryRepo.UpdateStockAsync(productId, -quantity);
+ await orderRepo.AddAsync(order);
+
+ await _unitOfWork.SaveChangesAsync();
+ await _unitOfWork.CommitTransactionAsync();
+}
+catch
+{
+ await _unitOfWork.RollbackTransactionAsync();
+ throw;
+}
+```
+
+Now all operations either succeed together or fail together, guaranteeing data consistency.
+
+## Sample Implementation
+
+> To keep the example short, I will only show the Product entity along with the implementation of the Generic Repository and Unit of Work. In this example, I will use Blazor and .NET 9.
+
+You can access the sample project here https://github.com/m-aliozkaya/UnitOfWorkDemo.
+
+### 1. Generic Repository Implementation
+
+The repository interface defines the contract for data operations. Here's what we're working with:
+
+_IRepository.cs_ at `~/Data/Repositories`
+```csharp
+using System.Linq.Expressions;
+
+namespace UOWDemo.Repositories;
+
+public interface IRepository where T : class
+{
+ Task GetByIdAsync(int id);
+ Task> GetAllAsync();
+ Task> FindAsync(Expression> predicate);
+ Task SingleOrDefaultAsync(Expression> predicate);
+
+ Task AddAsync(T entity);
+ void Update(T entity);
+ void Remove(T entity);
+ void RemoveRange(IEnumerable entities);
+
+ Task ExistsAsync(int id);
+ Task CountAsync();
+ Task CountAsync(Expression> predicate);
+}
+```
+
+_Repository.cs_ at `~/Data/Repositories`
+```csharp
+using Microsoft.EntityFrameworkCore;
+using System.Linq.Expressions;
+using UOWDemo.Data;
+
+namespace UOWDemo.Repositories;
+
+public class Repository : IRepository where T : class
+{
+ protected readonly ApplicationDbContext _context;
+ protected readonly DbSet _dbSet;
+
+ public Repository(ApplicationDbContext context)
+ {
+ _context = context;
+ _dbSet = context.Set();
+ }
+
+ public virtual async Task GetByIdAsync(int id)
+ {
+ return await _dbSet.FindAsync(id);
+ }
+
+ public virtual async Task> GetAllAsync()
+ {
+ return await _dbSet.ToListAsync();
+ }
+
+ public virtual async Task> FindAsync(Expression> predicate)
+ {
+ return await _dbSet.Where(predicate).ToListAsync();
+ }
+
+ public virtual async Task SingleOrDefaultAsync(Expression> predicate)
+ {
+ return await _dbSet.SingleOrDefaultAsync(predicate);
+ }
+
+ public virtual async Task AddAsync(T entity)
+ {
+ await _dbSet.AddAsync(entity);
+ }
+
+ public virtual void Update(T entity)
+ {
+ _dbSet.Update(entity);
+ }
+
+ public virtual void Remove(T entity)
+ {
+ _dbSet.Remove(entity);
+ }
+
+ public virtual void RemoveRange(IEnumerable entities)
+ {
+ _dbSet.RemoveRange(entities);
+ }
+
+ public virtual async Task ExistsAsync(int id)
+ {
+ var entity = await _dbSet.FindAsync(id);
+ return entity != null;
+ }
+
+ public virtual async Task CountAsync()
+ {
+ return await _dbSet.CountAsync();
+ }
+
+ public virtual async Task CountAsync(Expression> predicate)
+ {
+ return await _dbSet.CountAsync(predicate);
+ }
+}
+```
+
+### 2. Unit of Work Implementation
+
+_IUnitOfWork.cs_ at `~/Data/UnitOfWork`
+```csharp
+public interface IUnitOfWork : IDisposable, IAsyncDisposable
+{
+ IRepository Repository() where T : class;
+ Task SaveChangesAsync();
+ Task BeginTransactionAsync();
+ Task CommitTransactionAsync();
+ Task RollbackTransactionAsync();
+}
+```
+
+_UnitOfWork.cs_ at `~/Data/UnitOfWork`
+```csharp
+public class UnitOfWork : IUnitOfWork
+{
+ private readonly ApplicationDbContext _context;
+ private bool _disposed;
+ private IDbContextTransaction? _currentTransaction;
+
+ // ConcurrentDictionary for thread-safe repository caching
+ private readonly ConcurrentDictionary _repositories = new();
+
+ public UnitOfWork(ApplicationDbContext context)
+ {
+ _context = context;
+ }
+
+ public IRepository Repository() where T : class
+ {
+ return (IRepository)_repositories.GetOrAdd(
+ typeof(T),
+ _ => new Repository(_context)
+ );
+ }
+
+ public int SaveChanges() => context.SaveChanges();
+ public Task SaveChangesAsync(CancellationToken cancellationToken = default) =>
+ context.SaveChangesAsync(cancellationToken);
+
+ public async Task BeginTransactionAsync()
+ {
+ if (_currentTransaction != null)
+ return;
+
+ _currentTransaction = await _context.Database.BeginTransactionAsync();
+ }
+
+ public async Task CommitTransactionAsync()
+ {
+ if (_currentTransaction == null)
+ return;
+
+ await _currentTransaction.CommitAsync();
+ await _currentTransaction.DisposeAsync();
+ _currentTransaction = null;
+ }
+
+ public async Task RollbackTransactionAsync()
+ {
+ if (_currentTransaction == null)
+ return;
+
+ await _currentTransaction.RollbackAsync();
+ await _currentTransaction.DisposeAsync();
+ _currentTransaction = null;
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ _context.Dispose();
+ _currentTransaction?.Dispose();
+ _disposed = true;
+ }
+ GC.SuppressFinalize(this);
+ }
+
+ public async ValueTask DisposeAsync()
+ {
+ if (!_disposed)
+ {
+ await _context.DisposeAsync();
+ if (_currentTransaction != null)
+ {
+ await _currentTransaction.DisposeAsync();
+ }
+ _disposed = true;
+ }
+ GC.SuppressFinalize(this);
+ }
+}
+```
+
+### 3. Configure Dependency Injection
+
+Register the services in your `Program.cs`:
+
+```csharp
+builder.Services.AddScoped();
+```
+
+
+### 4. Defining and Registering Entity to DbContext
+
+First, let's define a simple `Product` entity:
+
+_Product.cs_ at `~/Data/Entities`
+```csharp
+using System.ComponentModel.DataAnnotations;
+
+namespace UOWDemo.Models;
+
+public class Product
+{
+ public int Id { get; set; }
+
+ [Required]
+ [MaxLength(100)]
+ public string Name { get; set; } = string.Empty;
+
+ [MaxLength(500)]
+ public string? Description { get; set; }
+
+ [Required]
+ [Range(0.01, double.MaxValue)]
+ public decimal Price { get; set; }
+
+ [Required]
+ [Range(0, int.MaxValue)]
+ public int Stock { get; set; }
+
+ public DateTime CreatedDate { get; set; } = DateTime.UtcNow;
+}
+```
+
+* Go to your `DbContext` and implement following code.
+
+```csharp
+ public DbSet Products { get; set; }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.Entity(entity =>
+ {
+ entity.HasKey(e => e.Id);
+ entity.Property(e => e.Price).HasPrecision(18, 2);
+ entity.Property(e => e.CreatedDate).HasDefaultValueSql("GETUTCDATE()");
+ });
+
+ modelBuilder.Entity().HasData(
+ new Product { Id = 1, Name = "Laptop", Description = "High-performance laptop", Price = 1299.99m, Stock = 15, CreatedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
+ new Product { Id = 2, Name = "Mouse", Description = "Wireless gaming mouse", Price = 79.99m, Stock = 50, CreatedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc) },
+ new Product { Id = 3, Name = "Keyboard", Description = "Mechanical keyboard", Price = 149.99m, Stock = 25, CreatedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc) }
+ );
+ }
+```
+
+### 5. Implement the UI
+
+_ProductService.cs_ at `~/Services`
+```csharp
+using System.Text.Json;
+using UOWDemo.Models;
+
+namespace UOWDemo.Services;
+
+public class ProductService
+{
+ private readonly HttpClient _httpClient;
+
+ public ProductService(HttpClient httpClient)
+ {
+ _httpClient = httpClient;
+ }
+
+ public async Task> GetAllProductsAsync()
+ {
+ var response = await _httpClient.GetAsync("/api/products");
+ response.EnsureSuccessStatusCode();
+ var json = await response.Content.ReadAsStringAsync();
+ return JsonSerializer.Deserialize>(json, new JsonSerializerOptions
+ {
+ PropertyNameCaseInsensitive = true
+ }) ?? new List();
+ }
+
+ public async Task CreateTwoProductsWithUowAsync(Product product1, Product product2)
+ {
+ var request = new TwoProductsRequest { Product1 = product1, Product2 = product2 };
+ var json = JsonSerializer.Serialize(request);
+ var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
+
+ var response = await _httpClient.PostAsync("/api/products/two-products-with-uow", content);
+ response.EnsureSuccessStatusCode();
+ }
+
+ public async Task CreateTwoProductsWithoutUowAsync(Product product1, Product product2)
+ {
+ var request = new TwoProductsRequest { Product1 = product1, Product2 = product2 };
+ var json = JsonSerializer.Serialize(request);
+ var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
+
+ var response = await _httpClient.PostAsync("/api/products/two-products-without-uow", content);
+ response.EnsureSuccessStatusCode();
+ }
+
+ public async Task DeleteProductAsync(int id)
+ {
+ var response = await _httpClient.DeleteAsync($"/api/products/{id}");
+ response.EnsureSuccessStatusCode();
+ }
+}
+```
+
+_Products.razor_ at `~/Components/Pages`
+```csharp
+@page "/products"
+@using UOWDemo.Models
+@using UOWDemo.Services
+@inject ProductService ProductService
+@inject IJSRuntime JSRuntime
+@rendermode InteractiveServer
+
+Products
+
+
+
+
+
Product Management
+
This page demonstrates Unit of Work transaction patterns with bulk operations.
+
+
+
+
+
+
+
+
+
+ @if (isLoading)
+ {
+
+
+ Loading...
+
+
+ }
+ else
+ {
+
+
+
+
+
+
+
ID
+
Name
+
Description
+
Price
+
Stock
+
Actions
+
+
+
+ @foreach (var product in products)
+ {
+
+
@product.Id
+
@product.Name
+
@product.Description
+
$@product.Price.ToString("F2")
+
@product.Stock
+
+
+
+
+ }
+
+
+
+
+
+ }
+
+
+
+@if (showTwoProductsModal)
+{
+
+
+
+
+
Two Products Demo - Unit of Work vs No Unit of Work
+
+
+
+
+
+
+
+
Product 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Product 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Demo Purpose: Check the console logs to see the difference in SQL transactions.
+
+
With Unit of Work: Both products saved in a single transaction
+
Without Unit of Work: Each product saved in separate transactions
+
+
+
+
+
+
+
+}
+
+@code {
+ private List products = new();
+ private bool isLoading = true;
+
+ private bool showTwoProductsModal = false;
+ private Product product1 = new();
+ private Product product2 = new();
+
+ protected override async Task OnInitializedAsync()
+ {
+ await LoadProducts();
+ }
+
+ private async Task LoadProducts()
+ {
+ try
+ {
+ isLoading = true;
+ products = await ProductService.GetAllProductsAsync();
+ }
+ catch (Exception ex)
+ {
+ await JSRuntime.InvokeVoidAsync("alert", $"Error loading products: {ex.Message}");
+ }
+ finally
+ {
+ isLoading = false;
+ }
+ }
+
+
+ private void ShowTwoProductsForm()
+ {
+ product1 = new Product { Name = "Product 1", Description = "First product description", Price = 10.00m, Stock = 100 };
+ product2 = new Product { Name = "Product 2", Description = "Second product description", Price = 20.00m, Stock = 50 };
+ showTwoProductsModal = true;
+ }
+
+ private void HideTwoProductsModal()
+ {
+ showTwoProductsModal = false;
+ product1 = new Product();
+ product2 = new Product();
+ }
+
+ private async Task SaveTwoProductsWithUow()
+ {
+ try
+ {
+ await ProductService.CreateTwoProductsWithUowAsync(product1, product2);
+ await JSRuntime.InvokeVoidAsync("alert", "Two products saved with Unit of Work! Check console logs to see single transaction.");
+ await LoadProducts();
+ HideTwoProductsModal();
+ }
+ catch (Exception ex)
+ {
+ await JSRuntime.InvokeVoidAsync("alert", $"Error saving products with UoW: {ex.Message}");
+ }
+ }
+
+ private async Task SaveTwoProductsWithoutUow()
+ {
+ try
+ {
+ await ProductService.CreateTwoProductsWithoutUowAsync(product1, product2);
+ await JSRuntime.InvokeVoidAsync("alert", "Two products saved without Unit of Work! Check console logs to see separate transactions.");
+ await LoadProducts();
+ HideTwoProductsModal();
+ }
+ catch (Exception ex)
+ {
+ await JSRuntime.InvokeVoidAsync("alert", $"Error saving products without UoW: {ex.Message}");
+ }
+ }
+
+ private async Task DeleteProduct(int id)
+ {
+ if (await JSRuntime.InvokeAsync("confirm", "Are you sure you want to delete this product?"))
+ {
+ try
+ {
+ await ProductService.DeleteProductAsync(id);
+ await LoadProducts();
+ }
+ catch (Exception ex)
+ {
+ await JSRuntime.InvokeVoidAsync("alert", $"Error deleting product: {ex.Message}");
+ }
+ }
+ }
+}
+```
+
+UI Preview
+
+
+
+_ProductsController.cs_ at `~/Controllers`
+```csharp
+using Microsoft.AspNetCore.Mvc;
+using UOWDemo.Data;
+using UOWDemo.Models;
+using UOWDemo.UnitOfWork;
+
+namespace UOWDemo.Controllers;
+
+[ApiController]
+[Route("api/[controller]")]
+public class ProductsController : ControllerBase
+{
+ private readonly IUnitOfWork _unitOfWork;
+ private readonly ApplicationDbContext _context;
+
+ public ProductsController(IUnitOfWork unitOfWork, ApplicationDbContext context)
+ {
+ _unitOfWork = unitOfWork;
+ _context = context;
+ }
+
+ [HttpGet]
+ public async Task GetProducts()
+ {
+ var repository = _unitOfWork.Repository();
+ var products = await repository.GetAllAsync();
+ return Ok(products);
+ }
+
+
+ [HttpPost("two-products-with-uow")]
+ public async Task CreateTwoProductsWithUow(TwoProductsRequest request)
+ {
+ if (!ModelState.IsValid)
+ return BadRequest(ModelState);
+
+ await _unitOfWork.BeginTransactionAsync();
+
+ try
+ {
+ var repository = _unitOfWork.Repository();
+ await repository.AddAsync(request.Product1);
+ await repository.AddAsync(request.Product2);
+ await _unitOfWork.SaveChangesAsync();
+ await _unitOfWork.CommitTransactionAsync();
+
+ return Ok(new { message = "Two products created with Unit of Work (single transaction)",
+ products = new[] { request.Product1, request.Product2 } });
+ }
+ catch
+ {
+ await _unitOfWork.RollbackTransactionAsync();
+ throw;
+ }
+ }
+
+ [HttpPost("two-products-without-uow")]
+ public async Task CreateTwoProductsWithoutUow(TwoProductsRequest request)
+ {
+ if (!ModelState.IsValid)
+ return BadRequest(ModelState);
+
+ // First product - separate transaction
+ await _context.Products.AddAsync(request.Product1);
+ await _context.SaveChangesAsync();
+
+ // Second product - separate transaction
+ await _context.Products.AddAsync(request.Product2);
+ await _context.SaveChangesAsync();
+
+ return Ok(new { message = "Two products created without Unit of Work (separate transactions)",
+ products = new[] { request.Product1, request.Product2 } });
+ }
+
+ [HttpDelete("{id}")]
+ public async Task DeleteProduct(int id)
+ {
+ var repository = _unitOfWork.Repository();
+ var product = await repository.GetByIdAsync(id);
+
+ if (product == null)
+ return NotFound();
+
+ repository.Remove(product);
+ await _unitOfWork.SaveChangesAsync();
+
+ return NoContent();
+ }
+}
+```
+
+The code base should be shown like this.
+
+
+
+### 6. Seeing the Difference: Transaction Logging
+
+To see the transaction behavior in action, configure Entity Framework logging in `appsettings.Development.json`:
+
+```json
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning",
+ "Microsoft.EntityFrameworkCore.Database.Command": "Information",
+ "Microsoft.EntityFrameworkCore.Database.Transaction": "Information"
+ }
+ }
+}
+```
+
+Now when you run the demo, the console will show:
+
+**With Unit of Work - One Transaction:**
+```
+BEGIN TRANSACTION
+INSERT INTO [Products] ([Name], [Description], [Price], [Stock]) VALUES ('Product 1', ...)
+INSERT INTO [Products] ([Name], [Description], [Price], [Stock]) VALUES ('Product 2', ...)
+COMMIT TRANSACTION
+```
+
+**Without Unit of Work - Two Separate Transactions:**
+```
+BEGIN TRANSACTION
+INSERT INTO [Products] ([Name], [Description], [Price], [Stock]) VALUES ('Product 1', ...)
+COMMIT TRANSACTION
+
+BEGIN TRANSACTION
+INSERT INTO [Products] ([Name], [Description], [Price], [Stock]) VALUES ('Product 2', ...)
+COMMIT TRANSACTION
+```
+
+## What If?
+
+
+
+What if we were using the ABP Framework instead of manually implementing the Unit of Work and Generic Repository? Well, most of the heavy lifting we did in this example would be handled automatically. ABP provides built-in support for Unit of Work, transactions, and repository patterns, allowing you to focus on business logic rather than plumbing code.
+
+### Key Advantages with ABP
+
+Automatic Transaction Management: Every application service method runs within a transaction by default. If an exception occurs, changes are automatically rolled back.
+
+* [UnitOfWork] Attribute: You can simply annotate a method with [UnitOfWork] to ensure all repository operations within it run in a single transaction.
+
+* Automatic SaveChanges: You don’t need to call SaveChanges() manually; ABP takes care of persisting changes at the end of a Unit of Work.
+
+* Configurable Transaction Options: Transaction isolation levels and timeouts can be easily configured, helping with performance and data consistency.
+
+* Event-Based Completion: After a successful transaction, related domain events can be triggered automatically—for example, sending a confirmation email when an entity is created.
+
+And many of them. If you interested in check this document. https://abp.io/docs/latest/framework/architecture/domain-driven-design/unit-of-work
+
+📌 Example:
+
+```csharp
+[UnitOfWork]
+public void CreatePerson(CreatePersonInput input)
+{
+ var person = new Person { Name = input.Name, EmailAddress = input.EmailAddress };
+ _personRepository.Insert(person);
+ _statisticsRepository.IncrementPeopleCount();
+}
+```
+
+In this example, both repository operations execute within the same transaction. ABP handles the commit automatically, so either all changes succeed or none are applied.
+
+> Takeaway: With ABP, developers don’t need to manually implement Unit of Work or manage transactions. This reduces boilerplate code, ensures consistency, and lets you focus on the domain logic.
+
+## Conclusion
+
+The Unit of Work pattern shines in scenarios where multiple operations must succeed or fail together. By centralizing transaction management and repository access, it reduces complexity and ensures consistency.
+
+This demo kept things simple with a single Product entity, but the same approach scales to more complex domains. Whether you’re building an e-commerce app, a financial system, or any data-heavy application, adopting Unit of Work with a Generic Repository can make your codebase cleaner, safer, and easier to maintain.
+
+Feel free to clone the sample project, experiment with it, and adapt the pattern to your own needs. 🚀
\ No newline at end of file
diff --git a/docs/en/Community-Articles/2025-09-18-10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025/10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025..md b/docs/en/Community-Articles/2025-09-18-10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025/10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025..md
new file mode 100644
index 0000000000..c010594d44
--- /dev/null
+++ b/docs/en/Community-Articles/2025-09-18-10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025/10-Modern-HTML-CSS-Techniques-Every-Designer-Should-Know-in-2025..md
@@ -0,0 +1,608 @@
+# 10 Modern HTML & CSS Techniques Every Designer Should Know in 2025
+
+HTML and CSS are developing with new features every year. In 2025, things are much more excited than before; because now only classic labels and simple styles are not enough. There are many modern techniques that strengthen the user experience, make the design more flexible and make our business serious easier. In this article, I have compiled 10 of each designer for you.
+
+Let's start ...
+
+## Modern HTML Techniques
+
+
+### 1. `` and `` tag
+
+This structure offers a structure where users can open and turn off according to their wishes.
+If you need to examine in detail;
+
+````
+
+
Proin magna felis, vestibulum non felis quis, consequat commodo ligula.
+
Sed at purus magna. Sed auctor nisl velit.
+
+````
+This is the general use. If we do not specify a special title, the **Details** title comes by default. To change this, we should use ``.
+
+````
+
+ Lorem Ipsum
+
Proin magna felis, vestibulum non felis quis, consequat commodo ligula.
+
Sed at purus magna. Sed auctor nisl velit.
+
+````
+
+#### Styling
+
+The `` element can be styled with CSS; its color, font, background, and other properties can be customized.
+
+Additionally, the default triangle marker of `` can also be styled using `::marker`.
+The marker is a small sign indicating that the structure is open or closed.
+We can use the `:: marker` pseudo-element to style it. But we should use it as `::marker` which belongs to the ``.
+
+**👉** *HTML Demo* : https://codepen.io/halimekarayay/pen/OPyKBZM
+
+
+#### Attributes
+
+##### Open Attribute
+By default, the structure is **closed**. We can change the default open/closed state using `open`.
+
+
+ This is a title
+
Lorem Ipsum is simply dummy text of the printing and typesetting industry
+
Lorem Ipsum is simply dummy text of the printing and typesetting industry
+
+
+
+##### Name
+
+This feature allows multiple `` to move into a group by connecting to each other. Only one of them is open at the same time. This feature allows developers to easily create user interface features such as accordion without writing a script.
+
+
+
+ Graduation Requirements
+
+ Sed eu ipsum magna. Ut ultricies arcu nec lectus interdum, sit amet elementum diam elementum.
+
+
+
+ System Requirements
+
+ Curabitur porta quis mi id gravida. Ut convallis, ligula quis blandit sagittis.
+
+
+
+ Job Requirements
+
+ Suspendisse malesuada arcu eget condimentum pretium.
+