diff --git a/.vscode/settings.json b/.vscode/settings.json
index c7d969ce20ae4cef7b5bd7eda8783a0b49dc9509..b5b85f28e1b01a6a6f20ad2c913e647d3d8095df 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -66,5 +66,6 @@
         "valarray": "cpp",
         "variant": "cpp",
         "any": "cpp"
-    }
+    },
+    "cmake.cmakePath": "/snap/cmake/current/bin/cmake"
 }
\ No newline at end of file
diff --git a/include/ftl/protocol/self.hpp b/include/ftl/protocol/self.hpp
index 51375d121cf964112941b06bf51f52927ec60e61..d73bbd1f91ddd5be397a1e4da425f5c31c6ed694 100644
--- a/include/ftl/protocol/self.hpp
+++ b/include/ftl/protocol/self.hpp
@@ -282,6 +282,38 @@ class Self {
      */
     void onListConfig(const std::function<std::vector<std::string>()> &cb);
 
+    /**
+     * @brief Get the Send Buffer Size in bytes.
+     * 
+     * @param s protocol
+     * @return size_t
+     */
+    size_t getSendBufferSize(ftl::URI::scheme_t s);
+
+    /**
+     * @brief Get the Recv Buffer Size in bytes
+     * 
+     * @param s protocol
+     * @return size_t 
+     */
+    size_t getRecvBufferSize(ftl::URI::scheme_t s);
+
+    /**
+     * @brief Set the Send Buffer size in bytes
+     * 
+     * @param s protocol
+     * @param size new size
+     */
+    void setSendBufferSize(ftl::URI::scheme_t s, size_t size);
+
+    /**
+     * @brief Set the Recv Buffer size in bytes
+     * 
+     * @param s protocol
+     * @param size new size
+     */
+    void setRecvBufferSize(ftl::URI::scheme_t s, size_t size);
+
  protected:
     std::shared_ptr<ftl::net::Universe> universe_;
 };
diff --git a/src/self.cpp b/src/self.cpp
index 184c784d99240b77cab2625e8968717e3428eaa4..bbf49bcc0fe74b9a381afeccda7591eb731aa76d 100644
--- a/src/self.cpp
+++ b/src/self.cpp
@@ -193,3 +193,19 @@ void Self::onSetConfig(const std::function<void(const std::string &, const nlohm
 void Self::onListConfig(const std::function<std::vector<std::string>()> &cb) {
     universe_->bind("list_configurables", cb);
 }
+
+size_t Self::getSendBufferSize(ftl::URI::scheme_t s) {
+    return universe_->getSendBufferSize(s);
+}
+
+size_t Self::getRecvBufferSize(ftl::URI::scheme_t s) {
+    return universe_->getRecvBufferSize(s);
+}
+
+void Self::setSendBufferSize(ftl::URI::scheme_t s, size_t size) {
+    universe_->setSendBufferSize(s, size);
+}
+
+void Self::setRecvBufferSize(ftl::URI::scheme_t s, size_t size) {
+    universe_->setRecvBufferSize(s, size);
+}
diff --git a/src/universe.cpp b/src/universe.cpp
index 40ac7ebf31e308504e70a45ae7f4225e06fac990..4be8d39c97598135fc4d9a3e044f1ad558eb75be 100644
--- a/src/universe.cpp
+++ b/src/universe.cpp
@@ -9,6 +9,7 @@
 #include <algorithm>
 #include <memory>
 #include <unordered_map>
+#include <optional>
 #include "universe.hpp"
 #include "socketImpl.hpp"
 
@@ -87,6 +88,10 @@ Universe::Universe() :
         phase_(0),
         periodic_time_(1.0),
         reconnect_attempts_(5),
+        tcp_send_buffer_(TCP_SEND_BUFFER_SIZE),
+        tcp_recv_buffer_(TCP_RECEIVE_BUFFER_SIZE),
+        ws_send_buffer_(WS_SEND_BUFFER_SIZE),
+        ws_recv_buffer_(WS_RECEIVE_BUFFER_SIZE),
         thread_(Universe::__start, this) {
     _installBindings();
 }
@@ -102,14 +107,13 @@ void Universe::setMaxConnections(size_t m) {
 }
 
 size_t Universe::getSendBufferSize(ftl::URI::scheme_t s) {
-    // TODO(Nick): Allow these to be configured again.
     switch (s) {
         case ftl::URI::scheme_t::SCHEME_WS:
         case ftl::URI::scheme_t::SCHEME_WSS:
-            return WS_SEND_BUFFER_SIZE;
+            return ws_send_buffer_;
 
         default:
-            return TCP_SEND_BUFFER_SIZE;
+            return tcp_send_buffer_;
     }
 }
 
@@ -117,9 +121,32 @@ size_t Universe::getRecvBufferSize(ftl::URI::scheme_t s) {
     switch (s) {
         case ftl::URI::scheme_t::SCHEME_WS:
         case ftl::URI::scheme_t::SCHEME_WSS:
-            return WS_RECEIVE_BUFFER_SIZE;
+            return ws_recv_buffer_;
         default:
-            return TCP_RECEIVE_BUFFER_SIZE;
+            return tcp_recv_buffer_;
+    }
+}
+
+void Universe::setSendBufferSize(ftl::URI::scheme_t s, size_t size) {
+    switch (s) {
+        case ftl::URI::scheme_t::SCHEME_WS:
+        case ftl::URI::scheme_t::SCHEME_WSS:
+            ws_send_buffer_ = size;
+            break;
+
+        default:
+            tcp_send_buffer_ = size;
+    }
+}
+
+void Universe::setRecvBufferSize(ftl::URI::scheme_t s, size_t size) {
+    switch (s) {
+        case ftl::URI::scheme_t::SCHEME_WS:
+        case ftl::URI::scheme_t::SCHEME_WSS:
+            ws_recv_buffer_ = size;
+            break;
+        default:
+            tcp_recv_buffer_ = size;
     }
 }
 
diff --git a/src/universe.hpp b/src/universe.hpp
index 229dfdd694214a37d1aed31499757138d5cb9160..f5013fedc38d099a842925523440b341361a94cb 100644
--- a/src/universe.hpp
+++ b/src/universe.hpp
@@ -169,6 +169,8 @@ class Universe {
 
     size_t getSendBufferSize(ftl::URI::scheme_t s);
     size_t getRecvBufferSize(ftl::URI::scheme_t s);
+    void setSendBufferSize(ftl::URI::scheme_t s, size_t size);
+    void setRecvBufferSize(ftl::URI::scheme_t s, size_t size);
 
     static inline std::shared_ptr<Universe> getInstance() { return instance_; }
 
@@ -226,6 +228,12 @@ class Universe {
 
     static std::shared_ptr<Universe> instance_;
 
+    // Socket buffer sizes
+    size_t tcp_send_buffer_;
+    size_t tcp_recv_buffer_;
+    size_t ws_send_buffer_;
+    size_t ws_recv_buffer_;
+
     // NOTE: Must always be last member
     std::thread thread_;
 };