diff --git a/cms-core/pom.xml b/cms-core/pom.xml
index 2ded86422..5ecbbb5cb 100644
--- a/cms-core/pom.xml
+++ b/cms-core/pom.xml
@@ -28,6 +28,11 @@
jtoml-serializer-gson1.3.0
+
+ io.github.cdimascio
+ dotenv-java
+ 3.2.0
+ org.simplejavamailsimple-java-mail
diff --git a/cms-core/src/main/java/com/condation/cms/core/configuration/ConfigurationFactory.java b/cms-core/src/main/java/com/condation/cms/core/configuration/ConfigurationFactory.java
index 3818c0152..4ee5dcae2 100644
--- a/cms-core/src/main/java/com/condation/cms/core/configuration/ConfigurationFactory.java
+++ b/cms-core/src/main/java/com/condation/cms/core/configuration/ConfigurationFactory.java
@@ -30,6 +30,7 @@
import com.condation.cms.core.configuration.configs.TaxonomyConfiguration;
import com.condation.cms.core.configuration.reload.CronReload;
import com.condation.cms.core.configuration.reload.NoReload;
+import com.condation.cms.core.configuration.source.EnvConfigSource;
import com.condation.cms.core.configuration.source.TomlConfigSource;
import com.condation.cms.core.configuration.source.YamlConfigSource;
import java.io.IOException;
@@ -110,6 +111,7 @@ private static SimpleConfiguration serverConfiguration(EventBus eventBus) throws
return SimpleConfiguration.builder(eventBus)
.id("server")
.reloadStrategy(new NoReload())
+ .addSource(new EnvConfigSource())
.addSource(TomlConfigSource.build(ServerUtil.getPath("server.toml")))
.addSource(YamlConfigSource.build(ServerUtil.getPath("server.yaml")))
.build();
diff --git a/cms-core/src/main/java/com/condation/cms/core/configuration/source/EnvConfigSource.java b/cms-core/src/main/java/com/condation/cms/core/configuration/source/EnvConfigSource.java
new file mode 100644
index 000000000..595f71077
--- /dev/null
+++ b/cms-core/src/main/java/com/condation/cms/core/configuration/source/EnvConfigSource.java
@@ -0,0 +1,77 @@
+package com.condation.cms.core.configuration.source;
+
+/*-
+ * #%L
+ * cms-core
+ * %%
+ * Copyright (C) 2023 - 2025 CondationCMS
+ * %%
+ * 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.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program. If not, see
+ * .
+ * #L%
+ */
+
+import com.condation.cms.api.utils.MapUtil;
+import com.condation.cms.api.utils.ServerUtil;
+import com.condation.cms.core.configuration.ConfigSource;
+import com.condation.cms.core.utils.EnvUtil;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class EnvConfigSource implements ConfigSource {
+
+ private final Map envVariables;
+
+ public EnvConfigSource () {
+ this(ServerUtil.getHome().toAbsolutePath().toString());
+ }
+
+ public EnvConfigSource(String path) {
+ this.envVariables = EnvUtil.load(path);
+ }
+
+ @Override
+ public boolean reload() {
+ // Environment variables are not expected to change during runtime
+ return false;
+ }
+
+ @Override
+ public boolean exists() {
+ // Environment variables are always considered to exist
+ return true;
+ }
+
+ @Override
+ public String getString(String field) {
+ return (String) MapUtil.getValue(envVariables, field);
+ }
+
+ @Override
+ public Object get(String field) {
+ return MapUtil.getValue(envVariables, field);
+ }
+
+ @Override
+ public Map getMap(String field) {
+ return MapUtil.getValue(envVariables, field, Collections.emptyMap());
+ }
+
+ @Override
+ public List