diff --git a/.gitignore b/.gitignore
index 392be0fa7490a7575be30051236053bc5050b1ee..1d93ec1942c652c749728edd8c2707886ea8edec 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@ examples
 # environment.
 Manifest.toml
 
+# system image used to speed up GUI loading
+/sysimg.so
\ No newline at end of file
diff --git a/sysimg_create.jl b/sysimg_create.jl
new file mode 100755
index 0000000000000000000000000000000000000000..e0abc14892c04a995155e03cd43df46070bc77c5
--- /dev/null
+++ b/sysimg_create.jl
@@ -0,0 +1,15 @@
+#!/usr/bin/env julia
+
+import Pkg
+Pkg.activate(".")
+
+using PackageCompiler
+
+# Creating the sysimg takes a few minutes and uses around 13GB of RAM.
+#
+# TODO: currently all GUI functions must be called manually, optimally
+# every GUI function is called and a complete simulation is run.
+create_sysimage(["Persefone", "CSV", "CxxWrap", "DataFramesMeta", "FileIO", "GLMakie",
+                 "GeometryBasics", "Observables", "QML", "ResumableFunctions", "TableTransforms", "TOML"],
+                sysimage_path="sysimg.so",
+                precompile_execution_file="sysimg_precompile.jl")
diff --git a/sysimg_precompile.jl b/sysimg_precompile.jl
new file mode 100644
index 0000000000000000000000000000000000000000..5d64ff27ac894a6938dab66efa7c0b6f833f0974
--- /dev/null
+++ b/sysimg_precompile.jl
@@ -0,0 +1,6 @@
+using PersefoneDesktop
+# TODO: currently all important GUI functions that should be
+# precompiled must be called manually, and then the GUI must be closed
+# manually. It would be good if this could be completely automated.
+launch()
+