Daniel (00:00.676) Ah, it's working. It's working. I'm in the in the studio. We're live in the studio. Dave, it's so fantastic to see you again. Hi. Dave (00:10.382) Hi Daniel, yeah, it's great to see you too, mate. It's actually not been that long since we last caught up, right? That's not been a big get this time. Daniel (00:16.452) Yeah. Yeah, but we had a few problems just like starting the thing because like we had to restart the recording in our software and whatever. And I tell you why I have a theory why that is because today I had every single type of video meeting in this very browser. Like I'm using Safari for day to day browsing and Edge is my video meeting browser. So I'm using this for our video meeting right now. Dave (00:25.006) Mm-hmm. Dave (00:38.126) Hehehe Daniel (00:45.284) in Riverside, which is the software we use to record this podcast. But also I had today, I had Microsoft Teams. I had Zoom, of course, but I have that in an app because I have actually a paid Zoom user. I've had, hang on, I have Microsoft Teams. I had BigBlueButton and I had WebEx. Dave (00:45.582) Yep. Dave (00:53.294) Mm-hmm. Dave (00:57.006) Okay. Dave (01:06.382) So you've had all all the video calls today. Daniel (01:07.268) Yeah. So that's actually why I wanted to reboot my computer before I joined, because it actually refused to kind of quit the browser. So I was like, oh, and somehow I can't really visit the page. Maybe just like, maybe I'll have a quick reboot just in case anything. I could probably have killed the browser or something, but I don't know. This machine reboots pretty quick. Dave (01:18.158) Hmm. Dave (01:30.382) Yep, clear it all out. Should we try using FaceTime just so you've kind of got like the whole group? You know, it's like Pokemon. Daniel (01:39.62) Yeah, I mean, what is, what is missing? Say is there one, one, one else? Like, um, I know FaceTime. Yeah. And there's also tuple, which is, um, one of my favorite, I actually paid. Oh yeah, I can do video too. Tuple, by the way, I pay them a lot of money too. And it's actually my favorite video conferencing application. Uh, if you don't know, it is a app specifically for scre collaborate collaborating between. Dave (01:48.494) FaceTime, signal. Dave (01:57.422) Hehehe Daniel (02:07.588) technical workers, I wouldn't say like programmers, other like such professions, because it can actually show you the other person's camera, but it's mainly about screen sharing. And you have various tools to interact with the screen. Like there's the whole, all the algorithms are optimized for like high resolution and good legibility over, I wanna say like perfect color reproduction or smoothness. And... Dave (02:13.198) Mm-hmm. Dave (02:18.734) Right. Dave (02:27.854) Yep. Dave (02:34.958) Mm-hmm. Daniel (02:36.644) Also, it has like where it shows like, I can like tap your screen and then it will give you like a little ping where I clicked it, or I can actually have my own mouse pointer on your screen or like share a keyboard or stuff like that. It's really, really nice for working together and stuff, for pair programming, that kind of stuff. Jitsi, I forgot, I had a Jitsi call as well today. Because I just realized, because that was actually terrible for reading. Dave (02:41.006) Yep. Dave (02:53.518) Nice. Dave (02:58.702) Okay, so you've had all the calls but... Daniel (03:03.652) stuff on a shared screen because the algorithm are obviously not optimized for that. And it was very confused by my retina screen. Dave (03:13.07) Hehehe Daniel, I think you need to introduce the show. It feels like we've not properly started until you give your intro. Daniel (03:20.612) You can't poke me to do it. I want to get into that totally naturally. The next thing out of my mouth was going to be, and by the way, hey, welcome to Waiting for Review, a show about the majestic indie developer lifestyle. Insert a little crown above my head here. Join your scintillating hosts, Dave and Daniel, and let's hear about a tiny slice of their thrilling lives. Join us while we're waiting for review. Dave (03:31.566) Ha ha Daniel (03:49.284) Alright, now the show has really started. Dave (03:51.79) Okay, sorry to poke you there, hens are doing that. I feel good now though, that's... Daniel (03:55.62) Poke, poke, poke, is that all you do? Dave (04:01.518) Oh dear, that flashback to early Facebook days. Daniel (04:03.716) Deep cuts, deep cuts to the beginning of the computer age. Back when the computer gold was still alive. Dave (04:09.838) I... Dave (04:14.606) actually been waiting for a review, Daniel? You've met, yeah. So I've spoken on the last many shows about the refactor I've been doing on Govj and sort of gutting it out. So just a very quick version of what I've been up to. I took my app that I originally pulled together two and a half, nearly three years ago. Daniel (04:17.635) No way. Do tell. Daniel (04:28.516) Mm-hmm. Dave (04:40.718) with a design pattern for SwiftUI that I'd come up with, this router design pattern, which was recently involved. Had a lot of stuff for dependency injection, setting up your view models, this, that, and the other. And I gutted it. I made it more classic SwiftUI views. And that's been good, but part of the reason for doing that was to use all of these Swift packages that I've been building over the last six months before. That's sort of, that's where the Lego blocks, the Lego blocks for building my apps. And with that, I've got like a new settings menu, a package for doing my little more apps tray at the bottom that shows like other apps that I've made. All of these things that I've sort of made these packages to go do. Daniel (05:11.94) the Lego apps. Mm-hmm. Dave (05:31.662) the biggest of which being was the rebuild of the video engine that's in the middle of my app that enables the user to do the A to B video mixing. And I got it into test flight, literally like yesterday, earlier on this week. Daniel (05:49.636) Right, I got an email from your mailing list, I think. Dave (05:52.91) Yes, yes indeed. So that's the other thing along the way with all of this. I've been like we spoke last time about me braving sending out an email to my mailing list. I've got 260 odd people on there these days and these are people who've opted in to hear more about the app that I make. I've tried to get a little bit more talkative. And so once I put it to test flight, I sent an email out, told everybody it was there, gave, I actually created another test flight link specifically for the mailing list. Put that in the email. Whole bunch of people have signed up to test flight it. I haven't had much feedback yet, but I've had a load of people bite and start playing with it. Yeah, so that feels really good. Daniel (06:43.428) Ha! Fantastic! Dave (06:50.126) it's been a bit of a bit of a saga and now it's sort of coming out the other side. So yeah the app functionally looks very very similar to where it did before, which was you know the goal. This was an internal refactor more than anything else, but now I'm in a really really good place. So with that that node library that I made for video pipelines and nodes, yes! thumb up there on the video for people listening in, Daniel just triggered the effect on his camera. But yeah, I'm now at the stage where I'm actually bug fixing, obviously after a big refactor, there's things that may have fallen off. There's a few small things somebody was telling me earlier on actually. So shout out to Leon, if you're listening to this. Daniel (07:26.116) Hehehehe Dave (07:47.822) very appreciated feedback. But yeah, I've added camera support, which the app didn't have, but the node library had, and that's been a relatively quick addition. So I've still got a few things to finesse within it, but there'll be small bug fixes and tweaks in terms of how the camera sort of feed operates. At the moment, if you move the fun, it will switch and auto-rotate between landscape or... portrait, which if you're doing a landscape video mix you really don't want that to happen. You kind of want it to stay locked and to just move with the phone itself. So there'll be a few things there. But this is everything coming together Daniel. This is what I've been working for for the last however long on this. Daniel (08:36.931) Haha! Congratulations my friend! The yak has been saved! Overheat the yak has been saved! Dave (08:44.686) Yes, yes, don't say that though, that means you have to start again. Daniel (08:50.084) No, like, first of all, you've got to brush away all the hair that's on the floor and everything, you know, clean up your working area. Dave (08:56.43) Indeed, yeah, so that's what I'm up to at the moment, is I'm brushing the bits of hair back up and responsibly disposing of it. Writing git commits, when I commit my code back up to my repos, that have much fewer swear words in them these days as well. So. Daniel (09:17.54) Ah, that's always a good sign. Once the square word are coming out of the Git commit messages, that's when you are golden. Question for you, by the way. How do you organize your building blocks? Are those Swift packages? Or are they? OK, they're Swift packages. So next question is, how do you work with them? Because something that I have sometimes in Card.100 is when I work with them. Dave (09:28.174) Mm-hmm. Dave (09:35.51) Oh, yes, yes they are. Daniel (09:46.98) with lots of Swift packages, then I want to change something. And I can't because it's in the package instead of my local code. And you can't just go into the package and change it, which is, I think, something I would like to be able to do. So how do you do that? Do you have specialized checkouts where you replace the package with a local copy? Or how do you do that? Dave (09:51.214) Mm-hmm. Dave (10:08.59) Yeah, good question, really good question. So if I talk over the, okay, let's see if I can verbalize it properly for audio. But okay, so I have a root development directory, which is literally just in my home folder. It's a directory called developer with a capital D. Daniel (10:10.564) Hahaha Daniel (10:24.644) Mm-hmm. Daniel (10:29.828) That is, by the way, that is the exact correct name. You should name the folder where all your Git repositories live, because then Mac OS will actually give you a little hammer icon for the directory, which is very satisfying. Dave (10:38.83) That's right. Dave (10:42.558) And I have it dragged into the sidebar in Finder as well. So it's always there. And yeah, beautiful. So there's my developer directory. You can imagine that the repo for the app is one folder inside of that. I've checked it out and it's in there. And then I'm making hand gestures. I really need to not for audio. But yeah, and then within that folder, so you've got the app. Daniel (10:45.156) Exactly, same. Daniel (11:01.764) Hehehehehehe Dave (11:08.462) And let's say, you know, I've just added one of the Lego blocks to the app. That's easy because all of the Lego block Swift packages are also other directories of repos checked out in the developer folder. And I add them into the app as local Swift packages. Okay. At the moment, because it's just me and I'm not trying to organize a team around this or anything, all the packages are in their main branch. Daniel (11:24.26) Right. Uh-huh. Dave (11:37.47) So the Swift packages that I'm using is these blocks are only checked out to main. And any changes go straight into main for them. I... Daniel (11:47.684) And you never change the local reference then, like, because I, like, for me, I would, at some point I would like, try to build this on, let's say, GitHub actions or another CI server or anything, and then the local packages don't work anymore. Dave (11:51.415) Yeah. Dave (11:56.995) Mm-hmm. Dave (12:01.874) Yeah, I'm unsure about that to be fair. There's... Daniel (12:05.028) You could probably pull them in as sub Git sub repositories and then have them always locally, but that kind of defeats the purpose. Then you just can't just like have everything in your own. Dave (12:12.678) Yep. I've never, never had a good time with Git sub repositories, to be honest with you. It's always been a fast track to tearing my hair out and then backing out of it. But anyway, yes, everything is local to both, like everything's pulled down locally to compile these packages and brought into the Xcode project as local packages. And then what that means is, is when I'm in my main Xcode project, as I want to change... Daniel (12:18.5) Hahaha Yeah. Daniel (12:36.452) Mm-hmm. Dave (12:42.242) the dependencies in the Swift packages themselves and update those in any way, it just works. Like I can edit files inside of them and that's fine. The only thing that gets a bit weird is if I add a new file to one of the local packages, I have to tell Xcode to update the, like refresh the package cache of that package in. Daniel (13:00.868) Mm-hmm. Dave (13:11.362) the parent app because it doesn't have sight of the new Swift file yet. But otherwise, once it's had sight of that, every edit you make to that Swift file will be picked up by the compiler when you build and run your app. Daniel (13:17.028) Mm-hmm. Yeah. Daniel (13:27.3) Alright, that's pretty cool actually. Dave (13:28.974) Yeah, yeah, so that's the workflow. What it really typically means is that when I've done a whole bunch of work, I will go to my Git management packet app, which is I'm using Sourcetree, and I will look at my list of all my repos, and I will make sure I commit everything up from every one of the Swift packages and my app, because if there's been changes across the board, then it's no good just committing for the app. I've got to commit for the Lego block as well. And I call that out because it's easy to miss. And I have definitely missed it before, come back the next day or whatever, had a bit of a look later on and gone, oh yeah, I thought I committed everything up for that. It's actually between the app and one or two of the packages. Yeah. Daniel (14:12.644) Oh yeah, I have a story about that. Not a story about that, but maybe, yeah, I'm going to tell you later. Remind me about sub repositories or something like that. But like tell me more about Govj3. Dave (14:19.662) Ha ha. Dave (14:23.662) Yep. Dave (14:27.214) Yep. So Govvj 3, as it stands at the moment, it is the original app with a couple of tweaks to the UI. So the speed slider that's in the middle of it I've replaced with something that looks a lot more fancy, Daniel. It's got a gradient, a gradient on it. Yeah. Gradients are definitely cool in this context. Like for listeners who haven't looked at the app at all, because it's like a DJ app. Daniel (14:46.084) Ooh, nice. Gradients are cool now. Dave (15:00.334) for video, the UI itself is very, very much based around just this control interface where you can trigger videos, add effects, everything else. And because of that, there's a lot about it that's not a classical iOS app in terms of its sort of design language and everything else. It's much more inspired by synthesizers, actual DJ and VJ hardware. Daniel (15:08.292) Mm-hmm. Dave (15:26.382) So you've got this whole arrangement that's all about controlling the video with a speed control in the middle and an A-B system for sliding from one channel to the other of the video. And it's fairly colorful, right? It's dark with a neon accent, typically, color. Because again, it's been designed to be used for situationally, a VJ would typically be mixing video in, say, a nightclub or on stage with a band. you don't want a light mode UI that dazzles at that point. You want it to be dark with things highlighted and to not light the user's face up or whatever when it's on because they're on stage. It's typically dark with bright lights around them. The UI needs to just sort of stay out the way and fit. So all that to say, that's the setup and now... What I've got within this because of the Lego blocks is the user can switch their themes around so they can customize that accent color is broadly what the themes are doing. I've chucked a couple of light mode ones in there just because I can. And I'm curious to see if my assumptions meet what other people are using the app for now that they've got the choice I'll be able to track with. Shout out to you Daniel. Telemetry deck analytics. Daniel (16:32.164) Mm-hmm. Dave (16:54.19) Brilliant, we've just triggered lasers on Daniel's camera. Was that lasers? Yeah. So I'll be able to track and see what things are more popular than others, I guess, is what I'll look for. That's not too important, but I am curious. And then, yeah, the other side of this is that now this is all in place. Daniel (16:56.772) I have triggered the lasers accidentally. Yeah. Dave (17:21.614) The video pipeline is a node-based system, which is a package as well to bring all of that in. And already I've seen a bit of the benefits of that. I've got a test app where I can play with nodes and link them together and stuff. And I've now gone and added some of the effects that weren't in there that Govj originally had. So that's good. That means they're now there for me to use in anything else. And... it really is coming together, like adding in the camera feature, for example. I did that last night, the night before I pulled everything and pushed it to test flight and sent out the email and all of that. But last night I was playing around with this camera import that I'd already built a few months back in the back edge. I've got some tweaks I need to do, some bug fixes I've now found in use, but I wasn't learning how to add... camera from first principles anymore or having to go back to any old AV foundation code it was literally just boom I want a camera I've got the camera input node off we go the biggest deal was arranging the UI so that I've now got a a camera bottom in the appropriate place so yeah um the system the system is working Daniel (18:29.956) Hehehe Daniel (18:42.308) Fantastic. Awesome! Congratulations! Dave (18:48.91) Yeah, I mean this is off to the races now. I'll be getting the camera, the camera stuff once I've added a couple of controls for it that I want. I will, you are triggering fireworks for some reason on the video. Yeah, yeah I'll add some stuff for the camera, push another test flight out to folks testing it. There's only one more big feature I want before pulling it together and releasing it. Daniel (19:03.396) Hahaha! Daniel (19:18.468) Which is... Dave (19:18.702) with network display interface support, NDI support. Daniel (19:23.236) Oh yeah, yeah, we talked about this a lot. So displays over there, network. Dave (19:26.318) Yeah, that's right. And NEI seems to be having a bit of its moment in the sun slightly around the edges of the iOS and Apple community at the moment. I don't know if you've seen... Daniel (19:35.012) Yeah? Daniel (19:39.62) Oh, is it the technology that also allows you to view screens on Vision OS? Oh, fantastic. Dave (19:44.43) That's right. Yeah, yeah, yeah. Yes, there's quite a few of these things popping up now where people are using NDI to bring external feeds into Vision OS. So anyway, yeah, that's a whole other side topic, Daniel. I've got some ideas for stuff I wanna do in Vision OS at some point using that technology. Daniel (20:08.74) Oh yeah. I saw, today I saw someone, I'll have to look it up who it was later. I don't know, I see it here. Like just Chaos Tyan or Tian created or ported, I don't know, like created a viewing app for Formula One content for Vision OS. And that's amazing because when I watch Formula One, sometimes I have this app called MultiViewer where you can have like five screens. And like that's perfect because I could like, you can like... Dave (20:21.454) Mm-hmm. Dave (20:29.07) Yes. Daniel (20:38.276) just put all those screens around you. And I was like, oh, now I actually need one. Because so far, I just don't think it's exactly for me. But now I, of course, need one. Dave (20:40.366) Yes. Hehehehehehe Dave (20:49.774) Wow. Wow. So it's going to be the F1 that gets you into the the Vision Pro. Daniel (20:55.78) Yeah, I mean, I need something. But the other day, I thought, oh, I'd probably rather buy a PSVR2 before I'd buy a Vision Pro, because I have a really good monitor and I have enough experience with VR that I know that some of the 3D content doesn't wow me as much because of the way my eyes are. I have slightly less good depth perception than most average humans. Dave (21:05.102) Mm-hmm. Dave (21:10.606) Mm-hmm. Dave (21:19.47) Yes. Daniel (21:25.636) And also it's just like, I don't know, I don't, I can wear a VR headset for an hour, maybe, or two hours. But after that, it just gets annoying. And so I think, and that plus the fact that it's basically a, um, an iPad where I, I, I feel like constrained by the, by the apps app style interaction model. I don't think it's the device for me right now, but a PSVR on the other hand, you can put it on your head and then do racing games, you know, or space games, which is like, nice. Dave (21:40.078) Mm-hmm. Dave (21:46.638) Hmm? Dave (21:51.598) Hehehe Dave (21:55.886) Yes. Yeah. Oh, could you be, could you play, would it make sense to play Kerbal Space Program in VR? It might make sense to go fly them, right? Yeah. Daniel (22:02.66) you'd have to force it into a first-person perspective. And I know there is a mode for the first one, where people are actually doing that for VR. So you can, if you set up that mode, play the first one in first-person mode, and then in VR, so you're always inside the rocket. But of course, everything is way harder. You can't zoom out and plan your whole trajectory through the solar system ahead, because you can't zoom out, right? Or if you do, then... Dave (22:11.662) Yeah. Dave (22:30.67) Yeah. Daniel (22:32.42) It kind of is a bit nauseating, I guess. So tricky. Dave (22:35.758) I'd be terrible in a first person version of Kerbal Space Program to be fair. Daniel (22:39.556) Oh, yeah, it's like it's like 1000 times harder. Like, that's the whole challenge. Basically, if you look out if you look those up on Dave (22:43.79) No, no, I would be a terrible person, Daniel. Give me the option to slap or punch one of the kerbals. I might be tempted to give it a go. Daniel (22:50.468) I'm sorry. Daniel (22:54.756) Yeah, I mean, we should totally do that. Dave (22:57.262) the cute little green guys. We're way into the weeds here on this but... Daniel (23:01.668) I had, oh yeah, I remember I wanted to tell something about sub-modules and Swift packages, that kind of thing. I now realized the thing that has been annoying me about view controllers in, or actually just controllers in Swift Vapor, the thing I used to make my API, which is I very early on decided I want to have a separate repository full of just... Dave (23:10.126) Yep. Daniel (23:30.628) data transfer objects, which is basically structs that define how my server is talking to the outside world. And then I can import them into the now defunct iOS app and also the server. And both are using the exact same format, which is kind of cool. And even though I've stopped working on the iOS app, I've used those same data structures on and on and on. And that's. Dave (23:42.51) Yeah. Daniel (23:55.428) used to work, but it makes things a lot very hard, especially because even if I want to have a new version of a controller, like of an API, you have, of course, a versioned API, then I'd have this dilemma where either I change the structure, but then I change all of the structures, or I don't change the structures, and I'm kind of constrained to... Dave (24:10.222) Yep. Daniel (24:21.348) you know, one. And now I've realized the thing, how I want to do it in the future, which is basically just like have the structs. They are part of the classes that form the view controllers. And so if I make a V3 view controller that has its structs and they'll stay the same. And then later, if I make a V4, I will copy the structs and modify them so that they fit in here. And I think that makes way more sense. And yeah. So I... Dave (24:22.702) Yeah. Dave (24:49.678) Okay. Daniel (24:50.756) So that is one less sub module. Dave (24:53.166) You're gonna kill one. I mean, your road, it sounds like all roads are leading you to some sort of mono repo, ultimately, Daniel. Daniel (25:01.476) No, not really. I actually have various submodules, which are very good as submodules or as Swift packages. Like I have one for the data transfer objects, yes. I have another one for how inside of telemetry deck the query language is defined. Like this is all the query language is all, all also just everything is Swift structs. And so, but of course they have to parse. Dave (25:26.094) Yeah. Daniel (25:28.9) and unparsed to a specific format. So they are compatible with Apache Druid, because I want to keep that compatibility. And so there's a huge amount of tests in that repo, in that Swift package. Just make sure that is the case. And then also, that whole package also deals with compilation, which is, I say I compile these queries, because telemetry query language has a few. Dave (25:35.406) Yeah. Dave (25:44.174) Yep. Daniel (25:57.22) I say a few, but by now it's actually a lot of helper functions of syntactic sugar that Apache Druid doesn't know about, so I have to compile those down into the more verbose Apache Druid syntax. And so those are compiled queries. And so that also happens in that Swift package, which is actually far enough removed from the main... Dave (26:06.99) Okay. Dave (26:11.342) Gotcha. Dave (26:18.542) Yep. Daniel (26:23.812) server code that it makes a lot of sense. It's way quicker to work on it in a separate repository, then push it and then import it into the main API, which has its own tests, but that way, that's actually a really good separation of concerns. So I'm really happy with that. Dave (26:29.358) Yeah. Dave (26:38.382) It probably speeds up your compilation times to maintain some of these separations as well, right? Because then, like, that it gets compiled as the package and sort of cached as that. Yeah. Daniel (26:48.548) Yeah, yeah, you're right. Yeah, speaking of, I'm really hoping that Swift will soon, because I saw a few requests for that. I don't know if they have been accepted in the Swift mailing list. But I really hope that Swift at some point will get the option to release just like pre-built packages where you have a Swift package and it includes the source code, but also a binary for, let's say, arm and I am X64 and that way you will never have to compile this package if you are one of the architectures that it already has been pre-built. And that would be so cool because one of the packages that Swift Vapor is built on a Swift Neo, a Swift NIO, and that just takes on my machine, which is a very powerful M1 Pro, takes like if I do a fresh install, it takes like six or seven minutes. Dave (27:23.086) Yeah. Dave (27:39.758) Mm-hmm. Dave (27:51.086) Yeah. Yep. Daniel (27:51.236) And that is just before it starts on my code. And so, and on my machine, it is fine. I don't have to rebuild from scratch so much, but on the CI, it always builds from scratch because it's a CI system. And so it always, I'm now paying for the biggest machine that GitHub offers and it still takes like 12, 13 minutes or so to compile the telemetry deck API. Dave (28:06.158) Mm-hmm. Yes, it's a... Dave (28:18.638) Wow. Yeah. Daniel (28:19.332) which is kind of frustrating. It's not really world shattering, but I think I would really love for that to be quicker, because it's just like a lot of wasted computer cycles, wasted electricity for nothing. Dave (28:28.174) Yeah. Dave (28:32.366) I was going to say there's actually an environmental footprint off the back of that, of everybody compiling and recompiling worldwide some of these things as they use them. That's, yeah, yeah. And I could also see there being another side of it, which will be the security side, I guess, in terms of like somebody could put something in the binary that doesn't, that isn't present in the source code, for example. Daniel (28:57.956) I mean, yeah, but you can very easily verify that by actually compiling the binary, the source code and comparing it with the binary. And on the other hand, also someone could just slip something into the source code that is undetected as well. So I don't think that's horribly bad. Dave (29:08.014) Mm-hmm. Dave (29:17.806) No more horribly bad than what we've got, I guess, to some degree. But. Daniel (29:22.052) What's the worst thing that can happen? Hehehehe... Famous last words. Dave (29:25.838) Yeah, no, I'm trying to pick up a train of thought here, Daniel, actually, because as you were talking, I guess I'm wondering, you've just given a description to us of the telemetry deck stack, as you've got it arranged. How does versioning work inside of that stack? If you want to make version two of an existing API, what does that look like? Daniel (29:34.948) Mm-hmm. Daniel (29:49.252) Mm. Daniel (29:54.212) Right, you mean API versioning, right. How it looks like right now is that I've actually recently moved a lot of, like so, okay, so if you are looking at URL paths, how you actually call the APIs, those look like, I don't know, API. slash V1 or V2 or V3, and then slash, let's say, users, and then slash, I don't know, password. Dave (29:56.686) Yeah. Dave (30:24.398) Mm. Daniel (30:24.868) And so there's a versioning string in there and that routes to the various classes. Inside my project, I have a folder of V1, a folder of V2, a folder with V3, and inside there, there's either individual files that say something like V3 users controller, or V3, I don't know, insights controller, or if there's like... Dave (30:29.262) Yes. Dave (30:38.926) Mm-hmm. Dave (30:47.31) Yeah. Daniel (30:51.428) more subcontrollers in there because there's just so much functionality in that part of the tree that it makes sense to split it up into multiple files. There's like subfolders. Previously, those controller classes would then use the data transfer object structures or structs from the shared Swift package. But in v3, I've moved away from that. I'm just defining them as directly inside the classes. Dave (31:11.63) Mm-hmm. Dave (31:19.694) Yeah. Daniel (31:20.452) And then also in my tests, I'm not even accessing those structs, I'm just like writing, sending and expecting JSON strings directly because that's what most APIs would actually do. Yeah, that's basically how that works. Dave (31:28.558) Yeah. Yeah. Wow. OK. It makes a lot of sense as to why you're bringing the data structs into the controllers in that case, because. Daniel (31:43.076) Yeah, and it was very convenient in the beginning when I was working on both the client and the server and Swift to have the same structs. But even then, I did kind of gate the, I had like a V1 version of the structs and the V2 version of the structs, which is actually, I put all of them inside an enum. There was like, they were like dtov1. So you had like dtov1.user and dtov2.user. Dave (32:01.006) Yeah. Dave (32:06.19) Yep. Dave (32:10.254) Yeah. Daniel (32:11.94) But because the controllers don't switch version at once, it kind of takes some time. And sometimes something stays on V2 because there's no need to change it, whereas other things are skipping ahead. It doesn't really make sense to group them together like that. Dave (32:17.838) Mm-hmm. Dave (32:25.742) Yeah. Dave (32:31.39) That's cool, that's really cool and I think you're going the right route there in terms of that. Daniel (32:35.716) Yeah, I think even maybe I would have considered if we would recreate the API today, I would even consider having the versioning at the end of the API. So not at the root, but I would be like, hey, api.telemetry.com slash, let's say slash organizations slash create slash V3 or whatever, and then I could version that specific API. Dave (32:48.718) Yeah. Dave (33:03.438) Mm-hmm. Daniel (33:03.492) But that gives you other problems, which is basically that you have, you're kind of committing to one tree structure and can't change that, which is also kind of bad. There's a whole book about this. It's called Build APIs You Don't Hate. And I will link it in the show notes because the author escapes me. And it's about two meters away from me behind me right now. But I don't want to leave this microphone as long as all the interesting, cool. Dave (33:13.294) That's right. Yeah. Ha! Dave (33:21.87) Yes. Dave (33:29.262) That's fair. Daniel (33:32.1) New Zealandish people are here and all the fantastic listeners as well. Hi listeners, you're fantastic. Dave (33:34.478) Yes. Kia ora. Daniel (33:40.26) I want to tell you what I did today because I'm kind of proud of myself. Because I am so Tenement Really is hosted on Microsoft Azure right now and we are part of the Microsoft Azure Startup Program, which is really, really cool. You get $100,000 US dollars worth of Azure credits or up to like it's kind of in stages. We're at the highest stage and you can just like. Dave (33:45.166) Go for it. Dave (34:02.638) Yeah. Daniel (34:06.276) splurge on Microsoft Azure services. And they're kind of hoping that you're after your year of free stuff runs out, that you're staying. So the year of free stuff is running out and I'm not staying. I am partially staying. So I think they have been really nice to us, but the thing is that one of the things in Tenementry Dex server stack are the so-called historical nodes. I don't want to go into detail right now because it's a whole other show, but we can talk about the architecture at some other time. But these are the servers that are the big and beefy ones that when you run a query, actually search through all the data in real time. And there's caching in there and there's the distribution and horizontal scaling. So for example, if I have like four of those, then all the data will be distributed between them. So all four of them can maybe... Dave (34:40.558) Mm-hmm. Daniel (35:05.412) work on one fourth of the query that you're actually building. And then it will be merged together at the end. But these are big computers. So let's say they have 64 cores and 256 gigs of RAM. And they actually need a lot of disk storage. So they'd have between 400 and 800 gigabytes of storage. And that needs to be fast storage as well, because all the data on disk is too much for the RAM. So it needs to be fast. Dave (35:29.39) Mm-hmm. Daniel (35:34.692) kind of fast. These machines are really expensive on Microsoft Azure. You can conceivably make them a bit cheaper if you pre-provision them, which is like basically you tell Microsoft, yes, I'm gonna buy this for a whole year and then still pay monthly, but then it's a bit cheaper. But I have still been like experimenting with one of our newest Dave (35:48.398) Mm-hmm. Daniel (36:04.132) I want to say hires, but we're not actually paying him anything right now. So he's more of a buddy who's helping me out. And he's getting telemetry merchandise. So with this friend of mine, I have to ask him if he wants to be named. But so far with this friend of mine, we've been experimenting with various things on how to move this server. So we have talked to various other hosting platforms. Some of them. are local computing centers that just like in the area that just offer like colocation or other versions of types of hosting. I have looked at Amazon AWS, which is completely impossible now because they used to have a similar program to Microsoft Azure, but now you can only get into that program. I guess it was very successful and everybody just like thought, oh, let's get some free credits. So now to get into the program, you need to be part of a Dave (36:57.294) Yeah. Daniel (37:01.988) venture capital accelerator or a startup accelerator that is actually part of a venture capital company. And you have to kind of prove that because they give you some kind of code and then you enter that code and then you're like, and also there's various tiers. And so I asked around and got a code from a friend of a friend and that code was only good for 5,000 bucks, which is decent money, but it does make a lot of sense to then move all the infrastructure over to. Dave (37:06.062) Okay. Dave (37:17.87) All right. Daniel (37:31.812) And so I actually talked or actually looked at a local company or a German company called Hetzner, which is where apparently all of Macedon is hosted. Or at least two thirds of all Macedon instance servers are hosted by this company because they are very cheap. What you pay, you get bare metal servers there. Dave (37:32.942) Yeah. Dave (37:41.646) Yes. Dave (37:46.03) Yes Dave (37:53.102) Right. Daniel (37:57.028) Most of the servers that they offer aren't even server-grade hardware. It's consumer-grade hardware, but you get one of the machines that I just described. You can get them for $160 or so per month, which is really, really cheap. But they're not, they're like, or at least they're said to be not as reliable. I think I have kind of experienced more downtime with them before we moved to Azure. Dave (38:03.31) Yes. Dave (38:08.782) right. Yes. Daniel (38:26.884) kind of tunnel using an app called WireGuard between this server and the rest of the cluster and then have some of the historical nodes live in another holster. And if those kind of go down, then there's still enough historical nodes with the main cluster that things will still work, but they're kind of slow. And so I've been talking to Microsoft today. I've been talking to this buddy. I've been talking to Amazon today. And also I talked to OVH today, which is a French holster. and they might actually offer us another 100k. So we're going to ask them very nicely. It is nothing, nothing is really done yet here, but that would be really, really great. Otherwise we're going to move a few of the servers to Hetzner, I think, and still leave the rest at Microsoft Azure. And I have not written more than three lines of code today because I've been CTOing. Dave (39:16.046) Wow. Dave (39:21.294) Yes, yes, that's definitely the CTO hat that you've been wearing today. Not an actual hat, but maybe we need to get you a few, Daniel, and you can pop them on so people on the YouTube can see which hat you're wearing today. Daniel (39:24.484) Yeah. Daniel (39:32.58) Hahaha Daniel (39:37.636) I'd like that. I'm not a hat wearing person normally, but like, so if I had a hat that said CTO, I would totally wear it. Dave (39:45.422) Oh brilliant. I love that Daniel. Everything you've just described there is the payoff of all of the hard work you put in last year or the other year making this work in terms of clusters and distributed nodes and that side of stuff right. That's the payoff is now it's you know relatively I kind of want to say it's platform agnostic. There's probably some technicality in there that Daniel (40:06.916) Yeah. Dave (40:14.99) disproves that point but as you were just describing you can have tunnels between different providers right and that gives you the a bit of flexibility. Daniel (40:21.796) Yeah, that is actually the thing. I want to stay with Microsoft Azure for everything that is not ephemeral. What does ephemeral mean? Files on disks or entries in a database because on Microsoft Azure, and of course with other hostiles as well, but right now on Azure, we have various Postgres databases that are managed databases, which means there's no actual server that you are responsible for. It's just like you click on the make a database thing and then a database appears. with you can log in and it's just there and it will never go down. And if it grows too much, it will automatically like have more space or more CPUs or whatever. And that is, and it is just like back up to the bajillions. And so that is really, really good. And the same thing is for files. We have a lot of files because all the signal data is files at the end of the day, files plus database entries that point to the files, but yeah. And so these are really Dave (41:00.27) Yeah. Dave (41:04.27) Yep. Dave (41:13.774) Yep. Daniel (41:21.348) really worth a lot because if those are gone, like I can just close the company down tomorrow, right? So those are backed up in various places, but I'm very happy that they are in Azure Blob Storage where they feel reasonably safe. Dave (41:27.022) Yep. Dave (41:34.67) That makes sense. And also, if you were to not do that and do something else, you're then taking on the job of all of those things you've just described, potentially. Daniel (41:48.388) Yes, that's the other thing. Like I would, if I move this something else that doesn't support this, I suddenly have another hat which is administrator for a file server and administrator for various database servers, which is I'm very happy to not have to wear these hats. And yeah. Dave (42:03.79) Yeah, that's three different hats at least I think you've got like yeah DBA hats, you've got some sort of DevOps type hats, some sort of SRE type hat to wear on that like that's a lot. Yeah. Daniel (42:14.596) Right. And the more parts of, especially this admin stuff, I can give to someone else, like this buddy of mine will probably earn the complete hat of the, I don't know, SRE system for telemetry deck, which I would be so glad to give someone else that hat. And yeah, I think this year is kind of the year where I distribute my hats more. That's my... Dave (42:29.742) Mm-hmm. Dave (42:35.246) Yes. Dave (42:42.862) You mentioned you were giving them some merchandise. If there's not a hat included in that after this discussion, Daniel, I'm disappointed. I think you literally need some telemetry deck hats. Daniel (42:44.228) my theme for the year. Daniel (42:49.284) Ha ha ha ha! Dave (42:58.894) Hehehe Daniel (43:00.324) We've actually recently decided on the next type of merch that we're going to make slash order. And I'm not going to tell you what it is yet, at least on the air, but I am very much looking forward to it. But it's not hats. Dave (43:14.19) Well, okay, it's not hats. Daniel (43:17.412) but maybe the next time. Dave (43:21.422) I'd love that, I'd love that. And I'm actually really curious to find out what it is. Daniel (43:25.028) I mean, one of the various platforms that we order merchandise for that already have our logo, will probably have a hat where it's just like, just kind of slap the logo on a hat. But that feels kind of like cheating, you know? Like I, like merch kind of has to be a bit original. If it's just a thing with the logo on, I don't know. Like, ah, I don't know. Dave (43:32.206) Yeah. Dave (43:36.686) I don't know. I don't know. Dave (43:41.998) You've got to put your marketing hat on Daniel. Daniel (43:46.436) I saw a tooth the other day and that gave me the idea for a t-shirt that I want to print. And this is very, very good content because here it is. Okay, I need to look at, okay, so imagine a t-shirt and there's just a text on it, which is privacy, security, anonymity, but in the form of liberty, egalité, fraternité, the three. Dave (44:08.334) Hehehe Dave (44:21.678) Okay. Daniel (44:28.74) like, I don't know, calls of war of the French Revolution basically. And I don't know, if I can put that into a nice font, it feels kind of nice. Also, privacy is not a real word, which makes it more funny. Like the other two are actually real words, but privacy is actually a different word, but I kind of like it this way. Dave (44:35.598) Yes. Oh, that's fantastic. Dave (44:44.334) Okay. Yeah. Dave (44:57.646) Well, I think you need to link that for people so they can go and have a look. Daniel (45:00.772) Yeah, I'm going to link the tweet, the tweet actually, because the original is by Sarah Joy, hey Sarah Joy, on the Macedon's. So I'm going to link to that. And I asked her, I asked her if I can actually modify that and put it on a T-shirt and she said yes, but if you do, then you might have to send me one, which I will do. Dave (45:06.83) and Dave (45:11.79) definitely linked there. Dave (45:20.59) That sounds fair. Oh, Daniel, it has been lovely catching up with you, but as always I've got to go and start my day now. It's first thing in the morning here in New Zealand. Daniel (45:33.092) First thing in the morning, coffee, then Daniel, then breakfast. It's nice. Dave (45:37.422) coffee breakfast, Daniel, than often to work is today. But yeah, even better, even better. I'm well fed, I'm well caffeinated, and now I've had my weekly fix of talking to you, Daniel. Daniel (45:41.796) All right, even better. Daniel (45:49.988) I like that. We moved our recording one day back, and I think that's really good. That works for me actually a bit better because Monday and Tuesday are very full days for me, and Wednesday is slightly less. So Wednesday recording day is very nice. Dave (46:02.958) Yeah, I'll get the show out. We'll keep our schedule. Keep the streak. That's the idea. Week by week. But yeah. Daniel (46:07.46) Right, right, awesome. I'm very much looking forward to next week, but you, the listener, thank you so much for listening. Please rate us on iTunes, rate us on the YouTubes, now that we're there. Send us emails at contact at WaitingForReview, and Dave, where can people find you on the internet? Dave (46:23.502) Yes. Dave (46:29.902) You can find me on Mastodon over at Dave at soci and you can find all about my apps over on lightbeamapps.com. How about yourself Daniel? Daniel (46:42.692) Yeah, please go to telemetrydeck.com if you want to know more about telemetrydeck, my analytics solution. And also please annoy me with weird jokes and puns at daniel at soci Right Dave, have a great day. See you next week. Dave (46:59.854) Catch you later, Daniel. Daniel (47:01.22) Byeeee!