Daniel (00:09) The QuickTime is also running. we're live, we're live. Hey, hey, hey, we're also live. We're live on all the platforms. Awesome. Hey, Dave. Good morning. Dave (00:09) My quick time's going. We're live. Yes. Morning. Evening for you. Daniel (00:21) Thank you very much. It is evening for me and I have a different background because like my office is already like 90 % packed up and there's no desk in it anymore. So I'm sitting at my dining table and I'm holding my microphone in my hand. Dave (00:23) Yeah. Dang. You are indeed. Daniel is holding it. Daniel (00:42) then I was holding it. That is what I'm doing. Yeah. Dave (00:45) What, how, long have you got left now before launch happens and you are off? Daniel (00:49) Exactly one week-ish, like minus one day. Because it's kind of like a two-stage process. There will be a lot of packing in the next few days and like putting things in boxes and like putting things away and disassembling things. Then next Wednesday, which is in six days, there will be movers coming and picking everything up. And next Thursday, which is in seven days, I will in the morning, like take the cats, which will be the last things in the apartment. I will put them into the car because they actually are not allowed in the moving van, apparently. I will give them controlled substances, which my vet gave to me. Dave (01:25) Yep. Mm-hmm. Daniel (01:35) that will hopefully calm them way the F down. And then I will put them in the car in their little cages and I will pick up a buddy who's going to be my co-pilot. And then we're going to drive all across the federal Republic. Dave (01:38) Yep. So you're off on your way to Hamburg where you will then be based. Daniel (01:50) little road trip. rights. which is very exciting and which is very cool because it's a very nice city and there's gotta be so many things to explore. I wanna see what other places where the virtual and real places where the startup people hang around. I much wanna see where are the Linux open source nerds and the Chaos Computer Club nerds hanging around. There's probably gonna be Dave (02:05) Yeah. Yeah. Mm-hmm. Daniel (02:24) Music things like I am. I have like in my the back of my head I have this this this thought that maybe I want to do some music again. I don't know. Might be able to connect to people there. And also this there's actually a carding track like just 30 minutes away from the apartment by public transport. So I'm going to check that out. Also, I have Lisa gifted me a book with fantastic biking routes. Dave (02:45) It's handy. ⁓ Daniel (02:54) that I'm gonna have to like check out all of them. And so yeah, there's lots to do. Dave (02:58) That's great. That's really great. Daniel (03:00) Also the fact that Berlin is just like one and a half hours by train away is also like... nice. Dave (03:04) So lots of new things, lots of new opportunities and things to explore. That's awesome. Really, really cool. And we're going to get a new new background on the for the YouTube part of the show for you. Yeah. Daniel (03:17) I am ripping off the foam insulation, like the sound insulation thingies, off my wall tomorrow, which is gonna be sad. The glue that I used is supposed to come off perfectly from the walls, but I'm not having much hope for the actual foam thingies. I'll be happy, I'll be really relieved if the walls are okay, actually. Dave (03:27) Right. Yep. Daniel (03:41) I'm gonna have to repaint the walls anyway, I hope they don't disintegrate. And I don't think I'm gonna put foam things into my new office, at least not immediately, because the cats have kinda destroyed the ones I have. They're just gonna destroy the new ones. let's see how the... I don't wanna have echo problems, but let's see how it goes, one step at a time. Dave (03:42) Got it. That's Right. Yeah, we'll figure it out. We'll figure it out. But yeah. Daniel (04:04) Yeah, and then I'll introduce you from Hamburg, but this last time from Augsburg, Germany, hey, welcome to Waiting for Review, a show about the majestic indie developer lifestyle. Join your scintillating hosts to hear about a tiny slice of their thrilling lives. I'm Daniel, a horizontally rotating fish, and I'm here with Dave, a sleep paralysis demon. Join us while waiting for review. Dave (04:28) That's right, if you've ever been unable to move but sat there in bed, it wasn't me. Stop that Daniel. Daniel (04:36) You're denying everything. Dave (04:40) If I had demonic powers, I certainly wouldn't be visiting listeners of this show, so don't worry about that. Right, well, how have you been? Daniel (04:48) Yeah, because next week I'm probably not to be able to record. mean, you could in theory wake up in the middle of the night or if you go to bed at midnight, just call me on my phone. My car has carplay so I can answer. We can have a little chat and you can record that. My buddy KatzenEyeJoe will be there. He has some podcast experience. He has a German language podcast. Dave (04:54) that's true. Yeah. Mm-hmm. Ha ha ha. Yeah. Yep. Yeah. Daniel (05:17) can have a and Bimmy and Momo can join as well. Dave (05:21) Yep, they won't be very loud though will they? They'll be peaced out in the back. Daniel (05:23) It probably won't be fun listening experience also. Our audio is not super pro quality, but I kind of feel like we're kind of easy to listen to. Dave (05:30) Yeah. I hope so. Yeah, but I think I might take a pass on doing the show with you on the move. Daniel (05:44) You're taking a what, Dave? Dave (05:47) I think I'll pass on that is what I mean. Yeah. Daniel (05:49) a pass with an A. Dave (05:51) Daniel, I was taking the piss, you'd know about it, mate. Daniel (05:52) You I was a tiny bit confused. Dave (05:59) Oh, sorry, dude. Yeah, every, easy for you to say. Daniel (06:01) I was not, was being facetious. Oh my God. No, it isn't. Dave (06:08) Hahaha Daniel (06:10) as evidenced by this recording. Dave (06:13) it's no, I think I will pass on the recording while you're on the move. It might be nice to say hello, but I'm not sure it will make for the best of Paul Kis because, least of which, I don't want to distract you from the road. Unless your co-driver is driving, that could be an option. Daniel (06:28) Yeah, that's good. Probably, he probably won't, but yeah. But that's why I have a co-driver. So he can take care of the cats if anything occurs. So I can concentrate on the road. And also like it's mostly Autobahn, which is just you put the cruise control in and just point it in the correct direction. So that's kind of easy. the car has this active cruise control where it's not like autonomous or anything, but it will keep in the lane. Dave (06:34) Mm-hmm. Yep. Yeah. Okay. Point and click. Alright, so yeah, maybe. Maybe. Daniel (06:59) And it also keep the distance to the car in front. that's actually very relaxing for these long drives. And I just love, I just love driving cars. Like, of course it's bad for the environment. And of course, like even electric cars are not, are not great because it's still individual transport, but it feels really nice. Like, I know some people don't like driving cars and that's totally fine. But like for me, it's just, it's so calm and so nice. And whenever I'm sitting with people in the car, also like they we have these deep conversations. Dave (07:05) that's cool. Hmm Daniel (07:27) And so that's just nice, you know? Dave (07:30) Yeah, yeah, I get that. I do get that. I certainly love a road trip and I never used to enjoy driving but something clicked maybe five or six years ago and I was like, yeah, no, this is, this is all right. And yeah, I get a lot more enjoyment out of it these days. But yeah, you're right. The environmental side is always in the back of my mind these days. I certainly do. query if I need to do short journeys or not. ⁓ Yeah. Daniel, you did something a day ago, two days ago? Yeah. Daniel (07:57) sphere. well. Yes, look at me, I'm very pretty. I'm very, I'm way prettier than usual because I got a haircut, I got a shave and I redyed my beard. So it's very like strikingly blue right now. And I did that because we did a photo shoot and that was like way fun. Like it was of course exhausting too, but like, so a few years ago, I want to say three years ago, Lisa was like, Daniel, let's go to a professional photographer. and get photos taken because we can use those on the websites, on the press releases, on the Instagrams, on the LinkedIns, all those things. And that was actually a really good idea. We took those photos and I submitted a few conference talks and had a good cover photo for those. And that was just a good idea. And so now we're gonna use those up. All of them have been used multiple times. Dave (08:40) Yep. Daniel (08:59) And so she was like, why else you're still here? Let's just get a new set of photos. And we chose a different photographer this time. And she had a fantastic studio in an old industrial park. So was like in this old industrial building and a huge windows. The room was like beige white, so very bright, fantastic lighting. And so the day before I went to the barber, got this haircut, like it wasn't even prettier than I am now because like it was like kind of probably fix it. fixated with a gel. Not even gel, like they have this powder that is kind of like, has a less wet look. Yeah, I have that at home actually, but I didn't put it in today, which I kind of should have. Anyway, and so yeah, I felt good. I felt pretty and like I wore different outfits and I felt really good in a shirt. And I was like, maybe I should. Dave (09:36) and other sort of stuff like a clay type powder thing. Yeah. Daniel (09:58) maybe I should wear shirts more often. Because for me, shirts are always like a, you gotta dress up for the man. know? Like, you gotta dress up in this weird uniform and you have to wear the tie and then the whole suit around it and it's all very constricting and not fitting properly and also it takes so much maintenance to keep everything clean and whatever. But now I'm kinda like, but just a shirt and a pair of jeans? Dave (09:59) I know. Yeah. Yep. Daniel (10:24) Like that is actually not so much maintenance. Like the shirts that I have are a brand that do not need to be ironed. Like you just hang them up on the hangers and they kind of like straighten out. So I could just wash them myself and like wear them more often. I'm considering, know, like new city, new me. Dave (10:42) Fair play, fair play. And you know, like there's something to be said every now and again for shaking these things up as well. So. Daniel (10:48) Yeah. And we took so many cool photos, like we took individual photos in different poses and with laptops and with phones and walking and sitting and looking at the camera and looking away and all that kind of stuff. And we did like photos together, looking serious, shaking hands, looking happy, looking out into the distance, inspired, ready for the, I don't know, the disruption that we, individual, of course, cause and like our vision for the future and whatever. We did a few like super Dave (11:05) Thank Daniel (11:15) weird ones that were like, this is super fun. Like album cover style. Dave (11:20) Yep. Yep. Did you do the hip hop album cover style? Daniel (11:25) No, but we have one where like the in this industrial wall behind us is behind us is very visible. And like, I'm, I'm leaning against the wall, I think, and just like looking straight at the camera with a very neutral expression. And at least I was like sitting on a window somewhere like looking off in the distance. And it's like, like, if you ever see it, like, like, I'm not gonna post those, like, we're gonna use them, right. But if you ever see the see it, like look back to this episode, also, I don't have them yet. But like, I might show I might show it to you in private, but like, Dave (11:41) Right? Yeah. Daniel (11:54) The public, I'm sorry, you have to wait. You have to wait until the album comes out. Dave (11:54) Yeah. Yeah, gonna have to wait for the album. Yeah. I'm getting hints of industrial EBM, maybe a bit of synth in there somewhere. Daniel (12:06) Yeah, yeah, that's my jam. Dave (12:08) Yeah, yeah, 80s but not 80s, like a bit of a vaporwave sort of synths in there maybe. Daniel (12:14) Right, right, right. And then some like nine inch nails, drums like lip wave, but like really hard drums that really crash into you know. Yeah, that's my jam. Yeah, I'll hire you for the visuals, definitely. Dave (12:23) Right, I want to listen to this now, so get on, hop to it. Yes, yes, you can. ⁓ Daniel (12:33) Yeah, it was like super fun. Although at the end it took like, this took like three hours or so. And then I was exhausted at the end. I was like so tired. Like, like I was like, I got out, I drove Lisa home. Then I kind of, got groceries for a thing that I'm going to tell you in a second. And then I arrived home and I was like, ugh. And I just like crashed on the couch because it turns out. like just keeping up this really high energy was super fun, but also just exhausting. And then Lisa writes me like, are you as exhausted as I am? Yeah. So yeah, that was fun, but exhausting. Worth it though. Like I'm really looking forward to the photos. I posted some in-process photos on Mastodon. I can like, while I talk, think I can try to look them up and send them to you so I can put them into the show notes. There they are. And so what I did after the, like I got some groceries because yesterday, so the photo shooting was two days ago. Yesterday, Dave (13:13) Yeah, I'm looking forward to seeing them, Yeah, definitely. Daniel (13:33) I kind of had a goodbye lunch with my coworkers and a few other people from the startup hub that we are, that we're in, right? So, yeah, I made like Bavarian specialties basically, because these are things that I won't be able to get in a while. I actually didn't post photos of this. Dave (13:50) No. Daniel (13:52) I need to post photos of this because, hang on, there they are. So I made a special Bavarian specialty called Obatzda, which is a variant of cream cheese that is kind of like a mixture of different spreads. And it's like super tasty because it's very strong tasting. It's very, very Bavarian coated. And a few other things like radishes and whatever. And of course, lots of pretzels because it turns out like Hamburg doesn't have like good pretzels. So I kinda needed to get my pretzels in before I leave, right? It was very bittersweet. It was very, it was very fun, but also kind of sad because this was like kind of the last, the last milestone before I leave. Dave (14:22) Right. But you'll, yeah, I can understand that. also, you know, people can come up, you can go down. There'll be those moments too. Daniel (14:38) Right, of course, of course. And also like I am planning to be here in Oxburgh every now and then, but still like this is, now it's getting really real. So yeah, it was a bit sad, but it was also nice to feel like people are sad to see me leave because they like me, they value me, and that's kind of nice to see. Dave (14:43) Yeah, that's better sweet. Yeah. Yeah, no, that's really lovely. Oh, well, when this show goes out, you will likely be moved, settled in. We're going to have a bit of lag time on the on some of these episodes going out. And that's actually deliberate to give you some space to move in and do what you need to do. So listeners of the show, if you're wondering why, oh, I Daniel Post, he move two weeks ago? Well, that's actually, you know, we're giving him space to to get settled in and get sorted out. Daniel (15:25) Also, oh my god, I'm just, I'm just realizing, like I said, oh, this is the last show from Augsburg. But the thing is, like next week, I'm going to Hamburg. But the week after, I'm actually taking the train down south again, back to Augsburg, because I need to oversee the renovation of this place. Like, so we hired a painter, I was gonna paint the walls and everything. And so I'm here for another week, but I'm living at my dad's, I'm kinda house sitting my dad's apartment. So there's gonna be another show from Augsburg. Dave (15:42) Right. Yes. Pretty good. Daniel (15:54) from a different apartment in Augsburg. Or I might even go to the telemetry tech office to record. mean, why not? Dave (16:01) that'd be fun. That would be fun. no, dude, it's a big thing, cities, moving that far from where you are. And yeah, I wish you all the best with it all. It's going to be awesome to see you getting into a new place as well and everything that that brings. And also, Telemetry Deck is now by virtue of you being there and Lisa being in Augsburg, like a multi-city establishment between founders and everything. So that's gotta be kind of cool. Daniel (16:32) It is, yeah. Like depending on who's asking, we're either a Hamburg company or a South German company. yeah, no, that's, you gotta, I gotta connect you to the Hamburg office. Dave (16:43) Yes. Awesome. mean, for me, it makes like, you know, point zero, whatever of a difference in our calls, right? Daniel (16:49) Right. Dave (16:51) Yeah. Daniel (16:54) But well. I have more things to talk about but I don't want to steal all the thunder. Do you want to talk about your Swift UI bug before I tell you what I did in programming? Dave (17:00) No, You can do. I'm going to talk about a couple of things. So very quickly, we've talked about my moving over to Linux and that end of stuff and checking that out. So that's still a work in progress. My laptop's not here yet, another week, hopefully. New Zealand is far, Daniel, and my laptop is literally coming to me from the UK. So it's doing this sort of like Daniel (17:32) Why wouldn't it come from China though? Like, I mean, like that might be a dumb question, but, oh, so it's, it's traveling halfway around the world to give, to get assembled and then the halfway around the world again. Dave (17:34) It's assembled in the UK. It's a Star Systems one. Yeah. Yeah. Probably. Yeah. Yeah. But it has open boot stuff and all of that and the things. So it comes preloaded, pre-configured and everything ready to rock and roll. I mean, I'll blanket and put my own installation on there, but it will come with Linux with Kubuntu out of the box. Daniel (17:47) Oof. That's kind of neat. you've got like a good start, easy, like drivers all working and stuff. Dave (18:09) Yeah. Exactly. Yeah. Yeah. Because I just didn't want to have that hassle. I also wanted to support company that is doing that sort of thing. So yeah, hopefully it's all good. And I get a lot out of this. The plan from a dev perspective is that that will then be my Android Studio laptop. That's where I'll be doing Kotlin multiplatform work. I still think this is a good plan. It's what I want to go after over the rest of this year. But I have found I do need to keep things updated with the apps that are in the store. I've been in Xcode dev mode over the last week here and there. And one of the things I've been doing, I've got a couple of new features in Govj that I think I want to pull together and ship. I've got to keep the customers happy. And also I'm changing some of the user feedback mechanisms that I've got in my apps. So that will be moving back to being an email based setup instead of feedback pool. So I'm moving that to that and setting that all up with a specific email address for each app and stuff. So that's been some of what's been on my plate. but the thing that's perhaps interesting is that in the course of updating my app video to audio, which is a little, audio extraction app, put a video in, you can take the audio and trim it out of the video. I went to that app, that app, didn't need an update. It's using a, something else for feedback. But when I compiled and ran it, it's been probably maybe 18 months. I'll have to check the app store to see when the last update went out. But I noticed something really, really weird. compiled and ran, it's running on my iPhone, which is the 16 Pro running iOS 18. Daniel (20:00) Okay. Dave (20:08) And one of the slider mechanisms on the bottom of the screen that I've got where you can trim the video down, which is artisanally handcrafted in SwiftUI, didn't work. And I'm like, OK, well, it's not changed anything. I've literally not. I've walked back into this code base, and it was working, and the app is shipped. What's going on? And I flick between the tabs that I've got, and then the control, what was happening is the trim control wasn't updating. So as you slide this slider, it was doing what it was working, but the control itself wasn't updating its position on the screen. Flip between the tabs and it updated. This is weird, and I've seen some of this weirdness before in one way or another. Listeners to the show, longtime listeners might remember probably about five months, four months ago, I ended up having to do a bit of a deep rebuild of how observability works through my video mixing app. The issue at that time was on iOS 16, a user had messaged me to say, dude, what's going on? This thing doesn't work. I have this iPad that's on iOS 16, and your app is now not usable. And the reason I found at that point was because of observability. was because of observable objects. And the way I had the observable objects being passed down the SwiftUI view hierarchy, they were in there as environment objects. And what was happening is that if you were observing a property several views down, every single parent view would get refreshed every time a property changed on that observable object. as well as the child, as well as the one observing it, regardless of whether that property was being used for anything in the view. And as you might imagine, if you're then changing something very rapidly and you've got a real-time video mixing up, was causing things to stutter and break and drop out. So I fixed that at the time by changing how that worked. I moved everything into static, like a singleton, basically, for dependencies. I pulled all of the observable stuff out of the SwiftUI layer. I created view models that observed the actual static singleton-vended objects. And the singleton that gives you the dependencies, basically. They're on there as static files. And so I had view models that would observe that. They would then publish something. The SwiftUI view, the child view, if you like, would then observe the local version of that data. And everything sort of moves on, right? That worked as an overall approach, and that stopped the issue I was seeing. I wasn't happy about it. Essentially, at the time, The main reason for doing it was to support iOS 16. If I hoisted the base version up to 17 or 18 in terms of what's supported, then the bug went away. So something weird in observability in iOS 16 probably has been changed as part of when observable came in. Yeah, OK, whatever. Yeah, and I found with this. Daniel (23:20) All right. Dave (23:24) Other app with the app that I spoke about at the beginning, I'm looking and I'm going, this feels like that all over again. This feels like something funky in Swift UI or observability because the published property is changing and the view isn't refreshing. That's ultimately the issue. So it's not quite the same, but similar. I flick the. base operating system supported up to iOS 18, recompile and run on my phone, and it works. Okay, so this is weird. Yeah. Daniel (23:53) Huh. This is weird. I did hear about some change in observable objects in SwiftUI where you could observe, like with iOS 18, now observe individual properties of them instead of the whole object. Dave (24:10) Yeah, yeah. There's bit of that. It may be. There's the observable protocol as well, which is a slightly different pattern. It's not a protocol, rather it's a property wrapper. But you can make anything observable by saying so. This is observable. And when you do that, it makes all of the properties published effectively on that object and turns it into an observable object. Daniel (24:13) Might this be related? Mm-hmm. Dave (24:36) There's some level of probably a Swift macro based around that property wrapper, some level of boilerplate that's then generically generated for that. I'm not using that. I'm using the old school observable object, as it were, the OG. And the differences here are they must be to do with the SDK itself. something shifted and I think it was somewhere probably last September, October time. Daniel (25:04) and it's. Right. And it's weird because it's not compiled into your binary, like even if it comes from Apple, like so that it would behave the same, right? So it's different depending on what OS it runs on, but also different on what your minimum OS version is. Dave (25:13) Hmm SDK. Yeah. And like I say, in this particular example, it wasn't different on the OS. It was actually happening on iOS 18 as well. But it was to do with that lowest SDK being set in Xcode. As soon as I hoisted it up, some other code path must have been engaged. There's probably an if-def type flag somewhere in there for iOS 16 that is then not engaged that has then Daniel (25:46) Mm-mm. Dave (25:51) given appropriate behavior. So I guess the long story short with all of this is like, if you're having these weird observability problems with observable object, and you can move on to just supporting iOS 17 or 18, the cheap and easy fix is to just do that. It kill the old support. Pull that base SDK up. Daniel (26:13) especially since 2018 and 2017, as far as I know, didn't drop any devices. So anything that runs 2016 can also run 2017. Dave (26:21) No, this is split. This is split there. No, I know that's wrong because that's why I'm supporting 16 still. Daniel (26:22) Don't call me that. okay. I see. Then I... Huh. I thought it was the case, but obviously I'm wrong. Dave (26:30) Yeah, yeah, there's a I think so anyway, the iPad Pro 9.7, which is really old now, is it doesn't support 17. Daniel (26:40) Mm-hmm. I have an iPad one around here. Does this support iOS 17? Dave (26:47) I distinctly doubt it. ⁓ Daniel (26:48) Probably not, right? It's not, like, I'm just joking, it's not even turning on at this point. But it would be so cool. Dave (26:53) Well, we know it isn't, but it's Shroudinger's iPad, and so we can get it turned on, so we'll see. Daniel (26:59) All right. So, like, what do we learn from this other than like, okay, so one thing that we're taking away is that if you're having observabilities problems, son, I feel bad for you. Dave (27:11) Yep. Daniel (27:12) Update to iOS, your minimum SDK version to iOS 17 to fix that if possible. Dave (27:16) Yes. Yes. And potentially 18, like I feel like this, this could be a perennial thing is to just have a look, see what happens when you move that base SDK up. If it shifts behavior, then you're onto something and you know, it's not something you have done in the code potentially. which was obviously my initial instinct, right? When I got the bug report was wow. Okay. I've, I've screwed something up here at the very least. I've done something that only works on 17 and 18. And I should have been more observant for 16. But I mean, yes, in terms of testing what goes out of the door, you should give it a good run through. But also, behavior has literally changed. It used to work and was solid. These things ran and worked on 16 before with older versions of Xcode. So yeah, I guess what have we learned? Every now and again, might not be you. Xcode likes to gaslight us on these things. Yeah, but that was what I discovered this week. Daniel (28:14) Hmm As someone who's kind of like developing their own SDK, and APIs, as in like HTTP APIs, like backwards compatibility is a horrible thing sometimes to manage. Dave (28:28) Yes. Yes. As I said to you before, I feel like there's an if-def somewhere lurking in there for iOS 16 that is causing whatever side effects that I've managed to pick up. Maybe. But yeah, it's hard. It's hard work. And I don't underestimate the challenge for Apple's teams involved in developing this side of stuff. But it's such a shame because when it works, it's beautiful, right? And injecting an environment object down from the top, for example, as I was doing, and then not having to think about any other sort of dependency injection happens or anything like that. It's like, this is crazy. This is easy. I was quite upset to have to gut that out of the app. Daniel (29:16) How hard could it be? The answer, dear listener, it's very hard. Dave (29:18) I'm Indeed. Yeah, so I will experience all of this all over again in KMP and compose, no doubt. In one way or another. No, no, Yes. Daniel (29:29) It's not gonna be better. It's just gonna be different. because that's the harsh programmer lifestyle. Dave (29:40) Indeed. Stopping the truth bombs there, Daniel. No, that's me. I'm passing the mic back to you to tell me more about your world, Vyrd. Daniel (29:52) I can actually like remember last time I told you about that the fact that I want to try out different TikTok formats. I want to hashtag all of them. No blockers because I want to kind of introduce them with like, hey, like back in the dark old ages of agile, people would do a thing called stand up. And I did another one of those and it went kind of well for my purposes. Dave (29:59) Mm-hmm. Daniel (30:16) and like for my level of known-ness. So I post the newest one, got over 2000 views, which is about twice or thrice what I usually get. So that's kind of nice. I also finally found out how to do the thing that I would like to do, which is like give TikTok like a bunch of prerecorded videos that are kind of like just to snap over the course of a day. Dave (30:24) Okay. Okay, yeah. Daniel (30:45) and then record voiceover after I already see the video. And that, like, I don't know if that didn't work before or if I'm just dumb. I think I'm just dumb. Like, think I was just holding it wrong. Either way, that really works well for me. And so I had really fun and it was very quick to do. And I just like gave an overview over the things that I already told you last time, which is like the new features and whatever. And so that was... Dave (31:08) So hold on, hold on, run me past the option with the voiceover again. How is that working? Daniel (31:14) So last time I told you that it's frustrating because you have to record the voice over first and then add the views. I think, I think. And it turns out, no, right. So what I did is like I recorded, like I knew what I was gonna talk about. So I just recorded a bunch of screen video. Dave (31:24) Right. Yes. Yeah, I think we had that conversation before. Yes. So you've done it the other way around. Daniel (31:37) Actually, I actually took my phone camera and recorded my screen with it because kind of like felt a bit more dynamic and I could pan to a cat every now and then to have like a bit of variety. And then I kind of just like drag all those into TikTok on the phone. And then let's just say you can adjust the length of each clip. Add a background music and then you can also record a voice over this. a microphone button and either I didn't see it before or I was trying to accomplish something different. But that's actually kind of neat. actually even neater would be if I could record the voiceover and then like add the clips exactly to illustrate what I want to show. So that would be like perfect for what I want to do. But like this is good enough. Like this is kind of neat. And yeah, so. Dave (32:26) Good enough and out there in the world is better than agonizing about it. Daniel (32:29) Right, and it's actually fun to do those. So I've learned something new, I had fun, and this week, the next TikTok is gonna be about how I did almost nothing because I didn't make any progress on the single sign-on stuff because it's hard. Like, suddenly there's, like, do know what Coarse is? Coarse is cross origin, I don't refer something. Dave (32:33) That's cool. That's cool. I've seen the acronym. Daniel (32:56) I don't even know what the acronym stands for. It's basically to make sure that only your JavaScript is allowed to access your server. So it's like to prevent impersonation by side-loaded JavaScript. It's like a very sensible security feature, but also it's driving me nuts. Dave (33:10) Hang on, hang on. Cross-origin resource sharing allows web pages to request resources from a different domain than the one that served the page. it helps to manage and control how resources are shared across different origins while maintaining security. if you're aware of cross-site, what's the phrase? Daniel (33:17) right. scripting Dave (33:37) Cross-site scripting Daniel (33:37) cross-site scripting Dave (33:38) and attacks based around that. This is the undo button on that that still lets you do cross-site scripting but securely. Is that right? Daniel (33:47) Basically, yes. So on the server side, what I do is like, all right, here's a list of domains that are allowed to connect to me via JavaScript. So that are allowed to like run background fetches via JavaScript to me. And also like here's a list of actual HTTP methods that they are allowed to call. And so this is kind of neat, but also it kind of says, oh, yeah, these are the headers that are allowed. And then if you forget that you need a new header for the Dave (33:59) Mm-hmm. Daniel (34:16) singles and stuff, then it's just like an hour of debugging. there's also redirects. then of course I need to like, the first SSO that I want to implement is GitHub. And then at some point that GitHub is like, you're sending too many requests. Like we're going to block you for an hour. And then like I'm kind of being locked in, but then it doesn't work anymore. I'm like, ah, this is, it was horrible. Like I have at some, somewhere I'm either having a bug or a misunderstanding of how things work. Dave (34:28) Yep. Mm-hmm. ⁓ Daniel (34:45) So I didn't make any progress, I'm sorry. But I did, like what I think that I did today actually, what that was really cool was I took two of my coworkers through a really deep dive into how queries get executed on telemetry deck. Like you kind of construct a query on the front end and then there's a thing on the front that kind of packages the query, sends it off. And then it gets, it has all these steps. It gets pre-compiled, it gets compiled, it gets into a queue, but also there's a cache. So we check if a recent result is already in the cache. And so we deliver that out and everything. And there's the step called pre-compilation that is really cool where we kind of are, like this is where we can take a... convenience feature of like basically syntactic sugar of the query language and turned it into the actual implementation before like sending it on. And so I was doing that because I want to introduce those two coworkers into the magic realm of like TQL evolution. Dave (35:53) Yeah. Daniel (35:54) So now they are inspired every week or every month or whatever to just add a tiny bit to TQL to make it an easier to grok language. And also they had fantastic ideas about how to improve the documentation now that they understand the query system better. So I'm really excited about this because nothing is coming off right now, but I'm hoping that this will make it the long run, make it easier to get into like, how does telemetry work under the hood, but also like, okay, I have this really complicated question that I wanna ask, how do I ask the question? Because like the easy questions are kind of answered by the UI already, like how many users do I have? Like how many iPad users do I have? like, are iPad users producing more errors than Android users? Like this is a question that you can totally ask. Dave (36:45) Mm-hmm. Daniel (36:46) but you need to know how and with a bit easier abstractions on the query language and also like better documentation that is more process focused. it's not like, like right now we have a reference like, here's, this is how a theta sketch aggregation works. But what these two coworkers can wanna start is a like, okay, I wanna. Dave (36:48) Right. Yes. Daniel (37:08) like I have this specific question, like here's how I go about it. And so also, like that's also helpful because like people will search for that on the internet and then find that page. And also like you could. Dave (37:18) So you're developing a quick start guide for some of these sorts of queries then, is it? Daniel (37:22) Right, so the hope is that you'll be able to use the language before you fully understand the language because you're not required to go deep into how it works before getting any value out of it. And also we're doing things like, for example, like as of last week, to find out like how many users you have, you needed to have a theta sketch aggregation over a field of client user. Dave (37:30) Yeah. Daniel (37:50) and then add a field accessor post aggregation to actually extract the number from that field. What is a theta sketch? Theta sketch is a very deep algorithm that gives you, gives me the number of different values that a field may have, which is really important for me to know. And also the step with the aggregation and then the post aggregation, it's really cool performance improvement, but like you don't need to know that. You really don't need to know that. So instead we have a, right. Dave (38:08) No, no, not at all. I just want to count the number of iPad errors versus Android errors today. Yeah. Daniel (38:20) So we have a new aggregation and that is called user account. And that just does the same thing, but it's just called user account and it has no two step thing or whatever. And behind the scene, it just gets compiled into the other thing. But I should have done this years ago. But yeah, so I showed the coworkers also how I did that. And so that if they come up with more convenience, Dave (38:29) Mm-hmm. Daniel (38:42) features and syntactic sugar for the language, they know where to implement that. And so the hope is that this will bring forward the documentation, but also the language itself and make everyone happy. me less, like also like they can now take over another part of the API that I don't have to program on. Dave (38:59) Yeah, that's awesome. And you don't want to keep having to explain... Daniel (39:01) I'm just gonna ignore the PRs until they like poke me three times. I'm sorry if you're listening. I'm really sorry, but I'm just like really busy. And then I can like just like comment on that and have like, can you have like a put that thing a tiny bit differently? Like, maybe a tiny bit change, but yeah. So yeah, that is actually very fun to me and also exciting. And I'm hoping that's a good direction. Dave (39:05) Right. Yeah, yeah. that's cool, though. Fantastic. Well, it makes sense to me. Like, yeah, I don't think I want to know how a theater sketch works in too much depth, but I do want to know. Oh, yeah, yeah, yeah. OK, I'm with you on the nerd out. Don't worry about that. But yeah, no, practically when I want to find something out, though, I just want to do a user account. want this thing and... Daniel (39:31) but it's so damn interesting! my god it's so cool! Yeah Dave (39:49) I guess even if I'm looking beyond the defaults that you've got in telemetry deck and I need to be programming in this layer or pulling together something at that next layer down, I still don't want to have to read a gigantic reference set of material first. I literally don't want have to read the manual. I just want to get my analytics done. I want to get this job done. So everything that you do to smooth off these edges, I think is incredibly useful to your customers. And you know, the depth is still there. Yeah. Yeah. Yeah. Daniel (40:20) I've added links to the documentation. I've added links to the documentation of what is there, especially of the new event count and user count aggregations. So you don't need to touch any theater sketches. Don't get your hands dirty. Dave (40:30) Mm-hmm. No, that's great. I'm yeah, I'm scanning that now. And this this reads this reads very well, although there is still a reference to theta sketch halfway down there, Daniel. But that's fine. Anybody who's. Yeah. Yeah, yeah, yeah. Daniel (40:43) Because this is the list, this is the complete reference of all the aggregations, right? And of course the convenience ones are at the top, but of course there needs to be a reference to theta sketches. Because what if you want to either count number of values for a different field, or what if you want to create the theta sketch object, but then there are multiple operations on it? Huh? Well then, then you need the theta sketch aggregation. But then you kind of, at that point you probably, are deeper. there's like another step in the learning curve and you don't have to go like maybe it's like flattened a little bit and also that's that's kind of nice. Dave (41:18) Yeah. Yeah, I sort of view these ways of learning a little bit like you're in a, I guess the analogy I would want to use is swimming off the side of a beach. And you know, you've got the shoreline goes out and like It keeps dropping off in depth as you go out. And I think what you do by creating convenience accesses, by simplifying down approaches and documentations into things, you're making it more of a gradient. You're making it more of a ramp down into each bit. The depth is still there if you need to be in that end of things. But yeah, you're making the drops less of a sudden thing. Daniel (42:00) It also helps with implementing UI because if you have very simple JSON objects behind them, like writing the UI in a way that is also very simple, that makes that easier too. Dave (42:12) Yeah. That's fantastic. Daniel (42:14) I want to tell you one other thing because I want to have another, because we did so many callbacks to previous episodes. Like you talked about your laptop and we talked about your Swift UI problem that you encountered like half a year ago. And so I think two episodes ago, I told you that I kind of wanted to create a fitness tracking app. I hope I did that on the show. Dave (42:22) Yeah, yeah. Yes. I don't know if you'd... yeah, can't remember if it was on the show or in our messages, Daniel. It all blurs. Daniel (42:40) I'm reasonably sure, but I'm gonna recap it either way. what I was thinking was like, kinda wanna go back into shape, but like I have this problem where I either do too much or too little and like Apple's fitness activity rings don't really fit my purpose because what they do is they encourage you to work out every day the same. And if I set the limits very low, I will always hit the limits, but it won't mean anything because I will just like fill the stupid rings. without any effort, I'm not motivated to put in effort. And if I set them too high, I will only really fill those rings on the workout days, but not on the rest days. And I kind of want to have rest days because I am realizing this as I go more, as I read and listen to more podcasts and stuff like that about fitness. And like rest days are actually kind of important, y'all. Did you know that? Rest days. It's where your body actually builds the muscles. Dave (43:31) Yep. Daniel (43:36) So I was kind of like on fire to build the Duolingo of fitness tracking apps, where it would recommend stuff and would also give you kind of a streak, but then the streak would not stop immediately just if you had a rest day, because rest days are kind of important, right? What I also did was I asked around on the Mastodons, what's your favorite fitness app? Dave (43:56) Yeah. Daniel (44:03) And someone recommended an app to me that is called Gentler Strik. I'm putting a link to the show notes gentler.app. And that is exactly, that is exactly what I was envisioning. Like it's actually even prettier to be fair. Like it's even prettier. It is so cool. It is a really well written fitness tracking app. It is paid. So it's not telling your data is that you just pay a bit of money for it. Dave (44:04) I wonder if it's... Nice. Daniel (44:30) and then like you're the customer. And it also has this really fun, it has this fun concept. So it has this concept of effort, like zero effort is like, I'm doing nothing. then like, so that's on the one side, like on the bottom of the chart, basically, and like super high effort is like, I'm doing as much as I can. I'm like, just like almost dying of effort, right? That is at the top of the Dave (44:33) Yeah. or pepper, Dwight. Daniel (44:54) of the imaginary chart that I'm kind building in my head, right? What they're saying is, like, you're building kind of this nine chart, and then every day, you don't do anything. You're just resting. Your fitness level kind of drops a little bit. But they're also saying, this doesn't have to be a bad thing, because they have this green, I don't know, area of the chart, where they say, like, okay, if you're above, like, if you're doing too much, then you kind of need to, like, Dave (45:02) building kind of this mind part and then everyday you don't do anything you're just arresting Daniel (45:23) rest a few days to get back into the green zone, right? And the UI even actively encourages, okay, yesterday you did a lot, for your, like it kind of resets to your relevant fitness level, right? So yesterday you exerted yourself all the way, so you need to do a few rest days to get back into the green zone. And I've tried it for a few days now. And so far, I really feel it. It's really nice. Dave (45:50) That's wicked. I need to check it out because, well, I've got various health needs that means that regular, like, maxing out exercise is probably not what I'm after. But also something, little and often, is what I'm after. And yeah, you're right, a lot of the usual tools don't really help you with some of these kind of constraints. So... Daniel (46:11) Yeah, yeah. Yeah, and it has a few things that I really liked about it, like that whole concept at first, but also it has way more depth. Like usually all those apps that I try out, they're very shallow, as in like, okay, they have this concept, but that's kind of it. But then they don't take into your account this or that. And so they're kind of working against you because you can't tell the thing, but this doesn't apply to me. And that... Dave (46:24) Yep. Yeah. Daniel (46:44) that didn't really like it has like sleep tracking and all that thing built in as well. It has, it works very well with an Apple watch. So if you have an Apple watch, that's kind of the expected usage. But if you don't, you can totally just record your like your walks with Strava or whatever on the phone. Just like it will just import them. And the only thing we have to do then is like tell the app like how, how much exertion did that? Like how did that, how hard did that feel for you personally? Like it will kind of take that from the heart rate and stuff. if you don't, if you have that, but otherwise, like it still works. And it has so much, so many little tips and tricks and it will like, I don't know, there's like status text that will say stuff like, all right, so you slept well and also you had a lot of exercise yesterday, so you don't need to do anything. Just like chill, my friend. And like, there's enough copy obviously that it actually is true. Dave (47:18) That's cool. That's really cool. You Daniel (47:39) so much like UI copy, especially about like body functions is just wrong for me. This is cool. This is like, I feel very much taken like seen by this. Dave (47:49) I will be checking this out after we've stopped recording. Daniel put, yeah, I'm glad you found it because actually the prospects of you adding building yet another thing. So you're already busy dev list sounded a little tricky. So that's probably something for us to bear in mind. That's probably something to bear in mind actually, like that instinct to go and build the thing versus Daniel (48:01) Hahaha Also, it's a European app. just see that. That's also. Dave (48:17) taking a second and seeing if it already exists and if you can find something that's pretty close to it. Like sometimes that's worth interrogating for yourself. But I also think that actually the exercise of you thinking about what it was you wanted to build helped you find what it was you needed that was off the shelf. Daniel (48:36) Yeah, like, and also like I didn't, you know, like sometimes I get these project ideas and sometimes it's like, I just like to noodle around like with it. And that's also fun. Dave (48:43) Yeah, that's not a bad thing. Yeah. But now I'm looking down the side of this thing and I'm like, yeah, that looks useful in a way that yeah, currently a lot of things haven't felt useful for me. So thank you for sharing. Daniel (48:59) I'm very happy. Like thank you to the people who recommended this to me. Like I think three or three people or so like sent me towards this app. I got a lot of recommendations for others as well. And like I'm so grateful. Like there were a few like really cool ones, but I think that one was the one that's kind of stuck for me for now. Dave (49:07) Yeah. No. Daniel (49:17) Cool! Awesome! Anything else? Final thoughts before we close this for today? Dave (49:23) I know thoughts before we close up for today. I think good luck with your move, Daniel. I'm quite happy to tell you that on the show. I'll tell you that in our messages, of course, too. But yeah, I hope everything goes absolutely smoothly with all of that. And yeah, the next time we speak, dude, hopefully my laptop will have finally arrived. I could tell you all about that. Daniel (49:32) Ha ha ha Are you gonna record on it? Dave (49:47) I'm going to try. Yeah, let's see how that works. It's my new home. So like my new digital home. And I'll able to tell you how it's working hopefully by that time as well. Because this Mac is getting relegated to being a build server and I need to get into iOS dev mode, Xcode device and that's it. Yeah. Daniel (49:49) Okay, cool. Wait, this is a Mac Studio, right? Like, can I register it with my GitHub runner? Because I have an M1 Mac Mini as a build server for the Telemetry Deck API, which is, as you know, written in Swift. And it takes a while. It takes a while. Dave (50:13) No. Okay. Yeah, yeah, yeah. Can we do that? Could I register this as a runner? mean, it may as well be out there earning some money when I'm not using it. no, it will be my local runner. I'm actually, I mean, if this all goes to plan, I'll part ways with a couple of other older Mac laptops that I've got hanging around and things too. So, actually, it feels like a fairly big move for me personally to be sort of going to the stage. Daniel (50:30) You Dave (50:47) And it might not work. That's the other thing. It might not be the right choice. And I might find this out the hard way. yeah. Yeah, exactly. You can always reverse gear. And yeah, we'll see. Hopefully, I've got some actual practical this is what it's been like to talk about. no. Daniel (50:55) Which is fine also, right? I mean, you could just like try out stuff. Dave (51:11) Those are my closing thoughts, Daniel, and good luck with everything. yeah, speak to you on the other side, dude. Let's close this out. Daniel (51:19) See you on the other side. Yeah Thank you so much everyone for listening Please write us on iTunes and YouTube send us emails at contact at waiting for review comm and join our discord The link is in the show notes Also your task for today is send us a sunshine emoji Dave where can people find you? Dave (51:39) You can find me in the show notes. Take a look down the show notes that we always talk about where my social media accounts will be linked as are Daniel's. But for people who don't want to look at the show notes, where can people find you, Daniel? Daniel (51:53) You can find me at daniel at social.telemetrydeg.com on the mastodons. And I'm following Dave, so just like come to my account and then just click through to the first Dave you find. It's probably the correct one. Dave (52:04) Ha Daniel (52:04) 15 other Daves are now like SHOUTING UP Dave (52:07) Well on that Dave shaped bombshell. Take care Daniel. Have a good one. Daniel (52:13) too. Have a great day. Bye.