diff --git a/loader/include/Geode/cocos/cocoa/CCDataVisitor.h b/loader/include/Geode/cocos/cocoa/CCDataVisitor.h
index 56a20089..bed8cbb1 100644
--- a/loader/include/Geode/cocos/cocoa/CCDataVisitor.h
+++ b/loader/include/Geode/cocos/cocoa/CCDataVisitor.h
@@ -25,6 +25,7 @@
 #ifndef __CCDATAVISITOR_H__
 #define __CCDATAVISITOR_H__
 
+#include "../../DefaultInclude.hpp"
 #include "../platform/CCPlatformMacros.h"
 #include <string>
 
diff --git a/loader/include/Geode/loader/Mod.hpp b/loader/include/Geode/loader/Mod.hpp
index af24f80b..cae6f6d1 100644
--- a/loader/include/Geode/loader/Mod.hpp
+++ b/loader/include/Geode/loader/Mod.hpp
@@ -5,6 +5,8 @@
 #include "../utils/Result.hpp"
 #include "../utils/VersionInfo.hpp"
 #include "../utils/general.hpp"
+
+#include "Loader.hpp" // very nice circular dependency fix
 #include "Hook.hpp"
 #include "ModMetadata.hpp"
 #include "Setting.hpp"
diff --git a/loader/include/Geode/loader/SettingEvent.hpp b/loader/include/Geode/loader/SettingEvent.hpp
index eaac671d..7ad33fe1 100644
--- a/loader/include/Geode/loader/SettingEvent.hpp
+++ b/loader/include/Geode/loader/SettingEvent.hpp
@@ -3,6 +3,7 @@
 #include "Event.hpp"
 #include "Loader.hpp"
 #include "Setting.hpp"
+#include "Mod.hpp"
 
 #include <optional>
 
diff --git a/loader/include/Geode/utils/ColorProvider.hpp b/loader/include/Geode/utils/ColorProvider.hpp
index 85fe732d..1f662177 100644
--- a/loader/include/Geode/utils/ColorProvider.hpp
+++ b/loader/include/Geode/utils/ColorProvider.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include <Geode/loader/Mod.hpp>
+#include <ccTypes.h>
 #include "../DefaultInclude.hpp"
 #include "../loader/Event.hpp"
 
diff --git a/loader/include/Geode/utils/web2.hpp b/loader/include/Geode/utils/web2.hpp
index 9cd47c51..edf8dcac 100644
--- a/loader/include/Geode/utils/web2.hpp
+++ b/loader/include/Geode/utils/web2.hpp
@@ -1,5 +1,6 @@
 #pragma once
 
+#include <Geode/loader/Loader.hpp> // another great circular dependency fix
 #include <matjson.hpp>
 #include "Result.hpp"
 #include "Task.hpp"
diff --git a/loader/src/internal/FixModIssues.cpp b/loader/src/internal/FixModIssues.cpp
index f30cded9..b605e09d 100644
--- a/loader/src/internal/FixModIssues.cpp
+++ b/loader/src/internal/FixModIssues.cpp
@@ -1,5 +1,6 @@
 #include "FixModIssues.hpp"
 #include <Geode/loader/Loader.hpp>
+#include <Geode/ui/Popup.hpp>
 #include <server/DownloadManager.hpp>
 #include <ui/mods/sources/ModSource.hpp>
 #include <vector>
diff --git a/loader/src/loader/updater.hpp b/loader/src/loader/updater.hpp
index 4ec31a8f..a5bee7eb 100644
--- a/loader/src/loader/updater.hpp
+++ b/loader/src/loader/updater.hpp
@@ -1,7 +1,9 @@
 #pragma once
 
 #include <string>
+#include <matjson.hpp>
 #include <Geode/utils/MiniFunction.hpp>
+#include <Geode/loader/Event.hpp>
 
 namespace geode::updater {
     using UpdateFinished = std::monostate;
diff --git a/loader/src/server/DownloadManager.cpp b/loader/src/server/DownloadManager.cpp
index a2c9cf6d..0be3c1c9 100644
--- a/loader/src/server/DownloadManager.cpp
+++ b/loader/src/server/DownloadManager.cpp
@@ -1,5 +1,7 @@
 #include "DownloadManager.hpp"
 #include "Geode/loader/Mod.hpp"
+#include <Geode/loader/Dirs.hpp>
+#include <Geode/utils/map.hpp>
 #include <optional>
 
 using namespace server;
diff --git a/loader/src/ui/mods/GeodeStyle.cpp b/loader/src/ui/mods/GeodeStyle.cpp
index 19b8f7a3..89ef8ea7 100644
--- a/loader/src/ui/mods/GeodeStyle.cpp
+++ b/loader/src/ui/mods/GeodeStyle.cpp
@@ -2,6 +2,7 @@
 #include <Geode/utils/cocos.hpp>
 #include <Geode/utils/ColorProvider.hpp>
 #include <Geode/loader/SettingEvent.hpp>
+#include <Geode/binding/ButtonSprite.hpp>
 
 $execute {
     // todo: these names should probably be shorter so they fit in SSO...
diff --git a/loader/src/ui/mods/GeodeStyle.hpp b/loader/src/ui/mods/GeodeStyle.hpp
index 75b0d069..bdeaf888 100644
--- a/loader/src/ui/mods/GeodeStyle.hpp
+++ b/loader/src/ui/mods/GeodeStyle.hpp
@@ -1,8 +1,11 @@
 #pragma once
 
 #include <Geode/DefaultInclude.hpp>
+#include <Geode/ui/General.hpp>
 #include <Geode/ui/IconButtonSprite.hpp>
 #include <Geode/ui/BasedButtonSprite.hpp>
+#include <Geode/ui/Popup.hpp>
+#include <Geode/loader/Mod.hpp>
 
 using namespace geode::prelude;
 
diff --git a/loader/src/ui/mods/ModsLayer.cpp b/loader/src/ui/mods/ModsLayer.cpp
index 68ee062b..8477c7a4 100644
--- a/loader/src/ui/mods/ModsLayer.cpp
+++ b/loader/src/ui/mods/ModsLayer.cpp
@@ -2,7 +2,12 @@
 #include "SwelvyBG.hpp"
 #include <Geode/ui/TextInput.hpp>
 #include <Geode/utils/ColorProvider.hpp>
+#include <Geode/utils/ranges.hpp>
 #include <Geode/ui/GeodeUI.hpp>
+#include <Geode/binding/Slider.hpp>
+#include <Geode/binding/SetTextPopup.hpp>
+#include <Geode/binding/ButtonSprite.hpp>
+#include <Geode/binding/MenuLayer.hpp>
 #include "popups/ConfirmInstall.hpp"
 #include "GeodeStyle.hpp"
 
diff --git a/loader/src/ui/mods/ModsLayer.hpp b/loader/src/ui/mods/ModsLayer.hpp
index 09cfd771..e803eb0c 100644
--- a/loader/src/ui/mods/ModsLayer.hpp
+++ b/loader/src/ui/mods/ModsLayer.hpp
@@ -3,6 +3,8 @@
 #include <Geode/ui/General.hpp>
 #include <Geode/ui/ScrollLayer.hpp>
 #include <Geode/ui/TextArea.hpp>
+#include <Geode/ui/IconButtonSprite.hpp>
+#include <Geode/binding/SetTextPopupDelegate.hpp>
 #include "list/ModItem.hpp"
 #include "list/ModList.hpp"
 #include "sources/ModListSource.hpp"
diff --git a/loader/src/ui/mods/SwelvyBG.cpp b/loader/src/ui/mods/SwelvyBG.cpp
index 6b737997..ccd44e8b 100644
--- a/loader/src/ui/mods/SwelvyBG.cpp
+++ b/loader/src/ui/mods/SwelvyBG.cpp
@@ -1,4 +1,5 @@
 #include "SwelvyBG.hpp"
+#include <Geode/loader/Mod.hpp>
 #include <random>
 
 bool SwelvyBG::init() {
diff --git a/loader/src/ui/mods/list/ModItem.hpp b/loader/src/ui/mods/list/ModItem.hpp
index 852d8bf8..91d4008a 100644
--- a/loader/src/ui/mods/list/ModItem.hpp
+++ b/loader/src/ui/mods/list/ModItem.hpp
@@ -2,6 +2,10 @@
 
 #include <Geode/ui/General.hpp>
 #include <server/Server.hpp>
+#include <Geode/binding/ButtonSprite.hpp>
+#include <Geode/binding/Slider.hpp>
+#include <Geode/binding/CCMenuItemToggler.hpp>
+#include <Geode/binding/CCMenuItemSpriteExtra.hpp>
 #include <server/DownloadManager.hpp>
 #include "../sources/ModSource.hpp"
 #include "../UpdateModListState.hpp"
diff --git a/loader/src/ui/mods/list/ModList.hpp b/loader/src/ui/mods/list/ModList.hpp
index 71361410..ccfd7cbc 100644
--- a/loader/src/ui/mods/list/ModList.hpp
+++ b/loader/src/ui/mods/list/ModList.hpp
@@ -4,6 +4,8 @@
 #include <Geode/ui/ScrollLayer.hpp>
 #include <Geode/ui/TextArea.hpp>
 #include <Geode/ui/TextInput.hpp>
+#include <Geode/ui/IconButtonSprite.hpp>
+#include <Geode/binding/TextArea.hpp>
 #include "ModItem.hpp"
 #include "../sources/ModListSource.hpp"
 #include <server/DownloadManager.hpp>
diff --git a/loader/src/ui/mods/list/ModProblemItem.cpp b/loader/src/ui/mods/list/ModProblemItem.cpp
index 1f12f511..5ddc69b4 100644
--- a/loader/src/ui/mods/list/ModProblemItem.cpp
+++ b/loader/src/ui/mods/list/ModProblemItem.cpp
@@ -9,6 +9,7 @@
 #include <Geode/DefaultInclude.hpp>
 #include <Geode/loader/Loader.hpp>
 #include <Geode/loader/Log.hpp>
+#include <Geode/loader/Mod.hpp>
 #include <Geode/ui/TextArea.hpp>
 #include <Geode/utils/cocos.hpp>
 #include <Geode/utils/ColorProvider.hpp>
diff --git a/loader/src/ui/mods/list/ModProblemList.cpp b/loader/src/ui/mods/list/ModProblemList.cpp
index 329418ff..18eae642 100644
--- a/loader/src/ui/mods/list/ModProblemList.cpp
+++ b/loader/src/ui/mods/list/ModProblemList.cpp
@@ -4,6 +4,7 @@
 #include <Geode/cocos/base_nodes/Layout.hpp>
 #include <Geode/cocos/cocoa/CCGeometry.h>
 #include <Geode/cocos/platform/CCPlatformMacros.h>
+#include <Geode/utils/cocos.hpp>
 #include <Geode/ui/ScrollLayer.hpp>
 #include <Geode/loader/Loader.hpp>
 #include <Geode/loader/Mod.hpp>
diff --git a/loader/src/ui/mods/popups/ConfirmInstall.cpp b/loader/src/ui/mods/popups/ConfirmInstall.cpp
index fe52c2e7..63b06b15 100644
--- a/loader/src/ui/mods/popups/ConfirmInstall.cpp
+++ b/loader/src/ui/mods/popups/ConfirmInstall.cpp
@@ -1,4 +1,6 @@
 #include "ConfirmInstall.hpp"
+#include <Geode/utils/ranges.hpp>
+#include <Geode/ui/Popup.hpp>
 #include <server/DownloadManager.hpp>
 
 using namespace geode::prelude;
diff --git a/loader/src/ui/mods/popups/ConfirmUninstallPopup.cpp b/loader/src/ui/mods/popups/ConfirmUninstallPopup.cpp
index d4e21ab0..42207999 100644
--- a/loader/src/ui/mods/popups/ConfirmUninstallPopup.cpp
+++ b/loader/src/ui/mods/popups/ConfirmUninstallPopup.cpp
@@ -1,4 +1,6 @@
 #include "ConfirmUninstallPopup.hpp"
+#include <Geode/binding/ButtonSprite.hpp>
+#include <Geode/binding/TextArea.hpp>
 
 bool ConfirmUninstallPopup::setup(Mod* mod) {
     m_mod = mod;
diff --git a/loader/src/ui/mods/popups/DevPopup.cpp b/loader/src/ui/mods/popups/DevPopup.cpp
index b9c5a82b..12e89d62 100644
--- a/loader/src/ui/mods/popups/DevPopup.cpp
+++ b/loader/src/ui/mods/popups/DevPopup.cpp
@@ -1,3 +1,4 @@
+#include <Geode/binding/ButtonSprite.hpp>
 #include "DevPopup.hpp"
 #include "../UpdateModListState.hpp"
 
diff --git a/loader/src/ui/mods/popups/ModPopup.cpp b/loader/src/ui/mods/popups/ModPopup.cpp
index aed7a3b3..b7266f4b 100644
--- a/loader/src/ui/mods/popups/ModPopup.cpp
+++ b/loader/src/ui/mods/popups/ModPopup.cpp
@@ -1,4 +1,5 @@
 #include "ModPopup.hpp"
+#include <Geode/binding/ButtonSprite.hpp>
 #include <Geode/ui/MDTextArea.hpp>
 #include <Geode/utils/web.hpp>
 #include <Geode/ui/GeodeUI.hpp>
diff --git a/loader/src/ui/nodes/TextInput.cpp b/loader/src/ui/nodes/TextInput.cpp
index 39512b70..cf7963ed 100644
--- a/loader/src/ui/nodes/TextInput.cpp
+++ b/loader/src/ui/nodes/TextInput.cpp
@@ -2,6 +2,7 @@
 #include <Geode/binding/TextInputDelegate.hpp>
 #include <Geode/modify/CCTextInputNode.hpp>
 #include <Geode/ui/TextInput.hpp>
+#include <Geode/utils/cocos.hpp>
 
 using namespace geode::prelude;
 
diff --git a/loader/src/utils/ColorProvider.cpp b/loader/src/utils/ColorProvider.cpp
index d458ebbc..4f2a922b 100644
--- a/loader/src/utils/ColorProvider.cpp
+++ b/loader/src/utils/ColorProvider.cpp
@@ -1,4 +1,5 @@
 #include <Geode/utils/ColorProvider.hpp>
+#include <Geode/utils/cocos.hpp>
 
 using namespace geode::prelude;
 
diff --git a/loader/src/utils/file.cpp b/loader/src/utils/file.cpp
index c20a903e..0fa48c21 100644
--- a/loader/src/utils/file.cpp
+++ b/loader/src/utils/file.cpp
@@ -1,3 +1,4 @@
+#include <Geode/loader/Loader.hpp> // a third great circular dependency fix
 #include <Geode/loader/Log.hpp>
 #include <Geode/utils/file.hpp>
 #include <Geode/utils/map.hpp>
@@ -12,7 +13,6 @@
 #include <mz_zip.h>
 #include <internal/FileWatcher.hpp>
 #include <Geode/utils/ranges.hpp>
-#include <Geode/loader/Loader.hpp>
 
 #ifdef GEODE_IS_WINDOWS
 #include <filesystem>
diff --git a/loader/src/utils/thread.cpp b/loader/src/utils/thread.cpp
index ca460818..c18dba77 100644
--- a/loader/src/utils/thread.cpp
+++ b/loader/src/utils/thread.cpp
@@ -2,6 +2,7 @@
 
 using namespace geode::prelude;
 
+#include <Geode/loader/Loader.hpp> // i don't think i have to label these anymore
 #include <Geode/Utils.hpp>
 #include "thread.hpp"