diff --git a/DOCS.md b/DOCS.md
index 6445afee5ab0f9f22a53b9d53c7083367bf2a57b..def688fa4c011b9fe234b7bfc1cfd2fccd657d90 100644
--- a/DOCS.md
+++ b/DOCS.md
@@ -111,7 +111,7 @@ frame.add_run([&]() {
     input.handle_events();
 
     if (window.close_request())
-        frame.shut_down();
+        return frame.shut_down();
 
     return run_continue;
 });
@@ -472,9 +472,7 @@ make
 
 You can use **liblava** as a *git submodule* in your project ➜ Like in the [starter template](https://git.io/liblava-template) and [demo](https://git.io/liblava-demo)
 
-<br />
-
-### Conan Package Manager
+#### Conan Package Manager
 
 If you are familiar with [Conan](https://conan.io/) then you can build our [package recipe](https://github.com/liblava/conan-liblava)
 
diff --git a/liblava/app/app.cpp b/liblava/app/app.cpp
index 04ceb02028a7c0346db2681f5f6b34e70939addd..9ccfce5e4dc3a7b724ce74f53fb86eb637d911f2 100644
--- a/liblava/app/app.cpp
+++ b/liblava/app/app.cpp
@@ -10,6 +10,97 @@
 
 namespace lava {
 
+    constexpr name _window_file_ = "window.json";
+
+    bool window_file() {
+        return file_system::exists(_window_file_);
+    }
+
+    void to_json(json& j, window::state const& w) {
+        j = json{ { _x_, w.x }, { _y_, w.y }, { _width_, w.width }, { _height_, w.height }, { _fullscreen_, w.fullscreen }, { _floating_, w.floating }, { _resizable_, w.resizable }, { _decorated_, w.decorated }, { _maximized_, w.maximized }, { _monitor_, w.monitor } };
+    }
+
+    void from_json(json const& j, window::state& w) {
+        if (j.count(_x_))
+            w.x = j.at(_x_).get<int>();
+        if (j.count(_y_))
+            w.y = j.at(_y_).get<int>();
+        if (j.count(_width_))
+            w.width = j.at(_width_).get<int>();
+        if (j.count(_height_))
+            w.height = j.at(_height_).get<int>();
+        if (j.count(_fullscreen_))
+            w.fullscreen = j.at(_fullscreen_).get<bool>();
+        if (j.count(_floating_))
+            w.floating = j.at(_floating_).get<bool>();
+        if (j.count(_resizable_))
+            w.resizable = j.at(_resizable_).get<bool>();
+        if (j.count(_decorated_))
+            w.decorated = j.at(_decorated_).get<bool>();
+        if (j.count(_maximized_))
+            w.maximized = j.at(_maximized_).get<bool>();
+        if (j.count(_monitor_))
+            w.monitor = j.at(_monitor_).get<int>();
+    }
+
+    bool load_window_file(window::state& state, name save_name) {
+        scope_data data;
+        if (!load_file_data(_window_file_, data))
+            return false;
+
+        auto j = json::parse(data.ptr, data.ptr + data.size);
+
+        if (!j.count(save_name))
+            return false;
+
+        log()->trace("load window {}", str(j.dump()));
+
+        state = j[save_name];
+        return true;
+    }
+
+    window::state::optional load_window_state(name save_name) {
+        if (!window_file())
+            return {};
+
+        window::state window_state;
+        if (!load_window_file(window_state, save_name))
+            return {};
+
+        return window_state;
+    }
+
+    void save_window_file(window::ref window) {
+        auto state = window.get_state();
+        auto index = window.get_save_name();
+
+        json j;
+
+        scope_data data;
+        if (load_file_data(_window_file_, data)) {
+            j = json::parse(data.ptr, data.ptr + data.size);
+
+            json d;
+            d[index] = state;
+
+            j.merge_patch(d);
+        } else {
+            j[index] = state;
+        }
+
+        file file(str(_window_file_), true);
+        if (!file.opened()) {
+            log()->error("save window {}", str(j.dump()));
+            return;
+        }
+
+        auto jString = j.dump(4);
+
+        file.write(jString.data(), jString.size());
+
+        log()->trace("save window {}", str(j.dump()));
+    }
+
     app::app(frame_config config)
     : frame(config), window(config.app) {}
 
@@ -77,7 +168,7 @@ namespace lava {
             auto current_frame = block.get_current_frame();
 
             {
-                scoped_label stage_label(cmd_buf, _lava_texture_stage_, { 0.f, 0.13f, 0.4f, 1.f });
+                scoped_label stage_label(cmd_buf, _lava_texture_staging_, { 0.f, 0.13f, 0.4f, 1.f });
                 staging.stage(cmd_buf, current_frame);
             }
 
@@ -369,7 +460,7 @@ namespace lava {
     void app::render() {
         add_run([&]() {
             if (window.iconified()) {
-                sleep(ms(1));
+                sleep(one_ms);
                 return true;
             }
 
@@ -412,93 +503,4 @@ namespace lava {
             window.set_icon(icon.data, icon.size);
     }
 
-    void to_json(json& j, window::state const& w) {
-        j = json{ { _x_, w.x }, { _y_, w.y }, { _width_, w.width }, { _height_, w.height }, { _fullscreen_, w.fullscreen }, { _floating_, w.floating }, { _resizable_, w.resizable }, { _decorated_, w.decorated }, { _maximized_, w.maximized }, { _monitor_, w.monitor } };
-    }
-
-    void from_json(json const& j, window::state& w) {
-        if (j.count(_x_))
-            w.x = j.at(_x_).get<int>();
-        if (j.count(_y_))
-            w.y = j.at(_y_).get<int>();
-        if (j.count(_width_))
-            w.width = j.at(_width_).get<int>();
-        if (j.count(_height_))
-            w.height = j.at(_height_).get<int>();
-        if (j.count(_fullscreen_))
-            w.fullscreen = j.at(_fullscreen_).get<bool>();
-        if (j.count(_floating_))
-            w.floating = j.at(_floating_).get<bool>();
-        if (j.count(_resizable_))
-            w.resizable = j.at(_resizable_).get<bool>();
-        if (j.count(_decorated_))
-            w.decorated = j.at(_decorated_).get<bool>();
-        if (j.count(_maximized_))
-            w.maximized = j.at(_maximized_).get<bool>();
-        if (j.count(_monitor_))
-            w.monitor = j.at(_monitor_).get<int>();
-    }
-
 } // namespace lava
-
-bool lava::window_file() {
-    return file_system::exists(_window_file_);
-}
-
-lava::window::state::optional lava::load_window_state(name save_name) {
-    if (!window_file())
-        return {};
-
-    window::state window_state;
-    if (!load_window_file(window_state, save_name))
-        return {};
-
-    return window_state;
-}
-
-bool lava::load_window_file(window::state& state, name save_name) {
-    scope_data data;
-    if (!load_file_data(_window_file_, data))
-        return false;
-
-    auto j = json::parse(data.ptr, data.ptr + data.size);
-
-    if (!j.count(save_name))
-        return false;
-
-    log()->trace("load window {}", str(j.dump()));
-
-    state = j[save_name];
-    return true;
-}
-
-void lava::save_window_file(window::ref window) {
-    window::state state = window.get_state();
-    auto index = window.get_save_name();
-
-    json j;
-
-    scope_data data;
-    if (load_file_data(_window_file_, data)) {
-        j = json::parse(data.ptr, data.ptr + data.size);
-
-        json d;
-        d[index] = state;
-
-        j.merge_patch(d);
-    } else {
-        j[index] = state;
-    }
-
-    file file(str(_window_file_), true);
-    if (!file.opened()) {
-        log()->error("save window {}", str(j.dump()));
-        return;
-    }
-
-    auto jString = j.dump(4);
-
-    file.write(jString.data(), jString.size());
-
-    log()->trace("save window {}", str(j.dump()));
-}
diff --git a/liblava/app/app.hpp b/liblava/app/app.hpp
index d47b3c55a9650392cc885c42901206419829c475..0c7e5607b3e3e95e56ddd0255ed51733d027f47e 100644
--- a/liblava/app/app.hpp
+++ b/liblava/app/app.hpp
@@ -67,6 +67,12 @@ namespace lava {
         }
 
         void draw_about(bool separator = true) const;
+        void draw_about_with_separator() const {
+            draw_about();
+        }
+        void draw_about_without_separator() const {
+            draw_about(false);
+        }
 
         config config;
         json_file config_file;
@@ -105,12 +111,4 @@ namespace lava {
         id block_command;
     };
 
-    bool window_file();
-
-    window::state::optional load_window_state(name save_name = _default_);
-
-    bool load_window_file(window::state& state, name save_name);
-
-    void save_window_file(window::ref window);
-
 } // namespace lava
diff --git a/liblava/app/camera.cpp b/liblava/app/camera.cpp
index b03d928d14c4dfa6c1b963eac3c8552ced25653b..c22297e26ece9b4358b1d2e973399b801f555a0f 100644
--- a/liblava/app/camera.cpp
+++ b/liblava/app/camera.cpp
@@ -99,8 +99,8 @@ namespace lava {
     }
 
     void camera::update_view(delta dt, gamepad::ref pad) {
-        const r32 dead_zone = 0.2f;
-        const r32 range = 1.f - dead_zone;
+        const auto dead_zone = 0.2f;
+        const auto range = 1.f - dead_zone;
 
         if (type == camera_type::first_person) {
             v3 front;
@@ -179,10 +179,10 @@ namespace lava {
             break;
         }
         default:
-            return false;
+            return input_ignore;
         }
 
-        return true;
+        return input_done;
     }
 
     bool camera::handle(mouse_button_event::ref event, mouse_position mouse_pos) {
@@ -193,16 +193,16 @@ namespace lava {
             mouse_pos_x = mouse_pos.x;
             mouse_pos_y = mouse_pos.y;
 
-            return true;
+            return input_done;
         }
 
-        return false;
+        return input_ignore;
     }
 
     bool camera::handle(scroll_event::ref event) {
         scroll_pos += event.offset.y;
 
-        return true;
+        return input_done;
     }
 
     void camera::stop() {
diff --git a/liblava/app/def.hpp b/liblava/app/def.hpp
index 35afb30d78b88988c90b8758e8bb4b09962095cf..63bbd2ca34d26905bab662a3a89483fa9699aa4b 100644
--- a/liblava/app/def.hpp
+++ b/liblava/app/def.hpp
@@ -23,6 +23,6 @@ namespace lava {
     // debug utils
     constexpr name _lava_block_ = "lava block";
     constexpr name _lava_gui_ = "lava gui";
-    constexpr name _lava_texture_stage_ = "lava texture stage";
+    constexpr name _lava_texture_staging_ = "lava texture staging";
 
 } // namespace lava
diff --git a/liblava/app/gui.cpp b/liblava/app/gui.cpp
index a61b9a9d89e6a995a05935152b6406b8770cf913..9462025f8855eb63a82e2ba9175456ae2ac46062 100644
--- a/liblava/app/gui.cpp
+++ b/liblava/app/gui.cpp
@@ -62,7 +62,7 @@ namespace lava {
             mouse_just_pressed[i] = false;
         }
 
-        ImVec2 const mouse_pos_backup = io.MousePos;
+        auto const mouse_pos_backup = io.MousePos;
         io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
 
         if (glfwGetWindowAttrib(window, GLFW_FOCUSED)) {
@@ -81,7 +81,7 @@ namespace lava {
         if ((io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) || glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED)
             return;
 
-        ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor();
+        auto const imgui_cursor = ImGui::GetMouseCursor();
         if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor) {
             glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
         } else {
@@ -240,8 +240,8 @@ namespace lava {
         memset(io.NavInputs, 0, sizeof(io.NavInputs));
         if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) {
             int axes_count = 0, buttons_count = 0;
-            float const* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
-            unsigned char const* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
+            auto const* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count);
+            auto const* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count);
 
             MAP_BUTTON(ImGuiNavInput_Activate, 0); // Cross / A
             MAP_BUTTON(ImGuiNavInput_Cancel, 1); // Circle / B
diff --git a/liblava/asset/texture_loader.cpp b/liblava/asset/texture_loader.cpp
index c6bf757fed3d1d7419ea4c3fd7f62782929a7221..61114e19a14d1f65744e8c9ea1941b081cf2b018 100644
--- a/liblava/asset/texture_loader.cpp
+++ b/liblava/asset/texture_loader.cpp
@@ -154,7 +154,7 @@ namespace lava {
         if (!texture->create(device, size, VK_FORMAT_R8G8B8A8_UNORM))
             return nullptr;
 
-        const i32 tex_channels = 4;
+        auto const tex_channels = 4;
         auto uploadSize = tex_width * tex_height * tex_channels * sizeof(char);
         auto result = texture->upload(data, uploadSize);
 
diff --git a/liblava/base/device.cpp b/liblava/base/device.cpp
index ce40bdcc934b108e692018f4750c336105f8b559..17e004d72e9774baa86296b721a186adf57aeb40 100644
--- a/liblava/base/device.cpp
+++ b/liblava/base/device.cpp
@@ -18,7 +18,7 @@ namespace lava {
         for (size_t i = 0, e = param.queue_info_list.size(); i != e; ++i) {
             queue_create_info_list[i].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
 
-            ui32 index = 0;
+            auto index = 0u;
             if (!physical_device->get_queue_family(index, param.queue_info_list[i].flags)) {
                 log()->error("create device queue family");
                 return false;
diff --git a/liblava/base/instance.cpp b/liblava/base/instance.cpp
index b35de413aefcdc3030bd9d9e9be2e980b43768bd..ff6904b9aa667c5dc65594e9a3a30478cd99ebf3 100644
--- a/liblava/base/instance.cpp
+++ b/liblava/base/instance.cpp
@@ -105,9 +105,9 @@ namespace lava {
 
     void instance::destroy() {
         if (!vk_instance)
-            return
+            return;
 
-                physical_devices.clear();
+        physical_devices.clear();
 
         if (debug.utils)
             destroy_validation_report();
diff --git a/liblava/block/subpass.hpp b/liblava/block/subpass.hpp
index 4092140ac279dd97c3dd45cc87440bd7db0c2741..84e9f755a1d16eb01a9138828139784ba51b27ea 100644
--- a/liblava/block/subpass.hpp
+++ b/liblava/block/subpass.hpp
@@ -29,7 +29,6 @@ namespace lava {
         void clear_pipelines();
 
         void process(VkCommandBuffer cmd_buf, uv2 size);
-        ;
 
         VkSubpassDescription get_description() const {
             return description;
diff --git a/liblava/core/data.hpp b/liblava/core/data.hpp
index ae53d64104bb9047d0460d63fc192d745f1477a8..62c21eaa42024c0e113ab64026c07f0dd82dfe4a 100644
--- a/liblava/core/data.hpp
+++ b/liblava/core/data.hpp
@@ -136,11 +136,11 @@ namespace lava {
 #endif
 
     inline char* human_readable(size_t const sz) {
-        static ui32 const buffer_size = 32;
+        static auto const buffer_size = 32;
 
         char const prefixes[] = "KMGTPEZY";
         char buf[buffer_size];
-        i32 which = -1;
+        auto which = -1;
 
         auto result = to_r64(sz);
         while (result > 1024 && which < 7) {
diff --git a/liblava/core/time.hpp b/liblava/core/time.hpp
index 080d89663e079fd7a5700a5fdcbd87c85a7e17f8..61f45941a9979569b2177acfe216a20875498b77 100644
--- a/liblava/core/time.hpp
+++ b/liblava/core/time.hpp
@@ -16,6 +16,7 @@ namespace lava {
     using ms = milliseconds;
 
     constexpr seconds const one_second = seconds(1);
+    constexpr ms const one_ms = ms(1);
 
     using clock = std::chrono::high_resolution_clock;
     using time_point = clock::time_point;
@@ -71,8 +72,8 @@ namespace lava {
     inline string time_stamp(const typename CLOCK_TYPE::time_point& time_point, string_ref format = "%Y-%m-%d %H-%M-%S") {
         auto ms = std::chrono::duration_cast<milliseconds>(time_point.time_since_epoch()) % 1000;
 
-        const std::time_t t = CLOCK_TYPE::to_time_t(time_point);
-        const std::tm tm = *std::localtime(std::addressof(t));
+        auto const t = CLOCK_TYPE::to_time_t(time_point);
+        auto const tm = *std::localtime(std::addressof(t));
 
         std::ostringstream stm;
         stm << std::put_time(std::addressof(tm), str(format)) << '.' << std::setfill('0') << std::setw(3) << ms.count();
diff --git a/liblava/core/types.hpp b/liblava/core/types.hpp
index e5e3e174ace7e320ed46528b3fa75f57d151c910..2787ac68a7836a060ae5690af5ca71c7e0c73f67 100644
--- a/liblava/core/types.hpp
+++ b/liblava/core/types.hpp
@@ -87,7 +87,9 @@ namespace lava {
 
     constexpr name _lava_ = "lava";
     constexpr name _liblava_ = "liblava";
+
     constexpr name _zip_ = "zip";
+    constexpr name _default_ = "default";
 
     inline name str(string_ref value) {
         return value.c_str();
diff --git a/liblava/frame/frame.cpp b/liblava/frame/frame.cpp
index d893ed17ba22e55135147b12e18c13fb217c3ec0..3ab4dcaabb6c37968bc2bc71b3e256cfd3a9b809 100644
--- a/liblava/frame/frame.cpp
+++ b/liblava/frame/frame.cpp
@@ -20,8 +20,8 @@ void hide_console(lava::name program) {
     auto version_str = fmt::format("{} {}", lava::_liblava_, lava::str(lava::to_string(lava::_version)));
     std::cout << version_str.c_str() << std::endl;
 
-    const auto dot_count = 5;
-    const auto sleep_ms = lava::to_i32(1.0 / dot_count * 1000.f);
+    auto const dot_count = 5;
+    auto const sleep_ms = lava::to_i32(1.0 / dot_count * 1000.f);
 
     for (auto i = 0u; i < dot_count; ++i) {
         lava::sleep(lava::ms(sleep_ms));
diff --git a/liblava/frame/window.hpp b/liblava/frame/window.hpp
index 2cb703a2be156a49aadea2de14db10b7b686e7a7..d9d02c29810c259edc1ebc1fdfdd77fca67b07ca 100644
--- a/liblava/frame/window.hpp
+++ b/liblava/frame/window.hpp
@@ -17,9 +17,6 @@ struct GLFWwindow;
 
 namespace lava {
 
-    constexpr name _default_ = "default";
-
-    constexpr name _window_file_ = "window.json";
     constexpr name _x_ = "x";
     constexpr name _y_ = "y";
     constexpr name _width_ = "width";
diff --git a/tests/tests.cpp b/tests/tests.cpp
index fc69bc4982bffa544a110af3ff64f84d76a82b8e..52a43dd26ae5f9a30eda3f08d2310a2cc2269b90 100644
--- a/tests/tests.cpp
+++ b/tests/tests.cpp
@@ -57,7 +57,7 @@ LAVA_TEST(3, "window input") {
         input.handle_events();
 
         if (window.close_request())
-            frame.shut_down();
+            return frame.shut_down();
 
         return run_continue;
     });
@@ -384,7 +384,7 @@ LAVA_TEST(7, "gamepad") {
         sleep(one_second);
 
         if (frame.get_running_time_sec() > 10.)
-            frame.shut_down();
+            return frame.shut_down();
 
         return run_continue;
     });