diff --git a/.gitignore b/.gitignore
index 701de43..4b8779f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,4 @@ dist*
docs/_build/
docs/source/autoapi/
docs/source/modules/autogen/
+scripts/settings_page.html
diff --git a/scripts/generate_settings_page.py b/scripts/generate_settings_page.py
new file mode 100644
index 0000000..2b74cf9
--- /dev/null
+++ b/scripts/generate_settings_page.py
@@ -0,0 +1,83 @@
+import os
+from auto_archiver.core.module import ModuleFactory
+from auto_archiver.core.consts import MODULE_TYPES
+import jinja2
+
+# Get available modules
+module_factory = ModuleFactory()
+available_modules = module_factory.available_modules()
+
+modules_by_type = {}
+# Categorize modules by type
+for module in available_modules:
+ for type in module.type:
+ modules_by_type.setdefault(type, []).append(module)
+
+
+module_sections = ""
+# Add module sections
+for module_type in MODULE_TYPES:
+ module_sections += f"
{module_type}
"
+ for module in modules_by_type[module_type]:
+ module_name = module.name
+ module_sections += f"""
+
+
+
+
+ """
+ module_sections += "
"
+
+# Add module configuration sections
+
+all_modules_ordered_by_type = sorted(available_modules, key=lambda x: (MODULE_TYPES.index(x.type[0]), not x.requires_setup))
+
+module_configs = ""
+
+for module in all_modules_ordered_by_type:
+ if not module.configs:
+ continue
+ module_configs += f"
{module.display_name} Configuration
"
+ for option, value in module.configs.items():
+ # create a human readable label
+ option = option.replace('_', ' ').title()
+
+ # type - if value has 'choices', then it's a select
+ if 'choices' in value:
+ module_configs += f"""
+