diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
new file mode 100644
index 00000000..76e3a2cf
--- /dev/null
+++ b/example/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.28.0)
+
+project(dwarfs-example)
+
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_SCAN_FOR_MODULES OFF)
+
+find_package(dwarfs REQUIRED CONFIG)
+
+add_executable(example example.cpp)
+target_link_libraries(example dwarfs::dwarfs_reader dwarfs::dwarfs_extractor)
diff --git a/example/example.cpp b/example/example.cpp
new file mode 100644
index 00000000..9173107c
--- /dev/null
+++ b/example/example.cpp
@@ -0,0 +1,60 @@
+/* vim:set ts=2 sw=2 sts=2 et: */
+/**
+ * \author Marcus Holland-Moritz (github@mhxnet.de)
+ * \copyright Copyright (c) Marcus Holland-Moritz
+ *
+ * This file is part of dwarfs.
+ *
+ * dwarfs is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * dwarfs is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with dwarfs. If not, see .
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+int main(int argc, char** argv) {
+ using namespace dwarfs;
+
+ if (argc < 3) {
+ std::cerr << "Usage: " << argv[0] << " info|extract \n";
+ return 1;
+ }
+
+ try {
+ os_access_generic os;
+ stream_logger lgr(std::cerr);
+
+ reader::filesystem_v2 fs(lgr, os, argv[2]);
+
+ if (std::string_view(argv[1]) == "info") {
+ fs.dump(std::cout, {.features = fsinfo_features::for_level(2)});
+ } else if (std::string_view(argv[1]) == "extract") {
+ utility::filesystem_extractor ex(lgr, os);
+ ex.open_disk(std::filesystem::current_path());
+ ex.extract(fs);
+ } else {
+ std::cerr << "Unknown command: " << argv[1] << "\n";
+ return 1;
+ }
+ } catch (std::exception const& e) {
+ std::cerr << "Error: " << e.what() << "\n";
+ return 1;
+ }
+
+ return 0;
+}