diff --git a/python/extension/CMakeLists.txt b/python/extension/CMakeLists.txt
index 3478e60bbec904b0e10038828416df6190bd783b..4990adaa61869030a1deb9c220e3f4e01774af59 100644
--- a/python/extension/CMakeLists.txt
+++ b/python/extension/CMakeLists.txt
@@ -29,7 +29,11 @@ target_link_libraries(extension PRIVATE robofish::trackviewer::cpp)
 
 install(TARGETS extension OPTIONAL DESTINATION .)
 
-set_target_properties(extension PROPERTIES INSTALL_RPATH "\$ORIGIN;")
+if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
+    set_target_properties(extension PROPERTIES INSTALL_RPATH "\$ORIGIN;")
+elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
+    set_target_properties(extension PROPERTIES INSTALL_RPATH "@loader_path")
+endif()
 
 include(Locate)
 
@@ -60,6 +64,34 @@ elseif("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
         endif()
         get_filename_component(library_path "${library_path}" REALPATH)
         get_filename_component(library_name "${library_path}" NAME)
-        install(FILES "${library_path}" RENAME "${library_name}" DESTINATION .)
+
+        execute_process(
+            COMMAND otool -D "${library_path}"
+            OUTPUT_VARIABLE _output
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+            RESULT_VARIABLE _res
+        )
+        if(NOT "${_res}" STREQUAL "0")
+            message(FATAL_ERROR "Could not get shared library id name for ${library_path}")
+        endif()
+        string(REPLACE "\n" ";" _output_lines "${_output}")
+        list(GET _output_lines 1 library_id)
+
+        add_custom_command(
+            TARGET extension POST_BUILD
+            COMMAND install_name_tool -change "${library_id}" "@loader_path/${library_name}" "$<TARGET_FILE:extension>"
+            VERBATIM
+        )
+
+        file(COPY "${library_path}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}" FILE_PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE)
+        execute_process(
+            COMMAND install_name_tool -id "@loader_path/${library_name}" "${CMAKE_CURRENT_BINARY_DIR}/${library_name}"
+            RESULT_VARIABLE _res
+        )
+        if(NOT "${_res}" STREQUAL "0")
+            message(FATAL_ERROR "Could not patch shared library id name for ${library_path}")
+        endif()
+
+        install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${library_name}" RENAME "${library_name}" DESTINATION .)
     endforeach()
 endif()