From e97dc61d7bea90bc4c7eab06e0ea5f1c2283180f Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Thu, 14 May 2026 15:16:57 +0300 Subject: [PATCH] Update v10.4 release blog post and add image Expand the React UI section to state that ABP 10.4 makes React a first-class modern template option, explain the in-solution React app plus ABP Admin Console approach, list the core tooling (Vite, TypeScript, TanStack Router/Query, Axios, Zod, React Hook Form, Tailwind CSS, shadcn/ui, Vitest), and note creation via the --modern flag or ABP Studio. Rename and expand the ABP Studio AI Agent section to 'ABP Agent', describe its three modes (Agent, Plan, Ask) and capabilities (solution-aware coding, build/run tasks, proxies, migrations, runtime inspection), and highlight workflow integrations (runner, task runner, Git/GitHub, AI commit messages, ABP-aware code review). Add the upgrade-abp-packages.png asset used by the post. --- .../2026-05-14 v10_4_Release_Stable/POST.md | 12 ++++++++++-- .../upgrade-abp-packages.png | Bin 0 -> 16766 bytes 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/upgrade-abp-packages.png diff --git a/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/POST.md b/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/POST.md index ae1d9c310f..bc176a406e 100644 --- a/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/POST.md +++ b/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/POST.md @@ -58,13 +58,21 @@ There have been some important announcements for the ABP community recently. Her ![React UI for ABP Framework Is Finally Here](https://abp.io/api/posts/cover-picture-source/3a2114d0-5518-38a8-d9b3-ab5100b587a4?v=20260508112328) -React support has been one of the most requested topics in the ABP community, and it is now available as a first-class UI option in the modern template system. You can read the announcement here: [React UI for ABP Framework Is Finally Here](https://abp.io/community/announcements/react-ui-for-abp-framework-is-finally-here-7rfmgb2v). +React support has been one of the most requested topics in the ABP community, and with ABP 10.4, it becomes a first-class UI option in the modern template system. The new React UI is designed for teams that want ABP on the backend and React on the frontend while keeping ABP's built-in application features such as authentication, authorization, localization, multi-tenancy, modularity, runtime configuration, and deployment. + +Modern React solutions include your own React application as real source code in the solution, plus the ABP Admin Console for standard module administration screens. This means your product UI stays fully under your control, while ABP still provides a consistent and upgradeable administration experience. + +The React stack is built with familiar modern tools, including Vite, TypeScript, TanStack Router, TanStack Query, Axios, Zod, React Hook Form, Tailwind CSS, shadcn/ui, and Vitest. You can create a React UI solution with the `--modern` flag or by selecting the modern template flow in ABP Studio. You can read the announcement here: [React UI for ABP Framework Is Finally Here](https://abp.io/community/announcements/react-ui-for-abp-framework-is-finally-here-7rfmgb2v). #### Introducing ABP Studio AI Agent ![Introducing ABP Studio AI Agent](https://abp.io/api/posts/cover-picture-source/3a212ebc-06c1-e10f-f83c-a90079f988c1?v=20260508112328) -ABP Studio now introduces a deeply integrated AI coding agent that understands ABP solutions, modules, layers, run profiles, and runtime feedback. You can read the announcement here: [Introducing ABP Studio AI Agent](https://abp.io/community/announcements/introducing-abp-studio-ai-agent-o1ni0toc). +ABP Studio now introduces ABP Agent, a deeply integrated AI coding assistant that understands ABP solutions as complete systems, not just as files in folders. It is aware of ABP concepts such as modules, layers, aggregate roots, repositories, application services, DTOs, permissions, localization, event bus, distributed cache, background jobs, and module dependencies. + +ABP Agent works in three modes: Agent mode for implementation, Plan mode for read-only investigation and planning, and Ask mode for Q&A and explanations. It can use ABP Studio's analysis engine to understand the solution structure, build affected projects, start or restart applications, run tasks, generate proxies, add migrations, and inspect runtime feedback such as exceptions, logs, HTTP requests, and distributed events. + +The announcement also highlights the broader development loop around ABP Agent: solution runner integration, custom workflows, task runner support, Git and GitHub integration, AI-generated commit messages, and ABP-aware AI code review. You can read the announcement here: [Introducing ABP Studio AI Agent](https://abp.io/community/announcements/introducing-abp-studio-ai-agent-o1ni0toc). ### New ABP Community Articles diff --git a/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/upgrade-abp-packages.png b/docs/en/Blog-Posts/2026-05-14 v10_4_Release_Stable/upgrade-abp-packages.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec1d1958985daeea4f67d22ae1bdb180969b78d GIT binary patch literal 16766 zcmb7s2V4`)*0+UF78NWDNDUUmfD}QB)I_Qx1W1T

S>_NS8nmK@dfy2_)1c2#82; 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