diff --git a/src/VivyApplication.cc b/src/VivyApplication.cc
index 852503f25dcf9f7133c72f066efc10e946f9b340..f4bf46f0aed2598552e5615cb45186fddcaf2d7f 100644
--- a/src/VivyApplication.cc
+++ b/src/VivyApplication.cc
@@ -57,8 +57,8 @@ VivyApplication::exec() noexcept
     setCursorFlashTime(0);
 
     // Show the main window
-    MainWindow mainWindow;
-    mainWindow.show();
+    mainWindowPtr = std::make_unique<MainWindow>();
+    mainWindowPtr->show();
 
     // Main loop
     return QApplication::exec();
@@ -83,3 +83,11 @@ VivyApplication::getApplicationFont(Font id) const noexcept
     // Let the program crash
     qFatal("UNREACHABLE");
 }
+
+MainWindow *
+VivyApplication::getMainWindow() const
+{
+    if (!mainWindowPtr)
+        throw std::logic_error("No main window in the graphic VivyApplication");
+    return mainWindowPtr.get();
+}
diff --git a/src/VivyApplication.hh b/src/VivyApplication.hh
index 184a4fb36758c176a9313d0ae86be12f2749f0d8..06e04780be68fcb541ba5dc6d3c0af559806d9fa 100644
--- a/src/VivyApplication.hh
+++ b/src/VivyApplication.hh
@@ -33,6 +33,9 @@
 
 namespace Vivy
 {
+class MainWindow;
+
+// Vivy application class
 class VivyApplication : public QApplication {
     Q_OBJECT
 
@@ -59,12 +62,15 @@ private:
     int fontIdBold;
     int fontIdBoldItalic;
 
+    std::unique_ptr<MainWindow> mainWindowPtr{ nullptr };
+
 public:
     VivyApplication(int &argc, char **argv);
 
     int exec() noexcept;
 
     QFont getApplicationFont(Font) const noexcept;
+    [[nodiscard("handle-it")]] MainWindow *getMainWindow() const;
     void setTheme(Theme) noexcept;
 };