diff --git a/demo/demo/main.cpp b/demo/demo/main.cpp
index d98a6a40d3fe6afeb6853e7a07eb1b64056a2121..ff0734b3ed729c6c267a09f82bb0d07b02bc92cb 100644
--- a/demo/demo/main.cpp
+++ b/demo/demo/main.cpp
@@ -108,7 +108,6 @@ int main(int argc, const char* argv[]) {
 
 	auto* assetFinder = app.service<fggl::assets::CheckinAdapted>();
 	assetFinder->discover("core");
-	assetFinder->discover("viewer");
 
 	// force asset loading
 	{
diff --git a/demo/demo/models/viewer.cpp b/demo/demo/models/viewer.cpp
index 17ec4eefbd275718a9287184ad0bb5097d50e6df..5c1f15aa107e0326ba92a34f18f1712a645bff46 100644
--- a/demo/demo/models/viewer.cpp
+++ b/demo/demo/models/viewer.cpp
@@ -109,6 +109,9 @@ namespace demo {
 	void Viewer::activate() {
 		Game::activate();
 
+		auto* assetFinder =  m_owner.service<fggl::assets::CheckinAdapted>();
+		assetFinder->discover("viewer");
+
 		// setup the assets we can select between
 		// TODO some form of introspection to automatically find declared/discovered assets of a given type
 		m_assets.clear();
diff --git a/include/fggl/assets/packed/adapter.hpp b/include/fggl/assets/packed/adapter.hpp
index 022eee657d93d3b7dd90da3e21d0979c3662f8e8..1c864921efc722cac2e6ff76900772b103073b22 100644
--- a/include/fggl/assets/packed/adapter.hpp
+++ b/include/fggl/assets/packed/adapter.hpp
@@ -96,6 +96,10 @@ namespace fggl::assets {
 			}
 
 			void discover( const char* packName, bool useCache = false, bool updateCache = true) {
+				if ( m_packs.contains(packName) ) {
+					return;
+				}
+
 				std::string packRoot = "packs/";
 				auto packDir = m_storage->resolvePath( data::StorageType::Data, packRoot + packName );
 				discover(packDir, useCache, updateCache);