diff --git a/src/display.cpp b/src/display.cpp
index a523205677b09278cc35280bb890b5aea00eeff5..c30d059b68468cd2a40ca2cacb166afebe8e2e0f 100644
--- a/src/display.cpp
+++ b/src/display.cpp
@@ -14,8 +14,6 @@ const uint8_t kMatrixOptions = (SMARTMATRIX_OPTIONS_NONE);    // see http://docs
 const uint8_t kBackgroundLayerOptions = (SM_BACKGROUND_OPTIONS_NONE);
 const uint8_t kIndexedLayerOptions = (SM_INDEXED_OPTIONS_NONE);
 
-int defaultBrightness = (brightnessPercent * 255) / 100;
-
 rgb24 colorWhite = {0xff, 0xff, 0xff};
 
 SMARTMATRIX_ALLOCATE_BUFFERS(matrix, kMatrixWidth, kMatrixHeight, kRefreshDepth, kDmaBufferRows, kPanelType, kMatrixOptions);
diff --git a/src/display.h b/src/display.h
index be4764cd0121af833f5f89c617f126236b14e788..52ccbe387c588de310becfeee9665476b8409879 100644
--- a/src/display.h
+++ b/src/display.h
@@ -6,7 +6,7 @@
 #include <SmartMatrix.h>
 
 extern bool runGame;
-extern int brightnessPercent;
+extern int defaultBrightness;
 extern int gameEra;
 
 void setupDisplay();
diff --git a/src/gameoflife.cpp b/src/gameoflife.cpp
index d5d57e2c3bd51890df5c9667a327770823b515dd..58995c62fda1936892a00e3a73699df5d9db0901 100644
--- a/src/gameoflife.cpp
+++ b/src/gameoflife.cpp
@@ -18,6 +18,7 @@ int finalTicks;
 int cellsAliveNow;
 int cellsAliveBefore;
 int noEvolutionTicks;
+int noEvolutionTicksLimit = 100;
 
 const uint scoreScreenTimeout = 5000;
 unsigned long currentMillis;
diff --git a/src/main.cpp b/src/main.cpp
index 5c4edae84458d2641f5b9a64bc7772f891659eb9..2ed21b6ab5fa4e89ce578d8f56068e61f1664e2c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,13 +1,14 @@
-#define CONFIG_HEAP_CORRUPTION_DETECTION HEAP_POISONING_LIGHT
 #include <Arduino.h>
+#include <Preferences.h>
 #include "utils.h"
 #include "network.h"
 #include "display.h"
 #include "gameoflife.h"
 
-int noEvolutionTicksLimit = 100;
-int brightnessPercent = 20;
-int gameInterval = 100;
+Preferences preferences;
+
+int defaultBrightness;
+int gameInterval;
 
 unsigned long lastTick;
 
@@ -18,10 +19,18 @@ void showTitle() {
   showMessage(msg);
 }
 
+void setupSettings() {
+  preferences.begin("settings", true); // true = readonly
+  defaultBrightness = preferences.getUInt("brightness", 50);
+  gameInterval = preferences.getUInt("interval", 100);
+  preferences.end();
+}
+
 void setup()
 {
   Serial.begin(115200);
   logLine("", true);
+  setupSettings();
   setupDisplay();
   showTitle();
   setupNetwork();
diff --git a/src/network.cpp b/src/network.cpp
index a13222bfabb358245b2153ee03c5f3ddd1f8ddda..272ad9216cab8b72a244efb8c207cf96188299e5 100644
--- a/src/network.cpp
+++ b/src/network.cpp
@@ -266,4 +266,8 @@ void updateConfig(StaticJsonDocument<200U> doc)
   gameInterval = doc["config"]["interval"];
   defaultBrightness = doc["config"]["brightness"];
   displayBrightness(defaultBrightness);
+  preferences.begin("settings", false);
+  preferences.putUInt("brightness", defaultBrightness);
+  preferences.putUInt("interval", gameInterval);
+  preferences.end();
 }
diff --git a/src/network.h b/src/network.h
index f83d9162d5a28c594049c12ff130934000e42d1d..c22f54abbc48cd20c6f8a9c6600c4f2e0036f4ad 100644
--- a/src/network.h
+++ b/src/network.h
@@ -15,6 +15,7 @@
 extern bool runGame;
 extern int defaultBrightness;
 extern int gameInterval;
+extern Preferences preferences;
 
 void setupNetwork();
 void setupMDNS();