{"id":22940833,"url":"https://github.com/scottgriv/pwa-demo-app","last_synced_at":"2025-08-12T21:31:35.586Z","repository":{"id":189623451,"uuid":"680982520","full_name":"scottgriv/PWA-Demo-App","owner":"scottgriv","description":"A Progressive Web App (PWA) demo that uses React, TypeScript, Node.js, Postgresql, and Scss/Sass/Less. Learn about PWAs and achieving a perfect Lighthouse score.","archived":false,"fork":false,"pushed_at":"2024-05-29T23:42:42.000Z","size":21312,"stargazers_count":2,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-12-08T16:46:49.871Z","etag":null,"topics":["html","javascript","less","lighthouse","postgresql","postgresql-database","pwa","pwa-app","pwa-apps","pwa-boilerplate","pwa-example","react","sass","scss","sql","typescript"],"latest_commit_sha":null,"homepage":"https://scottgriv.github.io/PWA-Demo-App/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/scottgriv.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-08-21T02:20:56.000Z","updated_at":"2024-05-29T23:42:45.000Z","dependencies_parsed_at":"2024-05-30T02:03:40.881Z","dependency_job_id":"143a6dd8-6f53-496a-841d-d9f2ba096cb7","html_url":"https://github.com/scottgriv/PWA-Demo-App","commit_stats":{"total_commits":37,"total_committers":1,"mean_commits":37.0,"dds":0.0,"last_synced_commit":"241f6fe059246ec3aaf60797addfb0b96439e3b7"},"previous_names":["scottgriv/pwa-db_web_app","scottgriv/pwa-demo_app","scottgriv/pwa-demo-app"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottgriv%2FPWA-Demo-App","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottgriv%2FPWA-Demo-App/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottgriv%2FPWA-Demo-App/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/scottgriv%2FPWA-Demo-App/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/scottgriv","download_url":"https://codeload.github.com/scottgriv/PWA-Demo-App/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":229708280,"owners_count":18111242,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["html","javascript","less","lighthouse","postgresql","postgresql-database","pwa","pwa-app","pwa-apps","pwa-boilerplate","pwa-example","react","sass","scss","sql","typescript"],"created_at":"2024-12-14T13:32:37.666Z","updated_at":"2024-12-14T13:32:38.201Z","avatar_url":"https://github.com/scottgriv.png","language":"TypeScript","funding_links":["https://www.buymeacoffee.com/scottgriv"],"categories":[],"sub_categories":[],"readme":"\u003c!-- Begin README --\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://scottgriv.github.io/PWA-Demo-App\" target=\"_blank\"\u003e\n        \u003cimg src=\"./docs/images/icon.png\" width=\"200\" height=\"200\"/\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\u003cbr\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://react.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/React-18.2.0-61DAFB?style=for-the-badge\u0026logo=react\" alt=\"React Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://typescriptlang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Typescript-5.1.6-3178C6?style=for-the-badge\u0026logo=typescript\" alt=\"TypeScript Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.postgresql.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Postgresql-16.1-4169E1?style=for-the-badge\u0026logo=postgresql\" alt=\"Postgresql Badge\" /\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://nodejs.org/en/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Node.js-18.18.2-339933?style=for-the-badge\u0026logo=node.js\" alt=\"Node.js Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"http://lesscss.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Less-4.2.0-1D365D?style=for-the-badge\u0026logo=less\" alt=\"Less Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://sass-lang.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Sass-1.58.1-CC6699?style=for-the-badge\u0026logo=sass\" alt=\"Sass Badge\" /\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/scottgriv\"\u003e\u003cimg src=\"https://img.shields.io/badge/github-follow_me-181717?style=for-the-badge\u0026logo=github\u0026color=181717\" alt=\"GitHub Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"mailto:scott.grivner@gmail.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/gmail-contact_me-EA4335?style=for-the-badge\u0026logo=gmail\" alt=\"Email Badge\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://www.buymeacoffee.com/scottgriv\"\u003e\u003cimg src=\"https://img.shields.io/badge/buy_me_a_coffee-support_me-FFDD00?style=for-the-badge\u0026logo=buymeacoffee\u0026color=FFDD00\" alt=\"BuyMeACoffee Badge\" /\u003e\u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/scottgriv/PWA-Demo-App/actions/workflows/gh-pages.yml\" target=\"_blank\"\u003e\u003cimg alt=\"GitHub Workflow Status (with event)\" src=\"https://img.shields.io/github/actions/workflow/status/scottgriv/PWA-Demo-App/gh-pages.yml?style=for-the-badge\u0026logo=github\u0026label=GitHub%20Pages\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://prgportfolio.com\" target=\"_blank\"\u003e\u003cimg src=\"https://img.shields.io/badge/PRG-Silver Project-C0C0C0?style=for-the-badge\u0026logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDIwMDEwOTA0Ly9FTiIKICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiB3aWR0aD0iMjYuMDAwMDAwcHQiIGhlaWdodD0iMzQuMDAwMDAwcHQiIHZpZXdCb3g9IjAgMCAyNi4wMDAwMDAgMzQuMDAwMDAwIgogcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+Cgo8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjAwMDAwMCwzNC4wMDAwMDApIHNjYWxlKDAuMTAwMDAwLC0wLjEwMDAwMCkiCmZpbGw9IiNDMEMwQzAiIHN0cm9rZT0ibm9uZSI+CjxwYXRoIGQ9Ik0xMiAzMjggYy04IC04IC0xMiAtNTEgLTEyIC0xMzUgMCAtMTA5IDIgLTEyNSAxOSAtMTQwIDQyIC0zOCA0OAotNDIgNTkgLTMxIDcgNyAxNyA2IDMxIC0xIDEzIC03IDIxIC04IDIxIC0yIDAgNiAyOCAxMSA2MyAxMyBsNjIgMyAwIDE1MCAwCjE1MCAtMTE1IDMgYy04MSAyIC0xMTkgLTEgLTEyOCAtMTB6IG0xMDIgLTc0IGMtNiAtMzMgLTUgLTM2IDE3IC0zMiAxOCAyIDIzCjggMjEgMjUgLTMgMjQgMTUgNDAgMzAgMjUgMTQgLTE0IC0xNyAtNTkgLTQ4IC02NiAtMjAgLTUgLTIzIC0xMSAtMTggLTMyIDYKLTIxIDMgLTI1IC0xMSAtMjIgLTE2IDIgLTE4IDEzIC0xOCA2NiAxIDc3IDAgNzIgMTggNzIgMTMgMCAxNSAtNyA5IC0zNnoKbTExNiAtMTY5IGMwIC0yMyAtMyAtMjUgLTQ5IC0yNSAtNDAgMCAtNTAgMyAtNTQgMjAgLTMgMTQgLTE0IDIwIC0zMiAyMCAtMTgKMCAtMjkgLTYgLTMyIC0yMCAtNyAtMjUgLTIzIC0yNiAtMjMgLTIgMCAyOSA4IDMyIDEwMiAzMiA4NyAwIDg4IDAgODggLTI1eiIvPgo8L2c+Cjwvc3ZnPgo=\" alt=\"Silver\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n---------------\n\n\u003ch1 align=\"center\"\u003e🖥️ PWA Demo 💻\u003c/h1\u003e\n\nThis Progressive Web App (PWA) demo showcases the cutting-edge capabilities of web technology by utilizing a robust stack including React, TypeScript, Node.js, PostgreSQL, and styling with Scss/Sass/Less. Designed as both an educational tool and a practical demonstration, it guides users through the intricacies of building a high-performance PWA capable of achieving a perfect Lighthouse score. The project not only highlights best practices for web development and performance optimization but also offers insights into creating seamless, app-like experiences on the web, making it an invaluable resource for developers looking to enhance their skills in crafting modern, efficient web applications.\n- View a demo of the project on GitHub Pages **[Here](https://scottgriv.github.io/PWA-Demo-App/)**.\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://scottgriv.github.io/PWA-Demo-App/\" target=\"_blank\"\u003e\n        \u003cimg src=\"./docs/images/demo.gif\" style=\"width: 100%;\"/\u003e\n    \u003c/a\u003e\n    \u003cbr\u003e\n    \u003ci\u003eApplication Preview\u003c/i\u003e\n\u003c/div\u003e\n\n---------------\n\n## Table of Contents\n\n- [Background Story](#background-story)\n- [Definitions](#definitions)\n- [Built With](#built-with)\n- [Getting Started](#getting-started)\n- [Notes](#notes)\n  - [Service Worker](#service-worker)\n  - [Manifest File](#manifest-file)\n  - [Push Notifications (Optional)](#push-notifications-optional)\n  - [Generate a Lighthouse Report](#generate-a-lighthouse-report)\n  - [CSV vs. Postgresql Flag](#csv-vs-postgresql-flag)\n  - [Less CSS Preprocessor](#less-css-preprocessor)\n  - [Local Deployment vs. GitHub Pages](#local-deployment-vs-github-pages)\n- [Resources](#resources)\n  - [SPA, MPA, PWA Concepts](#spa-mpa-pwa-concepts)\n  - [Technologies Referenced](#technologies-referenced)\n- [License](#license)\n- [Credits](#credits)\n\n## Background Story\n\nI wanted to demonstrate how to build a **PWA** that uses a database to store user data locally and syncs with a remote database when online. I also wanted to demonstrate how to use a service worker to cache the app shell and data as well as a manifest file to allow the user to install the app on their device.\n\n## Definitions\n\nTo turn your website into a **PWA**, you'll need the following qualifications:\n- **HTTPS** - Your site must be served over `HTTPS`. This is a requirement for service workers. If you don't have a certificate, you can use [Let's Encrypt](https://letsencrypt.org/). \u003cbr\u003e\n\u003e [!NOTE]\n\u003e If you're deploying locally, you can still achieve a **PWA** by using `localhost`, but you won't be able to use a service worker or push notifications and it is strongly recommended that you use `HTTPS` for a production deployment.\n- **Service Worker** - A [Service Worker](https://developers.google.com/web/fundamentals/primers/service-workers)) is a script that runs in the background and allows you to control how your app handles network requests and cache data. It also allows you to send push notifications to the user (see instructions below for more details).\n- **Manifest File** - A manifest file is a `JSON` file that contains metadata about your app. It allows you to specify the name of your app, the icons that will be used when the app is installed on a device, the background color of the splash screen, and more (see instructions below for more details).\n- **App Shell** - The app shell is the minimal `HTML`, `CSS`, and `JavaScript` required to power the user interface of your app. It is the first thing that is cached by the service worker and is used to provide a fast, reliable, and engaging experience for the user.\n- **Offline Data Storage** - A **PWA** must be able to store data locally on the user's device. This allows the user to continue using the app when they are offline. When the user is online, the data should be synced with a remote database.\n- **Responsive Design** - A **PWA** must be responsive and work on all devices.\n\n## Built With\n\nI used the following technologies to build this app:\n- React (Frontend)\n- TypeScript (JavaScript)\n- Node.js (Backend/Server)\n- Postgresql (Database)\n- Scss/Sass/Less (CSS Preprocessors)\n- Workbox Package (Service Worker)\n- PWA Asset Generator Package (Manifest File)\n- NPM (Package Manager)\n- Webpack (Module Bundler)\n\n\u003e [!NOTE]\n\u003e By default, the application uses `client/src/App.scss` to style the application.\n\u003e The `App.sass` and `App.css` (compiled from Less) can be used as well, they're interchangable.\n\u003e Simply uncomment out the line for the CSS Preprocessor you want to use in the `client/src/components/UserTable.tsx` file.\n\n## Getting Started\n\n1. Install Postgresql and create a database named `pwa_db_web_app`.\n- Use the `database.sql` file to create the tables and insert the data.\n2. Change your directory to the project directory and run the following commands:\n\n- Install `npm` if you haven't already:\n```bash\nnpm install\n```\n\n- Build the application: \n```bash\nnpm run build\n```\n\n- Start the client (frontend):\n```bash\ncd client\nnpm start\n```\n\n- Start the server (if using a database):\n```bash\ncd server\nnpm start\n```\n\n3. Open your browser and navigate to http://localhost:3000/PWA-Demo-App to view the PWA application.\n4. Open [Lighthouse](#generate-a-lighthouse-report) in Chrome to generate your PWA report.\n\n## Notes\n\n### Service Worker\n\n- I used [**Workbox**](https://developers.google.com/web/tools/workbox/) to generate the service worker file. To do this, I installed **Workbox** in the client directory:\n```bash\nnpm install workbox-cli --global\n```\n- Then generate the service worker file by running:\n```bash\nnpx workbox generateSW workbox-config.js\n```\n\n### Manifest File\n\n- Use [**PWA Asset Generator**](https://github.com/elegantapp/pwa-asset-generator) to automatically generate `JSON` for your `manisfest.json` file as well as the `icons` for your logo to make it **PWA** complicit.\n- To install **PWA Asset Generator** run:\n```bash\nnpm install -g pwa-asset-generator\n```\n- Then create a logo.png file in the root directory of your project. The logo should be at least 512x512 pixels. \u003cbr\u003e \n\u003e [!TIP]\n\u003e The logo should be square and have a transparent background.\n- Then run (*Assuming you are in the directory your logo file is in*):\n```bash\nnpx pwa-asset-generator logo.png icons\n```\n*The images will be created in the icons directory*.\n\n### Push Notifications (Optional)\n\n- To send [**Push Notifications**](https://developers.google.com/web/fundamentals/push-notifications), you'll need to create a **VAPID** key pair. You can do this by running the following command:\n```bash\nnpx web-push generate-vapid-keys\n```\n- Then copy the **VAPID** key pair and paste it into the `server/src/routes/notifications.ts` file.\n- Then run the following command to start the server:\n```bash\nnpm start\n```\n- Then open your browser and navigate to http://localhost:3000.\n- Then open the Chrome Dev Tools and click on the Application tab.\n- Then click on the Service Workers tab -\u003e Push link -\u003e Subscribe button -\u003e Allow button.\n- Then copy the **Endpoint** and paste it into the `server/src/routes/notifications.ts` file.\n- Then run the following command to send a push notification:\n```bash\ncurl -X POST -H \"Content-Type: application/json\" -d \"{\\\"title\\\": \\\"Hello World\\\", \\\"body\\\": \\\"This is a test notification\\\"}\" http://localhost:3001/notifications\n```\n- Then you should see a push notification in your browser.\n\n### Generate a Lighthouse Report\n\n- [**Lighthouse**](https://developers.google.com/web/tools/lighthouse) is an open-source, automated tool for improving the quality of web pages. You can run it against any web page, public or requiring authentication. It has audits for performance, accessibility, progressive web apps, and more.\n- To generate a **Lighthouse** report, open your browser and navigate to http://localhost:3000.\n- Then open the Chrome Dev Tools and click on the **Lighthouse** tab.\n- Click on the Generate Report button.\n- I achieved the following perfect scores:\n  - Performance: 100\n  - Accessibility: 100\n  - Best Practices: 100\n  - SEO: 100\n  - Progressive Web App: 100\n- References to the **Lighthouse** Report files are located in the [docs](docs) directory.\n\n\u003e [!IMPORTANT]\n\u003e Remove the BMC Widget and FontAwesome CSS references in the `index.html` file for a perfect Lighthouse Score (see comments in the file on where to remove).\n\u003e I kept these in for production purposes, but loading third-party cookies and unused CSS libraries slows down the application and is generally not a good practice.\n\n### CSV vs. Postgresql Flag\n\n- By default, I'm parsing the table from a **Comma-separated values (CSV)** file located in the `client/src/data` directory for hosting purposes. You can change this to use **Postgresql** by modifying the `client/src/App.tsx` file flag to `false` here: \n\n```typescript\n const useCsv = true;\n ```\n\n ### Less CSS Preprocessor\n\n - To use Less, install the package via npm:\n ```bash\n npm install -g less\n```\n- Then, change your directory to the `src` folder where the `App.less` file exists and run the following command to generate the `.css` file:\n```bash\nlessc App.less App.css\n```\n- Be sure to uncomment out the `.css` import in the `client/src/components/UserTable.tsx` file.\n\n ### Local Deployment vs. GitHub Pages\n \n  - By default, I'm deploying the app to **GitHub Pages**. You can change this to deploy the app locally without using the repository name `PWA-Demo-App` or to your own **GitHub Pages** by modifying the following files:\n  \n  1.  `/client/package.json` \u003cbr\u003e\n\n      **Local:** \n      ```json\n      \"homepage\": \"http://localhost:3000\",\n      ```\n      **GitHub Pages:**\n      ```json\n      \"homepage\": \"https://{your_github_username}.github.io/{your_repository_name}/\",\n      ```\n\n  2. `/client/src/index.tsx` \u003cbr\u003e\n\n      **Local:** \n      ```typescript\n      navigator.serviceWorker.register('/service-worker.js').then(registration =\u003e {\n      ```\n      **GitHub Pages:**\n      ```typescript\n      navigator.serviceWorker.register('/{your_repository_name}/service-worker.js').then(registration =\u003e {\n      ```\n\n  3. `/client/public/index.html` \u003cbr\u003e\n\n      **Local:** \n      ```html\n      \u003clink rel=\"manifest\" href=\"/manifest.json\"\u003e\n      ```\n\n      **GitHub Pages:**\n      ```html\n      \u003clink rel=\"manifest\" href=\"/{your_repository_name}/manifest.json\"\u003e\n      ```\n\n  4. `/client/public/manifest.json` \u003cbr\u003e\n\n      **Local:** \n      ```json\n      \"start_url\": \".\",\n      ```\n      **GitHub Pages:**\n      ```json\n      \"start_url\": \"/{your_repository_name}/\",\n      ```\n\n- Then `cd client/public` from the root directory and run the following command to deploy to **GitHub Pages**:\n\n  ```bash\n  npm run deploy\n  ```\n\n- If you're unfamiliar with deploying a static site to **GitHub Pages**, you can read more about it here: [**GitHub Pages**](https://pages.github.com/).\n\n## Resources\n\n### SPA, MPA, PWA Concepts\n\n- [**Progressive Web Apps**](https://web.dev/progressive-web-apps/)\n- [**Wikipedia - Progressive Web App**](https://en.wikipedia.org/wiki/Progressive_web_app)\n- [**Single-Page Applications vs Multi-Page Applications: The Battle of the Web Apps**](https://themindstudios.com/blog/spa-vs-mpa/)\n- [**Single Page Application (SPA) vs Multi Page Application (MPA): Which Is The Best?**](https://cleancommit.io/blog/spa-vs-mpa-which-is-the-king/)\n\n### Technologies Referenced\n\n- [**Service Workers**](https://developers.google.com/web/fundamentals/primers/service-workers)\n- [**Workbox**](https://developers.google.com/web/tools/workbox/)\n- [**PWA Asset Generator**](https://github.com/elegantapp/pwa-asset-generator)\n- [**Push Notifications**](https://developers.google.com/web/fundamentals/push-notifications)\n- [**Lighthouse**](https://developers.google.com/web/tools/lighthouse)\n- [**GitHub Pages**](https://pages.github.com/)\n- [**Let's Encrypt**](https://letsencrypt.org/)\n- [**Postgresql**](https://www.postgresql.org/)\n- [**React**](https://reactjs.org/)\n- [**TypeScript**](https://www.typescriptlang.org/)\n- [**Node.js**](https://nodejs.org/en/)\n- [**Scss**](https://blog.logrocket.com/the-definitive-guide-to-scss/)\n- [**Sass**](https://sass-lang.com/)\n- [**Less**](http://lesscss.org/)\n- [**NPM**](https://www.npmjs.com/)\n- [**Webpack**](https://webpack.js.org/)\n\n**Happy Coding!**\n\n## License\n\nThis project is released under the terms of the **MIT License**, which permits use, modification, and distribution of the code, subject to the conditions outlined in the license.\n- The [MIT License](https://choosealicense.com/licenses/mit/) provides certain freedoms while preserving rights of attribution to the original creators.\n- For more details, see the [LICENSE](LICENSE) file in this repository. in this repository.\n\n## Credits\n\n**Author:** [Scott Grivner](https://github.com/scottgriv) \u003cbr\u003e\n**Email:** [scott.grivner@gmail.com](mailto:scott.grivner@gmail.com) \u003cbr\u003e\n**Website:** [scottgrivner.dev](https://www.scottgrivner.dev) \u003cbr\u003e\n**Reference:** [Main Branch](https://github.com/scottgriv/PWA-Demo-App) \u003cbr\u003e\n\n---------------\n\n\u003cdiv align=\"center\"\u003e\n    \u003ca href=\"https://scottgrivner.dev\" target=\"_blank\"\u003e\n        \u003cimg src=\"./docs/images/footer.png\" width=\"100\" height=\"100\"/\u003e\n    \u003c/a\u003e\n\u003c/div\u003e\n\n\u003c!-- End README --\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottgriv%2Fpwa-demo-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscottgriv%2Fpwa-demo-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscottgriv%2Fpwa-demo-app/lists"}