86 lines
17 KiB
Plaintext
86 lines
17 KiB
Plaintext
[38;5;12m [39m[38;2;255;187;0m[1m[4mAwesome Service Workers [0m[38;5;14m[1m[4m![0m[38;2;255;187;0m[1m[4mAwesome[0m[38;5;14m[1m[4m (https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)[0m[38;2;255;187;0m[1m[4m (https://github.com/sindresorhus/awesome)[0m
|
||
|
||
[38;5;12mA curated collection of service worker resources.[39m
|
||
|
||
|
||
[38;5;12m>Service[39m[38;5;12m [39m[38;5;12mworkers[39m[38;5;12m [39m[38;5;12mare[39m[38;5;12m [39m[38;5;12mat[39m[38;5;12m [39m[38;5;12mthe[39m[38;5;12m [39m[38;5;12mheart[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mevery[39m[38;5;12m [39m[38;5;12mprogressive[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapp.[39m[38;5;12m [39m[38;5;12mTheir[39m[38;5;12m [39m[38;5;12mpersistent[39m[38;5;12m [39m[38;5;12mnature[39m[38;5;12m [39m[38;5;12mallows[39m[38;5;12m [39m[38;5;12mprogressive[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapps[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mfulfill[39m[38;5;12m [39m[38;5;12mour[39m[38;5;12m [39m[38;5;12mexpectations[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mwhat[39m[38;5;12m [39m[38;5;12man[39m[38;5;12m [39m[38;5;12mapp[39m[38;5;12m [39m[38;5;12mshould[39m[38;5;12m [39m[38;5;12mdo.[39m[38;5;12m [39m[38;5;12mThey[39m[38;5;12m [39m[38;5;12mare[39m[38;5;12m [39m[38;5;12mthe[39m[38;5;12m [39m[38;5;12mmissing[39m[38;5;12m [39m[38;5;12mlink[39m[38;5;12m [39m[38;5;12mbetween[39m[38;5;12m [39m[38;5;12mwhat[39m[38;5;12m [39m
|
||
[38;5;12monly[39m[38;5;12m [39m[38;5;12mnative[39m[38;5;12m [39m[38;5;12mapps[39m[38;5;12m [39m[38;5;12mcould[39m[38;5;12m [39m[38;5;12mdo[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m[38;5;12mwhat[39m[38;5;12m [39m[38;5;12mmodern[39m[38;5;12m [39m[38;5;12mprogressive[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapps[39m[38;5;12m [39m[38;5;12mcan[39m[38;5;12m [39m[38;5;12mdo.[39m
|
||
[38;5;11m[1m▐[0m[38;5;12m [39m
|
||
[38;5;11m[1m▐[0m[38;5;12m [39m[38;5;12m-- [39m
|
||
|
||
[38;5;12mIf you want to contribute, please read the [39m[38;5;14m[1mcontribution guidelines[0m[38;5;12m (contributing.md).[39m
|
||
|
||
[38;2;255;187;0m[4mContents[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mMust Reads[0m[38;5;12m (#must-reads)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mLearning Resources[0m[38;5;12m (#learning-resources)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mReference[0m[38;5;12m (#reference)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mBrowser Support[0m[38;5;12m (#browser-support)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mLibraries and Tools[0m[38;5;12m (#libraries-and-tools)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mVideos[0m[38;5;12m (#videos)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mCase Studies[0m[38;5;12m (#case-studies)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mRelated Technologies[0m[38;5;12m (#related-technologies)[39m
|
||
|
||
[38;2;255;187;0m[4mMust Reads[0m
|
||
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mBuilding[0m[38;5;14m[1m [0m[38;5;14m[1mProgressive[0m[38;5;14m[1m [0m[38;5;14m[1mWeb[0m[38;5;14m[1m [0m[38;5;14m[1mApps[0m[38;5;14m[1m [0m[38;5;14m[1m-[0m[38;5;14m[1m [0m[38;5;14m[1mO'Reilly[0m[38;5;12m [39m[38;5;12m(https://pwabook.com/oreillyasw)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mA[39m[38;5;12m [39m[38;5;12mhands-on[39m[38;5;12m [39m[38;5;12mguide[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m[38;5;12mreference[39m[38;5;12m [39m[38;5;12mfor[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m[38;5;12mworkers,[39m[38;5;12m [39m[38;5;12mcaching[39m[38;5;12m [39m[38;5;12mstrategies,[39m[38;5;12m [39m[38;5;12mpush[39m[38;5;12m [39m[38;5;12mnotifications,[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m[38;5;12mmore.[39m[38;5;12m [39m[38;5;12mEverything[39m[38;5;12m [39m[38;5;12myou[39m[38;5;12m [39m[38;5;12mneed[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mbuild[39m[38;5;12m [39m[38;5;12ma[39m[38;5;12m [39m
|
||
[38;5;12mmodern[39m[38;5;12m [39m[38;5;12mprogressive[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapp.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mIntroduction to Service Worker[0m[38;5;12m (http://www.html5rocks.com/en/tutorials/service-worker/introduction/) - A gentle introduction to service workers.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mOffline Web Applications Using IndexedDB & Service Worker[0m[38;5;12m (https://www.udacity.com/course/offline-web-applications--ud899) - A great Udacity course introducing service workers and IndexedDB.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mService Workers Explained[0m[38;5;12m (https://github.com/slightlyoff/ServiceWorker/blob/master/explainer.md) - Service workers explained by [39m[38;5;14m[1mAlex Russell[0m[38;5;12m (https://github.com/slightlyoff).[39m
|
||
|
||
[38;2;255;187;0m[4mLearning Resources[0m
|
||
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mBuilding[0m[38;5;14m[1m [0m[38;5;14m[1mOffline[0m[38;5;14m[1m [0m[38;5;14m[1mSites[0m[38;5;14m[1m [0m[38;5;14m[1mwith[0m[38;5;14m[1m [0m[38;5;14m[1mServiceWorkers[0m[38;5;14m[1m [0m[38;5;14m[1mand[0m[38;5;14m[1m [0m[38;5;14m[1mUpUp[0m[38;5;12m [39m[38;5;12m(https://dev.opera.com/articles/offline-with-upup-service-workers/)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mA[39m[38;5;12m [39m[38;5;12mgeneral[39m[38;5;12m [39m[38;5;12mintroduction[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m[38;5;12mworkers[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m[38;5;12musing[39m[38;5;12m [39m[38;5;12mUpUp[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mprovide[39m[38;5;12m [39m[38;5;12moffline[39m[38;5;12m [39m
|
||
[38;5;12mfunctionality[39m[38;5;12m [39m[38;5;12min[39m[38;5;12m [39m[38;5;12mminutes.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mIntroduction to Service Worker[0m[38;5;12m (http://www.html5rocks.com/en/tutorials/service-worker/introduction/)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mService Workers 101[0m[38;5;12m (https://github.com/delapuente/service-workers-101) - An infographic summarizing the most important parts of service workers API.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mServiceWorker Cookbook by Mozilla[0m[38;5;12m (https://serviceworke.rs/) - A collection of recipes for different use cases.[39m
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mThe[0m[38;5;14m[1m [0m[38;5;14m[1mcopy[0m[38;5;14m[1m [0m[38;5;14m[1m&[0m[38;5;14m[1m [0m[38;5;14m[1mpaste[0m[38;5;14m[1m [0m[38;5;14m[1mguide[0m[38;5;14m[1m [0m[38;5;14m[1mto[0m[38;5;14m[1m [0m[38;5;14m[1myour[0m[38;5;14m[1m [0m[38;5;14m[1mfirst[0m[38;5;14m[1m [0m[38;5;14m[1mService[0m[38;5;14m[1m [0m[38;5;14m[1mWorker[0m[38;5;12m [39m[38;5;12m(https://remysharp.com/2016/03/22/the-copy--paste-guide-to-your-first-service-worker)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mShortest[39m[38;5;12m [39m[38;5;12mavailable[39m[38;5;12m [39m[38;5;12mintroduction,[39m[38;5;12m [39m[38;5;12mby[39m[38;5;12m [39m[38;5;14m[1mRemy[0m[38;5;14m[1m [0m[38;5;14m[1mSharp[0m[38;5;12m [39m
|
||
[38;5;12m(https://github.com/remy).[39m
|
||
[38;5;12m- [39m[38;5;14m[1mThe offline cookbook[0m[38;5;12m (https://jakearchibald.com/2014/offline-cookbook/) - The bible of service worker Patterns by Jake Archibald.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mDesigning Offline-First Web Apps[0m[38;5;12m (http://alistapart.com/article/offline-first) - A fascinating look at design and UX considerations for dealing with various states of connectivity.[39m
|
||
|
||
[38;2;255;187;0m[4mReference[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mBackground Sync Spec[0m[38;5;12m (https://wicg.github.io/BackgroundSync/spec/) - The WIP spec for Background Sync.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mService Workers - W3C Specification[0m[38;5;12m (https://www.w3.org/TR/service-workers/) - The official service workers spec.[39m
|
||
|
||
[38;2;255;187;0m[4mBrowser Support[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mCan I Use - Service Workers[0m[38;5;12m (http://caniuse.com/#feat=serviceworkers) - Up-to-date browser support table of ServiceWorker API.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mJake Archibald - Is Service Worker ready?[0m[38;5;12m (https://jakearchibald.github.io/isserviceworkerready/) - Current status of ServiceWorker support in different browsers.[39m
|
||
|
||
[38;2;255;187;0m[4mLibraries and Tools[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mUpUp[0m[38;5;12m (http://upup.rocks/) - A popular service worker library providing complete offline functionality for your site in 1 line of code.[39m
|
||
[38;5;12m- [39m[38;5;14m[1msw-toolbox[0m[38;5;12m (https://github.com/GoogleChrome/sw-toolbox/) - A collection of simple helpers to simplify implementing common runtime caching patterns.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mManifest Generator[0m[38;5;12m (https://brucelawson.github.io/manifest/) - Generate a web app manifest, required for push notifications and installable web apps.[39m
|
||
[38;5;12m- [39m[38;5;14m[1msw-precache[0m[38;5;12m (https://github.com/GoogleChrome/sw-precache/) - Generates a service worker to cache your local App Shell resources.[39m
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1msw-offline-google-analytics[0m[38;5;12m [39m[38;5;12m(https://developers.google.com/web/updates/2016/07/offline-google-analytics)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mA[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m[38;5;12mworker[39m[38;5;12m [39m[38;5;12mhelper[39m[38;5;12m [39m[38;5;12mlibrary[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mretry[39m[38;5;12m [39m[38;5;12moffline[39m[38;5;12m [39m[38;5;12mGoogle[39m[38;5;12m [39m[38;5;12mAnalytics[39m[38;5;12m [39m[38;5;12mrequests[39m[38;5;12m [39m[38;5;12mwhen[39m[38;5;12m [39m[38;5;12ma[39m[38;5;12m [39m[38;5;12mconnection[39m[38;5;12m [39m[38;5;12mis[39m[38;5;12m [39m
|
||
[38;5;12mavailable.[39m
|
||
[38;5;12m- [39m[38;5;14m[1mWorkbox[0m[38;5;12m (https://developers.google.com/web/tools/workbox/) - a set of libraries and Node modules that make it easy to cache assets and take full advantage of features used to build progressive web apps.[39m
|
||
|
||
[38;2;255;187;0m[4mVideos[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mInstant Loading: Building offline-first Progressive Web Apps - Google I/O 2016[0m[38;5;12m (https://youtu.be/cmGr0RszHc8) - A quick dive into the most common technologies and techniques for building progressive web apps.[39m
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mOffline[0m[38;5;14m[1m [0m[38;5;14m[1mWeb[0m[38;5;14m[1m [0m[38;5;14m[1mApplications[0m[38;5;14m[1m [0m[38;5;14m[1mUsing[0m[38;5;14m[1m [0m[38;5;14m[1mIndexedDB[0m[38;5;14m[1m [0m[38;5;14m[1m&[0m[38;5;14m[1m [0m[38;5;14m[1mService[0m[38;5;14m[1m [0m[38;5;14m[1mWorker[0m[38;5;12m [39m[38;5;12m(https://www.udacity.com/course/offline-web-applications--ud899)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mThis[39m[38;5;12m [39m[38;5;12mfree[39m[38;5;12m [39m[38;5;12mUdacity[39m[38;5;12m [39m[38;5;12mcourse[39m[38;5;12m [39m[38;5;12mis[39m[38;5;12m [39m[38;5;12ma[39m[38;5;12m [39m[38;5;12mmust[39m[38;5;12m [39m[38;5;12mif[39m[38;5;12m [39m[38;5;12myou're[39m[38;5;12m [39m[38;5;12mplanning[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mdive[39m[38;5;12m [39m[38;5;12mdeep[39m[38;5;12m [39m[38;5;12minto[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m
|
||
[38;5;12mworkers.[39m
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mInstant[0m[38;5;14m[1m [0m[38;5;14m[1mLoading[0m[38;5;14m[1m [0m[38;5;14m[1mwith[0m[38;5;14m[1m [0m[38;5;14m[1mService[0m[38;5;14m[1m [0m[38;5;14m[1mWorkers[0m[38;5;14m[1m [0m[38;5;14m[1m(Chrome[0m[38;5;14m[1m [0m[38;5;14m[1mDev[0m[38;5;14m[1m [0m[38;5;14m[1mSummit[0m[38;5;14m[1m [0m[38;5;14m[1m2015)[0m[38;5;12m [39m[38;5;12m(https://www.youtube.com/watch?v=jCKZDTtUA2A)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mExplains[39m[38;5;12m [39m[38;5;12mhow[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mstructure[39m[38;5;12m [39m[38;5;12myour[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapp[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12moptimize[39m[38;5;12m [39m[38;5;12mload[39m[38;5;12m [39m[38;5;12mtime[39m[38;5;12m [39m[38;5;12mfor[39m[38;5;12m [39m[38;5;12minitial[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m[38;5;12mreturn[39m[38;5;12m [39m[38;5;12mvisitors,[39m[38;5;12m [39m[38;5;12mand[39m[38;5;12m [39m
|
||
[38;5;12mcover[39m[38;5;12m [39m[38;5;12mhelpful[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m[38;5;12mworker[39m[38;5;12m [39m[38;5;12mlibraries[39m[38;5;12m [39m[38;5;12mthat[39m[38;5;12m [39m[38;5;12mminimize[39m[38;5;12m [39m[38;5;12mthe[39m[38;5;12m [39m[38;5;12mamount[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mboilerplate[39m[38;5;12m [39m[38;5;12mcode[39m[38;5;12m [39m[38;5;12myou'll[39m[38;5;12m [39m[38;5;12mhave[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mwrite.[39m
|
||
|
||
[38;2;255;187;0m[4mCase Studies[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mService Workers in Production[0m[38;5;12m (https://developers.google.com/web/showcase/case-study/service-workers-iowa) - A case-study about how Google I/O 2015 web app was built.[39m
|
||
[38;5;12m-[39m[38;5;12m [39m[38;5;14m[1mMeasuring[0m[38;5;14m[1m [0m[38;5;14m[1mthe[0m[38;5;14m[1m [0m[38;5;14m[1mReal-world[0m[38;5;14m[1m [0m[38;5;14m[1mPerformance[0m[38;5;14m[1m [0m[38;5;14m[1mImpact[0m[38;5;14m[1m [0m[38;5;14m[1mof[0m[38;5;14m[1m [0m[38;5;14m[1mService[0m[38;5;14m[1m [0m[38;5;14m[1mWorkers[0m[38;5;12m [39m[38;5;12m(https://developers.google.com/web/showcase/2016/service-worker-perf)[39m[38;5;12m [39m[38;5;12m-[39m[38;5;12m [39m[38;5;12mOne[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mthe[39m[38;5;12m [39m[38;5;12mmost[39m[38;5;12m [39m[38;5;12msignificant[39m[38;5;12m [39m[38;5;12mbenefits[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mservice[39m[38;5;12m [39m[38;5;12mworkers[39m[38;5;12m [39m[38;5;12m(from[39m[38;5;12m [39m[38;5;12ma[39m[38;5;12m [39m
|
||
[38;5;12mperformance[39m[38;5;12m [39m[38;5;12mperspective,[39m[38;5;12m [39m[38;5;12mat[39m[38;5;12m [39m[38;5;12mleast)[39m[38;5;12m [39m[38;5;12mis[39m[38;5;12m [39m[38;5;12mtheir[39m[38;5;12m [39m[38;5;12mability[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mproactively[39m[38;5;12m [39m[38;5;12mcontrol[39m[38;5;12m [39m[38;5;12mthe[39m[38;5;12m [39m[38;5;12mcaching[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12massets.[39m[38;5;12m [39m[38;5;12mA[39m[38;5;12m [39m[38;5;12mweb[39m[38;5;12m [39m[38;5;12mapplication[39m[38;5;12m [39m[38;5;12mthat[39m[38;5;12m [39m[38;5;12mcan[39m[38;5;12m [39m[38;5;12mcache[39m[38;5;12m [39m[38;5;12mall[39m[38;5;12m [39m[38;5;12mof[39m[38;5;12m [39m[38;5;12mits[39m[38;5;12m [39m[38;5;12mnecessary[39m[38;5;12m [39m[38;5;12mresources[39m[38;5;12m [39m[38;5;12mshould[39m[38;5;12m [39m[38;5;12mload[39m[38;5;12m [39m[38;5;12msubstantially[39m[38;5;12m [39m[38;5;12mfaster[39m[38;5;12m [39m[38;5;12mfor[39m[38;5;12m [39m[38;5;12mreturning[39m[38;5;12m [39m
|
||
[38;5;12mvisitors.[39m[38;5;12m [39m[38;5;12mBut[39m[38;5;12m [39m[38;5;12mwhat[39m[38;5;12m [39m[38;5;12mdo[39m[38;5;12m [39m[38;5;12mthese[39m[38;5;12m [39m[38;5;12mgains[39m[38;5;12m [39m[38;5;12mactually[39m[38;5;12m [39m[38;5;12mlook[39m[38;5;12m [39m[38;5;12mlike[39m[38;5;12m [39m[38;5;12mto[39m[38;5;12m [39m[38;5;12mreal[39m[38;5;12m [39m[38;5;12musers?[39m[38;5;12m [39m[38;5;12mAnd[39m[38;5;12m [39m[38;5;12mhow[39m[38;5;12m [39m[38;5;12mdo[39m[38;5;12m [39m[38;5;12myou[39m[38;5;12m [39m[38;5;12meven[39m[38;5;12m [39m[38;5;12mmeasure[39m[38;5;12m [39m[38;5;12mthis?[39m
|
||
|
||
[38;2;255;187;0m[4mRelated Technologies[0m
|
||
|
||
[38;5;12m- [39m[38;5;14m[1mApp Install Banners[0m[38;5;12m (https://github.com/TalAter/awesome-progressive-web-apps#installable-web-apps)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mBackground Sync[0m[38;5;12m (https://github.com/TalAter/awesome-progressive-web-apps#background-sync)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mCacheStorage API[0m[38;5;12m (https://github.com/TalAter/awesome-progressive-web-apps#cachestorage-api)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mIndexedDB[0m[38;5;12m (https://github.com/TalAter/awesome-progressive-web-apps#indexeddb)[39m
|
||
[38;5;12m- [39m[38;5;14m[1mPush Notifications[0m[38;5;12m (https://github.com/TalAter/awesome-progressive-web-apps#push-notifications)[39m
|