diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png
new file mode 100644
index 0000000000..cfd92079cc
Binary files /dev/null and b/frontend/public/apple-touch-icon.png differ
diff --git a/frontend/public/favicon-16x16.png b/frontend/public/favicon-16x16.png
new file mode 100644
index 0000000000..8c83dacde5
Binary files /dev/null and b/frontend/public/favicon-16x16.png differ
diff --git a/frontend/public/favicon-32x32.png b/frontend/public/favicon-32x32.png
new file mode 100644
index 0000000000..53a42dce3e
Binary files /dev/null and b/frontend/public/favicon-32x32.png differ
diff --git a/frontend/public/manifest.webmanifest b/frontend/public/manifest.webmanifest
new file mode 100644
index 0000000000..cf49fb98e2
--- /dev/null
+++ b/frontend/public/manifest.webmanifest
@@ -0,0 +1,88 @@
+{
+ "name": "Firefly III",
+ "short_name": "Firefly III",
+ "start_url": "/",
+ "icons": [
+ {
+ "src": "/maskable72.png",
+ "sizes": "72x72",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable76.png",
+ "sizes": "76x76",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable96.png",
+ "sizes": "96x96",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable120.png",
+ "sizes": "120x120",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable128.png",
+ "sizes": "128x128",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable144.png",
+ "sizes": "144x144",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable152.png",
+ "sizes": "152x152",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable180.png",
+ "sizes": "180x180",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "scope": "any"
+ },
+ {
+ "src": "/maskable192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/maskable384.png",
+ "sizes": "384x384",
+ "type": "image/png",
+ "scope": "maskable"
+ },
+ {
+ "src": "/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "scope": "any"
+ },
+ {
+ "src": "/maskable512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "scope": "maskable"
+ }
+ ],
+ "theme_color": "#1e6581",
+ "background_color": "#1e6581",
+ "display": "standalone"
+}
diff --git a/frontend/public/maskable-icon.svg b/frontend/public/maskable-icon.svg
new file mode 100644
index 0000000000..0ca6cc1be0
--- /dev/null
+++ b/frontend/public/maskable-icon.svg
@@ -0,0 +1,16 @@
+
diff --git a/frontend/public/maskable120.png b/frontend/public/maskable120.png
new file mode 100644
index 0000000000..28472c71b9
Binary files /dev/null and b/frontend/public/maskable120.png differ
diff --git a/frontend/public/maskable128.png b/frontend/public/maskable128.png
new file mode 100644
index 0000000000..6a29bd5ded
Binary files /dev/null and b/frontend/public/maskable128.png differ
diff --git a/frontend/public/maskable152.png b/frontend/public/maskable152.png
new file mode 100644
index 0000000000..8301098084
Binary files /dev/null and b/frontend/public/maskable152.png differ
diff --git a/frontend/public/maskable192.png b/frontend/public/maskable192.png
new file mode 100644
index 0000000000..f280d1d2b2
Binary files /dev/null and b/frontend/public/maskable192.png differ
diff --git a/frontend/public/maskable512.png b/frontend/public/maskable512.png
new file mode 100644
index 0000000000..311b9015b1
Binary files /dev/null and b/frontend/public/maskable512.png differ
diff --git a/frontend/public/maskable76.png b/frontend/public/maskable76.png
new file mode 100644
index 0000000000..d793ac1218
Binary files /dev/null and b/frontend/public/maskable76.png differ
diff --git a/frontend/public/safari-pinned-tab.svg b/frontend/public/safari-pinned-tab.svg
new file mode 100644
index 0000000000..108c659acf
--- /dev/null
+++ b/frontend/public/safari-pinned-tab.svg
@@ -0,0 +1,39 @@
+
+
+