diff --git a/CHANGELOG.md b/CHANGELOG.md
index bfad3570..5f64ba9f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,15 @@
 # Geode Changelog
 
+## v2.0.0-beta.18
+ * Add translations for Japanese in installer (e36cdf3)
+ * Add `geode::openSupportPopup` for opening the Support page for a mod (438252f)
+ * Add `<ca>` to MDTextArea (ca683fa)
+ * Add more `GameObjectType`s (8e4b76f)
+ * Fix struct returns for `CCPoint` not actually working properly
+ * Fix `geode::web::fetchJSON` not being DLL-exported (2c1eb67)
+ * Fix usernames not showing up on profile links in Markdown (3fe102d)
+ * Various other small fixes & improvements
+
 ## v2.0.0-beta.17
  * Add `$override` macro for syntactic sugar (e7a1913)
  * Add support for platform-specific setting default values as well as platform-specific settings (9c8fcf1)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 5c6b7016..d16ce42a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -169,7 +169,21 @@ if (PROJECT_IS_TOP_LEVEL AND NOT GEODE_BUILDING_DOCS)
 	set(TULIP_LINK_SOURCE ON)
 endif()
 set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "" FORCE)
-CPMAddPackage("gh:geode-sdk/TulipHook#2d2ae8cc")
+
+# Allow users to have their own copy of TulipHook that can be overwritten with a CMake option.
+# If the option is not provided, by default just clone TulipHook with CPM and use that
+if (DEFINED ENV{GEODE_TULIPHOOK_REPO_PATH})
+	set(temp $ENV{GEODE_TULIPHOOK_REPO_PATH})
+	# this is so stupid i hate windows paths
+	string(REPLACE "\\" "/" GEODE_TULIPHOOK_REPO_PATH ${temp})
+endif()
+
+if (DEFINED GEODE_TULIPHOOK_REPO_PATH)
+	message(STATUS "Using ${GEODE_TULIPHOOK_REPO_PATH} for TulipHook")
+	add_subdirectory(${GEODE_TULIPHOOK_REPO_PATH} ${GEODE_TULIPHOOK_REPO_PATH}/build)
+else()
+	CPMAddPackage("gh:geode-sdk/TulipHook#9dc223d")
+endif()
 set(CMAKE_WARN_DEPRECATED ON CACHE BOOL "" FORCE)
 
 include(CheckCXXCompilerFlag)