From 92e66559ce76d3b66249c7bf09b8c595a36c430c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 17 Oct 2025 12:17:49 +0000
Subject: [PATCH 1/2] Initial plan
From 28d02b097f9cd31bd3b5be809cad2f5edfe0d193 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 17 Oct 2025 12:33:15 +0000
Subject: [PATCH 2/2] Add PrintAdminUrl hook to display admin URL after
deployment
Co-authored-by: adrians5j <5121148+adrians5j@users.noreply.github.com>
---
.../project-aws/src/extensions/Webiny.tsx | 1 +
.../src/extensions/Webiny/PrintAdminUrl.ts | 59 +++++++++++++++++++
2 files changed, 60 insertions(+)
create mode 100644 packages/project-aws/src/extensions/Webiny/PrintAdminUrl.ts
diff --git a/packages/project-aws/src/extensions/Webiny.tsx b/packages/project-aws/src/extensions/Webiny.tsx
index 30417d41857..87758ca3cfc 100644
--- a/packages/project-aws/src/extensions/Webiny.tsx
+++ b/packages/project-aws/src/extensions/Webiny.tsx
@@ -19,6 +19,7 @@ export const Webiny = () => {
+
diff --git a/packages/project-aws/src/extensions/Webiny/PrintAdminUrl.ts b/packages/project-aws/src/extensions/Webiny/PrintAdminUrl.ts
new file mode 100644
index 00000000000..7107d75e42e
--- /dev/null
+++ b/packages/project-aws/src/extensions/Webiny/PrintAdminUrl.ts
@@ -0,0 +1,59 @@
+import { createImplementation } from "@webiny/di-container";
+import {
+ AdminAfterDeploy,
+ GetAppStackOutput,
+ UiService
+} from "@webiny/project/abstractions/index.js";
+import { type IDefaultStackOutput } from "~/pulumi/types.js";
+import chalk from "chalk";
+
+interface IAdminStackOutput extends IDefaultStackOutput {
+ appUrl?: string;
+}
+
+class PrintAdminUrl implements AdminAfterDeploy.Interface {
+ constructor(
+ private ui: UiService.Interface,
+ private getAppStackOutput: GetAppStackOutput.Interface
+ ) {}
+
+ async execute(params: AdminAfterDeploy.Params) {
+ // No need to print URL if we're doing a preview.
+ if (params.preview) {
+ return;
+ }
+
+ const appOutput = await this.getAppStackOutput.execute(params);
+ if (!appOutput) {
+ this.ui.info("Admin app stack output not found.");
+ return;
+ }
+
+ const { green, blue } = chalk;
+
+ // Construct the Admin URL from stack output
+ // Use appUrl if available (includes custom domain support), otherwise construct from appDomain
+ const adminUrl = appOutput.appUrl || (appOutput.appDomain ? `https://${appOutput.appDomain}` : null);
+
+ if (!adminUrl) {
+ this.ui.info("Admin URL not available in stack output.");
+ return;
+ }
+
+ const output = [
+ "",
+ green("Admin Application Deployed"),
+ `‣ Environment: ${blue(params.env)}`,
+ `‣ Admin URL: ${blue(adminUrl)}`,
+ ""
+ ];
+
+ console.log(output.join("\n"));
+ }
+}
+
+export default createImplementation({
+ abstraction: AdminAfterDeploy,
+ implementation: PrintAdminUrl,
+ dependencies: [UiService, GetAppStackOutput]
+});