diff --git a/commafeed-server/pom.xml b/commafeed-server/pom.xml
index 575fcb3a..dd0dc64f 100644
--- a/commafeed-server/pom.xml
+++ b/commafeed-server/pom.xml
@@ -115,6 +115,34 @@
+
+ org.codehaus.mojo
+ exec-maven-plugin
+ 3.5.0
+
+
+ io.quarkus
+ quarkus-extension-processor
+ ${quarkus.version}
+
+
+
+ true
+ com.commafeed.tools.CommaFeedPropertiesGenerator
+
+ ${project.build.directory}
+
+
+
+
+ process-test-resources
+
+ java
+
+
+
+
+
org.apache.maven.plugins
maven-assembly-plugin
diff --git a/commafeed-server/src/main/java/com/commafeed/tools/CommaFeedPropertiesGenerator.java b/commafeed-server/src/main/java/com/commafeed/tools/CommaFeedPropertiesGenerator.java
new file mode 100644
index 00000000..114498cd
--- /dev/null
+++ b/commafeed-server/src/main/java/com/commafeed/tools/CommaFeedPropertiesGenerator.java
@@ -0,0 +1,80 @@
+package com.commafeed.tools;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import com.commafeed.CommaFeedConfiguration;
+
+import io.quarkus.annotation.processor.Outputs;
+import io.quarkus.annotation.processor.documentation.config.model.AbstractConfigItem;
+import io.quarkus.annotation.processor.documentation.config.model.ConfigProperty;
+import io.quarkus.annotation.processor.documentation.config.model.ConfigRoot;
+import io.quarkus.annotation.processor.documentation.config.model.ConfigSection;
+import io.quarkus.annotation.processor.documentation.config.model.JavadocElements;
+import io.quarkus.annotation.processor.documentation.config.model.ResolvedModel;
+import io.quarkus.annotation.processor.documentation.config.util.JacksonMappers;
+
+/**
+ * This class generates an application.properties file with all the properties from {@link CommaFeedConfiguration}.
+ *
+ * This is useful for people who want to be able to configure CommaFeed without having to look at the code or the documentation, or for
+ * distribution packages that want to provide a default configuration file.
+ *
+ **/
+public class CommaFeedPropertiesGenerator {
+
+ private final List lines = new ArrayList<>();
+
+ public static void main(String[] args) throws Exception {
+ new CommaFeedPropertiesGenerator().generate(args);
+ }
+
+ private void generate(String[] args) throws IOException {
+ Path targetPath = Paths.get(args[0]);
+
+ ResolvedModel resolvedModel = JacksonMappers.yamlObjectReader()
+ .readValue(targetPath.resolve(Outputs.QUARKUS_CONFIG_DOC_MODEL).toFile(), ResolvedModel.class);
+ JavadocElements javadocElements = JacksonMappers.yamlObjectReader()
+ .readValue(targetPath.resolve(Outputs.QUARKUS_CONFIG_DOC_JAVADOC).toFile(), JavadocElements.class);
+
+ for (ConfigRoot configRoot : resolvedModel.getConfigRoots()) {
+ for (AbstractConfigItem item : configRoot.getItems()) {
+ handleAbstractConfigItem(item, javadocElements);
+ }
+ }
+
+ Files.writeString(targetPath.resolve("quarkus-generated-doc").resolve("application.properties"), String.join("\n", lines));
+ }
+
+ private void handleAbstractConfigItem(AbstractConfigItem item, JavadocElements javadocElements) {
+ if (item.isSection()) {
+ handleSection((ConfigSection) item, javadocElements);
+ } else {
+ handleProperty((ConfigProperty) item, javadocElements);
+ }
+ }
+
+ private void handleSection(ConfigSection section, JavadocElements javadocElements) {
+ for (AbstractConfigItem item : section.getItems()) {
+ handleAbstractConfigItem(item, javadocElements);
+ }
+ }
+
+ private void handleProperty(ConfigProperty property, JavadocElements javadocElements) {
+ String key = property.getPath().property();
+ String description = javadocElements.elements()
+ .get(property.getSourceType() + "." + property.getSourceElementName())
+ .description()
+ .replace("\n", "\n# ");
+ String defaultValue = Optional.ofNullable(property.getDefaultValue()).orElse("").toLowerCase();
+
+ lines.add("# " + description);
+ lines.add(key + "=" + defaultValue);
+ lines.add("");
+ }
+}