Index: composer.json
===================================================================
--- composer.json	(revision 897df21520cd22f4f49ba240646bfd8763331023)
+++ composer.json	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -14,5 +14,6 @@
         "laravel/sanctum": "^2.11",
         "laravel/tinker": "^2.5",
-        "maatwebsite/excel": "^3.1"
+        "maatwebsite/excel": "^3.1",
+        "silviolleite/laravelpwa": "^2.0"
     },
     "require-dev": {
Index: composer.lock
===================================================================
--- composer.lock	(revision 897df21520cd22f4f49ba240646bfd8763331023)
+++ composer.lock	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -5,5 +5,5 @@
         "This file is @generated automatically"
     ],
-    "content-hash": "f6e7b78ce5a04d7a1db4e54261d9c6d1",
+    "content-hash": "61f24de9d06fa59e54b40678972f3a4c",
     "packages": [
         {
@@ -3451,4 +3451,54 @@
         },
         {
+            "name": "silviolleite/laravelpwa",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silviolleite/laravel-pwa.git",
+                "reference": "5f7135d2ee870af01793c9fdf6b1b932b546e20e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silviolleite/laravel-pwa/zipball/5f7135d2ee870af01793c9fdf6b1b932b546e20e",
+                "reference": "5f7135d2ee870af01793c9fdf6b1b932b546e20e",
+                "shasum": ""
+            },
+            "type": "library",
+            "extra": {
+                "laravel": {
+                    "providers": [
+                        "LaravelPWA\\Providers\\LaravelPWAServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "LaravelPWA\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Silvio Luis Leite",
+                    "email": "silviolleite@gmail.com"
+                }
+            ],
+            "description": "Looks like an app, feels like an app, but NOT an app.",
+            "keywords": [
+                "laravel",
+                "php",
+                "progressive web apps",
+                "pwa"
+            ],
+            "support": {
+                "issues": "https://github.com/silviolleite/laravel-pwa/issues",
+                "source": "https://github.com/silviolleite/laravel-pwa/tree/2.0.3"
+            },
+            "time": "2020-08-20T12:19:16+00:00"
+        },
+        {
             "name": "swiftmailer/swiftmailer",
             "version": "v6.3.0",
Index: config/laravelpwa.php
===================================================================
--- config/laravelpwa.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
+++ config/laravelpwa.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -0,0 +1,78 @@
+<?php
+
+return [
+    'name' => 'LaravelPWA',
+    'manifest' => [
+        'name' => env('APP_NAME', 'SaveSpace'),
+        'short_name' => 'PWA',
+        'start_url' => '/',
+        'background_color' => '#ffffff',
+        'theme_color' => '#000000',
+        'display' => 'standalone',
+        'orientation'=> 'any',
+        'status_bar'=> 'black',
+        'icons' => [
+            '72x72' => [
+                'path' => '/images/icons/icon-72x72.png',
+                'purpose' => 'any'
+            ],
+            '96x96' => [
+                'path' => '/images/icons/icon-96x96.png',
+                'purpose' => 'any'
+            ],
+            '128x128' => [
+                'path' => '/images/icons/icon-128x128.png',
+                'purpose' => 'any'
+            ],
+            '144x144' => [
+                'path' => '/images/icons/icon-144x144.png',
+                'purpose' => 'any'
+            ],
+            '152x152' => [
+                'path' => '/images/icons/icon-152x152.png',
+                'purpose' => 'any'
+            ],
+            '192x192' => [
+                'path' => '/images/icons/icon-192x192.png',
+                'purpose' => 'any'
+            ],
+            '384x384' => [
+                'path' => '/images/icons/icon-384x384.png',
+                'purpose' => 'any'
+            ],
+            '512x512' => [
+                'path' => '/images/icons/icon-512x512.png',
+                'purpose' => 'any'
+            ],
+        ],
+        'splash' => [
+            '640x1136' => '/images/icons/splash-640x1136.png',
+            '750x1334' => '/images/icons/splash-750x1334.png',
+            '828x1792' => '/images/icons/splash-828x1792.png',
+            '1125x2436' => '/images/icons/splash-1125x2436.png',
+            '1242x2208' => '/images/icons/splash-1242x2208.png',
+            '1242x2688' => '/images/icons/splash-1242x2688.png',
+            '1536x2048' => '/images/icons/splash-1536x2048.png',
+            '1668x2224' => '/images/icons/splash-1668x2224.png',
+            '1668x2388' => '/images/icons/splash-1668x2388.png',
+            '2048x2732' => '/images/icons/splash-2048x2732.png',
+        ],
+        'shortcuts' => [
+            [
+                'name' => 'Shortcut Link 1',
+                'description' => 'Shortcut Link 1 Description',
+                'url' => '/shortcutlink1',
+                'icons' => [
+                    "src" => "/images/icons/icon-72x72.png",
+                    "purpose" => "any"
+                ]
+            ],
+            [
+                'name' => 'Shortcut Link 2',
+                'description' => 'Shortcut Link 2 Description',
+                'url' => '/shortcutlink2'
+            ]
+        ],
+        'custom' => []
+    ]
+];
Index: public/serviceworker.js
===================================================================
--- public/serviceworker.js	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
+++ public/serviceworker.js	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -0,0 +1,52 @@
+var staticCacheName = "pwa-v" + new Date().getTime();
+var filesToCache = [
+    '/offline',
+    '/css/app.css',
+    '/js/app.js',
+    '/images/icons/icon-72x72.png',
+    '/images/icons/icon-96x96.png',
+    '/images/icons/icon-128x128.png',
+    '/images/icons/icon-144x144.png',
+    '/images/icons/icon-152x152.png',
+    '/images/icons/icon-192x192.png',
+    '/images/icons/icon-384x384.png',
+    '/images/icons/icon-512x512.png',
+];
+
+// Cache on install
+self.addEventListener("install", event => {
+    this.skipWaiting();
+    event.waitUntil(
+        caches.open(staticCacheName)
+            .then(cache => {
+                return cache.addAll(filesToCache);
+            })
+    )
+});
+
+// Clear cache on activate
+self.addEventListener('activate', event => {
+    event.waitUntil(
+        caches.keys().then(cacheNames => {
+            return Promise.all(
+                cacheNames
+                    .filter(cacheName => (cacheName.startsWith("pwa-")))
+                    .filter(cacheName => (cacheName !== staticCacheName))
+                    .map(cacheName => caches.delete(cacheName))
+            );
+        })
+    );
+});
+
+// Serve from Cache
+self.addEventListener("fetch", event => {
+    event.respondWith(
+        caches.match(event.request)
+            .then(response => {
+                return response || fetch(event.request);
+            })
+            .catch(() => {
+                return caches.match('offline');
+            })
+    )
+});
Index: resources/views/layouts/app.blade.php
===================================================================
--- resources/views/layouts/app.blade.php	(revision 897df21520cd22f4f49ba240646bfd8763331023)
+++ resources/views/layouts/app.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -20,5 +20,5 @@
     <link rel="stylesheet" href="{{ url('vendors/lightbox/magnific-popup.css') }}" type="text/css">
 
-
+    @laravelPWA
 </head>
 <body @if (trim($__env->yieldContent('bodyClass'))) class="@yield('bodyClass')" @endif>
Index: resources/views/layouts/auth.blade.php
===================================================================
--- resources/views/layouts/auth.blade.php	(revision 897df21520cd22f4f49ba240646bfd8763331023)
+++ resources/views/layouts/auth.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -15,4 +15,5 @@
     <!-- App styles -->
     <link rel="stylesheet" href="{{ url('assets/css/app.min.css') }}" type="text/css">
+    @laravelPWA
 </head>
 <body class="form-membership">
Index: resources/views/vendor/laravelpwa/meta.blade.php
===================================================================
--- resources/views/vendor/laravelpwa/meta.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
+++ resources/views/vendor/laravelpwa/meta.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -0,0 +1,46 @@
+<!-- Web Application Manifest -->
+<link rel="manifest" href="{{ route('laravelpwa.manifest') }}">
+<!-- Chrome for Android theme color -->
+<meta name="theme-color" content="{{ $config['theme_color'] }}">
+
+<!-- Add to homescreen for Chrome on Android -->
+<meta name="mobile-web-app-capable" content="{{ $config['display'] == 'standalone' ? 'yes' : 'no' }}">
+<meta name="application-name" content="{{ $config['short_name'] }}">
+<link rel="icon" sizes="{{ data_get(end($config['icons']), 'sizes') }}" href="{{ data_get(end($config['icons']), 'src') }}">
+
+<!-- Add to homescreen for Safari on iOS -->
+<meta name="apple-mobile-web-app-capable" content="{{ $config['display'] == 'standalone' ? 'yes' : 'no' }}">
+<meta name="apple-mobile-web-app-status-bar-style" content="{{  $config['status_bar'] }}">
+<meta name="apple-mobile-web-app-title" content="{{ $config['short_name'] }}">
+<link rel="apple-touch-icon" href="{{ data_get(end($config['icons']), 'src') }}">
+
+
+<link href="{{ $config['splash']['640x1136'] }}" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['750x1334'] }}" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1242x2208'] }}" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1125x2436'] }}" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['828x1792'] }}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1242x2688'] }}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1536x2048'] }}" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1668x2224'] }}" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['1668x2388'] }}" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+<link href="{{ $config['splash']['2048x2732'] }}" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" />
+
+<!-- Tile for Win8 -->
+<meta name="msapplication-TileColor" content="{{ $config['background_color'] }}">
+<meta name="msapplication-TileImage" content="{{ data_get(end($config['icons']), 'src') }}">
+
+<script type="text/javascript">
+    // Initialize the service worker
+    if ('serviceWorker' in navigator) {
+        navigator.serviceWorker.register('/serviceworker.js', {
+            scope: '.'
+        }).then(function (registration) {
+            // Registration was successful
+            console.log('Laravel PWA: ServiceWorker registration successful with scope: ', registration.scope);
+        }, function (err) {
+            // registration failed :(
+            console.log('Laravel PWA: ServiceWorker registration failed: ', err);
+        });
+    }
+</script>
Index: resources/views/vendor/laravelpwa/offline.blade.php
===================================================================
--- resources/views/vendor/laravelpwa/offline.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
+++ resources/views/vendor/laravelpwa/offline.blade.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -0,0 +1,7 @@
+@extends('layouts.app')
+
+@section('content')
+
+    <h1>You are currently not connected to any networks.</h1>
+
+@endsection
Index: routes/web.php
===================================================================
--- routes/web.php	(revision 897df21520cd22f4f49ba240646bfd8763331023)
+++ routes/web.php	(revision 83da0d2d319e385335bf20eb5d9bd34c877ad8bc)
@@ -16,4 +16,8 @@
 Route::get('/', function() {
     return redirect()->route('dashboard.index');
+});
+
+Route::get('/offline', function () {
+    return view('vendor/laravelpwa/offline');
 });
 
