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