 Welcome back everyone to the Visual Studio for Mac refresh event. They're really refreshing the refresh about Maddie. I'm James Montemagno. I'm a program manager with one of the best friends in the entire world, Maddie Leger. How's it going, Maddie? Good, James. How are you? I feel like I'm here recording a Xamarin show. I know. It does actually feel like a Xamarin show. It was great. Well, what are we here to talk about, Maddie? Well, we're here to talk about building mobile apps with .NET and Xamarin in Visual Studio for Mac. Yeah. It's near and near to both of our hearts because we get to work on this amazing product every single day for all of our developers. I've been doing it for almost a decade. So, it's Xamarin. So, let's get into it. Awesome. Well, one thing that we get asked all the time by .NET developers is what exactly is Xamarin? It's a valid question. In fact, if you're a .NET developer, they call out when to build an iOS or Android app, that's Xamarin really. We spent a lot of time coming together with like a definition to really describe it. I came up with this one, which is that Xamarin is an open-source app platform from Microsoft to build modern and performant iOS, Android, macOS, watchOS, and TVOS applications with C-Sharp in .NET. All the things. All the things. Yes. And it's been around for over a decade. So, there are tons of companies that entrust Xamarin and .NET today for their internal apps, their external apps, anything you can think of. There's actually a plethora of developers at all sizes of companies using Xamarin every day. I like to think of them as a cornucopia. A cornucopia. I like that. I like that. I should use that. Now, what I also love is that are we just building the platform, developers are loving the platform, but we're really focused on a few things. The productive environment, whether you're in Visual Studio, Visual Studio for Mac, when you have the best tools to help you be really productive. Of course, Codeshare across all of your different projects is really important. It's much or as little as you need, but not only Codeshare, but re-user existing libraries, knowledge, use the best tools, get access to the native integrations, and to tie into this big, amazing.NET ecosystem. Yeah. So let's take a look under the hood at how it actually works. So the Xamarin app architecture is actually just the.NET architecture itself. So you have a head project, we call them, for all of the platforms you want to target. So on here you have iOS, Android, and.NET, which could be UWP, desktop apps. But then there's also your shared layer, and that's where you put your business logic, and you can also share platform APIs, you can share a user interface. Because it's all native, because Xamarin is using the native stuff under the hood, you actually get all that high performance app with C-sharp that you'd expect and that you'd want. The cool thing is that you can scale this up and down as much as you want to. So if you want to share a lot or share a little, depending on your needs, you totally can. Yeah. It's great because you can build a single application or all the applications. What do you want to build without.NET you can. You can? Yeah. Now let's talk a little bit about what was in that shared code base, because there is business logic like models, view models, RESTful service calls. That's just.NET business logic, you can share it all the time. Now I love the native APIs of iOS and Android and Windows. So when you want to access those, the Xamarin team has created these C-sharp bindings around every single API, which is really great. So if you want to access core location, or you want to do machine learning, or any of those geo-location things, you have access to all that stuff, biometrics, all that stuff. Now what's cool here is that they're going to exist for iOS, Android, and Windows, access them in C-sharp. But of course, you're going to have three different APIs because it's three different operating systems. The Xamarin team, we love code sharing. The Xamarin team and the development team has been working on Xamarin Essentials, which is a brand new library. It's been out for actually about a year now. We just released 1.4, and what it does is it gives you access as a developer over 60 native features of iOS, Android, and Windows from a single library. So one API that you have to learn to access things like battery, connectivity, geo-location, all the things here and more, and we keep adding it's all open source, it's beautiful, and we'll demo some of that today. We will. So that's just the APIs for the native actual platform stuff, but you can also build your UI with Xamarin Forms and share all that as well. So you can use C-sharp or XAML, build your UI in that shared project, and then it'll compile down to those native platforms. So a button in Android and a button in iOS is going to look like that operating system, but it's actually just one line of code you're writing in XAML or C-sharp in Xamarin Forms. And it has over 60 controls built in, which is awesome. It's got your standard things like those images, those buttons, but it also has more complicated controls like a media player, a collection view that helps you recycle your elements. And it's got amazing stuff out of the box, but there is a really rich vendor ecosystem. Third party, community, you can go in and new get or all different places and pull in controls to pretty much do anything you want in your UI. So that diagram we looked at before now has these two new layers with Xamarin Essentials and Xamarin Forms. And like I said earlier, and I think James mentioned it as well, you can mix and match as much of this as you want. You can use one Essentials API or all of them, and likewise with your UI, but you just use as much as your app needs. Yeah, and what I also like here when we're talking about, you were just mentioning that rich ecosystem is, these are things that you already know and love. So whether you're using things from Microsoft, like cognitive services, Azure SDKs, or great third-party libraries like SQLite, Skiasharp, Acabash, Instabug, Raygun, Syncfusion, Telerik, all those great things, they're all going to work in your application. So if you're already a.NET developer and you're accessing APIs in.NET with JSON.NET or anything like that, you can use that inside of Xamarin application. So it's really awesome to see the.NET ecosystem grow, and use all those libraries in iOS and Android apps. Great. Yeah. Well, let's hop into a demo. Let's take a look at some code. Going to let my computer think for a sec while I try to end the slide show. Cool. Awesome. So what are we going to build, Maddie? Well, we are going to build an app that shows us some monkeys, because why not? We do love monkeys at Xamarin. It's the perfect app. It is. Yes. In Visual Studio for Mac, you get a bunch of Xamarin templates out of the box, not just Xamarin.Forms, but native ones for all the platforms that James listed earlier. This is the new blank Xamarin.Forms app, but I added a few things to here. So I added a main page and a details page. What that's going to let me do is look at my monkeys, and then in a big list, in a collection view, and then see details about those monkeys when I click on them. So we're going to run this on my iPhone simulator right here. I'm going to scroll to the side. Oh no, my thing isn't charging. It's okay. In the Xamal file here, you see I have a collection view with an item source of these monkeys, and all they have are names and locations. So you just have some hard-coded data here, right? Just some hard-coded data. That's beautiful. Look at that beautiful monkey application. Right. Right into my Xamal, and this is a collection view. It's one of those newer controls I mentioned, but I haven't actually told the collection view how to show me the data I hard-coded it. So I went ahead before this and I made a nice item template that's very pretty. So I'm going to highlight it, uncomment it, highlight it, uncomment it. Oh, I just re-commented it. Let's expand it. I love my collapsing Xamal. Oh, there we go. Great. I'm going to hit Save. Bam. What just happened? Oh my goodness. So Xamal hot reload for Xamarin forms enabled by default in your latest Visual Studio and Visual Studio for Mac, lets you edit your Xamal Live while your app is running, hit Save and see it immediately reflected on your simulator, your emulator, your physical device, anywhere that you want to build your Xamarin apps pretty much, which is great. That's super cool because that's actually a very large change. I mean, you literally change the entirety of what every single item inside that collection view looks like, which is nice. Yeah. I said to the team when I was building this earlier, the amount of times I messed up a margin by like five, and then I just would have to stop and rebuild it. If I didn't have hot reload, I was like, wow, I just saved myself many minutes doing this demo. Yeah, it looks like you have a pretty complex view too. You have a frame inside of there, you have grids, you have a stack layout, multiple labels, images. Using material design. Material design. Yeah. But you mentioned images, this is actually bound to nothing right now, finding image which I obviously did not put an image here in my fake data. Oh, I see, you got it. Because James here who is obsessed with Monkeys. That's true. Has gone ahead and kindly made us a JSON file of all the Monkeys that he loves, all these great things, and links to images that are of them. So instead of me having to go find all these Monkeys, James did it for me. That's the perfect way just to really scaffold out any application. I mean, you just immediately put Monkeys in it. Exactly, perfect. Best list app ever. So we're going to edit some C-Sharp, we're going to take a look at how to pull these down from the internet, and just how simple it is with Xamarin. Stop that, because we can't edit the C-Sharp with Xamahot Reload. And we're going to go look at our Monkey model first. Is that because it's not Xamal? It's because it's not Xamal. C-Sharp. I know. You'd be surprised how many times I try though. So the Monkey is this built off of James' JSON, James' JSON, name, location, details, that image, all that stuff. And we're using the new .NET helper for JSON. So system text JSON, and with just these easy one lines, I can take the JSON string and deserialize it into an array of Monkeys. And then I can use that in my view model here. So Xamarin architecture is .NET architecture. If you're a .NET developer, you probably are familiar with MVVM. You don't have to use it, but it's something that we see a lot of people use. Yeah. So it's model view view model. So you have the views, your model is like that monkey, and then this is kind of the code behind for the page. Yeah. And that magical binding thing just kind of does stuff. Yeah. It just magically says, go to my Monkeys view model, and that's how we're going to show me these Monkeys on this page. It's sort of like the glue, if you will. I like that glue. And what I have in this view model is an observable collection of Monkeys. So that's my collection view. Look at that list and if it changes, the collection view is going to update. I did a really complicated code down here where I just made a null array of Monkeys and then continued to make it blank. Yeah, perfect. But this is where I want to pull in that code from the Internet. So I'm going to use HTTP Client, and it's the same HTTP Client you use elsewhere in .NET. We're going to use all those APIs the same way that you would. Make a new one. HTTP Client. Great. And then, I could just go ahead and try and pull it. But we're on mobile. People do weird things with mobile, like they take planes. You have to check that it's connected to the Internet. Is that weird? It is, yeah. It is, right? Yeah. It's true. You try and open an app on the plane. It doesn't work. You don't have Wi-Fi on it and you're like, I can't play Candy Crush. That's true. I did that yesterday. So I want to check to make sure that this person is actually connected to the Internet. Yeah. And so Xamarin Essentials has a bunch of built-in helpers for this, but connectivity in particular is a really, really great one. It shows you the profiles and all that stuff, but you can just check the network access with this one little property here. And I'll make this a variable for connection. Connection. And I had already kind of, before all this, made some sample data and stuff to handle this. So I'm just going to go ahead and copy-paste it from VS Code. And right here, what I'm doing is I am getting that string from James' monkey's JSON website and then deserializing it using that function we put in the model. And then if they don't have connectivity, so connectionnetworkaccess.internet, if you don't have internet, just going to give you some sample monkeys. Very cool. Yeah. Now the last thing I want to do before I start running this again is just get rid of my sample data in here. Oh, because now you have real data. Because now I have real data. So let me comment that out. And then item source and data binding is super easy, so it comes up right away. And my beautiful XAML IntelliSense tells me my monkeys are available. So that's actually really neat because you had the item source hard-coded before, so you could kind of scaffold out your app without even having to have a real data source. I think that's really neat is that inside of that XAML, whether in a ListView or any object, you can just say, hey, here's my item source, here's my class. But now that we have data, once you're like ready to go, then you just have one line of code to kind of glue it together. Exactly. Cool. Exactly. So you might have noticed here while James was talking, I changed my run configuration from just iOS to multi. What's that mean? Which is a, yeah, so you can, in Visual Studio for Mac, you can actually change your startup configurations to run multiple things at the same time. Mm, cool. So I had already had this set up to target my Android emulator and my iOS simulator. All I did was basically say, hey, do both. And I called that my multi. So it's going to take a second because it's trying to build it for both platforms and boot them up. But you can see I have them both right here. We'll shrink this. Yeah, I guess that is sort of the beauty, right, is that you have iOS and Android in this project so you could deploy to both. And traditionally what I'd have to do is if I wanted to see what this was going to look like or see if this worked, I'd have to build it, run it on iOS, stop it, build it, run it on Android, stop it, and then make my changes and do the same thing. But now I can actually just do both at once. Oh, cool. My Android is, oh, hello, it's sleeping. We'll give this one more shot. We'll just try and redeploy it now that the build has gone through. Great. Easy peasy. Oh, no. All right. That's OK. James will show you the Android version of this in a little bit. My emulator falls asleep when my computer falls asleep. But if I hit the Search button, boop, all of a sudden, I'm going to get my list of monkeys. Monkeys. Monkeys. And I get those beautiful pictures that James handpicked on the internet. Last thing I want to show you before we let James show you some more of the native stuff you can do with Xamarin. This Search button down here looks very iOS-y. And that's one of the perks of Xamarin, is that you get those native controls right out of the box. So your apps are always going to look modern compared to what the operating system says modern is. But in this app, blue text on a yellow background is not the vibe I'm going for. So I actually went ahead and I made a button outline style. Let me shrink this. And it's just got a couple of properties here. It's in my app.xaml. So it's a global static resource. I'll go back into this main page, scroll down to that button, boop, and I'll add that style, static resource, and it's button outline. And I'm going to hit Save. Boom, just like that, my button is fixed. And it held my view model state. So my monkeys didn't have to go back to the internet and get called again. It just used the monkeys it already has. So it's not like, what's cool here is that XamlHaw reload is not just swiping your entire app away and then reloading it, it is holding your state in place because that view model is still there and it has the data. Exactly. And it'll do the same thing with navigation. So if I wanted to go on this monkey details page, which is about my blue monkey, I'll go down to the button here and do the same thing. I'll set my style to static resource, button outline, hit Save. And it keeps not only the page that I'm on, but the monkey that I was looking at. That's very awesome. So, boom. So let's recap what happened here. Using some awesome JSON helpers, same .az serialization known love, using Xamarin.Forms for cross-platform UI, using Xamarin.Essential Tech connectivity, and you can deploy them right from Visual Studio for Mac. An HTTP client? Yeah, that's right. And connectivity, all this stuff. Awesome. So I love that we're building this monkey application. And we have it for iOS, Android, and if we're on Windows, we could deploy that on a UWP application. But for me, Maddie, I have to have monkeys with me wherever I go. It's very important. They do. One of the perks of being a Xamarin developer and a .NET developer is that I can deploy not only for Android, iOS, and Windows, but also for other operating systems like TVOS and WatchOS. So we hop over into MyMac. Boom, there it is. Boom. I want to show all the different themes and flavors here, so I'm in dark mode. I can come in and say, add new project to my solution. And this is the new project dialog. So here's Xamarin.Forms where you created it. We have iOS, Android, .NET Core apps, Cloud Apps. And I also have WatchOS and TVOS applications. So you can just add one of those and then create the native user interface for the watch and the TV. So that aren't part of Xamarin.Forms. So you can still create the storyboards or the C-sharp code behind for them. So what I did over here, let's get out of this, is I've extended the Monkey Finder application for both TVOS and WatchOS. So let me set the TVOS as my startup project here. And what's really cool is that both TVOS and WatchOS can reuse all of the code in this Monkey Finder. It's not going to reuse the UI, but it is going to reuse all that business logic that Maddie just wrote to make the internet request and all that monkey stuff. So here I have my TV application, I have some references and I'm referencing that .NET standard library, Monkey Finder and I'm also referencing Xamarin TVOS. Now I did extend it just a little bit more. I created one single method called get random monkey. So I wasn't going to create the same application as Maddie did. I wanted to be able to have a nice little, give me a random monkey of delight right now in this moment. So here I just say if monkeys, if there aren't any, go get monkeys asynchronously. And as long as I have one, go ahead and get random next and return the image. So that's just going to use some async or wait. And we can see here it's the same exact code that Maddie had previously. So I have my storyboard over here for TVOS and I have a view controller. It's similar to the code behind that Maddie just showed for the iOS and Android app, but it's specific to TVOS and it's this UI view controller. I have here an iOS developer, I've never done any of this in the native stack. It's going to look very familiar, but in C sharp. So here I have that monkey's view model and when my page loads, I'm going to create a new monkey view model and I have a big button that says get monkeys. Whenever I click on it, I go ahead and I update like a little spinner here. I say get random monkey and then I simply set the monkey in this image. So here, just like Maddie did up here, but I'm debugging to an Apple TV 4K running at 1080p. I think if I ran it at 4K and me destroy this seven-year-old Mac that I'm on. This is my original Xamarin Mac actually by the way. Yeah, it's a champ. So I'm hitting debug here and this is cool, right? So if I come over here into my monkey's view model, I can hit breakpoints to all this stuff. So let's go ahead and open this up. I'm going to hit enter here. Boom, I'm hitting breakpoints, do and debug, all the stuff that I would expect goes off to the internet. Boom, I get a monkey. If I hit again, I get a different monkey and another monkey and another monkey and another monkey, all those monkeys all the time. Amazing, that was Sebastian. Cute, cute, cute, cute. This is my day pretty much every day and it's great. So there's my monkey doing pretty awesome stuff and what I love about this is that not only can I write this application over here for TVOS, but I also have a watchOS application that I can run either as part of my iOS app or completely separate. I can have monkeys with me all the time no matter where I'm at. So I have a watchOS application and I also have a watchOS extension which will get bundled in to my iOS application. And again, just like we saw earlier over here, I can debug to the Apple Watch Series 5 or whatever other simulators I have up and running. So again, this is gonna have a different UI because it's a watch UI which makes logical sense there. And let's go ahead and get this out of the way. There we go. And here's my watch application and I have my iPhone over here and I can say get monkey. Again, I hit a break point which is cool because I'm debugging a watch application. It goes off, it has internet and boom. Now I have all my monkeys all the time with me which is really awesome. Yeah, I love it. There's Mooch, there's Sebastian. This is a Red Shank Duke Langer. It's my favorite monkey in fact. I specifically went on holiday to Vietnam just to see the Duke Langer. It's only 1300 of them left in the world. That's very, very sad but they are a beautiful monkey in general. So very near and dear to my heart. We're not done Maddie. I got more monkeys to show. So you showed specifically that we had a cross-platform native UI for both iOS and Android. And I thought what would be cool here is of course show this Android application, the final one that you have. So let's go ahead and get it up and running here. So here it is. Not used to Catalina yet. There's a lot of dragging and dropping and lots of pop-ups. So here's the application, I'm debugging and I can hit search monkeys. So this is that same exact UI that you are showing off on iOS but it's here on Android. I get the nice ripple effects. I get the nice car view. All the things, the red shank duke right there. Now you were showing XAML hot reload which was in our cross-platform XAML. Now we kind of control that 100%. Now Android applications are quite complex because there's images and resources and this big crazy like deep stuff that gets bundled into your app. And one thing that's really nice about using Xamarin Android is that you can go in to the Android application and you can look at all of these resources. So I have layouts like my toolbar items. I have these images for my icons that are inside of here. I have all this code inside of it. Now whenever you want to maybe modify or add a drawable you have to again stop, recompile, do your entire application. But the team has worked really hard to enable some new functionality specifically for Xamarin Android. So when you're editing the Android project, not the cross-platform stuff. So that head project. The head project. So let's say I came over here and I looked at the style for this app. This sort of describes this primary color, this color primary dark color accent. And what that is describing are these different colors for the navigation bar and the status bar. So if I go into my colors over here, this color primary is being used for the toolbar and the primary dark is being used for the top. But maybe I want them to be the same. Like you just have them sort of run into each other. So what I'll do is I'll come over and I'm going to go into run and then I'm going to say apply changes. So this is different than a hot reload. It actually has to compile up into a diff of the resources from the previous version and the new version of it. And what's great here is that instead of having to do a full recompilation or anything like that, it's up here. We're seeing it's actually redeploying and it's restarting the activity already. And what we see here, if I go ahead and swipe up here, is that it's restarted my activity and now the colors are all the same between both of them up top and below. And if I went and go, got my monkeys again, I'd be good to go there. Now it did start and stop my activity. So it actually refreshed the UI completely. However, I can control that and I can tell my Xamarin Android project say I can handle this configuration change, just keep my state and everything like that. So it's really, really nice, but I have my old monkeys, everything like that. I didn't have to stop, restart, I can kind of do this. And that works in any Xamarin Android application, whether it's built with Xamarin forms or not. It was cool. Yeah, very nice. I kind of want to show that often. Really take your monkeys absolutely anywhere. Everywhere, yeah. Anywhere and everywhere. Anywhere and everywhere, that's the goal. All right, we have a few more slides and maybe one more demo. Depending on time, but I think we're actually doing pretty good, which is exciting. James, why don't you tell us what we have on the screen here? Yeah, it's a very exciting time because here at Microsoft, we're getting ready to launch some brand new devices. On the right-hand side, the smaller device is the Surface Duo, which is a dual-screen Android device. This is very, very awesome. And on the left, you have the Surface Neo device, which is running Windows 10X. And what's really great here is that these new devices are really going to unlock a lot of new sort of paradigms for building and deploying and running applications. I'm really into it because it enables me, already as a .NET developer and a Xamarin developer, to build for these. I can already do this. And I can do a bunch of really cool new things, which we call sort of patterns and dual-screen. So I can do things like do a dual view or have an object on the left and right or extended canvas or maybe I'm writing a book application of pages on the left and right. Master detail, so you can see all of your information. So you're not restricted to this one screen. I really, really love it. And I love it because it also sort of helps my applications be improved, like on tablet and other larger form factors in here. So if I start to apply some of these patterns, it works really, really well. But also just having these devices in your hand, which how do you have one? I don't have the keys, so I can't show it to you. Well, maybe tomorrow I'll bring it in. Behind locking key, it's a secret area by my desk. Maybe I shouldn't say it's right by my desk. There's only one area that could be secret by my desk, which is the caddy. Little caddy, just be, there you go. Anyway, that's where it's at. But anyways, I'm really excited about this. And the Xamarin.Forms team has been working around the clock to create some awesome new stuff, which includes a brand new cross-platform SDK for both Windows 10x and Android called the Xamarin.Forms dual-screen SDK. And I believe, Maddy, you might have a demo for us. I do, so, all right, get everything back on top. Oh, my Android emulator's taken a nap. Well, you can see here, this Android emulator is a little bit larger than the Android emulator that I had up earlier. That's because this is a dual emulator, and it currently thinks it's a regular one. So let's click this real quick. Oh, I bet just because the- Powerpoint, yeah. Powerpoint goodness. Yeah, changing my resolution, cancel that, and then let's run it again, run clean. So there's actually a Surface Duo emulator. Oh, yes. Emulator and SDK. So this is the Surface Duo emulator, which you can run on Mac and Windows and Linux. And Linux. It's just an Android emulator. So it hooks right into Visual Studio. It uses what Xamarin already installs for you. I didn't even actually install any Android Studio stuff to get this working today. Oh, cool. Yeah, so just right out of the box. Yep, and you can see it pops up. It has my little hinge, they call it. Yeah, it's a mask between the hinge. Beautiful. And it's my two-page emulator right here. So I'm gonna go and play my Xamarin TV app. This one is much more comp- Oh, oh, started on the wrong phone. That's okay, it'll work anyways. Go back to my emulator. So the emulator pops up right inside of Visual Studio there. It does, it hooks right in. And this is a more complicated app than my little Monkeys app. But it basically is gonna show you all of the amazing Xamarin YouTube videos in single screen, dual screen, horizontal, all the great things you can do with this. So- Oh, cool, look at that. Wow, that was really fast. Very exciting. So here we are, I got all my things. I can scroll, I can scroll on these ones. And scroll through my videos. Some of the carousel view, the collection view. All the stuff that we were talking about. I love this. Media player. Yeah, media player, which is cool. I have a settings page I can go into. I can change it to light theme. Cool. I can click on visit GitHub. It's probably gonna open Edge twice because I just restarted my emulator. Maybe. But it's brand new. I just downloaded this. Oh, there it is. Perfect, look at that. So now I can scroll through Edge. Look at this SDK and look at the sample app while I'm also watching my Xamarin videos, which is great. But maybe I don't wanna do that right now. So I'm gonna actually go ahead and take this and drag it across both screens. Oh, yeah, there we go. And I will have one of those new paradigms that James was talking about where I can actually search for videos here and then see kind of my main page here. And then if I wanna go and play one, click. It'll take me to this, which is playing my face. If you don't recognize that. It's a Maddie inception here. It's Maddie inception. Yeah, it's cool. It's using the new media element, which you talked about earlier too. So a lot of new controls, I love it. And then I can actually rotate it because it's just an emulator. Boom. And now I'm on top of everything else because I'm the best. Are you ready for my favorite part of this app? Yeah. If you go to the notes section. Notes. Yeah, and then select a color and then you can just write on there. You can just ski a sharp. That's cool. And you can see all the comments on the video and scroll through it. Yeah, it's pretty cool. It's really cool. So then of course I can go in, I can drag this back to single screen if I want to, but I don't because this is great. Very cool. I love this application. It not only shows some of the amazing new controls that you were mentioning earlier and you were using Collection View and a bunch of cool stuff, is that it also shows off all the kind of capabilities that you can do. Yeah. Yeah. Well, everyone, you can get started today by going to Xamarin.com. That's where you're gonna go. Hit the get started button right there. In fact, if you go and install Visual Studio for Mac, you'll see an iOS and Android little checkbox. And it installs everything that you need. Everything that we showed you here, except for the Surface Duo emulator which you'll download separately. Whoa! Which is right here in the amazing links that Maddie has put together. Amazing. There you go. Yes. And you can also see the sample app, our Monkeys app. If you wanna get started with Xamarin and see all the magic of the Monkeys. It's on GitHub. Yeah, and the Xamarin TV app is. And always feel free to reach out to me or James on Twitter. I know Christos is over here with the tweet board itself. I am indeed. And you know what? People love the demo app. Every app should have a monkey somewhere because they're great at eating bugs. That's very true. In fact, that JSON file is open source on my GitHub. If you go to Montemagno.com slash monkeys.json which Maddie did, you can go there. You can send a pull request and maybe we'll add even more monkeys to this wonderful monkey file. Everybody loves Monkeys. Now. That's true. That's a fact. That is a fact. That's not an opinion. Fact. Are there any plans to get Xamarin.Forms working on the web browser as a target? Maybe related to Blazor, WebAssembly, Uno, any? It's a good question. So right now the team is laser focused and on delivering super high quality new controls, going through all the issues, triaging everything, just prepping the new 4.5 release which has some of these new features inside of it which is really great. On the Xamarin.Forms GitHub repo you'll see not only a full roadmap of all of the upcoming features and things that they're working on but also you'll see any of the official and third party platforms that are provided there by us or by third party. So for instance, you can run your Xamarin.Forms applications on Tizen which is a platform from Samsung which is also ones on watches and TVs and everything like that. That's supported by Samsung. There's an awesome tech out there from both my good friend Frank Krueger called We which runs Xamarin.Forms on the web and Uno will also do that as well. So that's me getting around showing you all the places you can look and of course provide feedback for the team. But also if you are a web developer, also there are the mobile blazer bindings for Xamarin.Forms. Yeah, so the opposite of that question. Yeah, the opposite. If you're a web developer and you're like, oh, I wanna go build, I don't really know XAML, more familiar with Razer and that sort of model, go check out the blazer mobile bindings for Xamarin.Forms. Our amazing team over on the ASP.net side of things is working on that and it's an experiment right now. So kind of give them feedback on it. So if you're a web developer, take a look for sure. Great. Now the next question I have is, how do I choose between Xamarin.Forms and Xamarin.Native? Like if I'm building an app, I need to make a decision or do I need to make a decision, you know? Well, every app is native, which is great. So you can blend as like Matty said, you can blend as much or as little Xamarin.Forms as you want into it. I like to think I'm just building a Xamarin app and I'm building a Xamarin app with Xamarin.Forms as my UI stack. But like we just showed, the native traditional UI is still there, kind of like the native UI stack. And you can extend Xamarin.Forms, you can blend in things. So it depends on what you're building but every single file new for me is Xamarin.Forms. So, but yeah, if you have some, maybe the one thing I would say is like, if you were a native language iOS and Android developer, I mean you're really familiar with the traditional Android and iOS UI and you're like, oh, I don't wanna learn a whole new UI stack but I just wanna like share a bulk of code. Then maybe that's a good route to start with the traditional UI form factors. And then you can always blend in Xamarin.Forms. Exactly, yeah. I love that question because the answer is you don't have to choose. Just blend it together and you can, it's easy to go. And because the thing is, I think what Matty was showing with all the view models and models, like that shows business logic. It's just code that could go in anything. There you go, folks. You don't have to choose. You can actually use whichever technology works best for you and quickly write mobile apps using .NET and Xamarin. It was great having Matty and James here. They did a fantastic job showing us what you can do on the Mac today. And before we move on to the next session, which means we covered mobile, we covered games, we covered Azure, we covered mobile. So now we're going to focus on how you can be more productive using the IDE and learn some cool tips and tricks on being more efficient. So we're going to take a very quick break and then we'll be with you with Michaela and Kendra. So stay tuned.