diff --git a/Makefile b/Makefile
index 28ec6b6baba5eca0eca67bc5c5a564bb1677dcb4..253475c26f91e8c9a28e319169f09cbe740eb3fb 100644
--- a/Makefile
+++ b/Makefile
@@ -33,8 +33,12 @@ bin/%.html: bin/tmp
 	git checkout -- src/gui/mainMenu/AlphaDisclaimer.tw
 	mv $< $@
 
-bin/tmp: bin/ src/gui/mainMenu/AlphaDisclaimer.tw
-	$(TWEEGO) src/ --head devTools/head.html > $@
+bin/fc.js: bin/
+	devTools/concatFiles.sh js/ '*.js' $@
+
+bin/tmp: bin/fc.js src/gui/mainMenu/AlphaDisclaimer.tw
+	$(TWEEGO) --module=bin/fc.js --head devTools/head.html src/ > $@
+	rm -f bin/fc.js
 
 src/gui/mainMenu/AlphaDisclaimer.tw:
 	sed -Ei "s/build .releaseID/\0 commit $(COMMIT)/" $@
diff --git a/compile.bat b/compile.bat
index ad3570dfc45fe2b8291d3652546ccab784faa625..2a06b08270c083d45c949ee958095a248b32b52d 100644
--- a/compile.bat
+++ b/compile.bat
@@ -4,12 +4,14 @@
 :: Set working directory
 pushd %~dp0
 if not exist "bin\resources" mkdir bin\resources
+CALL devTools/concatFiles.bat js/ "*.js" bin/fc.js
 :: Run the appropriate compiler for the user's CPU architecture.
 if %PROCESSOR_ARCHITECTURE% == AMD64 (
-	CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --head devTools/head.html "%~dp0src"
+	CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src"
 ) else (
-	CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --head devTools/head.html "%~dp0src"
+	CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src"
 )
+DEL bin\fc.js
 
 popd
 ECHO Done
diff --git a/compile.sh b/compile.sh
index dc9140f965b049e6f595d1f0bca62b50d32f8a47..4946c57147f9a1f1c62c56e6a750cb23a282e207 100755
--- a/compile.sh
+++ b/compile.sh
@@ -76,7 +76,9 @@ function compile {
 		file="bin/FC_pregmod.html"
 	fi
 
-	$TWEEGO_EXE -o $file src/ --head devTools/head.html || build_failed="true"
+	devTools/concatFiles.sh js/ '*.js' bin/fc.js
+	$TWEEGO_EXE -o $file --module=bin/fc.js --head devTools/head.html src/ || build_failed="true"
+	rm -f bin/fc.js
 	if [ "$build_failed" = "true" ]
 	then
 		echoError "Build failed."
diff --git a/devTools/concatFiles.bat b/devTools/concatFiles.bat
new file mode 100644
index 0000000000000000000000000000000000000000..2a07ad8205c7be5850aa7f5df1135d95751e4183
--- /dev/null
+++ b/devTools/concatFiles.bat
@@ -0,0 +1,22 @@
+@echo off
+
+:: See if we can find a git installation
+setlocal enabledelayedexpansion
+
+for %%k in (HKCU HKLM) do (
+	for %%w in (\ \Wow6432Node\) do (
+		for /f "skip=2 delims=: tokens=1*" %%a in ('reg query "%%k\SOFTWARE%%wMicrosoft\Windows\CurrentVersion\Uninstall\Git_is1" /v InstallLocation 2^> nul') do (
+			for /f "tokens=3" %%z in ("%%a") do (
+				set GIT=%%z:%%b
+				set GITFOUND=yes
+				goto FOUND
+			)
+		)
+	)
+)
+
+:FOUND
+if %GITFOUND% == yes (
+	set "PATH=%GIT%bin;%PATH%"
+	bash devTools/concatFiles.sh "%1" "%2" "%3"
+)
diff --git a/devTools/concatFiles.sh b/devTools/concatFiles.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a1a8fd8586627b885320acffe2b3cea3647f5d19
--- /dev/null
+++ b/devTools/concatFiles.sh
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# $1: source dir
+# $2: name wildcard
+# #3: destination file
+
+rm -f "$3"
+files=$(find "$1" -name "$2" -print)
+files=$(echo "$files" | sort)
+for f in $files; do
+	echo -e "\n/* ${f#$1} */\n" >> "$3"
+	cat "$f" >> "$3"
+done
diff --git a/src/002-config/fc-js-init.js b/js/002-config/fc-js-init.js
similarity index 69%
rename from src/002-config/fc-js-init.js
rename to js/002-config/fc-js-init.js
index 3c923124687bca8b341a43c66007c69029106124..f01b00419cd4402a38ff4f7dbbbb7442d47e858e 100644
--- a/src/002-config/fc-js-init.js
+++ b/js/002-config/fc-js-init.js
@@ -1,13 +1,8 @@
 /* eslint-disable no-var */
-/*
-* SugarCube executes scripts via eval() inside a closure. Thus to make App global,
-* we declare it as a property of the window object. I don't know why 'App = {}'
-* does not work.
-*/
 // @ts-ignore
-window.App = { };
-// the same declaration for code parsers that don't like the line above
-var App = window.App || {}; /* eslint-disable-line no-var*/
+"use strict";
+
+var App = { };
 
 App.Art = {};
 App.Data = {};