diff --git a/app/src/app.html b/app/src/app.html
index 6b01ab9..bb189d2 100644
--- a/app/src/app.html
+++ b/app/src/app.html
@@ -7,11 +7,22 @@
+
+
+
+
+
+
+
+
+
+
+
Audiora
@@ -43,6 +54,14 @@
%sveltekit.body%
+
+
\ No newline at end of file
diff --git a/app/static/icons/icon-128x128.png b/app/static/icons/icon-128x128.png
new file mode 100644
index 0000000..8f55565
Binary files /dev/null and b/app/static/icons/icon-128x128.png differ
diff --git a/app/static/icons/icon-144x144.png b/app/static/icons/icon-144x144.png
new file mode 100644
index 0000000..6b64492
Binary files /dev/null and b/app/static/icons/icon-144x144.png differ
diff --git a/app/static/icons/icon-152x152.png b/app/static/icons/icon-152x152.png
new file mode 100644
index 0000000..2c1a7eb
Binary files /dev/null and b/app/static/icons/icon-152x152.png differ
diff --git a/app/static/icons/icon-192x192.png b/app/static/icons/icon-192x192.png
new file mode 100644
index 0000000..bed0fda
Binary files /dev/null and b/app/static/icons/icon-192x192.png differ
diff --git a/app/static/icons/icon-256x256.png b/app/static/icons/icon-256x256.png
new file mode 100644
index 0000000..7486ef7
Binary files /dev/null and b/app/static/icons/icon-256x256.png differ
diff --git a/app/static/icons/icon-384x384.png b/app/static/icons/icon-384x384.png
new file mode 100644
index 0000000..ce72b13
Binary files /dev/null and b/app/static/icons/icon-384x384.png differ
diff --git a/app/static/icons/icon-48x48.png b/app/static/icons/icon-48x48.png
new file mode 100644
index 0000000..10a5437
Binary files /dev/null and b/app/static/icons/icon-48x48.png differ
diff --git a/app/static/icons/icon-512x512.png b/app/static/icons/icon-512x512.png
new file mode 100644
index 0000000..b0a2925
Binary files /dev/null and b/app/static/icons/icon-512x512.png differ
diff --git a/app/static/icons/icon-72x72.png b/app/static/icons/icon-72x72.png
new file mode 100644
index 0000000..dca8d4d
Binary files /dev/null and b/app/static/icons/icon-72x72.png differ
diff --git a/app/static/icons/icon-96x96.png b/app/static/icons/icon-96x96.png
new file mode 100644
index 0000000..ffc4939
Binary files /dev/null and b/app/static/icons/icon-96x96.png differ
diff --git a/app/static/manifest.json b/app/static/manifest.json
new file mode 100644
index 0000000..081ca08
--- /dev/null
+++ b/app/static/manifest.json
@@ -0,0 +1,52 @@
+{
+ "name": "Audiora",
+ "short_name": "Audiora",
+ "description": "Listen to anything, anytime, leveraging AI",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#000000",
+ "theme_color": "#000000",
+ "icons": [
+ {
+ "src": "/icons/icon-72x72.png",
+ "sizes": "72x72",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-96x96.png",
+ "sizes": "96x96",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-128x128.png",
+ "sizes": "128x128",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-144x144.png",
+ "sizes": "144x144",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-152x152.png",
+ "sizes": "152x152",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "any maskable"
+ },
+ {
+ "src": "/icons/icon-384x384.png",
+ "sizes": "384x384",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/icon-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/app/static/sw.js b/app/static/sw.js
new file mode 100644
index 0000000..c4d1ff2
--- /dev/null
+++ b/app/static/sw.js
@@ -0,0 +1,53 @@
+const CACHE_NAME = 'audiora-v1';
+const urlsToCache = [
+ '/',
+ '/manifest.json',
+ '/icons/icon-72x72.png',
+ '/icons/icon-96x96.png',
+ '/icons/icon-128x128.png',
+ '/icons/icon-144x144.png',
+ '/icons/icon-152x152.png',
+ '/icons/icon-192x192.png',
+ '/icons/icon-384x384.png',
+ '/icons/icon-512x512.png'
+];
+
+self.addEventListener('install', (event) => {
+ event.waitUntil(
+ caches.open(CACHE_NAME).then((cache) => cache.addAll(urlsToCache))
+ );
+});
+
+self.addEventListener('activate', (event) => {
+ event.waitUntil(
+ caches.keys().then((cacheNames) => {
+ return Promise.all(
+ cacheNames.map((cacheName) => {
+ if (cacheName !== CACHE_NAME) {
+ return caches.delete(cacheName);
+ }
+ })
+ );
+ })
+ );
+});
+
+self.addEventListener('fetch', (event) => {
+ event.respondWith(
+ caches.match(event.request).then((response) => {
+ if (response) {
+ return response;
+ }
+ return fetch(event.request).then((response) => {
+ if (!response || response.status !== 200 || response.type !== 'basic') {
+ return response;
+ }
+ const responseToCache = response.clone();
+ caches.open(CACHE_NAME).then((cache) => {
+ cache.put(event.request, responseToCache);
+ });
+ return response;
+ });
+ })
+ );
+});