using System.Windows; using System.Windows.Threading; using Velopack; using ytLive.Helpers; namespace ytLive; /// /// Interaction logic for App.xaml /// public partial class App : Application { public App() { AppLog.Write("App ctor"); } protected override void OnStartup(StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += (_, args) => AppLog.Write(args.ExceptionObject is Exception ex ? "AppDomain unhandled exception: " + ex : "AppDomain unhandled exception object: " + args.ExceptionObject); DispatcherUnhandledException += (_, args) => AppLog.Write(args.Exception, "Dispatcher unhandled exception"); AppLog.Write("App OnStartup begin"); // Attribution (2026-09-04): every take must be traceable to the exact binary // that produced it — the wordmark shows the release counter (BuildStamp.Release); // the per-build GUID is forensic only and lands here. AppLog.Write($"Build {ytLive.Helpers.BuildStamp.Id} (compiled {ytLive.Helpers.BuildStamp.BuiltLocal})"); // Velopack auto-update bootstrap — checks for updates on startup and // applies them (the app restarts automatically if an update is found). // Update URL is configured per-deployment (self-hosted on DO droplet); // when no URL is set, the check is a no-op. try { VelopackApp.Build() .Run(); } catch (Exception ex) { AppLog.Write($"Velopack bootstrap failed (non-fatal): {ex.Message}"); } base.OnStartup(e); AppLog.Write("App OnStartup end"); } }