We're sorry but this page doesn't work properly without JavaScript enabled. Please enable it to continue.
Feedback

Are PWAs ready to take over the world?

00:00

Formale Metadaten

Titel
Are PWAs ready to take over the world?
Untertitel
Implementing main progressive web app features in practice
Serientitel
Anzahl der Teile
490
Autor
Lizenz
CC-Namensnennung 2.0 Belgien:
Sie dürfen das Werk bzw. den Inhalt zu jedem legalen Zweck nutzen, verändern und in unveränderter oder veränderter Form vervielfältigen, verbreiten und öffentlich zugänglich machen, sofern Sie den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
Identifikatoren
Herausgeber
Erscheinungsjahr
Sprache

Inhaltliche Metadaten

Fachgebiet
Genre
Abstract
This talk offers a walk-through of the main PWA features and a comparison how they behave across different platforms (Linux, Android, iOS), on various web browsers (Firefox, Chrome, Safari). Practical code examples will come from Sojourner - a FOSDEM conference companion app. We will also discuss some UX/UI challenges and their potential solutions specific for PWAs. During this talk we will discuss the following aspects of PWA and illustrate them with practical code examples. Performance and network reliability: Service Worker strategies Offline-First operation Persistent Storage: availability, limitations, access request no login required Installation: In-browser via Add to Home Screen (A2HS) From app-store Design: choosing the right design system handling colors, icons and screen mode gracefully At the end we will summarize the state of PWAs in 2020 and for which types of applications they work best. Examples used to illustrate this talk will come from Sojourner FOSDEM conference companion app, written using Vue.js framework.
33
35
Vorschaubild
23:38
52
Vorschaubild
30:38
53
Vorschaubild
16:18
65
71
Vorschaubild
14:24
72
Vorschaubild
18:02
75
Vorschaubild
19:35
101
Vorschaubild
12:59
106
123
Vorschaubild
25:58
146
Vorschaubild
47:36
157
Vorschaubild
51:32
166
172
Vorschaubild
22:49
182
Vorschaubild
25:44
186
Vorschaubild
40:18
190
195
225
Vorschaubild
23:41
273
281
284
Vorschaubild
09:08
285
289
Vorschaubild
26:03
290
297
Vorschaubild
19:29
328
Vorschaubild
24:11
379
Vorschaubild
20:10
385
Vorschaubild
28:37
393
Vorschaubild
09:10
430
438
Faktor <Algebra>TouchscreenDemo <Programm>App <Programm>BenutzerbeteiligungWeb-ApplikationArithmetische FolgeDemo <Programm>GeradeOpen SourceSchnittmengePunktBitAdditionWeb SiteVerschlingungUltraviolett-PhotoelektronenspektroskopieAbgeschlossene MengeGüte der AnpassungInterrupt <Informatik>RückkopplungDatenmissbrauchZusammenhängender GraphSchlüsselverwaltungDifferenteComputeranimation
Demo <Programm>VerschlingungBildschirmmaskeComputeranimation
MenütechnikSchedulingGanze FunktionLesezeichen <Internet>App <Programm>ProgrammierungRückkopplungMAPVerschlingungMultiplikationsoperatorHyperbelverfahrenDeskriptive StatistikWeb SiteBitQuick-SortDemo <Programm>MinimumTUNIS <Programm>ComputeranimationFlussdiagramm
App <Programm>Web SiteInterface <Schaltung>MultiplikationsoperatorComputeranimation
Demo <Programm>Lesezeichen <Internet>EindeutigkeitDatenflussCachingDienst <Informatik>SpezialrechnerStrategisches SpielProgrammschemaApp <Programm>Lesezeichen <Internet>Arithmetische FolgeWeb-ApplikationProzess <Informatik>InformationsspeicherungProxy ServerSchedulingInterface <Schaltung>SoftwareFunktionalDateiformatWeg <Topologie>Elektronische PublikationBitMetrisches SystemDienst <Informatik>ZahlenbereichStatistikDemo <Programm>MultiplikationsoperatorCachingStrategisches SpielMixed RealityWeb-SeiteZweiBildgebendes VerfahrenDivergente ReiheDatenverwaltungVerschlingungMathematikVersionsverwaltungKonfigurationsraumMessage-PassingWeb SiteDifferenteKonfiguration <Informatik>Familie <Mathematik>Rechter WinkelSystemplattformOrdnung <Mathematik>SichtenkonzeptNotepad-ComputerMAPStabComputeranimation
TypentheorieBitSchedulingMessage-PassingEchtzeitsystemZentrische StreckungDeskriptive StatistikTwitter <Softwareplattform>DifferenteVideokonferenzElektronische PublikationOntologie <Wissensverarbeitung>MultiplikationsoperatorLesezeichen <Internet>Computeranimation
Strategisches SpielProgrammschemaSpezialrechnerDienst <Informatik>CachingInformationInformationArithmetisches MittelZweiTopologieSymboltabelleClientMultiplikationsoperatorMinkowski-MetrikEinfach zusammenhängender RaumComputeranimation
Web-ApplikationAutomatische IndexierungComputeranimation
ClientTouchscreenGraphische BenutzeroberflächeHumanoider RoboterGarbentheorieArithmetische FolgeMultiplikationsoperatorWeb SiteSuchmaschineHumanoider RoboterElektronische PublikationSystemplattformInnerer PunktAutomatische HandlungsplanungEin-AusgabeApp <Programm>ClientDemo <Programm>Computeranimation
EreignishorizontSchedulingEinfacher RingLesezeichen <Internet>Wort <Informatik>Eigentliche AbbildungTouchscreenBitApp <Programm>Computeranimation
RechenwerkApp <Programm>Lesezeichen <Internet>MultiplikationsoperatorComputeranimation
TouchscreenGraphische BenutzeroberflächePhysikalisches SystemInterface <Schaltung>App <Programm>VersionsverwaltungDifferenteWeb-ApplikationMathematikHumanoider RoboterMessage-PassingKontinuierliche IntegrationInterface <Schaltung>CASE <Informatik>Web SiteMultiplikationsoperatorStandardabweichungArithmetische FolgeImplementierungInformationPhysikalisches SystemGraphfärbungBitTouchscreenPunktDienst <Informatik>SystemplattformRückkopplungMinkowski-MetrikRichtungOrdnung <Mathematik>EvoluteMatchingBenutzerbeteiligungInverser LimesBenutzeroberflächeGeradeGüte der AnpassungIntegralUnternehmensarchitekturAutomatische DifferentiationKomplex <Algebra>ZahlenbereichProjektive EbeneProdukt <Mathematik>IdentitätsverwaltungQuick-SortUltraviolett-PhotoelektronenspektroskopieVisualisierungGruppenoperationRechter WinkelPrinzip der gleichmäßigen BeschränktheitSoftwareentwicklerComputeranimation
App <Programm>GoogolCASE <Informatik>Arithmetische FolgeLeistung <Physik>Schreiben <Datenverarbeitung>BenutzerbeteiligungDifferenteSchießverfahrenDatenbankServerPunktMultiplikationsoperatorMathematikTouchscreenDienst <Informatik>Lesezeichen <Internet>VersionsverwaltungRelativitätstheoriePhysikalisches SystemEin-AusgabeNichtlinearer OperatorSchedulingMechanismus-Design-TheorieWeb-ApplikationDebuggingAnalytische FortsetzungReibungswärmeClientFächer <Mathematik>Front-End <Software>MaschinenspracheFreewareOpen SourceSoftwareentwicklerSpieltheorieWärmeausdehnungNeunzehnSchnitt <Mathematik>NetzbetriebssystemQuellcodeARM <Computerarchitektur>Rechter WinkelAuswahlaxiomGewicht <Ausgleichsrechnung>Ultraviolett-PhotoelektronenspektroskopieEinfügungsdämpfungBlockade <Mathematik>Computeranimation
GruppenoperationGerichteter GraphPunktSchreiben <Datenverarbeitung>TermFramework <Informatik>Güte der AnpassungMultiplikationsoperatorArithmetische FolgeApp <Programm>ProgrammbibliothekBenutzerbeteiligungComputeranimation
PunktwolkeFacebookOpen SourceComputeranimation
Transkript: Englisch(automatisch erzeugt)
So the next talk is, are progressive apps ready to take over the world? I will show you some examples from my little app. I'm Jarocz Lipski. Well, I have a little company together with a better person.
Louder. Okay. Maybe I can put it closer. Okay, so my name is Jarocz Lipski. I live in Paris. I'm from Poland. I currently have a little company. We develop progressive web apps. That's our specialty, but we do other things too. So, first question for you.
What are the progressive apps? Who knows what are progressive web apps? A bit more than that, but yeah, good point. Okay. And who is actually developing progressive web apps? Okay. Quite a few people. Okay, interesting. So yeah, so there are actually many definitions of progressive web apps. I chose just a random one.
It's a set of technologies, and it's a bit blurred. The lines are not completely clear. This is just an addition to a web app, we can say. It's a progressive enhancement. Yeah, so the typical stuff that we, when we think about progressive web apps are, for example, that they are available offline.
They load fast. They use HTTPS always. They are responsive. I will talk about this later. You can install them. You can launch them from your home screen, from your mobile device.
And other things. And push notifications. I will not talk about this. Okay. So now a little demo. Yeah, so actually, before the demo, okay, I don't want to show you that. I have a question. Another question for you. Who is using a FOSDEM mobile app here? All right, almost everyone. Great. Who used this one?
Who used the Sojourner? Okay, a couple of people. Great. Thank you. So now I would like to invite you, actually, if you want, of course, to visit this link at the bottom, HTTP Sojourner Rocks, if you have a minute, right, and take a look. And at the end of the talk, I will ask you for some feedback, if you can.
I mean, if you are interested. I will be talking. I will not be waiting here, right? I will continue. But, yeah, if you want to play with it, I will be very happy. And, yeah, I can talk with you later. It's open source. It's a little app that I created two years ago.
Okay. So, yeah, so a little demo. So maybe I'll do a short demo on this. Oh, actually, does it work? No, it's not that. Not you. Sorry. Yeah, so this is actually my phone, right? So, actually, I wanted to show you a demo on my phone.
Yeah, so first thing, I will talk about this later. Well, first thing, what will happen? Well, I can just visit the link, right? I hope I don't have any. I can just visit my link, and that's how it will look. So it's a website, basically. It's loading the entire FOSM schedule.
That's why it takes a bit. Yeah, and that's how it looks. I can click on a keynote. I can click on it. We'll come back to this later, this thing that I just appeared. Stay tuned.
There are a couple of things. One killer feature, actually, here that I consider a killer feature is the fact that you notice that there is a lot of things happening at FOSM. And for me, the only way to actually enjoy, actually, the second FOSM, 2013, I think, that's 2012. So the second FOSM I arrived, I discovered mobile apps.
And this actually allowed me to, before coming here, to take a look on the program and actually decide what I want to see. So for me, the killer feature here in this app is the fact that you can bookmark things. So you can click on a link, and I can bookmark it. So for example, I wanted to bookmark the last one, so I bookmark it. And then I can take a look at my bookmarks during the day, and I can only choose from the talks I already preselected.
So I have some time to actually read the description, because each of those talks, I can read the full description. I can read the full description. I can get a bit more informed. By the way, there are also links at the bottom. You can also submit feedback from this app. It's not directly from this app, but yeah. I invite you to send feedback also through this, through the app.
So yeah, that's it for the short demo. We'll come back to this later. So coming back to my app. Oh yeah, let me just finish, because it's actually a progressive app. So the thing that is actually interesting is that I can visit the same site on the desktop, right?
And this is the same app. I have a different interface, because the device is so different that we decided to change completely the interface for the desktop. But yeah, this is the same app. It's basically a website.
As I was saying before, the progressive apps are basically websites, as in the definition. Okay, let's see, how are we with the time? Okay, great. So yeah, a bit of stats. So yesterday I had about 600 visits. It's the same as last year.
It's like 30% more than last year. But this is not the best metric. So I actually have 165 users who added more than five bookmarks. I consider them active users. I can track it somehow. I will tell you later about this. Actually, you can be completely anonymous with this app. Or you can decide to log in, and then, well, I obviously wouldn't track you, but yeah, this way.
Actually, I can also anonymously see how many bookmarks people add. So I can see this. And the second little user is that, actually in December, I also adapted it to another conference. So very, very quickly, very easily. Basically, this is one function that converts the schedule to a common format.
And this way I can use it for a different conference. And I change the interface a bit with the configuration file. So that's actually for FlowCon, which is for process geeks, for software process geeks, agile, this kind of stuff. But cool people. Also geeks, not like those corporates.
You know, yeah, hierarchical managers and stuff. No, no, no, those people are very nice. I recommend in Paris. Okay, so enough about my app. So I want to talk about just the three things about Progressive Web Apps. I wouldn't give you a full overview of Progressive Web Apps.
It's a much broader subject. We just have 20 minutes. So I just focused on those three things. I invite you to talk about the others. Obviously, what is missing here... Well, one thing I want to talk about that I removed in the end, it was about persistent storage. So you can actually store stuff persistently on a device.
So basically it works like a mobile app. So there is no need to register. There is no need to create an account or anything. I can just run my app and store my data there. It's actually possible. It works across platforms as well. So I can actually never contact any... I mean, I can just download my app and just use it.
Never connect to the network again. And another thing that is missing here is push notifications. We all hate them. Sometimes they are useful. Actually, for a conference, it could be, for example, useful if there is an emergency or there is something that could be actually useful to do. I haven't implemented them in the app yet, but I probably do it.
Okay, so let's talk about those three things. So the offline first. So the app actually is offline first. So, well, maybe a bit of technology. Okay, so let's talk about service workers for a bit. So actually service workers are just a proxy, basically.
A proxy between your app and the network that allows you to store the data in the proxy. So never contact the network again, for example. Offline first is just one of the options, actually. You can have all the mixes. So actually that's what I did in this app.
So I'm actually precaching all the resources, all the static stuff. We call it shell. I precache all the HTML, CSS and images and everything the first time you visit the site. And then it shouldn't be requested again unless it's updated. I will talk about this update in a second. So this is actually, I call it, I consider it static.
Then there is another very interesting resource that is not so static, which is actually a schedule. Which is changing a lot. More than I would hope so. I mean, I would need to probably change the app a little bit.
But for this resource I use a special strategy. Because in the service worker we can have different strategies. There is a good resource about this. At the end I added a link. So actually what happens here, if you follow the numbers, right? So first I have my browser, my page. We request the service worker for a schedule.
And then the service worker will check if the schedule is already in cache. And if it's already in cache, number three, it will respond. At the same time, it will send a request to the network to check if there is a new version. So this way, you can have your schedule immediately visible. I don't have to wait for a network if I'm on a GPS or something, or 3G.
But in the background, the schedule will actually update. And if it updates, that's actually also pretty cool. What we can do, what I can do is I can catch the signal. Exactly, because it's changing all the time. So I can show you a quick demo. So actually this message that you see here, the new schedule is available, is actually this.
So in the background, I actually send a request. The schedule itself is a couple of megabytes. So it's a pretty big JSON file, and also pretty expensive to parse. So that's why I make this request in the background.
So I can either force the user to refresh, but that could be a bit abrupt. Maybe I will do it later. I can actually show a message to ask the user, do you want to refresh the schedule now or not? So I can click refresh. It's a bit slow, to be honest. I need to put it in another thread, probably. So now the schedule should be updated.
The schedule itself, the talks itself, descriptions, videos, links, etc. And the third thing, and the third types of resources, I would like to discuss here, are the resources that are actually real-time.
So this is another killer feature I didn't tell you about. So I'm not caching them at all. So there is a little thingy. I noticed that it's not completely clear what it is. That's why UX UI is very important. Okay, let's continue like this. So UX UI is actually this little thingy, this little symbol, means that the room is full. Actually, we can also check this room, but this thing is actually coming from FOSDEM.
There's a FOSDEM API that shows you the room is full or empty. The little thingy tells you that the room is full. I tried to save space here. That's why it should be some information about this.
But this is another cool thing. And this is actually real-time. So if I lose connection, this will stop updating, basically, or disappear. I don't remember exactly. Okay, so this is about offline. Ah, the second offline first. A cool thing about offline first I wanted to show you is actually the fact that I can search. So I never considered this, but actually, I didn't show you this, but I should actually go offline.
Well, you're talking about offline first. Sorry, I forgot to do it. So basically, I'm offline, so I can search for progressive web apps. And the search works, because I have all the index on the local device.
So I can search locally without any access to network. I can search for JavaScript. So this is pretty cool. Actually, the way I did it is actually pretty simple. I just search in a JSON file.
I do some simple ranking, so the title is more important than the other things. But it's very simple. You can actually have full search engines in JavaScript on the client side. Okay, enough about front-end, about offline first. Now something about installation. So how do progressive apps actually install? This is pretty magical.
Actually, the first time you visit a website, the site installs itself. And the user has nothing to do with it, actually. Then there's something that we more consider as an installation. We call it add to home screen. So actually, I wouldn't show you this, because it's not so simple to show. But there could be a little banner here that I'm implementing
that will ask you to add something to the home screen. It basically works on every platform. So it works on... Well, I will show you where it works, actually. This is it. So on Chrome, it works everywhere, even on desktop. So you can add an app to the desktop, on Linux as well. On Firefox, it works only on Android.
And on Safari, it works on iOS. And actually, the biggest group of my app users actually use iOS, use iPhones. This is pretty interesting. Because I suppose the Android app is good enough. So everybody is sticking with the Android app, the native one. But iOS users seem to like my app. That's cool.
So a little demo very quickly. So basically... I have wet hands, sorry. So add to home screen basically will add something like this to my screen if I click it. And then it will start behaving like a normal app.
So yeah, it's actually... I'm actually fully offline. So it's actually parsing the schedule. Because it's pretty big. I should probably optimize it a bit. So the app fully works. I can add my bookmarks even. And they will stay offline in my device. And they will synchronize.
The way I do it, I use proprietary software. Sorry for that. I use Firebase. I could actually implement it with another one, with Paste. But I haven't had time yet to do it. So this is how it looks. So it looks pretty native. Right? It looks pretty like a native app. Yeah. You know, it stays as an app.
I can switch to it. Et cetera. Okay. How much time do we have? Four minutes. So the last... Yeah, sorry. Yes. Ten minutes left. Oh, great. Because there's another five minutes for questions. Cool. I will try to leave some room for questions. Because I'm really interested. So if you have some questions, feedback about the app, I'm really interested. Okay. And what is also cool...
Well, what is also important is actually we need to update those progressive apps sometimes. So here is actually another... Sorry. It's not very visible. So it says new version is available. And I can click refresh. So basically what happens with the service worker is that if the service worker detects a new version, it downloads itself, but it doesn't activate itself.
It will activate itself next time I visit the site. So what I can do, I can detect this information. There's new version available. And show a message to the user. Ah, there's a new version. Refresh. If you want to refresh immediately. So actually this is pretty cool. I saw some discussion yesterday on the... There could be some issue with one of the native mobile apps, because the room names
don't match exactly to what's encoded in the app. And it's difficult to update a mobile app, a native app, a day before conference. Because even if you do it, even if you release a new version, users will not download it.
And here I can make a new change. I would immediately see this five minutes later with the continuous integration. It will automatically pop up. So actually it behaves like a web app, like a website. So there is no problem of versioning. There is no problem of... This is a big selling point of progressive web apps.
So they are always up to date. Always fresh. So this is... Yeah. So for example, this is one of the use cases for progressive web apps for me. Conference apps. So the stuff that changes quickly, that you need to maybe adapt very quickly. Or that you use only for a few days and then forget. So I don't need to install anything native on my phone.
I just install a little web app. Or even not install. If I prefer. If I can prefer, I can add it to my home screen. If I prefer, I can just use it as a website. So this is pretty cool. Yes. And the next subject... Yeah. Sorry. The order is the new worker. So yeah. Actually my little Nokia is here.
I will try to switch it on. Actually the battery is actually dead. Oh yeah. It's starting up. So actually this is the evolution of the design of the interface. I wouldn't show you the intermediate step. So actually the Sojourner app is a descendant of an old app for Nokia N900 that I discovered a couple of years. I still have it in Nokia. I still sometimes use it. So actually and the first progressive app that I developed was actually based on this
interface. It was very similar to this one. And then I collaborated with the designer. And I really suggest you to do it because especially for mobile devices the user experience is very important. We have a very limited screen space. We have...
Well there are normal people out there. I mean I know Fosdom is a bit special so yeah you would accept interface like this but what does colors mean? What does it do? But yeah definitely normal users much more prefer something more beautiful. Yes I definitely recommend you look into the design and actually that's what differentiates
your... Can I say product? Your project, right? Often. I mean often we forget about this aspect. It's really important. One important mention I wanted to make is that if you know a bit about the front end,
So there are design systems. There is this idea to for example follow Google guidelines that are Google material design and Apple for example has human interface guidelines. And there's another thing from Microsoft. So the question is if I develop a progressive app, what should I do?
The progressive app can work anywhere. We work on Safari on our iPhone. We work on my Android. We work on the desktop. What do I do? Which interface? Which standards do I adapt? And that's a very good question. Actually yes you could implement different interfaces for different devices but that's a mess. That's like a direction going to the native apps.
This is the same direction that developing separate app for each platform. Well if you want really good experience then yes. Perhaps you could do it. But what I really recommend you to do is actually develop your own style. Develop your own identity, visual identity, and try to follow it.
So actually the more you diverge from the standard material design of something, the better it will look because it will be yours. It will be yours or your company. Obviously we live in the commercial context too. So actually a good idea for me is to try to diverge, to create something different. Not try to replicate exactly the standard interface guidelines from anyone.
So I think it's an interesting advice to try to make it different because the more it's similar, because it will look like material design but it's slightly different. It's called uncanny valley. It looks slightly different so it feels wrong. So it's better to make it completely different than if it's right.
So I didn't completely achieve it. I'm actually basing my design on material design but pretty much modified. So just to finish, we are running out of time. Are progressive apps ready to take over the world? The answer is it depends.
There are some use cases that are much better in. I think conference is a good example. I think progressive apps give us more power as a front-end developer. It's just a continuation of the more features to the front-end. I see them also as a descendant of stuff like Firefox OS.
I was a big fan of this one. The idea to write apps in web technologies. So I find it interesting. In relation to free open source, I think progressive apps could be a step to break the Android versus iOS duopoly.
Because if at some point all your apps, all your important apps are web apps, then you don't care which device you use. Many users can just propose Linux because most of the stuff they use on the web. Most of the apps they use on the web. So I think if we can get more progressive web apps,
then perhaps it will be easier to switch between Android, iOS and maybe some free open source system that will emerge. There will be no friction. Friction will be lower to switch. Because if I lose all my apps, if I switch the operating system, it sucks. So obviously there are use cases for native apps.
So I'm not telling you to only use progressive apps. But it's developing. It's an interesting technology. Okay. That's all I wanted to say. Thank you very much. So if you have any questions or feedback, please shoot now or later if you have time. Do you have some questions?
Hi. There are a couple of difference between native application and PWA, such as speed and removing cache. How to solve it? You mean, yeah. I mean, if you want to write an AR, VR app, for example.
They even start out for this, right? But if you try to do something that requires native power or write a game, I would stick to the native apps, unfortunately, right? So far. But the web is progressing. We just saw what you can do with JavaScript, right? You can write games in JavaScript, too. So basically, it's just a web app.
So, well, they are ready. They are getting ready. But yeah, I think this is a wrong distinction. Actually, I have a text here saying, why progressive apps versus native is the wrong question to ask. I wouldn't ask this question. I think, let's use the best tool for the task.
Cheers. And do you use WebSockets behind notifications or just like querying all the time the server? No, no. The notifications actually is a mechanism built into the service worker. So the service worker knows that the new version is available and it will send something in my...
So it's all happening in the front end. Okay, but... I make an HTTP request to check if the new version is available. So it's querying all the time. Wait. Is it WebSocket client behind or just... No, it's not WebSocket. But if you ask about the schedule,
yes, actually, it's polling. It's polling every minute. But actually, it's not downloading the whole thing because it's checking the ETag, you know, the last modified ETag. Okay, just tag. Yeah, yeah. So it's checking the header, right? I send a checksum. Oh, it's modified. Okay, I download the whole thing. So it's not... I think it will be better if you use WebSocket client just try for changes and the server will notify you about each change.
You are right. I was thinking about something even better, right? I'm actually using Firebase, as I said, if you know this technology, right? So I could put the whole schedule in Firebase and Firebase, well, it's a real-time database. So push me down there. Okay, I got it. But I wanted to increase the dependency on Google. So that's why I keep it minimal. Only to... Firebase is actually used for bookmarks
to actually synchronize them between devices because if I... I can actually log in in this app. I didn't show you that. I can log in and then I can have my bookmarks between all the devices the same. I will show it very quickly. Is it okay? Does it answer your question? I'm trying my best.
Yeah, so there are very good resources about this. I didn't include them in the talk. But yeah, it's approaching. So actually you have notifications. You have geolocation. You have camera. You cannot ask Bluetooth, as far as I know, for example, from the web yet, right?
So obviously, there will be things that you couldn't do. And it's like a website, basically. But as usual, it keeps surprising me how much you can do each next year. But it's really evolving. Like two years ago, there wasn't an add-to-home screen on iOS. In 2018, it was added.
It's evolving very quickly. Yeah, so just to very quickly actually log in. I can add you my... Ah, it's not here. Yeah, so I can actually log into this app and then synchronize bookmarks between devices.
I think we run out of time. Are there any specific frameworks that make it easy to write progressive web apps? Yeah, good question. I use Workbox. That's the library, very popular one. Sorry, yeah, sorry. So me, in terms of technology, I use Vue.js here.
But yeah, the library that actually enables progressive apps is called Workbox. Okay. Thank you. Thank you. Thank you, Alex.