Hey, folks, welcome back to another episode of JavaScript Jabber.
This week on our panel, we have a j O'Neill Yoh.
Yeah, coming at you live from the sickness. Oh no, I'm feeling better today. Yesterday I was a little under the weather. I just slept all day and I feel good. I'm just a little groggy.
I still have some turkey soup from Thanksgiving. Maybe i'll drop by.
I'm Charles Max from.
Top End Devs and this week where we have a special guest, it's ONNSE.
Sorry I don't have your last name in front of me.
I usually my last name is Ko, but that's like even more difficult. Don't worry about it. Nice toy. You guys very happy to be here.
Yeah, the foreign names kind of throw us off. Sometimes you want to introduce yourself real quick. I mean, I have jazz dot tools is something you work on.
But yeah, sure, So I'm like, broadly speaking, a full stex software engineer. Have worked kind of as a freelancer most of my life. I'm originally from Germany. I live in the UK now and I kind of just kept building apps for different companies, always kind of taking them from zero to one and just felt like I'm always doing the same stuff and I never really had a good answer to how to solve that problem until I ran into what is now known as local First, and
that kind of became Jazz. That's like my mini origin story on that.
Awesome.
So, so are you the main person behind Jazz.
Yeah. So I've been working on it for a bit over four and a half years now, and then since this summer it's a company and I raised some funding and so on. But before that it was just like my side main project.
Nice.
Nice.
So I just have to ask, just right off the bat, because you said local first, you go to jazz dot tools dot or jazz dot tools. I almost added to that, but guys, there's no dot com. It's Jazz dot tools on the internet, and it says local first, and of course my brain goes through is it one of these eighty different things?
So do you want to just kind.
Of explain give us some context of what kind of apps we're looking at and what you mean by local verst so that we're not talking about things different things that people are thinking, oh it's this, and then we're talking about this other thing.
Yeah. Sure, So, like local first is kind of a new term and a new sphere, Like everyone who is into it seems to have bumped into it their own way, and it means because it's so early in the movement, it means a lot of different things to different people, right, And I think what everyone has in common in terms of how they would define it as like you move away from the traditional stack model where you have a back end and a front end and most of the
authoritypive state lifts in your database and the beckend interacts with that, and the front then kind of sense requests
to the back end. You move away from that to a new model where you try to keep as much state as possible or maybe even all state in the client and you just write youI around that as if you were building basically an old school offline app that just writes to memory too disc but then that state gets synced to other participants because of course you still want to interact with other users, maybe even have real
time multiplayer that sort of stuff. So you kind of the way I like to look at it is it is that we're so used to the traditional stack as like, obviously that's how you build web apps, but if you think about it, what the stacks do is they just facilitate sharing state between users, and the way they do
that traditionally is by having like centralized authoritative state. And with local first, you just turn that problem around and you like, what if everyone kept state locally and then how do we sink between participants?
So this reminds me a little bit of how things like web RTC works, right, where you can have a lot of times there's a server that kind of coordinates, so people will hit the server first and say.
You know who else can I connect to?
But then you can do peer to peer video, right, Or you've got other peer to peer apps where kind of like BitTorrent, I guess right, where if you know where the other participants are, you can go ahead and share in this case as parts of a file.
But it's the same idea, right.
Yeah, And like I really like this comparison because that lets us get into more precisely what it is, because something like web ARTC or BitTorrent that's mostly about the transport mechanism, like how do you find the other peers? Local first is kind of like almost orthogonal to that you can do local first in a peer to peer way. But you can also do it with some centralized sinking infrastructure,
which is what Jazz tools implements. For example, what local first is about is mostly solving the problem of well, if you write against the state as if it was local state, what should happen if multiple people added the same piece of content. Again, in the traditional stack model, this problem doesn't really exist because it just depends whoever's request comes first, and then there's one central state. In this case, you have distributed state, and how do you
solve for conflicts and distributed state? And what you get then is something that works very similarly to GIT. And again, different local first frameworks or services do different things, but what seems to be the most common is to rely on a technology called conflict free replicated data Types or CORDTS for short. That's the term that's starting to be thrown around more. That's an idea that JAZZ is based
on that many others are based on. And the way I like to illustrate that is that it's very much like GIT in that have your local state that you work with, and then you share your edits with other people and there's something akin to merging and contract resolution. The difference to get is that it's much more fine grained well, and get you kind of do pretty large commits right over, like maybe an hour's worth of time
or something for crdts. Imagine if you made these commits smaller and smaller until like every single keystroke and every single edit of an object property becomes a commit, and then that's what you think to Actually, objects no longer are like their current state, but they're just represented by the entire history of everything that ever happened to them. And again, I have to be careful here not to get too specific to how jazz works, how jazz interpret crdts,
but this is like a common story. And what Jazz does basically is you as the application developer. It gives you an API that makes these objects look like simple, mutable objects that you can write to and read from the hood. It converts these edits into changes in the history, and then kind of reconciles that history with everyone else who's interested in the same object based on their edits. Does that start to give you an idea?
Right?
It sounds a little bit more like Google docs, where you might have multiple people editing the same file or the same dock at the same time. And as they type, shows up on my page, and as I type, it shows up on their page. And if we're typing over the same space, then yeah, it's got to figure out, Okay.
How do we figure out whose edits.
Or what exactly? And it's kind of clear how that's useful in something like Google Docs where you have real time communication. But the way I like to think about it, and to get back to your original question of like what kinds of app is that for? There are a lot of people who are saying, like, look, there's this new niche of local first apps where this kind of way of building apps is particularly suited, and you can
see that with your Google Docs example. But my approach there is to be like, no, this is actually a better way to build any kind of app, and the real time multiplayer is kind of just the extreme case, and anything less interactive than that can still be solved with the same pattern. And one of the major other features that you get from local first is that it is offline first, because you can write against you state locally.
Even if you don't have a connection, your app keeps working, and you just think when you come back online, and you can kind of imagine the spectrum of like really intense, really interactive real time multiplayer on the one end, and like being completely offline on the other hand, and then in the middle you have something more like a traditional app where you have like some multi user collaborative app like a productivity app, or maybe a social network where
you have some frequency of interaction. And so far we needed very different ways of building apps and frameworks for each of these cases. But Cordts and the idea of local first is actually something that lets you solve all
of these cases with one abstraction. And what's nice there is that you don't have to choose what kind of app you're going to build because some parts of your app some features might be more real time, some features might be like less frequent updates, less collaborative, more personal, and so on. And that's kind of what really got me into the idea and where I'm like, oh, this can actually solve a lot of things.
So one thing I often ask is what is this not a good use case for? Like when would I not want to use this? Because I think hearing we can use this for anything is a little bit it's not helpful to know, like we can use it for anything. So I think sometimes knowing what we shouldn't use it for helps us to better understand why it's actually really useful. So when would I not want to be using local first or jazz?
So I'm going to give you a really annoying first answer, which is nothing and and kind of like the counter question, like what is React not good for? Within web? Absolutely?
Say, you know you are knowing the wrong man about that.
What's what's your favorite pick?
Yeah?
Mhmm, what's your favorite pick other than React? No?
I don't. I don't like React?
What what would you?
What?
What would what would you?
I just so, so, first of all, I mostly do back end or library so I do. I do tons of front end code, but my front end code is is in libraries where your people are are used using it as a as a library. It doesn't matter whether it's back in the front But when I do JavaScript on the front end, I just use JavaScript. Now, like
the dom is so good good, I'm not. I'm not building things that are large enough or I don't even know things exist that are large enough that just JavaScript as it is isn't good enough these days?
Fair fair enough, fair enough? Okay.
It's very similar to AJS where I use a framework called Stimulus, and then I use another library called Turbo, which is a lot like HTMX and.
So interesting. So it very gives me a way to organize my dom calls.
Cool Okay, So yeah, my comparison there would have gone nowhere because I'm used to to talking to very different people who are very into React. So I would ask them back, like, well, what is React good for? And they would say, well, any kind of That's kind of what I was saying at.
To React is really good for things that have infinite scrolls. That's what React was designed for. That's what it's really great at.
It it so my my thing, and maybe this will give you a better way to answer this, right, is I feel like there are trade offs?
Right of course?
Sorry, that was the first like annoying part of my answer. To be more precise, like, I think a better way to say it is that events should. I want it to be good for any kind of app.
Right.
The reason it might not be right now is because we're early, and because specifically for Jazz tools, we decided to prior tie certain features over others. So, for example, if you have an app where you definitely need authoritative centralized state, like you're building a bank or something like that, and there can only be one balance of your account
at any time. You you could actually build us on top of jazz that you can implement authoritative state with a local first framework, but it's going to be more awkward than the traditional.
Thing because you have you have a tighter constraint. You have to make sure that everything lines up on the front end back end.
It's it's basically like what you do then, is you re implement something like requests on top of the local first state, which sounds elaborate but actually has some nice drawbacks because you're basic get optimistic updates on the front end for free. But that's kind of that's a way more advanced topic that I want to get into at
this point. Another thing is like if you need some of the more advanced bread and butter database features like in DCS over huge amounts of data, full text search, that's something that we haven't implemented as features yet, but they're not like impossible to do with local first. So this is an interesting example to kind of start giving you an idea of what kind of apps it's already really good for. Maybe where the boundary is like.
Using index dB.
Yes, that's what we use for in browser persistence. We're currently moving to OPFs, which lets us write directly to like an isolated file system on the client where we implement and storyteller.
Is that implemented in browsers.
Out Yes, that's widely supported. Not a lot of people know about it. The nice thing is if you use something like Jazz, that's like, I guess that's a major important point. If you use something like Jazz, you don't need to worry about the persistence and about the networking. You just manipulate objects basically, right, and it can have
different storage implementations under the hood. It could communicate over web sockets, web party see in the future maybe something like quick and what that lets you do is like really quickly build apps on the abstraction level of like what do users do in my app and what kind of objects do they interact with? That's kind of all
you have to think about and what you like. Because of the performance characteristics of local first, what you get away with very often if you have apps with like small teams where a couple people interact, you can literally keep all the data belonging to that team locally on each device. The only reason it's hard to scale, for example, productivity apps is because in a traditional model, the central database kind of needs to keep the data for every
single team, which might be millions of them. With local first, each of the team's devices just needs to keep the state for the whole team. And Linear is actually a good example of an app they build their whole own local first technology and infrastructure. They keep all of your team's issues locally on the clent, and that gives you
incredibly fast you X interaction on the client. We see with a lot of Jazz apps where people ask us like, look, I want to implement search in my app, so for that, I need an index, right and so far in every case you can literally just brute force your way over every single object in memory, and it's way faster than any like search feature against an API that that you've seen in any other app. That's that's kind of what it's already really good at. Obviously.
Yeah, I've noticed that, like so many times, people you know, they're thinking too much about optimization and they don't realize if you don't optimize this, like optimizing it in many cases makes it slower because then you're adding all the overhead of the algorithm in the sifting, and like if it's less than ten thousand items, if maybe one hundred thousand items, just like brute force it it's the fastest way.
Well, where we start talking about trade offs, right, yeah, hey, this is really good up to this point and then not so great or in the other case, it's you know, now you're over this threshold, so now your optimal case is to use the tool, right.
So so so let me draw the picture a bit further than so, what if you start having data sets
that don't fit on a single client's device anymore. And that's also where we start seeing differences between Jazz tools and some of the other local first solutions because they are very much what I would call like sink the world, like you actually have to keep the entire state and the client, whereas Jazz from the beginning was built to support granular sync, where what it does by default that it just thinks whatever objects you're trying to display right now,
and then over time you kind of accumulate everything that's important to that user, and you can like a big
things again if you don't need them anymore. But that means that you can now have like a local first experience for the data that you're actually interested in, but you can still work with potentially infinite data sets, and then you can build You can build indices against tens of millions of objects, for example on a server work and then the index itself again becomes a sinkable object, so the client can create the index locally, see which objects it might need to load, and all of that
is it's like not one extreme or the other. If you make local first granularly sinkable, you can actually create request and networking patterns under the hood that are very similar to traditional stacks with APIs. But again, you as a developer don't have to think about that. You just think about which objects do you want to have and kind of request them as needed, and it loads whatever you need.
So personally, I just like to work with JSON and functions like I don't ever use I literally have never used JavaScript classes except for experimentally to learn about them. I have never shipped code with a JavaScript class because I just find that and I mean, to some degree it's the concept of functional programming, like the less state you have to deal with, the better off you are the easier it is to test. If I can just take here's a plane object, here's a plane function. I
put the object and some options into the function. I get the same result out every time. You know, it's very grug brain dev type stuff.
And I like.
The rest ish APIs. I like rest ish APIs because they're very very simple to reason about. Like if I I open up my network console, I can see what's happening. I know what's going on. I like SQL databases because they're very simple and proven. And I personally am am pretty resistant to things that require a lot of state management or require a lot of bespoke code structure. So is this something I mean, it sounds like it sounds
like from what I'm hearing, this is very opinionated. It's like you buy into this way of doing it and you're going to adopt it, which I think is great. It's probably not something that I personally latch onto. But I do really really believe that, you know, if you're gonna if you're gonna make something really great, yeah, integrate it and just tell people they have to buy in. But I'm I'm not sure if I'm representing that correctly. Is this like a very streamlined, top to bottom solution.
Or is this something where I can kind of take the approach of just plain objects and plain functions and build an application where I'm essentially replacing my res diish calls with jazz Ish calls.
Right, so you're mentioning a bunch of important things there, and let me maybe start from what jazz consists of. It's kind of two layers. It's Jazz, which is like the opinionated framework, and then below that a protocol which is called CO Jason. I haven't written much about that yet. It's because it's so far it's just like internals of the framework, but it will be an open standard which
defines how what I'm calling CO values work. Which these are your new primitives, and they are very much like they're supposed to be, just like collaborative Jason. You have objects, you have lists, and a bunch of other things for like text and rich text. But it's basically what if what if? Yeah, what if Jason was just collaborative? And that's your abstraction. It like, if you read it, it
looks just like Plaine Jason. If you write to it, you kind of have the choice between two different APIs, and that's where we get into the higher level opinionated thing. What Jazz implements is something very similar to and like react. People with no libraries like mobs, where like you know and React, even with like just used with use state, you get like the current readable version of the state and an update the function. And that's basically what using
Jazz is like currently. It even exposes a mutable API where you can literally just do like object dot property equals something and it will update it under the hood. But we'll probably move to something more. React is where it's like you get you subscribe to a collaborative value, you get a readable version of that every time something happens to it, and if you want to mutate it, use this update your function in which you can mutated. That's what replaces either your rest calls or what replaces
your local state updates. That all just becomes one. And the nice thing is you just subscribe to updates, whether they come from locally because you edited the object, or whether they come from other users who are like remotely changing that same object. And in new subscription you can update your UI. Obviously, again with something like React, that ties directly into the render loop like it just rerenders your component. But there's also Jazz Browser if you want
to use it and plain JavaScript. You just have a subscribe callback in there. You can do to the dorm whatever you want based on the newest version of that value. That's as simple as it is. What Jazz as a framework introduces to kind of structure your applications more almost in like a rail sense, is that it has this notion of schemas, which are similar to database schemas, where you say, like, look, these are the kinds of objects that I have in my app. They have these properties
with these types. Jazz has chosen to represent these schemas using classes because it's way easier in Typescript to have classes because you can refer to them as a type and as a value. So we can kind of use this schema information both at typing time so we can give you nice type inference for your apps objects, as well as at run time to do validation and stuff
like that. We've noticed that even just seeing the class syntex throws a lot of people off, So in the next version of the API will probably move to something that makes it look even more like the plane data that it is really but yeah, under the hood, it is really like collaborative Jason like objects that just have
this editing and merging implemented. And my hope is with the protocol becoming open that not only might there be other frameworks on top of it that might different API designed choices but are still like wire compatable, but it can also be it would also be really easy to port it to other programming languages and environments, because one very interesting thing you can do is you cannot just
write client applications with Jazz. You can write server workers. Said, well, that's also just listen to these co values can do some external side effects to talk to third party APIs, or they could receive a web hook request and in response mutator co value which done some cliency. And right now you can kind of only write them a note Jazz because right now Jazz is only implemented in Typescript.
But if the protocol is open, there could then be like cojacent for Go or for Rust or for like whatever language you want, and you could write these complex systems that all use this really nice model of collaborative values and no one has to think about transport or persistems.
Yeah, Sevin.
I've been wondering about the back end part of this. Do I run a Jazz surve or can I can I use my SQL database and there's a Jazz adapter for the CRDT stuff to to get things in line, or what what does that look like? What's the what does my server side look like?
Yeah? So yeah, it's important to be precisely and this is not going to be very Jazz specific because not a lot of the other local first solutions have a back end story. Obviously, everyone needs to have some kind of back end to to sync the co values and to persist them in the cloud. And in Jazz, this is what I call the sink and Storage server. That is a process that you can run yourself right now.
It's implemented and not Jazz. It's open source. It persists the history of the co values into esculate and the future. It will persist it directly onto the disk. But that's not really a format that you can interact with it like, it's just like primitive internal data basically. So that's one thing. And like Jazz tools, my company, Garden Computing, is running the sink and Storage Server as a service like as infrastructure that you can subscribe to, has a free tier
and so on. What's nice about that is if you use that, you can just start building an app and basically only write front end code and it sinks and persists. Do that and you have a whole functioning app with multiplayer and everything. But again you're not locked in. It's open source and so on.
Separately from that, yeah, oh no, go ahead, you finish.
Yeah, So that's just for like sinking the co values to everyone who needs them and making sure that they're persisted in the cloud. Right. What you might want to do is to have what I call a back end worker in Jazz, which is actually also a client to the sink and storage infrastructure that just happens to run on a server. So that could be a little note
jazz script for example. And what that lets you do is, like I said earlier, you can do server side things in reaction to CO values changing, or you can create co values in reaction to getting something like HGTP requests. And that's kind of one way in which you can
connect jazz date to the external world. One thing you might want to do in a server worker, for example, is to take jazz state and it's like high level structured form and replicate it the current state into like a traditional scale database, either because you want to connect it to an old part of your app that uses JAS and you want the jazz state to be integrated with that, or you might want to run some queries
that like that particular database is very good at. For example, one app someone is building with jazz right now, they use Jazz for like ninety nine percent of it, but then they want to do some really deep analytics on all the user interactions that ever happen, and that's just not something that Jazz is very good or fasted yet. So what they do is they have this like background process that sings jazz state in DUCTV, which is really
good at these kinds of curse. So that's stuff that you can do that that's kind of your adapter to the XCEL.
Well there, that's that's really interesting. Yeah, I'm just I was gonna ask about the back end too. So that's interesting, and I like the idea of possibly having some driver for other systems, right, I mean, you know, people on the show know that a lot of the back end I do is Ruby on rails, and so it's interesting just to kind of have that, you know, I you know, eventually being able to feed it into my Rails app or whatever else exactly just be able to process it there.
One of the things that I'm getting more into these days is running things over a web socket and so instead of having the worker kind of send these updates over ar rest API or whatever, also being able to you know, kind of stream them over the socket and get responses over the socket. And I'm assuming that that's either something you've got or something you're working on.
So that part is like, for example, let's take the example of a Rails app, like, this is something that I want to have really good libraries and patterns for which we don't have yet, but it is something that you could build by hand right now, and it wouldn't be that right, and obviously we would help you. So for your Rails at probably what would be the best
example is, Okay, you're pretty happy with your app. It works great, but you want to add something that's like really really real time where you're like, oh, do I need a web socket now, how does that integrate with Rails. What you could do is basically just build this feature with Jazz and that will work. Perfectly internally for that feature, but there might be some parts of the state that
the rest of your existing app is interested in. Right, So what you can do then is, since we don't have cojacent for rubiat, you could run a little note jazz server that subscribes to the Jazz state and at least puts like the current version of the state into your SKL database, where then rails can pick it up and render it and existing out and that that should work quite well.
So one other thing that I'm looking at here is.
It sounds like there are advantages that are sort of obvious, I guess with this kind of a setup, right, I mean, if if I'm just mostly managing stuff like it's a
local setup, then I essentially eliminate all of the network stuff. Right, So if if I'm on a slow network, or if my connection dies, or if even if I'm not on a slow network, and I just don't want to wait to get a response from the server and I don't need one per se, right because it's just sinking stuff back and forth, you know, it seems like it kind of gives me some resiliency and speed and performance.
On top of everything else that I might be doing.
That's a that's like the funny thing is like everyone in the local first sphere kind of came to it from that like user experience promises it obviously has, but then starting to build apps with it, you realize that the big thing about it is really the different developer experience. Because sure, it's great that the app is snappier, works off line and so on or over sketchy connections, which
is often even trickier than offline. But the main thing is that by not having to worry about requests or back end or like making sure the back end now supports an endpoint that gives you the data that you need to render this thing, you're just like in one context, you build your front then and the data model right next to each other, and you can iterate really really quickly, and you just think about what objects do they need to create or delete or I mean, if you're coming
from like a Ruby on rails background, that's actually what I started cutting my teeth. As a developer. You kind of have have that experience there, but on the back end and the back and also does the rendering, so local first lets you have that on the client, you meaningfully can create modified objects, and often what that looks like is like it looks almost illegal, like in a in a in a button on clickhandle, you create like a whole team and like documents and then whatever you
might have in your app. That's that's the developer experience it gives you. And it's hard to understate before you've tried to help yourself just how quickly that lets you build apps. However, one component that enables that really that we haven't really talked about yet, that I can go into more detail if you if you want this, it's
really it's a really tricky question. How do you do user identity and permissions in a local first way, because that's not really answered by like just the simple way of light it out so far. Let me know if you want to go into that or if you have some other.
That is interesting because you know, as you're saying, right, if you have that kind of centralized back end system, right then it can kind of know who's sending it stuff, right, But.
On the front end, yeah, that's that's a little bit different.
And then I'd also like to talk a little bit about, you know, maybe doing peer to peer where you don't even need that centralized server beyond hey, who else is working with the documents? And so if you're doing that, then it gets even more tricky because then it who do I trust it coming from from across the internet right without even having it, you know, a clear identity I attached from that centralized server. So yeah, how do you think about those issues?
So jazz implements something and again that's also part of the online protocol cojacent, which I call local first permissions, and this is maybe beyond all the other details of FOG exectly, it's implemented the biggest difference between jazz as and other local first things because the approach that many others take is either look, the author and permissions question
is out of scope. We just give you the shared state, you figure it out yourself, or in many of the other cases where they also have folset services, they kind of they do the local first state. But then identity and auth is still traditional in a centralized way, which works okay for a lot of things, but it kind of makes you trade off some of the local first properties you could otherwise have, and it's tricky to do, like, well,
how do you do offline them? Because then you're not really authenticated against the back end that at least checks the permissions and so on. So that's tricky. So for that reason, what I decided to do when I build Jazz is like I saw the crdts that give you the shared sit I was like, damn, this is amazing. I want to build everything like that, but it feels like only part of the puzzle. You also need to
solve user identity and permissions in a similar way. So what I've done there is to couple cred keys with basically good old public key cryptography, where a user in Jazz is just the cryptographic keyper and we'll talk in
a second about where that comes from. And when you make changes to an object, you actually sign those changes with your public key, which means that everyone else who gets your changes, no matter how they got hold of them, whether it was to a centralized infrastructure or peer to pe or whatever, they see the signature and they know, okay, this was definitely Charles who made that at it. That's
kind of the right access part. And for the read access, what you do is you encrypt your changes and then you only give the key to people who you want to see that object. Right. That means that you can now actually in a local first way, so on the client synchronously when you create objects and when you write to them by signing and encrypting them, you know for sure that the permissions have been set up correctly and you don't need to trust the sinking back end to
do that for you. That just needs to exchange the edits, or you might send them peer to peer, and all the edits that you receive you can verify who did them. It gets a bit more complicated then, because you might want to have complex permission structures, like teams of certain people with different roles. So what Jazz implements there is something called groups, which is basically a scope for permissions where you can say, like, look, this person with this
key pair is the admin. They added someone who is a writer and someone who is a reader, and Jazz under the hood make sure that when you receive edits, for example, not only is it check that they have a valid signature, but that they have a valid signature by someone who has the correct role in that team.
The teams themselves are also like CRDT CO values, so they get sing together with everything else, and you can even nest groups so like they can inherit from each other, and with that abstraction you can build basically arbitrarily complex setups like in no For example, you might have a team and you want everyone on the team to be able to read and addit every page by default, but then you might want to add hoc invite someone just to that page to also write it who's not otherwise
in your team. And by using that structure of inheriting groups, you can build all of that in a completely local first way without having to trust any back end, and you can even verify every single edit yourself locally. That's very unique, and like one of the hardest parts of that was to make that fast enough to be able to compete with a traditional trusted back end.
Yeah, I'm trying to.
I don't want to like get into the weeds of how it's all implemented.
You know, the the idea.
Of cryptogaphic, cryptographic you know, asynchronous public private key pairs. I mean people use them all the time, they just don't know it a lot of the times. You know, whether it's your HTTPS connection back to the server that's using the same ideas, the same technology essentially when you in yeah.
It's all in web crypto and everything.
I mean aspect the people use.
So yeah, I mean, and I like the idea in these completely yeah.
So it's completely abstracted away from you. That's the nice thing. I'm just telling you this as in like, this is how it works. This is how you can make the permissions local. First, but to you as a developer, you you basically you define your groups and it feels like you're said like drop Box like permissions and you're saying, oh, this acne has this role. The other thing that I didn't mention is like, yeah.
So I guess the other question is, I mean, is there permissions around time?
Right?
So I add somebody temporarily to a group and then I pull them back out. All the changes during that time period are legal right to apply those, But now I've pulled them back out of the group, so if they send another update, I don't want it added.
And so it handles all that too.
Over time, it and handles all that because the groups themselves are cerdts, so they are full histories of whatever happened to them. So everyone can be like, oh, they were a member until then and then they got kicked out, and for the read access. What happens is you just you rotate the key and give the new key to everyone except the person who get kicked out.
Right.
But again, like this is getting into details, you as a developer don't really need to carry You just use Dropbox, like at this account as a writer, at this account, as a reader, it's really easy to build you you I around that to have like your little team thing. And in terms of because I kind of glanced over that, where the key pairs come from, because obviously you don't want your users to be handling key pairs, like no
one uses crypto wallets for that reason. So Jazz kind of lets you have pluggable what it calls off providers, where it has a couple of native ones that are really nice. My favorite one is passkey off, where we're using the past key feature to actually store the key pair. So the user experience to the user is like it just prompts you for like touch ID or face ID, but then actually stores the key on your device and only you have that. But it still gets If you're
using Apple devices, it gets sync between them. If you're using Chrome and Endry, it gets SYNCD between them. So you actually have like an end to end encrypted app at that point. But you can also do something more traditional, where like if you want to use something like Clerk or Zero, we have an adapter for that where the key pair gets stored and the user's private metadata, so after they look in Clerk, for example, gives that to the front and the front can then give that to
Jazz as the key pair. That means that basically Clerk and any admins you might have in Clerk are trusted with the keypairs for all the users. But that's kind of the case for any traditional web app already anyway, So you kind of you have the choice, like how deep you want to go there. The nice thing is that even in this setup, neither the app developer nor the users have to trust me running the sink and
storage infrastructure. Like I still never see your data and plain text, I don't have your keys, but I can still do the sinking for you.
Cool.
Yeah, that's that's one issue that Uh, losing private keys means losing data permanently because there is no email recovery for that. Now, if you're storing it in Clerk, then you have a reasonably high assurance that that is going
to be there. Tomorrow. But that's that's something that's a little bit yeah, but I think I think, I mean, obviously, if you're trusting clerk for your users, you're already trusting clerk for your users, So I wouldn't I wouldn't lay anything additional there, but I would I would seriously warn anyone from trusting past keys as a primary source, because
I've done quite a bit of experimentation with it. As I imagine you're well aware of the the drawbacks of it and the way that browsers implement it differently, the differences between the iCloud ID versus the browser ID. And you could very very easily overwrite your private key, for example, for iCloud and not not knowingly, and and perhaps you're taking I know that there's certain measures that you can take that will prevent the private key from being overwritten
and produce an error instead. But that's one I'm not I'm not yet comfortable with that. I don't feel like that one's sure for that use, cause I think it's excellent as it's a built in password manager. Pass keys as a password manager built in. I'm one hundred percent on board. It's mature, it's good it's ready, use it go. But as something for storing, you know, you've got what sixty four bytes of arbitrary data you can store, and yeah, it's easy to overwrite that.
Yeah, I mean to be honest, I've not encountered a situation where that happened, but it's it's good to know about that, and for that reason, it like, I think the bigger issue is actually still that a lot of people just aren't familiar with them, and for that reason alone, it's it's like an ago for a lot of apps. I think there is a bit of an overlap here where like if someone really wants to build an end
to and encrypted app, probably they could. That's the kind of app where the users would know how to use passkeys. But right now, yeah, that's that's just something that we offer. Most people want like a more traditional method.
Anyways, Well, I think it's great and I love the way that it's being implemented and rolled out across the
industry right now. It's very seamless. I mean typically the way that it's happening is you just do your normal sign in and then it pops up and says, you know, use Windows Hello, or use face ID and so a lot of people are using passkeys without even knowing that they're using passkeys because they've already been seeing it on their phone, they've already been seen it on the Windows computer, and then it just pops up in their browser like, oh, okay, it's the same thing I've been doing for the last
five years on my phone.
Totally. Maybe that's what's nice, yeah, exactly, but people are getting familiar with it. What's nice about Jazz is like I mentioned that the ofth providers are pluggable and jazz, and therefore your app really only cares about the account and the keypair. So you can totally start building your app against Like with one off provider, later on switch
them and change absolutely nothing inside your app. You can also offer your app to like enterprises with weird custom as his own needs or whatever, and nothing about your app's logic around how accounts work, how teams and permissions work has to change, which is something really nice because usually this is a huge topic and your like permission model in your back end is very tightly coupled to kind of the off provider that you choose to use.
So do you have a back office for this to manage things like a UI by which a person who's administrating an application can get access to what permissions exist and what groups exist and such.
Kind of. But we want to do a lot better there. So there is something called the Jazz inspector, which is if you have to keep it for an account, you can kind of remotely look into all of the state that's in that account. Again, because of all permissions work as opposed to traditional database where admins can just see all the data. Ever, by default, in Jazz the user kind of has to opt into letting you look into
their account. But if they do that, and you might even hardcode into your app that that happens by default. A typical pattern in apps that want the more traditional permission model is that they just create an admin account that admins have, that the server worker has, and every user automatically invites that to all of their groups and then you get like this access pattern that's very similar where you can just see all your users data. But we yeah, so that's kind of the mechanics of it.
What we're working on right now is kind of make that a more full fledged browser. For example, if you use jazz cloud as a service and you create an app in there, and people start creating objects on their clients that like if they opt in, or if you enable the default opt in, you can very nicely browse that as if you were looking at like a database you high basically.
So that's that's actually really interesting. I mean, I think that the reason most people develop apps is because they want to aggregate user data so that they can manipulate it or sell it in some way. So the idea that by default the user data is private, I mean that seems like that appeals to a very niche set of applications, you know, like Telegram, some maybe some cryptocurrency wallets.
But I mean, don't don't most people that build apps don't they want you know, like even Slack right in Discord, like they get to see all the messages, you know, Like with Discord, all the messages are visible by the Discord admins. They get to train AI on them that you know, and say, like with Slack, anybody on the Slack team can look at any of the messages. Anybody who is an admin of your Slack group can look at all the messages. And that's I mean, that's generally
considered a feature, not a bug. Although i personally like what you're saying, I personally am on board with, yeah, encrypt my data, but you know, like, is this what you think the market wants?
So like, pessimistically, I agree with your statement that you just made, and this is why. Like again, to be precise, it's like it's the default on a protocol level that everything is encrypted, and what that means is that you can just as easily build that the same trusted model where the a provider can see all the data you put in there. The only difference is that this trust relationship is now explicit and verifiable, if that makes sense.
And in this case, even like you would be like sure like Slack, if Slack to or decided to use Jazz for whatever reason, you'd be like, sure, Jazz, Slack admins can see all the data in my team. But like Garden Computing, who's running the Jazz service count that's already an improvement, right, and it still gives you, as the app developer, all the freedoms and flexibility that you
had before. Interestingly, if you care about analytics type data, you get much more high fidelity analytics out of Jazz by default, because everything, every object has the full history, so without instrumenting your app in anyway or registering any
custom events. Just in the in the dashboard is the way we'll expose it to is you can see like, oh, these five users from like these cities are working together on this object right now, or like this has been really hot over the last week, and these teams are collaborating like that in a like way that that schema aware of what the objects in your app are, and you get that for free just by like writing to the objects basically, So in that sense, it's almost gives
you more data that you can exploit as an app developer. It's again just that the trust relationship is now explicit.
So one thing you mentioned there the schema is how do you handle the migrations?
This is literally the hardest question of local first, and anyone who's building a local first framework or something like that will tell you that. And that's like local first in general is like it makes a lot of things that used to be really hard really simple, and it makes some things that used to be really simple a
bit awkward. And migrations is maybe the most awkward thing because you're now basically confronted with distributed migrations like different clients might update you up at different times but still interact with each other at the same time. It's a tricky problem. In what we've found so far is the best thing to do is to just change your mindset a little bit where you can't treat migrations anymore as does like stop the world, will change everything to this
new thing and then continue the database. You have to treat it more as like protocol evolution, where you can only ever add new fields basically, and if you've built graph ql APIs that should be familiar to you. If you've done anything with proto buffs, that's kind of best practices there where in these cases you also expect clients with the old schemer interacting with you, So if you follow that same model, you'll be fine. And because it.
Is there a way to expire data that's too old, like if the data is more than three months old, just expire it.
That's that's a separate topic, which is deletion, which is also interesting because it local first, and I think jazz in particularly kind of takes a like soft delete stance by default because you keep all the history. Anyways, most of the time you just want to soft the lead. Now there are cases where, for regulary reasons or because it's really a lot of data, you want to delete
things permanently, and you are able to do that. You basically you mark the object as deleted, and every client and the sinking back will actually delete it.
That's not what I meant, Okay, although I'm glad you
answered that question too. What I mean is, like all of us that are developing web apps, we all come into this case where we change some property that's you know, I think one of the one of the probably more common ones is if you change anything that's in a cookie because cookies last forever, right, or you change you change some object that can exist out in the wild that's maybe not part of the scheme, as just an ad hoc object, and then you get this problem where
this user calls in and they can't log in, or at least they don't have the experience of logging. Maybe the authentication process succeeds, but their app is just like
stuck in this error state. And then the only way to solve it is that you have to clear out the cab because there's some little property where it's triggering an education your app where it's like if this, then do that, and so it passes the first check, and then it's you know, if that, then do this, and then it fails and it's in this limbo state that you didn't expect because some user that logged in three months ago that still has some local object in local
storage related to how the off object used to look like or how their profile object used to look like. It's the new version of the application code, and it can't like it can't regulate itself, right, like you know what I'm talking about.
I think so, But I think if you follow that principle strictly of only adding stuff that shouldn't happen, you might make mistakes. Obviously, you might make mistakes. And so your question is mostly like what if a migration is broken?
Right?
Yeah, like is there a well it more it's it's like, I want to fail safe, right, So so one of the things, you know, Yes, it would be great if if we were more perfect coders, and I want that, and I want people to be more delivered in their decisions and to be more mindful of you know, what state they're storing in local storage or INDEXDB or their
database or whatever. It is the reality of the situation is most people are not that mindful, and everyone makes mistakes, and so when when like one fails safe to have that, Like I just working with a buddy on a project, I said, okay, if you get a four to oh one, clear out all the data and log the user out. If you get a five hundred, clear out all the data and log the user out. Because we're trying to build this in a way that we actually don't have errors.
But if we do encounter an error, we just want to say, okay, wipe out all of the local state so that we don't end up in a loop where the person's trying to log in but because they had a you know, that's the kind of thing I'm saying is providing a fail safe to say, hey, if the version has triggered from three to twenty seven, that's more than three version changes, So just wipe out all the local state.
So that's actually like a move that you would be able to do in a migration, where like and again to be precise here, the migrations are a framework feature, not a protocol feature. Right, the protocol just gives you persistent arbitrary jason. Basically that you can collaborate on the migrations is just one part where you can modify, like one place where you can modify these objects. So and right now we take this wild West approach where we're like,
you can literally do whatever in a migration. You can mutate the objects any way you want, and it's up
to you to follow these best principles. But that also means that if you botch something or there's some weird unexpected edge case that you didn't think about, you can after the fact just be like, look, if the state that we're getting at the beginning of the migration doesn't look like any of these standard steps that we take in the happy path, just you know, just throw it away, like whatever, that's something that you can do in a jazz migration.
Yeah, I was thinking something more along the lines of, you know, let's say that I was putting some data into these data objects that I.
Found out, Oh, under.
This regulation for the field I'm in, right, I'm not supposed to store the credit card number, right. I think I think we all generally know this, but yeah, you know, or you know, I have some you know under HIPPA
or some of the other GDPR or whatever. Right this this is the kind of personally identifiable information that I've got to be like extra and especially careful with, and so having it on a local storage, you know, maybe maybe that you know, for whatever reason, I have to have in some kind of controlled back end, and so I'm just gonna have to, you know, do end runs to the server for that kind of a thing. Everything else I can run local first, right, And so yeah, I'm thinking in that.
Case, I may have a migration that says, hey, wipe out all of this, right, and it'd be nice.
If I could do it on like a you know, it's like this object is migrating to this new version, and so therefore just forget all of the credit card numbers rather than wipe out all of.
The oh yeah, yeah, sure.
Or whatever outlet, right, something like that.
Okay, this is going to be a bit confusing because I wanted to talk about something related, but yours is kind of like almost the worst case. And then your case, what you would do is exactly like you would do like a patch up migration that actually does hard deletes, right, yeah, and that's something that you'll be able to do as well. Most of the times you would do a patch up
migration that does soft deletes, right. And what's nice about that, by the way, is that if if you mess up the patch migration as well, which trust me I've done many times, and you can unsoft deleted and you can look at the whole history of botch patch migrations that happen to it and find something useful somewhere in there, because that's what you do with the traditional database, right,
You try your best to write reasonable migrations. If they utterly fail, you roll back or you write more migrations against it, and you do the same on a local level. But yeah, I mean so far, I'm always honest, and I'm like, look, this is the trickiest part. This is the scariest part. So far, everyone who has built apps which jazz has been able to write these migrations correctly,
even though we provide no guardrails. Yet. We're kind of in a stage where we're like, we give you all the tools and we wait for, like, what are the best practices around how to do migrations, and then introduce guardrails on a framework level. But so far it hasn't been an issue, despite these people changing their apps around quite a lot as they iterate on them.
Right, Yeah, I wanted to because we're already almost at an hour. We try and keep these to an hour maybe a little more. We tend to go over the network. But anyway, one thing that I'm curious about then is AJ asked you, okay, you know, where is this.
Not super well suited?
What I'm curious about is, okay, so what kind of apps are people writing where you know, if they haven't figured it out already, they're going to be really well suited for this kind of a thing where they're going to look at it and go, oh, this solves a whole bunch of problems and makes my life easier as I developed this in the future.
Right. So, what's fun about our current adults is that they're actually super diverse, and they're a good mix of like things that are obviously very good ideas local first too,
like this is almost not local first at all. I can maybe very quickly mention some examples, but what it's best for right now is if you really care about a good offline first experience, if you want to build any kind of app that has collaboration, particularly if it's real time, but also if it's not real time, just like team abstractions, permissions, that sort of stuff way easier to express. Yeah, I think these are the ones where people get the most value out of jazz right now.
And again, like what is jazz not good at? Honestly, the biggest thing right now is just like we're early documentation is lacking horribly. We're working on it. We're trying to patch that up by just providing good discord support basically, So that's the biggest thing. Like, if you really need it, you'll probably want to use it despite it having bad documentation for everything else, you probably only want to use it for an experiment to get familiar with it. That's
kind of the main bottleneck right now. So in terms of the adopt is just to paint a picture. One of our earliest ones. They're building like an app for freelancers to collect invoices out of your cloud Flare, your
AWS to then submit to tax authorities. But what they a is that actually locks into your AWS and your cloud Flare with you use the name of passwords, so you kind of you need to be able to trust that app as much as you would trust the password manager, and for them, obviously the whole permission and encryption thing was a godsend because they got all of that for free, and they wanted to just make it a single player
experience in the beginning, just for individual freelancers. But because they build it with Jazz, they got like org features where you can invite someone from your team to also submit invoices by just adding a button basically, so this was like a very obvious fit. Maybe the most unobvious fit was a guy who's building a kind of social network with his team. It's called learn Anything, like a learn minus anything that xyz I think is the domain.
It's like a mix between Reddit and quorra, kind of like a learning social network where you can be like, oh, I want to learn how to play the guitar or I want to learn rust, and it will have like a community curated list of like tutorials, polls, videos, and so on. So that's still like very much like a social network part and they decided to base their entire
app as Jazz. That's the only database. So in their case, Jazz actually serves these initially static pages of content, and they already get like millions of visitors per week because they've got good SEO, so it's really stressing Jazz in a way that's not local firsts at all. It just
takes a traditional back end database role. But then as a user, like probably in the beginning, you're just passive, but then you're like, oh, I want to start learning this and then track your progress as you read different articles. You can take your own notes in there, and then it magically transforms into this local first experience where you start having your own personal data that's local and really
fast to interact with. But because they build it with Jazz, they didn't have to glue together different systems that are good at either of these. They could just use Jazz to represent all the data they have, whether it's like this global data across US or individual user data. Okay, these are kind of the two best examples I can think of. If people are really interested, you can check out some of my other podcasts where I list a
couple more. But for the sake of time, I think that that gives us a good contrast.
Cool.
So, if people want to start building apps with Jazz themselves, I mean, what's the best way to do it? Just NPM install it and then spin up an app?
Or is there more to it?
So? What would recommend Yeah, basically, but because there's so many new concepts, I would really encourage people go check out the homepage that kind of gives you a quick overview, have a look at the documentation that exists, but most importantly check out the example apps because these should cover a good ground of stuff that you can do with jazz and just explain the best way possible how to set it up, how to define your schema, how do you do stuff like image uploads and lots of fun
stuff like that, and then if you have any questions, hop on the discord, because right now we're in a face, like I said, where we just we sit down together with people trying things with jazz, answer their questions or even help them build their apps because we learn a lot from that and it is kind of it works,
and it works right away. The nice thing is it is quite a little set up if you decide to use jazz Cloud, because you just start a front end project essentially, and then for whenever you get stuck or you have questions how to best build something, just just coming ask us on the discord.
Yeah.
One other thing related to that is a lot of our listeners are already working in existing apps. Right, It's not like, oh, I've got the perfect greenfield project for this, right, I'm building this other thing.
I'm already using.
React or View or Angular or you know, just do APIs like AJU.
You know, we're web APIs.
And so if I'm looking at this and thinking, well, some of this sounds really nice for some of the features in my app, and then some of the other features in my app, yeah, I'm going to use the traditional back end because you know, it either already works or it seems like this is a clear win for just some of these other things. I want to add. My question is can you bring this in alongside the
other stuff? Right, So let's say in an existing React app or view app and go, Okay, these components are going to use Jazz, these components are going to use my existing back end, and some of these components are going to do both, and maybe I have that server process running on the side.
Yes, yes you can. In principle, and in terms of front end bindings, React a kind of first class. We just launched View and very fresh than experimental spelled as well, so that's not an issue and you can use it. From Plaine Jellascoop as well. Like I mentioned earlier, the biggest challenges in terms of like how does it interact with your potentially existing back in the state that you have.
Easiest case is probably if the Jazz state and you' listing state is completely separate and you kind of only need to make it up just for the user identity, so you're existing all works with Jazz. It gets more tricky when it does need to put stuff into existing databases, which is possible, but again no documentation for it. We
would need to help you with it. So to be honest, like right now, the people getting the most value out of Jazz are green field apps, but it is possible to build more complex stuff, and over time we'll have more patterns and examples of that for you to do that without any of our.
Help, right, I mean, just to give you an example of something that I'm thinking about. So top end evs I'm building Essentially, I'm trying to take it from podcast network to you know, learning guided learning system, right, and so one of the things that I want to add is a community section where people can actually like chat or interact, you know something, but kind of like a forum or a chat room or something like that. And so I'm looking at Jazz and thinking, hey, you know this,
this might be really nice. I don't have to figure out how to you know, web socket the thing through action cable on my rails back end, right, I can just you know, I can just put Jazz in on that piece, right, and it just kind of exists outside of the you know, the rest of the app, because the rest of the app, when I search, I don't need it to search the chat log. I just needed to search, you know, the other learning resources that I'm providing people.
And so I couldn't conceivably do that.
Right, Yeah, And that sounds like something that I'd love to help you build. And that's almost the ideal case of like a green field feature within an existing app that doesn't really interact too much with the app. So I think that that would be a very good case.
Right, Okay, if people want to connect with you or learn more about you or Jazz, Jazz dot tools seems like a good place social media or something or GitHub.
Yeah, I'm I'm a Anselm. I aw on Twitter and blue Sky and otherwise. If you want to know more about our company, check out garden dot com. Trying to be more active on Blue Sky with everything that seems like lots of developers are kind of congregating there, which I'm very happy about. And soon we'll start putting out blog posts and newsletters and so on.
That's kind of where we're at.
Yeah, yeah, it's it'll be interesting to see how that all goes.
But yeah, I am seeing some movement that way, so yeah, makes sense.
All right, Well, we're gonna go ahead and head into our picks section of the show.
I'm gonna let AJ go first.
All right, Well, I did not think that my wife would like Dune, but I loved it so much that I said, hey, honey, watch the show with me. You might not like it. She loved it. I couldn't believe it blew my mind. Of course, what she's talking about is not the story, like oh the sex were so beautiful, and oh that the camera angles were so nice. I'm like, what about like the army and like, I don't know, I don't know if she got anything out of the out of the movie like the rest of us did.
But but yeah, so we're gonna we're gonna maybe watch part two together. I'm I'm thinking she might get the two film collection for me for for Christmas. So I'm I'm waiting to find out that before we do. But yeah, so all the dudes out there that uh, you know, you thought, yeah, I would never be able to get my wife to watch us with me. My wife is
one of those wives. Okay, she wants me to watch Pride and Prejudice with her, and she I played Portal and she couldn't bother to watch that, and Star Wars is right out, so I was super super surprised, but she enthusiastic loved dude. So I will I will pick Dune and maybe I'll throw up a link here to the two discs set. And so last week we I think it was last week that we talked a bit about Blue Sky. I was able to get it installed and running. I left an issue open, so anybody who
wants to know, yeah, I I did. Uh yeah, I figured that out. They they used Docker, but the use of docer just makes it more complicated and more difficult to install because you can just create you know, you could just get cloned the repo and then node install and then set up your reverse proxy with Caddy. And so I just gave those instructions along with some additional detail for some optional stuff. So when you see the instructions that you know you don't have to do all
of the things. It's just there's a couple of steps. It's like you set up the environment variables. That's like one half of the instructions is you know, copy and paste this big, huge, long list of environment variables. And then you know, optionally set up caddy for SSL if you're not already using something else to reverse proxy for you, and then you need to have a it's a well known file you need to have reverse proxy to in particular, apart from the slash x RPC or whatever it is.
I didn't My experience with it was kind of man because it's like, this is literally a Twitter clone. And of course, of course my first ten seconds of blue Sky were the same as anybody's first ten seconds of Twitter. I immediately was followed by bots with you know, pictures of women from the chin down claiming to want to be my friend. So I I just I don't know,
I guess joined it if you want to. I've kind of I don't see the allure of it because it's it's literally just a clone of Twitter with I mean, you can you can run a local server and you can set up your data server and that's cool. And you can set it up so that your data server is your domain name. So for example, if you're beyond code boot camp dot com, then your handle can literally be at beyond code boot camp dot com. Mine is
not I didn't. I played around with a little bit, but I just I was a little I just wasn't that. I wasn't that into it because it's it's just it's literally Twitter with the logo changed and maybe a few features less, and you know, you got the local data stor as a feature more. But I mean, I guess cool, good,
you know, go good them. But yeah, if you want to, if you want to install it, there's an issue up that's called it's called something like how to win stall with Node no Docker and it's very very simple, So if you want to do it, I'd recommend it. If you're going to join blue Sky, I think that you have a moral obligation to run a personal data server, because otherwise what are you joining it for. You're like throwing out the baby and keeping the bathwater.
Yeah, well, they're all of the stupid silly politics of people blah, blah blah, Elon Musk something something Blue Sky.
So that's why I'm seeing people move. I think it's all people.
I mean, yeah, if you're really interested in following information about Elon Musk, then Blue Sky's a great place to get yeah, Cause I mean, like, I think eighty percent of the posts or that. So if you really love Elon Musk, you just got to know every detail about his life. Yeah, I'm sorry, I'm sorry, I'm being a bit of a jerk, but I'm.
Like people, okay, but yeah, but.
If that's where people are, I'll go there and I'll talk too. And if they're somewhere else, then I'll go there and talk to people.
I was just I was expecting something more. I was, I was, I was genuinely excited to try it out. I was expecting something more. And it's Pixel for pixel. It's Twitter with a butterfly logo and an option to run a personal data server. Well, it's and a lot, a lot, a lot. Like I will say, I think the politics are heavier on Blue Sky, probably because I haven't followed anybody yet, but like, I.
Think that's the big thing. Like it. I tried it a while ago and gave up on it, and then with the wave of people coming and that that the Star depects like kind of regreen knitting communities, especially among like deaf tools. It's actually not at a point where I missed some of the most interesting people from Twitter, but it is quite high like value to noise like no ads. But that only was the case after followed a bunch of people. So I think that's always the
caved with social networks. Yeah, you have your personal.
I connected with a bunch of people there too, but I got kind of dragged kicking and screaming into some of the dev community politics a few years back, and hm that that came right back to the surface the second I was in there. So I think it really just depends on what your experience is and who you wind up running into. But I mean, I did have a couple of great conversations with some people on there too, so.
But the whole thing about like there's no ads and you know, a small community ball, all of that's gonna go away because the the investors are gonna go from a round to b round and then they're gonna need their kickback and then they're gonna have to figure well, are we gonna do ads, We're gonna charge people money. I mean, I just there's no unique value proposition. It's purely it seems to be purely a moral proposition, right. It's it's like there's more what church are you going
to join? Rather than what technology are you going to use? And so that's where I don't unless they have a unique value proposition where it's like I can do this here that I can't do there, I have a hard time believing that it's going to really bloom, especially because they're investor backed and investors don't care about personal data servers, that stuff's going to go.
Yeah, I mean, I agree with you, And it's honestly the part that I'm most nervous about that it's not apparent yet what their business model is going to be exactly, or if they're doing ads, how they're doing them, Because I would love for Blue Sky to succeed just on the basis of it being an open protocol and hackable and so on. But until I see that, I kind
of can't fully believe in it. But yeah, I'm routing on that basis, and so far, the indication seems to be that the people behind it are deeply aware of this conflict and are thinking about it in good ways. But I don't trust the fact that the introducing the monetization part so slowly.
Yeah, Microsoft's going to come in and buy it and add co pilot.
Yeah.
If you're following along on YouTube, Owen Buckley's posted a couple of comments as well, you know about you know, the algorithm or lack of algorithm and things like that. But it's anyway, it's there's an interesting discussion to be had.
Mostly I went over there because there were people that had left Twitter that I wanted to interact with, and so, you know, as far as that goes, you know, maybe maybe Blue Sky just doesn't get traction and they come back, or maybe they don't or I don't know, but for now, that's where some of the folks I want to be around are and so I'm there, and there are a whole bunch of people on x Twitter that I want to be around, and so I'm there too, And.
Yeah, anyway, so.
Yeah, I apologize for my trolling. Now, No, I'm I apologize for my for my trolling.
No, there's I mean, it's it's it's a discussion that's happening in the community one way or the other.
And so.
You know, I like what Owen says. It's all just a bunch of yapping wherever you go for the lulls.
Yep, true.
All right, I'm gonna throw in some picks, so I always do a board game pick. I was at the Timpcon a couple of weeks ago teaching games. One of the games we taught was Imperial Miners, and I just posted the board game geek link. So Imperial Miners it comes in is at a weight of two point oh oh, so it's exactly two two is casual gamer friendly. It's it's got enough complexity to where it's interesting and fun, but it's not so overwhelmingly complicated that people can't figure.
Like I've picked some games on here that have a board game geek weight of like four four and a half, and it's like, look, this game's going to take you five hours and you're gonna get way into all of the ins and outs of how it's played.
This is not that game.
This game plays in I think we've usually play it in like a half hour.
It says age ten plus. That's probably about right.
You can play it up to five players, I've always played it with three or four players there.
So this game is a little.
Different from some of the other games that I've picked, where you know, it's like, hey, you know, you're all interacting in this specific way. Imperial Miners is like playing solitaire with other people, all right, So essentially in the sense of you you're you're playing on your own board and there really isn't anything else that anybody else can do to.
Mess with you, right, So.
Essentially the way it works is you're building a mine, and so you start with the top level of the mine, and you at cards, so you get a level. You have level one cards, Level two cards, Level three cards, and level four cards. All the level four cards are the same. They give you two points. I think I don't remember exactly.
But they're all the same.
So anyway, you start with two of each card, and so you play one of your level one cards because that's all you can do, right, and then your next turn, if you want to, you can play a level two card that connects to your level one card, right, So you can't ever play cards that don't connect back to the surface. And they each do different things. They have different teams or icons or however you want to classify it categories, and so I think their guilds actually is
what they are. But anyway, so they all kind of some of them playing together, right, So it's like if you have other cards that are of this same kind, then you get mine cards or diamonds which are the points or you know whatever, or coins, and you can you can spend the coins to do other things, like you can buy essentially moving your their technology tracks. You can move your marker up the technology track, or you can.
You can buy.
More cards that are more things you can put into your mind, right, because there are like four slots for level one and so you can put in more level ones. But what happens is when you play a card, you get that card and then you get to choose one of the cards that it connects to above it, and they're offset, so you can pick between two if there
are two cards above it. Otherwise you just go to the one that is above it, and then you you know, you just chain all the way up to the surface, and so you do what each card says, right, And then there's some other complications, like you can have a cave in and so if there's a cave in instead of getting that reward you clear the cave in, right, But.
But there are rewards.
There are cards that say if you have for every cave in you have, you get so much money or so many points, and so sometimes that.
Game emergency stop and somehow has to go. I don't think you saw the message in the chat.
Oh okay, do you have some picks and some before we go?
Yeah, quick one you talked about doing aj I can really recommend the Silo series on Apple TV. It's one of the most fun sci fi things I've seen recently.
But yeah, thank you.
Was the pleasure talking to you guys. Nice to meet you. Yeah, very nice to talk about local first, thanks so much for having me take care.
All right, so sorry, I was on a roll. So anyway, it's a super fun game. Like I said, it takes about a half hour. It's pretty simple.
Everybody just goes at the same time and then gets whatever rewards, and then you do it again for the next round, and you play ten rounds I think, and then you're done. And at the beginning of each round you flip over a card that gives everybody a reward or a complication.
That's it. So I'm gonna pick that.
I am finishing up putting together all the stuff for the AI dev boot Camp. You'll be able to get that at aidevbootcamp dot com when that comes out. I'm hoping to have everything together for that by tonight or tomorrow so you can sign up. We're going to start in the middle of January will be the first week.
We're going to run for three months. We're gonna have calls, at least a couple of calls every week and just kind of walk you through anything that you're running into, answer questions, things like that, just so that you can build AI features into your applications. And that's everything from help bots and stuff like that all the way up through just sort of the I've got this text field and I click a button and it writes a summary
for my podcast episode kind of thing. I mean, I'm looking to build something for the top end dev system that I just barely converted over to a SAS where people can come in and instead of having to know which form to go edit the podcast, whatever whatever field in, they can essentially tell the bot, hey move the episode with ONSELM from Monday the eighth or ninth, or whenever this is going to come out to.
Monday.
You move it a week later and it'll be smart enough to go in and change the published date.
Or we have an.
Episode scheduled with so and so to record on this date and they say they can't do it. Can you move it back two weeks and it's smart enough to change the schedule and update all of the guests and hosts that are planning on showing up and stuff like that. Or if somebody schedules an episode for Christmas, right, I can say, hey, can you block out Christmas and move the episode there a couple of weeks, Or Hey, the title that you have for this episode isn't great. Can
you generate three more? So I can pick one and it'll be smart enough to do that. So that's kind of the thing we're looking for. The system that we've been using to have the show notes written doesn't always get it right, and so it'll pick up on exactly the wrong thing and write a summary that we talked about Lord of the Rings instead of JavaScript. That happened once because Dan told a story about how The Lord of the Rings got translated into Hebrew, and so it said, hey,
they talked about literature. And it was like, well, technically, but anyway, So that's the kind of thing. So I'll be teaching you how to do all that kind of stuff and how to choose the right llms to do that, and how to connect to those services. I'm hoping to
have examples in JavaScript and Ruby. If you're doing some other language, you know, we'll give you enough tools to where you can figure out how to talk to the APIs and get authenticated and all that stuff, but you'll have to use whatever libraries in whatever language you're doing. So if that's Go or Alixer or something. I'm just trying to think what other picks I have. I could pick one that would piss everybody off, but I think I'll save that for next week. And yeah, I guess,
I guess I'll just wrap it up there. I have redone the top end Dev's website. I'm currently working through some issues, but if you point out an issue that I'm not aware of yet, I am totally willing to give you a discount or a free month to the JavaScript Geniuses group or something like that.
So just email me Chuck at top endevs dot com.
And if it's not something I'm already working on or fixing, then you know I'll make it worth your while. So anyway, those are my picks, and I guess we'll just wrap it up till next time.
Max out
