diff --git a/.gitignore b/.gitignore
index cb0219f78..5fcf51307 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,7 +44,7 @@ frontend/app/yarn-debug.log*
frontend/app/yarn-error.log*
frontend/app/pnpm-debug.log*
frontend/app/lerna-debug.log*
-
+frontend/app/dev-dist
frontend/app/node_modules
frontend/app/.DS_Store
frontend/app/dist
diff --git a/frontend/app/index.html b/frontend/app/index.html
index 04ef753d8..169fb3640 100644
--- a/frontend/app/index.html
+++ b/frontend/app/index.html
@@ -2,39 +2,37 @@
-
-
-
-
-
Endurain
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/app/public/logo/apple-touch-icon.png b/frontend/app/public/logo/apple-touch-icon.png
new file mode 100644
index 000000000..3e8c5c599
Binary files /dev/null and b/frontend/app/public/logo/apple-touch-icon.png differ
diff --git a/frontend/app/public/logo/favicon-16x16.png b/frontend/app/public/logo/favicon-16x16.png
new file mode 100644
index 000000000..ec0a7bfd4
Binary files /dev/null and b/frontend/app/public/logo/favicon-16x16.png differ
diff --git a/frontend/app/public/logo/favicon-32x32.png b/frontend/app/public/logo/favicon-32x32.png
new file mode 100644
index 000000000..1e1ab8b1f
Binary files /dev/null and b/frontend/app/public/logo/favicon-32x32.png differ
diff --git a/frontend/app/public/logo/favicon.ico b/frontend/app/public/logo/favicon.ico
new file mode 100644
index 000000000..c3861dbc4
Binary files /dev/null and b/frontend/app/public/logo/favicon.ico differ
diff --git a/frontend/app/public/logo/pwa-192x192.png b/frontend/app/public/logo/pwa-192x192.png
new file mode 100644
index 000000000..bb5300e9e
Binary files /dev/null and b/frontend/app/public/logo/pwa-192x192.png differ
diff --git a/frontend/app/public/logo/pwa-512x512.png b/frontend/app/public/logo/pwa-512x512.png
new file mode 100644
index 000000000..10a8e8e4e
Binary files /dev/null and b/frontend/app/public/logo/pwa-512x512.png differ
diff --git a/frontend/app/public/logo/pwa-maskable-192x192.png b/frontend/app/public/logo/pwa-maskable-192x192.png
new file mode 100644
index 000000000..444ba3ad9
Binary files /dev/null and b/frontend/app/public/logo/pwa-maskable-192x192.png differ
diff --git a/frontend/app/public/logo/pwa-maskable-512x512.png b/frontend/app/public/logo/pwa-maskable-512x512.png
new file mode 100644
index 000000000..52dfc4b71
Binary files /dev/null and b/frontend/app/public/logo/pwa-maskable-512x512.png differ
diff --git a/frontend/app/src/App.vue b/frontend/app/src/App.vue
index f25d06662..267b65f78 100644
--- a/frontend/app/src/App.vue
+++ b/frontend/app/src/App.vue
@@ -36,9 +36,13 @@ import {
\ No newline at end of file
diff --git a/frontend/app/src/main.js b/frontend/app/src/main.js
index 18790be92..2aa982f66 100644
--- a/frontend/app/src/main.js
+++ b/frontend/app/src/main.js
@@ -6,6 +6,10 @@ import { useAuthStore } from "./stores/authStore";
import { useThemeStore } from "./stores/themeStore";
import { useServerSettingsStore } from "./stores/serverSettingsStore";
+// PWA service worker registration (required for `injectRegister: 'auto'`)
+import { registerSW } from 'virtual:pwa-register';
+registerSW();
+
import "bootstrap/dist/css/bootstrap.min.css";
import "bootstrap/dist/js/bootstrap.bundle.min.js";
diff --git a/frontend/app/vite.config.js b/frontend/app/vite.config.js
index 3bd16df51..76e9c2ebb 100644
--- a/frontend/app/vite.config.js
+++ b/frontend/app/vite.config.js
@@ -10,10 +10,76 @@ export default defineConfig({
plugins: [
vue(),
VitePWA({
+ registerType: 'autoUpdate',
+ strategies: 'generateSW',
+ injectRegister: 'auto',
+ minify: true,
+ manifest: {
+ name: 'Endurain',
+ short_name: 'Endurain',
+ description: 'A self-hosted fitness tracking service',
+ start_url: '/',
+ display: 'standalone',
+ background_color: '#212529',
+ theme_color: '#FFFFFF',
+ icons: [
+ {
+ src: '/logo/pwa-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ purpose: 'any'
+ },
+ {
+ src: '/logo/pwa-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ purpose: 'any'
+ },
+ {
+ src: '/logo/logo-512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ purpose: 'any'
+ },
+ {
+ src: '/logo/pwa-maskable-192x192.png',
+ sizes: '192x192',
+ type: 'image/png',
+ purpose: 'maskable'
+ },
+ {
+ src: '/logo/pwa-maskable-512x512.png',
+ sizes: '512x512',
+ type: 'image/png',
+ purpose: 'maskable'
+ }
+ ]
+ },
workbox: {
maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
+ globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
+ clientsClaim: true,
+ skipWaiting: true,
+ sourcemap: false,
+ navigateFallback: '/',
+ runtimeCaching: [
+ {
+ urlPattern: ({ url }) => /^\/api\/v1(?:\/|$)/.test(url.pathname),
+ handler: 'NetworkFirst',
+ options: {
+ cacheName: 'api-cache',
+ expiration: {
+ maxEntries: 100,
+ maxAgeSeconds: 86400
+ }
+ }
+ }
+ ]
},
- registerType: 'autoUpdate' ,
+ devOptions: {
+ enabled: true,
+ type: 'module',
+ }
}),
],
resolve: {