diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 16bc9b532862fd256f2c7cd8fe578d91de270d86_LmdpdGxhYi1jaS55bWw=..9b320eba62ddd458efa952d1515ca9c82ac78eb5_LmdpdGxhYi1jaS55bWw= 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -53,7 +53,7 @@
   image: $TEMP_IMAGE
   script:
     - python3 -m pip install mypy types-PyYAML types-psycopg2 types-python-dateutil
-      types-requests build twine
+      types-toml types-requests build twine
     - mypy odoo_scripts tests
   rules:
     - if: $CI_COMMIT_TAG == null
diff --git a/NEWS.rst b/NEWS.rst
index 16bc9b532862fd256f2c7cd8fe578d91de270d86_TkVXUy5yc3Q=..9b320eba62ddd458efa952d1515ca9c82ac78eb5_TkVXUy5yc3Q= 100644
--- a/NEWS.rst
+++ b/NEWS.rst
@@ -2,6 +2,11 @@
 History
 =======
 
+20.5.0
+------
+
+Allow setting db_user, db_password, log_handler and pythondevmode in a global settings file (${XDG_CONFIG_HOME-$HOME/.config}/odoo_scripts/config.toml). Configuration can be done by odoo_type too.
+
 20.4.0
 ------
 
diff --git a/odoo_scripts/config.py b/odoo_scripts/config.py
index 16bc9b532862fd256f2c7cd8fe578d91de270d86_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ==..9b320eba62ddd458efa952d1515ca9c82ac78eb5_b2Rvb19zY3JpcHRzL2NvbmZpZy5weQ== 100644
--- a/odoo_scripts/config.py
+++ b/odoo_scripts/config.py
@@ -10,6 +10,16 @@
 from glob import glob
 from typing import Any, Dict, List, Optional, Union
 
+try:
+    # Python 3.11+
+    from tomllib import loads as tomllib_loads
+
+    _tomllib: bool = True
+except ImportError:
+    from toml import loads as toml_loads
+
+    _tomllib = False
+
 SECTION = "odoo_scripts"
 OTHER_SOURCES_KEY = "other_sources"
 ODOO_7 = "odoo7"
@@ -66,6 +76,21 @@
         section: Union[configparser.SectionProxy, dict] = (
             config_parser[SECTION] if SECTION in config_parser else {}
         )
+        self._global_setup: Dict = {}
+        global_setup_path = os.path.join(
+            os.environ.get(
+                "XDG_CONFIG_HOME", os.path.join(os.environ["HOME"], ".config")
+            ),
+            "odoo_scripts",
+            "config.toml",
+        )
+        if os.path.exists(global_setup_path):
+            with open(global_setup_path, "r") as f:
+                global_setup_str = f.read()
+            if _tomllib:
+                self._global_setup = dict(tomllib_loads(global_setup_str))
+            else:
+                self._global_setup = dict(toml_loads(global_setup_str))
 
         # read expanded configurations information
         expanded_info: defaultdict[Any, Dict] = defaultdict(dict)
@@ -201,8 +226,6 @@
         self.duplicate_repo: str
         self.marabunta_migration_file: str
         for key in (
-            "db_user",
-            "db_password",
             "load-language",
             "duplicate_repo",
             "marabunta_migration_file",
@@ -274,6 +297,33 @@
                 )
             else:
                 _logger.warning("Unexpected odoo_type: %s", self.odoo_type)
+        for key in (
+            "db_user",
+            "db_password",
+        ):
+            option_value: Optional[str] = None
+            if key in section:
+                option_value = section[key]
+            else:
+                if key in self._global_setup:
+                    option_value = self._global_setup[key]
+                if hasattr(self, "odoo_type") and key in self._global_setup.get(
+                    self.odoo_type, {}
+                ):
+                    option_value = self._global_setup[self.odoo_type][key]
+            setattr(self, key_format(key), option_value)
+        self.log_handler: List[str]
+        self.pythondevmode: bool
+        for key, default_value in (("log-handler", []), ("pythondevmode", True)):
+            any_value: Any = default_value
+            if key in self._global_setup:
+                any_value = self._global_setup[key]
+            if hasattr(self, "odoo_type") and key in self._global_setup.get(
+                self.odoo_type, {}
+            ):
+                any_value = self._global_setup[self.odoo_type][key]
+            setattr(self, key_format(key), any_value)
+
         self.postgresql_version: str
         read_expanded("postgresql_version", "9.6")
         self.start_py3o: bool = section.get("start_py3o", "no") in ("yes", "true")
diff --git a/odoo_scripts/docker_dev_start.py b/odoo_scripts/docker_dev_start.py
index 16bc9b532862fd256f2c7cd8fe578d91de270d86_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk=..9b320eba62ddd458efa952d1515ca9c82ac78eb5_b2Rvb19zY3JpcHRzL2RvY2tlcl9kZXZfc3RhcnQucHk= 100755
--- a/odoo_scripts/docker_dev_start.py
+++ b/odoo_scripts/docker_dev_start.py
@@ -54,5 +54,5 @@
 
 _logger = logging.getLogger(__name__)
 
-__version__ = "3.12.1"
+__version__ = "3.13.0"
 __date__ = "2017-08-11"
@@ -58,5 +58,5 @@
 __date__ = "2017-08-11"
-__updated__ = "2023-05-15"
+__updated__ = "2023-06-13"
 
 
 def __parser(project_name: str) -> ArgumentParser:
@@ -397,6 +397,14 @@
         help="marabunta force version argument (see marabunta documentation)",
     )
 
-    parser.add_argument(
+    pythondevmode_group = parser.add_mutually_exclusive_group()
+    pythondevmode_group.add_argument(
+        "--pythondevmode",
+        help="Set PYTHONDEVMODE",
+        action="store_true",
+        default=False,
+        dest="force_python_dev_mode",
+    )
+    pythondevmode_group.add_argument(
         "--no-pythondevmode",
         help="Do not set PYTHONDEVMODE",
@@ -401,8 +409,8 @@
         "--no-pythondevmode",
         help="Do not set PYTHONDEVMODE",
-        action="store_false",
-        default=True,
-        dest="python_dev_mode",
+        action="store_true",
+        default=False,
+        dest="force_no_python_dev_mode",
     )
 
     # workers options
@@ -485,7 +493,8 @@
     marabunta_db_user = nmspc.marabunta_db_user
     marabunta_db_password = nmspc.marabunta_db_password
     marabunta_force_version = nmspc.marabunta_force_version
-    python_dev_mode = nmspc.python_dev_mode
+    force_python_dev_mode = nmspc.force_python_dev_mode
+    force_no_python_dev_mode = nmspc.force_no_python_dev_mode
     workers = nmspc.workers
     # XXX should that variable be called multi_workers?
     longpolling = workers > 0
@@ -621,7 +630,7 @@
         arg.append("--log-level")
         arg.append(nmspc.log_level)
     if nmspc.log_handler:
-        for lh in nmspc.log_handler:
+        for lh in nmspc.log_handler + config.log_handler:
             arg.append("--log-handler")
             arg.append(lh)
     if nmspc.LOAD_LANGUAGE:
@@ -1196,7 +1205,9 @@
             arg.append(f"--dev={','.join(set(dev_opts))}")
         if odoo_type in (ODOO_8,):
             arg.append("--auto-reload")
-        if python_dev_mode:
+        if force_python_dev_mode or (
+            config.pythondevmode and not force_no_python_dev_mode
+        ):
             options["environment"]["PYTHONDEVMODE"] = 1
 
     if test_tags:
diff --git a/pyproject.toml b/pyproject.toml
index 16bc9b532862fd256f2c7cd8fe578d91de270d86_cHlwcm9qZWN0LnRvbWw=..9b320eba62ddd458efa952d1515ca9c82ac78eb5_cHlwcm9qZWN0LnRvbWw= 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -22,6 +22,7 @@
   "PyYAML",
   "importlib_metadata; python_version<'3.8'",
   "python-hglib",
+  "toml; python_version<='3.10'",
 ]
 
 [project.optional-dependencies]