diff --git a/demo/data/res/.gitignore b/demo/data/res/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2cd840c26bf49f670a80a514d50bda5991eb8f9d
--- /dev/null
+++ b/demo/data/res/.gitignore
@@ -0,0 +1,2 @@
+# non-free (non-CC) assets for testing
+nonfree/
diff --git a/demo/data/res/demo/manifest.yml b/demo/data/res/demo/manifest.yml
new file mode 100644
index 0000000000000000000000000000000000000000..acfdedbeddeca11639912a1d27b1e7cb3e11114c
--- /dev/null
+++ b/demo/data/res/demo/manifest.yml
@@ -0,0 +1,3 @@
+---
+id: "com.fossgalaxy.games.demo"
+name: "Demo Content Pack"
diff --git a/demo/main.cpp b/demo/main.cpp
index cece5848aa81f22adf6ab4e95f41324658e5b3f9..4c73b345916ca4b1fefad552308b26fce82784ae 100644
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -1,6 +1,6 @@
+#include <filesystem>
 #include <iostream>
 
-
 #include <fggl/gfx/window.hpp>
 #include <fggl/gfx/ogl.hpp>
 #include <fggl/gfx/renderer.hpp>
@@ -10,6 +10,30 @@
 #include <fggl/debug/debug.h>
 #include <fggl/data/storage.hpp>
 
+// prototype of resource discovery
+void discover(std::filesystem::path base) {
+
+	std::vector< std::filesystem::path > contentPacks;
+	for ( auto& item : std::filesystem::directory_iterator(base) ) {
+
+		// content pack detection
+		if ( std::filesystem::is_directory( item ) ) {
+			auto manifest = item.path() / "manifest.yml";
+			if ( std::filesystem::exists( manifest ) ) {
+				contentPacks.push_back( item.path() );
+			}
+		}
+		
+	}
+
+	// what did we find?
+	std::cerr << "found pack(s): " << std::endl;
+	for ( auto& pack : contentPacks ) {
+		std::cerr << pack << std::endl;
+	}
+
+}
+
 int main(int argc, char* argv[]) {
 	fggl::gfx::Context ctx;
 
@@ -21,10 +45,14 @@ int main(int argc, char* argv[]) {
 	fggl::gfx::Graphics ogl(win);
 	fggl::gfx::MeshRenderer meshRenderer;
 
+	// debug layer
 	fggl::debug::DebugUI debug(win);
 	debug.visible(false);
 
+	// storage API
 	fggl::data::Storage storage;
+	discover( storage.resolvePath(fggl::data::Data, "res") );
+
 	fggl::gfx::ShaderCache cache(storage);
 
 	fggl::gfx::ShaderConfig config;