diff --git a/src/scripts/model_maker.py b/src/scripts/model_maker.py
new file mode 100755
index 0000000000000000000000000000000000000000..99b2315ccf6b12e144f5f2525a5de3063f9ff6cd
--- /dev/null
+++ b/src/scripts/model_maker.py
@@ -0,0 +1,109 @@
+#!/bin/python3
+
+#   Copyright (C) 2024   INAF - Osservatorio Astronomico di Cagliari
+#
+#   This program 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.
+#   
+#   This program 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.
+#   
+#   A copy of the GNU General Public License is distributed along with
+#   this program in the COPYING file. If not, see: <https://www.gnu.org/licenses/>.
+
+## @package pycompare
+#  \brief Script to build models from YAML configuration files
+
+import cmath
+import yaml
+
+from sys import argv
+
+## \brief Main execution code
+#
+# `main()` is the function that handles the creation of the code configuration.
+# It returns an integer value as exit code, using 0 to signal successful execution.
+#
+# \returns result: `int` Number of detected error-level inconsistencies.
+def main():
+    result = 0
+    if (len(argv) < 2):
+        print_help()
+    else:
+        model = load_model(argv[1])
+        if model is not None:
+            result = write_sconf(model)
+        else:
+            print("ERROR: could not create configuration.")
+            result = 1
+    return result
+
+def load_model(model_file):
+    result = None
+    try:
+        with open(model_file, 'r') as stream:
+            result = yaml.safe_load(stream)
+    except yaml.YAMLError:
+        print("ERROR: " + model_file + " is not a valid configuration!")
+        result = None
+    except FileNotFoundError:
+        print("ERROR: " + model_file + " was not found!")
+    return result
+
+## \brief Print a command-line help summary.
+def print_help():
+    print("                                               ")
+    print("***              MODEL_MAKER                ***")
+    print("                                               ")
+    print("Create input files for FORTRAN and C++ code.   ")
+    print("                                               ")
+    print("Usage: \"./model_maker.py CONFIG [OPTIONS]\"   ")
+    print("                                               ")
+    print("CONFIG must be a valid YAML configuration file.")
+    print("                                               ")
+    print("Valid options are:                             ")
+    print("--help                Print this help and exit.")
+    print("                                               ")
+
+def write_sconf(model, form='legacy'):
+    result = 0
+    out_file = (
+        model['input_settings']['input_folder'] + "/" +
+        model['input_settings']['spheres_file']
+    )
+    #print("DEBUG: out_file = " + out_file)
+    nsph = model['particle_settings']['n_spheres']
+    ies = 1 if model['particle_settings']['application'] == "inclusion" else 0
+    exri= float(model['material_settings']['extern_refr'])
+    wp = float(model['radiation_settings']['wp'])
+    xip = float(model['radiation_settings']['xip'])
+    scale_start = float(model['radiation_settings']['scale_start'])
+    scale_end = float(model['radiation_settings']['scale_end'])
+    scale_step = float(model['radiation_settings']['scale_step'])
+    idfc = int(model['radiation_settings']['diel_flag'])
+    instpc = int(model['radiation_settings']['step_flag'])
+    xi_flag = 3
+    nxi = 1 + int((scale_end - scale_start) / scale_step)
+    if form == 'legacy':
+        # Write legacy output
+        #print("DEBUG: writing to file.")
+        output = open(out_file, 'w')
+        str_line = " {0:3d}{1:3d}\n".format(nsph, ies)
+        output.write(str_line)
+        str_line = " {0:12.7E} {1:12.7E} {2:12.7E} {3:2d} {4:7d} {5:4d} {6:3d}\n".format(
+            exri, wp, xip, idfc, nxi, instpc, xi_flag
+        )
+        output.write(str_line)
+        output.close()
+    return result
+
+def write_gconf(model, out_file):
+    return
+
+## \brief Exit code (0 for success)
+exit_code = main()
+exit(exit_code)