diff --git a/fggl/app.cpp b/fggl/app.cpp
index ee3c294474b9ebe0abd489bee5a752439ad0ced0..8f3e3d65a17f8ac02c3a28d4dc287a98d1e6f1a6 100644
--- a/fggl/app.cpp
+++ b/fggl/app.cpp
@@ -49,6 +49,8 @@ namespace fggl {
 
                 m_window->frameEnd();
                 m_modules->onFrameEnd();
+
+				m_running = m_running && !m_window->wantClose();
             }
         }
 
diff --git a/fggl/gfx/window.cpp b/fggl/gfx/window.cpp
index c5097c346a8c79bd3561cc6d5b083dcd45cf462b..a3cd4113041ba35d7f82981a29f33b91375a65ec 100644
--- a/fggl/gfx/window.cpp
+++ b/fggl/gfx/window.cpp
@@ -250,9 +250,16 @@ void GlfwWindow::activate() const {
 	assert( m_window != nullptr );
 	glfwMakeContextCurrent(m_window);
 }
+
 fggl::math::vec2i GlfwWindow::frameSize() const {
   assert( m_window != nullptr );
   math::vec2i size;
   glfwGetFramebufferSize(m_window, &size.x, &size.y);
   return size;
 }
+
+bool GlfwWindow::wantClose() const {
+	assert( m_window != nullptr );
+	return glfwWindowShouldClose(m_window) == GLFW_TRUE;
+}
+
diff --git a/include/fggl/gfx/window.hpp b/include/fggl/gfx/window.hpp
index 73c84080e314ca089665de9889d60ad6ca3494ae..3b24e29f88f45a0f45b2c0841dd79f5cf114ee90 100644
--- a/include/fggl/gfx/window.hpp
+++ b/include/fggl/gfx/window.hpp
@@ -49,7 +49,11 @@ namespace fggl::gfx {
 			GlfwWindow(Window &) = delete;
 			GlfwWindow(Window &&) = delete;
 
-			virtual math::vec2i frameSize() const override;
+			[[nodiscard]]
+			math::vec2i frameSize() const override;
+
+			[[nodiscard]]
+			bool wantClose() const override;
 
 			// window <-> opengl stuff
 			void activate() const override;
diff --git a/include/fggl/gfx/windowing.hpp b/include/fggl/gfx/windowing.hpp
index 640555363c5e7baed1bc3e872dc85e10765f17e2..33e9f07ce9ae127c1550922798cfa93b1d53db5c 100644
--- a/include/fggl/gfx/windowing.hpp
+++ b/include/fggl/gfx/windowing.hpp
@@ -26,10 +26,14 @@ namespace fggl::gfx {
 				m_graphics = std::make_unique<T>(*this);
 			}
 
-			// window-related
+			// window-related getters
 			[[nodiscard]]
 			virtual math::vec2i frameSize() const = 0;
 
+			[[nodiscard]]
+			virtual bool wantClose() const = 0;
+
+			// window callbacks
 			virtual void frameStart() = 0;
 			virtual void frameEnd() = 0;