Daniel (singing): "The Superhero Maker Show, let's go! Dave: "Let's go!" Daniel (singing): "Empower your mind, let it grow! Learn from the best, take action today! Become the hero, make your wa-aaay!" Dave: (laughs) Daniel: "Welcome to the Superhero Maker Show with Dave and Daniel. Nice to have you on board. We're going to make a superhero out of you today." Dave: "We are indeed. It's time to rise up, take control, unlock the power within your soul." Daniel: "Leave doubt and fear in the past. You're a superhero. Let's make it last." Dave: "Oh, dear, Daniel, we're going to have. We. Oh, yes, yes, indeed. And we're going to have to explain ourselves here. We really are." Daniel: "Yes, we used to do a developer podcast, but it turns out that the market for superhero -" Dave: "We did? Daniel: "- content and being a superhero influencer is way bigger, so we're pivoting, and developers are factually superheroes anyway. So this is the Tiny Superhero Show." Dave: "Indeed, indeed, and I'm going to explain this, I'm going to shoot straight for explaining this, Daniel, because -" Daniel: "Please, please." Dave: "- yeah... So a few days ago, I had a conversation with chat GPT. OK, like a lot of people have been doing over the last few weeks. And I asked GPT about myself. And, first off, he sort of said (oh, I say he I'm giving it personhood already, but there we go)... First off, I said, who is David Gary Wood?" And very rudely, GPT said that I wasn't well known or notable. So I don't know. And I thought, well, OK, let's give it some information. So I said, oh, yeah, he has a website at David Gary Wood dot com. And chat GPT then went full on making shit up kind of mode" Daniel: "Yeah" Dave: " So I posted about this to Mastodon, but it said essentially that I was a personal development coach, speaker and author. That I had a book called Get Re-inspired, Embrace Your Inner Superhero." Daniel: (laughs) Dave: "Which apparently aims to help readers discover and embrace their unique strengths and capabilities." Daniel: "It's fantastic, you should write that book." Dave: "And I'm thinking about it, honestly, because it just it went on like that. I kept asking it more questions and tell me more about this book. And it actually laid out the sort of general plan of the book. It's in three parts. I begin by explaining the concept of having an inner superhero and how readers can identify their unique strengths and abilities. Apparently, then I offer practical advice on how readers can overcome obstacles and achieve their goals. And then in the last part, apparently it's a rousing call to action to encourage people to live their superhero lives." Daniel: "Fantastic." Dave: "As I said, it went on like this. And the reason for the song is that apparently I have a podcast that is the superhero maker show. And I asked it to come up with a theme tune and that was it. So this episode brought to you by ChatGPT's brain farts, I guess you want to call it anything else." Daniel: "Fantastic. I love it. The thing is, I'm actually getting a bit tired of like everyone just posting to social media about like, hey, I asked chatGPT this and I asked chatGPT that, but getting like this whole alter ego for yourself and then also getting the podcast and everything is like, if you squint enough, you see there's a connection to you because you do have a podcast and you do coach people and you are a semi-notable public figure. It's just all the details are wrong." Dave: "No. Yes. Yeah, I think I need to do a bit of searching. Actually, I'm wondering if it's just completely grabbed somebody else and grafted this on in some way. Like, yeah, probably not the lyrics for the podcast and everything, but I think the book plan, maybe? but I don't know. In any case, it almost left me sort of feeling like I should be registering a new domain, putting some stuff up. Maybe I can pivot." Daniel: "You should definitely register a new domain, always, always register that new domain." Dave: "Yes, and then pay for it for a few years before you decide that you're really definitely not doing that thing." Daniel: "Right, right. And if you decide to register that domain, you should go with this podcast sponsor, which is, no, wait, we don't have a sponsor yet, but here, Hover, I want my name. Come on, like give us some, give us some sponsorship money. I have so many domains registered and recently I let a few expire, which was actually a good exercise. Thank you Marie Kondo." Dave: "Mm hmm." Daniel: "But, recently one of them had actually a, like it was a good thing that I acquired it. So about a year ago, maybe one and a half years ago, I registered telemetrydoc.com and all the other vowels basically. And I did that because I am actually, or TelemetryDeck is actually sponsoring a podcast, which is a Formula One podcast and I just like it personally and it's like 50 bucks a month, so I'm just sponsoring them so that they have to read out telemetrydeck.com every episode, even though like they're about Formula One." Dave: "Mm hmm." Daniel: "And I kind of started messing with them because it's, the sponsorship is via Patreon and so they always read out your display name. So I had the display name as telemetrydoc.com, but then I started like swapping it out with" Dave: "Mm hmm." Daniel: "telemetrydoc.com, telemetrydack.com, telemetryduck.com and so on." Dave: "Mm hmm. There's one you're avoiding, Daniel, but keep going." Daniel: "Yeah I have analytics for all of these and I was always only mentioning four of them and like seeing who arrives at the fifth. But so recently someone, someone like also like more a bit notable, Anthony Johnston of The Incomparable fame, he's also a writer and script writer for various comics and films. I think he wrote the script for Atomic Blonde or at least the comic it's based on." Dave: "Okay," Daniel: "Anyway, Anthony Johnston, I like the guy, he doesn't know who I am, but he discovered TelemetryDeck on Mastodon, I think. And so he posted a post showing the notification that I had liked one of his posts with the TelemetryDeck account. And he said, ooh, I almost read TelemetryDuck. How funny is that?" Dave: "Mm hmm." Daniel: "And then I answered from the Telemetry Deck account, good thing we actually registered telemetryduck.com." Dave: (laughs) Daniel: "And he reposted that one and on Twitter and on Mastodon and yeah, that domain got a lot of hits. It got enough hits that I actually made a separate landing page for telemetryduck.com, which is something that I had wanted to do for ages. And in my mind, it's actually a bit different because in my mind, there's a rubber duck, but it's textured like a space shuttle." Dave: "Mm hmm." Daniel: "So it has the dark underbelly of heat-resistant tiles and then the white spacecraft body atop. But I didn't have the time to do that, so I just made a rubber duck basically." Dave: "I've just loaded it up now. And yeah, I love it. You've got a duck in the image there at the header and a duck emoji in the title." Daniel: "And then when I posted that, lots of people tweeted or posted at me with poultry jokes and puns. So yeah, I just shamelessly put a few of those in the text of the page." Dave: "That's great. That's really great. And proving the point of you setting up separate landing pages as well. "I think that's a really fun thing to do with all of that." Daniel: "It is, yeah. So the others don't have separate landing pages yet. Dave: "No, no. And the one we've avoided probably shouldn't have a dedicated landing page for it." Daniel: But they do send, like each time you load one of them, they do send like an individual signal signal so I can see like how many people are visiting each domain. Because you know, that's like interesting to me." Dave: "I mean, it's not as if you've made an entire company around that sort of thing." Daniel: "It is, yeah. How are you doing other than chatGPT?" Dave: Other than chatGPT? I'm doing OK. I am doing OK. I've been tooting since we last spoke. I've been working on my TootSDK based app. So the SDK is now public, as we spoke about on the last show. This is an SDK for Mastodon and for the Fediverse and for connecting to all of these different servers and everything. And I've started building my my app on top of it, which means that I'm now officially dog-fooding my own SDK. So that's that's been a lot of fun. It has already resulted in a couple of tweaks and changes to the SDK as well. Now that I'm kind of getting that proper feedback loop, because I mean, bear in mind, when we started developing the SDK, what we did do is build a Swift UI test app that tests a whole bunch of the functions and things. So it's not as if we've been developing without doing this and testing this along the way. But there's a difference between that mode and then sitting a real app on top of it and going that way. So that's been kind of cool with nothing majorly wrong in the SDK. In fact, actually, it's been great for the sort of speed it's given me." Dave: "This was the plan. This was the plan with the SDK, is that I started a new project. I added it through Swift Package Manager and did what I needed to do to set it up in the pattern that I'm using for SwiftUI development. And, you know, very quickly, I'm then thinking more about the UI than having to worry about getting data and doing all of that. Daniel: "Yeah, that's really cool." Dave: "So, yeah, yeah. A lot of fun. I'm really sort of proving the point. But, the thing that I think is perhaps more interesting for this show is one of the parts of TootSDK is that we wanted to support both Mastodon, Pleroma, PixelFed, all these different Fediverse API types. And I've got an account with a PixelFed server. I've got I've got a Pleroma one on something and I've got one on obviously my own personal Mastodon. And I built the app as I was logging into my own personal account when I was testing it, and it's like, yeah, stuff's starting to come together, and I thought, yeah, let's just try and sign out, sign back in and sign into my PixelFed account instead. And it just worked. And that, for me, was like a real big sort of proving proof of the pudding kind of thing with the SDK." Daniel: "Wait, so you'd never really tested it, and it just worked?" Dave: "Oh, no, we tested it along the way. I knew it would." Daniel: "Uh-huh." Dave: "But just that ease of going right. I've got this app. I've got this sign in, sign out mechanism. And it doesn't matter which one I'm trying to sign into, it's still just doing its thing." Daniel: "Oh, yeah, I get that. Yeah, that's fantastic. That's really cool. I have to tell you about a misconception that I had, and that maybe some of the listeners also have" Dave: "Go on." Daniel: "which is, in my mind, TootSDK was about speaking the ActivityPub protocol and then following someone or favoriting or displaying a post or something like that. That was all in my mind using the ActivityPub protocol, so of course, it would support Mastodon and Pleroma and PixelFed and so on. But this is not the case. Like TootSDK is connecting to the Mastodon REST API, or it's connecting to a Pleroma server's REST API, or it's connecting to a PixelFed server's REST API, which are slightly different because they're trying to do different things. And ActivityPub is the format that these servers use to talk to different instances and stuff. So they can talk to each other, but this is not the thing that you'd use to connect to an API to display posts or to favourite them or whatever." Dave: "That's right. Yep, exactly. And I mean, conceptually, perhaps you could do something in terms of building an SDK on top of the ActivityPub protocol. But it's not really the way you'd want to go about it. And because it's more for the service of server communication, it doesn't make a lot of sense in an iOS app." Daniel: "You'd need probably, as far as I understand the protocol, and you could probably talk more about this because you're deeper in that protocol than I am, but as far as I understand it, it's a bit like IRC where all participants have to be online all the time or they would actually lose part of the, or maybe not lose because you can always ask for several date ranges or whatever. But it's a bit like you, it's made for participants who are always online and who have a certain amount of database storage of connectivity and of reachability and stuff like that. So like a server, it's not a protocol for like client apps." Dave: "No, it's not. It's not. And that's the other thing is like you'd run into problems with DNS and all that sort of stuff as well, right? Because again, it's assumed that there is an instance that is online of something that can send and receive these messages. And you talk to it via the domain name that you've got set up as well. So, yeah, you're right. It's a bit of confusion. Maybe somebody has about the SDK. Having said that, if you go to the repo for it, you will see that we have got a image in the readme that kind of explains the layers and the layer cake of all of it." Daniel: "Oh, yeah, I'm looking at it now. It's a diagram of various layers. Like the top layer is app. That's like the app you build on top of TootSDK. And underneath that is a square that says TootSDK in a very pleasing purple color, indigo almost, and that has lines towards boxes that say Mastodon, Pleroma, PixelFed, and WriteFreely, and those lines are labeled REST API. And then the four server boxes, they have lines connecting themselves to an ActivityPub cloud, basically. It's not a cloud in this picture, but in my mind, it's a cloud." Dave: "So, yeah, that diagram shows you the sort of visually what we've been trying to describe. But, yeah, it's, I think it's cool, though. This is the space that the client apps need to operate in is with these REST APIs. But the variety of them as an app developer, like being on the client app end at the top of that diagram, as it were. I don't want to ` I don't want a load of if statements and switches and things to sort of care about, well, OK, it's Pleroma, so therefore, I need to authorise in this specific way or that's PixelFed. So there's a few more credentials there. Right. This is one of the variations that's under the hood in the SDK. And then there are things like there's certain bits of the data model that might be optional because they don't exist on all of them. You know, things like that. So there are similarities. The reason I mentioned Mastodon, Pleroma, PixelFed is because there's a lot of crossover in their APIs. So once you've sort of cracked the authorisation and you've figured out what needs to be optional, some of the calls are then optional, so there are requests for certain things or the ability to post certain bits of data back that will only work with certain instances, and we're kind of navigating that. You'll get an appropriate error message if you try and use it on an instance that doesn't have it is sort of where we're going." Dave:" But yeah, I feel like every Mastodon app that I have seen either kinda supports it, in a sense of like you can sign in and it will basically work with one that's not Mastodon. OR, not at all. So yeah, there's quite a few apps that if you try and log into PixelFed, they just don't really work. For example. They don't make it past the authorisation stage." Daniel: "Oh, yeah, and this is another misconception that I had. From people writing, I thought that PixelFed, which is basically Instagram for the Fediverse, I thought it's like so similar to Mastodon that I could basically log in using Mastodon. And it's just a way of displaying the tools differently, like only showing posts with images and showing those in a large way or something like that. But this is also not the case. PixelFed is its own server, and it's its own social platform. You can follow someone using ActivityPub, using Mastodon. So if you have a PixelFed account, I can, in theory, follow your PixelFed account on my Mastodon and see your posts as posts in my timeline, which is kind of cool. But that doesn't mean I can log in and that I can post to PixelFed using Mastodon." Dave: "That's right. Or using it using a Mastodon client. Daniel: "This is so interesting to all the listeners." Dave:" "Well, this is the thing, right, is that from my perspective with the app I'm building and the app I'm building is a photo feed videos and that sort of thing app is not quite Instagram or PixelFed in what it's trying to do. But it is very focused around browsing media. And from my perspective, I didn't want to care about all of this. I didn't want to make an app that only worked with PixelFed for this. That seemed limiting. And equally making an app like this just for Mastodon ends up being a bit weird because it's like, oh, but people are posting mainly photos and media to their PixelFed account. So why don't you support that? And so, yeah, with the SDK, it's a case where it doesn't matter where your account is. You can still just sign in, use the app and it will give you your feed in my apps format. Right? But it doesn't care where it's consuming it from. So if that feeds coming to you from from any of these other instances, that's that's fine. And you still get to see your photos and media." Daniel: "So this is your app that you're building on top of to SDK." Dave: "Yes, yes. And, it's coming together, I think I'm months away from releasing a beta, but it's certainly already proving usable for me to browse my own feed in this way." Daniel: "Oh, wow, that's really cool. Let me know if you need beta testers, because I've also been thinking, yeah, this would be really nice. You know, when I just want to browse the images, the selfies, the cool, like every weekend people are posting their activities where they go hiking or whatever and photograph pretty landscapes. So just scrolling through those would be really cool." Dave: "And this is the thing I've been looking at, looking at the experience I've been having with my regular Mastodon clients, you know, I'm using Ivory like everybody else seems to be in a lot of ways in our community." Daniel: "It is so good!" Dave: "It is." Daniel: "It feels like coming home! Like, of course, everyone has a different way of interacting with social media. But for me personally, IceCubes is very cool, Toot - Exclamation-Mark is really, really cool. But Ivory on the desktop and on the phone, there's so many ingrained muscle memory of how to use this app and how smooth it is and everything. Because lots of the basics have been worked on for 10 years or so. So, ah, it feels so good. It feels really, really good. I'm sorry, I was kind of enthusiastic there." Dave: "No, it's cool. I feel the same about Ivory in a lot of ways. I would like it to support alt text properly because at the moment it kind of doesn't. Daniel: "Yeah, I get that. Dave: "You can post post with alt text, but it doesn't display it very well. It doesn't display at all rather. So that's something I think they desperately need. And then the other thing I would really love them to have is I don't think they're supporting custom emojis." Daniel: "Yeah, they don't." Dave: "Which is a thing. Yeah." Daniel: "Which, most of these things I am missing, but I do realise that they're in beta or not, but they're not in beta, they're kind of in early access." Dave: "Yes. Yeah." Daniel: "And I'm fine with it, like, because I kind of expect them to be, like, chugging along and, like, just picking all those slow hanging fruits bit by bit. It's basically just two or three people, so of course they're going to take their time." Dave: "It is indeed I think the alt text is the only one that I feel quite. Ah, come on guys, you should have this already, about" Daniel: "Yeah, I get that. Although I do commend them that they have a way of entering alt text, because it's important for me to post alt text for the images that I post. And so I can do that, but I seldomly read the alt text for other people's images, because usually I can recognise them very well, and usually I can visually see the point of the image. So usually alt text is not something that I need in my daily life. So I'm not missing it terribly, but I think it's really nice that they have the ability to create it." Dave: "Yeah For sure. For sure. And that's something I've appreciated that that that bit at least is there right now, I think for me, I'm not blind or impaired in that way so I'm not relying on it in terms of seeing the image, but, it does help me a lot with context, if context is ever sort of unclear. And I think just to explain what I mean, like if somebody posts a meme or something and it's perhaps from something that is a reference I just have never watched the show or is a political thing in a part of the world that I'm not aware of, like sometimes the alt text illuminates that for me and I enjoy that. Yeah." Daniel: "Oh, yeah, totally. I also, like, sometimes, not very often, but sometimes I do hide little jokes in there or explain the joke that I'm making with the image. Because I've had a few times or instances where I thought I was posting a really well-known meme, and it's very recognisable as tongue in cheek and ironic and whatever. And a lot of times, still, I get people in my mentions, and this is a very mastodon thing, apparently, that explain my own joke back to me or react as if I had been completely honest. So just mentioning the fact that this is satire, that this is ironic, and the way I meant it in the image description is a good way to mitigate that." Dave: "Absolutely. Yeah. And that's the thing is that the inclusivity of alt text is bigger than just people who need it because of their site. Yeah." Daniel: "Yeah, totally." Dave: "So anyway, I'm sure they will support it before we're sort of out of this like early preview phase, but I'm sure they will support it before we're sort of out of this like early preview phase, it certainly seems to be. There's something they've said when I've added them about this that is on their roadmap and they'll be looking at. So yeah, I'm pretty sure in a few months time or whenever this won't be a gripe anymore and will be something it just does." Daniel: "Oh, yeah, I'm pretty sure." Dave: "The other thing here is that I need to take my own advice. So it's something I've got to incorporate into my own app pretty early on, I think, as well. So yeah, I'll be joining the Fediverse client app community, as it were, by making this more than I have done with just having to TootSDK there. And so all these intricacies and things are things I'm going to have to sort of figure, what do they mean within my own app? Yes, it's a photo browsing app. I won't be able to ignore alt text, that's something I'm going to definitely include. But I'm also going to be going full out with all of the other accessibility concerns on iOS like voiceover, dynamic text, that side of things as well, even though it is all about the images and the video. I want to make sure the app is a considerate participant within all of this." Daniel: "Yeah, that sounds very good. And I mean, it is harder than, like, a harder problem than it looks UI-wise, because you want the alt text to be very prominent, you want it to be easily reachable, but at the same time, you don't want it covering the image, and you want the image to be, like, as big as possible so people can easily see it. And also for some people like me, for example, I would like to see the alt text, but only after I've seen the image, because it might spoil the joke or ruin the joke or whatever." Dave: "Yeah, yeah, exactly. So there's a lot of things to consider there. I mean, I really like the way that Metatext, one of the other open source clients, which is, I think Metatext is kind of dead at the moment. There's no new updates coming through for it. I think the maintainer has moved on." Daniel: "Mm hmm." Dave: "But also, I think somebody else may well be picking it up. But anyway, the way it does it is great. So if you tap on the image, it brings the image up in its own view. And then you've got the alt text over the image, like, well, to the bottom. And in most cases, it doesn't cover the image, it's just at the bottom. And I quite like that. Because when you tap on an image, you're sort of indicating I want to know more. You know, whether you want to zoom into it or whatever it is, right, because that's what you get from doing it goes full screen, you get to zoom into it, the alt text is then there. I think that interaction makes a lot of sense. Whereas, when you've got to press like the alt button, to then have something pop up and tell you what the alt text is, that sort of feels, feels very clunky to me." Daniel: "Yeah I get that, and I agree." Dave: "These are the things we've got to think about with these sort of apps. And yeah, like I say, I'm going to be figuring out a whole bunch of this sort of stuff for my own app. And just figuring out the UI for everything, for everybody else as well, for all users. Yeah, but it's fun. Already it's fun. So that's, that's what I'm going to be doing. That's been taking up a fair bit of time." Daniel: "What I would think about most with that app would probably be the preloading, because I don't want to start loading an image when its container is already visible, I want to start slightly before, but how aggressive is too aggressive, you know, like that kind of thing. That tickles my brain." Dave: "Yeah. Yeah, there's a few things there that I'm going to have to tweak about that. But yeah, there's, there's ways and means and using a caching system as well for the images that get downloaded. Obviously doing a whole bunch of that already, just using a library for that. And that's good" Daniel: "Oh yeah, doesn't doesn't SwiftUI do that for you already?" Dave: "Er, you can use the async image view, yeah, for sure. But not quite the same. Like what I'm using, I'm using Nuke, a library called Nuke, which has its own caching mechanism underneath. But also it solves a bunch of problems for me out of the box. So it's playing GIFs back, and it's also got a movie player as well, if you want to use that. So there's a whole bunch of things there that it just sort of does. Daniel: "Oh, that's amazing. That's really cool. Ok cool." Dave: " But the caching is part of it. Yeah. Yeah. Yeah. But anyway, that's my, my life at the moment in terms of app development. I've got a whole bunch of stuff I want to do back on GoVJ as well. So I'm going to have to shift tracks over the next few weeks, probably to focusing on that again. The other thing that I've been looking at, Daniel, is I've been looking at app store screenshots. And the ones I've got at the moment for GoVJ, they're kind of bad, honestly. They do the job, right, but they're not selling the app, they're just sort of giving you a view of it, a taste of what it does. But they're, they're not, they're not salesy, they're not glossy, they're just screenshots from the app. So I'm looking at that as well at the moment. How can I make that better? How can I go about this? I think I'm going to be using Figma, probably, to set the images up. And so I'm kind of going down a bit of a rabbit hole there, because that's, that's not my forte. Ah, so, Yes." Daniel: "Yeah, it's hard. It's hard because, especially when you want to improve your UI and stuff like that, so you do need new and cool screenshots anyway. And then you want to showcase everything and then you have to recreate all those screenshots all the time. So yeah, and it has to have like some demo data and stuff like that. So, ah, frustrating. I get that." Dave: "Yeah, it's, there's a few things that I was laboring under a misconception, actually, with the screenshots. So one of the requirements from Apple is that you upload all these screenshots in different sizes for the different devices that may well be consuming it on the other end, browsing the app store. So you've got, you know, four inch size, 5.7, six and a half, XYZ, you know. And, the misconception I had was that you had to show the device type in that screenshot that is consuming it. So for example, if you're on one of the smaller sizes, say the SE2 size, for example, then you would expect any phone frame that is in the image, displaying a phone with your screenshots in it to also be that same type of phone." Daniel: "Oh yeah, I get that because because many bigger apps do that. But I think the original intent was to only have a screenshot so it's like without any frame or anything." Dave: "Yes, yes. And that's what I've got at the moment. But if you're framing and adding like text over the top or bottom or wherever, to sort of explain what's on screen, the phone frame that you see in that image does not have to be the same device, I think..." Daniel: "Probably not. Probably not." Dave: "... is what I'm now understanding. Yeah, it's literally just the size of the image." Daniel: "Especially because, yeah, and I think you can satisfy the upload, you know, by not uploading everything, like for each different phone size but like there's like there's I think three sizes or so. If you upload those, all the other sizes will be like just scaled versions of those images." Dave: "Yeah. Yeah. So I'm kind of going down this, what I feel like is a rabbit hole, anybody who's done loads of this before will find it easy, or anybody who's a designer, some of this will come naturally. For me, it's a case of, yeah, I'm doing this, I'm looking at all of this and trying to stop myself from mentally building an app around the whole idea. Like an app for making screenshots, which they do exist. You know, there's various web platforms you can sign up to for x amount per month to go and create beautiful screenshots for your app. Um, that's not what I want, because I'm not likely to be changing things very regularly for a start. You know, like once it's kind of working and where I want it to be, I'll move on to something else. So subscription doesn't work for updating screenshots, because, yeah, one and done. I could do one of these things and cancel, of course. But equally, I want my own control over it a bit more as well. So I think by the time I've got it done, it will be a series of templates in Figma. I can just drag my latest screenshot out of the app into the frame, or however the mechanism needs to work to do that. Daniel: "Yeah, I get that." Dave: "And then I'll render out from Figma into the different sizes and off we go. But yeah, that's where my head's at at the moment. Just sort of for GoVJ, I need to focus on a few things like that to sort of spruce the app store image up, because, yes, it's working. You know, I'm making, getting downloads, making sales. But I also think I could be increasing the number of people who go get into the start of that funnel, if you like, and who download the app, if I've got better representation of what the app is in those images. So yeah, that's a point of focus, I think, over the next few weeks, as well as this Fediverse photo app." Daniel: "Mm hmm. Very, very nice. Fingers crossed. I'm looking forward to using that and to be able to use that." Dave: "Yes! Ah... I'm looking down our show notes because, yes, we do have them, mainly for just keeping note of stuff as we talk about it. But our next few notes, Daniel, for this show.... First off, I've got a note in there about new haircuts. We both have new haircuts." Daniel: "We do, we do." Dave: "I'm not sure that's show-worthy, but we do. Yeah, and maybe we should update our profile images on the waiting for review site as well." Daniel: "Sure, I'll send you a selfie." Dave: "That could be fun. And yeah, other points to talk about. You've got down there, I'm going to skip the one about Kerbal Space Program. I'm sorry, but we'll come back for that. We can. Daniel: "Awww" Dave: "But I want to ask you about TelemetryDex filters and calculation infrastructure?" Daniel: "All right. Okay, so. So you know how I've been working on especially filtering for telemetry deck for a long time now. And this is not because like it's an incredibly hard problem but it's because I wanted to do it right and they had there was various like parts like puzzle pieces that really had to work together. And they've been coming online over the last few months and weeks. And so finally I was able to write the blog post that kind of, that's kind of, that's kind of how I do things like we, I will usually release stuff just quietly. And then every two months maybe or so I will write a big blog post about all the new, the new things and how they fit together. So I was finally able to write the big blog post about how does the filtering system work and why is it such a big deal." Dave: "Okay." Daniel: "First of all, like what is the filtering system, like you can, when you like when you like analyse data using telemetry deck you can make a thing that's called an insight so it's like a card with a chart in. It's like a visual interface for how to like for configuring the chart and the data that is displayed there. And so one of the most important parts is filtering because sometimes I don't want all the data in there. I want specific data for example if I want to know how many users on macOS but not on iOS just on macOS are using this specific feature each day or what's the breakdown between people who use I don't know this mode or that mode on macOS. So for that I would set a filter that says like operating system must be macOS." Dave: "Okay." Daniel: "And of course there's other various other things that you can use the filters for. And previously there was just like a text field and you could enter like one like one key value pair and that kind of had to be like that was just it. And now what you can do you have a visual editor which you can use to kind of build a tree of what we call conditions. And so for example you can have as a root node you can have an and condition and they can add various conditions like operating system must be macOS and app version must be newer than or must be equal to 4.5 or whatever. And so all of these things have to be true or you can have an or node. This is like one of those things need to be true. You can negate things so you can have a not node basically. And using that you have a way more flexible way of filtering things. And the way we are implementing this is that previously there were like two kinds of languages where how you could telemetry what kinds of data you want. There's the internal language that our databases are using which is called the Druid query language." Daniel: "And there's like an external language that is mostly just how I set up the database properties of an insight like three years ago when I started the whole thing. And those things are very similar but they differ in various ways because of course they do." Daniel: "And so I've started actually this whole process started like half a year ago at least if not longer but it's made a big leap in that more and more parts of our internal system are talking directly in the Druid query language." Daniel: "But and this is the thing like because the Druid query language is pretty low level it's not very fitting for these high level UIs and representing their concepts. So I started adding various verbs and languages various features to this query language. And on the server they get kind of compiled down into like it's the native Druid representation. And that is really cool and that is something that also has made a big leap forward. Because now for example you can add your filters directly and it will without you having to define them it will automatically add additional filters." Daniel: "For example it will add automatically a filter for test mode it will automatically add without you having to do that in the UI or like by hand even it will add various conditions that say like hey just display the data range that the UI is right now displaying. And it also will apply for example like by default you have access to all the data that your organisation possesses." Daniel: "But most of the time you would just want to ask focus on one app. So because like otherwise it could pull data from all if you have multiple apps like you could pull data for all of these apps and compare them. But most of the time you don't want that. So yeah so now you can just have for example you don't need a whole filtering thing for that you just have one property that says app ID and if that is set you only see one app ID. You only see that one app for example. And this whole way of how we how we do things this also paves the way for new features. Like for example right now the UI for this is not here but our next big feature is unsurprisingly funnels. A funnel is a construct basically as a way of looking at processes in apps and user interfaces from an analytic standpoint. Like for example imagine you're in a shop application and so you browse stuff and then you put something into your checkout bag. And then you click on payment and then you enter your payment details and then you enter your address and then you click order. Those are like five steps or so. And at each of those steps people will decide to actually not do that. They will decide to click back on their browser or close the app or go back to the main interface or whatever. And a funnel will basically tell you like okay of the maybe 100 people who entered who clicked on add to cart for any item doesn't matter which one. Maybe 80 clicked on enter payment details and then 60 clicked on enter address and then maybe 30 clicked on actually order or whatever. And you can look at this visually and then see like okay which of those steps has the biggest fall off and then work on that and improve that step. So because if you want to sell people things that's of course a good thing. Or maybe you have an onboarding and you want people to really learn the app. So your funnel can tell you like hey people are not getting step four in your onboarding process. So you really should work on that and it tells you like where you should prove what you want to improve. And so the UI for this is not done but even now you can tell the query language by hand. You can tell it hey the type of this query is a funnel and these are the steps in the funnel and you define the steps using the new filter expressions. Because of course I can like those are very very well fitted to select like a partial piece of the data. And so and then this whole expression will be like when I actually ask the server hey so give me the results for this query. It will actually just compile that down into a regular Druid query run it on the Druid server and then give you back the data and then you can display it. So now what I'm working on is UI for displaying like multiple columns of filter editors next to each other. And then also UI for displaying this like in a nice funnel-y way. Because like actually like business-business people they actually want like a literal funnel sometimes like a reverse pyramid basically." Dave: "Yes" Daniel: "I probably want to put that on its side because it makes more sense to read it from left to right than from top to bottom. But yeah. And so that's what I'm what I'm working on like I have the filter editor." Dave: "That's really cool." Daniel: "So now I just have to display multiple of them in a way that makes it distinguishable which one you're editing. And then also I need to work on the charts. And if you've seen my social media today you also see me posting a lot about charts. And this is because I am switching chart engines or chart libraries." Dave: "Oh cool... I guess it's cool if you are?" Daniel: "It is, it is cool because the one I was on previously was very easy to work with but it's getting deprecated and not worked on anymore. Most of the chart types don't work properly anymore and it had a few bugs that were really annoying. And so it was kind of getting on my nerves and there was like no way I could really do the funnel charts with it. So I have like one branch that's opened in let me say November. And every now and then I just go to that branch and just make one more chart type work with a new with a new graphing charts engine. And it's actually really bearing fruit. So I think next week or so I can switch all the existing charts to the new charting engine. I also spruced up the colors so the colors for charts are way more friendly and rainbowy and I really love them. And it fixes a lot of bugs and I made the charts a bit a bit more easily readable which is very nice. And it will also support the various like funnel charts stuff like that. So that's so that's pretty cool." Dave: "That's awesome." Daniel: "Ah! And of course this is super boring if you're not into that kind of thing. But the thing that I like about it is that I always try to think about the systems that I'm building as puzzle pieces as like OK. If I put the work in here how can I make it so that I can later reuse that same work in a different context. Like for example the filtering system and the filter editor in the UI is very relevant for just filtering stuff. But I can also use the same the very same system this very same UI and also the very same Swift structs because of course this is all Swift on the server. I can use those to to also build different structures like for example the funnel editor or the funnels in general. And I am not yet at that point but in the future there will be A-B testing as well. And probably selecting your A-side and your B-side is also a filtering thing that I can use that I can use this for." Dave: "That's really, really cool." Daniel: "So yeah it is fun. It's a lot of work but it's fun. It's really fulfilling right now." Dave: "Yeah. Well, I'm looking forward to all coming together for the funnels, because that's definitely a feature I want. Definitely something I want to test my apps out with as well. It's been previously, in a previous life as it were, part of my career where I was doing analytics. That sort of thing was definitely very useful for finding those insights, for finding those moments where like 'ah right it's actually stage 4 in the onboarding process' rather than, you know you might have assumed it was stage 3 or 5 or whatever, not knowing how many people you were losing out on because of something. I think it's going to be really powerful this has dropped, I'm looking forwards to it." Daniel: "Awesome. I did write a very very long blog post about it that goes into even more detail. I'm going to link it in the show notes." Dave: "I'm looking forward to it. Awesome." Daniel: "It also has a coffee filter as a header image because that's just I don't know that's just makes me makes me giggle. And yeah so writing these long blog posts and and rendering images in Blender is just how I like what I do when I don't want to code anymore. And it's actually a nice like context switch away from from coding to something that is creative in a different way. That's pretty cool. Dave: "For sure. And I love your blender work these days, Daniel, as well, the images you're producing are rather cool." Daniel: "Thank you so much. Thank you so much. Not everything like every now and then I do buy or download an existing model like for example the duck on telemetryduck.com. That is actually I paid like I don't know five bucks for it because I was kind of in a hurry. I wanted to put in put in the thing and so I was like I'm not going to try and model this. I'm just going to buy it. But I did texture it myself because it has a very like because I couldn't I did spend the 10 minutes and 30 minutes render time to make it like very slightly like shimmery and see through. Daniel: "But yeah I love making those especially like now I've convinced Lisa my co-founder that our main target audience really is developers. So every now and then we will not shy away from being really nerdy because this is like developers can really do that. And like as this at the same time like we like ever since we decided that yes like we are talking to developers and that is purposeful. And we can also do things like decide that yes yes our pricing is always on the on the website and stuff like that you know like because we're not talking about to people who want a sales presentation. We're talking to people who really just want to click on the thing and get the information that they want." Dave: "Yes" Daniel: "And that's also one of the reasons why I was like yeah I'm just going to go into ridiculous detail in that blog post and people can just write read on as long as they like and then just leave as soon as they like. Okay this is enough level of detail for me." Dave: "Now that's cool. I think as a developer, I look for that sort of thing that illuminates what I'm working with and playing with. Yeah, you're right, perhaps less aimed at, you know, salesy people, as it were, but definitely for your end users, it's the sort of detail that I think people want." Daniel: "Yeah totally and I mean we do have to talk to I want to say like product owner people stuff like that as well. But at the same time I've seen it before and I think it's it's a good thing that like people try TelemetryDeck, like try it out for their small private indie projects. But then they're like okay this is actually pretty cool. And then next time they're working they're going to their day job they're like ah you know I know exactly the tool that we should use. And so they convince their managers and yes please people continue to do that." Dave: "That's fantastic. And yeah, I think I've been one of those people in the past as well. So yes. And you're right. It's a different, the relationship you establish with an indie may well extend out into other things. Because yes as an indie I'm installing this, I'm playing with this, putting in TelemetryDeck because I believe it's a good idea. But yeah in my day job when these moments come up, we're it's like 'ah we need analytics but we don't want this service because it's creepy' I'm like 'Ah-ha I know a service that isn't creepy, lets use it', yeah, no, that's fantastic." Daniel: "Awesome." Dave: "Daniel?" Daniel: "Yes?" Dave: "I need to run off, I'm afraid I'm out of time to make superheroes in my day." Daniel: "That's okay that's okay our listeners can stay superheroes until our next episode." Dave: "Yes, yes, exactly. And well, I think, come the next episode, Daniel, I want to know what type of superhero are you?" Daniel: "I am very much looking forward to that." Dave: "Okay, so there's a bit of homework between now and then. Yea, so maybe I need to start drafting the book that will help me unlock all of that..." Daniel: "Yes please. All right. Dave it has been amazing and awesome as always. You really helped me unlock my inner superhero. And so I want to I want to continue unlocking that. If people want to know more about your superpowers or your developments or just you as a person where can people find you online?" Dave: "You can find me on Mastodon at @davidgarywood@social.davidgarywood.com. And you can find out more about me and my superhero podcasting self-help guru life at davidgarywood.com. Daniel: "Awesome." Dave: "where you will actually find a bunch of blog posts about things like SwiftUI." Daniel: "Very good. All right." Dave: "But yes, Daniel, what about you?" Daniel: "You can find me at @daniel@social.telemetrydeck.com or or you can just go directly to what the heck is telemetrydeck.com all just one word. Or you can go to telemetryduck.com or telemetrydock.com. That's just like small a small selection of the domains they have. I can like next next episode I can add a few more. All right. Dave this has been awesome. Thank you for taking me with you on your superhero journey. Dave: "That's fine. That's fine. We all need to unlock these things." Daniel: "And listeners. Listeners. Keep up keep up finding your inner superhero. You're amazing. Don't let anyone trample over you and find your superpower and use it for good not for evil. Dave: "Yes, go for the gold." Daniel: "And with that. I'm going to say our slogan again. You're a superhero. Let's make it last. Become the hero. Make your way. All right." Daniel: "Byeeee!" (Outtro music) (Intro, reprising the super hero podcast jingle): Daniel (singing): "The Superhero Maker Show, let's go! Dave: "Let's go!" Daniel (singing): "Empower your mind, let it grow! Learn from the best, take action today! Become the hero, make your wa-aaay!"