Orual 1:03 Okay. 1:04 Yeah. 1:05 So I'm Orwell, and Jacquard is the app proto library that I wrote. 1:11 And yeah. 1:14 First, I'm going to do a bit about me. 1:17 I'm embedded in Doff at this point. 1:20 Everything else, developer. 1:21 I design electronics. 1:22 Utopian, App Proto kind of hit me like a truck, like it did a lot of people here. 1:28 And yeah, got kind of, yeah, very, very into it. 1:33 I was trying to figure out something that felt right to contribute to the atmosphere, a bunch of different things. 1:39 And yeah, this is Jacquard and a few different things are I've done— or what you might call spite-driven development. 1:47 This was a point where, yeah, we had— there were plenty of add photo libraries at the time, but they all kind of sucked to work with, especially back when I started. 1:58 There were a couple of notable exceptions, but none of them were in Rust, which was my language of choice for a bunch of reasons I'll get into. 2:05 I ended up putting another project on hold because I got frustrated. 2:09 And some other friends had similar frustrations. 2:12 And yeah. 2:14 A lot of this came down to— how's that? 2:18 Oh, I gotta be on— I gotta be on this screen. 2:22 There we go. 2:23 Yeah. 2:23 A lot of this came down to issues with code generation. 2:28 From lexicons, GraphQL, everything you generate, you have How you specify what you want, and then you need code that does that. 2:39 You either handwrite it or more likely you generate it from some state, be that JSON, be that GraphQL, be that whatever. 2:46 And unfortunately, most of these fucking suck. 2:50 You end up— so you generate all your bindings. 2:54 You spend way more time, or these days LLM tokens, writing code around them to make them actually usable. 3:02 And yeah, this isn't just an app proto problem, but it hurts more here, both because lexicons, and like a lot of them, and especially in the ecosystem for people wanting to not just play in blue sky sandbox. 3:17 But we do not have to live like this. 3:19 And inasmuch as this talk is about the thing that I'm doing, it's also a no, this is something everybody else can do in whatever language, whatever you can we can do this better, especially now. 3:40 And so yeah, it's like, why Rust? 3:42 For me, this was my language, and it is kind of at this point the only language you can run it base, literally pretty much anywhere, and it's actually not completely stupid. 3:52 Like, you can run a lot of things a lot of places, but you would be hard to find defensible reasons. 3:59 You can at least find defensible reasons for Rust, although there's— if you're running Rust on your full stack, you better be a my kind of pervert. 4:07 A real sicko. 4:10 Yeah. 4:13 And so yeah, it has a— excuse me. 4:22 It has a reputation as a difficult and demanding language. 4:26 The reputation is sort of deserved and sort of not. 4:30 And of course a lot of Rust libraries go a long way to improving on that state. 4:35 And of course, yeah, it's like one of the reasons why I am a fan of it is that essentially, like, especially coming for me from the C world, the things Rust forces you to think of, the things that people consider demanding, difficult, of things you need to think of anyway, and it makes them explicit. 4:56 And of course, like, the whole point, we can make the sharp edges easier if we care to. 5:02 Yeah. 5:06 And again, we do not have to live like this. 5:09 And of course, and this is the thing, this is peripheral to sort of the whole talk, but this is One of the things that I came out— ran into that I didn't necessarily expect in the development of Drakkar, and it's basically parse don't validate can only take you so far. 5:28 This is kind of a truism that you get, and especially among Rust devs, among functional programmers. 5:35 But the thing is that there's a limit, especially depending on how your language handles errors. 5:41 Yeah, if serde::json or— serde-cbor can't parse something as the type you're asking of it, you will just get an error. 5:48 It does not give you the partial. 5:51 And this is not something that I've got a good solution for. 5:54 But it also— but the lack of good solution for it gets us to a different place. 6:00 And hang on. 6:04 I just got— And so yeah. 6:14 And so yeah, it's like Atrium, previous goto, atproto, rust crate, they had typed numbers. 6:20 The number, it wasn't just i64, i32, i8. 6:26 It had a type and that type encoded the limits, which is cool. 6:30 It's very interesting in theory. 6:33 In practice it's a huge pain in the ass and this is partially the fault of Rust. 6:36 Rust's type system does not handle that very well. 6:40 And Jacquard until recently mostly just put these as code comments in generated APIs. 6:46 It's fixed that. 6:48 And yeah, it's kind of the thing. 6:53 And yeah. 6:54 And of course one of the challenges is like you've got methods for partial understanding. 6:59 And this is something that I've really— Tried to push as far as possible in this without— where you can have arbitrary data. 7:09 And I will tell you that that's a lot of what's going on in the backend here. 7:13 And I'll show you more about that in a minute. 7:20 Where'd the timeline go? 7:22 Oh. 7:22 It's off over there. 7:24 Anywho. 7:25 But yeah. 7:26 So it's like Jaccard has a data type. 7:28 Which is @proto-informed. 7:30 It says all of this. 7:31 It tries to derive, understand just by looking at the JSON or CBOR what it is, what it's likely to be, and to work with Freeform data in useful ways. 7:41 But it doesn't, of course, handle the scenario where you have something that almost fits but doesn't. 7:46 For example, you have a— and I already showed you in the next slide, or the next bit. 7:54 For example, you have a whole feed of posts and one of them has an invalid handle. 7:59 One of them had— or something else that doesn't validate, but the handle is the really common one. 8:07 And yeah, this was downstream of a GitHub issue I got early on in the development. 8:14 And yeah, it's just a shitty developer experience, a shitty user experience to have to do that because you fall back. 8:20 You don't have to fall back, you don't have all your— like, yeah, it's like in Jaccard you would have this, which is good, but it's still not your type, you have to do all this extra work. 8:31 Yeah. 8:32 And so yeah, that is, for example, why Jaccard has a carve-out for the specific invalid handle, and there's a few other things like that in the library. 8:41 And the decision of when to do that versus not has been a fun thing. 8:46 It's time to follow the spec. 8:47 There's a time to refrain. 8:52 And yeah. 9:03 Keep getting off this. 9:05 And so yeah, as much as— and so this is sort of, yeah, it's like my pitch, obviously, for my thing. 9:11 And I think everybody else can like this is like— we're all getting better at this in this ecosystem, but we can go so much further. 9:20 It's like you have stuff that does the work that it can for you, make it very, very easy pluggable. 9:29 So that's in the Rust case, this is everything is traits, everything is generic, but not generic in a way that screws— that is a lot of work. 9:39 Has good defaults. 9:42 And then, yeah, obviously for me it's like API codegen that you can just work with. 9:47 Like it ends up being reasonably pretty as of a few weeks ago. 9:51 And yeah, Jacquard, if you're familiar with Rust, you know lifetimes. 9:55 Lifetimes are everybody's favorite thing and they're important, but they're also one of the things that I got the most comments on. 10:03 It's like this makes this harder and I didn't want to have that be a barrier. 10:07 And yeah, honestly, it's funny because I didn't actually anticipate— I knew sort of when I started writing the library that picking this fight would be a barrier. 10:18 But I kind of assumed everybody would figure it out. 10:22 And I also couldn't— and also honestly, I hadn't figured out a good way around it until, amusingly, I was looking through some of Fig's code and found a really interesting library there. 10:34 Which we'll discuss in a moment. 10:36 Oh, before I go back to that, what you're seeing in the background— we'll catch up to real time here. 10:43 And we'll see this is the time helix. 10:50 It was like I got— it's like this— so amusingly, this was— yeah, it was like I was wanting to do some sort of visualization and not sure exactly how to end up. 11:02 And this was where I landed because somebody posted this and just like kind of nerd sniped the hell out of me. 11:07 And so this is Jetstream. 11:10 This is everything coming in. 11:12 Well, is 1 in 10 of everything, of everything of blue skies, everything of everything else. 11:20 And yeah. 11:21 So you can see, and you can see how as we go here, like as whatever I'm mousing over shows things. 11:27 And so this is actually, again, Yeah, so this is hitting these— obviously, some of the data is in the Jest Stream data itself. 11:35 But then it's also pulling on the refs and, of course, Constellation fig photo for the win. 11:41 Getting some of that. 11:43 Yeah. 11:43 And again, it's doing kind of as generic— like a generic UI thing. 11:48 And the fun thing is that— let me get back over here and see if we can make this happen. 11:55 Because you've seen me editing text. 11:58 That's how I've been editing the slides. 12:02 If I— I will probably break something. 12:06 But we'll see. 12:08 Yeah. 12:12 Let's see. 12:13 Where do we want to— Because yeah, this is all running on this very, very hardworking little i5 here. 12:24 On the conference Wi-Fi, so I'm impressed it's held up as well as it has. 12:31 But yeah, and so, yeah, as you can go, yeah, so you can, yeah, as it hits the BlueSky app, you get the profiles, just because that was easy. 12:39 Yeah, but, uh, where has it gone? 12:47 I'm finding, I am trying to find my damn Yeah. 12:51 OK. 12:52 Yeah, no, I'm not going to go way too far into this. 12:56 But yeah. 12:59 And yeah, you can change things. 13:02 And yeah, a lot of this is— so what this actually is, this is Bevy game engine. 13:09 This is their UI library just rendering all the slides. 13:13 And I can— and yeah, it's hot reloading. 13:15 Everything from the disk. 13:17 And so everything sort of streams there. 13:20 And because, yeah, like the other fun things. 13:22 And so yeah, it was like this was something just like over a couple of weeks and kind of go. 13:28 But yeah, and this is all sort of very straightforward. 13:32 And a lot of this is as easy as it is because of services, because of tools everybody else has built here. 13:38 Like everybody in this ecosystem stands on the shoulders of giants. 13:42 And yeah. 13:45 You are making a dent in slingshot metrics. 13:51 I bet. 13:52 I bet I am right now. 13:52 I'm very sorry. 13:53 I will— OK. 13:57 I wasn't sure how badly that would show up, because yeah, I am hitting that quite a lot. 14:02 Yeah, yeah. 14:03 All right. 14:04 Yeah. 14:06 And oh, yeah, the other thing. 14:08 I'm going to— yeah, one more. 14:13 Because yeah, this was— like I was saying, with the borrowing— oh yes, I keep forgetting I need to get the window back in focus. 14:30 There we go. 14:32 So yeah, this is why you ended up with the borrowing. 14:35 There's like you can either do unsafe in Rust, you can do separate borrowed-only types, and then you end up— okay, so now like Rust is a language that has 8 types of strings in the default, so yeah, that plus however many proto-lexicons, that didn't feel achievable. 14:55 Then there's a kind of like ByteMock, or then there's the borrower share, which was the thing that I found And so, yeah, Jacquard is getting some fun things like that that made this all possible in the sense that it's a little harder. 15:09 And let me pull something over from my display here. 15:18 So yeah, this is the presentation. 15:24 There's the slides. 15:26 QR code. 15:30 And yeah, a lot of this is Bevy. 15:32 This is very fun. 15:33 But yeah. 15:35 And then you can kind of hit— yeah. 15:39 And so actually this provides— let me minimize this. 15:44 How big is the font here? 15:45 Is this too small? 15:46 Too large? 15:47 Okay. 15:48 So yeah. 15:49 And this is actually kind of a good illustration. 15:54 Jackard provides a WebSocket client. 15:58 Runs on the Tokio runtime. 16:00 Bevy doesn't really like that, so this is a basically real implementation on the small async runtime. 16:08 It's like one little source file because it's a very simple trait, and then you can immediately plug in everything else in Jackard. 16:15 Just pick that one bit out. 16:18 There you go. 16:19 And I didn't end up using this. 16:21 Oh, we'll get to that. 16:24 I didn't end up using this because I did end up using Tokyo and requests. 16:30 But this— but of course, Bevy is not async friendly, which makes a lot of sense as a game engine. 16:38 But you can just do— yeah, so again, this is another— jacquard has a client trait and this is an implementation of it. 16:47 And then on top of that there is a sync trait and a polling version of it that supports. 16:56 And again it follows in the same pattern. 16:57 So you interact with it pretty much the same way. 17:00 And yeah, it's like this is sort of example-wise and not intended for like use, but you get the idea for I was like, this is why I like what I've built, because it makes this kind of thing a lot more straightforward than it would have been otherwise. 17:21 Because yeah, like if— I don't know. 17:24 Yeah, is anybody else working with some of the others? 17:26 It's like, OK, so I want to color outside the lines. 17:29 How do I color outside the lines? 17:32 The goal is for that to be easy, but for coloring inside the lines to be rewarding. 17:36 So yeah. 17:39 And so yeah. 17:46 That's kind of my presentation. 17:49 I don't know how— I've got lots of time. 17:51 But I figured, yeah. 17:52 Yeah, we've got lots of time for questions. 17:56 So does anyone have any? 18:01 Yes, I'll just wait so the streamers can hear. 18:10 I'm actually wondering about your background there, because this was— I saw on Blue Sky someone posted, or the person on EarthNight too, about vibe coding something like this. 18:27 Oh, cool. 18:30 That's pretty neat though. 18:53 Thought that goes into, especially in Jacquard itself, what do you do in terms of LOM use and in terms of, okay, how do you maintain a quality, how do you maintain a good output? 19:10 And honestly, I can't break those because they're not thread-mounted. 19:18 Oh, sorry, there we go. 19:27 My bad. 19:28 Yeah. 19:32 Right, yeah, so how far back was that turned off? 19:37 I'm trying to— or do we just want to move on? 19:41 Yeah. 19:44 Next question. 19:45 I saw a few more hands here. 19:47 Yes. 19:52 So cool. 19:53 I want to know like what are the kind of recursive helices in your visualization represent? 20:01 It's basically intervals of time. 20:03 This is like the largest is I want to say— what did I end up— what did we end up with here? 20:10 Yeah, so it's like you ended up with sub-second level time, and then you ended up with like, yeah, it was like kind of seconds, minutes, sub-second. 20:20 Yeah, because of course Jetstream is so fast. 20:23 And if you noticed when you have the slides up, it slows down and you see it go past, and then pull the slides down, it catches back up. 20:35 And you can also pause. 20:39 You can go back and forth and around. 20:46 This gets a little laggy as it pulls things in. 20:48 But yeah. 20:50 There's an SQLite database that this all gets dumped into for all the past events. 20:57 Yeah. 20:57 [Speaker:AUDIENCE] What's the color? 20:59 [Speaker:JULIA MADDALINA] The colors are different lexicons, actually. 21:02 So it's mostly the common ones. 21:04 And then it's like you see the little yellow ones. 21:08 Those are non-BlueSky lexicons. 21:10 Most of them will be account events. 21:12 That's the common one. 21:13 One thing that I'm curious about— and actually, let's go look. 21:17 Because yeah, let's go. 21:21 Can we get back? 21:23 There was a— there we go. 21:27 We got there. 21:29 There's this little— I keep seeing these little clusters where it's like a bunch of— yeah, they're follows. 21:38 Yeah. 21:38 I wonder if this is like somebody subscribing to a starter pack. 21:44 Could be. 21:44 Or bots. 21:46 Definitely could be bots. 21:47 Bots and starter packs. 21:49 All the Blue Wave people following 20,000 people. 21:54 Yeah, I'm just like, I wonder if you could like just talk to like how at a high level it kind of is using Jackard like in visualization. 22:06 Honestly, this is very high. 22:08 Yeah, so this is pretty high level in the sense that like I said, like I did reimplement a couple of the traits because I needed to. 22:20 But in terms of where is it? 22:21 Yeah, it's like this is the spot that has a hit. 22:24 A bunch of Jacquard stuff. 22:25 And you're going to scroll through a bunch of Bevy UI stuff here. 22:30 But you can see this is— yeah, it's like Jetstream messages. 22:34 And then pulling out— and a lot of this is using kind of the partial understanding stuff, Jacquard's arbitrary data type. 22:43 And you kind of— where is it going? 22:49 But yeah, and it pulls out embeds. 22:52 And actually, where did that go? 22:57 Trying to remember where I had that. 22:58 Because I did in here. 22:59 I'm trying to find it, but I also just don't want to try to like Ctrl+F for it. 23:13 Yeah. 23:14 Yeah. 23:14 Okay. 23:14 Yeah. 23:18 So this is a fun one. 23:19 So this is— the response types for Constellation. 23:22 And this is a struct for it. 23:24 DID collection, our key, we just did strings for simplicity. 23:31 And this is the get backlinks query. 23:34 blue.microcosm.links.get_backlinks. 23:35 This derives XRPC request. 23:37 And this basically generates all the code that drives everything else. 23:41 And so when you— and so how Jacquard works is as we get in here. 23:50 OK, yeah, this is— does this function have the call in it? 23:53 Yes, it does. 23:54 So yeah, so this is a get profile call. 24:03 This is hitting the Blue Sky app view. 24:08 And you basically just send it. 24:10 This is— implement this on the HTTP client. 24:13 Yeah. 24:14 And you just send it. 24:16 And you go wait. 24:17 And then you match on the response. 24:19 You match into output. 24:20 This gives you a nice owned easy to work with version. 24:24 There's also parse that borrows from the buffer. 24:28 And then, yeah. 24:29 And so if you get a success or you get the defined xrpc errors, also again from the lexicon. 24:35 And yeah. 24:35 Doing a lot of handling with that. 24:39 And then yeah, this is the request enrichment. 24:42 This is where we're hitting Slingshot. 24:43 And again, like, Jakarta actually has a built-in Slingshot helper that just hits it, which I need to change to use the blue.microcosm. 24:58 It still uses com.bat.example. 24:59 But yeah, and so yeah, again, FetchRecord Slingshot. 25:01 And Jakarta also has FetchRecord. 25:03 Or get_record that gives you a specific collection type. 25:07 If you want a profile, it will give you the generated profile struct. 25:12 And yeah, this is for arbitrary data, which is why it's hitting that. 25:19 And again, yeah, you can kind of— and here's Constellation. 25:28 Yeah. 25:29 And so you have the Constellation base URL and then construct the query, xRPC, send it. 25:36 Yeah. 25:37 Incredible. 25:37 Thank you. 25:38 So yeah. 25:38 I'd say, yeah, it's like this is— that's kind of how it works. 25:44 That's how you use it. 25:44 And the whole goal is that you don't need to do a whole lot beyond. 25:56 Awesome. 25:56 We have time for maybe 1 or 2 more questions if there's any more in the audience. 26:03 Yeah. 26:03 Yeah. 26:04 Could you speak again on what the— did you say that you did make refactor to the lifetime challenges or you have intended ideas? 26:17 Oh, so there— yes, I have. 26:22 No, I've got— is it good? 26:26 Yeah. 26:26 OK. 26:26 So yeah, up on Tangled, there is a beta branch. 26:33 Bos-beta, and that I did this over last weekend. 26:34 Not this one. 26:34 Good lord, not this one. 26:36 Yeah, over the previous weekend I did refactor away, and that's why you're not seeing a whole bunch of lifetimes in here. 26:42 This is the beta of that. 26:44 And so yeah, I didn't want to go straight to like pushing that to main because there are still some things that is broken on it. 26:57 In particular, the lexicon— there's a lexicon-derived macro that still needs a bunch of fixing. 27:05 And I'm sure there are a bunch of other bugs. 27:10 I found a couple when I was building this. 27:15 And so yeah, that makes a lot of things much more possible, especially around inter-process communication. 27:24 For example, the deoxys library has a it requires you to have the deserialize-owned constraint, which Jacquard previously cannot support and now can. 27:30 So yeah. 27:34 If people want to try out the beta, it's there. 27:36 I can maybe cargo publish it as like a beta version if that's better for people. 29:19 But yeah. 29:22 Awesome. 29:22 Thank you so much, Orwell. 29:26 Thank you. 29:27 This was very inspiring. 29:28 Also, hang on. 29:28 Hello. 29:29 Does that work well? 29:34 Right. 29:34 Okay. 29:34 The last talk of the conference. 29:38 I'm quite tired. 29:26 I hope you are awake. 29:28 This is going to be not too technical and I hope a bit entertaining. 29:34 Wow, that's a good start. 29:36 Yeah, my name is Hilke and I'm here