diff --git a/components/net/cpp/include/ftl/net/peer.hpp b/components/net/cpp/include/ftl/net/peer.hpp
index 6ac41b2f7477fde4014f49a7e05ba06ba5724844..91f3f2f06ebc5991e429ea743bb51ca0e5cc64b0 100644
--- a/components/net/cpp/include/ftl/net/peer.hpp
+++ b/components/net/cpp/include/ftl/net/peer.hpp
@@ -193,6 +193,8 @@ class Peer {
 	bool isWaiting() const { return is_waiting_; }
 
 	void rawClose() { _badClose(false); }
+
+	inline void noReconnect() { can_reconnect_ = false; }
 	
 	public:
 	static const int kMaxMessage = 10*1024*1024;  // 10Mb currently
diff --git a/components/streams/include/ftl/streams/renderer.hpp b/components/streams/include/ftl/streams/renderer.hpp
index bb19a042d79d4f75ea66821cc1cb6ba289666cc3..441e65fe6e2019f147abf563a570ddce10f0419d 100644
--- a/components/streams/include/ftl/streams/renderer.hpp
+++ b/components/streams/include/ftl/streams/renderer.hpp
@@ -28,6 +28,7 @@ class Source : public ftl::Configurable, public ftl::data::DiscreteSource {
 	ftl::data::FrameSetPtr input_;
 	std::unique_ptr<ftl::render::CUDARender> renderer_;
 	ftl::Configurable *intrinsics_;
+	uint32_t my_id_;
 };
 
 }
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index b11a56a67d7ae6c3854c3b960bcd139a861ae8eb..1b080f0e62957e987351392e833b7f781b625a6d 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -358,7 +358,7 @@ void Feed::autoConnect() {
 		auto &known_hosts = getConfig()["known_hosts"];
 
 		for (auto &h : known_hosts.items()) {
-			net_->connect(h.key());
+			net_->connect(h.key())->noReconnect();
 		}
 	});
 }
diff --git a/components/streams/src/renderer.cpp b/components/streams/src/renderer.cpp
index a9f80db5e27f7210be196a4aa6a230c610de284e..48de45b316d5c03fcc7483d30e4e009f968835d1 100644
--- a/components/streams/src/renderer.cpp
+++ b/components/streams/src/renderer.cpp
@@ -10,7 +10,7 @@ using ftl::rgbd::Capability;
 
 
 Source::Source(nlohmann::json &config, ftl::stream::Feed *feed)
-: ftl::Configurable(config), feed_(feed) {
+: ftl::Configurable(config), feed_(feed), my_id_(0) {
 	restore("device:render", {
 		"renderer",
 		"source",
@@ -33,6 +33,14 @@ Source::Source(nlohmann::json &config, ftl::stream::Feed *feed)
 			std::atomic_store(&input_, fs);
 			return true;
 		});
+	} else {
+		filter_ = feed_->filter({Channel::Colour, Channel::Depth});
+
+		filter_->on([this](const ftl::data::FrameSetPtr &fs) {
+			if (fs->frameset() == my_id_) return true;  // Never render self
+			std::atomic_store(&input_, fs);
+			return true;
+		});
 	}
 
 	on("source", [this](const ftl::config::Event &e) {
@@ -62,6 +70,8 @@ bool Source::capture(int64_t ts) {
 bool Source::retrieve(ftl::data::Frame &frame_out) {
 	auto input = std::atomic_load(&input_);
 
+	my_id_ = frame_out.frameset();
+
 	if (input) {
 		ftl::rgbd::Frame &rgbdframe = frame_out.cast<ftl::rgbd::Frame>();