Dramatically improve website speed with Partytown

Поділитися
Вставка
  • Опубліковано 1 лют 2025

КОМЕНТАРІ • 205

  • @thelaitas
    @thelaitas 2 роки тому +970

    This is probably the first time I've actually LOLed because I had to integrate those three things in that order

    • @yoshcode
      @yoshcode 2 роки тому +24

      Same lol

    • @mazwrld
      @mazwrld 2 роки тому +22

      First time?? Damn ur missing out

    • @faraonch
      @faraonch 2 роки тому +4

      Please invite me to the party!

    • @risingdamp220gaming6
      @risingdamp220gaming6 2 роки тому +4

      I too was triggered by the trinity.

    • @scattagain
      @scattagain 2 роки тому +20

      Fun Fact: LOLed is supposed to say "Laughed Out Loud" but it just says "Laugh Out Louded"

  • @philodox13
    @philodox13 2 роки тому +222

    Web Workers can't interact with the DOM, but it looks like they're using a data channel to pass all DOM calls though. States on their site "may not be suited for UI intensive scripts". Worth a look. Thanks for the video.

    • @DK-ox7ze
      @DK-ox7ze 2 роки тому +17

      Web workers aren't allowed to interact with the DOM because otherwise it will create race conditions between worker and main thread. And that can become very messy and cause difficult to find bugs.

  • @Thorax232
    @Thorax232 2 роки тому +151

    NextJS has first class support for PartyTown integrated with their tag. Makes it even easier to pop in like it were a normal script tag.

    • @martiananomaly
      @martiananomaly 2 роки тому +11

      Yet another reason why NextJS is the best.

    • @cau8777
      @cau8777 2 роки тому +2

      Its in beta and Nextjs also has as experimental flag extrategy=worker for scripts that seems to do the same ?

    • @Thorax232
      @Thorax232 2 роки тому +2

      @@cau8777 I believe this is because PartyTown isn't v1 yet. They don't consider it to be a full release.

    • @albinmiftari1832
      @albinmiftari1832 Рік тому

      Is that why I only have the issue on my vanilla js webpage? Nice.

    • @themedleb
      @themedleb 4 місяці тому

      Astro is the easiest as far as I can see.

  • @Dude29
    @Dude29 2 роки тому +9

    Insane how your sarcastic description fit the exact scenario I had to work with a couple months back

  • @basudevadhikari22
    @basudevadhikari22 2 роки тому +8

    Misko Hevery, creator or Angular JS, Angular 2, Quick and Partytime.. Absolute Legend

    • @hamatoYogi
      @hamatoYogi 2 роки тому

      Partytown is actually Adam Bradley, but yea, Misko is a legend 🙂

  • @killcode6717
    @killcode6717 2 роки тому +5

    I really like Jeff’s sense of humor

  • @MobiusCoin
    @MobiusCoin 2 роки тому +73

    I've been watching this package for 8 months. I checked in on it yesterday. I thought it was dead. Glad to see an update but the periodic dead times makes me weary of adopting it. Even though there's nothing quite like it on the market and is sorely needed by a lot of marketing sites out there.

    • @x1expert1x
      @x1expert1x 2 роки тому +10

      You really don't need this package at all. Browsers have web workers built in, hell you can make it faster than partytown by running each API on its own webworker thread asynchronously.

    • @theclockworkcadaver7025
      @theclockworkcadaver7025 2 роки тому +20

      It makes you wary, not weary...unless the thought of using it makes you tired.

    • @myartikool
      @myartikool 2 роки тому +12

      @@x1expert1x How do I do this? What should I google?

    • @dabbopabblo
      @dabbopabblo 2 роки тому +1

      @@myartikool What are you talking about? everything you need to google is in the comment he made, if you need someone to pick out the terms for you maybe programming in general just isn't for you, or using a computer for that matter

    • @unorthodox1430
      @unorthodox1430 2 роки тому +69

      @@dabbopabblo geez, no need to get so aggresive, if you're not going to help the guy better to say nothing at all

  • @TomPerryification
    @TomPerryification 2 роки тому +5

    Not integrating anything until I hear the words blazingly fast 🚀🚀

  • @jadenstock
    @jadenstock 2 роки тому +1

    "In order to serve them advertisements that will more effectively separate them from their money" - the humour in Fireship videos doesn't get appreciated enough

  • @me-yn1mn
    @me-yn1mn 2 роки тому +1

    Maybe it's just me, but I like the video even before getting to see what is it about in both of his channel

  • @KaizenCodes
    @KaizenCodes 2 роки тому +15

    One issue I ran into while integrating was CORS - they recommend setting up a proxy server for this or using theirs. I rage quit 😂

  • @AndroidChileDemos
    @AndroidChileDemos 2 роки тому

    excellent video, thanks for sharing. As soon as I stop being poor, I will buy your courses.

  • @fen1x_fpv
    @fen1x_fpv 2 роки тому +10

    Didn't even know this existed! This is the sh*t I live for

  • @samhowes885
    @samhowes885 2 роки тому

    Love the sarcasm: Bosses can be hard to deal with!

  • @DreaMinder1
    @DreaMinder1 2 роки тому +37

    Too good to be true. Are there any edge cases where it doesn't work well? Does it have a fallback for old browsers?

    • @mattythebatty1
      @mattythebatty1 2 роки тому +18

      There can be CORS issues with some third party scripts which mean you have to proxy them and correctly set it

    • @seanweber4252
      @seanweber4252 2 роки тому +3

      Introducing a dependency on service workers would certainly be a dealbreaker for those already getting significant benefits from keeping their JS in their CDN

    • @philmuchbetter
      @philmuchbetter 2 роки тому +12

      Really wanted this to work, but just couldn't get it working with tag manager or analytics snippets. Believe it was a cors error and had to give it up. Would be great if it worked!

    • @MaulikParmar210
      @MaulikParmar210 2 роки тому +6

      You can't use 3rd party scripts on webworkers. For security reasons it won't work. That said, this is as same amount of work as optimising and offloading things to delayed execution with deferred js.
      Just another fancy way to pollute html in reality- real world dependencies would be far smaller except JS bloat of trackers, plugins and unnecessary code that gets bundled without tree shaking in some cases.

    • @arthurdenner7
      @arthurdenner7 2 роки тому +1

      It's promising but definitely not plug-n-play for scripts other than the already integrated/documented on the site. All the forwarding of methods (one can't forward a whole variable) and proxying adds a lot of complexity and requires understanding of the script. I had issues with scripts using postMessage because the ServiceWorker scope is more restricted... I gave up using it for now.

  • @Christomshack
    @Christomshack 2 роки тому +1

    Add in Hotjar on top of those three things, and that was my latest integration cycle hahaha

    • @josephaugustin5103
      @josephaugustin5103 2 роки тому +2

      Don't you just love it when everyone needs to make "data informed decisions" but no one knows what data to look at or what decisions to make lol

  • @yuliankarapetkov
    @yuliankarapetkov 2 роки тому +1

    Great video! Thanks!

  • @Neckhawker
    @Neckhawker 2 роки тому +3

    "The while loop that does nothing for a while"...
    Good pun xD

  • @ygorch
    @ygorch 2 роки тому

    A-M-A-Z-I-N-G. Thanks for that

  • @toxaq
    @toxaq 2 роки тому +14

    Or these giant companies like Intercom could just write performant JavaScript and save us all the bother. You can just use an onload setTimeout to add the Intercom (or any other script) initialiser too.

    • @RRRRRRP
      @RRRRRRP 2 роки тому +1

      Thats what's I did lol but I'm sure someone can tell me why I shouldn't do it that way

    • @ibgib
      @ibgib 2 роки тому +2

      I thought something similar, but setTimeout will keep it on the main thread and may not be as performant as executing in another thread via a web worker (which is what Partytown uses under the hood). But it's not guaranteed, since as many here have pointed out, it adds a lot of complexity and even the marshalling between threads may not be worth the price, depending on how often it has to communicate with the main thread.

    • @toxaq
      @toxaq 2 роки тому +2

      @@ibgib I add a script tag in the setTimeout so whilst it's still executed on the main thread, it's not blocking interaction until it's called, which can be whenever you want. I don't need intercom at page load. Unless I've misinterpreted your meaning.

    • @ibgib
      @ibgib 2 роки тому +1

      @@toxaq Oh very cool on the dynamic adding of the tag. I am speaking of the nuances of the JS event loop which will run the setTimeout task as soon as the current execution of the main thread is done. So if for some reason you have some other tasks, e.g. microtasks from async calls still ongoing in your main thread, the setTimeout script loading callback may be executed prematurely. If you were able to shift the work to a web worker and work on another thread, then it may be more suitable. These are all of course general statements and it entirely depends on the total context.
      Also, it seems that there is additional marshalling magic in Partytown that seems to add complexity which many here are complaining about, but the additional magic somehow improves beyond simple web worker functionality.
      It sounds like I'm not telling you anything you don't know, I just can't tell for sure if you understand the event loop aspect of what I'm talking about. It was magic for me for a long time, and of course since I don't work with its internals every day, is still somewhat magical.

    • @toxaq
      @toxaq 2 роки тому +1

      @@ibgib appreciate the reply. Understood on the event loop. I investigated partytown but it seemed like I would then be responsible for breakages if at any time Intercom changed something that wasn't compatible and as such the delayed loading seemed like the best option in terms of not owning the responsibility but getting enough of the benefits.

  • @aniketjadhav2569
    @aniketjadhav2569 2 роки тому +8

    I think it won't work for scripts loaded using CSP nonce values.
    Can you please cover about Content Security Policies and using them with HA Proxy and similar proxies?

  • @CmbMsnd
    @CmbMsnd 2 роки тому +2

    Thanks... I am waiting for the long time this video..
    In server side what are changers to make boost website performances?

  • @hojdog
    @hojdog 2 роки тому +1

    This is awesome!

  • @danteDeveloper
    @danteDeveloper 2 роки тому +8

    It would be nice if we can run code splited js in different workers

    • @poolkrooni
      @poolkrooni 2 роки тому

      You can, what's stopping you?

  • @weeb3277
    @weeb3277 2 роки тому +62

    I learned about this tool from your other channel
    and we tried to use this but ran into a problem.
    I don't remember the error exactly, but I think it was something like:
    Variables that those analytics scripts relied on were not available inside the web worker.

    • @calimio6
      @calimio6 2 роки тому +27

      web workers cannot access the dom, so probabaly something related to that

    • @YuriG03042
      @YuriG03042 2 роки тому +5

      that's what the forward section of the video was for

    • @weeb3277
      @weeb3277 2 роки тому +2

      @@calimio6 I suspected as such, but @2:06 he has _document.body.appendChild_ which seems to be working fine.
      Maybe it has to do with what Yuri suggested, and we should look into that more...

    • @user-yv4bb7mu4e
      @user-yv4bb7mu4e 2 роки тому +1

      @@weeb3277 That would only matter if @Fireship unit tests his example code

  • @yinonelbaz5309
    @yinonelbaz5309 2 роки тому +5

    Can you please make a video on how to develop the internet from scratch?

  • @tom9380
    @tom9380 2 роки тому +11

    Actually, the mentioned example scripts shouldn't block the Initial Page Load at all if they are loaded with 'defer' which is standard. What partytown is for is clearing the main JS thread and helping with performance while the user is interacting with the website, not so much with initial Page Load and SEO.

    • @NorthLaker
      @NorthLaker 2 роки тому +8

      That's what he said. The page will load, but won't be interactive until the script has finished

    • @379rale
      @379rale 2 роки тому +1

      @@NorthLaker I don't understand how this is better than defer

    • @NorthLaker
      @NorthLaker 2 роки тому +8

      @@379rale defer will make the script load after the html has been parsed, but will still block any interaction. Partytown will execute the entire script on another thread not impacting the performance or responsiveness of the page itself at all.

    • @lucass8119
      @lucass8119 Рік тому +2

      @@379rale Defer, as the word implies, is serial execution. This is parallel. Provided you have your ducks in a row and don't mix things up, its free performance.

  • @iLiran
    @iLiran 2 роки тому

    Bro I was literally was testing my site speed with throttling and I was comparing to youtube when this showed as recommended

  • @paradiseofcreativity
    @paradiseofcreativity 2 роки тому +1

    will try Partytown

  • @manhalrahman5785
    @manhalrahman5785 2 роки тому +4

    Nobody's gonna talk about
    "In this script, we've got a while loop that does nothing for a while"?

  • @martinnjoroge9789
    @martinnjoroge9789 Рік тому +1

    The guy was slapped so hard his nose experienced inertia.

  • @felixinit
    @felixinit Рік тому

    Acelera brutalmente tu web.

  • @dabbopabblo
    @dabbopabblo 2 роки тому +2

    A way to speed up performance that isn't nodebackend specific or framework dependent? Sign me up!

  • @remy8587
    @remy8587 2 роки тому +3

    Couldn’t you use just defer and async attributes for that?

    • @wearr_
      @wearr_ 2 роки тому +1

      Deferring doesn't prevent it from still causing JS blocking time, because lighthouse waits for *all* javascript to load before concluding the test. And async calls would just add more time onto that.

  • @OkamioftheRinnegan
    @OkamioftheRinnegan 2 роки тому +5

    Site bogged down by JS libraries? We have just the JS library for you!

  • @patricsteiner8483
    @patricsteiner8483 2 роки тому +2

    did you use that exact code for testing? why isn't the loop optimized automatically, if it doesn't do anything?

  • @michaelmannucci8585
    @michaelmannucci8585 Рік тому

    I am using no , but it's still complaining about unused Javascript... Using NextJS, and def using some import packages.

  • @JasperMurray-j4y
    @JasperMurray-j4y Рік тому

    best video!

  • @Jerry-e7p
    @Jerry-e7p Рік тому

    Thank you~

  • @whoknowswhatishappening2537
    @whoknowswhatishappening2537 2 роки тому +1

    Is it possible to make javascript multie threaded ? Or do you need to rewrite entire code base for that ?

  • @cau8777
    @cau8777 2 роки тому +1

    Its in beta and Nextjs also has as experimental flag extrategy=worker for scripts that seems to do the same ?

  • @dgrozdev
    @dgrozdev 2 роки тому

    Bro thank you!

  • @mookiecodes
    @mookiecodes 2 роки тому +2

    Web workers are not that complicated to use in their own right.... is this just a wrapper library around them? I'm not sure that it needs additional abstraction added, just... use webworkers

  • @coomservative
    @coomservative Рік тому

    could you get a similar effect by having window.DOMcontentloaded event insert those non-critical scripts into tags and insert those into the body after all the important UX stuff is done, obviously if react or whatever is also doing stuff based on that event you would need some kind of managment object that knows the order of events. I don’t think workers can really help you in this situation since the key part does have to interact with the DOM, I guess what I’m not understanding is what work is done by the workers exactly?

  • @ryanwood9288
    @ryanwood9288 2 роки тому

    I see you also listened to that SyntaxFM episode.

  • @tranquillityEnthusiast
    @tranquillityEnthusiast 2 роки тому

    Hi Jeff what us the future of angular

  • @eliyabrodai
    @eliyabrodai Рік тому +1

    Can I use this with a flask application?

    • @thejonte
      @thejonte 10 місяців тому

      Umm yes

  • @ImAshod
    @ImAshod Рік тому

    That thumbnail 😂🎉

  • @josephaugustin5103
    @josephaugustin5103 2 роки тому +1

    Is this really a good stable solution though? Isn't there drawbacks like missing data capture? How often will this just break because 🤷‍♂who knows why

  • @buPnvi
    @buPnvi 2 роки тому +1

    I think those are the top 3 things that make me leave the said site immediately.

  • @amarg26
    @amarg26 2 роки тому +1

    Can we have a video on Rome linter based on Rust?

  • @yashsharma3857
    @yashsharma3857 2 роки тому

    🔥🔥🔥

  • @tech_type-code
    @tech_type-code 2 роки тому +1

    Just use the defer attribute on script tags that fetch third party Javascript, done. Add one HTML attribute or ANOTHER JS library and MORE dependency management in your JS build process. How has no one called this BS out?

  • @Razeakhar
    @Razeakhar Рік тому

    Can you make the same video for wordpress with step by step guidelines for who knows less code

  • @tfuhlol
    @tfuhlol 2 роки тому +2

    Does it works with Wordpress? If anyone can tell me some tips to improve those metrics in Wordpress, i would be grateful.

    • @liquidsnakex
      @liquidsnakex 2 роки тому +2

      Static caching through Cloudflare would help, but it costs $5/month and will never get 100s (or even green scores) across the board.
      The problem is that most Turdpress themes are made by designers, not devs, so they’re packed with all the bloatware that designers need to make a site without a developer.
      To get greens you need a developer involved, designers don’t know enough about CSS, JS, or web optimization in general.
      To get 100s you need a good developer on your project, they can’t optimize a project they don’t know about.
      I know a guy who’s site has 100s across the board, want me to put you in touch?

  • @pilearn1266
    @pilearn1266 2 роки тому +2

    That’s crazyyyyy

  • @weeb3277
    @weeb3277 Рік тому

    3:21 intresting

  • @adampatterson
    @adampatterson 2 роки тому

    Does it load just the GTM script as part of party town, or will it also magically handle the scripts that GTM is loading?

  • @chalk1007
    @chalk1007 2 роки тому +5

    what about the simple async/defer tags

    • @OFfic3R1K
      @OFfic3R1K 2 роки тому +3

      Fireship simply goofed up with the example. Partytown moves all logic to service worker which allows your code running on main thread to get all available resources while all non-essential third-party bloaters get send to party in their little service worker town ;) It's pretty neat and as you might've guessed the intended use has nothing to do with replication of async/defer functionality.

  • @beatsbycf
    @beatsbycf 2 роки тому +2

    0:04 JESUS CHRIST

  • @patelronak153
    @patelronak153 2 роки тому

    🚀🚀🤩✨

  • @aleksd286
    @aleksd286 2 роки тому +1

    explain the forwarding part

  • @fuadcs22
    @fuadcs22 2 роки тому

    Why not manually use heavy scripts as service worker? Why use a library?

  • @BorgesNathan
    @BorgesNathan Рік тому

    I am not developer, is there a way to do this with my Wordpress website?

  • @guilhermemarin3298
    @guilhermemarin3298 Рік тому

    It does not work with next app folder. Actually, there is no alternative.

  • @marlonrtt
    @marlonrtt 2 роки тому

    Nice! Now we can continue annoying users without blocking them, so they can close all the ads and bullshit without interruptions...

  • @quintencabo
    @quintencabo 2 роки тому +1

    Cool

  • @noherczeg
    @noherczeg 2 роки тому +24

    IT would have been way more useful if you showed an example where you are sending/receiving data as well between main thread stuff and workers.

    • @daleryanaldover6545
      @daleryanaldover6545 2 роки тому +2

      Of course it would be included in the PRO subscription on his website

    • @mathe42
      @mathe42 2 роки тому +1

      You can use comlink instead for that.

    • @YuriG03042
      @YuriG03042 2 роки тому +7

      do you want Fireship to do everything from you? go read the documentation and figure it out yourself

  • @apollovishwas9349
    @apollovishwas9349 Рік тому

    I’m getting CORS error for third party scripts. Tried loading g trackers like Facebook pixel. But getting CORS error

  • @devgenesis6436
    @devgenesis6436 2 роки тому

    my lighthouse score was 44 but total blocking time was around 50ms(green) so do i need party town then. ps- worst score is FCP and Speed Index 7 secs

    • @danielchettiar5670
      @danielchettiar5670 2 роки тому

      What're you loading that your FCP is blocked? Images? Videos?
      Is it a pure React app?

  • @JonatasAm
    @JonatasAm 2 роки тому +1

    Finally was able to try that ~2 months ago on GTM, that been dragging performance 30pts down. Got a bunch of CROS errors on (the +20) GTM injected scripts, and they could afford any more time to debug it. So got dropped

  • @outpost31737
    @outpost31737 2 роки тому

    What is this channel? There is Fireship so why they need for another Fireship channel?

  • @FzsHotDogInDonut
    @FzsHotDogInDonut 2 роки тому

    Can you please show us how we can stop normal users from accessing network tab of inspect [chrome or mozila or both] ? And also show custom warning in console like facebook does.

    • @BurgerKingHarkinian
      @BurgerKingHarkinian 2 роки тому +4

      What kind of terrible prank are you trying to pull on your users?

    • @FzsHotDogInDonut
      @FzsHotDogInDonut 2 роки тому +1

      @@BurgerKingHarkinian no no no terrible prank. I just wanna hide my bad backend skills.

  • @catalinim4227
    @catalinim4227 Рік тому

    what's wrong with using defer

  • @eponym-ex5hj
    @eponym-ex5hj Місяць тому

    1:06
    What is this website?

  • @jaroslavhuss7813
    @jaroslavhuss7813 2 роки тому

    Wouldnt be easier to load them after the DOM is fully loaded? Something like window.onload = () => {}... Asking for a friend...

  • @catbb
    @catbb 2 роки тому +2

    whats wrong with regular web / service workers ?

    • @liquidsnakex
      @liquidsnakex 2 роки тому +2

      They can’t interact with the DOM, this is basically a web worker wrapper that allows limited DOM interaction by forwarding DOM calls from the worker back to the main thread and vice-versa.

    • @catbb
      @catbb 2 роки тому

      @@liquidsnakex ah i see. thaanks. seems pretty good

  • @viveksachan11
    @viveksachan11 2 роки тому

    here ,i m screwing up to parallise my programs in python 😞

  • @Nodsaibot
    @Nodsaibot 2 роки тому

    EZ just detect the google service for pagespeed test and feed it a static html page

    • @themedleb
      @themedleb 4 місяці тому

      And real users an wait ... It's not a problem /s

  • @brendangoosen
    @brendangoosen 2 роки тому

    Need a web page! Goes into infinite loop of over-engineering. Why is my website slow? Needs an over-engineered solution!

  • @alanraftel5033
    @alanraftel5033 2 роки тому +1

    Why those tools don't support service workers in the first place? if Partytown can somehow forward dom calls to another thread, I'm pretty sure big companies can also do it.

  • @itsamedood
    @itsamedood 2 роки тому +2

    pogger

  • @ckatke
    @ckatke 2 роки тому

    While loop that does nothing for a while

  • @man-xy
    @man-xy 2 роки тому

    websites are easy 😉

  • @beenmicrophone5817
    @beenmicrophone5817 2 роки тому

    we like to party

  • @SwapnilSoni
    @SwapnilSoni 2 роки тому

    make a video on JA3

  • @StevenHartgers
    @StevenHartgers 2 роки тому +1

    All this just because JavaScript is "single threaded" and blocking, what a disaster, but hey it's something!

  • @AutisticThinker
    @AutisticThinker 2 роки тому

    Is the muscle dude on this video's slide image going to be OK? That's just wrong, nobody should look like that. I wonder what a muscle cramp feels like when you look like that?

  • @thespecialnoob
    @thespecialnoob 2 роки тому

    Great! Now, I will tell my developers to use and not give them any bonuses.

  • @dubgoat
    @dubgoat 2 роки тому

    Please do a react native/firebase new vid

  • @Kareszrk
    @Kareszrk 2 роки тому

    it does not even work! what the hell. I did exactly the same but it turned out all my javascript codes on the frontend just won't load anymore because of type="text/partytown", what this video is supposed to help us in?

  • @kllokoq
    @kllokoq 2 роки тому

    Why is everybody rushing so much! Can we just chill and take it slow

  • @liquidrider
    @liquidrider 11 місяців тому

    Solution: Astro
    everything else is fodder for the hounds.

  • @SamyarBorder
    @SamyarBorder 2 роки тому +1

    19 min late ... 🗿

  • @markokraljevic1590
    @markokraljevic1590 2 роки тому +2

    not bad

  • @kingphenom1620
    @kingphenom1620 2 роки тому +2

    yes first comment

  • @thetrends5670
    @thetrends5670 2 роки тому

    Privacy invasion... lol

  • @gameboyv1790
    @gameboyv1790 2 роки тому

    hi

  • @altairbueno5637
    @altairbueno5637 2 роки тому +4

    Why partytown and shit like that when you can just send plain html to the client

    • @byteofwood
      @byteofwood 2 роки тому +8

      Because the execs want client side analytics

    • @altairbueno5637
      @altairbueno5637 2 роки тому +2

      @@byteofwood just defer the script

    • @DemPilafian
      @DemPilafian 2 роки тому +3

      Or better yet, just send your website as one big PDF file to the client.

    • @byteofwood
      @byteofwood 2 роки тому +3

      @@altairbueno5637 I believe defer just changes when the downloading of the script happens. Once it is downloaded it has to be executed on the same thread as all the interactive elements on the page, which might make them not work for a bit. However partytown uses a web worker which should not impact the actual page performance-wise. I could be wrong about defer though.

    • @okie9025
      @okie9025 2 роки тому +4

      @@altairbueno5637 that just makes the website start lagging a few milliseconds after loading, instead of starting to lag as soon as it's loaded.

  • @morry98
    @morry98 2 роки тому +1

    omg really?!