diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Alerts/AlarmTransitionEvent.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Alerts/AlarmTransitionEvent.cs
new file mode 100644
index 0000000..53bb6ed
--- /dev/null
+++ b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Alerts/AlarmTransitionEvent.cs
@@ -0,0 +1,25 @@
+namespace ZB.MOM.WW.OtOpcUa.Commons.Messages.Alerts;
+
+///
+/// Live alarm transition published on the cluster alerts DistributedPubSub topic.
+/// Emitted by ScriptedAlarmActor (and future native-alarm bridges) when an alarm condition
+/// transitions; consumed by AlertSignalRBridge for browser fan-out and by historian
+/// adapters for durable storage.
+///
+/// Stable condition identity (matches ScriptedAlarm.ScriptedAlarmId for scripted alarms).
+/// UNS path of the Equipment node the alarm hangs under. Doubles as the SourceNode.
+/// Operator-visible alarm name.
+/// Activated / Cleared / Acknowledged / Confirmed / Shelved / Unshelved / Disabled / Enabled / CommentAdded.
+/// 1–1000 numeric severity (OPC UA convention).
+/// Fully-rendered message text — template tokens already resolved.
+/// Operator who triggered the transition. "system" for engine-driven events.
+/// When the transition occurred.
+public sealed record AlarmTransitionEvent(
+ string AlarmId,
+ string EquipmentPath,
+ string AlarmName,
+ string TransitionKind,
+ int Severity,
+ string Message,
+ string User,
+ DateTime TimestampUtc);
diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Logging/ScriptLogEntry.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Logging/ScriptLogEntry.cs
new file mode 100644
index 0000000..fe43f37
--- /dev/null
+++ b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/Messages/Logging/ScriptLogEntry.cs
@@ -0,0 +1,23 @@
+namespace ZB.MOM.WW.OtOpcUa.Commons.Messages.Logging;
+
+///
+/// One line of script log output published on the cluster script-logs DPS topic.
+/// Emitted by VirtualTagActor + ScriptedAlarmActor when their hosted scripts call into
+/// the runtime's logging facade; consumed by ScriptLogSignalRBridge for live
+/// browser tail-style viewing.
+///
+/// The Script row this entry came from (matches Script.ScriptId).
+/// "Trace" / "Debug" / "Information" / "Warning" / "Error" / "Critical" — Serilog levels.
+/// Operator-facing log message; template tokens already resolved.
+/// When the script emitted the entry.
+/// VirtualTag context, if logged from a virtual tag evaluation. Null otherwise.
+/// ScriptedAlarm context, if logged from an alarm predicate. Null otherwise.
+/// Equipment scope, if the script ran in a per-equipment context. Null for fleet-wide scripts.
+public sealed record ScriptLogEntry(
+ string ScriptId,
+ string Level,
+ string Message,
+ DateTime TimestampUtc,
+ string? VirtualTagId,
+ string? AlarmId,
+ string? EquipmentId);
diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Layout/MainLayout.razor b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Layout/MainLayout.razor
index 10f394d..e5a89e5 100644
--- a/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Layout/MainLayout.razor
+++ b/src/Server/ZB.MOM.WW.OtOpcUa.AdminUI/Components/Layout/MainLayout.razor
@@ -46,8 +46,14 @@
Scripting
Virtual tags
Scripted alarms
+ Scripts
Script log
+ Live
+ Deployments
+ Alerts
+ Alarms historian
+