Daniel (00:10) Dave, it's fantastic to see you. We're recording on a different day today because our lives are a bit hectic. Dave (00:11) Hey, and you man. Yes, we're all out of sync. Daniel (00:36) We're all out of sync. I have a friend of a friend told me that she was walking through a European city. I want to say Barcelona or something. And then suddenly like two other Germans walked past her and like the one snippet of conversation that she heard was like 'ever since Thailand, our like all our routines are out of sync.' Daniel (00:39) That is like something that I always want to say now. ⁓ 'Ever since Thailand, my routines are out of sync.' Dave (00:42) Yeah. We should have said that on the pod and just moved on. Like, 'ever since Belize, Daniel.' Daniel (00:49) Yeah. So my routines are out of sync, but that's okay. Like I'm, I'm list to do list driven and, ⁓ I told you this, right? Like we, we recently switched to, doist. and because like they're shareable and stuff. so Lisa can now give me to do switch. She loves to do, and I hate, but I also love it because, ⁓ that's another layer of organization that is, that is very good for my, kind of hyperactive brain. Dave (00:55) Mm-hmm. OK, yeah. Daniel (01:16) Anyway, so like, can like, it currently works kind of well to be like, okay, I'm a bit, like there's a bit too much to do, but I can sort stuff by priority and work like from top to bottom. So yeah, also, I actually had some time for computer gaming recently. So, ⁓ like, because like you wrote me early and said, like, okay, you're gonna need another hour or so. And I was like super. suddenly super surprised because I was deep into death stranding the Hideo Kojima game from 2021 or two maybe, I don't know, and had completely forgotten the time for recording. So you could have just pretended to be super mad at me for forgetting the recording time. But yeah, like the game is super weird. You are basically Dave (01:44) Okay. Well that worked out well because I slept in. Daniel (02:05) a delivery person and you have to like, because like it's post-apocalyptic, right? So nothing is working, but like people need to like deliver the materials and things from one city and outpost to the other. And so it's a, it's a walking simulator in the, in the main, like it's actually like a terrain traversal. We have like a backpack that is like, I don't know, 60 kilos or like, depending on how much stuff you're actually bringing. And the main... game mechanics actually like, can I go up here with the amount of stuff? Can I keep my balance? Because you kind of have to balance the stuff, otherwise you're falling down. And it's also incredibly weird. There's dead ghosts, there's babies that are kept. Like you have a baby with you inside of a plastic container and you use the baby to repel and or detect the dead ghosts. Dave (02:41) Okay. right. This is incredibly strange. Daniel (02:52) And there's like some amount of time traveling happening. It is incredibly strange. And it's one of those games where I wish I had known about it earlier, like so often, like mainstream games, like, because like, I know so much about indie games. don't, I rarely play them because I don't play on the, on the, computer. But like, I, I watched so many YouTube shows about like, here's this indie game at here. Like this is what it's about. And here's what it feels like playing it. And somehow. Because mainstream games are so big, everyone kind of assumes you already know what it's about and how it feels playing it. So I know that I have known of the existence of this game for like literally ever since it came out. But like there was no piece of media that told me, hey, this is what it's like to play Death Stranding. Like this is what it's like, not even like what it's about as in like here's the full story, but like just like what. Dave (03:42) That's quite funny. Daniel (03:46) Do you actually do what's the main gameplay loop and how does that feel? And also like how's the vibes? Dave (03:52) There must be videos out there that do that and it's just that your bit of the algorithm when you're watching stuff on YouTube has kind of like filtered you to the indie stuff, right? Daniel (04:03) Yes and no, because I have this thought, this idea that ⁓ somehow I need an equivalent of 2000s era gaming magazines. I need that for me. Is an idea that I have. So I actually actively read Polygon.com and sometimes IGN and also I follow them on YouTube and stuff. But even they, they kind of presume that you already know. Dave (04:14) Mm-hmm. Daniel (04:29) what's going on, like somehow, I don't know, or they are kind of vague about it. Like they'll be talking about a game like for 20 minutes. But then you, like, I don't need spoilers, but I need to know like, what is the kind of gameplay loop? Like, am I shooting all the time or am I like walking all the time? Which sounds really cool actually, like, because it's really well-made and stuff. But like, that is something that I miss from gaming reviews. I don't know. That's my personal pet peeve. Dave (04:34) Yeah, so they're not wanting to do spoilers. Yeah. Yeah, no, I get you. I used to love reading some of those. Usually about games my PC couldn't run at the time. I was... Yeah. But I do sometimes think about building a PC and then actually playing a few more games that way. But what tends to end up happening though is if I'm sat at my desk, I want to program, right? Daniel (04:59) Yeah, same. Dave (05:15) Like I want to do development. So it's not that mode for me. And then I know if I got something like a steam deck or whatever, yeah, I'd have that option. But again, would I really do it? I think I play with it for like a week or two and then lose interest. So I sort of like curb my enthusiasm a little bit on that one. It's more like, hmm, I'd like the option to play a game every now and again. So that does not mean I need to build an entire machine for it. Daniel (05:20) Yeah. Yeah. Dave (05:43) Yeah. Daniel (05:43) I get that. Also, like it's an additional device that stands around like I need or I want a clean desk. And if I have like a whole tower here, like, I can't, I can't also like it's expensive. It's expensive. And like the whole switching, I need a different mouse and keyboard because like Windows doesn't really love the track pad and gaming stuff and whatever. That being said, I was. Dave (05:49) Yeah. Yep. You can put the tower under the desk. Yeah. You've got the Apple, yeah. And you've got your fancy Apple monitor as well, so you don't have multiple inputs. Daniel (06:08) I was this close to actually considering building a PC again because Kitten Space Agency is out. Well, not out, but the public alpha is out. It is a game that has suddenly sprung up. I promise I won't talk about this all the time, but give me two minutes. So suddenly... Dave (06:14) Mm-hmm. Okay. Mm. Okay. Daniel (06:31) You remember I used to love ⁓ Kerbal Space Program. It's a funny but kind of physically deep space exploration games where you build rockets and then they kind of physically correctly launch them into space. that had a... Right, exactly. And that had a sequel, KSP2, which promised a lot. It had a fantastic art style, but it turns out the development team was badly mismanaged. Dave (06:36) Yes. Yeah, and you end up stranding the little green dudes out somewhere in the solar system, right? Daniel (06:59) And the whole project kind of shut down before it really, really launched. there was like a public beta. was like ⁓ a paid beta even. So I paid like 50 bucks for that game, but it never released. The whole team got fired because didn't like go according to plan, which is not surprising from the details that they shared, which is basically like the team was mismanaged. They've kind of fired the... Dave (07:06) Yeah. Yeah, that sucks. Daniel (07:24) two expensive lead programmers and lots of other weird stuff. So everyone in that community was very down and very disappointed. And then suddenly some indie developer from New Zealand even comes out with, hey, we made a game engine specifically for space exploration games that can deal with the huge distances. Because usually all the game engines work in floats. Dave (07:27) Mm. Yeah. Okay. Daniel (07:52) float numbers lose precision the bigger they get. And so like this engine, everything is a double. It has like specific affordances for rendering like far away spherical objects, like planets and stuff with like a thing, a technique called spherical billboards, kind of thing. And then they continue working on that and they call it Kitten Space Agency, obviously like a very... Dave (07:54) Yes. Yeah. Mm-hmm. Daniel (08:16) DirectNode obviously, it's basically Kerbal with kittens. They have now a free public alpha on a website called Ahu, which is also the way they want to distribute that. That's their Steam competitor. Dave (08:28) Yes, yeah, I'm just checking out now. Yep. Daniel (08:31) And it looks amazing. They are like, you can't really do anything yet, but you can have a ship that is already made of made out of parts, but you can't build it yourself yet. And you can fly it around like physically accurate and things already look gorgeous. Dave (08:46) And the astronauts are cats or kittens. Yeah. Daniel (08:49) It's a kitten. Yeah. And so this is incredibly promising. Of course, it's Windows only right now. I actually managed to get it to run on my computer, on my Mac, using Crossover. But it has a lot of graphical glitches then, but ⁓ maybe there's a way there for me to play this in the future once it's a bit more baked. But yeah, this is super exciting and I'm watching it with interest. Dave (09:00) Yep. That's promising. That is really, yeah, that looks interesting. Again, I wouldn't build a PC around it, Daniel (09:16) Also, whole business model is basically they're this game away for free and then hoping for donations. So five days after the public alpha launch, they have collected around 70k of donations, USD, which is, I hope that number gets higher. Dave (09:29) Yeah. I'm seeing 85k right now, Daniel. Nearly 86. So, yeah. Daniel (09:36) Oh, okay. All right. All right. So things are, oh, that's, that's good. That's good to see because like they have like, I don't know, a team of 10 or 20 people, like 70 K is not, going far enough. Dave (09:42) Yeah. It's not much divided through yet. So hopefully that keeps going. Daniel (09:51) I think what they're hoping for is big donations from universities or space agencies or stuff like that, because the engine is good enough to do some low quality simulations and visualizations especially. Dave (09:59) Yeah. Yeah, there's a whole STEM side to it as well if it gets kids interested in that sort of thing. yeah, here's hoping they find their groove because that looks really, really cool. I shall be sending that onto my kids who have Windows PCs and we'll be all over it. Dude, I'm sorry to interrupt you and cut you off, but we haven't intro'd the show. We're 10 minutes ish in and I feel Daniel (10:18) So yeah, that is... Oh yeah. my God. Welcome to the space podcast. Okay. You there, you there, you there with the headphones. Welcome to waiting for a view a show about the majestic indie developer lifestyle. Join our join your scintillating hosts to hear about a tiny slice of their thrilling lives. I'm Daniel. I'm a picker. I'm a grinner. I'm a lover and I'm a sinner. Dave (10:33) Unnerved by this. Yes. So please, please put my anxiety at rest. Daniel (10:56) And I'm here with Dave, who is a bitch, a mother, a child, a lover, a sinner and a saint. Join us while waiting for a review. Dave (11:04) I'll always be the same, ⁓ Daniel (11:12) I was like, I was like so proud of myself for coming up with that, that I posted it on Mastodon before we started recording and I was really hoping you wouldn't look. Dave (11:16) That's good, you landed it well. No, I missed it. That was great. I'm looking at our show notes and we've got an item in there that just says Daniel is sharing his vision in all caps on vision. So can you share your vision, Daniel? Daniel (11:25) Mm-hmm. All caps. Yes. I can, I can. Okay, so what's this about? So I've been talking to a lot of my coworkers from Telemetry Deck and while we still don't have any full-time employees, like we're working with a lot of people these days. Like I think the other day we had like 10-ish people in the, all hands. So that's really awesome to see. But one thing that I've have been noticing is that because a lot of the technical planning for Telemetry Deck is just in my head. Like we have a feature roadmap that has like specific features like, I don't know, single sign-on or the new export feature that supplants the old defunct export feature, that kind of stuff. But one thing that is just in my head is like all the things that I want to do to improve technically under the hood. And it turns out that leads to problems because some of my coworkers then come up with ideas for problems that they perceive, are correct, like what's the correctly identifying. And then they think about. Dave (12:12) Mm-hmm. Daniel (12:33) what they could do to fix those or mitigate those problems. And then they come to me and be like, hey, I want to do that. And I'm like, but I already had a different idea for the same problem. And so obviously there's a failure to communicate from me here where I should share these plans and then also discuss it with my coworkers in a better way. And so I kind of wanted to kick that off by sharing with them like a tiny presentation. Dave (12:36) Yeah, which is awesome. Daniel (12:59) that I'm going to prepare and show them this coming Monday and the all hands. And I figured it could be fun to actually click through that presentation really quick. Like we don't want to go into too much detail. This is still in full screen mode because I've been presenting on an actual conference last month in window because then I could share the window. That's how you do it. Hang on. I am very prepared. Dave (13:08) Yeah, go for it. Yeah. Daniel (13:22) Here we go, cool, awesome. Okay, so this is my internal presentation. It's all very internal. Also, like this is because we have like, just ages ago, I actually made a keynote theme for Telemetry Deck. this presentation actually looks awesome because I ⁓ asked a designer friend to create me all the typography and then I just like put it into keynote as like all the Dave (13:39) Yeah. I was going to say it looks rocking. Yeah. Daniel (13:52) how do you call it, all the templates and stuff and styles. And so now it just looks nice. Dave (13:53) styles. lovely. ⁓ For listeners, ⁓ may want to check out the YouTube instead to just have an actual look at what we're seeing, but we'll try and give an audio descriptor as we go. yeah. Daniel (13:57) You had a question? Right. Also, as with all my presentations, my aim is to like, is that the, like the audio track is always enough. Like you should never have to look at the screen to, ⁓ actually understand what I'm talking about. So yeah, I have like a few intro slides where I'm just like saying the things that I just told you that we're basically going bigger. And so I need to, I just want to share with everyone the status quo and also my, my vision. Dave (14:18) Yeah. Yeah, that's true. Daniel (14:37) basically. I actually like for vision, looked at, I just have a doctor go search for like the weird stupid stock photos for the vision for the word with vision, which is somehow people shooting things like there's someone shooting a goldfish. There's someone shooting a, a lettuce, I think. Dave (14:39) Okay. There's a guy underwater in a suit in the middle trying to eat the fish in front of him. He has his mouth out. Very weird. Daniel (15:04) Yeah, that's a lot of fishes actually. Someone is trying to drink with a fish in their mouth. Dave (15:08) Hmm. And there's even a weird snake cat that looks slightly AI driven. Yep. Daniel (15:10) See ya. So yeah, my coworkers have to suffer, my coworkers have to suffer my weird humor all the time. So yeah, I really send thoughts and prayers. And so what I do basically is go through the entire architecture for telemetry deck and look at where are things not ideal and how can we improve them in coming 12 months. So like data is coming into telemetry deck. Like this is basically, like this is a slide that I stole from my talk on. Dave (15:42) Mm-hmm. Daniel (15:42) on how telemetry deck works actually. Data is coming into telemetry deck in the ingest server. It's going into Druid, which is the time series database. And there's an API server. That's the thing that's entirely written in Swift. And then there's the dashboard front end, which is the JavaScript application to display stuff, right? And that's what the customers interact with. And so now we just want to go into the things. And the first thing that I'm really identifying is that we have ⁓ different namespaces in our Druid where the data lands for our customers, which is already better than it was before because it was just all in one namespace and that led to performance problems. We still just have basically one message queue where the data runs. So what we do is if you look at the right side of your screen, what we have is all the data comes into one. Namespace that's called Telemetry Signals. And then we have these copy processes that every half hour basically copy all the relevant data into a customer's namespace. And that is cool, but it's not real time. ⁓ I can filter stuff, but if I subscribe to this namespace or to this queue base ⁓ with more than one reader, then I'm paying a lot of traffic costs. Dave (16:44) Gotcha. No. Daniel (16:59) Also look at the SDKs. The SDKs can only send string-based values and everything that the SDKs can send us, like these five hard-coded ⁓ event properties, and then a payload dictionary. And the payload dictionary is always string to string. Even if you send some whole, if you don't use an SDK, but send it by hand, it still will always be converted to strings. And so everything that lands in our database is strings. And that's kind of sad because I want to have different things. So yeah, this is the problems. But the problem is like we have just one stream, so nothing is real time anymore. The hosting costs are high and everything is a string. And that makes it hard because I want to support things like metric kit and Swift metrics and open telemetry. And that needs different data types like floats, integers, and even Booleans. Dave (17:28) OK. I was going to ask you why you wanted to change it and you've just explained. Yeah, those. So there are opportunities there. Daniel (17:51) Yes. even if we... Right, but even like if you just want to say like, hey, these are the number of items in this customer's database, like just something that you want to send, like right now you have to jump to weird hoops to make it actually show up as a number. And if it's not a number, then you can't do averages and sums on it and stuff like that. And so that's very frustrating. Dave (18:08) Mm-hmm. Daniel (18:13) Right, so, vision. I want the SDKs and the Injust API to accept at least string int doubles and pools. And ⁓ maybe even dictionaries of that type as well. So you can nest dictionaries because that's that's not a lot of add-on work, but that would be cool for stuff like OpenTelemetry, which has ⁓ this concept of spans. Dave (18:16) Mm-hmm. Daniel (18:42) that contain other spans and stuff like that. Also metric kit also sounds like nested dictionary. So that would be kind of ⁓ Vision two, different streams for different customers. So the free customers, maybe not because streams still cost, but if we move the message queue away from AWS to Hetzner where we host a lot of our self-hosted stuff, then we can have multiple streams. Multiple streams will mean real-time data again, which we had for a while, but like how to... ⁓ Dave (18:42) Yes. Daniel (19:11) go away from performance costs. And so that would be really nice. Also, put in like... Dave (19:16) Yeah, is that because internal traffic is not expensive? Daniel (19:20) Yes. Yes. Also right now our message queues are the AWS type of message queue, which is a name that I forgot just now. And so you pay by stream. Whereas like if we self host the thing, like doesn't care about like, guess if the, if it has enough like disk space and CPU, can use all the streams that it wants. Dave (19:40) Yeah. Have what you want. Yeah. That's cool. Daniel (19:45) Right, I put in some, like this is a frill-necked lizard. I put in like, I wanted to not share like kittens and dogs. No, these are all cute. Like I have a few more, but they're all cute and weird, like myself. And this is also tiny. Dave (19:49) It is. That needed a trigger warning, Daniel. Damn. I've watched Jurassic Park dude, that guy's not cute, I know what happens. Daniel (20:01) This is like, you watch Jurassic Park. Okay. Fine. I'm going to zoom in on a different part of the architecture now, which is here. This is API and the query worker and the Druid. So the API server is actually two things. It's like the API server itself and the query worker, which has its own runtime loop where it runs, it manages queries and stuff like that. And I have now on my screen a kind of like a diagram. Dave (20:25) Yes. Daniel (20:33) of the different steps and communication steps that happen when a query runs. And I'm going to ⁓ try to summarize them, or tell the story, which is you want to see a chart on your dashboard. So the dashboard sends an asynchronous query request with the query to the API. The API computes base filters and namespaces for the thing, which is basically Dave (20:39) a lot. Daniel (21:02) It decides which namespaces it's going to run on because of course there's like some permission stuff going on. Like you can only access your own namespace. And also automatically wraps everything in one huge filter so that makes sure that you can only access your apps. And that's kind of a relic of the time when we had only one namespace. So we had to have a filter on everything. So that's the base filter. And it does a thing called pre-compilation, which is it converts all the telemetry deck stuff into just telemetry query stuff, into just Dave (21:21) Yes. Daniel (21:31) Druid compatible stuff. It checks it's cached because it might be cached. It pushes it to the queue and then periodically monitors the queue. In the meantime, the dashboard every half second asks, is my queue item already done? Is my queue item already done because it got a task ID? Then the query worker every second or so checks the queue and is like, ⁓ there's a new query coming in. So I'm going to compile that, which is also hard code or like, Dave (21:47) Mm-hmm. Yep. Daniel (22:00) absolute highs, the dates and times, and then gonna send it to the Druid server to actually run it and also cache the results. Meanwhile, the Druid server runs it, but also caches the result because Druid now has segment level caching, which I'm not gonna explain, but it's like awesome. So this is very complicated. There's like multiple caching steps involved. There's multiple, like there's a lot of HTTP requests involved, and also there's multiple steps where, things are being put on a queue and then kind of wait for something else to pick it up, which all kind of makes things slower. The base filters are unhelpful because they're no longer needed. The queues are slow and also are double-tashing. So my vision for this is what I call synchronous queries, which used to be impossible because the queries would just run too long and then there would be a HTTP timeout after two minutes. But because we have namespaces now, things are actually really fast. And also because we are having segment level caches, like even if I slightly change a query, most of the cache will still apply. So they're really super fast. ⁓ this is actually a beta feature that you can enable right now, which is called synchronous queries, where the dashboard is just extending the query to the synchronous query API. It will do the base filter stuff and the pre-compilation stuff, and then just run it and then return the result, which... Dave (23:03) That's lovely. Hmm. Daniel (23:22) takes out like seven billion steps, which is really nice. If you enable this for your telemetry deck organization, most of you will see like ⁓ vastly improved performance. But like some people will maybe see a decrease in performance, which is why this still is in beta before I take it. Also, like I'm just gonna throw out the bass filters at some point as soon as I'm reasonably sure that. Dave (23:43) Yep. Throw out the bass filters and yeah. Yeah, that makes sense. Daniel (23:49) Also, also I am like, by the way, I can do that because all the active organizations on telemetry are now using namespaces. Dave (24:00) Hey, that's groovy. Yeah, that's really cool. Daniel (24:01) So that is awesome. That makes me really happy. And so I can update the UI a bit and no longer nudge people into namespaces, but instead if someone is coming back after a few months, they will just have to see something like, hey, welcome back. Enter a name for your namespace to continue. Just not even give them the options. Dave (24:19) Yep, you gotta do this and then it's gotta do the migrates or whatever and that's fine, right? Which happened to me the other week, right? That you were in the middle of things being a bit further back than they are now, but like I went through that sort of process. Daniel (24:25) Right. Right. Here's a bonus vision. It did! Right. Here's a bonus. This is, ⁓ this is a word exclusive. Like I haven't announced this yet. But because Druid now speaks SQL and because I have no namespaces that will safely like distinguish one customer's data from another's, I am hoping to be able to offer SQL querying for Telemetry Deck as well, which would be really cool because more people know SQL than know TQL, which Dave (24:56) Mm-hmm. Dang. Yes. Daniel (25:07) is something that I would like to change, but SQL is just also very convenient. Dave (25:12) I can still speak SQL. That's good. I love that. Daniel (25:14) Yeah, also most LLMs speak SQL, so even if you are stumped, can ask a LLM to help you out, which is also kind of nice. Okay, trigger warning, there's another weird but cute animal coming. Brace yourself. This is a Dumbo octopus. It's very tiny, and it has ears, so it's a tiny yellow octopus with ears. Dave (25:18) Yeah. Yes. Okay. Bracing. Hey, that's kind of cute. that is cute. I actually find that cute. Daniel (25:42) All right, last zoom in, we're zooming in on the dashboard. This is a screenshot where I want to show you the following things. I'm showing a dashboard for an organization or test organization, the Office of Orbital Audities, and it's showing one app. ⁓ All the apps in this demo project, by the way, have names that kind of go into acronyms. this demo app is called Kraken. Dave (25:58) Mm-hmm. Daniel (26:11) so what I'm showing here is basically you see a URL at the top of the browser screenshot and that contains the app ID, which is cool because we're looking at an app, but which organization am I, am I in? Like it turns out the organization that my customer belongs to is not in the URL. It's in the global state in the local storage of the browser. And that is really shitty because it like, whenever we share links, like the link, like Dave (26:25) Yeah. Daniel (26:40) For example, Lisa sends me a link to an organization or to a chart or dashboard or something. Like my browser doesn't know which organization this belongs to. And also, Dave (26:49) you're not signed in and don't have that state for that. Yeah. Daniel (26:52) Right, because I might have selected a different organization in the drop down even, because I belong to multiple organizations, like for example, Telemetry Deck and this demo organization. And so this is kind of shitty and it leads to a lot of bugs and recently these bugs have picked up because also our database has been a bit slow and so the dashboard forgot more often which organization it belonged to. So that is something that I really would like to change. And instead I want to have URLs that Dave (27:02) Mm-hmm. Daniel (27:22) ⁓ have, because we have namespaces now, like com.telemetrydeck, I want to have the namespace as part of URL because that uniquely identifies your organization. And then just like have the apps have names as well. So you have like com.telemetrydeck slash viewer as URL part. And that would be very cool. The URLs would be more readable, I'm hoping. And so this is something that I want to have. And also, Dave (27:25) Yeah. Yeah. I like this. Daniel (27:51) I want to have JWT for authentication because that can include different data that just stays with the client. so the client always knows which organizations do I belong to? What permissions do I have? And those things don't change a lot, but with JWTs, we can ⁓ have way less database load recalculating these things. And that's kind what JWTs are. Dave (28:02) Yes. Mm-hmm. Yeah, that's right. So the Daniel (28:20) are for. Dave (28:20) client's not going to have to ask the backend. Do I have permission for certain things? Because it'll already have a view of that, but then also you'll be validating that on the backend as well. You know, so yeah. Daniel (28:28) Right. But that is the beauty of JWTs because they are signed, right? So a client request comes in and right now, client request comes in like says, hey, I'm with this organization. I want to edit this app. I have to look up this user's permissions in the database. Like there's some caching involved, but there's still like at least there's at least cache calls, if not database calls for every single request. But if that request instead comes with a JWT, Dave (28:50) Mm-hmm. Right. Yeah. Yeah. Daniel (29:06) JSON web token, by the way, which is basically an encrypted JSON file. I can make sure that this jwt has not been tampered with because I have the private key for that. so I just have to decrypt it, not even decrypt it, just decode it. And then I can already see all the data. Like the client has done the caching for me. And that is exactly what these things are used for and should be used for. So yeah, it's time for jwt. Dave (29:10) Mm-hmm. Mm-hmm. Nice. Daniel (29:36) Also, I want to convince my coworkers that we will have a global filter set at the top of the UI. That's more of a UI thing. Dave (29:43) Yeah, yeah, it is, but it sits on top of all of these changes as well. Daniel (29:49) but it's also global state in the dashboard. that's why I put it in there. Same with here, this doesn't have text, like basically the queries already have, like in the query language, there's already lots of stuff that can control how the queries are displayed. Dave (29:53) Yeah. Yeah. You know what, I don't think I've ever seen telemetry deck in dark mode because I don't use it in dark mode. this, yeah, OK. OK. ⁓ Daniel (30:09) This is not telemetry deck, what you're seeing. because we still don't have a dark mode, because I should really work on that. No, what you are seeing in front of you is a screenshot from Grafana, which we use internally for stuff, for low-level CPU monitoring and stuff like that. But what you're seeing here is a ⁓ three-way split. You have a big chart. Below the big chart is basically a query editor that controls what data goes into the chart. And then to the right, there's a pane. Dave (30:19) Yep. rights. Mm-hmm. Daniel (30:45) that allows you to control how the data is displayed. Is it a line chart? Is it a bar chart? Is it ⁓ thick lines, thin lines? What title does it have? That kind of stuff. And all this is already low level in the query language. And so it's time to expose this in the editor better. All right, last cute animal because we're done. So here's an axolotl. Dave (30:50) Mm-hmm. Ayyyy Hey! Okay. And to be clear, I don't hate fraud lizards. I actually quite like them. But they don't necessarily fit. Yeah. But you've got an axolotl on screen right now, which turns out to be my youngest son's favorite animal and is actually, because he draws, he's got a caricature of an axolotl as his profile picture. Daniel (31:15) You're more like a no-frills type of person. Hmm. Dave (31:37) things. yes, he won't listen to my show. But anyway. Daniel (31:38) Awesome. yeah. Probably not. But yeah, that's a tiny overview over my plans. Lots of these things that I've talked about are already like partially in flight. a bit of like the async stuff is like the sync queries are already halfway there. Parts of the worker stuff's already moved. The dashboard state is like halfway there. We have also a feature switches to enable or disable these things. Dave (31:52) Mm-hmm. Yep. Daniel (32:08) which is really helpful because I can roll them out slowly and only for select customers at a time. And then the rest is gonna come. Dave (32:16) Nice. Is that an internal feature switching system that you've built or? Yeah. Yeah, that's cool. Daniel (32:21) Yes, yes. Basically, each organization just has a list of strings. And if you have the name of the feature in your list, then you're gonna be able to see the thing or use the thing. And so, for example, you yourself can turn on the sync queries for yourself right now. So some of the features are gonna be, hey, there's a new feature, do you wanna try it out? And others are gonna be. Dave (32:34) Nice. I see. Daniel (32:48) Hey, we're just gonna randomly enable this thing for 5 % of people. So yeah, that's what I'm gonna try to squeeze in between feature stuff because I'm hoping this will fix the experience, or not fix, but improve the experience. Dave (32:59) Yeah. So. Daniel (33:06) Thank you for traveling with Deutsche Bahn. Dave (33:09) That's cool, that's really cool Daniel. I love sort of seeing like a bit of an inside of your your brain here with where it's all going. ⁓ Daniel (33:20) Like I seem to be thinking in ⁓ keynotes somehow or like in presentation mode a lot. Like even if I write a text or something in my brain, a lot of the time I'm actually building a presentation. So I was like, I'm actually gonna build a presentation here. Even if. Dave (33:30) Yeah. It's not a bad shout, I think. There's something there that sort of then, because as well as that, it's nice and easy for you to give to Lisa even as well. it's not just for you to communicate with your development team, but it's a good way of organizing it just in general. And then you've got something that you can actually check back on this time next year. as you're putting together how things have gone, you can kind of look at what the vision was at that point. So I think that's, that's really cool. You can sort of do a bit of a retrospective with it. Do you want ideas from me? Do you want me to share some of my thoughts along the way? Like not necessarily about, I'm thinking more about how you're delivering this rather than about what the things are in it. Daniel (34:02) yeah. Sure. Like this. Uh huh. Yes. I mean, this segment has gone on for quite some time, but like, if you're not 100 % bored, I would love to hear some feedback. Dave (34:31) Yeah. So I'm wondering, you started at the beginning of the show with sort of describing how you're struggling to communicate priority and vision and sort of where you're headed with stuff and people are raising things that they see along the way. you know, that sort of colliding a little bit because there's already that plan. But I'm wondering, like, how do you structure work items that people are working on anyway. Do you have a ticketing system? you ⁓ God forbid Jira or anything like that? Daniel (35:07) Right. So right now what's happening is that we are using GitHub tickets somewhat, but the thing is that most of the time I'm the only person that works on, especially the backend side of stuff. Sometimes some of my coworkers will actually write pull requests, especially for the front end, which is really cool and helpful. Dave (35:14) Okay. you Mm-hmm. Daniel (35:28) Most of the backend is mostly me all the time. So if something comes up, mostly people will just like try to figure it out and work on that. There usually won't be tickets because we don't have a whole ticketing process right now. So people will just like make a ticket for themselves, work on it, write a PR and then ping me with, hey, I made something, look at it. Which works, but yeah, there's like some wasted time there for my coworkers because like... Dave (35:32) Okay. Yeah. Daniel (35:55) They don't have the full image. Dave (35:57) And does the risk as well of people overlapping work or getting merged conflict type scenarios if they're in similar spaces? Daniel (36:02) Right. Yes. The things are like there's not so many different spaces, like still like with Constantine coming back on board, who is like the new czar of the, of all the SDKs now. So all the SDKs are just like Constantine only. I'm not, I'm hoping to never be able, never have to touch them again. But of course, like, so what we, what we have decided is that we're going to meet up every now and then and just like talk high level about these things. Dave (36:15) Mm-hmm. Daniel (36:32) ⁓ and so this, what it just showed is like an even higher level, but like one, one layer down maybe so that we can actually like talk about things before they, before, before he works on stuff. but yeah, at some point, if we do, we have even more technical collaborators, there's going to need, there's going to need to be even more project management. right now the balance that I'm striking is I'm producing a lot of code and also other documents. And so I'm trying to do as little project management as possible, just because if I fall into that trap of doing a lot of project management, then I won't be able to do any technical work, which is ultimately probably the end result of the journey that I'm on. right now that would be the wrong way because we don't have enough Dave (37:00) Mm-hmm. No, Daniel (37:25) technical hands right now. Dave (37:27) That's right. Yeah, you're not there yet, but with having a team that you're then having to project manage instead of you doing a lot of the doing. But I think there's something there in terms of being able to group maybe some of the GitHub tickets together to make sure they're organized around your vision that you've just shown me. And I think there's perhaps something where you can look across Cause you'd mentioned squeezing this in around feature work as well. Yeah. Daniel (37:54) yeah, that's the other thing. So what we do have is a very high level roadmap of features and stuff that we want to release in the future. And so one thing that I want to do is actually put in roadmap items for these visions as well into that roadmap. So they actually have a place because that is also the other thing that I have realized that because like everyone, including Lisa, for example, Dave (38:03) Yep. Daniel (38:20) And also like people on the outside world, they would like to see features because for them it seems like, yeah, that's the thing I'm working on. I'm working on the features all the time, but it turns out that most of the work is actually, it was like maintaining and improving the entire system. And then the features kind of fall out almost by themselves. And so it is also the idea to put in, like to actually name these, this kind of invisible work so that Dave (38:35) It's a... Yeah. Daniel (38:50) it can have a bit of a higher priority. so I'm gonna, the, yeah, so the roadmap lives in Todoist actually right now. And so I'm gonna extend it with these items as well. Dave (38:53) Project Frild Lizard Project Axolotl Nice. Yeah, that was going to be the, the next thing I was going to suggest really is like you will, this is, this is a industry wide problem, right? It's a very typical thing is, is all of the teams that I've worked in. you end up with a, if you're in a bigger org, you've got a product owner who's trying to, trying to drive, you know, features getting out there and, and, wowing and wooing customers. then you may have a delivery manager in the mix who's trying to sort of wrangle like what's going on where against that ask. And then from the dev side, which is where I've been sat, you know, certainly as an engineering manager, then an awareness of the technical debt that exists in the code and the things we need to do. And so there's this tension and this trade off. And the way what I've The most success I've ever had has been what you've just described is making sure they've got items that are in the roadmap that everybody can see. And then it's not invisible work. the, the cell that I often have back to product people who only want shiny customer facing things going out the door. Is to tie the technical work very directly to a specific feature, a specific thing. So then it's a win-win, you know, we're, we're going to pay down this bit of tech debt or this improvement under the hood, but actually it then means we'll go faster on being able to deliver this particular feature. And then when you've got that, that win-win scenario, it's far easier to convince a recalitrant product owner who only wants their features out the door because they're they've kind of got skin in your game and vice versa. I mean, you're not at a level of organ size where you need to kind of do that sort of politicking or however you want to put it. like. ⁓ Daniel (40:49) Yeah, yeah. you say that, but I kind of do because the, the, the, management or the, the, the board basically that demands these new features is just our customers. And it's so easy for me at least, because I want to make people happy. It's so easy. Like people come in like, are asking like, Hey, what is, what is happening here? Like, why doesn't this thing exist? Why is this like, why is export disabled? The expert is disabled because like. Dave (41:11) Yes. Hehe. Daniel (41:27) the way we're exporting things is no longer working at all. But with namespaces and async queries, I can actually do exports on the fly directly now. I just have to finish building this. so also I've been like internally in my mind also like connecting a lot of these technical debt improvements to features just like you're saying. ⁓ And so let's see what happens if I speak about them more openly. Dave (41:36) It's nice. Yeah. And I think... one last little bit there from me as well as you sort of said about, you know, people asking you like, why is this not here right now? Or those sort of questions like, what I've found as well as that by having a stitched together in the way we were just describing, you can start to communicate when, and sometimes people can accept, you know, certainly like Sam, I'm thinking about ⁓ recall it from product owners or just people who are really eager to have a thing. They can accept not now, as long as you communicate when is likely. And so by having it road mapped out, you can start to be able to not necessarily put yourself on the clock for things, but be able to say that's going to be within this sort of window. Like we're going to get to that most likely in the next two or three months. rather than saying we're never doing it, rather than saying, shit, I need to drop everything now to make satisfied this request. Being able to just sort of say when is most likely kind of leaves things. Daniel (42:51) Yeah. I don't know if I'm ready to share a public roadmap because it changes too often. Dave (42:59) No, no, but it might, but you might be able to communicate approximate whens a little bit easier just by having it internally for yourself. You're doing that on an individual basis when people are asking. And that could be a, could be a thing. Because as well as that, you can then collect any of that sort of feature request or customer feedback or whatever. then when, and keep it somewhere so that when you've actually got to that bit of the roadmap and it's done, you can ping them back. Yeah. Daniel (43:34) The other thing that I'm doing right now is I'm resurfacing the bugs and paper cuts public issues repository on GitHub and every time someone writes in with something that's like a tiny bug, I'm putting it in there or even pointing people directly there so that I want to knock off a few of those because they're getting a bit too much and of course features are important but like snow leoparding is also important. Dave (43:42) Mm-hmm. Mm-hmm, it is. It is indeed. Well, dude, thank you for that. I sort of feel like that's been quite a deep dive into your business and I quite enjoyed it. Daniel (44:04) Yeah. Well, thanks so much for your thoughts, Bauer. Like, that's really helpful to hear. Like, okay, you're kind of having similar ideas, so I can't be out too much in the wilderness. Dave (44:20) No, no, you're not. I think that's going to be good. yeah, see, see what feedback you get from people as you go through it as well. That's the other thing is, is you've got your, your plan. But you know, you've got good people around you and if they have good ideas as well, like integrate them straight in, you know, be prepared for your plan to shift here or there left or right a bit. Cause you've got a team and that's, that's part of the the teamwork. mean, of course you get final say on the big stuff. But yeah, be open to that. ⁓ Daniel (44:55) Corners are rounded. They have to stay rounded. They're getting even more rounded. Dave (45:01) It's just going to be circles everywhere. Daniel (45:03) How's your project management going? You've been working a lot on VX, VXKit. How's your vision going there? Dave (45:07) ⁓ My project management's all over the place. Yeah. Look, I think we've almost got a show here and I don't want to go too deep before I go. But let's just do a quick recap, I think, of where I'm at with VXKit at the moment because I showed a bit less time. I can't remember properly whether we did a good screen share or not, but I'll save that for the next show. Daniel (45:17) Fair. Mm-hmm. You shared on screen shot like a slider that had bindings and you had like, don't know, like toggles and stuff like that, that kind of auto updated. Dave (45:43) Yeah. Yeah. So it's not worth me shake screen sharing at the moment because I've been kind of mired in a little bit of, ⁓ state and bindings, fell over as soon as I started adding child views and yeah. And what it, ⁓ uncovered for me was actually a much deeper crack underneath the, the, the engine that I built. So I had to sort of go slightly back to the drawing board with, I did a deep dive on how immediate mode GUIs tend to work because I'm learning this as I go, right? You know, I'm not pretending to be an expert on any of this yet. I did a lot of like looking up how on earth SwiftUI kind of does some of these bits as well. And then kind of pulled together a bit of a plan. I made a demo app that Daniel (46:19) obviously as we all do. Dave (46:36) didn't render through cross-platform. It was just rendering through metal and core image so that I could isolate just this bit of the architecture. And it comes down to scene identity and how you go, OK, I'm rendering this view. And views are a pheromone. So you're starting from the beginning again, each render cycle. There'll be other optimizations where I can cache stuff and this, that, and the other, but we're not there yet. Faramore View starting from the beginning. Right. It has this thing that is state. I now need to know that I am bringing a cached version from the previous render cycle out of store. Daniel (47:14) I love how you're pronouncing cash. Like, was like, I was like, seriously wondering, is this like one of the times where YouTubers pronounce things differently on purpose to collect? Dave (47:16) All right. Yeah. ⁓ No, I think I'm all over the place for moving from the UK going to New Zealand and speaking with Australians and all sorts of others. Yeah, sometimes I pronounce it the other way as well. So I'll pronounce it cash. There you go. Good old Johnny. Now then. So where was I? So I'm pulling states out of the previous render cycle to bring it back. And you need to know, OK, this one belongs to this view. This one belongs to that view. Daniel (47:31) Chat in the comments tell us how do you pronounce cache and arcade. Mm-hmm. Dave (47:51) And long story short, that's what I've fixed in the last couple of weeks is I've got that working well now. Child views are now rendering properly. I've got, which I needed, right? I want to have the fluidity of doing that. This isn't a, there's a couple of ways I could have gone. I could have made a widget system. I could have had everything. I could have avoided state entirely and actually had some sort of retained mode thing for this where everything is classes. But that's ugly AF, and I like SwiftUI's DSL, so I'm very much emulating that. So here I am. That's now working. In the process, I've actually, the rendering engine is now much more testable, much more concise. So I didn't have unit tests a couple of weeks back when I spoke. I now have like, 170 of them across the piece. Yeah, and I'm just, adding them for every new thing now as well. So that's, that's improving everything a lot. Yeah. And I'm now at the point of going, right, okay, this is basically working. I now need to make it prettier. Which is the bit I really wanted to be in, right? Cause again, it's like, Daniel (48:40) Wow. Dave (49:00) We spoke about this Daniel (49:01) Fantastic. Dave (49:01) before, but it's like the bit you see. And I am currently both customer, product owner, developer, all of it. And I need that dopamine as well of seeing something shiny. So that's where I'm at. hopefully by the next show, maybe I'll have something a bit prettier than what I showed you to look at. I've had some layout issues here or there as well. Like, turns out sizing things is hard. Daniel (49:13) Hmm. Tell me about it. Tell me about it. Like, one sentence, I'm trying to render text inside of charts these days because I want to have shareables for this year's Wrapped. I hate it. I hate it. Oh yeah, this thing is like 419 pixels wide. So I want to have margin and padding. How much do I, like, where do I put my pixels? I hate it. Dave (49:26) ⁓ yeah so yeah Okay. He Yeah. it's, it's a whole thing. and my, I feel for you there, like Swift charts obviously helps us an awful lot with, ⁓ with that. And, and this is the other thing, right? I'm going to have to build these things as I need them. ⁓ so yeah, ⁓ I'm very much in that world of sort of going like, okay, how do really want this to work? And also, sometimes having to sort of go, well, I can actually cut that corner. Do you know what this might work this way in SwiftUI, but I don't need it to be that, that, you know, typically what it is, is it's about SwiftUI has a lot of flexibility in it and a lot of ways of working. Whereas I can kind of say, look, you know, do you know what, if it just applies padding in this particular way, or does this in this particular way, it's my thing. And can I can live with that as another reason I'm not really keen to open source it right. So yeah, yeah. And I can go, hey, we'll get back to that when we need it. Daniel (50:53) Yeah, mean, also you can do that as you go along, Like even if. SwiftUI wasn't built in a day. Dave (51:05) Nope, nope. And I've got no intention to copy Swift UI feature for feature either, because the look and feel of what I'm building is never going to need or want to behave exactly as Apple's latest, you know, look and feel is even down to like how animations behave, how transitions will behave, that sort of thing. It just needs to be my apps UI to the world. Daniel (51:31) Right. Dave (51:32) And there's going to be some, some benefit in some ways of not trying to follow that too hard because ultimately I want it to run on all the things that's, that's why I'm not just using Swift UI. One of the reasons. Yeah. so if I start going, okay, make it exactly do a slide over exactly like iOS currently does to then have to update it next year when something changes or whatever. Yeah, that that's not needed. Yeah. Daniel (52:00) Yeah, and also like, mean, you want to have something that's kind of distinct. I mean, if you're just like copying everything visually, then it's kind of, kind of a mood point. So that being said, yeah, that being said at some point, if you, once you are in the, completely in the making it pretty phase, you're going to have to look into shaders with signed distance fields or something. Dave (52:07) There's no point. Yeah, there's no point. So I'm not building flutter. I'm not building, ⁓ compose, you know. It's going to be fun. It's going to be a lot of fun. I've got, there's a whole load of stuff that I want to make it look like. that's, that's really like, at the moment I'm in the next stage of making it pretty, which is sort of building out my, modifiers and that end of the DSL that sort of gets into, you know, borders, curved edges, making sure I can set gradients on things if I want to. that sort of thing. And then once I'm kind of done with that, I need an animation part of the engine. And then when that is sorted, yeah, exactly. We'll see. Falls rush in and I'm a fool. But no, and then after that, it'll be into how I want navigation to work to some degree, which will be some basic. Daniel (52:56) How hard could it be? You Dave (53:09) again, some basic animations to bring in overlaid views and that sort of thing. And then maybe we're done for now. And I start building out the prototype app. That's sort of where it ends. I've got state, I've got all of this DSL. I now need to use it in anger building out the new app that I want to build and accept that that's going to get to some level where I then hit gaps in what I've built and I'll have to go back a little bit. But that's the only way I'm really going to learn about this. And if ultimately it's a vehicle for me to to build my apps with, the first proof of the pudding is actually trying to build an app with it. So yeah. Daniel (53:49) Yeah, yeah, you should probably like, like the earlier you get to that part, the better you can really see and have fun with it. Dave (53:55) Yeah. The main reason I'm putting it off for now is that there will be other things the app will need in terms of like, OK, I'm going to integrate MIDI imports or I want to have networked OSC control or whatever. And I don't want to get sidestepped from making this work by thinking about all the guts of an app on it yet. ⁓ But that's the broad plan. Daniel (54:07) Of course. Mm-hmm. Dave (54:24) Hopefully actually in building app mode at Christmas time would be nice. Yeah. So maybe I'll have more pretty to show on the next show. That'd be good. Daniel (54:29) Nice. Awesome. I'm very much looking forward. Like I'm not a big fan of Christmas, but this might make Christmas a tiny bit funnier. That being said, I hate Wham's Last Christmas, but I love Mariah Carey with All I Want for Christmas. Like somehow, I don't know, I'm just a Mariah Carey fan. Dave (54:52) Yeah, I didn't like that song. The problem was that I have a younger brother, James, if you ever listen, mate, shout out, who loves Mariah Carey. Like he loved us so much when we were little and he was only like, I can't even remember, six or eight or something at the time. And being the older brother, I was like, yeah, right. don't want to, he wants to put that song on again. Daniel (55:02) Hey James. Dave (55:20) So for years I couldn't, didn't want to listen to Mariah Carey's Christmas song. And these days, no, now I've come back round. So I'm with you on that one, Daniel. All I want for Christmas is much, much better Christmas song. And yeah, these days I listen to it and actually it reminds me of James and it's kind of cool. Daniel (55:26) You don't want the mainstream thing. Like, we all hated the mainstream thing. Thank that's awesome. That's nice. I like that. Dave (55:45) Yeah. ⁓ but yes, I will be playing Whamageddon. So do not Whamageddon me. Yeah. Yeah. I didn't make it that far last year. Daniel (55:50) Me too. Me too, me too. All right, all right. Let's see, let's see which one of us, which one of us holds out longer. Like I will inform you the minutes I get whammed. Dave (56:01) Okay, that's cool. The temptation to play it at you and Wham Again and us both on the next show is a hype and I will hold off. That's what I thought, yeah. But hey, here's the deal though. What I will do is play Mariah Carey's song at least. Daniel (56:08) Hahaha at least we'll go down together, I guess. Dave (56:25) in part of the show when we get to the last one we record before Christmas. Daniel (56:27) Can it? rights-wise? Dave (56:31) Little clip, tiny slice. Daniel (56:34) It's a tiny, just a tiny part, just a tiny part, tiny slice. Right. Shall we think of a chore that our listeners need to do? I think one of the chores could be, because like by the time this episode is out, like to just like get off your asses and buy a Telemetry Dex subscription with the Black Friday discount, because by the time you listen to this episode, Dave (56:40) Yes. Daniel (56:58) It might not even be on the website anymore, but I know from a source quite close to the company that the coupon codes actually, they last a few days longer than the actual week, just for stragglers. yeah, get yourself almost half off a yearly plan, which is kind of nice. Dave (57:11) No worries. and hi. If I'm tardy on putting this episode out and somebody contacts you and goes, hey, I've just listened and it's not there and I can't find it, can they message you, Daniel? Is there a conversation to be had? Daniel (57:28) Yes, but they'll have to say all I want for Christmas is a discount on telemetry deck. Dave (57:35) Fine. Fine. Okay. So there you go listeners. There's the route. I think it expires once Christmas is gone. Daniel (57:37) Also... Right. Also, you already have Telemetry Deck and or don't want to pay for Telemetry Deck, your chore instead is to dust your Legos. If you have Legos, they are probably very dusty. And so get yourself some sort of brush or something and dust them off. They will look way cooler that way. Dave (58:00) Yeah, words to the wise, don't directly use a electric duster on them. You will have pieces everywhere. Ask me how I know. Ask me how I know. Daniel (58:08) So what I usually do is I have off-brand Swiffer, and that's pretty good for just dragging it over the models. have the space shuttle right here behind me. Can you see that? I can actually see that. Cool. so that is something that I just like with my... That's pretty good. Dave (58:17) Okay. Yeah, yeah, yeah, yeah, I see him. Yep, now that works. And it's meditative, so it's not just a chore, it's good for you. All right, well, and if you don't, and if you don't have any Lego, do something else. There you go. We've gone over the whole chore range there. Daniel (58:36) It is good for you. All right. Fantastic. Just something else. Right, find something that works for you. Doesn't have to be perfect, but just make your space a little bit nicer. You deserve nice things because you're lovely and we love you. Thanks for listening. Please rate us on iTunes and YouTube. us emails at contact at waitingforreview.com and join our Discord. The link is in the show notes. Dave, where can people find you on the interwebs? Dave (59:05) You can find me at mastodon.social slash at. I can't even remember my username. I'll put it in the show notes. This is how long I was off mastodon. Never mind. Otherwise, I am back ⁓ and I'm on Blue Sky as well. But again, show notes for that, please just click them. Have a look. They'll be linked in the bottom. Otherwise, hit up Instagram and search for light beam apps and you will find me. Daniel (59:15) You You are back though. Awesome. Find me at danielatsocial.telemetrydact.com. That's also Macedon. Also like I assume all my socials are also linked in the show notes, I guess. So yeah. Dave (59:41) They will be. are every time I put them there, Yeah. Daniel (59:46) Fantastic. Dave, see you soon. This has been an absolute pleasure, as always. And yeah. Dave (59:50) It has gone get some sleep, man. It's like for you. Daniel (59:55) I will do that. then tomorrow I'm going to go sporty sport, I think on a bike or something. Dave (59:59) Nice. Well, take care Daniel. Enjoy and I will catch you again soon. Daniel (1:00:04) Bye!