Jon (00:03.158) Hey everybody, welcome back to another Gone Mobile. Alan, do you know what comes after summer? Jon (00:13.57) Do you know what happens late in fall or early after fall? Allan (00:20.399) Well, usually a new .NET release unless you guys are late. You're be late? Are you sure? Jon (00:23.842) Right. See? No, no, not this time. mean, we have precedence for Maui anyway. Do remember that we didn't actually make it for .NET 6 GA, Allan (00:31.488) Yeah, okay. Allan (00:36.654) That's true, that's, I did forget that. Jon (00:40.162) Yeah, yeah, yeah. It was a mad rush to get anything done and we decided that we would ship in, you know, mid cycle in .NET 6 and there we were. Allan (00:49.784) Well, building tooling on top of tooling that's still being built can be a nightmare. Jon (00:53.756) yeah, it was, I don't ever want to go back to that part of my life. it was a lot of work and, and a lot of it was, yeah, stuff like at the time visual studio for Mac didn't support Maui, like didn't, well, not even Maui didn't support like .net, know, dotnet six or .net five while we were working on Allan (01:03.617) Okay. Jon (01:22.996) And so to actually build Maui itself, well, you didn't really have a tool on Mac to do the iOS or Mac catalyst parts of it, right? It was, yeah, it's like console right lines for debugging complex layouts that go back and forth between the native land and the managed side and crossing that bridge back and forth and figuring out Allan (01:31.884) Cool. Good times. Jon (01:49.228) you know, a native layout changing propagates back over and how the opposite works too. was, it was not. Allan (01:54.538) I'm not allowed to make fun of the Microsoft product managers, am I? Well, you don't, you're not allowed to, but I am. I won't do it, but I'm thinking it. How's that? Jon (01:58.476) I dunno. Jon (02:05.218) There was, it was a, yeah, I mean, hindsight is 20, 20. Maybe we should have just waited till net seven, but we had already gone through, you know, all the COVID stuff and that had delayed things and delays and delays. So there was some, you know, some desire to get things out the door. But at least, you know, we can look back unfondly on those times Allan (02:24.396) Drive hard, push harder. Release product. Jon (02:31.394) now we're not there anymore. And things are looking pretty good, I think. .NET 8, we kept pushing stuff out into servicing and .NET 9. So the interesting thing is for a Maui perspective, there's not a ton new happening in .NET 9, because we're just pushing everything out to .NET 8 as much as we can. Have you tried the .NET 9 previews at Allan (02:54.575) No, I've gotten less. needy for that stuff. Like it's not like the old days right? Like remember when we used I don't know if you can go back to the net FX days when we you know net 2 was like yeah and net 4 .5 was like yeah right? Jon (03:05.668) yeah. Jon (03:09.132) yeah, big changes. What wasn't net two? Was it net two that generics landed? Yeah. yeah. Allan (03:16.7) Yeah, that was a big damn deal. A big and everything got faster and we got like, you know, you used to get excited for like the new visual studios because like they were they were big updates and you're like, yeah, give me some toys. And it's just not like Jon (03:26.326) Yeah. Yeah. Cause it was big changes. There's some changes here and there. Have you used any of public previews of Visual Studio at this point? Allan (03:37.963) Well, can I lie and say yes, but I haven't? Because I got to admit, I'm just all in VS Code and Rider these days. Jon (03:42.754) I mean, it's fine. Jon (03:47.106) I always forget which version of Visual Studio I see what things in it. Cause like I've got three at any given time, at least on my machine. I've got stable, right? I've got public preview and then I've got basically like our main branch nightly builds or not even nightly, just like the in, we call it like the internal preview, right? Which is basically main branch. Allan (03:58.709) Yep. Allan (04:10.845) Okay. Jon (04:13.13) If a release is coming out, I don't do this as much anymore because things have kind of settled down a little bit. And we have like teams of people testing, know, the new VS is coming. Does does Maui work still? So it's not like early days where we might have like a few of us installed the branch build a VS on our own machines and been like, I can build a Maui app. I guess we're good. Right? Like we've, come a little ways. Allan (04:36.668) Now let me ask you, because I don't see this anymore, but what happened to the pretty UI refresh that we were supposed to be getting? Because it was nice. It good on my old eyes. I don't see it anymore. Jon (04:47.638) Well, that's, that's what I don't remember again with what I see on main versus what I see in public preview. know main has always has some UI stuff going on. That's different. Allan (04:57.99) like poof. Allan (05:05.353) John's looking at the internal right now going, where is it? Yeah, I can see his. I just realized I didn't put on my cool lights too and I've got cool new. Yeah, you don't have your stuff on either. We're on the YouTube, man. What's going on? Jon (05:07.424) I am you can see it probably in the reflection of my glasses. I don't see anything too interesting. That's Jon (05:19.426) I got my ring light on. I have the front facing light and I'm moving offices sometime. I know I've been saying that for like months now. It will eventually. It's just a matter of time. And then I've got plans. I got big ideas. So with all that, mean like it's like you said, it's not as fast moving anymore. And I thought it was a kind of interesting to look at the C sharp language features that are coming up. So .net nine, there's not a Allan (05:27.729) Yeah, you've been saying that forever. That's not happening. Allan (05:49.459) Mm -hmm. Jon (05:52.342) You know, new that's happening. and like that, I don't say that in a bad way necessarily. Like, yes, I always like new fun things, but at the same time to not have to start thinking like, how am going to train myself to use this new language pattern? That's pretty cool. And I want to use it, but, you know, it's, hard to retrain that muscle memory sometimes to, use the new stuff. don't know if you find Allan (06:15.667) Yep. Yeah, yeah. It's lesser these days. You're right. I just. I don't know what's the one that screws me. At least we're out of the days where we were sharing net standard and going into modern. That's where I was getting screwed up. But nowadays it's like net six to net eight isn't a huge difference in syntax or APIs. Jon (06:37.378) No, I mean there's a couple c -sharp versions there. There are some newers I started using like the like the the I don't know what that feature is actually called but when you use like the square brackets to like Do your your collection? Yeah, that's nice i'm liking that in in c -sharp 13 like I was scanning through to see what of the things that changed that I thought were were kind of most interesting and there's really like two things that i'm kind of Happy about one one more than the other Allan (06:47.729) Yeah, collection expressions or whatever. Yeah. Yep. Jon (07:07.18) There's the collections can, or like your params, you know how you can do that. You can now use like different collection types and yeah, which is, yeah, that's nice. Allan (07:16.1) instead of an array. Yeah that's handy because often you'd end up being like okay well I've got a params. still use that. It's funny a lot of people don't use params. It's like they don't know about it but you know there's times where you're like okay well I already have a params I don't want to make an overload for a list or go to array because then you're just reallocating it. Now you're just Jon (07:27.598) I like him a lot, Jon (07:37.546) Well, and that's the worst one. It's like, I'm going to have to either dot to array or do another overload. Yeah. Allan (07:43.404) It's like it's still minor but like dude just just consume this thing Jon (07:48.822) Yeah. It's a group. It's a bunch of things like, you know, it's a get take Allan (07:54.383) And an array at the end of the day is still an enumerable. Like it will cast to an enumerable. So just like eat the thing, man. And now it does. Jon (08:01.494) Here it is. I don't want to have to tell you more specifically about it. So that one was good. Allan (08:05.496) Yeah, so that's and I think that one was a pretty easy one to get right like that is just it was almost like an oversight or something. Jon (08:11.468) Yeah, it had to have been. Yeah. I ran into that one a lot recently working on my app where I've got like, have my, my, know you love my abstraction over formatted string form. Yeah. I think it's called formatted string. I don't think you ever use Allan (08:27.94) Yeah, I don't remember what you did. You did something. Jon (08:31.456) So like labels in Maui have the concept of a formatted string that you can, that is a formatted string as a collection of span, like basically spans, I guess. I don't know what the, I don't remember what the actual name in our framework is called. Cause I always use them through my abstraction. And so I made a formatted text type and a formatted or a text span Allan (08:47.436) It is as bad. Yep. Jon (09:01.334) Right? Those go in my formatted. the spans are going to my formatted text. Yeah. see, I named them poorly cause I'm confusing them myself. Yeah. Yeah. So I, I, well, and I, and I have like, you know, the color and font weight and I got all the in the font family and I did the, the, the, I did the colors as like a key so that it's like look Allan (09:10.009) Yeah, yeah, like what am I talking about right now? Something I put a string in and somehow it comes out nice in the label with my magic. Jon (09:29.834) a bowl in the styles of my app, whether it's the well, the web app or the Maui app. So I have this whole abstraction and I, and so I deal with a whole bunch of like these tech spans and I have different places that I like want to compose the, the streams differently. It's just, it's a pretty fundamental part of my app. So I've been running into this one a lot. So I'm excited to not have to think like, do I make another overload or do I just to array it and call it a day and don't Allan (09:57.049) So here we are, you've got this funky little thing and it's doing what you need it to. Jon (10:00.172) Yeah, should release it as a library. Allan (10:05.057) Well, you will you might or you might just put it in a repo let people take it Listen sometimes less noise other than the ones that can you put this as a new get if I wanted to put it as a new get it or be a new get you put it as new get Somebody actually did that though when you did that for ff image loading the port Yeah, you didn't push it out and then they got it Jon (10:07.424) might. Yeah. So. Jon (10:24.044) They, yeah, I'm sure. Cause I never, I think I had a building as one, but I never pushed it out to new get as one. That's fine. I don't want, I don't want to have to maintain it. So the other type, which is kind of like, there. yeah. I maybe, know, more context about it than I do. Like I know there's something implicitly different and how it works. like the thing you always used to do is create a, a random object, right? Usually like Allan (10:30.198) He did a lot of work on that too. It a shame. But, whatever. Allan (10:38.35) This I like actually. Jon (10:53.402) I'd always create like a static read only object and you would lock around that object and I'd create that instance of that object so it wasn't confused with anything else. It's like its sole purpose is to act as the lock. And so now there's a system threading lock type. So what do you know about this Allan (10:55.724) Yep. Yep. Allan (11:09.379) So this is interesting because it's like the thing when you do locks is you often sometimes you might want to lock multiple things right almost like a transaction. So you need and I still think it's a good practice. I don't know if I'll use this thing but it it it opens options I guess is the best way to look at it because now I can pass the lock around and say just stay within scope right. I think I think that's what you can do. Jon (11:35.648) Yeah, there was some other aspect of it too that I didn't really fully have time to look into. Allan (11:41.141) And but at least this way it kind of opens that gateway as opposed to trying to stay in scope. Like I can pass it down the pipe. I'm trying to think of a good case because I have had this case where I'm like, I think now what I do right now, it's funny, we were just talking about this today with some luck with the preferences. We're talking about preferences today with Android. Jon (12:03.538) yeah. Yeah. Allan (12:05.528) And I was like, gotta lock that thing because it doesn't like multi -threaded access, da da da da. We'd been through that. But what I ended up doing was tossing an action, then doing the lock and getting the stuff, running the action with here's the current version of preferences, do whatever you're gonna do on it, commit, remove lock. And I think that's how I've been doing it, but you can see I had to funnel it through to one area to get all of that in one spot. Whereas I think this kind of opens it up so you can go a little bit wider. Would I? Jon (12:37.487) And you could always do like the, you know, use like semaphore slim or something like that as Allan (12:42.656) If I'm doing async, I would definitely do that as well. A little bit of a... I don't want to say tougher problem, but certainly it's the same idea. you could always do this. They had that marshaling lock you could use as well. I never did use that personally. I think it's gonna... This is like a nice wrapper around that. Like you try to enter and it'll say false Jon (12:44.597) Yeah. Jon (12:54.23) So that one's kind of nice. Jon (13:09.162) Right. Yeah, I've used that in the past. yeah, this probably doesn't also solve like multiple concurrent reader, single writer type scenarios and stuff like that too, Allan (13:20.824) Yeah, well, if you think back to it, like manual reset event, what the hell was it? Yeah, that thing too. We used to use a lot of that. I honestly, found those, it's almost like we had outgrown those. Like we're big on the scoping of things now, right? So this. Jon (13:28.312) yeah. Jon (13:36.502) Yeah, yeah. mean, unless you're building like some really like customized collection or something like that, I think you don't really get into that anymore. Allan (13:45.334) Yeah, and like I said, if you can if you can pass an action and create like a centralized lock and say here, this is the thing it's now safe to work with. That's what I've been doing for years, and I'm not sure if this will help alleviate that or who knows? Guess we wait and Jon (14:01.11) I kind of just like that it's, not, I don't know. It's my really, what's the crotchety self that I don't like using an object. just like, I don't want, I want to, I want a thing that is more descriptive of what it's, why I'm using it. Like I know it's fine. It's, it's, there's no reason other than I'm just like, I don't like it. It looks, looks dumb. Well, I always named them like lock something, right? But still. Allan (14:20.872) I wonder what this thing is doing. Allan (14:26.211) I usually call mine a sync object or something. I don't Jon (14:31.074) Yeah. Anyway, I don't know. Did you see any other C Sharp 13 things that were notable? That's kind of what I took away. Yeah. Allan (14:37.14) There was one that they dumped that I was getting excited for was the kind of like external what the heck would I forget what the exact name of it was. Jon (14:48.066) I don't remember either. remember, I never even remember what it was at this point, other than it was like, there was a thing that I was sad because I knew I wanted Allan (14:56.171) It was like extensions on extension properties. Yeah. And that, that was, that was interesting. I think my guess is they had to pull that because think about that. Think about the havoc you could wreak with that. this. Jon (14:58.144) yeah, property extensions, yeah. Jon (15:09.026) That's a hard one. Extension methods already. That's one thing that I kind of wish that we didn't do in the Maui repo so much to start. We have extension methods everywhere with the idea being like, hey, if you're writing your own handler, you might also be wanting to set the text on the entry field that you are using in your custom handler. So why don't we use an extension method for when we do it so that you can use the same one and the logic works the same. And it's like, in theory, sure. In practice, no, nobody ever is going to, nobody's going to know what it does. So you're going be like, I'm not going to use it. Right. Like I need to, I need to know what it's doing so that my own code works. And that's even if you could find it. And even in our own repo, there's, there's a lot, you know, there's enough cases where it's like somebody didn't know this other thing existed. So they made their Now we have two. Allan (16:06.531) That isn't well that's always the cause right that that happens all the time and I mean like this external properties thing and extension method sorry extension properties thing was really interesting but like I said you think about the havoc if you think extension methods are crazy and they can be and you're right you get multiples created because you lose scope on or visibility on what's attached to that thing Jon (16:08.748) So. Allan (16:37.122) I mean it's no different than calling it a static but what it does is becomes it IntelliSense is right off the bloody object. So I mean I did that with shiny was a big oops where I had like extension methods for reflection and I put it on object and it was like in the root and was like yeah that probably wasn't the nicest thing to Jon (16:41.185) No. Jon (16:56.524) Well, think, I think it also, it also kind of encourages, like, I don't know, especially if you're doing anything, that's like, you care about the shape of the API and you're like, well I can keep my, you know, my class clean here and I can just do this as an extension method. And it's not going to look like somebody doesn't have to go some random util class of extension methods dot do a thing. It just, like you said, it just comes off the object with IntelliSense. So I think I know I've often Been kind of eager to use it because I'm like, I can, I can make the API still decent, but like separate the actual logic somewhere else in my code. Allan (17:25.793) discoverability. Allan (17:34.568) Right or it's you know in cases it's easy to build on to stuff like like I said I did one for object because I had to do reflection whether people like reflection or not it's used right so I I would often say you know if this thing is in there get the type cast it otherwise return no right so I put these extension methods off of object because I would use them frequently and I of course I make everything public I never do a public seal Jon (17:44.876) Sometimes you need to use Allan (18:03.934) Sealed logic or internal sealed. I know you could stop doing that too. That'd be awesome But at the same time I ended up exposing everything the people like what's all these methods I'm like who cares just ignore them. I Ended up removing them in scope because people complained enough, but like still They are helpful. You don't have to use them But fine your intelligence. It's like going back to the old days If you ever did any Java development Jon (18:18.592) Yeah, just don't use Jon (18:24.956) Yeah, They have their place. Allan (18:33.321) in the initial, what the hell was the editor we used to use? I'm getting so old, I can't remember. No, it even before that, Like the first. Jon (18:37.73) Net beans or Swin? Swin was the UI language. Eclipse? Allan (18:44.513) We're going back to like 2000. There we go. Good memory. Yeah. When you used to press dot to get IntelliSense and you get like everything, it was like, I don't even know, but I don't care about your imports. Here's everything. And you'd be like, wow, that took like five seconds to render. IntelliSense is fantastic here. So we're like doing the same thing with all these extension methods and now extension properties. And yeah, I imagine. Jon (18:57.175) Mm -hmm. Jon (19:07.638) Yeah, kinda. Allan (19:12.393) they thought about all the things that we would do wrong and said, yeah, think we're gonna wait on this one. So that was probably good, but disappointing. Jon (19:18.476) Yeah, I think it threw a little bit more. Yeah. And you know, it's funny too, cause I saw some feedback that was like, can't believe that you're, you're doing this, you know, like you, you put it in the preview and now you're taking it away. And it's like, you know, the ant, I forget who answered it from, from Microsoft, but the answer was good too. And it was like, yeah, I get it. But we're, putting these things out there earlier so that we're, you know, we're trying to be more open and transparent about what are, what we're, what we're trying out what we're thinking of doing and sometimes sometimes you figure out that the answer is not good but like would you rather have you know loved and lost than to never have loved at all right but that's kind of it Allan (19:59.732) That was awful. It was awful. I mean, I don't think they've outright abandoned it. I think they've pushed it out. So. Jon (20:08.244) Yeah, exactly. I mean, I don't think anything's ever truly abandoned. Allan (20:14.122) Well, until it's released and once it's released, then you're kind of, especially in the language, I'd still love, I'd still love to see event delegates and stuff die and just, well, come on, come on, just, just make them observables. But Jon (20:27.274) No, I'm with you. I'd love to like revisit, you know, that a little bit and see if they could do something language wise to kind of shift from events to something else, even if it is. Yeah. Yeah. I know. I hear Allan (20:39.721) just use interfaces like Java. They don't worry about memory leaks because of that, right? It's a different, you just, you don't have the problem. Here's the interface, do things with it. Yeah, sure, you have to implement a little bit more, but maybe they could change the C sharp language. Well, I mean, they've got default methods now, right? So there's so many things they could do there. Jon (20:58.626) Well, that's what I mean, right? Yeah. You could do something to help that pattern out. Yeah. All right. So that's the language. And see, you were worried that we wouldn't have enough to talk about what's coming in .NET 9, but we're already like 20 minutes in and we've only touched the two features than the language that I thought were interesting and thought would only take us five minutes. Allan (21:16.766) Yeah, we don't shut up. We don't shut Allan (21:23.932) I like those features. Okay, but tell us about this next one because this one I know I'm interested in. Yeah, I do. I know the premise of it but... Jon (21:25.53) I, yeah. Do you know what the, yeah, do you know what it is? Okay. So let me, let me, so the thing is the password is workload set, workload version sets. So yeah, I'm going to to remember the naming and the naming here was hard too. Like there's no good name. Allan (21:46.1) What do we think of workloads? Jon (21:51.65) yeah, I'm going to, I'm going to pass on, on that one. I mean, there was a lot of good intentionality around them and there's maybe some parts of them that are, are reasonably okay. And there's a lot of parts of them that didn't go super well. and there's, you know, a lot of work that's gone into trying to figure out how to move forward from that. Allan (22:15.645) I think the one thing that you kind of help us fix here. Remember when I was having that non -repeatable build and I think I went after David and I was like, this had you guys have to fix this now, right? Because builds were like, if I run a build in DevOps and it's never the case, I know I get it DevOps updates, stuff still changes. It doesn't matter. But when you did a workload install, you didn't necessarily get the version of the SDK you installed. You might still be getting Jon (22:26.987) Yeah. Allan (22:49.309) micro updates and there was one and you guys didn't do it thankfully. Couldn't come after you with this beer could I? It was another team that screwed up the workloads and the builds were broken for everybody not you guys. Jon (22:56.77) I mean, you probably could have come after us for that for other releases too. And I think what kind of exasperated that, the problems with it is, know, one, we're moving fast still, especially in .NET 7 and through .NET 8, less stuff breaking in .NET 8 and that's very, very intentional. But having things change. Allan (23:04.467) I don't know. Don't admit to Jon (23:23.21) rapidly and having risk of breaking things at the expense of trying to change things rapidly meant that you might get in another version and in a perfect world, like maybe that'd be fine. You might not want it, but maybe it wouldn't surface anything, you know? Yeah. Allan (23:38.096) You have to know about it. And I think that that was the problem is that people so even my understanding was the SDK was locked to a specific set of versions. And then it wasn't. And that was that was the Jon (23:47.68) Yeah. So The whole concept of workloads was kind of designed so that it wasn't tied to the SDK version, or it could at least float above the SDK version if necessary. And part of that was because we knew we wanted to be able to release out of band from the SDK itself. Again, hindsight with everything, right? It turns out probably we don't actually build and release that much more often than the SDK does. However, I still wouldn't want to be tied into building, you know, as part of the SDK and releasing with it. So we are still more loosely coupled and that's very intentional. The other problem with workloads from what, how you experienced this is that they're kind of designed to compose and not really care about the versions of things in a sense. It's not entirely true, but the idea is that, know, they don't like, it doesn't matter SDK version is as long as the pieces like fit together, like they're within the same SDK band versions and stuff. So back when, when you hit the things you're talking about, you know, the, the fix was basically, or the answer to that was basically workloads had this concept of, and they still do have a rollback file, right? And that rollback file is really just a bit of Jason that, that says, here's the, the versions of, Allan (25:16.861) Here's the version. Jon (25:19.72) each workload that I want to be used together when I issue workload install commands or workload update commands. Allan (25:26.52) Right. And that ended up being the fix that gave the repeatable build, which was an absolute must was an absolute must. Jon (25:35.798) which is fine, but it's still not super intuitive for one, right? Cause like, how do know what versions of those things you should have? Like there's kind of a hidden command you can run in the CLI to dump out one of those files sorta. So you could use that when you know like your whatever machine you have, you want to imitate that state of. So you do that. But Allan (25:52.636) Kind of, Jon (26:03.266) We would also try and ship like, okay, there's a rollback file in like this storage container that you can get by following a URL convention. And so like, know, if it's 8 .0 .7, there's a particular URL you could use to get that rollback file for that version of Maui. And because Maui is kind of like sits on top of everything, right? We're kind of the top of the pyramid in a sense. Like we are opinionated sometimes about what version of the runtime, what version of Mac iOS, what version of Android that we want to sit on top of. Sometimes it matters. And so our rollback file would kind of be like the single source of truth of like, yep, for this version of Maui, here's like the set of versions for the configuration that we recommend. So that's kind of hard to figure out. what we ended arriving at is a thing called workload version sets. And, you know, I'd be lying if I think this is the perfect answer to everything workloads, but I think it's going to make things a heck of a lot Allan (27:09.58) Is it just a rollback, Funkeyd for a rollback file? Alright, alright. Jon (27:12.254) It basically is. So it's going to be a, it'll be a NuGet package that has its own version that has the rollback contained within it. And so the idea is that like one, if you know how to look at for NuGet packages, and I think they're also looking at trying to do some like IntelliSense and like VS code and stuff for this, because for one, you can specify this rollback, sorry, this. workload version set version within your global JSON, just like you can specify the SDK version, right? So you can go in your global JSON and say, I want this set of workload versions or this version of workload sets. And then it'll pin to Allan (27:57.756) had a thought. I don't know if this is net9 and the reason I'm bringing it up is because it's directly related is the new solution file format. That could go there. Jon (28:09.098) Yeah, yeah. Allan (28:10.78) You know, is that not net nine anymore? Jon (28:14.686) It's no, I mean, I don't think there's a stated date for it to actually come out. Yeah. So this is part of the problem, right? That's more of like a tooling project. Yeah. Line. Yeah. How I can hardly wait. I'm excited for that one too, but because like the SDK uses global Jason already, like it kind of, does make sense to be there because it's you're, you're, listing out. Like here's, want to use. Allan (28:19.068) That's VS though, because it's a Visual Studio theme Allan (28:26.941) potentially good Jon (28:43.552) you know, SDK eight .o don't roll forward to, you know, minor versions or whatever. And I want to use this version of workload sets. then the other, the other kind of big change here is that when you used rollback files before that was like a global thing. Like that was for your, the context you ran those workload commands in, it would pick up, okay, this is the version of .net, right? And that's what I'm installing it Allan (29:06.695) That's what it installed. Jon (29:10.848) And so if you want, if you had one project that you wanted to use this version and another one that uses the other version, sorry, like didn't really work. Allan (29:19.603) Yeah, kind of went, or you didn't have to install and install and install and that would take a while. Jon (29:23.232) Yeah, yeah, you could do that. But on windows that could run into problems because on windows they use MSI based installs and it doesn't like going back to older versions if you have a newer one installed because that's how MSI's work. yeah, so now the kind of big change, almost like the rollback file into a workload set is a convenience. It's not that earth shattering of an idea. The bigger change is that like those packs for those workloads. Allan (29:35.858) And wonder why I get cranky with tooling. Jon (29:52.106) sets will be all installed side by side. So you could go into two different projects or two different folders. And one folder has a global JSON that says this version and the other one has one that says this version. And when you go to like, you know, dotnet workload restore or whatever the, I'm not even sure offhand what the mechanism is. When you go to do that, it'll, it'll fix things. It'll install things up you know, that one project. And then if you go switch to the other one and do it again, it'll install those as well. And it'll keep both of them. It'll keep the composition of all of both of those so that it knows which ones to reference based on what version you've specified. So that's kind of the bigger deal is that you don't have to go figure out like what's the global version that I need to make everything happy. Allan (30:26.534) Mmm, there we Allan (30:38.803) We've gone from DLL hell to new get hell to workload hell That's what I that's what I'm hearing the problem doesn't change Jon (30:43.874) Yeah, yeah, I mean, it'll be another folder to watch grow and eventually say, why is this thing taking up 50 gigabytes on my system? Yeah, there's stuff to trim and clean up old stuff too and collect, but I don't know how, you know, in practice, yeah, we'll Allan (30:52.176) You gotta clean that periodically. Allan (31:04.925) Alright, give me some Maui toys. What Maui stuff is coming? Tell me, tell me. Jon (31:06.954) Okay. so yeah, like I said, like most of our stuff were his bug fixes, right? We're trying to make Maui better. However, there are a few notable additions. I think the biggest one from like a new thing perspective and not just like a change perspective is title bar, customization. So you don't do desktop stuff really. Right. So, but this actually, this, this does, I think this works, I think it works on Android and iOS as Allan (31:32.733) Web iOS and Android, that's all exist. Okay. Is it a shell thing or is it a everything? Jon (31:36.682) I could be wrong. No, no. So do you remember when you moved from Forms to Maui and now we have a concept of a window? Yeah, which we always should have had in Forms. And now one of the things that we intentionally did incorrectly with earlier versions of Maui was to say, well, there's all these projects coming over. They all set main page in their Allan (31:48.562) Yeah. Yeah. Jon (32:06.082) to a page. Well, in a new world where technically your app can support multi windows, like all the platforms, but more likely you're probably gonna do it on desktop platforms or maybe iPad. Yeah, right, the one that you'll never get because it's not coming. We had to introduce the concept of a window. Allan (32:19.152) or the foldable phones that are coming. Allan (32:27.834) my dreams. Jon (32:30.612) in order to support the ability to have your app have multiple windows, just like, you could have two windows and each one of them has a sort of main page, quote unquote. So window has been there forever. But what we have now introduced in net nine is the ability to customize your title bar for a given window. So there's a couple of things that you have to do. One, if you're using main page, like if your app, all it does is set main page, you're gonna want to move away from that. If you want to do anything with the custom window title bar, you technically can still customize it without moving away, but we're encouraging people to move away from it regardless, because it was always kind of a hack just to help make transitioning easier. And that it's really not hard. I don't know if you've ever done it in your application class, like your Maui application class. You just override create window return a new window when you're asked for it. And that can either be just like a new instance of the window that ships in Maui itself or your own subclass of that window, Allan (33:38.11) So what can I do with this title bar? What can I put on? Can I do like a left icon or right icon? Can I change the hamburger menu? No, what the heck is Zombo .com? No. What am I missing out on that you haven't been telling me about again? What is Zombo .com? Jon (33:43.51) Yeah. Yeah. You can do all of it. It's like, have you ever been to Zombo com? Zombo .com? You've never, you've never. Jon (33:57.366) You just go just type zombo .com. no, you can't do anything anymore at zombo .com. Allan (34:00.674) bandwidth limit exceeded contact your service provider. Allan (34:08.158) I think ZomboCom is dead, so no, I haven't tried ZomboCom. Jon (34:12.734) I mean, it's, I'm, I'm surprised cause you're about the right age. there's also, if you can't get to that one, there's HTML five, Zombo .com because Zombo was a, that one doesn't work now either. The original Zombo was like, think a flash based thing. anyway, it's the stupid like meme, well now meme website before there were memes, where it's just like this weird dude being like, welcome to Zombo .com. You can do anything at Zombo .com. Allan (34:14.737) You Allan (34:26.127) my goodness. my. Alright. Allan (34:41.373) I do remember that now. Okay, okay. So that's what you're saying, you can do anything with a title bar. Jon (34:43.37) Yeah. So that's, that's what. Right. So, yeah. So title bar sits on the window. It's, it's that top title bar area. And if you choose to, customize what's in it. So the easiest way, the way I like to do it from my limited testing so far is to create my own window and I'll do it in XAML cause I like it. And then, you know, I use that as my main window in my application, which I create in the create window override in my app and in my window, I pass in whatever the thing I used to assign a main page was like, it's a pretty easy switch. and then in that window you can go window and then you can do the title bar. And then in the title bar, there's a title bar control that we have now, which has, by default and I'll get into why in a minute. There's like the left con there's no leading content trailing content and the main content. Allan (35:22.813) Okay. Jon (35:43.946) you can use none or any of those different content areas. And as you might expect, like the main contents, like the middle, then trailing and leading. And there's reasons for having done that. The main reason is so that we can still, like Windows, Windows makes the title bar stuff a little bit tricky. They introduced an API for it. But like what a lot of people wanna do is say like, I just wanna put my stuff in the title bar, let me deal with what it looks like. Well, on Mac catalyst, that's super easy to do. There's like one thing you have to set and then it's like all your content just goes up to the title bar and somehow Mac figures out where to keep areas clickable and everything for you. you can still like, cause now that you've extended content here, you don't have a thing to click and drag anymore, right? You still have your like buttons, like your maximize, minimize, close. And those just kind of sit over top of your content, but you don't have like a thing to drag, but Mac OS does that for you and it just works and it's beautiful and I love it. But on Windows and I'd imagine this is just to how Windows is architected like at the very core shell level. And so they had to make an API that basically was like, why don't you tell us what regions you you want to make clickable and you can have whatever. regions you want. think it's just rectangles. I don't think you can do a circle, but you can say, okay, here's this rectangle. Make that a target that I can click and hold and drag and do whatever. And if you don't do that, then just nothing is clickable. And so we've kind of taken hopefully the hard work away from that for you by having these kind of content areas. And then we have places that we specify that are clickable and stuff. And so you can put whatever Maui views you want into the title bar. If you put it in the leading content area, it's going to be off to the left, if you're default left to right, and then main in the middle, then trailing on the Allan (37:53.088) I would I be right in assuming this people are asking for this because of like VS code really likes to push the title bar agenda. Jon (38:01.698) Yeah, well, if you have you ever used or looked at, you don't have to have used it, the photos app in Windows. If you ever open that up or like teams actually is an OK example on Windows 2, like they put like the search bar up in the middle, right? Right? So and like your your username menu and stuff there. So that's that's like those are some of the scenarios that we kind of looked at for how to model this after, because that's what people want to do. Allan (38:14.747) Yep, okay, yep. Jon (38:27.99) So that's coming and you actually on Windows can also say like, no, no, let me just, let me control the whole thing. But once you get into that area where you're like, I don't want to deal with like leading trailing content and stuff, you have to tell us what controls you want to be clickable for like still keeping some supportive click and drag the window around. Cause we don't know. Allan (38:53.254) Fair enough. Sounds cool. I haven't tried it yet, but I will try Jon (38:57.292) So, and I think the other thing, again, I don't remember offhand, I haven't tested, I think we either added or are planning to still add support so it works on Android and iOS, which is kind of neat too, because then you can kind of customize that whole top, like nav bar kind of area, I believe is the intent. Jon (39:17.474) So that's one, that's the bigger one. You don't sound that excited. Allan (39:20.198) I know what people are gonna be happy about here, but I'm looking at the second feature you have listed. Jon (39:25.248) I gotta find my notes again because I lost it to ZomboCom. Allan (39:27.45) So the next. So probably the disconnect handlers, my guess people will be like, ooh, joy. And that one's kind of the, to me, that's like a minor one, but you Jon (39:30.53) There we Jon (39:38.494) Yeah, but it's a, it's a bigger one in terms of potential ramifications, especially if you like create libraries and stuff. So the, the one there is, we've been working really hard at trying to figure out memory leak stuff. you know, we've, decided that there's like that whole one project that's like the memory toolkit or whatever, right? Where they just try and like blast through everything and like call disconnect down the tree and dispose and super opinionated about trying to collect stuff and clean stuff up. but like the conversation has always kind of been, well, okay, how do we know that you're done with something? How do we know for sure? Like we could assume that you navigate away from a page and you're done with the page. What if you, but what, what, yeah, yeah, yes, but I could have a handle on that, of that page. I could hold a reference to that page and decide I want to push it again. Allan (40:11.448) Okay, I have seen it, Allan (40:25.774) If it's not in the nav stack, it's done. Allan (40:39.193) But that sounds like as pages a singleton type thing which I've been like don't do it Jon (40:39.84) There Well, it's not a singleton. There are some decent use cases for it. like video player is one that kind of comes to mind. It's not just a page level thing. Like it's a control level thing. Right? So if I have a video and I want to shift it between, you know, being on a page and then maybe some native like picture and picture thing with iOS, I don't want you to clean that up on me when I'm trying to do that. Allan (41:03.546) Okay. Allan (41:07.288) But would that not be a window in a sense? Should I not be opening? Should I not be moving that video to a window? Or should that? Should it be in a window already? Jon (41:11.191) Mmm. Jon (41:15.948) Sure, but like it's kind of the bigger question of like when do we know that you're done with that handler to clean it up for Allan (41:23.995) When the window disappears? When the page disappears. Jon (41:25.726) No, because we don't track the window. You're putting it in some native thing now. I don't know what you're doing with that. So there are, there are scenarios. So, but what, what we've arrived at basically is okay. You know, like we just said, typically most people care about stuff like when the page goes away, when, when you, when you pop the page from the nav stack. So we're introducing, like an attached property in the XAML level, that you Allan (41:29.357) All right. Jon (41:51.424) define or override the kind of default behavior so that you still can do stuff like take that video canvas. But the default will be like, yeah, we're going to call disconnect handler for you when we think you want to called. If you figure out that that's not what you want to happen, you can just set disconnect policy to manual or whatever the enum value we have is. I know, I was waiting to see if you'd catch that. Sorry, the enumerators. Allan (42:15.055) Sorry, what'd you call Allan (42:20.987) That's going to be an ongoing joke on the show, so if you don't like it, you're probably going to get used to it because we actually burned ourselves in the middle of an episode saying, it's not an enum, it's an enum. And then all of a sudden we were like, what about it? We don't call it an enumerator, but we do call it an enumerable. Jon (42:32.704) Yeah, enumerator. Jon (42:40.726) Yeah, not any numberable. Allan (42:42.585) Yeah, what the hell, what? Yeah, anyhow, I digress. Jon (42:45.858) So that's going to be one that hopefully helps people who are chomping at the bit to have something like that happen. But there's going to be fallout from that, which is another reason to have the override of saying, don't do this. even on a page level, would be like, don't disconnect stuff on my page. maybe I used some weird plugin that doesn't properly do things in Disconnect Handler, and now everything's broken because it throws because they did something never was called before. Allan (43:18.405) Okay, this one, the next thing we're about to talk about is the one that I'm interested in, the embedding. Jon (43:23.776) the embedding. Okay, have you ever, have you done any of that yet so Allan (43:29.155) Embedding depends on how where this topic is going because this can mean a couple things to me. So let's hear your definition Jon (43:35.594) Okay. So, so let's, let's, yeah. So embedding from this perspective is basically I have some Maui code. have like, you know, Maui controls. have some maybe XAML, but at least like pages and stuff and, maybe just a few, maybe just a few. And I want to shove that into, have also have an Android app that I've written in Kotlin and that's my app. But I want to bring this Maui thing that I have. into that app without switching everything to So that's what this embedding scenario is for, is for customers who might wanna sprinkle a little bit of Maui into their native apps. basically it gives you a way to kind of say like, okay, here's my page, like give that to me in a platform specific thing and it'll hand back to like a, let's start at the view level. It'll hand you back like a UI view for instance, or something like that, right? you're, yeah, and you can go put that where you want. Allan (44:34.027) Okay. So the reason that I'm interested in it though is because there's other things that end up being kind of pseudo native, like that they're kind of out of the box. So if we think about a widget on Apple, I do think it quite applies. Well, it could, it could, it could potentially. Well, you live outside of scope and memory Jon (44:55.044) I don't know if it could, because widgets are Well, it's more than that. It's the Swift UI stuff. All the things that are like your entry is Swift UI. Yeah. Allan (45:07.231) Well, if you what about so notification content extension that could potentially be. You can do you can do a view, you can hand it a view controller and say this is what you're displaying, deal with it so. But it's gotta be like rocket speed like you don't get dependency injection the same way like you're very limited on the content extensions. Jon (45:14.048) I'm not, is that one UI kit based? Jon (45:21.226) Okay. Yeah. Yeah. That, that could be a Jon (45:33.815) Mm -hmm. Allan (45:34.507) And the reason I bring this up is because it's not just for the content extension, because when you go to the Android side of the equation, Android is far less caring. It now means that I can do that content, that rich widget or content, you know, rich notification. I can do it on both sides of the equation with one set of code potentially. So that's a big one. Now, again, dependency injection gone, you're kind of out of proc. Jon (45:52.63) Yeah. Yeah. Allan (46:00.301) but you're still able to write your UI mostly in one spot. Jon (46:06.242) And usually the way you kind of move things around then is some storage in between, right? Like maybe you just dump stuff out to a JSON file and you know, you can load that from your extension or whatever. Allan (46:18.509) Yep. You got to be careful. There's still some catches there Jon (46:23.896) yeah. Yeah. It's not, not a given that it's easy. so like embedding was technically there already. It's just that it was not really nice to use. There was a few rough edges, lot of rough edges I should say. So we've, there's a lot of work or there has been, or is ongoing a lot of work going into just making that a better experience so that it's easier to use because like ultimately the trick with embedding All of our stuff, like our handlers and things are kind of architected so that they have a Maui context, which has a window, like all the different scope and everything that comes along with it. Right. So you kind of had to like set up your own kind of fake version of some of those things. So there's a lot of ceremony around it. So that's what, that's what we're trying to make easier. Allan (47:13.433) So that'll be cool. This might have, maybe not at the first version, but I think this can hit some, start scratching some edges. Jon (47:23.382) Yeah, I think that's a very interesting application. I don't think there's, mean, think if there was, already would have done it with other stuff. But like, I don't think there's a way to embed a UI view inside of a Swift UI at all, right? I think like it's, could do the opposite way, but you can't do. Allan (47:37.099) Yeah, it's no, that's why I didn't. I went to the rich notifications because there it's still based on a view controller as opposed to trying to do stuff with Swift. Which one are we locked into Swift UI? We were talking about it not too long ago. Jon (47:50.876) like the widgets like on the home. Allan (47:54.463) No, the you know what it is. It's not rich notifications. It's the new Apple like live activity notifications. Those are Swift UI and those I've been trying to figure out how to get involved with but it's a bit limiting right now. We have to look into some stuff there at some point that we can work with. Lots of Swift UI. That's coming right? It's coming. Jon (48:02.093) yeah, that too. Jon (48:21.408) Yeah, I mean, maybe, I don't know. That's beyond my scope of what I'm looking at. Allan (48:28.962) Somebody is working on SwiftUI in the .NET. Jon (48:32.096) I mean, there's been experiments in the past, like even in the Xamarin days, think it's like somebody had SwiftY working from C sharp in some capacity. like in theory. Allan (48:42.038) Swift Interop though, if it's got Swift Interop, you might have Swift UI. Jon (48:44.262) Swift Interop, yeah, there's work going on. I don't think it's Net9 focused or maybe there'll be some experimental stuff out there. I mean, they're doing all the workout in the open, so it's not like I'm giving anything away. Yeah, Allan (48:56.204) Yeah, I'm watching it. All right, let's get to the next one, because I know the next one's exciting too. Jon (49:03.778) I mean, yeah. So yeah. So collection view handler two. I like the sound of that. Collection view handler two and you. Yeah. it's, it, we, we decided a while ago and we revisited and decided the same to an extent that, you know, as, as things progress, like one of the things that we're going to do is Allan (49:05.506) What does it mean Allan (49:15.436) Jeez, you're on a roll today, Jon (49:30.754) create new versions of handlers and kind of deprecate the old eventually and remove them. And that's kind of a clean point for us to do a lot of changes in a space that is very easy to kind of escape patch from if you need to. So collection view, if you've used Maui, probably not a shocker to anyone that it's one of the controls that can run into things, right? Allan (49:58.935) Fair. Jon (50:00.342) you know, a lot better than it was, but it's a, it's a very difficult area, you know, to work in and make work well for all the different scenarios that people use it. then so inevitably. Allan (50:11.605) Yeah, you're trying to solve world peace in it because it does everything with the kitchen and the kitchen sink. Jon (50:15.476) Right, right. Does grids, it does horizontal, it does grouping, does all the different things. So yeah, it's, and it's built on code that was built a while ago that was using APIs that were built a long time ago too. And so, part of, yeah, you do. And which is kind of like what happened when we built, when they built, not we, I wasn't on the team at the time when they built collection view. Allan (50:33.909) you got to tear it down and build again. Jon (50:44.086) you know, when list view was kind of the old thing, like on Android, they're like, Hey, recycler views a thing now, like, let's use that. Right. So every once in a while, things change enough on the platform level that, you kind of do have to go back and revisit and use newer APIs. So that's the, the change here is that we are using newer APIs for the iOS implementation and Mac catalysts therefore too, of our collection view control. since iOS 13, there is now a UI comp collection view, compositional layout stuff, which makes a lot of what we were managing on our own in terms of measuring things and figuring all that out, just a lot easier to implement and to maintain. so like I did a experiment a while ago this year, trying to like swap in the new API is just to see what it felt like in our own implementation. And it kind of turns out I got to delete a lot of code that was like measuring cell sizes and, you know, areas that we were finding the most challenging to maintain while fixing bugs and not breaking other people's scenarios. So a lot of this is kind of done for us with composition, compositional layout stuff. And so, yeah, that's what this effectively is. We're adding a new handler version. We're not sure yet if it will be the default in Net9, but if it's not, you'll be able to opt into it. If it is the default and you use it and you're like, this breaks my application real bad and it was working actually well, you can always go say, you know what, let's use the old handler for now. So that's kind of the big change with Allan (52:31.431) Interesting. I will be interested to see how that goes. Because I'm using a mad mix of different controls right now. I run into a performance issue and I'm going, okay, well the cell is pretty good. I'm going to put this one on collection view. I'll swap out real quick. I mean, that's the luxury we're in to do that. Like there's your virtual list view. There's still SharpNado out there. There's another couple that have popped up in the radar. Jon (52:34.645) And it's not Jon (52:49.516) Yep. Yep. Jon (53:01.238) Yeah. And that's actually like, I don't know if it's public yet or not. Like I know David had made a sample that an app that was just using like all the different collection of views and list views that are out there and just trying them out and trying to like recreate, you know, popular layouts from apps and stuff and just getting a feel for like giving us a good way to kind of like look and compare and see like, where do you hit rough areas and stuff? Right. So, yeah, like you take something like that and you can see like, yeah, there are. Ideally, you wouldn't have to go use three different things, but you know, if you need to, it's there. You can do Allan (53:34.899) Sometimes you don't need to get everything out of the box. I know a lot of people, especially in the Microsoft, I don't know what you guys are cursed with, but everybody wants it in the box to start. It's your curse to bear, I guess, because I've never been that way. Like if you can't, if this thing either doesn't have the feature set, which, you know, that can often be the case anyways, or it's causing problems that either A, they're too hard to work around, they take too long. Jon (53:43.298) Yeah. Allan (54:03.354) or they're just plain broken, it's easy to swap out. That's the whole point. Like I don't need one suite to solve it all. And all the control vendors are there, et cetera, but, you know, this is where, this is the age we're in now. Jon (54:09.505) Yeah. Jon (54:17.888) Well, and I think part of it is just kind of trying to shift responsibility, right? Like if I have to go out and find something else, well, now that adds more risk to my work, essentially. Allan (54:29.274) sure but every time you're taking something external you're in risk right so you should always have an escape hatch everywhere everything that you're using that doesn't mean go abstracting everything for god's sakes if i see another bluetooth abstraction around a bluetooth abstraction i think i'm gonna lose my marbles quit doing that but you certainly want to frame things well enough that you okay this collection view is a problem or this library is a problem out it comes in goes a new one Maybe I'm going to replace it with my own handwritten stuff. Who knows? But it should be, it should mostly be easy to swap in components as needed. But yes, you're taking every line of code you write is, is potentially a line of risk. Jon (55:09.056) Yeah, exactly. Jon (55:16.706) Yeah. So in the collection view that like the new handler here, I think one of the interesting things was in playing so much in this space myself was that like, I went back to see like, okay, can I, well, there's two things. One, it means that we're bumping minimum support to iOS 13 and higher because these APIs came in iOS 13. We've been watching them for years. Allan (55:16.732) So just to clear that in the management perspective. Jon (55:44.322) salivating over when we could finally use them and, and, you know, that'd be okay. and based on, know, what we've done talking to customers and stuff so far, like seems like, yeah, everybody's pretty comfortable with 13 as the men. Allan (55:58.043) Who uses old iOS anyways? Really? You're supposed to throw them out every three years, right? Jon (56:00.896) Well, you look at, no, like exactly. Yeah. Well, if you look at how, and like Apple's one of the better ones at how long they support devices with newer versions, right? So if you actually look at what the oldest version or the oldest devices that don't get, you know, anything that new, it's older than Allan (56:19.697) think they're still in like iPhone 8. Is it an iPhone 8? No, I think they just upped it with 18. Jon (56:26.562) So the oldest iPhone that will not be able to meet the 13 or higher requirement for us is the iPhone 6. Allan (56:32.335) Okay. Allan (56:40.401) I'm talking about getting iOS 18 though. In terms of new updates to push you to go forward. Jon (56:43.615) sure. Jon (56:47.766) Yeah, they cut off the iPhone X. Allan (56:52.005) did they? Okay, it went up a lot higher then. Jon (56:52.802) Yep. The XR is the now oldest one to get iOS 18. Allan (56:58.577) Well, mean, it burns my human skin right now running iOS 18. Jon (57:04.194) Mm -hmm. Yeah, no kidding. So that was like, you know, looking at some of the decisions that we made. And actually, if you had a device that got 13, it also got 15. Like there was no devices that got, you know, 13 only or 14 only. Like if you had one, they gave it 15 as Allan (57:24.867) Okay, there you Jon (57:26.178) So we could actually bump to that, for some reason there is a mix and maybe there is actually like a, there's a couple of iPads that maybe are implicated more in the 13 or so that didn't get, you if they got, if they got 13, they might not have got 15. I don't know, but yeah. Allan (57:40.953) Now this this collection view handler too, what does it mean for Android? Does it mean much there? Jon (57:46.822) maybe we were just actually having the discussion earlier. you know, there's a couple of ways we could do it. We could just increment everything across the board so that like everything is two and Android, even though there's no changes, it still is two as well. I think for the first preview that we release of it, we're not going to do that. We're only going to make it for iOS. iOS will be the only platform that has an CollectionView handler too. Just so we're not duplicating code in the repo, we looked at like subclassing things as a way to do it, but that is kind of weird too, because it does change the inheritance hierarchy, especially with CollectionView, which is kind of a weird thing to begin with and how we have it using handlers. So. Allan (58:34.736) Just use an extension method and just say, this is for iOS and if it's for Android, we're going back to the other. Jon (58:40.802) And effectively like on your app builder, you know, there will, there will be something that allows you to say like, no, use the old handler or yes, I want to opt into the new handler and, we'll either scope that to just, you know, iOS or it'll just be like a method and it's a no op on platforms that don't have it anyway. Allan (59:02.246) sounds good. I'm waiting to see it. Jon (59:04.62) Yeah, yeah, it looks promising. certainly brings the amount of code we have in the implementation way down, which is nothing but good in terms of like figuring out how to manage it going forward and fixing bugs with less complexity is always nice too. Allan (59:22.194) So your last item, let's make the whole five listeners that use Windows happy. I have to make my Windows jokes, but. Jon (59:26.338) This one's not a done deal per se. And it's not really a change in Net9 as much as we're contemplating changing the templates for Net9 to use Windows. So Windows, if you've used Windows, you might've heard the term packaged or unpackaged, right? Or packaged being MSIX and packaged was kind of Allan (59:49.786) Yes, I have, Jon (59:56.064) what UWP used and how they kind of sandbox stuff in terms of how you built things and ship them to the Windows Store and all that and installed them even too. So Maui by default has been packaged. And the reason for that mostly has been because the WinAP SDK itself, there's some differences in behavior, even some like API implementation. between packaged and unpackaged. So that gap has closed, but it used to be like this API doesn't work at all in unpackaged. We have an API that uses it, you know, that wraps that API. It'd be really nice if it worked in both places. And so for a while, things like we had problems with custom fonts working in unpackaged. We had problems with font icons working in unpackaged. A lot of those things have been sorted out. And so at this point, the gap is much smaller. There's still a few things here and there, but we're thinking that the dev loop is a little bit better, which it's already decent on windows anyway. Sometimes I just like, target windows with my app, but I don't release it on windows. I use it for dev loop. It's nice. It's fast. So. Allan (01:01:17.945) I am about to start doing a Windows Maui. Yeah, I know that's shocking, right? It is, but it's gonna be a WebView with Blazor. That's it. And that works. So that means I just want essentials and I want a WebView and that's it. And the rest can, I don't want any WinUI besides that WebView. The rest of it can go Jon (01:01:20.956) Mmm. It is. Jon (01:01:27.308) Fair, fine, go for it, yeah. Yeah, no. Jon (01:01:38.638) And that's, and that was kind of part of it too. Right. So like a lot of the APIs that didn't work in unpackaged were in essentials. And then, and just even beyond stuff that didn't work, you know, there's things like when you add, when you try and use essentials for like the file system to get like the app data folder, the cache folder, they're just in different conventions between package and unpackage. Right. So one classic thing could be, I started building in packaged and I switched over to try deploying unpackaged. Now all the stuff I stored in my app data directory is gone. It's like, well, yeah, they're different places. So there's stuff like that. But yeah, we're thinking about switching that to be the default just because the dev loop is nicer. It's easier to deploy. Like if you want to build an app and have an EXE to give someone to run, like you can't do that with packaged. Trying to deploy and give someone like an MSIX is a huge pain because probably you signed it with a self -signed certificate, which means they have to go like install that cert on their machine and do all this like sauna dance to even install the thing. Yeah, yeah, basically, maybe even worse. Allan (01:02:47.888) Sounds like iOS. But worse. and if we're saying it's worse, then it's really bad. is iOS. Jon (01:02:58.368) Yeah, it's not fun. So that's the switch. Allan (01:03:03.668) Windows, just stop, stop reinventing UI stuff. Just, just, just work. That's all I'm asking man. Am I asking too much? you have to say that, I don't. Jon (01:03:13.782) It's not that bad these days, you you'll find. I mean, I'm saying that from my app perspective. Like I said, I use it quite a bit to develop. It's Allan (01:03:21.666) Yeah. Okay. Well, we'll see. We'll see how it goes. You'll have to you're the guy that's ultimately going to have to listen to my complaints anyways. And you kind of go, yeah, I was complaining about Windows again. And that goes to my mute. Yeah, it goes into my mute. I mean, that's OK. Great. All right. So that pretty much covers all of the cool stuff that that we've got listed for Net nine. Jon (01:03:30.944) Yeah, I mean I have my special filing folder for them back there too, Jon (01:03:49.1) think Allan (01:03:52.28) and you think it's gonna ship on time. That's good. All right. I got my rant in for the week. Do we have to think of a plugin though, John? Do we have a plugin this week? You did the notes for this episode, man. This is on you. So we need a good plugin. And I don't wanna do it in justice though, but... Jon (01:03:54.64) yes, it'll ship. The boat's leaving, got to be on Jon (01:04:05.25) Hmm, good question. I know I didn't think of a plugin. Allan (01:04:21.615) What are we gonna do? Let's skip it for this week. I don't have a plugin this week. Jon (01:04:26.274) Yeah, the new new plug in the new package. The new product is done at 9. It was in the Don and 9 the whole Allan (01:04:37.423) John's wearing a chicken on his hat today, so I think that that's had an effect on both of us because I'm having a hard time taking him seriously with this chicken looking back at it. It looks like a chicken to me with a giant T on its head. It's a chicken. It's you wearing a hat with a chicken with also a hat on its head with a giant T. So it's thrown me off. Jon (01:04:47.65) It's a mud hen actually. Yeah. Jon (01:04:59.97) It's the Toledo Mudhens. Actually, I'm going to a Toledo Mudhens game on Sunday. Allan (01:05:07.8) get muddy. Jon (01:05:09.057) Probably it's in Toledo. So you never Allan (01:05:11.893) I need any drum. Do I have drums on this thing? I have a trombone but I won't press that because I don't know how loud it is but do do do. Alright I'll let you do your things. Jon (01:05:19.884) All right. On that note, I think that'll do it for today. But if you don't want to hear us try and struggle to think of a package, plug -in, or product, let us know if you have one that we haven't talked about, or you know of one. Maybe there's some good stuff out there we haven't seen yet. It's always fun to discover new stuff and take a look at it. So let us know. Allan (01:05:35.257) Give us ideas. Jon (01:05:45.09) You can let us know right after you go do the five star review rating on your podcast. Directory Apple podcast, whatever. Allan (01:05:56.195) Just on that note, I thought of a tool. If you're a Mac user, go get Warp. I told John that the other night and I think he's loving it, Jon (01:06:01.496) yeah, that's fun. The terminal. Jon (01:06:06.595) Now they're gonna not feel like they need to reach out to us at all, Okay. Allan (01:06:09.612) No, they still have to reach out to us because then you don't have to listen to us babble for five minutes going, what should we do? Warp, go get it. Jon (01:06:13.666) true. Yeah. And if we get to the point where we're like flush with five star reviews, I'll stop whining about that too. yeah. All right. Gone mobile .io we'll see you next time on gone mobile. Allan (01:06:21.41) takeout. So good.