diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt
index 4194c2e4..a6c544e5 100644
--- a/loader/CMakeLists.txt
+++ b/loader/CMakeLists.txt
@@ -10,15 +10,14 @@ file(READ resources/about.md LOADER_ABOUT_MD)
 configure_file(src/internal/about.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/src/internal/about.hpp)
 
 # Source files
-file(GLOB CORE_SOURCES
+file(GLOB SOURCES CONFIGURE_DEPENDS 
 	src/cocos2d-ext/*.cpp
 	src/core/*.cpp
 	src/hooks/*.cpp
 	src/ids/*.cpp
 	src/internal/*.cpp
-	src/internal/windows/*.cpp
-	src/internal/mac/*.cpp
-	src/internal/ios/*.cpp
+	src/platform/mac/*.cpp
+	src/platform/ios/*.cpp
 	src/load/*.cpp
 	src/load/windows/*.cpp
 	src/load/mac/*.cpp
@@ -37,6 +36,7 @@ file(GLOB CORE_SOURCES
 	src/ui/internal/settings/*.cpp
 )
 
+# Obj-c sources
 file(GLOB OBJC_SOURCES
 	src/internal/ios/*.mm
 	src/internal/mac/*.mm
@@ -45,17 +45,41 @@ file(GLOB OBJC_SOURCES
 	src/utils/ios/*.mm
 	src/utils/mac/*.mm
 )
+set_source_files_properties(${OBJC_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
+
+# Add platform sources
+if (WIN32)
+
+	file(GLOB WIN_SOURCES CONFIGURE_DEPENDS 
+		src/platform/windows/*.cpp
+	)
+	list(APPEND SOURCES ${WIN_SOURCES})
+
+elseif(APPLE and IOS)
+
+	file(GLOB IOS_SOURCES CONFIGURE_DEPENDS 
+		src/platform/ios/*.cpp
+	)
+	list(APPEND SOURCES ${IOS_SOURCES})
+	list(APPEND SOURCES ${OBJC_SOURCES})
+
+elseif(APPLE)
+
+	file(GLOB MAC_SOURCES CONFIGURE_DEPENDS 
+		src/platform/mac/*.cpp
+	)
+	list(APPEND SOURCES ${MAC_SOURCES})
+	list(APPEND SOURCES ${OBJC_SOURCES})
+
+endif()
 
 # Embed version info in binary
 if (WIN32)
-	configure_file(src/internal/windows/info.rc.in info.rc)
-	set(CORE_SOURCES ${CORE_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/info.rc)
+	configure_file(src/platform/windows/info.rc.in info.rc)
+	set(SOURCES ${SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/info.rc)
 endif()
 
-add_library(${PROJECT_NAME} SHARED
-	${CORE_SOURCES}
-	${OBJC_SOURCES}
-)
+add_library(${PROJECT_NAME} SHARED ${SOURCES})
 
 make_directory("${GEODE_BIN_PATH}/nightly")
 
@@ -114,7 +138,6 @@ add_subdirectory(lilac)
 target_link_libraries(${PROJECT_NAME} z lilac_hook geode-sdk)
 
 # Use precompiled headers for faster builds
-set_source_files_properties(${OBJC_SOURCES} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
 target_precompile_headers(${PROJECT_NAME} PRIVATE
 	"${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/DefaultInclude.hpp"
 	# "${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/Utils.hpp"
diff --git a/loader/src/utils/zip/ioapi.cpp b/loader/src/cocos2d-ext/zip/ioapi.cpp
similarity index 100%
rename from loader/src/utils/zip/ioapi.cpp
rename to loader/src/cocos2d-ext/zip/ioapi.cpp
diff --git a/loader/src/utils/zip/unzip.cpp b/loader/src/cocos2d-ext/zip/unzip.cpp
similarity index 100%
rename from loader/src/utils/zip/unzip.cpp
rename to loader/src/cocos2d-ext/zip/unzip.cpp
diff --git a/loader/src/internal/ios/FileWatcher.mm b/loader/src/platform/ios/FileWatcher.mm
similarity index 100%
rename from loader/src/internal/ios/FileWatcher.mm
rename to loader/src/platform/ios/FileWatcher.mm
diff --git a/loader/src/internal/ios/InternalLoader.cpp b/loader/src/platform/ios/InternalLoader.cpp
similarity index 90%
rename from loader/src/internal/ios/InternalLoader.cpp
rename to loader/src/platform/ios/InternalLoader.cpp
index 64b77573..86dfd252 100644
--- a/loader/src/internal/ios/InternalLoader.cpp
+++ b/loader/src/platform/ios/InternalLoader.cpp
@@ -1,7 +1,7 @@
-#include "../InternalLoader.hpp"
+#include <InternalLoader.hpp>
 #include <Geode/loader/Log.hpp>
 #include <iostream>
-#include "../InternalMod.hpp"
+#include <InternalMod.hpp>
 
 #ifdef GEODE_IS_IOS
 
diff --git a/loader/src/load/ios/Mod.mm b/loader/src/platform/ios/Mod.mm
similarity index 100%
rename from loader/src/load/ios/Mod.mm
rename to loader/src/platform/ios/Mod.mm
diff --git a/loader/src/internal/ios/crashlog.cpp b/loader/src/platform/ios/crashlog.cpp
similarity index 80%
rename from loader/src/internal/ios/crashlog.cpp
rename to loader/src/platform/ios/crashlog.cpp
index 501eba97..ebcea479 100644
--- a/loader/src/internal/ios/crashlog.cpp
+++ b/loader/src/platform/ios/crashlog.cpp
@@ -1,4 +1,4 @@
-#include "../crashlog.hpp"
+#include <crashlog.hpp>
 
 #ifdef GEODE_IS_IOS
 
@@ -14,4 +14,4 @@ std::string crashlog::getCrashLogDirectory() {
     return "";
 }
 
-#endif
\ No newline at end of file
+#endif
diff --git a/loader/src/utils/ios/util.mm b/loader/src/platform/ios/util.mm
similarity index 100%
rename from loader/src/utils/ios/util.mm
rename to loader/src/platform/ios/util.mm
diff --git a/loader/src/cocos2d-ext/MacOS.cpp b/loader/src/platform/mac/Cocos2d.cpp
similarity index 100%
rename from loader/src/cocos2d-ext/MacOS.cpp
rename to loader/src/platform/mac/Cocos2d.cpp
diff --git a/loader/src/internal/mac/FileWatcher.mm b/loader/src/platform/mac/FileWatcher.mm
similarity index 100%
rename from loader/src/internal/mac/FileWatcher.mm
rename to loader/src/platform/mac/FileWatcher.mm
diff --git a/loader/src/internal/mac/InternalLoader.cpp b/loader/src/platform/mac/InternalLoader.cpp
similarity index 91%
rename from loader/src/internal/mac/InternalLoader.cpp
rename to loader/src/platform/mac/InternalLoader.cpp
index cae16b66..3b6cddc0 100644
--- a/loader/src/internal/mac/InternalLoader.cpp
+++ b/loader/src/platform/mac/InternalLoader.cpp
@@ -1,7 +1,7 @@
-#include "../InternalLoader.hpp"
+#include <InternalLoader.hpp>
 #include <Geode/loader/Log.hpp>
 #include <iostream>
-#include "../InternalMod.hpp"
+#include <InternalMod.hpp>
 
 #ifdef GEODE_IS_MACOS
 
diff --git a/loader/src/load/mac/Mod.cpp b/loader/src/platform/mac/Mod.cpp
similarity index 100%
rename from loader/src/load/mac/Mod.cpp
rename to loader/src/platform/mac/Mod.cpp
diff --git a/loader/src/internal/mac/crashlog.mm b/loader/src/platform/mac/crashlog.mm
similarity index 100%
rename from loader/src/internal/mac/crashlog.mm
rename to loader/src/platform/mac/crashlog.mm
diff --git a/loader/src/mac/gdstdlib.cpp b/loader/src/platform/mac/gdstdlib.cpp
similarity index 100%
rename from loader/src/mac/gdstdlib.cpp
rename to loader/src/platform/mac/gdstdlib.cpp
diff --git a/loader/src/utils/mac/util.mm b/loader/src/platform/mac/util.mm
similarity index 100%
rename from loader/src/utils/mac/util.mm
rename to loader/src/platform/mac/util.mm
diff --git a/loader/src/internal/windows/FileWatcher.cpp b/loader/src/platform/windows/FileWatcher.cpp
similarity index 100%
rename from loader/src/internal/windows/FileWatcher.cpp
rename to loader/src/platform/windows/FileWatcher.cpp
diff --git a/loader/src/internal/windows/InternalLoader.cpp b/loader/src/platform/windows/InternalLoader.cpp
similarity index 95%
rename from loader/src/internal/windows/InternalLoader.cpp
rename to loader/src/platform/windows/InternalLoader.cpp
index f4caa188..552a068f 100644
--- a/loader/src/internal/windows/InternalLoader.cpp
+++ b/loader/src/platform/windows/InternalLoader.cpp
@@ -1,8 +1,8 @@
-#include "../InternalLoader.hpp"
+#include <InternalLoader.hpp>
 #include <Geode/loader/Log.hpp>
 #include <Geode/loader/IPC.hpp>
 #include <iostream>
-#include "../InternalMod.hpp"
+#include <InternalMod.hpp>
 
 USE_GEODE_NAMESPACE();
 
diff --git a/loader/src/load/windows/Mod.cpp b/loader/src/platform/windows/Mod.cpp
similarity index 100%
rename from loader/src/load/windows/Mod.cpp
rename to loader/src/platform/windows/Mod.cpp
diff --git a/loader/src/utils/windows/NFD_LICENSE b/loader/src/platform/windows/NFD_LICENSE
similarity index 100%
rename from loader/src/utils/windows/NFD_LICENSE
rename to loader/src/platform/windows/NFD_LICENSE
diff --git a/loader/src/internal/windows/crashlog.cpp b/loader/src/platform/windows/crashlog.cpp
similarity index 94%
rename from loader/src/internal/windows/crashlog.cpp
rename to loader/src/platform/windows/crashlog.cpp
index 599aa257..064d1ea6 100644
--- a/loader/src/internal/windows/crashlog.cpp
+++ b/loader/src/platform/windows/crashlog.cpp
@@ -4,19 +4,19 @@
 
 #ifdef GEODE_IS_WINDOWS
 
-    #include "../crashlog.hpp"
+#include <crashlog.hpp>
 
-    #include <DbgHelp.h>
-    #include <Geode/utils/casts.hpp>
-    #include <Geode/utils/file.hpp>
-    #include <Windows.h>
-    #include <chrono>
-    #include <ctime>
-    #include <errhandlingapi.h>
-    #include <fstream>
-    #include <iomanip>
-    #include <iostream>
-    #include <string>
+#include <DbgHelp.h>
+#include <Geode/utils/casts.hpp>
+#include <Geode/utils/file.hpp>
+#include <Windows.h>
+#include <chrono>
+#include <ctime>
+#include <errhandlingapi.h>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <string>
 
 USE_GEODE_NAMESPACE();
 
diff --git a/loader/src/internal/windows/info.rc.in b/loader/src/platform/windows/info.rc.in
similarity index 100%
rename from loader/src/internal/windows/info.rc.in
rename to loader/src/platform/windows/info.rc.in
diff --git a/loader/src/utils/windows/nfdwin.cpp b/loader/src/platform/windows/nfdwin.cpp
similarity index 100%
rename from loader/src/utils/windows/nfdwin.cpp
rename to loader/src/platform/windows/nfdwin.cpp
diff --git a/loader/src/utils/windows/nfdwin.hpp b/loader/src/platform/windows/nfdwin.hpp
similarity index 100%
rename from loader/src/utils/windows/nfdwin.hpp
rename to loader/src/platform/windows/nfdwin.hpp
diff --git a/loader/src/utils/windows/util.cpp b/loader/src/platform/windows/util.cpp
similarity index 100%
rename from loader/src/utils/windows/util.cpp
rename to loader/src/platform/windows/util.cpp