diff --git a/esp8266/Makefile b/esp8266/Makefile
index 389e86edf9d8d75251d2b4e6e5188d34c37918e4..c891c50dcb3a8a48eadf3255ef0142b83b77e42c 100644
--- a/esp8266/Makefile
+++ b/esp8266/Makefile
@@ -6,6 +6,9 @@ QSTR_DEFS = qstrdefsport.h #$(BUILD)/pins_qstr.h
 # include py core make definitions
 include ../py/py.mk
 
+MAKE_FROZEN = ../tools/make-frozen.py
+
+SCRIPTDIR = scripts
 PORT = /dev/ttyACM0
 CROSS_COMPILE = xtensa-lx106-elf-
 ESP_SDK = $(shell $(CC) -print-sysroot)/usr
@@ -51,6 +54,7 @@ SRC_C = \
 	modpybpin.c \
 	modesp.c \
 	utils.c \
+	$(BUILD)/frozen.c \
 
 STM_SRC_C = $(addprefix stmhal/,\
 	printf.c \
@@ -77,6 +81,19 @@ OBJ += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
 
 all: $(BUILD)/firmware-combined.bin
 
+SCRIPTDIR_FILE = $(BUILD)/scriptdir
+
+ifeq ($(wildcard $(SCRIPTDIR_FILE)),)
+$(shell $(MKDIR) -p $(BUILD))
+$(shell echo $(SCRIPTDIR) > $(SCRIPTDIR_FILE))
+else ifneq ($(shell cat $(SCRIPTDIR_FILE)), $(SCRIPTDIR))
+$(shell echo $(SCRIPTDIR) > $(SCRIPTDIR_FILE))
+endif
+
+$(BUILD)/frozen.c: $(wildcard $(SCRIPTDIR)/*) $(SCRIPTDIR_FILE)
+	$(ECHO) "Generating $@"
+	$(Q)$(MAKE_FROZEN) $(SCRIPTDIR) > $@
+
 .PHONY: deploy
 
 deploy: $(BUILD)/firmware-combined.bin
diff --git a/esp8266/main.c b/esp8266/main.c
index 81618cd63f6da63e40aaf007dab1007ff0813aa1..59b415c1d9af8e14af2ef4f2bf0802be17de41fd 100644
--- a/esp8266/main.c
+++ b/esp8266/main.c
@@ -32,6 +32,7 @@
 #include "py/runtime0.h"
 #include "py/runtime.h"
 #include "py/stackctrl.h"
+#include "py/frozenmod.h"
 #include "py/gc.h"
 #include "pyexec.h"
 #include "gccollect.h"
@@ -46,6 +47,10 @@ STATIC void mp_reset(void) {
     mp_init();
     mp_obj_list_init(mp_sys_path, 0);
     mp_obj_list_init(mp_sys_argv, 0);
+#if MICROPY_MODULE_FROZEN
+    mp_lexer_t *lex = mp_find_frozen_module("main", 4);
+    mp_parse_compile_execute(lex, MP_PARSE_FILE_INPUT, mp_globals_get(), mp_locals_get());
+#endif
 }
 
 void soft_reset(void) {
diff --git a/esp8266/mpconfigport.h b/esp8266/mpconfigport.h
index cae5398f971aec4dcf6dfe68ea1654254f6eea64..6d70c48e21cf94a86f22c4d12f3a8f7b91cc5351 100644
--- a/esp8266/mpconfigport.h
+++ b/esp8266/mpconfigport.h
@@ -36,6 +36,7 @@
 #define MICROPY_LONGINT_IMPL        (MICROPY_LONGINT_IMPL_LONGLONG)
 #define MICROPY_FLOAT_IMPL          (MICROPY_FLOAT_IMPL_NONE)
 #define MICROPY_ERROR_REPORTING     (MICROPY_ERROR_REPORTING_TERSE)
+#define MICROPY_MODULE_FROZEN       (1)
 
 // type definitions for the specific machine
 
diff --git a/esp8266/scripts/main.py b/esp8266/scripts/main.py
new file mode 100644
index 0000000000000000000000000000000000000000..83bc52a3211f4566ef05b2d90dfd5f9b45ab5ba7
--- /dev/null
+++ b/esp8266/scripts/main.py
@@ -0,0 +1 @@
+# This script is run on boot