diff --git a/.gitmodules b/.gitmodules
index e6e29cddda..b62f9696f8 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -87,3 +87,6 @@
[submodule "Externals/SFML/SFML"]
path = Externals/SFML/SFML
url = https://github.com/SFML/SFML.git
+[submodule "Externals/watcher/watcher"]
+ path = Externals/watcher/watcher
+ url = https://github.com/e-dant/watcher
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f2fcabd64f..27ee501b40 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -768,6 +768,8 @@ if (USE_RETRO_ACHIEVEMENTS)
add_subdirectory(Externals/rcheevos)
endif()
+add_subdirectory(Externals/watcher)
+
########################################
# Pre-build events: Define configuration variables and write SCM info header
#
diff --git a/Externals/watcher/CMakeLists.txt b/Externals/watcher/CMakeLists.txt
new file mode 100644
index 0000000000..097f16d647
--- /dev/null
+++ b/Externals/watcher/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_library(watcher INTERFACE IMPORTED GLOBAL)
+set_target_properties(watcher PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR}/watcher/include
+)
diff --git a/Externals/watcher/watcher b/Externals/watcher/watcher
new file mode 160000
index 0000000000..0d6b9b409c
--- /dev/null
+++ b/Externals/watcher/watcher
@@ -0,0 +1 @@
+Subproject commit 0d6b9b409ccaed6313437ea3dc8b2fc078f3d25b
diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt
index db6a88fa4b..8f602f9e59 100644
--- a/Source/Core/VideoCommon/CMakeLists.txt
+++ b/Source/Core/VideoCommon/CMakeLists.txt
@@ -302,6 +302,7 @@ PRIVATE
implot
glslang
tinygltf
+ watcher
)
if(_M_X86_64)
diff --git a/Source/VSProps/Base.Dolphin.props b/Source/VSProps/Base.Dolphin.props
index eb1d50a141..48fae8b9fc 100644
--- a/Source/VSProps/Base.Dolphin.props
+++ b/Source/VSProps/Base.Dolphin.props
@@ -16,6 +16,7 @@
$(ExternalsDir)rangeset\include;%(AdditionalIncludeDirectories)
$(ExternalsDir)Vulkan-Headers\include;%(AdditionalIncludeDirectories)
$(ExternalsDir)VulkanMemoryAllocator\include;%(AdditionalIncludeDirectories)
+ $(ExternalsDir)watcher\watcher\include;%(AdditionalIncludeDirectories)
$(ExternalsDir)WIL\include;%(AdditionalIncludeDirectories)
WIL_SUPPRESS_EXCEPTIONS;%(PreprocessorDefinitions)