Jon (00:05.922) Welcome back to another Gone Mobile. This is episode 99 and do you know what that means? Allan Ritchie (00:12.261) What does that mean? Jon (00:13.958) Well, the next one will be one more than 99, which is 100. Allan Ritchie (00:19.187) That was like a bad dad joke, man. Like that was terrible. Jon (00:21.51) Well, I mean, hey, if the shoe fits, right? If the New Balance sneaker fits, then it might be. I think I do. I had to get the dad running shoes to go to Disney because like the one thing I've learned from going there in the past is you don't have to care about what your footwear looks like. It just needs to save your feet. Right. So. Allan Ritchie (00:24.307) Hehehe. Allan Ritchie (00:29.043) Oh, do you have those for your for your? Allan Ritchie (00:43.242) Exactly. No, I agree. So does it look like a like a moon boot or something like you could walk on out in space with them or what? Jon (00:48.934) I was told by my wife that they're actually kind of in style maybe even. I don't know this for sure. I can't confirm or deny because I don't know, but you never know. True, true. She might just be saying this. Yeah. So a hundred episodes now. I mean, I think you're kind of cheating a little bit. Like this is what, how many have we done together since we rebooted? Allan Ritchie (00:59.09) Your wife has to support you though. I mean she'd probably be the first one to kick you while you're down, but... Still. Allan Ritchie (01:16.305) uh i don't know eight no i usually come prepared no oh yeah look at that so we started at 88 so this is episode 11 for me yeah okay i cheated but and i was never on this show before and i've been around this for a long time i'm actually pretty offended by that you were surprised Jon (01:18.328) Yeah, you weren't expecting that question. No, it's gotta be more than eight. Jon (01:26.407) Okay, okay, so we're going. Yeah. I know, I was kind of surprised. No, I was, I actually, I remember looking back at one point in the episodes and looking at the guests and I'm like, I'm sure that we, we had you on to talk about something. No, no, I guess not. Allan Ritchie (01:46.705) You do not. It's because I only wrote plugins at the time. Nothing UI. Samorin always loves its UI. It doesn't like all the stuff that keeps mobile going. Whatever. I won't take offense. Jon (01:51.396) Wow. Jon (01:55.942) I feel like we talked about some plugin area things too, but I guess not enough. But so let's let's yeah. I know I saw that. Allan Ritchie (02:01.297) People are still using user dialogues. I released an update this week because somebody was like, are you going to update this? And then, you know, of course, good friend Dan was like, hey, I'm using user dialogue. So you can update this thing. Yeah, okay. It only takes like a couple of minutes. So I did. It doesn't take that much effort, whatever. Just don't bug me for features. Jon (02:16.582) Bye. Jon (02:21.414) No, I, I already had taken my dependency on it out. I mean, as I had a dependency on it to begin with. So you're always giving me the gears about not ever taking dependencies on things. I was using user dialogues until you stopped updating it. Yeah. Yeah. For windows. Allan Ritchie (02:37.296) No, I don't believe you. Oh, for Windows. Yeah, okay, that was more of a demo than anything, but anyhow. Jon (02:45.638) To be fair, I mean, I was using the things that I wrote or inherited or whatever. And then I think the cheese baron has been, you know, keeping the lights on on them ever since there's like the, oh, what are they called? BT progress HUD, which was originally by Nick. Was it Nick? No, it's fast chicken. I can only think of people's. Allan Ritchie (03:03.503) Yeah, you had those good loader plugins. Yeah. Allan Ritchie (03:11.375) Nick Weiss? Yeah, yeah, yeah, yeah. I'm pretty sure it was Nick, Nick Weiss. Is that how you pronounce his name? Not wise. Jon (03:15.11) handles, not their actual names. Okay. That might be, it's been, no, it's been a while. So that one, and then I had done a, did I do a binding or a port of like, and HUD? Yeah. So I still use those, they still work. They're all right. Allan Ritchie (03:23.694) Yeah. End. Now as a port. Both of them are ports. Allan Ritchie (03:35.598) Yeah, they're still going. I pulled in updates. It looks like a cheese baron has updated them to when we were at a 2 .0 minor things. I don't know. He keeps them going. He loves his native .net iOS Android. I love that he keeps that going. I know the world is all Maui now, especially for you Microsoft guys, but there are native guys out there and I still love it. I love that it's out there. Jon (03:45.51) Yeah, I think, I mean, at least net whatever support. Jon (03:54.212) Yeah. Jon (04:00.806) Yeah, it's like, you know, now it's kind of like a hipster artisan kind of, you know, handcrafted native app code thing. Allan Ritchie (04:04.59) Heheheheh Allan Ritchie (04:08.878) They do all right with it. I mean, he's keeping MVVM cross going too, which I mean, not everybody's used that at one point, especially when it back in the PCL days. It was fantastic. It still is fantastic. Their binding language was, was awesome. You know, that was pre -XAML. I think he's still doing that stuff and you gotta love, gotta love him. Jon (04:15.27) Yeah. Well, Jon (04:24.23) Yeah. Yeah. Jon (04:28.998) It's pretty, yeah, it was pretty cool. I mean, and that was, you know, speaking of episodes of the past, like that Greg Shackles, right? He was a, they were a big user of NVM across at the time. So, yeah, that was a cool library. Allan Ritchie (04:43.405) I will say one thing, it's still out there, he's still updating it, but be nice to Tomas, is that how you pronounce his name? I'm sorry if I pronounced your name. He is the tallest dude that I've ever seen for a developer. If you piss him off, I can guarantee you he could crush you. So be nice, be nice, be nice to all open source developers. Yeah, he's a nice dude, but seriously, if somebody, if you were ever going to be worried about a developer that could crush you, it would be him. He is a... Jon (04:50.214) I think so, maybe. Yeah. Yeah. Jon (04:59.91) But he's also really nice too. Yeah. Jon (05:06.65) Eh... Allan Ritchie (05:13.581) He's a tough, tough looking guy. Jon (05:16.038) So yeah, I mean, and that is a good commentary member as well, right? Be nice to your open source developers. That's something that I think is increasingly difficult these days in terms of wanting to put code out there and creating things. And now, I know this week we wanna talk a little bit about some of that, some of the idea of creating these things. You and I both have a long history of creating, you know, things that we throw out into the world as generally, you know, NuGet packages and libraries like that, right? What's like the first library that you would kind of say you did this with? Allan Ritchie (05:57.548) I know user dialogues comes up, but it was not the first. It was actually file system was the big one. So when I first, it didn't, it, what the hell did I call it? I don't even remember now. It was that in cash was actually first, the first libraries I wrote, um, it was back with mono touching when mono Android was first coming out like Novell. Jon (06:05.03) Oh, which one was that? Jon (06:24.804) Yeah. Allan Ritchie (06:24.875) Like Miguel had just put that thing out. We were doing a POC in the company I worked for at the time. And things were pretty radical then, right? Like you just, I needed to know the file system, figured out how to do it. It was kind of ugly that the progression of these, these plugins was awesome to see over the last few years. I mean, it's where it is now compared to where it was then is awesome. But the first ones I wrote was a file system. I don't remember the name of it. And user dialogues came not too long after. And then I think I fell in love with everything and I went a little bit crazy for a few years. It seemed like. Was you, you were right more the UI components and then James and I were going kind of. Head to head back with plugins and VVM cross. Actually, I want to put this out there. MVVM cross really invented our plugin ecosystem on Samorin. It's not James. It's not myself. They already had a whole whack of these things going and Stewart at the time. I forget his last name. Jon (07:15.11) Yeah, I think that's fair. Yeah. Jon (07:21.606) Yeah, Stuart Lodge, yeah. Allan Ritchie (07:23.531) Yeah, he was, he was writing a whole whack of this stuff back then. He really got it going. Now they were all simplistic plugins. I think they updated over the years, but he really kind of started that whole thing. And then I was like, well, along comes the Amarin forms and all these other things. And then I think that's when plugins really kind of got going because we couldn't be vendor locked or frame framework locked framework locked. Jon (07:27.374) Yeah. Jon (07:33.828) Mm -hmm. Jon (07:49.83) Hmm, yeah. Allan Ritchie (07:51.083) Even now, even now I still try not to get framework locked on Maui. I have hosting options, but... Jon (07:54.374) Well, this is why I write my own stuff so I don't get plug -in locked. Jon (08:39.840) Yeah, so I was looking through my Git repo history, going as far back as I could, right? And I was looking for like, what did I first start creating that I put out into the world? And a lot of it focused around things I needed for my app at the time, which was that push notification for Gmail accounts, right? That janky thing that I would log in on your behalf and monitor your emails and send you notifications. Allan Ritchie (09:07.120) Remember that one. Jon (09:08.960) It was, it was all objective C it was before mono touch was a thing. And so I did like the whole web view wrapper of Gmail because like at the time Google or not Google, uh, Apple only did push notifications for email for iCloud accounts. And I think AOL accounts or something at the time, but it didn't work with Gmail. And I'm like, I use Gmail and I, I need to have my emails sent to me ASAP, right? Like the world of I can do it. So I want to do it. Allan Ritchie (09:11.928) Okay. Jon (09:38.592) Um, and so I made that the app and the, you know, I made this whole server and .net and did like the server side thing and sent notifications out and hosted the web view and like call, you know, invoke JavaScript to like hide elements and stuff to make it look like a little bit better for the app. And, uh, it was, it was, it actually did okay. Um, and I feel like I missed my moment in time for having one of those apps that like blew up. So like what happened was I made the app. I uploaded it to the store and then we went to Europe for two weeks, right? As soon as I did that, this, this lawn trip we had planned. And back then it wasn't like you didn't have, there was wifi places and stuff. I brought a laptop, but it wasn't like I had a phone and data and you know, I was connected there and stuff so much. So went to Europe and then I midway through the trip, I get an app rejection, you know, from Apple or for, yeah, from the app store process. And that they rejected it because I didn't check the box that said like this app could display content, you know, for 18 plus, because it was hosting a web view essentially, even though it was restricted to like Gmail. They're like, no, no, no, you got to check that box. So I just resubmitted. Allan Ritchie (10:52.016) You can still get some X -rated images through Gmail. Occasionally they still slip through, but... Jon (10:56.608) Oh yeah, I'm sure, yeah, but like, you know, I'm just like, really? Like, could you not just check the box for me? Right? Like all I did, no, I know. And I didn't change the binary. I just changed the listing and resubmitted it. And at that point in time, App Store reviews were like, you could have it take weeks, right? Like there was a time where it took forever. And in that timeframe, before I could get it approved and on the store, somebody else did the same thing. Allan Ritchie (11:04.432) They haven't changed either. Jon (11:23.872) And there's shot up to like number one in the store for a while. And I was so mad because I'm like, I could have made all the money in the world, right? I charged like 99 cents for this thing. Um, so anyway, a lot of, a lot of libraries kind of revolved around doing stuff like that. Like I wrote some IMAP client at one point. Um, I wrote some stuff for mono touch, like dialogue. I remember writing like a custom drawn. Allan Ritchie (11:35.376) missed. That's all right. Jon (11:53.920) dialog or list table cell or something like that. I ported some of the URL helper kind of libraries. There was that one URL image view helper on Android. And then, oh, pass kit stuff. I wrote a pass kit parser and that was fun. And then the one that kind of started me down the road of doing more of this was zebra crossing. So I made, yeah, so it. Allan Ritchie (11:57.572) Alright. Allan Ritchie (12:19.392) Was it zebra crossing that was first or was it because your push sharp your push sharp was like Jon (12:23.168) It was a journey. Push Sharp was there too, but I think that was, technically I had started a separate, I did a GCM Sharp, so like the Google Cloud messaging. I did that first and then I think Push Sharp I did later, because I'm like, well, I want all the platforms, right? Push Sharp was like the library that was, and probably still is the most used thing that I've done, most popular library. Like at one point the number of stars on it was kind of crazy for what it was. Allan Ritchie (12:28.464) That was major. Allan Ritchie (12:50.284) Yeah, you blew up. You went viral, John. You went... Jon (12:52.800) But yeah, I went GitHub viral. But zebra crossing was kind of my, like, it was a journey. It was trying to figure out how do I, at first I was trying to port like zebra crossing the Java library to be able to use it from .NET and then try and use that inside an app and all these different things. And yeah, it was, it was a bit of a journey to get it to where it eventually landed. And then now that we're in Maui, You know, there's other way there's other plugins out there that do this and probably do a better job too. I did do a simple port, but it was kind of one of those like, eh, it works for the basic my scenario. If you want to do anything more complicated, you're probably going to be on your own a bit. Allan Ritchie (13:32.720) It did work well. I used it a bunch of times. It's when I did notice there's still a crossover. Like when you get to hardcore scanning or stuff where you need like turbo like zebra crossing the algorithm isn't the fastest in the world. There's that there's that they're like scanned it. I've used that quite a few times that one's that it's still there. It's still there. And that one's like a lightning. You don't even have to put it. You know, they say center the image and you're like it sees like a corner of it. And it's already like Jon (13:42.034) Yeah. Yeah, it's just not that fast. Yeah. Yeah. Back in the Xamarin day is the app. Okay. Yeah. Jon (13:58.312) Yeah. Jon (14:02.400) And, and, you know, to be fair, like the devices have gotten better too. So now it is zebra crossing all of their algorithms work. Okay. Now, like they're not, maybe still not as good as scan it by far. I'm sure. So if like you were building an app in the apps, like sole function was to scan barcodes, like go use a good component and pay for it. Right. Yeah. Um, which is kind of an interesting topic in this conversation too. Right. There's, I mean, we put these things out there. Allan Ritchie (14:20.272) Yeah, use a paid solution. Yeah. Jon (14:31.232) We have all these libraries and plugins and there's a lot of people that are spending their time and energy and putting these things out into the world for free generally. Right. And usually it kind of, I think, I think it's fair to say that most people who are putting code out there in this kind of form, part of it is at least because they, they needed it themselves at one point or still do. Right. It's kind of self -serving. Right. Allan Ritchie (14:54.256) I do it. I do it. Allan Ritchie (14:59.184) Just in case, I don't know. Jon (15:02.144) Hehehe Allan Ritchie (15:04.528) especially the cross -platform stuff. So yeah, I think when I started doing it, it was a need, it was a business need, and then it became fun, right? Like a lot of the cross -platform and the way that things were evolving there was kind of fun. And like none of these things existed. So I went crazy. I started doing geofencing, settings, Bluetooth, like you name it. I still use some of those, well, I use pretty much all of them. All of Shiny is used professionally somewhere. And... Jon (15:23.166) Mm -hmm. Allan Ritchie (15:33.712) That's why I write it. I write it because one, I forget how these things work. I don't know. Do you even think now if you had to go in and remember how to write stuff in iOS that you would remember? Jon (15:42.354) So I do that, or I have more recently done that on occasion. So like one of the things I've been playing with is collection view stuff, right? With my virtual list view. And part of that has just been kind of keeping a separate iOS only app just to like implement stuff there and see how it works without any Maui stuff involved. And so, but yeah, it's like hard to remember. I'm like, oh, how do I? Allan Ritchie (15:52.970) Yeah. Jon (16:09.696) I need a UI view controller and then I gotta add my views to it and then I gotta make all these like delegate things. Like what? It's, yeah. Allan Ritchie (16:19.792) It's crazy. And then when you start doing it cross platform, you're like, okay, I got to remember the other side of this equation now. So it was always a challenge, right? Back then it was fun. You know, we attacked one problem area and we, we had, we had lesser APIs. I want to say back then. And now we have like a gajillion, right? There's like a gajillion APIs. Everybody needs more and more and more. So you're constantly building on those things. So it just, the plugin world got hard. Jon (16:25.084) Right. Jon (16:39.444) Yeah. Allan Ritchie (16:49.584) Like it really did because you needed so much more on top of this. So it wasn't just remembering all the things. It was like, okay, yeah, now this has to geofencing, you know, these are the options on Android. You got to save that geofence because Android is stupid. It doesn't remember anything you tell it. So if a reboot happens, it's gone. iOS remembers. Jon (17:07.378) Yep. Jon (17:11.392) Yeah, but iOS, I recall at one point, I think I did this like as a contract thing for a company. They're like, we want to do like 10 ,000 geo fences in our iOS app. It's like, well, you can't do that. I mean, not with like just the straight APIs, right? So I did something to like, you know, keep the fence locations and do like rough location and swap them in and out and do all that kind of fun stuff. So, but yeah, like there's, there's so many different things that you. Allan Ritchie (17:21.968) Yeah. Allan Ritchie (17:39.664) I have one that I still haven't released. It's built on the locations, the shiny GPS, right for background. But the geo -fencing is done through geo -json and it just keeps going. It's like, are you in this geo -fencing or are you transitioning? And it watches it. It does it fairly smart. So I don't release everything as open source. I built a lot of professional stuff on it. One day I should release it as a licensed product. Jon (17:51.966) Okay. Jon (18:00.606) Mm -hmm. Allan Ritchie (18:06.768) But the whole point was is that you have to have all these things to build on, right? It's like Lego. It's like Lego. And... Jon (18:11.168) Yeah. Yeah. Yeah. And the world of like putting those pieces together has gotten a lot simpler. One of the things that I was scanning through the repositories that I had in my own like, you know, org or name, uh, was a fork of something like Newtonsoft .JSON because back in the day we had to like recompile it so that we could use it with SignalR because it didn't compile, you know, for the targets we needed and that kind of stuff. So like, Yeah, a lot of these things were built out of necessity, but we've definitely evolved to the point where we're in a better place and it's generally easy to plug things together and to find something that does what you want. Like if you search, you know, you're probably even with Maui stuff, like I'm finding there's something out there. It might not be the thing you want, but worst case often it's like, okay, there's a new get. Maybe it doesn't work how I want. But there's also a repository that they're linking to in the NuGet and I can go get that code and fork it and use it as I need to, right? Allan Ritchie (19:13.072) This is something you do, Jim. Allan Ritchie (19:17.776) John recently, this is one of the things too, as we kind of get into the topic of how I usually or how we approach writing these things. One of the things I like to think about too is the people that I do a lot of work with. So John and I obviously for talking, I like his code. He likes my code usually, but he doesn't use my code and cause you don't do a lot of background stuff or two different ends of the spectrum. You're better at the UI stuff. Anyways, I hate UI. I'm not good with pixels. I'm not good with pixels. Jon (19:28.512) you Jon (19:38.792) Nah. Meh. Allan Ritchie (19:47.504) But one of the things was is that a lot of these things like when I'm trying to think of an API, so John doesn't generally tend to take dependencies. He's like the worst, he's like a big stone wall. I get it, I get it because those Android dependencies, man, they're big, they're painful, there's a lot. And I know one of the key things is that a lot of people tend to take open source as like a crutch, right? Jon (20:01.920) Yep, build it all. Jon (20:15.816) Yeah. Mm -hmm. Allan Ritchie (20:16.880) You don't want to take it as a crutch. You want to take it as a time saver. Right? So if you're looking for that thing to just do. Allan Ritchie (20:27.056) It's great. And you also get to learn what's kind of going on underneath. So that's one of the things you generally like to do. You have to know how it works. If you don't know how it works, you're going to dig first and then you'd be like, okay, later. Jon (20:34.526) Yeah. Yeah, and then I might find out, like, I don't like how you did this and how it works, so I don't want to use it. Or I might be like, yeah, that's cool. This is great. I'll use it. Allan Ritchie (12:08.) So as I'm thinking through these problems, I'm like, as with any engineering task, I'm like, have you gone too far? Right? Is this doing too much out of the box? Right? So you're not using it as a crutch. I'm always questioning, am I doing too much out of the box that prevents it from being used from you using it or whatever? And is that because it does so much and you just want it to do this little thing, is it too fat? Jon (21:12.032) Mm -hmm. Yeah, what, well yeah, and part of it is the dependency chain, right? Like you start looking at something, you're like, do I really wanna take this all in for this one little feature of my app? And if it's a main part of your app, sure, but if it's like this kind of value add little feature that not everyone's gonna use or whatever, it's like, eh, no, don't really want to. Allan Ritchie (21:12.432) big beast. You don't want our ex. I know that's that's the number one killer for you. You don't want that dependency. Allan Ritchie (21:26.352) Right. Allan Ritchie (21:36.038) Exactly. But the case would be made is that why do these big fat frameworks like shiny always gets that it's too fat. It has these dependency chains. I get it. I do. But if you've done this enough, like I usually don't bring in shiny for just push or just Bluetooth. It's usually a whole conglomerate of those things because the core has like all the stuff like permissions and people say. Jon (21:48.800) Yeah. Allan Ritchie (22:02.672) to use essentials well you know because I want to go to places where Maui might not go. Maui Web right it's coming John right right Maui Web Web Assembly come on come on I'd love it. Jon (22:03.604) Yeah. Jon (22:11.648) Maybe one day. That'd be great. I mean it would have saved us the whole last episode talking about Blazor. Allan Ritchie (22:18.672) So anyhow, I do want to go to places where Maui... Jon (22:24.612) Mm -hmm. Allan Ritchie (22:26.480) There also is other hosting platforms. Allan Ritchie (22:36.464) at some point, right? So I need my own permissions, the ability to request them. So that's outside of essentials. You might need some file storage. That's a big thing in Shiny. Like I said, geofences don't save. Android's like, I don't know how to do this. Right? So you have to have these backend things to support the lack of platform support for them. So, and as time gone on, like I said, you started with this little thing. Jon (23:00.672) Okay. Allan Ritchie (23:05.552) settings and then it grew to, well, I want to store JSON and then it grew to how do I bind this? And then how do I do dependency injection? And then how do I do logging? Right? So you end up with this big long chain, whether you want it or not. And then eventually it can turn into a framework if you don't manage it. So that's what happened with mine. So how do you do this? When you look at it, let me ask you the question, John. So you're doing this jobs thing right now. He wouldn't take the dependency on shiny. I'm not wounded. I understand it. That's the important thing. I'm only slightly wounded. Jon (23:25.924) Yeah. Allan Ritchie (23:37.328) When you start stuff like that, what's the first thing, how do you write a cross -platform thing? How do you usually approach it? I know it sounds like a loaded question, but where do you start? Jon (23:41.188) How do I write a cross platform thing? I think, no, no. I mean, I usually start, I think it's with understanding, I mean, what my own needs are from it, right? So like, if we take the task stuff, I think there's two paths I would go down at that point when I'm starting to put this into my app. One of them is, can I, is it big enough or is it? to kind of just put in my app and not kind of bring out into a library or bring a library in for. Like I think I do that decision before I even kind of look to see what's out there is I'll kind of evaluate like how much of this do I need? What's the kind of the amount of code going to look like? And in the case of the background, you know, task job stuff, whatever, you know, I kind of found like, oh, that's not that heavy for the parts I want to use for me to write it. Now at that point, you know, in my own, be there, I'll decide like, I'm just going to do it. I'm not going to spend the time on like trying to build something that's more reusable, but often, you know, when I'm trying to do something like that, like in the case of zebra crossing, it was like, Oh no, I want to use this in my app, but I also see like, there is a lot of potential that others would probably want to use this too. And probably you want to use about the same, you know, surface area of an API that I want to use. And then I started thinking like, okay, how do I, you know, should I extract this out into something that I can just throw up there, let other people use, or, you know, at that point too, it's also, if I get to the point where I'm like, this might be kind of too big to do on my own. Um, is there something out there that already does it of course, right? And then it's kind of that whole evaluation of, is it, I've done a few times, I think where I've looked at options that are out there and, and to be fair, I've not necessarily shiny specifically. But when there is something like that where I see this whole like infrastructure built around this one piece that I want, that often has made me kind of go like, oh, I can make a small version of this that's just that piece so that somebody else in the same boat might want that too. Allan Ritchie (25:55.376) And it usually makes sense. I'll be honest, it absolutely does. Like in the case of Shiny Push, I know a lot of people like the abstraction there, but it's a heavyweight, right? It's got the core attached to it. I might actually, I'm working on a 4 .0 where I might decouple it, but Push in itself is a small little piece. It just, it needs that hosting infrastructure to get at stuff like the AppDelegate and things in Mowing. Jon (26:08.192) And. Jon (26:17.408) And I get it, totally. Because like you said, for your own purposes, which is the thing. So first of all, again, you're not getting paid directly by anyone consuming Shiny to do the work. So to some level, we both are the same. We're partly doing this. We could do this and just always keep it to ourselves, close source and never throw it over the wall. But that's not... how we think and so we're putting these things out there. And so at the same time, it's like, yeah, but if you don't like it, then just too bad. Like you're not paying me to change it. So for your own purposes, you know, it's your primary use case. I totally get the whole layering of things. It's like you said, it's like, well, yeah, if I want to have logging, I have a thing that does logging for me. Why wouldn't I just use that? Because that already, you know, sits on top of the way I do configuration and all the different things. Now, Allan Ritchie (26:54.609) Don't use it. Allan Ritchie (27:06.090) you Jon (27:14.752) I am kind of curious, like with the dependency injection stuff and using more of like the Microsoft, the abstractions, the whatever hosting abstractions extensions. Yeah. Sorry, not the hosting. Yeah, I know. I, I confuse those terms up and I know they're like very loaded meanings to, to different things that I conflate often. Has that, has that gotten you to a point where like you're able to more decouple those types of things? Like. Allan Ritchie (27:19.336) The extensions. I don't use the hosting extensions, but the hosting ones are. Allan Ritchie (27:39.472) Yes. Jon (27:40.544) If we all can agree on, yes, those are the abstractions that everyone should use. Then like logging is kind of like, you know, what, whatever you want to use for it. Allan Ritchie (27:48.508) The Microsoft extensions actually kind of led the way for Shiny because it was like, I mean, Prism's been doing that for a while. They had their own kind of container abstraction layer. But really it was, I kind of wanted something general that everybody was going to use, right? And the Microsoft extensions kind of lent themselves to that. They have a fantastic DI layer, despite what people think it is fast. Jon (28:07.712) Yeah. Allan Ritchie (28:15.536) It's not as feature as feature rich as something like AutoFac. It doesn't have to be. But what it did do is made a pluggable layer. So AutoFac can get involved. You like AutoFac? You can plug in AutoFac. But people would be complaining because a lot of Chinese obviously background stuff. How the heck do you log to it? Right? So people would be like, I don't like your logging abstraction. Okay. Well now it's built on Microsoft extensions logging, which pretty much everything plugged into now. What about App Center? Okay, fine. Here's an App Center abstraction I made. Jon (28:16.648) Sure. Jon (28:24.704) I was gonna say, like, you can still use those. Yeah. Jon (28:32.220) Yeah. Jon (28:37.416) So use whatever you want. Yeah. Yeah. Allan Ritchie (28:44.688) By the way, don't use it anymore. I got rid of it because App Center is gone next year. Anyhow, it was easy to say. Now you can put whatever the heck you want in. I'm using it. You can call it fat, but you know what? The good thing is that you guys in Maui took both of those for me as well, right? You ended up taking those dependencies. Even if it's just the abstractions, it's already there. You can't call me all the fat anymore. You guys did it too. I get the benefit. You're sharing the weight. You're sharing the weight. Jon (29:03.038) Yep. Jon (29:10.560) Yeah. Well, you know, it went, you know, when, when we had the opportunity to rethink some of these things with Maui, right? So like, I know there's been, there's a little discourse as of late at, you know, as to like, Oh, Maui, you know, we, we did, redid too much and that hurt quality and like, yeah, that's not untrue. Um, that a lot of changes and then the way that we kind of approached it meant that we took a step back. Allan Ritchie (29:16.642) Thank you. Jon (29:40.350) in quality, maybe from forms. Um, that's a whole other topic, but one of the things that, that allowed us to do was to rethink some of those decisions. Right. And, and that, I think the, the time at the time where we were planning this out, you know, one of the things that there was two, two big pieces for me. So as somebody who has done enough creating of libraries and stuff for, for Xamarin forms and Xamarin in general, One of the big sticking points was all of the lifecycle stuff you have to tap into, right? So many times with plugins that I made, and I'm sure you've found this too, people aren't calling the right lifecycle methods from your library. The whole old pattern was like, right, was to like, you'd basically ship a ReadMe, and I know James did this in all of his plugins, where it's like, it'd pop open a ReadMe text and be like, you have to put this line of code here for iOS and this line of code here for Android, blah, blah, blah, right? Allan Ritchie (30:21.648) at the right time. Yeah. Jon (30:35.936) And so that to me was one of the biggest opportunities as a library creator, a plugin author, uh, that I could influence how Maui went. And so, you know, I really pushed for like, let's, let's think through the life cycle thing a little bit better so that people aren't having to put random code places. And so that libraries could build their own extension methods that, that people could then very easily call against their app builder essentially. Right. Um, and so I think. Allan Ritchie (31:03.504) And it made things, it did make things easier, right? It just, it's a plugin. Jon (31:06.272) I think it's generally been good. I mean, there might be some cases here and there that we still need to look at or that we don't cover exactly, but you know, for the... Yeah, no. So the push on iOS is an interesting one. And this episode feels like... No, that... Okay, fine. Allan Ritchie (31:13.620) Push on iOS. Allan Ritchie (31:20.848) I - we know why it's like that. No, don't go into it. Don't go into it. Don't - It's a deep one. That's a deep one. Jon (31:29.440) It is, you know, Apple and app store rules and all that fun stuff there. I think it's solvable though. It's just, we have to spend the time to actually do it. Um, but generally, no, I know I don't want to do that way though. There's a better way to do it. Uh, we'll, we'll talk the, the, so that was one big part. And then the other part was finally, uh, I don't know what the right term is. Is it succumbing to giving up on learned helplessness? Allan Ritchie (31:31.972) Yes. Allan Ritchie (31:36.848) I got around it, you just have to copy in those code, the code that John saying don't do that. Allan Ritchie (31:45.136) Okay, we'll talk. Jon (31:59.206) to the idea of using all of the Microsoft extensions patterns and stuff and DI. Allan Ritchie (32:06.576) Well, let me, I want to comment on that one because I really feel that you guys got that right because it really, I mean, you're not all the way there. We won't even go into it to shell and stuff, but in terms of the life cycle and how you spin up an app, it's very much like ASP .net, right? Which is important because a lot of your devs that are coming over aren't your native devs. They aren't your Kotlin devs. They're, they're going to be people that are probably out of ASP .net, C sharp .net. Jon (32:14.376) Yeah, yeah, well, yeah, there's... Yes. Allan Ritchie (32:36.848) they're going to want a familiar pattern. They have that now. They're going to want it. It's not perfect. It's obviously, you know, when you're going from web to mobile, it's a very different setup, but they're going to be comfortable because they have configuration. So they know how that works. They're going to have logging. So they know how that works and they're going to have DI, which they obviously know how that works. So all those, all those comfortable patterns are there and you've built it well with, with stuff around it in the app builder, like the life cycles and all that stuff. Jon (32:43.390) Yeah. Jon (32:58.770) Yeah. Allan Ritchie (33:07.024) So now it's like a comfortable, it's a comfortable world to be in. Jon (33:11.392) Yeah. And that was the goal really. And that's, I think where I kind of finally, um, you know, agreed that, okay, this is, this is what we should do because of all of those reasons, because of the familiarity with that pattern from ASP net developers, because of, you know, being able to wire things up in a consistent way and all that kind of thing. Like, um, I am, I'm very happy in hindsight that that is the direction that we went. Uh, I've, I've, you know, had a few sips of the, dependency injection, Kool -Aid and all of that. You know, that was a, it was a cultural thing too, to a large extent in Xamarin. You know, I think like, I know like James kind of came around maybe even sooner than I did. I know he, he messed around with some stuff in Xamarin forms to kind of like figure out how would we do this a little bit here? Allan Ritchie (33:42.032) I have a screenshot of that by the way because it took a long time to get that out of John. It was a tough sell like RX. Allan Ritchie (34:05.040) Oh, I've been doing it for years. I've been trying to convince him for years. James was always on my case about DI or RX or something. I was like, dude, he finally admitted he's like, look, I don't have anything against DI as long as it's out of the box. Fine, James, I'll let you have it. I'll let you have it after all these years. You still pay in the ass, but you took it. You did it. You admitted it. Jon (34:08.064) I, yeah, I know. Jon (34:12.608) Uh, yeah, I know. Jon (34:21.728) It's, and yeah, like I said, I think, I think he came around to it. So like, yeah, there was a large culture of like, you know, these kinds of things of weight and heft are not suitable for the mobile side of things. And I'm not going to say to be fair, but you know, in, in that, I'm not saying it. I said, I won't say it in the early days of mobile, we were fighting for as much, um, Allan Ritchie (34:38.296) But... Jon (34:48.124) performance and app size and all of that kind of stuff as we could fight for. And the, those two worlds maybe could have been meld, you know, melded together a lot sooner than they were. But I think, you know, to some extent early days there was concern of, of adding this kind of stuff in. And that was maybe somewhat justified. Allan Ritchie (35:09.328) So I'm take a different look at that. I think I have a different kind of perspective on it just because I've seen it. So a lot of the Xamarin .Forms stuff, a lot of people got ticked off at me in the early days of Shiny because I was forcing DI. It didn't matter. If Xamarin .Forms wasn't doing DI, I had a need of getting into the Android application, any need of getting into the iOS delegate, et cetera. Those weren't a thing with Xamarin .Forms. And people didn't understand it. They didn't understand DI. Jon (35:16.798) Mm -hmm. Jon (35:29.312) Mm -hmm. Allan Ritchie (35:38.256) They didn't understand why I couldn't just do events. It's because people kept wiring these things up at the wrong time. Right. But everybody was doing autofac. Like there was so many companies, big old dinosaurs doing dependency injection, whether Xamarin forms wanted to do it or not, and whether it was performing or not, they were going to do it. But where would they be running that container on Android? It would be with Xamarin forms activity startup. Right. So all this infrastructure would be spun up and your background process would be like, Jon (36:03.454) Mm -hmm. Allan Ritchie (36:07.792) Where is this stuff? Where is it? Right? But it didn't, it never hit an activity. So they'd fail. Right? The other thing was, is that performance generally that the people that I'm seeing writing Maui or Xamarin forms apps, they're usually enterprise. They don't care if it takes five seconds for the app to turn on for a customer. They're interested in the, the rad, the rapid application development, tough, tough customer. Jon (36:10.368) Yeah. Jon (36:29.760) Yeah, but, but the, the, yeah, no, no, like I, I get it. And the sad thing is though, is like those two things kind of were competing goals and to an extent still are. And not forget it for the only reason of like somebody wants to look and say, uh, and we've seen this like, you know, measuring happening on Twitter over the last, even over the last like year or two, right? I've like, Oh, well we start up this fast. I'll, you know, look at how slow Maui is. And it's like, we, that was always a theme, right? With Xamarin was like, we, we were in startup mode. We were in trying to gain market share and everything. So it's like, you couldn't have your thing out of the box, look bad compared to the competitors. And so as dumb as that may be in the reality of most customers ended up doing these things and not having that as a realistic startup time to compare against, that was kind of the goal. And for better or worse and obviously worse. Allan Ritchie (37:07.856) Yeah. Allan Ritchie (37:27.920) It does make sense. It does make sense what you're saying. It's just I've seen it for both sides. I've seen an app the worst I've ever seen, one of the worst managed apps I've ever seen. They used AutoFact and on the Android tablet they had, it took 25 seconds to start up and that was acceptable. And they had something like 250 dependencies. I'm like, okay, so guys, you probably should have stopped and thought about the engineering here. You're not really solving any problems as much as you are creating them. So you see it from both perspectives, right? Jon (37:55.080) Yeah. Allan Ritchie (29:20.) But again, it was a big B2B app, so they don't care about the startup. But 25 seconds, I mean, nowadays, I'm pretty sure the OS would be like, ah, yeah. Jon (38:08.724) Yeah, no, Apple, I think Apple gives you 20 maybe at the, maybe that was even a while back. Okay, I think they used to give you more, but yeah. Allan Ritchie (38:12.304) No, startup, startup is eight seconds. You're not in eight seconds. No, never on that. Never on app delegate start. If that UI isn't kicking in eight seconds, that the watchdog is kicking you off. It's always been there. It's just that their processors and RAM is so damn fast. It just like zips on through, right? Whereas the Android ones are like, how slow can I go? All right, 25 seconds it is. Jon (38:20.766) Okay. Jon (38:24.992) Yeah, problems. Jon (38:32.992) Yeah. Jon (38:37.376) 25 seconds, huh? Yeah, I know, we've seen some really fun things that people do to themselves in app startup too that make things even worse. Allan Ritchie (38:44.176) Right. So, so my goal was to get structure. to deal with the lack of understanding in life cycle. So now that that's built in with what you guys did with Maui, you also took some of the fat that I carry with Shiny. It worked out great. Now there's a balance in the ecosystem and I don't have to say wire in these 10 million things because of boilerplate, it's already there. Because that was the hardest thing and you guys had the luck of this draw was that you could always have the base app delegate and you could always have the base Android activity, which that's a... Jon (38:52.084) Yeah. Jon (38:59.102) Mm -hmm. Jon (39:07.374) Yeah. Allan Ritchie (39:18.160) big people don't realize you can't just because we don't have multiple inheritance. You can't just say stick this on top. It's like a game of whack -a -mole who gets who the common denominator and it's it's it's obviously you guys we can so it just became a case of well boilerplate it is so with Maui when you did that that was a that was a great thing because it saved all of these things save push on iOS. Jon (39:23.464) Yeah. Jon (39:27.936) Who gets it? Yeah. Who's the winner? And it's going to be us. Yeah. Allan Ritchie (39:48.688) wiring in all these plugins because that's what we needed. Plugins needed this this that infrastructure to hook into these things without competing with Xamarin Forms and or Maui. They needed a storage engine yada yada yada. We go through it they needed DI logging. Now we have all those things it's great it's great. Jon (40:06.112) Yeah, no, I think it, and if you look at like the, the number of plugins that have kind of cropped up in the ecosystem, like I'm curious if I just, you know, today search Maui plugin, um, you know, on NuGet like already I'm seeing 139 results. Now I don't know how many of those are things that are awesome or things that are, you know, maybe less awesome, but there's a bunch of stuff out there. That's for sure. And like the thing that I like, and this is kind of back to when you asked me how I approach doing this. I like seeing a lot of, and I like the pattern that, you know, did eventually kind of get established where we called them plugins, which was kind of interesting. Maybe, I don't know if that's my favorite term, you know, to have used or not, but it did kind of give people a thing to kind of like go out and search for. And so I like it when I see like the night, you know, the neat and tidy, like, Hey, this plugin deals with managing the screen brightness. Allan Ritchie (40:55.312) Yeah. Jon (41:02.272) Right? And like, that's it. That's all it does. It's a little thing. But like, if you want to do something with that, you just pull that in and it's pretty light and you get it. Yeah, there's time. Allan Ritchie (41:11.952) I was always the pull in the big guys pull in the big guys that do the stuff but teach his own teachers on whatever you needed to do right there that you're right there's a ton of stuff out there I don't usually like the term plug -in because it involves You know they because we use it for everything now we even use it for UI components and controls It's like no not that's a control library or that's a control. It's not a plug -in I mean it is a plug -in you just can pop it in and you get it goes but you know what I mean? It's a plug -in is like a like a Jon (41:18.432) Yeah. Allan Ritchie (41:40.528) dependency injected thing and it runs on both... I don't know. Call me weird. Allan Ritchie (41:53.488) I do remember the Xamarin components. Jon (41:53.840) back in the Xamarin days? Did you publish a component to the Xamarin component store ever? Yep, yep. Yeah, to this day still, I think that's like one of the, when we were like. Allan Ritchie (42:00.624) No, it was difficult to say the least and I was a big fan like why are we doing this? I knew why you guys were doing it because you wanted to have a marketplace for it right for people selling which Nuget lacks. Jon (42:16.752) doing the component store, that was the one thing that we kind of said, like we could just use NuGet if somehow we could better tie in the pricing or like some kind of licensing or whatever, but never happened. Yeah. Allan Ritchie (42:27.952) It was a great idea. I just didn't want to do both. You know what I mean? I just I guess I've never been doing open source. At one point I was hoping for money, but at this point I'm just like, does it work for me? Great. Go. So even back then I was like, do I want to go to the hassle of dealing with sales and taxes? Taxes in Canada suck. Jon (42:47.504) Yeah. I mean, you could, you could put free components on that. There was some, so like, I mean, I, I was on the components team. I eventually managed the components team. Um, so we did a lot of work in this area. It's near and dear to my heart too, even if it is, you know, a long lost forgotten thing, but there was some cool stuff. Um, like one of the things I remember doing too was there was that there was like a web embed thing you could do. It was like appetize or something. I don't remember the name. Allan Ritchie (43:00.760) Which makes sense. Jon (43:17.168) you could like run an app in the browser. And so we would start updating some of the component listings with like the demo app of the component. And you could hit the play button in the browser and like see it all working and interact with it. Oh yeah, that was fun until we got the bill for like how much it was going to cost to keep doing that for all the pages. Like, yeah, that was cool, but no, we're good without it. Allan Ritchie (43:32.368) You guys were fancy. I don't remember that. Allan Ritchie (43:45.872) It was a. Jon (43:50.256) Yeah, I. Allan Ritchie (43:57.144) or whatever and because I know I Allan Ritchie (44:04.336) You know people Allan Ritchie (44:15.728) I was like, how do I want this thing to work? So I started with the interface, which we're going to get to any in a few. I'm sure it's coming up to I started with the interface. This is how I want it to work. And then I would say, well, can I have it? And most of the times I get it right. Most of the time, you know, Android comes along with some weird permission. I feel sorry for you essential guys, because the permissions that are coming in Android. gonna hurt you're gonna hurt it's yeah those ones are the way they're doing them anyhow you know you had to settle with how the platforms would work and you sometimes end up having to kind of change your the way you were doing things a little bit but most of the time you could either you know you'd have to you'd only have to change a little bit so your interface would stay Jon (44:42.620) Permissions are always fun. Every platform change is always fun. Jon (45:10.608) Yeah. Allan Ritchie (45:10.864) Or you'd say, okay, you know what, Android, you are gonna remember your geofences because I've got infrastructure that can save it for your dumb ass and re -spin it when you boot up. Because that was the problem, right? Android just was like, you couldn't just say, here's geofences, keep spinning them up. So, you know, you just made the platform behave and you tried to make it behave the same. But I always started with the interface. Jon (45:35.728) Yeah, that's, I mean, I feel like I, I kind of went from both directions at the same time, usually where I might have an idea of how I want to use it. And I think this is something that, um, you know, I've, I've learned to, uh, have some confidence in, in, you know, thinking that I am correct in saying this, which is like, I think I'm pretty good. And I think you're pretty good too at figuring out like, what should this look like? What? it useful and easy to understand how to use and stuff to the customer, right? Cause I don't know. Jon (46:14.512) that you get. how this makes no sense. This is a weird way to hold this, right? So I think, you know, we've got a knack for kind of thinking through that part of it, but I always kind of do that in tandem with understanding like how the each platform is going to fit into that too, to an extent. I know I might not always get. Jon (46:41.168) creating like the thing that you want, how you want it to look like in work and it doesn't quite fit even though you thought maybe it would. Allan Ritchie (46:47.664) happens. I will try and bend the platform to my will a little bit if I can. You don't really bend. Jon (46:55.440) And I did that to an extent, like one of the examples I think was with zebra crossing, like when I first started making that, I didn't do it with forms in mind, I think. I don't think forms was around actually when I first started making that, not in any meaningful sense. And so like one of the things was like, oh, I want just a method to say like scan barcode and get back a barcode, right? And that... didn't work super nicely when you start considering the different platforms and how they do an activity versus a view controller and having to get the context for Android and pass that in and knowing where to return things and all that kind of stuff. So that was a case where I like forever, I was kind of plagued by doing some hacky stuff to try and make that work properly. Cause it's like, I think that's, that's. One of the things I always aim for is like, how can I make this super simple, but you know, not, but, but still useful broadly enough to make anyone successful at it, right? Like what's, if I was downloading this package, what would I want to have to do to make this work? And it's like, well, scan a barcode, scan barcode, give me back the barcode, right? Like that's how I want it. Um, yeah. Allan Ritchie (48:05.624) Yeah, stupid simple. It really what it should be. I mean, I could say I could say I tried to I try to get that always right. And I think I do. I know a lot of people obviously complain about the RX stuff, but it's there. There. It's a hill all day on unfortunately, but you know. Jon (48:13.776) But it does. Jon (48:22.862) Yeah. Yeah. Yeah. That's fair. I mean, and you're entitled to it given, you know, again, that this is all free code that others can take and do whatever they want to do with. If they want to fork it and get rid of our X, then they're welcome to do that, right? Yeah, so there you go. Ooh, essential. Allan Ritchie (48:41.648) I do offer async. Async versions of the stuff, but still people really should learn RX. It'd be good for you. So let's talk about essentials. I think when I started when I started shiny or at least the base concept of it, I think I had talked to James about doing a Xamarin standard. I had been bugging. Turns out that guy and you had already started something in the background and none of the community was involved. Drove me nuts. I was like, you guys suck. Jon (48:56.240) Okay. Jon (49:12.348) Yeah. So it, it, yeah. I mean, essentials was maybe one of the most delightful things I've gotten to do from, you know, a spend work time on it perspective, because we got to basically go and say, you know, what every developer was, if I could design this from scratch again, right. Um, and so over the years we saw enough patterns emerging in different plugins. Allan Ritchie (49:13.528) You guys suck. With the hoed interfaces. Jon (49:41.712) least, you know, a lot of them were James's plugins. A lot of them were probably your plugins. Um, and, and so there was these common things that we saw over and over again. Like one of the good examples was James had a, a plugin for just tracking the current activity in Android. Right. And so like when we talked about the life cycle method stuff, it's like being able to, um, use that from like another library developer's perspective was always pretty critical for a lot of different. things you would code. And so it's like, that was a good thing to say, Hey, we can put this into essentials and then maybe other people can depend on that instead of, you know, James's one -off plugin, which was fine. We're great. However, people kind of see that. And again, if you're going through like the dependency chain and evaluating, am I going to use this thing? Um, you know, more people are kind of looking at like, well, do I want to use this random thing that's in the dependency chain? Or do I want to use it? The one that. just bases itself on essentials, right? Which is the thing that I understand and know. So that was kind of the spirit of it, I would say. We often talked about the 80 -20 rule and the idea there was how can we make, you know, 80 % of the users or use cases of a particular area of functionality happy and successful? And not worry about the long tail kind of 20 % that might be like, yeah, that this almost does what I want, but I need this other little thing. Right. And so we would try to solve kind of with that in mind and, and full well knowing that for the, those 20%, they're going to have to go look elsewhere and do something different or do it on their own or whatever. But that's okay because the value we get from pleasing those 80 % and the amount of effort that goes into making that successful is much less than trying to please, you know, 95 % of people. So that was like a big thing. Allan Ritchie (51:42.672) But it was smart anyways because. Allan Ritchie (51:49.585) made it simplistic, right? The look, the... Jon (51:50.408) Yeah. Allan Ritchie (51:55.376) easy to consume, right? Allan Ritchie (52:05.584) They just want to say, you know, locations is a great one, right? Cause you can obviously do a ton with background, but in essentials and it is essentials, just give me the current location. Where are you? Jon (52:16.560) That was our 80%. Right. It's like. Allan Ritchie (52:18.576) Turn the radio on, get it from where I am now, return. That's it. Oh, you need a permission? We have the permission. Jon (52:23.792) and make that easy. Allan Ritchie (52:28.240) It was me. Jon (52:32.688) And at the time, like that's, that's really what we had found is there was a lot of churn in terms of people. that were kind of like, I can do a Hello World app, but as soon as I want to start doing stuff that like I would want from a mobile device, like location or getting the battery information or whatever, I don't know how to do that. I don't know where to go. There's nothing in the box. So the idea was kind of essentials, you know, put some of that in the box. And I think the other part of the 80 -20 was we didn't want to stomp on, you know, people's work that were going farther in those areas. right? That the goal wasn't to like, you know, extinguish every plugin that had any functionality related to us, right? That was never, never the goal. Yeah. Yeah. It's, it's funny. I've, I've never, uh, I've never since I've been here. Yeah. Yeah. But I've never, since I've started working for Microsoft actually, um, you know, been involved in any of those sinister plots. That's, that's strange. Um, I thought I would have run across one or two by now. Allan Ritchie (53:18.960) you followed that you didn't follow Microsoft's there's that there's that thing they've got the embrace extinguish embrace extend extinguish Jon (53:40.432) Um, but you know, fun, fun part here, trivia time. Do you know what the original code name? Allan Ritchie (53:53.456) Clearly wasn't Xamarin standard that I had suggested to James. Jon (53:56.528) No. Allan Ritchie (53:59.664) Since I, the fun part is, is I was talking with you guys about it at the time, but I was not privy to the name. Jon (53:59.760) No guesses at all. Jon (54:06.704) Okay, yeah, so at one point, I don't know who said it. I don't know who decided that this was the name. But at one point we kind of said like, you know, Essentials, the goal here really is to like give you the whole kit and caboodle in the box. Yeah. Allan Ritchie (54:23.376) I do remember. Allan Ritchie (54:31.792) summit where James support had and I was like you Jon (54:36.364) And I think we had to change the name at one point anyway, because I think Kaboodle might be like a trademark or something, like it's a product name, right? So yeah, yeah. My fork of Xamarin Essentials I just saw is still called Kaboodle. So it lives on, lives on. Allan Ritchie (54:47.594) Oh, that's a shame because it was actually a really good name. That's actually a really good name. It was well, well thought out. Oh, nice. Nice. So the one thing that I know people didn't like, because one of the things that I tried to do is with shiny was obviously making it dependency injection aware, but I also wanted to make it testable. So I big on unit testing on my side of the fence. You guys. Jon (55:06.320) Yep. Allan Ritchie (55:17.520) I don't want to say you don't do it. It falls under a different category, right? So for essentials, it just had to work like it doesn't you have to worry about it working in the user's app. That's their app, not your app, right? Shiny had to approach it from this thing needs to be testable within their app, right? So I think that was one of the key things. I know Dan Siegel. He was a big guy on DI2 and we were like, ah, who thought of this? And you guys, you and James, you were stuck to Jon (55:25.140) Yeah, yeah. Jon (55:42.456) Yeah, I won't no no no, I'm not gonna throw anyone under the bus However Yeah, I mean you don't know the right person or persons to throw under the bus but essentially, you know, see what I did there we We had a mandate to not Do things with interfaces like and so without getting too deep into the technical details again, this kind of goes back to the whole Allan Ritchie (55:47.152) That ex - oh. Allan Ritchie (55:56.436) And that's there. Allan Ritchie (56:04.304) Yep. Jon (56:11.130) of like worry about performance and interfaces and you know. Jon (56:19.792) kind of stuff is, is implicated to an extent in how performance of things goes. Now we can debate the, the extent of that, which, you know, But anyway, I Jon (56:35.824) it was a thing, but what I liked is like somebody made a thing to like generate the interfaces and like the wrapper, right? Every. Allan Ritchie (56:38.688) yeah there was this first generator Jon (56:47.472) do that. Like the argument kind of always was, you know, I don't look at getting an interface stubbed out of, um, apples, like their location implementation on iOS. Right. And, and we were kind of arguing that we're sort of, I mean, we're going to elevate ourselves to that same level of like, no, this is just, this is the platform API. Like you don't have to test it. It's, it's, it's the underlying thing. Like you don't go. Allan Ritchie (56:50.996) Right. Allan Ritchie (57:15.338) Yep. Jon (57:17.072) You know, you might mock out some stuff for, for things you use in other places, but like, you're not using ASP net and trying to like, you know, maybe that's a bad example because they have interfaces everywhere. But yeah, again, back to like Apple, you're not trying to like usually mock that out or maybe you end up wrapping, you know, you're creating your own service pattern and wrapping it and stuff. Right. So that was the recommendation was like, yeah, if you really feel strongly about doing that, then then create your own pattern over it. Like what's, what's the big deal. Um, Allan Ritchie (57:30.664) You know, it's funny you say that too because there's cases now where with shiny I've even thought about just doing statics Because you shouldn't be taking you don't need to mock my stuff the number of times I've seen an abstraction over top of Jon (57:46.800) Mm -hmm Yeah Yeah, it's like it's it's the whole like fallacy of Yeah, right Allan Ritchie (57:59.408) my already abstracted stuff is infuriating. Stop doing that. Abstract your business, man. So I have a for Bluetooth. How do you want? How do you want your device to work like get temperature, not get bites, not connect to Bluetooth, just get the temperature. That's your business. Why are you extracting Bluetooth over Bluetooth? Just your thing is temperature device, get temperature. That's it. Who cares how it works? You can mock that out. Jon (58:16.960) Yeah, exactly. Yeah. Yeah. It's the same story of like trying to, you know, create your own like database layer for everything, right? And it's like that whole cliche of like, do you ever actually intend to switch out the backend? Most people never actually do. So why did you do the work? Now, yeah. Allan Ritchie (58:30.256) Bye. Allan Ritchie (58:37.968) And here we are now I'm even talking about going the other way because you don't you don't need to abstract those things the delegates that I offer in shiny. Yes, they're a bit different, right? That's responding to an event, but it's not the actual business. You're not you're not having like a like a manager to deal with. It's just here's the thing and you can execute that code right? That's it's almost more of a marker than anything. So that makes sense. Jon (58:46.736) Yeah. And then the only place that I kind of, you know, can see maybe more of an argument now still is, and I did this in my own app as well, being able to. like run on different platforms, right? So at the end of the day, if I want to do location, that's great, but I can't really do that with the Essentials APIs on WebAssembly. And so, you know, for the time being, it's like, well, what do I do here? I kind of make my own service, you know, pattern wrapped around it. Allan Ritchie (59:27.584) Right. Right, and that makes sense. And that's why I do what I do, right? That's why I have interfaces in my own permission model, because that may be something I want to do. And off you go. Jon (59:42.032) Yeah, but, but in doing that, I'm not, you know, I'm not like testing or mocking out, you know, the interfaces from essentials, right? So it's like, who cares? I mean, I guess I could have gone the other way and created my own implementation and then use those interfaces. I don't know, but. Mm -hmm. Allan Ritchie (59:51.216) It is, it does make sense. There was a funny thing. So when I was typing up my thoughts for this episode, I remember going back when you guys were looking at doing geofencing. So Bluetooth comes up a lot in Essentials and I don't think people really understand the API surface there. It's large, it's hard. That's why Essentials doesn't do it. Good luck. There's no platform that does that out of the - Jon (01:00:11.312) Yeah. No. Yeah. Yeah. Yep. Allan Ritchie (01:00:20.208) So quit bitching about it. Now, there was a thing when we were talking about geofences. So I was involved in that because I had a plug. I had the geofencing. I had the shiny one. And I had I had wanted to work with the essentials team on this and I kept saying, well, you need a storage engine. So I don't know if you remember this, but you were involved in the talk. And I remember saying, well, you really need like a storage engine like SQLite. You're like, no, I don't want that dependency. Jon (01:00:40.718) Mm -hmm. Allan Ritchie (01:00:48.656) That was like the first thing I know, which makes sense, right? Because then you've got this other open source and your, your thing at the time was I'm a fan of the flat file, which I was like, but it does, it does make sense. And I ended up saying, well, I need to store something. If, if the essentials team wants to take geo -fencing at some point, okay. I've got a repository that does text files of Jason. And that's how I do it. It's still to date. That's how shiny search takes the object stores at the ID dot Jason. Jon (01:00:48.816) Yep. Jon (01:00:57.486) Yeah. Jon (01:01:14.096) I had... Yeah. Allan Ritchie (01:01:19.024) stores the file and then when the app starts up, I read all the JSON files into memory and it works great. It's always worked. So that was something you influenced on me a while ago. Mind you, because you were paying less, but it made sense. Jon (01:01:29.040) Well, and I, well, yeah, I tried my best. I had that epiphany. So when James was making, I think it was it called monkey or monkey cache. I think it still might be, uh, which is just like a, a really simple, like, you know, caching library to work across mobile and had some like things like, uh, expiration and stuff like that. And they were, he had like a SQL light backend. I think he just like Frank's SQL SQL net light. Allan Ritchie (01:01:32.976) I know. Jon (01:01:58.960) whatever, Lightnet. Yeah, which is great, you fine. And then I like did a LightDB backend, cause I was like big into LightDB at the time. I was using that for my own app and I'm like, I don't want to take SQLite and LightDB. I'm already using LightDB, so I'll make a thing for that. And then I had the epiphany. I'm like, wait a minute. Allan Ritchie (01:01:59.088) PCL thing, whatever. Allan Ritchie (01:02:07.120) you Jon (01:02:19.408) files and folders. They're great for this use case, right? So like the whole cache thing was like, you have a key and you have some object that was serialized to be cached. Just put it in a folder and the key is the file name and all you have to do to go retrieve it is just get that file. And you can tell when the last time that cache was written by the timestamp on the file. Allan Ritchie (01:02:35.984) file. Jon (01:02:47.248) and you can expire it based on that timestamp and like, why are we doing anything more difficult than this? Right? It was just like this, like, oh, duh. Right. Allan Ritchie (01:02:53.360) Because it wasn't a performance issue, right? It really wasn't. It wasn't memory. It wasn't performance. Just write the file. You're absolutely right. That was one I did. I was trying to fight with you. You were having none of it. And that was, well, it was a fundamental. You were absolutely right. That was the best thing. Jon (01:03:09.296) And I think if I remember, I don't remember the exact source that I heard it, but I was listening to maybe like a podcast or some video where people were talking about like how they did things back in like, you know, really like COBOL and like just older, older languages, older systems and stuff. And somebody was remarking about how like, yeah, databases sometimes used to just be like a collection of folders and hierarchy and files and And that worked pretty well, right? And I'm like, oh yeah, why did we get more complex than that in some cases? Allan Ritchie (01:03:42.096) they still kind of are in a manner of speaking, but just much more, much more smartly organized files. But I guess we don't need to get in the science of that, do we? Jon (01:03:44.240) Yeah, it's a little... Yeah. Jon (01:03:50.160) Definitely, definitely. Allan Ritchie (01:03:57.424) Alright, what you got, John? Jon (01:03:57.744) So what else we got? Yeah, I think we've talked about essentials. We talked about shiny. The one thing... Allan Ritchie (01:04:01.808) I think we went through all the... I think we went through all the things I had to... I tried not to make it about Shiny, it's just lessons learned from Shiny, I guess, or that got me there. Jon (01:04:11.856) Yeah. Um, you know, the, the, the other thing I think that might be worth mentioning or talking about too, is like, I know, I don't know what, what you do when you, how, or how often you make a new like GitHub repo and library and new get package and stuff. Like I find myself, I, I've, I try to slow myself down on that because I, I think in, in, in the past I've described that, you know, I'm the owner of, you know, many, many open source projects that in kind of like master of none. You know, I like to get an idea, throw it out there and then kind of just say, yep, that's there if you want to use it, but I'm not really interested in doing much with it. Um, so one thing that I always end up having, you know, a little bit of effort around, and I still haven't figured out what my system is here is like, how do you, you template your whole setup? Right? Like I have a repo, I I'm going to need workflow, YAML stuff to build it on GitHub actions. I'm going to need, um, you know, to set up like how I want my new get packaging and everything. Do you have a system in place for that? Allan Ritchie (01:05:14.096) Not really. I kind of tend to copy like obviously the build steps I have in an app like a full -blown app. Obviously the build steps are usually far more complicated. There's a release process around it and it's beyond like your traditional just version it ship it out right. So for apps I have a template for that but for frameworks or libraries that are building no I don't. So I know Gerald's got a great one out there and I jumped ahead. Probably shouldn't jump ahead. Jon (01:05:41.968) Yep. That's okay. Allan Ritchie (01:05:44.348) Gerald's got a repo that you can clone stuff from that has the base stuff. But generally speaking, if it's a plugin that I'm going to share that's based like, and I feel it's like a core library to Shiny, I'll put it in Shiny and it just kind of inherits the release process that I've got there. It's built up over years, but I don't, I don't like to spawn 5 million repos if I can for libraries, unless the repos not truly proven, right? So I've got one like health is my big one right now because I want to make that a big thing. Jon (01:05:59.728) Yeah. Jon (01:06:07.056) Yeah. Allan Ritchie (01:06:14.384) But it's complicated and it's not, it's, it's far from done. And I have a feeling it's going to be its own living, breathing thing. So I keep it out of the way because I don't know if I'll ever finish it. It could be an unfinished project. And if at some point I'm like, Hey, I like this. It's got my stamp of approval. I want to make it open source. I'll just put it into the key offering. Right. And it'll, it'll just lock step with shiny. And I don't have to worry about his process. So it's like, I put separate repos for proving stage POCs. Jon (01:06:34.384) Mm -hmm. Allan Ritchie (01:06:44.112) little things I'm building. And then if I want to share it, I put it into the core offering and say, here you go. And then I could deal with the support issues in one area. I can deal with the release process in one area. I can deal with the samples in one area, cause that's another big one. I don't like testing samples in like different repos because I'm like, I want to have access to the source, like to the actual source. So, um, I know I've bounced that around. Oh yeah. Forget it. That's forget it. Jon (01:07:04.976) Yeah. Yeah, then you get into like sub modules and all that fun stuff and that's a pain. Allan Ritchie (01:07:12.304) That's not worth it. So I have the samples and everything all in there and I don't know. I don't know if it's right. It works for me. Let's put it that way. Jon (01:07:20.144) So how many, if you went to your GitHub handle, how many repositories would show up by count under your name? Allan Ritchie (01:07:28.272) Oh. Allan Ritchie (01:07:31.728) I could take it probably over a hundred. It's not as bad as I thought, but I do have like the core ones. There's a couple of private ones I have, like I said, with my own production stuff that I share. Jon (01:07:36.560) Okay, that's not too bad. Jon (01:07:42.960) Now how many of those are forks? Allan Ritchie (01:07:48.080) Surprisingly not as many as you'd think because I tend to... I'm kind of like you, I want to build it myself to understand what I'm using. Kind of going back to a point I made earlier, if you're using open source to do something that you don't understand, that's probably not a great thing to do because it's only going to make your troubles with it worse. So I like to understand what I'm using. Jon (01:07:48.304) from other projects. Okay. Jon (01:08:11.600) Yeah. Allan Ritchie (01:08:14.800) I should be able to build the thing given enough time. I use open source to save myself time and go, yeah, this is great. If I had time, I would build this thing, right? I guess that's how I look at it. Can I build Maui if I had enough time? Probably not as well as you guys have, but there's more brain power going into it, right? But I could, I understand what you're doing. I can fix that, but like how much time? Jon (01:08:24.526) Mm -hmm. Jon (01:08:30.064) Yeah. Yeah. There's also, I mean, you know, it's all a kind of the activity of, yeah. And building it for who, right? If it's for just you, you know, you can kind of pinpoint your own use cases, right? You don't necessarily have to figure out why when I put, you know, the vertical stack layout inside a horizontal stack layout inside three other stack layouts inside a grid inside a, you know, why does it not work well? It's like, well, you're, you're not going to run into as much of that stuff. So, um, Allan Ritchie (01:08:42.786) Exactly. Allan Ritchie (01:08:53.622) Exactly. Allan Ritchie (01:08:59.344) But I like to understand what I'm using regardless. So given enough time, sure, I could have written it, but I want to save time. So I don't actually have a ton of forks. If I'm forking something, it's either because I need to debug it and fix it, or because I'm doing business continuity, which everybody should be doing anyways. If you take a dependency on something, for God sakes, clone it. Because if it dies, the maintainer goes belly up or they delete the repo. Jon (01:09:22.200) Yeah. Allan Ritchie (01:09:28.688) your business is going to suffer. So you should understand what you're doing with that component, but you should also understand that they can delete it. They don't owe you anything. So clone the damn thing. Do yourself a favor. Jon (01:09:30.576) Yeah. Jon (01:09:39.632) And clone it and maybe like, don't study and fully understand it inside and out, but like maybe understand a little bit about what it's doing and how you would, you know, survive if the maintainer went away, right? Like that's. Allan Ritchie (01:09:42.574) contribute back. Allan Ritchie (01:09:49.808) Yeah. Allan Ritchie (01:09:53.904) That's what I mean. It should be to save you time, not to save you understanding. You're right. You don't have to understand it's in and outs. You know, nobody will ever understand all the ins and outs of Maui, including yourself, right? Because it's a team effort there, but you should know the basis of what you're bringing in because you're about to use it. So I guess that's why I don't, I, I fork things to fix them and I fork things to again, if that guy deletes that repo again tomorrow, Jon (01:09:56.720) Yeah. Yeah. Jon (01:10:07.278) Mm -hmm. Jon (01:10:13.968) Yeah, exactly. Allan Ritchie (01:10:23.280) or switches it from MIT to some sort of paid license, which I'm not prepared to take a payment on right away or whatever. It's business continuity that I do it. I do it for business reasons. So there's my long -winded answer on that. Jon (01:10:23.376) then you've got it. Jon (01:10:27.438) Yeah. Jon (01:10:36.944) Yeah, no, that makes sense. Yeah. Um, I have a few more than that, but you know, not, not, not like double or anything, but it does kind of make you look at like, Oh yeah. How often do I just spin up a repo for, for whatever reason? And, you know, definitely not, uh, constantly updating the hundreds of repos that I have or a hundred and something. Oh, I don't, I'm like, yeah, you can, you can store it all forever up in the Arctic vault or whatever. Right. Allan Ritchie (01:10:56.880) I guess I do tend to clean my repos applicationally too, right? Allan Ritchie (01:11:03.760) Heheheheh Well, John likes to make fun of me because he knows my kind of OCD is it's not dependencies, but I like to store my files. If it's stuff I don't use anymore, it gets deleted. Like now it's garbage. It's gone. And he's like, Jon (01:11:22.576) I need Copilot to save me in these cases now and be like, hey, these repos, like you're, you're never going to look at again. Do you want just let's clean them up. Okay. And be like, yeah. Yeah. Allan Ritchie (01:11:29.824) We could. You could or back it all up. I don't know. I tend to clean them out if I think they're absolutely useless or I've you know, once I've done the fork and I've sent the fix, I'll usually delete the fork and re clone it later if I'm using it for a project because I always do my clones with the project I'm working on because that's the version. Jon (01:11:48.720) Yeah. Jon (01:11:52.208) Yeah, that makes sense. Well, I think we've, we've done it for, you know, plugins and frameworks and architecture and whatever other topics we got up to this week. Uh, I think so. Uh, yeah, I mean, we could do a bunch more episodes on it. I'm sure we'll figure out some more details to talk about in the future on other episodes. Uh, you know, this, this week it's hard to pick just one thing because it's like all of the plugins, all of the frameworks for the. Allan Ritchie (01:12:03.344) Have we? This is a never ending topic though. Jon (01:12:21.424) plugin package or product of the week. I did want to give a mention again to Gerald's template repo. I think that's a cool thing. There's already been a bunch of plugins that have used that and started shipping things. Yeah, and you know. Allan Ritchie (01:12:34.032) great place to start. It's a great place to start. If you don't know where you're going or how you're writing it, start there. Jon (01:12:39.792) Exactly. It's a, it's a good place. And, and, you know, it's a good way to get your feet wet too. If you have an interest in, in trying to create something that you want to share and give back. Right. Uh, and it can be, it can be something simple. Like I said, like, you know, Gerald's done a few, I know like the, I think the screen brightness one was his. It's like, sure. Why not? Like that, that could maybe be an essentials API, but you know, it's not today. So there's, there's something there for it. Um, so yeah, go, go out and create some plugins and. Don't let the, uh, you know, the frustrations of, of people complaining about open source, get you down. Um, obviously the, the people who, uh, have problems are the ones that are always going to give that feedback more so than the people that are happily quietly using things and appreciative of your work. Um, and you know, something that, that probably I need to start doing myself a little bit more too, is looking at the things that I use and like just going and checking, you know, their repos or the author's profiles and. You know, a lot of people now have like the, Hey, buy me a coffee kind of thing. Right. Um, I don't know if you have anything set up like that. I don't tend to do it because I, you for one, I, there's always like kind of blurry lines in terms of stuff I do. Um, cause I tend to, to kind of do things that are not that, you know, work unrelated. So like personal coding and work is kind of a blurry line a lot of times in my life. So I don't, I don't want to merge those worlds, but. I'm curious to how do you do like sponsorship links or anything? Allan Ritchie (01:14:09.072) I have GitHub sponsors. I have... Gerald's been sponsoring me for a long time. There's a bunch of you. Jon (01:14:11.088) Okay, cool. Oh, see. Yeah. I I've done a few over over time. Um, but that's something, yeah, I should probably look back again and see like, what are the things that I use regularly and make sure that, you know, I'm giving back, even if it's even it's a few bucks a month or something like that. Right. As a, as a developer of those things, I would imagine, I mean, it feels good to get somebody, you know, even if it's just a small token, right? Yeah. Allan Ritchie (01:06:00.) Appreciation is good. You know, and that's that's a thing just kind of to close it out is if you are doing open source Don't do it with the expectations of money I know it's hard if people were all nice and people came with like issues that weren't wasting your time That's where really authors burn out is people being rude and people saying this doesn't work Well, can you you know be a professional developer? If somebody told you your app doesn't work you want a reproducible case so you understand what you're fixing? Jon (01:14:46.648) No. Allan Ritchie (01:15:07.440) Right? So if you understand that the OSS maintainers time is, it's their time and you're respectful about it, maintainers wouldn't burn out. Right? Be professional, be nice, be appreciative and open source will be a better place for everybody. I think I'm pretty sure you can speak highly to that on the Maui team. Right? It's you guys get a lot of misery and it's not fair. Like. Jon (01:15:07.566) Mm -hmm. Jon (01:15:27.344) Yeah. And like, no, and even, you know, it's at times it's frustrating too, just because it's like, yeah, we're doing this, you know, as part of our job, we're very fortunate to, to, you know, be able to be paid to work on this stuff. But I have to think about that in, uh, you know, yeah. But at the same time, it's like, you know, there isn't like, nobody's directly, you know, paying for Maui as a product, right? So it's like, it's an open source project. Allan Ritchie (01:15:44.548) You're still human. You're still human. Jon (01:15:57.360) Um, that means it comes with all of the open source project, you know, fault, uh, flaws and, and problems that, you know, things have. So like, at some point, you know, help yourself be, be appreciative, be patient. Um, and, and yeah, be nice to people. Right. Like it's open source. Like either you go in and get your roll up your sleeves and help fix it or, you know, be patient and, and hope that it happens for you or just kind of say like, okay, it is what it is. Right. Allan Ritchie (01:16:26.938) And you guys are a lot nicer than I am. I have no patience for the people that come in and don't follow us. I usually just I have what I call the band band hammer and you get banned off the repo. That's it. You guys can't do that, which I understand. I do. Jon (01:16:37.104) Yeah, I mean that no, it is different. And like I said, because we are, you know, paid to work on these things, like we have to have a lot more tolerance of, of that kind of thing too, because, you know, well, they're not paying for Maui directly. Like I get it. A lot of people using Maui are Microsoft customers in some capacity. Um, and so we try and keep that in mind, but yeah, certainly, uh, you know, what's, what's the cliche, uh, like, you know, catch more, more bees with our flies with honey than vinegar kind of thing. Allan Ritchie (01:16:59.920) still could be nice to the humans involved. Allan Ritchie (01:17:06.608) Yeah, 100%. There's our OSS rant for. Jon (01:17:07.504) So yeah, well, there we go. All right, we'll see you, we'll see you all next time. Remember next episode's 100. We've got some fun, different kind of episode style planned, I think. So you'll wanna check that out. If you have any last minute feedback, questions, thoughts, ideas, concerns, send us a note, drop us a line. Allan Ritchie (01:17:14.992) I won't go off another this week. Jon (01:17:36.944) Go to our website, gonemobile .io. You can get our email and all the other contact things there. As always, if you are so compelled or if we could compel you, think of it as your one good deed for OSS stuff. Go and leave a really nice review on Apple Podcasts. We would always appreciate that. But until then. Allan Ritchie (01:17:57.008) And just for the record, John didn't record that. He sounds like a professional DJ and he doesn't. Even in the beginning, you just swing it. Jon (01:18:04.432) Yeah, no pre -rolls here. We're just stumbling through it all as we go, right? All right, Alan, we'll see you on episode 100. Thanks all for listening. Allan Ritchie (01:18:13.518) Pleasure as always.