mergeconflict234 James: [00:00:00] Frank, I don't know how to name applications. Frank: [00:00:12] Well, I, I, I think you have a pattern, in fact, uh, are we going to talk about my cadence, the new James joy? James: [00:00:22] Yeah. I mean, they sent me, it makes sense. It wouldn't be your cadence or our cadence because it is. My cane is because I'm the one cycling on the indoor cycling bike. So it's my cadence. Mine. It's Frank: [00:00:32] mine. Isn't it. The bikes, cadence. James: [00:00:35] Um, it would be well it's how fast you're pedaling on the bike. So it is technically my bikes, Frank: [00:00:42] cadence. Okay. That's a terrible name. Don't ask me for naming it advice either either way. This is one of my favorite kinds of episodes and episode where one of us. I actually managed to release an app. Good job, James. I'm very excited. Uh, if no one knows you wrote an app, we've kind of been tangentially talking about it over the last couple of weeks. And I think I called them unaided last week when we were talking about Bluetooth. I think that's what you decided to actually release this puppy and then good. Congrats. James: [00:01:14] I did it, it happened. I mean, it was, it was something that I wanted to do because. Have we roll back the history clock here. I put together a little DIY. Um, spin bike. So for indoor Peloton, spin biking, and this is a bike that's like 300 bucks that has a really heavy flywheel. I added a little Bluetooth cadence sensor, and a cadence sensors. Like your RPM, your rotations per minute of how fast you're cycling, but a little tablet stand on there. You know, it's a little do it yourself, you know, thing for under $400. But the biggest issue I had. Was that there's other biking applications out there that don't integrate into that little sensor that do nice side by side, um, to show you how fast you're going. So I wanted to create an application that did one thing I love absolutely. One thing by the way. Yeah. Yeah. And it does one thing which puts a very big number on the screen of how fast you're going, because. These sensors are all written against the same exact protocol of the Bluetooth specifications. So if you can connect to one, in theory, Frank, you can connect to all of them. And in fact, Frank, I have tested many of them and people have downloaded and tested them on theirs and they do work. And that's great. That's amazing. So I, I, I sat down and I said, I'm going to hack together as my holiday hack that I finished before the holidays, Frank. Frank: [00:02:40] Uh, we have to talk about that. Cause that's the small little miracle that happened here, but yeah, please continue. James: [00:02:46] Yeah. I sat down and I said, okay, well what's this app going to be? It's going to be simple. It's going to be like three or four screens, one screen to detect and find the Bluetooth devices, the home screen, which will connect obviously to the Bluetooth sensor and then show you the current cadence. And then the setting screen where you could, you know, upgrade or, you know, Yeah, reconnect a new sensor. It gives you some data customize the theme a little bit. And this was a journey for me because the application kind of started small. And I said, okay, the first screen was just let me just see if I can connect to this thing. This is where we're at last week, trying to connect to a device, trying to figure out the IDs, the identifiers, how to parse the data. And I got super lucky because. I'm not the only person that has done this before. Um, and there's, um, some Java examples, some Swift examples. No C sharp examples. Um, however, Swift is C sharp is not that hard besides converting, you know, bite or raise into the correct indices. And after Heather walked out on me and I have my Mac book pro Frank on top of my bike, I'm peddling with an iPhone attack. Cause that's the only way to test it. You know what I mean? Frank: [00:03:59] Well, okay. I don't want to interrupt the story cause it's so good. But, um, um, I thought we had that virtualizer you had that magic virtualizer software for testing. James: [00:04:08] I did blue light is, um, or light blue is a great application. However, it just sends dummy data. So it's not real cadence. So it would send you data. That's like a thousand or 5,000 and it's not realistic. So the only way for me to really, really touch this application is to spin. And luckily I do use a lot, um, so much that I, I wanted to test. You know, we'll get to it. But I, I bought, I have multiple sensors on this bike now, so I can test multiple apps to see if mine's accurate or not. But anyways, I digress, I totally got this thing freaking work in and, um, I got it parsing and I sent you, I remember sending you a screenshot where we were figuring out the byte data. Is it UN, is it in 32? Like, what is it, how am I parsing it? And, um, luckily enough, some of the source code. It's only a few lines of code to parse it, figure it out. I got it all working and I sent you some screenshots and I'm like, Oh my goodness. It's there. Then it's a, it was a mad rush to the finish line to try to get it in before Apple's December 23rd cutoff. Frank: [00:05:13] Yeah. Yeah. I mean, you said it in some ways, this is a ridiculously simple app. Its whole purpose is to show a single number in a single label centered on a single screen. This is like the most basic app, but the funny thing, and, and I think it's kind of the theme of this entire show we do is just how much work it is to actually finish that and Polish it, to get it to the point where it's actually in the store. So it's kind of funny, all that. And I was really interested in that. Specific problem of how are you going to test this on multiple devices? I wasn't sure if you were going to be able to like order 10 different devices and get them in, but basically I just want to pick apart all that story that you just told, but let's start with the very beginning. Um, did you do competitive analysis there, there were no other apps out there that had a center label that showed you your cadence. Really? James: [00:06:06] There's. Um, one other app that does it. It's called cadence. And, um, Frank: [00:06:12] their cadence, James: [00:06:13] their cadence, in fact, funnily enough, on the, uh, review, uh, of Apple fitness plus on my YouTube, I attempted to use their application, but it didn't work with my sensor, which was kind of mind boggling because if it doesn't work with my sensor, I don't know how it works with any sensor because. I don't know what protocols they're looking at because mine is the standard one. And it's been tested with four or five different sensors, including the most popular ones. So I was a little bit like, Oh, you know, whatever. And, and their application. I, I had started the application. I knew that I wanted to create this application before I knew this application existed. And it upset me a little bit because their application was originally. Eight 99 to just buy. You could only buy it for 800 and I didn't buy it. And I was like, that's an expensive, yeah, it's Frank: [00:07:02] a lot for us at such a reader. Wow. I, I put a lot of code into an app that I charged that much for, I should really, uh, start making some more of these single page apps. James: [00:07:11] Yeah. And, um, well, because I don't know how long it had been out for, but it was eight 99 and it was very similar. Like I'm going to display a big number on the screen and, you know, Boom done whatever. And that's the whole goal of it. And I said, okay, that's fine. It was only on iOS. I didn't do a lot of research on Android because all my devices are iOS now. And I was really targeting Apple fitness plus, because once I got ahold of that, I realized it didn't integrate with cadence sensors. So, um, this application. Was already out on the store. Didn't have any reviews. I don't know if it had been out for a while. Well, I didn't work. It didn't work for me. Right. So I was like, well, I'm like this app doesn't work. So I guess I'll just build my, build my own as well. I'd already thought about it and it really confirmed it. And that was like an eight 99. I was like, that's too much because the sensor is $20. So that's half the price of the, the sensor. I was like, I don't, I mean, I don't want to de-value software Frank, but that's expensive. So I said, here's what I'm going to do. I'm going to create this app and it's just going to be free. 100% free, no limitations, no anything free. Just good to go. Right. And, and between the time that I started development and publish the app, the other person, um, development shop, they changed the price to free, but made it a. In that purchase of eight 99 with a five minute restriction of, of the app. So Frank: [00:08:36] you better get peddling, James: [00:08:38] you get, but yeah. So you only got five minutes and you had to reboot the application. So I was like, you know, I'm making this application for me, which is the only reason I make apps. Frank, as I make apps for me, I hope other people like them. I dunno why put myself through the stress, but I'm like, I wanted this application for me. I didn't want to spend eight 99 and also their application, even after they made it free, still didn't work with my sensor. So really I'm really made it for the fact that, Hey, there is some competitor competitors out there, but they must be looking in doing some other sensors. I don't really know, but I'm going to make this application for these specific sensors. And this is what the compatibility is. Frank: [00:09:16] Okay. I buy all that. And if there is only one competitor out there, you should definitely dive into that market who knows. They might be soaking up all the rich, rich profits out there. James: [00:09:28] Yeah. So I will say this to the sensor makers like wahoo, which is one of the biggest sensor makers. They have an app on the app store. You can download for free and you can connect and get it. But it doesn't have that full screen, big display. It can't, it's made for iPhone only. So it doesn't have the universal app thing on it, which is super annoying. So there are totally by the way, competitors out there that are completely for free. So it's not like I only had one competitor. I knew that if I was going to be out there, I was like, well, I might as well make it for free because why would someone install my application for eight or four 99, five 99, eight 99. When someone could get a very. Not as optimized version for free because you know, people don't like to spend money. I don't like to spend money, Frank, unless it's an app made by Krieger systems, LLC. Yeah, Frank: [00:10:20] sure. For that ink. Um, yeah, I think I'm on record of saying hardware developers are the worst software developers. It might be a little bit harsh, but it's a hundred percent true. So, uh, I don't doubt for a minute that there is room for an app like this. So you've mentioned healthcare and I know we've talked about healthcare in the past. Does your app talk to healthcare at all? James: [00:10:43] No, nothing for it specifically, there is a heart rate application that I use heart cast that can, can cast your heart rate from your Apple watch to the device. But the cadence is a Spanish as a special thing because it really doesn't. I mean, it does have a lot to do with how many calories you're burning technically, but it also has to do with like the resistance of your bike, you know, and your heart rate combined. So. Unfortunately, unless we were to be able to feed this data into Apple fitness plus or some other application, it really wouldn't do anything. So when I start a, when I start a, um, uh, you know, an indoor cycling on my Apple watch, there's no cadence data point for them to really integrate into, unfortunately it's just a heart rate measurement. So I got lucky because that means the only thing I really needed to integrate with was Bluetooth. And as we all know, Frank Bluetooth is easy. Frank: [00:11:38] Yeah. And so easy. We've done like two episodes on it, own merge conflict here. Uh, I kind of love that you had to spin in order to develop your app. I've done a little bit of VR app development and you always get into that position. I was making a sword fighting. App. And the app just was kind of useless if you're sitting down. So every time I wanted to test it, I would have to get up and do a little sword fight. And it was exhausting. I stopped developing the app because I'm like, I don't, I don't know what I'm doing here, but it was fun because I built like a whole standing desk for it. So I could, you know, transition from the VR world into the real world. So I just love that. You're kind of stuck with that problem too. And I think those are kind of the. Fun apps to develop because it really makes you, it really incentivizes doing a good job before hitting, compile and having to ramp up your RPMs. How fast would you, uh, get spinning on an old tests? James: [00:12:35] Um, yeah, you know, I wanted it to be relatively realistic, so normally. When I was just testing connection, I'm just, you know, going 40 or 50 RPM, but once I got to connect it and I figured out the data, you know, I'm, I'm pushing over a hundred for sure. Frank: [00:12:50] I was no idea what those numbers mean at all, but I figured someone out there must know. James: [00:12:54] I would say that on average, the lowest you go in RPM is around 60 on a heavy climb. And the max that you go is 120. The max I go is about 110. I can't go 120. It's too fast for me. It just doesn't my legs. I'm old. I got arthritis is something that fast, but, um, yeah, so I wanted to test it, right? Cause you have to be able to move, to see if the data is parsing and updating correctly. And I did this entire application in under a week. So under seven days and I would say 15 hours total of. Of from start to finish. And I was doing this after Heather went to sleep and I did two or three days where I was up until 3:00 AM coding and I was in it like, you know how you're on the bike Frank: [00:13:45] in it, on it? James: [00:13:46] Um, I was in the code. Okay. And then I definitely one or two times at two or three in the morning, literally opened the garage door, got onto the bike and was testing things out. I, I kid you not, it definitely happened. Frank: [00:14:02] I, yeah, and I, I believe you, I I've done the 3:00 AM thing twice this week because I have had actually a pretty unproductive week, but when you get going and time doesn't exist anymore. So you might as well just to keep working. I noticed my, my schedule has been a little bit ridiculous lately, so. I totally, I kind of wish I just had a picture of you doing it at two 30, sweating away on your bike, trying to figure out why the, uh, actually no comma, you never get into the thousand RPM, so you didn't have to even do any globalization. James: [00:14:34] Nope. No, not at all. Not Frank: [00:14:36] real easy life. James: [00:14:38] It's an integer and it's two string and I'm done and I even have it where. If it's over 300, don't even display it because no one can go 300 RPM and that doesn't even make any sense. I love it. So, Frank: [00:14:50] you know, I want specifically asking for a gauge, I wanted like a speedometer in our last episode, but I noticed there was no speedometer. Was that a, was that a time choice? Was that a stylistic design choice? What's up James: [00:15:04] there? So I thought of a few things for this application. The first thing that I thought about when putting it together as I wanted it to work. Really nice for modern day, um, um, iOS devices, which means I only started targeted iOS by the way at first. And I thought this was, this is how I almost want to do every application going forward, by the way, which is only release on one platform and only care about one platform because. I think that my iOS application is killer. I just think it's so good. And I was able to Polish it. Like I, I just, when you're working on multiple operating systems at the same time, you really have to invest in doing all of them. So I really just said. I only had an iOS project. I didn't have a done at sander project. I didn't have an Android project. I literally only had an iOS project with Xamarin forms in it. I changed around a few things. So all of the code, everything was inside of that project. And I was like, I don't even care because. I just want everything to be here. No, MVVM no architecture, everything in the code behind slap into code together, man. And it was great. It was like, it was fun. It was fun. Frank. I was just, I was wild West and over here it was, it was whatever. And I was just going to town and to me that was really, really fun. And I really wanted this app application to look great on iOS. So I said, okay, here's my features. And so I had to define if I was. Finishing this app in a week, what are my features? So Frank, it was, it was support for obviously the sensors, all the, the, either the thing had to work, you know? Um, but I wanted light theme support, dark theme support, and then I needed to figure out some sort of monetization pro type of mode. Right. Good approach out and in a way. And that was my goal. And what I landed on was. Using all of the brand new Xamarin forms, app theme built in light theme, dark theme support. So it was either like a very, very light gray, or a very, very dark black based on those in those numbers. But if you turned on promo mode, then you could customize the theme and you could adjust a gradient background from top to bottom and the text color if you chose to. And I think that that is actually like, I think. Really cool because maybe you're like, I really like pink or I really like red. And the only way you can do that is if you upgrade to pro for two 99 and several people have, and I was apparently that's great. Um, so that, that was my feature set. I was, I wanted it to be very simple because I knew if I started tacking on gauges or history or I wanted it, or what I really wanted was show me the history, show me a bar chart throughout, you know, that would have been so cool about it. I can't do that in a week and isn't really adding. Vast value to the product Frank: [00:17:51] at the end of the day. Yes, a strip chart a hundred percent, but what we'll get back to that? No, it's really good to come down to that as a set of features, that's where I always go wrong. I don't ever nail down a set of features. My list just grows over time as lists stew. I love that you decided to focus on one platform. I think that's a conclusion that we've both come to in our careers that you really just have to focus on one at a time. But you took the kind of logical step of using Xamarin forms, knowing that you probably will want an Android app in the future, do as much code as you can. It's funny that you abandoned a lot of the Xamarin forms, standard stuff, especially given that I've been embracing a lot of those Xamarin forms stuff I've been embracing, um, in version of control to access services, I've been doing my view model bindings, all that. Kind of stuff I've been doing XAML because the new live XAML preview thing is kind of amazing. It works really well. Uh, the new Xamarin forms is pretty great. So that's, I, I kind of find it. Yeah, it is. I have complaints against the collection view, but we won't tell anyone. Um, and if I can make one thing, I want to say this in the most positive way I can, but every time I think of it in my head, it comes out negative. But take this, take this very positively, the best part of Xamarin forms. Is that you can replace any feature of it very easily. So like, if I don't like how list view works, I put my list view, and then I just write my own list, view that I prefer how it works and that kind of stuff. So I, I love this idea. I think we've both come to is focusing. On one platform, but still using a platform framework because then you can tune it to that platform. Then when it comes time to do your Android version, you just have to do the same thing, show it, some love, replaced the renders that you don't like, how they render that kind of stuff. It doesn't sound like this app is that complex, but it's still, I think, a, a nice process, uh, for indie devs to follow. James: [00:19:56] I agree. I tweeted out that I. Started at a new iOS app only with XAML didn't have anything else. And people were like, Whoa, like, are you serious? Like, I'm like, yeah, I'm just slapping code together. And I'm having more fun than ever because you're right. It's like, Oh, there's native view embeddings. If I want to interview or, uh, whatever the new color wheel is or whatever, I can just slap it in there and just, I can access the iOS code from the code behind. I was like, man, I kind of want to share projects. Can, um, you know, I can't wait for, I can't wait for dynamo because it'll give us all that sort of pre-baked stuff automatically. But I really enjoyed just focusing in on that one because it means that I had a test last I could focus in on getting it. Getting it, how I wanted and you're right. Like I started with Amerind forms. I started with, um, using a few cross-platform libraries, like the Bluetooth library. That is cross-platform the obviously MVVM helpers, Xamarin essentials, which was key to this. Um, and a few other plugins that were out there. And the hardest thing I'll tell you. The hardest thing that I had to find for this app was a color picker. Surprisingly hard. I try to use the iOS one and then I was like, well, what if I do want to bring this to Android? I'm going to have to go across platform. And luckily there are a few color pickers out there, but I literally, I spent maybe two hours just. Trying different ones. Like, was this the correct one for me? And that was the hardest part is like, this is a non-traditional control. I'm definitely not going to write it by the way. So who out there, who out there has written this control for me. And that was the, the hardest part. Frank: [00:21:42] I've ran that control four times and I'm not proud of myself every time. I'm just like, how is it? 1990. I'm writing a color picker. How has the 2000? And I'm writing a car, bigger house, a 2010 and I'm running. I call it a, it makes you miss the, um, Windows days, you know, windows 3.1 had a color picker. So every windows app has a color picker. It's really easy. iOS never had a color picker. Android never had a color picker. So we had to embed all of our own into our apps. Now, what is it? iOS 13 has a color picker, but that's more of a pop-up. Uh, I think you were trying to embed yours more into the app, so it might not have been appropriate for you just out of curiosity. Is there an Android native color picker now? James: [00:22:28] Not that I know of, no. I don't think there is one. The, the one that I think is color well, inkwell color. Well, whatever it is on. IOS, it's a beautiful control by the way. And I would have been very happy using it, but I decided that it wasn't, you know, it wasn't exactly what I needed. And I think to use the native controls, you have to turn off XAML compilation on that page or something. Um, yeah, some restriction in it, but it definitely works because I know David has a sample of it working. So I thought about it and I was like, what use that is. Is it going to be the best user experience? And what I found is I really just want, you know, I want the gradient thing where you can swipe, you can just move your finger around. And I found this one called Spillman xamarinforms color picker, and it's built on top of skier sharp, which is of course. Awesome. And, um, it's exactly what I want it to be. I mean, it looks like a color picker from. You know, visual studio, X code Photoshop. It's like this one makes sense. And it's, it's really nice. Uh, after I figured out how it worked, I was like, this thing is brilliant and it was super simple to put in and I had the code going in like five minutes. It was great. Frank: [00:23:45] That's great. Um, you know, I used to be an old Delphi. I say Delphi, but all, a lot of people say Delfi, so I've been trying to retrain myself. And that was the best part was all the component libraries out there. Obviously we hear from sponsors all the time. They have great component libraries, but it's nice to see user components out there. And I kind of wish we had, um, Hmm. Now I'm thinking of a feature for Fu get a nice little controls gallery or something like that, to find these a little more easily. That's super cool. Um, but, but you did all this cross-platform work and then you somehow made it to the. Th the deadline there, they're closing the app store on us this winter. Did you have a very smooth and easy review process then? James: [00:24:33] So I was pretty freaked out because I, I got it up and test flight. My biggest recommendation for anyone starting a new app is put your app in app center or some other CGI, I mean, app center. I mean, it just made it so easy to push it directly to test flight. I was testing it on my iOS device, on my iPad and like no time at all, you know, the hardest part. Of any testing is in our purchases. Frank, I hate him. I low then at purchases or so. Terrible. I just hate Frank: [00:25:03] that. The reason I didn't make my winter deadline for ice circuit is just because I haven't implemented the in-app purchase yet. I just, I have this like mental block against building the user interface. I see a, I don't think we've mentioned it yet, but you've written a blog article about this building and testing and shipping my cadence for iOS in just seven days, everyone. And in there, um, you mentioned that you use. Oh, your own plugin. Did you write that plugin? The in-app purchase plugin? I feel like you wrote that plugin. I leveraged my in-app billing plugin. Yeah, you should have called it. My in-app plugin. James: [00:25:41] It truly is. It is my enemy. I built this library for me and luckily enough, I recently updated it. You know, the, the iOS code to handle in in-app purchases is not. That difficult is not the nursed Frank: [00:25:58] I implemented from scratch each time. And each time it comes out between 102 hundred lines of code with lots of error checking, you know, like really careful kind of code. Yeah. James: [00:26:08] And this code that I have is probably iOS code. That has been stable since iOS nine or I was 10. And luckily for all of us, the in-app purchasing code for iOS has not changed. They've added one or two new things, which is that purchases can happen outside of the app store. So you should, you should handle them inside the app source. I do handle that. But luckily enough, I did that, but you know, you got to create the sandbox account. You gotta remember that password. You gotta put it in test flight. You got to hope that you can log into that Frank: [00:26:38] user. I have multiple test accounts. I five, five. Yeah. I ended up sometimes I have to reset a password and like getting it to work in the simulator. Sometimes you have to like shut the simulator down and bring it back up. There are all sorts of weird. Um, Make sure you don't log into iCloud, but sometimes you do need to log into iCloud situations either way. If anyone listening has ever implemented an app purchase, you know what we're talking about and if you haven't done it, Just give it a shot. It'll be a little painful, but I think I'm talking to myself now. You just kinda gotta get through it. James: [00:27:16] You got to get through it. And luckily I will tell you my library. It's pretty good. It's pretty good. I'm just, and it just works. Yeah. Frank: [00:27:24] I should say you have a weight, right? Like just having a weight helps so much stuff because it's a lot of call backs and, you know, validate this receipt, validate that. They make sure it's still active. Then you got to check your stuff. There's a lot of procedural is on there. It's really nice being able to use the await keyword to just kind of script it out. James: [00:27:43] Yeah. And I, and I got it and I got it out there. I got it. In test flight. I had. A tester had two testers. Frank, can you believe that? Very good. Frank: [00:27:52] Uh, I highly recommend more, but James: [00:27:54] great. Well three, including me. So three, um, our good friend, Tim Heuer unfortunately for him, his equipment is too fancy for my application and did not work for him, Frank: [00:28:07] but James: [00:28:08] really he has a, so, okay. So here's I learned it was fun fact because I actually adjusted the store listing for this is he has a. He has a, has like a crank arm on his bike where, where the pedal is attached, that has the sensors built into it. And. And that one is a different Bluetooth spec. It's called like cycling power instead of Oh boy. Frank: [00:28:34] Yeah. Nothing like a whole bunch of specs to choose from. Uh, th that's exciting. That means we get a whole nother merge conflict episode in when we cover that. Yeah. James: [00:28:44] I would like to support his device, but it's, it's, it's a much larger. Specification where it can optionally do like five things and you don't know what the, what that's going to do, where the cadence and speed one is all like it's, it's only ever going to do this and everything's mandatory. So like you're always going to get back this stuff. Um, so unfortunately it didn't work for him, but it was a good learning opportunity. But I did write a blog post, the one that got featured on hacker news and. I'm a developer, a react native developer. What is his name? I'm going to go on Twitter because I'm now using his photo with permission in all of the apps or listings. It's great. Um, Dan fool, Greg guy, he was so excited after reading my article. He bought the stuff from my article and then he was so excited that he was like, Hey, I would love to test your app. He totally tested the app. Totally worked great for him. And, um, he was like one of my first reviewers on the app. I mean, this is why you get reviewers because they can then leave reviews and they can, if it obviously works for them, they'll give you a five star review and, um, So we got it tested in test flight. That was super great. Of course it took a day for, you know, test flight to approve the thing. So I was like sweating Frank: [00:29:57] just to interject, like it's funny because TestFlight reviews have been so much slower than app store reviews, mate. It's really James: [00:30:07] weird. I don't understand. Frank: [00:30:09] I know. Um, but yeah, there are at least a day I've noticed that's pretty average. James: [00:30:15] Don't like, it it's too much because I'm just like, someone's just testing this. Come on now, you know? I Frank: [00:30:22] thought that was all automated. Like, I don't understand what they're actually checking for because I released junk onto Tesla, you know, like barely functional junk and it gets approved after a day, but like, it would never be approved for the app store, but so there is a human reviewer, but they don't care. It's it's just all confusing to me. James: [00:30:42] I'm not sure. I think it is maybe. I don't know. I don't know. That's the thing is, it's a very, it's like a black box. It's like the, your app goes up there and nobody knows. And that's for external, right. For internal. I could test it myself super quick and that was super nice. Um, but yeah, I, as soon as, as soon as Dan gave me the green light, I submitted the app, Frank and it was immediately rejected within 24 hours. Frank: [00:31:06] Wow. Okay. Within 24 hours, uh, sorry, how fast, how fast was it? Rejected, James. I want to know, but that's, it's exciting. All apps should be rejected the first time, in my opinion, it's disheartening. It kills me every time, but in truth, like, uh, perfection is unattainable James. And what way was your app imperfect for the app store? James: [00:31:31] In what way is it apples? D my application on worthy to grace, their app store. Frank: [00:31:41] I'm sure it was really important. James: [00:31:43] Okay. So this application I imagined was going to be rejected because how are they going to test this thing, Frank? Like how. Are they going to test us? I gave them directions on light blue, how to set it up, how to do the connection, everything. Yeah, it was, you know, and then they, there was, there was two issues. They first said that when they tapped upgrade to pro the app, didn't do anything. Frank: [00:32:13] Oh, um, network issue, maybe. James: [00:32:18] I dunno, let's get back to that in a second because Frank: [00:32:21] they hate it when nothing happens. That's for sure. If something looks like a button, make sure the button does something. James: [00:32:26] Yes. So the second issue they said is, um, we don't know how to test this. Can you please attach a video showing us how your application works? Which of course I should have done. I'm an idiot. Frank: [00:32:38] Yeah. That's that's good. Yeah. They're, they're not, they're not going to set up light blue. They're not going to send over hex codes over to your app. I'm I'm always curious because I have apps that require logins and sometimes I don't even see them log in, but what, uh, good for me. Um, Okay. Yeah, I buy that. James: [00:32:58] So here's what I did is I went out on my bicycle and I went, I went into my bicycle and I, and I installed the application on my iPad and I tested the in-app purchase. And here's what I think the problem was as I think that when you tap buy the in-app purchase, there's a two to three second delay. For the popup from iOS to come up, like it's just a natural thing, which is you would tap it. And it actually takes time for Apple to go to the app store, request the in-app purchase, display the user interface there. And I wasn't indicating anything visually that something was happened. So I solved that by adding a little spinner that said validating in that purchase. I just did a little, little thing. Like, Hey, something is happening, please. Hold on. The Frank: [00:33:49] spinning app needed more spinners. I like it. Yeah. Um, they also hate it when you leave a spinner up. So make sure you get rid of your spinner when it's all done spinning. I I've, I've been rejected so many times for oops. I accidentally left the spinner up. James: [00:34:05] Yeah. They don't like they don't like that inconsistent UI. So I fixed that. But what I did is I. I literally went, they gave me a screenshot. They said, Hey, when we process it doesn't happen. So I took a video and I said, Hey, Louis, look, here's what happens when you present. Here's a thing. And so I also made it, so it gave a little visual indicator. But then I wrote, I made a video of me riding my bicycle, connecting the sensor, doing the thing, and they needed to see the permission. So it had to be a fresh install where Bluetooth wasn't granted yet. So it was a fresh install. Did the permission. Then they said, give us everything including permissions and I'm. Huffing and puffing on this V I'm holding a phone, I'm holding this thing. And I'm like, here is where you can see. Cause I was like, you know, I T I had done it like three times, like try to get it right. And do the other thing, but just stuff. And, um, but I totally got it working. And I, so I sent them the videos I said, here, you bundle it up. And of course I was trying to. Frank: [00:35:04] I I'm sorry. I just really hope this is like an office joke for them. And they all got like some really strong eggnog and they all just sat and watched your video, but sorry, I'm imagining the Apple review. Everyone gathered around and got around this guy made a video. James: [00:35:18] My favorite part is that they only accept. Um, certain file formats Frank: [00:35:25] and creepers. And if it's like the, um, the promotional videos, certain resolutions that are like, is this iPhone? I hope they're not like that. So what did you, James: [00:35:36] so they do accept everything. They do include zip files, which is nice. Cause it's multiple things. Do you link and attach one file. So that's it, but you can attach a zip file, but then I looked at all the file formats and for videos dot move is not supported. Frank: [00:35:51] Yeah, which is ironic because all their software what's dot move. Yes. I say mov and my head, but that sounds terrible. Yeah. Um, I don't even know. I, I think in quick time, one of the export features will let you export an MP4. I know there's not actually a big difference between Marvin MP4. So like a quick FFmpeg can do the quick conversion. I use an app called handbrake. Just because it's, it's a gooey on top of FFmpeg, um, a lot of options, but how frustrating is that stupid file format? James: [00:36:24] I was just like, Oh, but I did it. I use cloud convert. You can just like upload it. It just uses FFmpeg to like, rebox it. Right. And then I submitted it and I was like, and now it's the 22nd. So I have 24 hours. I hope that. I hope that this happens. Frank: [00:36:37] Right. So I also wanted to add, I hope you were recording this video at 2:30 AM. What kind of schedule are we at? So you're still before the December 23rd deadline. James: [00:36:48] Yes, I, this was the, I was, I submitted on the 21st rejected on the morning of the 22nd or maybe the 20th and 21st, like I had about a 24 to 36 hour gap before they turned off submission. So it was cutting it. Close at this point. Frank: [00:37:08] So they reviewed it pretty quickly. Then they reviewed it within a day again. James: [00:37:12] Oh, they're so good. They're I mean, I will tell you this, the test flight approval process might be slow, but I resubmitted the app and with eight hours within, well, here's the thing is I resubmitted the app at like one or 2:00 PM and on the two, I think it was the 21st. And. It was in review at like four or 5:00 PM, but it was in review until the next morning, which is very odd. Frank: [00:37:42] And they had to show the video around the office. Yes. Wait, wait til Joe comes in in the morning. He has to see this. James: [00:37:48] Yeah. So it, it, and then they approved it and it was available for release and. I pushed the button. I said it was a 22nd and I did manual release, like an idiot. And I was like, you know, um, and then I pushed the button. I was like, go, go, go. And. And he was out, he was into the world and then I had Dan install it and it totally worked. And it was a whole thing. And he's like, it works and it's amazing. And I upgraded a pro and I was like, well, but ended up purchase works. Right. Frank: [00:38:13] That's great. It's always a thrill when you get the app store version, because it's like, what ha what have you done to my poor little app on its little journey onto the servers? Will it still work and all that stuff. So I totally get you what a satisfying feeling that is, especially when you're talking to hardware. Like how random is that the number of things that can go wrong? Uh, so congratulations. I'm glad that app store review team was on the job. It's good to know that you can just make videos to clarify things like that. I haven't run into that one myself, so that's good to know. James: [00:38:47] I am a little fearful of. What happens when I resubmit an update, like I'm about to submit an update whenever the app store opens again, I think the day the podcast comes out, um, because I, I found like you found a typo in my app and then I did buy another sensor and that sensor updates a little slower. So I made some modifications to it, but, Frank: [00:39:08] um, Well, see that that was actually going to be my next question. We all have to have a 1.1, especially after a 1.0 1.0 is a special little snowflake, taken it out very easily. James: [00:39:22] one.one was available literally within 24 hours, except for the app store was shut down. So I couldn't upload it. Frank: [00:39:28] And did they shut it down hard? There is no getting into it when they go on vacation. Yeah. I ran into that too. I was just trying to do test flight. Uploads over the review. I don't know. I, again, I, my mental model is there's just a computer out there. So why would you have to turn the computer off? But yeah, in the test flights, yeah. James: [00:39:47] Frank, you install my app. What did you think? Frank: [00:39:50] I installed it. I had no sensor to test it with and you don't provide me the instructions on how to use light blue to synthesize it. But you know what I should totally look into. I'm just making a device, make a cadence. That'd be cool. And then you could use my custom cadence on the thing, James: [00:40:11] my sensor, Frank: [00:40:13] right. I get 1699. There you go. I got to undercut the competition. So I'm excited. Uh, didn't sound like I'm going to get my strip chart in there. Oh, but what about an Android version? We talked about, you did some cross platform. Are you just, are you so over Android? You're just never going to bother with that ever again. James: [00:40:36] Oh, funny, you should ask. Because as I have been writing about the application writing about my fitness experience, I, and also posting, like I post on slick deals all the time. And then a few things there was like spin bikes at, went on sale. There was a user, I swear, I made a, did this for one random person on the internet. I kid you not. So this person, they picked up the bike recommendations that I had gotten them. And. They said, Oh, you know, this is amazing. I just got it, put it together. And they said, there's a problem with the Android version of the Peloton application. It actually doesn't connect a cadence sensors. I was like, wow. That is really weird because the iOS version does, and I said, Don't worry. I will port my application to Android for you. It should be available within a week Frank: [00:41:27] boy, so, okay. Part two coming next week. This is fun. Um, right. Did you. Are you going to do it all at 2:30 AM? Is it actually just going to be one night of blitz coding? Because I, with my experience with Xamarin forms, it would be the OSTP dependent parts are the parts that take the most time to pour over. And it doesn't sound like you really have those cause you did cross-platform libraries pretty much everywhere. Um, so my guess is like the app just magically worked on Android first time. James: [00:42:01] Well, let me tell you, let me tell you Frank, because I'm very happy to announce on the podcast today that my cadence is available for Android on the Google play store. Uh, Frank: [00:42:13] has it been approved? Did they not take the, take the week off? James: [00:42:17] Let me tell you, well, let's get there, Frank. We'll get there quick because. My cadence for Android. Surprisingly, wasn't that hard to do. And after I was writing this user, I was actually watching HGTV on Hulu. And I was like, you know, I was like, wow. As I was replying to this person, I was like, well, how long would it take? I mean, it is, cross-platform already, all the libraries are like, it should just work. Right. And. Um, mostly it did. I mean, mostly it did. I, I had to bust it out into a new Android project, into a new standard. Frank: [00:42:51] Your laziness bit you in the end, I do. What do you do when you're like bigger projects? Are you a net standard person or just a shared code project? Because I still kind of rock the shared code project. James: [00:43:05] I'm a NetStandard person just in general. Cause you know, shared projects. They don't have they're Frank: [00:43:11] annoying. Let's just be clear. They're annoying. James: [00:43:14] Yeah. So I, I go to the NIST standard route. And so what I had to do is I had to create an Android project. I actually, what I did is I added a Xamarin forms project and I unchecked iOS. And then I moved a dragon dropped files around. And I mean, to be honest, I kind of had it separated out in like 15 to 20 minutes and it kind of just, yeah, it wasn't bad. Frank: [00:43:37] And that was Xamarin forms. Five, right? So preview. James: [00:43:41] Yeah. Five dot. Oh no preview flags here, baby. Give me at all. That's what I say. Give me the ingredients. Give me the. Give me all the fancy controls. I want them all. So Frank: [00:43:51] yeah. Uh, the one thing I've fallen in love with is the dark mode, light mode support and SAML. James: [00:43:56] So good. Frank: [00:43:57] Yeah. You just have to say, what does that like app theme binding some yeah, yeah. Something like that. And you say light and dark, and then you can give it even a binding inside of those lightened darks, if you want, or you can hard-code values. They really made it nice and simple. I love that part of the newsroom forms. I think I thought you don't. Sorry. I don't understand version numbers at all. I thought that was out of preview on the four series also, but definitely out of preview on five, you're saying James: [00:44:26] I think it was under a feature flag. Frank: [00:44:29] I think it was like in four, six, but then four, eight it's full on. I think something like that, the way these numbers James: [00:44:37] at all, I don't even care. Just do it all. Just boom. Do the thing. So Frank: [00:44:40] just catch me up as 5.0 released. I just don't I'm lost in schedules. Time doesn't exist. I don't understand anything. Um, you don't know either. Okay. Fans, I'm sure it's mostly kind of released James: [00:44:53] preview six, so that's basically Dawn. Okay. Frank: [00:44:58] Gotcha. James: [00:44:59] I Frank: [00:45:00] didn't change anything. James: [00:45:01] Okay. Doll, it's basically done. I shipped an app on it, so it's good. Um, yeah. I'm sure. There's edge cases, all sorts of stuff. But anyways, I did that. Okay. So here's the differences, Bluetooth. The library that I use, the plugin BLE works. Great. The only difference is that oddly, Android, they document this Android requires. Location permissions to use Bluetooth, which is super weird. Frank: [00:45:27] Yeah. Funny. That is not funny. Funny. James: [00:45:32] Yeah. So it's kind Frank: [00:45:34] of mean to the user. So the user is just going to, like, it actually says location James: [00:45:38] on the dialogue. Yeah. So what I had to do is I had to use Xamarin essentials, which has permission built in, and it's only when location when in use and not background. And I, what I do is before I. Um, did you request a permission? I say, Hey, the permission is requested. I'm requesting this permission. And I say that this permission is required for Bluetooth scanning. I do not store. I do not use your location at all. Please try something for the love of God. I do not use it. I don't want it, my applicant and does not even require internet. I don't have any analytics. Right? Any crash reporting, anything. I don't have any, I don't even need internet to use this application. I was like, please accept this. Right? So. I do have that in there, but besides that, everything else just worked, Frank. Frank: [00:46:22] Okay. Okay. That's not so bad. It's and if you're, um, if you're an Android user connecting to a lot of Bluetooth fitness equipment, you're probably used to that dialogue to them. If it's there everywhere, you know, that's always, the scariest part for me is getting. A Bluetooth thing, kind of cross platforms. That's wonderful to hear that that library that you chose is working out nicely for that. I mean, it has Bluetooth, four has been around forever. It's glad. I'm glad that we finally stabilized on this stuff because I promise you it was not that simple in the early days. So you got an Android version up. Um, any other little funny, funny shenanigans with the Android version? James: [00:47:04] In-app purchases. Um, those were pretty much working out of the box. Um, obviously you had to set up the app and Google play dashboard, do all the things. The only difference on Android is that they have a new API in which after the user buys it, you have to acknowledge that they bought it. So it's kind of like, it's like, Hey, they bought it. You have enabled the feature in your app, so acknowledge it. So I added, it's a line of code from my plugin that you have to add. So that's a little annoying. Um, Frank: [00:47:36] is that just popping up a dialogue? Like congratulations, thumbs up emoji. James: [00:47:40] It's all silent. Weird. Yeah. So if you don't acknowledge it, they'll refund the purchase. Frank: [00:47:48] Yay. I guess they just, uh, I, okay, fine. Fine. Andrew has always been funny. Interesting provocative. Yeah, God, James: [00:48:02] but, okay. That's what I like to say. So, um, beyond that, um, the only other thing that I did in this application was a little bit of theming. So I do use. I do use, I use a lot of custom theming. I use that app theme stuff, but I also use a very, very old control and Xamarin forms, which is my favorite, which is called the table view. And it's great. And also terrible. Frank: [00:48:26] And about that one. I totally, I always forget about that because I'm such a, I'm such a list view freak that. Yeah. I just forget about the old table view. James: [00:48:33] Good old table view. You can throw cells in there. Tech sells all sorts of stuff. You can have custom views in there. It's like a list view, but you can just shove stuff in it, you know? And I'm also, by the way, I don't use collection via useless view because I'm lazy and it just works out of the box collective. You does too. But I was like NASA it, so I have this in here and it mostly works good on, on Android. There's a little bit like there's a little differences in controls, right? Because on Android, Buttons have background colors on them, more iOS. They don't. So I had to adjust that I use an image button in some places. So I had to set like height and width and some areas I had to adjust a few other, you know, a few other custom things. It was very minimal though. And yeah, the biggest difference is that I. I adjust the status bar color. So when you're on certain pages, it's a on and on iOS. It's like, Frank: [00:49:32] Oh, I, I get so annoyed with the default informed state, as far as handling it, it's, it, it works the way it works because somewhat historical reasons, because you know, Apple has actually changed its mind a few times on how the status bar should work. Um, so I'll be honest when I do. This, this is terrible. I replace navigation page with my own, just because I get so frustrated with some of the default behaviors that I just, I swap it out and I, with my own custom renderer and just going back to what I said, I think the thing I love most about Xamarin forms is that I can do that. You know, it's, it's. Componentized enough architecture, where if I get frustrated with something like the status bar, I'm going to say, forget it. I'm going to handle it. And I'll trust you people. I'm going to put the status bar there. Uh, so that's fun. Um, and honestly that that's my favorite part of app development is getting all that refinement stuff done. Unfortunately, I can spend weeks on just getting the exact right pixel colors on everything. James: [00:50:34] That's true. Yeah. I busted through it. I got it done. I had some of the codes sitting around from some of my other apps, so I had it really easy. And, you know, I created a, I created a class called the theme and the theme set like some dynamic resources and they update it. So I thought about this ahead of time and, and I think the code is quite elegant and ugly and awesome at the same time. So it's pretty good. But how we'll say here's the biggest problem I had Frank is I submitted the. Android version for closed, like beta testing, because I needed a test, the in-app purchase, but like test flight. Now those applications need to be reviewed. And in fact, all of the applications on Google play need to be reviewed. And I don't know what's going on over there because I. Waited five days for my app to be reviewed for closed testing. And I have people on Twitter telling me that it took up to two weeks for their application to get approved. And this is on heard of, I am disgusted by whatever happening, because this isn't no, I will say I had a big conversation while Heather and I were hiking and I said, This is great for Google play because they are finally getting to the standardization that iOS is getting, which is there's some level of quality metric that they're looking for. But I said requesting me to wait one to two weeks. Is inappropriate, because that brings me back to 10 years ago when I submitted my first iOS application, when I was just as pissed as I was submitting to Google play. But anyways, on Christmas they approved it and then everything was good. And now it's all on the app store. Frank: [00:52:18] Yeah. Yay. And then we forget the pain of the past. Uh that's uh, that's really interesting because I remember I used to love the Android store because they approved everything instantly. AI bots that don't know what they were doing. Um, Hm. I wonder if they like, went on a holiday break, is, is this a new kind of delay this five to 10 days? James: [00:52:42] So some people have said that it's usually not this long and you just say it's a day or two, and they do have a big banner that says due to adjusted work schedule. At this time, you may experience longer than usual review times for your app. But I mean, it's a closed beta test. I mean, and even our internal here's the thing is you can do internal testing. The problem with internal testing is that you can't actually start internal testing until you actually have an application that's approved and been published. Once they get done, it doesn't make any sense. Like the whole thing is busted the Google fixing. I fixed your crap because I'm pissed because, and also you can't test in-app purchases on internal testing. It has to be. In an open task or a close task, and you're just like, come on Google anyways. Here's what I did by the way, is I reuse all of the images and screenshots and videos from the iOS application and has shoved it on the app store because you know what, every single, every single device looks exactly the same nowadays. And I just use, I only use the home screen, which is a bunch of, you know, it's a big number on the home screen. So it doesn't, who knows what it is. Frank: [00:53:47] You got to trim off the status bar. The status bar is the only thing. The only way you can tell phones are different nowadays. James: [00:53:53] That's true. No, I'm too lazy. Frank: [00:53:54] You left it. You left the iOS status bar on the Android store. James: [00:53:58] That's true. Don't even care. Don't even care. Don't even Frank: [00:54:02] care. Most cowboy thing I've ever seen you do. I James: [00:54:04] love it. I stopped caring. I don't even care. I don't care done. Frank: [00:54:09] Oh my goodness. Okay. I love it. I, yeah, I'm, I'm still, I am baffled that the internal testing, like, I, I don't have any way to explain it any more than you do, but it's, it's strange. Like, do they not understand what we're trying to accomplish with testing? What do you think? Whatever, James: [00:54:29] I don't know. Frank: [00:54:30] It's I'm not going to complain about the one day test flight anymore. I guess it's what's going James: [00:54:34] to happen. I guess, I guess it made me really appreciate going into the new Google play council, which has been redone since I launched, um, Island tracker. It's very different now and there's. There's so many, there's like 5 billion screens to go to. It almost makes you appreciate the simplicity of the app store connect, which is also a disaster, by the way. Um, I was having this conversation with, with Heather on our hike and I was just, I was railing on they're. All right. They're all bad. In general, every single app store I've ever submitted apps to you, they're all, there's too many buttons, too many things. There's too many sections, you know, having for a BG, you have to figure out how to turn. There's you know, like I remember on test flight, there's like, there's always that warning signal, like on one of them, when you create a new app, you're like, w I gotta do this thing or do that thing. And like the in-app purchase on iOS. I remember that it wouldn't let me submit it until I added a screenshot for the testers to know where to like enable it or whatever. And I'm like, I don't know. It's like so complicated, but it's also good. I think it's good at the end of the day that there's these restrictions and I'm complaining and. Hopefully the app quality improves, but I'm like, you know what? I want my app to be on. I mean, I just want it to be out there, you know, Frank: [00:55:48] with my iOS screenshots, I don't think Apple would ever approve of James: [00:55:52] Alfred screenshots. Oh no, no, no. They would be so upset at you. There'd be so upset to you in general, Frank: [00:55:59] but, uh, could you imagine, Oh my goodness. You know, it's funny. I, I, I'm trying to figure out if, um, I feel like the app store connect has gotten better over time. It's definitely, it started out terrible, definitely got worse, but I feel like has gotten better over time, but I'm really interrogating my own thoughts and deciding if I've just, you know, just given in and I've just gotten so used to it over the last 10 years. But at this point, I think I understand how most of it works. I'll be honest. I sometimes. Can't remember how test flight works, because like you upload a binary, it gets approved, but that doesn't automatically notify people unless you do that the second time, then it does automatically notify people. I just basically never know if it's notifying people or not. Anyway, whole side tangent James: [00:56:47] there. No, it's true. It's a little complicated, to be honest with you. And, um, And then it was, it was weird because I would test like new changes, but then you can only have one version in review and you can't remove that version from review. So you might as well keep it there. Um, for your reviewers, it's a little wonky. Um, but you know, I guess it's something there's some process going on there, but I will tell you this much. Here's my biggest learning out of all. Well, actually it's not even a learning. It's my favorite thing that I did in this application of all time. I think this is the number one. Most amazing thing that I've come up with. And I know I'm probably not the first person to do this, but Frank, when you install my application, do, was there anything special on that home screen that really stuck out to you? Oh, Frank: [00:57:38] no, I don't pay that much attention. I feel tell me. So, James: [00:57:49] um, the home screen of the application, when you install it, there's literally three. Things there's a configure button, which means like connect up to the sensors. There's a settings button on the top. Right. And then there was a star and a star. Frank: [00:58:03] I thought the star, the star was intriguing. I think it would have been a little more intriguing if it was a yellow star, but it was a white star and it was sitting there. I think it should bounce a little, maybe smile and wink at you once in a while. Maybe some sparkles anyway. Uh, I, yeah, you, you, you, uh, you intrigued me enough to tap it, sir. James: [00:58:22] And what happened when you tapped it? Do you remember? Frank: [00:58:24] It demanded money, I believe. Is that what happened? I don't remember. James: [00:58:28] It said, Hey, would you like to get rid of this star and Frank: [00:58:33] see little star? James: [00:58:35] Would you like to remove this star from the home screen, then you can upgrade to pro and I tell you about the other features of pro like Frank: [00:58:42] customizing in some way, I feel like pro should give you the star. Nevermind. James: [00:58:49] That's very true. I should put this star somewhere else to show you that you're a pro user. Um, I thought about this because. You know, how are you supposed to know that there's a pro mode? If you never go into settings, you know what I mean? Right. So I added this stupid star that you tap on and it tells you that there's a promo that you can upgrade. It'll get rid of the star and you can also customize the background colors or the think is very nice. I think it's, it's probably my favorite feature of the app besides that, that it works because it gives you incentive to pay two 99 and, um, You know, people, have you P I don't know if people have tapped on it. I don't have analytics, but I have to imagine Frank: [00:59:27] that you put a star on and he didn't bother to add an analytics to my James: [00:59:31] application requires no internet. It says it on the app listing, by the way. No internet, no analytics. I'm very good, sir. Why? I don't know. I was too lazy to add it, but I also was a weird line to draw. Frank: [00:59:44] It's like it doesn't, James: [00:59:46] if your app crashes I'll have no idea, but I just thought that. How cl how tricky, how clever would this be? If there was a, a little, just a, you know, it's not in the way, it's not, it's not intrusive, but what if w what does that, what are you installing? What does that start you? I want you, you want to know, you want to know what, what it does and that's what it Frank: [01:00:09] is. Yeah. Cause star can mean a lot of things. Cause we gear, you know, it could have been heart. It could have been. Little man at work, still building the website under construction, not right. Just kidding. I, I like it. Um, and actually, I didn't comment on your theme stuff earlier, but I think that that's a great in-app purchase because that's someone who's doing the cycling is going to have to stare at this thing constantly. And if they're bored with that, Color, I would even, um, think about even bigger Ultrapro features like play a video in the background, or, but I guess you're, you're presupposing that someone's using another fitness app in addition to this too, though, I guess. James: [01:00:50] Yes. That's my, that's my thought there too. Ideally it would be cool as a, could. Cubic YouTube video on the YouTube video could play like underneath it or something like that. That would be ideal by the way. Yeah. Frank: [01:01:02] But I also see in one of your screenshots that you have an iPad set up for the bike itself, um, is the Bluetooth too busy to run your app simultaneous in like side-by-side mode? I know you were kind of making fun of how hard it is to get into side-by-side mode last time, but it is there it's an option where you can have two apps up at the same time. James: [01:01:22] No, totally. So I. I have now figured out how to use side-by-side mode. I watched a video on how to do it. I haven't split screen too. So here's the thing. Both Peloton and Apple fitness plus do not allow side-by-side mode in their application only pop-over Frank: [01:01:42] Oh, wow. James: [01:01:43] Me evil. Evil. Frank: [01:01:46] Yeah. The whole says you should design all your apps to support side by side. Yeah. It's in the Hague. James: [01:01:53] It's not supported and that's very, but it totally does work. I have another application it's called, um, Vilo mix or whatever. And it's sort of emulates the, when you go to the gym, a traditional workout, like course or whatever, and that one totally does work. Side-by-side it works great. So if Apple fitness plus was ever to allow side-by-side apps, but on Android, it will work great because every app. You don't get to you. Don't get to decide on Android. Frank: [01:02:19] Google decides James: [01:02:21] exactly. So you can do side-by-side there and that would totally work. Great. So definitely an option totally supported there. Um, but yeah, so I actually, Dan who tested my app, he sent me a screenshot, a photo of him testing it and I said, Hey, can I use this in my promotion everywhere on the internet? And he said, I was like, cool, thanks. Frank: [01:02:42] Uh, I, I love it. When you find, um, uh, tester helper, beta, or user advocate like that, it makes development so much more fun, James: [01:02:52] honestly. And he was a, it needs a developer too, which I think is cool because it adds an extra bonus. And I think that, uh, good, Frank: [01:02:58] good error reports. Yeah. Yeah, James: [01:03:02] because he was like, he was like, you know, I use it. I was surprised that I surprised he was like, I was surprised that it worked and I surprised that the screen stayed on it. I'm surprised, you know, I was like, it's like I thought about it, but it was, it was cool to, to, to just have somebody use it. And it's surprisingly. Um, people have been installing it. I have some downloads and I have some other in-app purchases besides you and Dan. So that's cool. I mean, the star is working, so Frank: [01:03:25] I bought it immediately. That star was intriguing. James: [01:03:28] Why nobody knows Frank wanted to get rid of the star. Frank: [01:03:30] So. If a star asks you for money, you give the star money. I mean, there are simple rules in life. James: [01:03:37] What did you think of the two 99 in a purchase? Did you, what did you think of that? Two 99 Frank: [01:03:43] was a little low, just because, you know, you know how I look at pricing, it's like, um, I'm trying to live off of apps, so you're lucky you have a really real job. So. This can make a little money and you'll still be happy with it. Cause you kind of said you designed it for yourself. So as long as it's working for you, I'm sure you'll be happy. But, um, two 99 is a hard price point to make money on apps. You have to have really large quantities and this is a little niche market and. Uh, in general, you make things expensive and niche markets. So I, I don't know if I made fun of the $9 price for the other app, but I think that that was actually a very reasonable price for such a, such a niche app like this, because not many people own the hardware are not paying people to have the bike. Not many people have the desire for the app and you can't price it like a chat app. You can't price it like a general purpose game. These, this is special stuff. James: [01:04:42] Yeah, no, I think it makes sense. The only reason I made it to 99 is I wanted to be like one one-third the price or two thirds that free, whatever, you know what I mean? Um, Frank: [01:04:54] yeah, James: [01:04:55] but I don't Frank: [01:04:56] know. I like healthy competition. I might've even released at his price point just to see just, you know, Yeah. Like feel out the market James: [01:05:05] first. Frank: [01:05:06] Yeah. Um, I, you know, I'm an indie dev. I hate it when big companies come in and undercut me. So I'm a little bit sensitive to undercutting, even though that's everyone's initial marketing ideas. Oh, I see this product out there. I think it's very expensive. So I'm going to undercut them on price. Well, you better be ready for someone to do that to you in one year. James: [01:05:27] Um, I'm definitely expecting this person to. Uh, change and modify and, and that's fine too. I think that, um, like I said, the reason that I built the app was for me and also that that application didn't work. And I also didn't like the time restrictions I feel as though if, and also I will say this before, I want to make sure it was very clear before I found that person's application. I was already thinking of building this application. Sure, right? Yeah, because I had the wahoo app and the very first thing I said, well, this isn't optimized for universal apps, which means I can't do side-by-side. So I was like, I'm going to build an app that did this. And I had already started it. And it was only when, um, you know, they, they made it free to test that. I was like, Oh, they're up. Doesn't even work with mine. So great. I'm I really have a use case. They must be building it for other sensors. Um, but anyways, um, I will be fascinated to see. W what happens there? I don't really care. I, again, Frank: [01:06:24] I, James: [01:06:24] the color I'm going to make open source, anyone can grab it and, and, and. Go. It is. It's not that complicated, I guess. It's not that it's not that hard, but I, I feel as though, because usually when people buy bikes and stuff is free, it's there, um, included like all the sensors that this is just something else, but I will say this. Went to, I went to my good old app toolkit.io, created a website and go to my cadence.app. I registered a domain name, Frank. Frank: [01:06:52] Wow. Oh boy. Well, you have to have that, uh, the privacy policy these days. Right. So kind of have to yeah. James: [01:06:59] And it's there and it's like, here's the thing I got to add the Android thing on it, but yeah. Yeah, done. Boom. Look at you. Frank: [01:07:06] Did it. I think you've released more apps this year in the night. Hmm. I'm going to have to crack that next year. James: [01:07:12] I released two apps this year and that's quite Frank: [01:07:15] impressive. He did too. What's my stream timer. This year. James: [01:07:19] I released three applications this year. Frank: [01:07:21] Wow. James: [01:07:24] Ice cream timer for Mac was new this year. Okay. Frank: [01:07:28] Yeah. What was it on before James: [01:07:30] windows? Frank: [01:07:31] Oh, I didn't even know that James: [01:07:33] it was a WPF app with Donna core three, and then I convert it to Xamarin forms to go on Mac, and then I just converted it to UWP for windows and I still need to release it. It's done, but it's out there. So my stream timer, my cadence, and Frank: [01:07:51] I should spend the next hour and talk through porting that thing over to windows. James: [01:07:57] Sure. No, no, Frank: [01:07:58] sure. James: [01:08:01] That's the thing is I started on WPF and then I went to Xamarin forms for Mac support. Cause I'm like, I'm not built enough app kit thing. And then, um, ha well then all of the XAML from Xamarin forms for Mac worked on windows and I was like, okay, well done. Right. And then there was some quirks because. How it works with handling protocols and what now was a little bit different, a backgrounding on UWP. It's very restrictive. Um, UWP. It doesn't like it, but I hacked all this stuff together. I don't know. And, um, and then it worked so, and then I still need to release it, but yeah, it's out there. I can't believe, I can't believe. That it is like the end of the year. I'm just waiting now for Apple to open up that test flight so I can upgrade my application, please. Apple do it. That'd be uploaded by here. Frank: [01:08:53] Uh, did you get accepted into the small business program? James: [01:08:56] I did. Good. I can't wait. I almost wanted to hold off until releasing the app till the first. So then if I made any money, I would make more money, but you know, whatever, I will say this though, from all of this. I have been donating money to charity for all of the, um, money that I've made off of the blog post. I got featured on hacker news. Um, there's obviously affiliate links. There. I'm a portion of all the money that I make off my applications that I sell go to charity. Um, um, and also I just regularly donate to charity as well from the hacker news promotion. Um, I donated $250 to, um, a warm winter warm winter, warm winter. What was it called? Frank: [01:09:42] Warm hearts. Winter drive. James: [01:09:44] Yes. I saw it on TV because it's a local bank up here, uh, Columbia bank. And they do this drive where they're raising money to collect. Um, clothing goods for people that are in need and homeless shelters. So donated $250, which will buy lots and lots of stuff. And they're almost at their, their goal of $250,000. So I do that all throughout the year. So, um, you know, when things like this get promoted and things, things happen, I always want to give back and we do this on this podcast, by the way, is, is, um, Azure, our sponsors, um, on the podcast, um, We'll finish off the year with a warm heart. Well, have one more pot, do it one more podcast before the end of the year. This is the last podcast of the year. We actually, Frank doesn't know this, but I actually, um, work with our sponsors on our podcast and we give them an option of donating. 25% of what they would normally sponsor the podcast app to donate to charity. And then they give us obviously the other 75% back. Frank: [01:10:46] Um, well I noticed when I got the 25% pay cut, I noticed, James: [01:10:51] but if they don't do that, we also donate to charity as well. So, um, we, you know, trying to support, um, you know, every, everyone, as much as we can out out in the world as much as we can. So we try what we can. Frank: [01:11:04] That's interesting too. I haven't seen this before. I've been on the internet for awhile. I haven't seen donating blog profits from being listed high on hacker news to a charity. So cool. Cool. For thinking outside the box there. I like that. James: [01:11:19] Yeah. I just, you know, I thought about. I thought about it. I did use some of the money to buy more sensors to how's the application, like enough, fair enough. 100% of the profits, but I donated, you know, over 50% of the profits from the first week, um, of it to it. And, you know, hacker news like helped for a few days and then it dropped down immediately, obviously. Yeah. So, um, yeah, so I thought it was a nice, nice, especially now it's a hard, hard times. Um, for everybody in general. So, um, yeah, I hope that, uh, helps out, you know, and we're going to Heather and I were actually going through our closets, this, um, winter break too, to find, um, clothes that either don't fit us or we don't wear anymore. Um, like warm jackets and, and, um, um, different things to, to give to charity too. So we're just, we're really trying to think. As much as we can during these times where, you know, there are so many people that are putting their times out to work the food bank lines and do this stuff is, is, um, how can we try to give back during these times? Oh, I'm always thinking about this and I know you are too. It's it's um, um, When we're in such a privileged location, um, obviously like you said, I have a good job and, and you as an independent app developer, while it is a struggle you've been doing okay these years, I, yeah. Frank: [01:12:40] I make, I can make do, and I can still contribute to society. Yeah. And it's definitely that time of the year when it's most fun, actually, really miss. Um, I always kind of loved the annoying Santas and Santa's helpers out in front of stores during the holiday season. I really missed that this year. But yeah. Find, find your own ways to contribute back. Yeah. And this looks like a fun one. I don't know if I can get listed on hacker news though. So, you know, James: [01:13:07] I don't know how that, I don't know how that happened. Who did it? I definitely appreciate it. So there's that. Um, but I do think that, um, yeah, like obviously I am super lucky at Microsoft because you know, they match contributions too. So if you there's a whole program there, which is super good. So a lot of my. Anything that I, that I often, you know, I do that all throughout the year. And then obviously my money on my Twitch stream. I also donate to charity and we're always raising money for different charities all the time. So, um, You know, uh, maybe in years from now, when, you know, I'll, I'll switch and, and, you know, find retired semi retired or whatever, you know, 10 years from now, then maybe I'll, you know, keep that Phil affiliate money. But I think it's, it's nice. Maybe capitalist Frank: [01:13:50] in your retirement usually works the other way around, but we'll see. James: [01:13:54] Yeah, we'll see. So Frank: [01:13:56] yeah, that too, that too. Uh, so what should we do for the next hour? James: [01:14:01] No, I think I have to go eat dinner. I'm really hungry. Frank, I got leftover Turkey, Christmas. I'm going to let you go. I'm going to let all of our listeners go. I hope that everyone has a amazing new year. Frankie, you too. I hope you have a great new year. I'm excited for 2021. And you know what? Our next episode will be coming out in 2021. Can you believe that Frank. I really can't, Frank: [01:14:22] I I'm really bad with calendars and I didn't realize this is the last episode of the year, so I'm good riddance to it. I hope, uh, I hope you are all going to join us and the glorious year, that will be 2021. James: [01:14:37] I'm sure. All right. Well, that's going to do it for this week's merge conflict. So until next time I'm James Montoya Magno. Okay. Frank: [01:14:43] I'm Frank Rivera. Thanks for listening.