diff --git a/reco/app/cbmreco_fairrun/Application.cxx b/reco/app/cbmreco_fairrun/Application.cxx
index 4c60fc4090fec9d4b4107e918ac4d515e0800870..80dc57401a732a899b148b2d28b94abcdf71a6e7 100644
--- a/reco/app/cbmreco_fairrun/Application.cxx
+++ b/reco/app/cbmreco_fairrun/Application.cxx
@@ -10,7 +10,8 @@ Application::Application(ProgramOptions const& opt) : fOpt(opt)
   config.LoadYaml(fOpt.ConfigYamlFile());
   if (!fOpt.SaveConfigYamlFile().empty()) { config.SaveYaml(fOpt.SaveConfigYamlFile()); }
 
-  fCbmReco = std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config);
+  fCbmReco =
+    std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config, fOpt.HttpServerPort());
 }
 
 void Application::Run() { fCbmReco->Run(); }
diff --git a/reco/app/cbmreco_fairrun/ProgramOptions.cxx b/reco/app/cbmreco_fairrun/ProgramOptions.cxx
index ce629965462193485fa31f3e6923f9a54289c1af..2571caf9fd52f8d1253e8b8b09d07d06fc6f780e 100644
--- a/reco/app/cbmreco_fairrun/ProgramOptions.cxx
+++ b/reco/app/cbmreco_fairrun/ProgramOptions.cxx
@@ -49,6 +49,8 @@ void ProgramOptions::ParseOptions(int argc, char* argv[])
              "save configuration to yaml file (mostly for debugging)");
   config_add("max-timeslice-number,n", po::value<int32_t>(&fMaxNumTs)->value_name("<n>"),
              "quit after processing given number of timeslices (default: unlimited)");
+  config_add("http-server-port,p", po::value<uint16_t>(&fHttpServerPort)->value_name("<n>"),
+             "port number for the HTTP server. If 0, server will not be activated (default)");
 
   po::options_description cmdline_options("Allowed options");
   cmdline_options.add(generic).add(config);
diff --git a/reco/app/cbmreco_fairrun/ProgramOptions.h b/reco/app/cbmreco_fairrun/ProgramOptions.h
index d57563303cee74f8a10709ded325d5801baf655b..2ed6d8ca871898137cf4b7a80f88aacb2f9de930 100644
--- a/reco/app/cbmreco_fairrun/ProgramOptions.h
+++ b/reco/app/cbmreco_fairrun/ProgramOptions.h
@@ -51,6 +51,9 @@ public:
   /** @brief Get maximum number of timeslices to process **/
   [[nodiscard]] int32_t MaxNumTs() const { return fMaxNumTs; }
 
+  /** @brief Get the port number for the HTTP server **/
+  [[nodiscard]] uint16_t HttpServerPort() const { return fHttpServerPort; }
+
 private:
   /** @brief Parse command line arguments using boost program_options **/
   void ParseOptions(int argc, char* argv[]);
@@ -59,7 +62,8 @@ private:
   std::string fOutputRootFile = "/dev/null";  ///< Output file name (.root format)
   std::string fConfigYamlFile;                ///< Configuration file name (.yaml format)
   std::string fSaveConfigYamlFile;            ///< Save configuration file name (.yaml format)
-  int32_t fMaxNumTs = INT32_MAX;              ///< Maximum number of timeslices to process
+  int32_t fMaxNumTs        = INT32_MAX;       ///< Maximum number of timeslices to process
+  uint16_t fHttpServerPort = 0;               ///< Port number for the HTTP server. If 0, server will not be activated.
 };
 
 #endif /* APP_CBMRECO_PROGRAMOPTIONS_H */
diff --git a/reco/tasks/CbmReco.cxx b/reco/tasks/CbmReco.cxx
index b29a262eddf65a806a55812d83a912015c1ca70c..54ab2384f80bc4ef7dca07ddc988697b68839347 100644
--- a/reco/tasks/CbmReco.cxx
+++ b/reco/tasks/CbmReco.cxx
@@ -56,6 +56,8 @@ void CbmRecoConfig::LoadYaml(const std::string& filename)
   fStoreTimeslice = config["store"]["timeslice"].as<bool>();
   fStoreTrigger   = config["store"]["triggers"].as<bool>();
   fStoreEvents    = config["store"]["events"].as<bool>();
+  // --- QA publishing
+  fHttpServerRefreshRate = config["qa"]["refreshrate"].as<int32_t>(fHttpServerRefreshRate);
 }
 // ----------------------------------------------------------------------------
 
@@ -79,6 +81,8 @@ void CbmRecoConfig::SaveYaml(const std::string& filename)
   config["store"]["timeslice"] = fStoreTimeslice;
   config["store"]["triggers"]  = fStoreTrigger;
   config["store"]["events"]    = fStoreEvents;
+  // --- QA publishing
+  config["qa"]["refreshrate"] = fHttpServerRefreshRate;
   // ---
   std::ofstream fout(filename);
   fout << config;
@@ -200,8 +204,7 @@ int32_t CbmReco::Run()
 
   // ----- HttpServer for online monitoring
   if (fHttpServerPort) {
-    Int_t serverRefreshRate = 100;  // timeslices
-    run.ActivateHttpServer(serverRefreshRate, fHttpServerPort);
+    run.ActivateHttpServer(fConfig.fHttpServerRefreshRate, fHttpServerPort);
     run.GetHttpServer()->GetSniffer()->SetScanGlobalDir(kFALSE);
   }
 
diff --git a/reco/tasks/CbmReco.h b/reco/tasks/CbmReco.h
index 61992fc1a7da684d188250f9d56decad538d979c..2c233a4474477cb1f2fb3a7fdc14e5184b679810 100644
--- a/reco/tasks/CbmReco.h
+++ b/reco/tasks/CbmReco.h
@@ -32,6 +32,8 @@ public:
   bool fStoreTimeslice = false;
   bool fStoreTrigger   = false;
   bool fStoreEvents    = false;
+  // --- QA publishing
+  int32_t fHttpServerRefreshRate = 100;
   // --- Load/save using yaml-cpp
   void LoadYaml(const std::string& filename);
   void SaveYaml(const std::string& filename);
diff --git a/reco/tasks/CbmRecoConfigExample.yaml b/reco/tasks/CbmRecoConfigExample.yaml
index 69bd607e3bd7811a52a98b0cad9abd4bae93e6c6..56d05361d774fd32b388aa202122780cf4805c80 100644
--- a/reco/tasks/CbmRecoConfigExample.yaml
+++ b/reco/tasks/CbmRecoConfigExample.yaml
@@ -10,3 +10,5 @@ store:
   timeslice: false
   triggers: false
   events: true
+qa:
+  refreshrate: 100