The stream seems to be fine. Hello, if you're joining us on the stream, um, I'm just going to go on Mastodon and just tell people that the stream is online. Uh, if you are around, join us for my talk at University of Gro… I'm gonna try and spell it correctly. There we go. Groningen? Kchronengen? There! I got it! Um, uh, on Small Web, and I'll just give the, there we go. Do you guys know the Fediverse? Do you know Mastodon at all? This looks like Twitter, right? It's not Twitter. Um, Twitter doesn't exist anyway. Um, Twitter is now the fascist place known as X. Um, if you're still on there, get off of there. It's called Shitter. Yes, exactly. Um, it was shit. It was never great, but now it is shitter. Um, so here we go: Small Web… Let me publish that… Maybe some people will join us. All right, great! Let's get outta the fediverse, there we go. Um, I, I mean, if you're, if you're not familiar with who's not familiar with Mastodon here? Anyone? You know of it? Okay. So it basically, I mean, it looks like Twitter, right? Um, but, uh, unlike Twitter, it's not centralised, it's federated. So there are thousands and thousands of, uh, well, maybe thousands, um, of Mastodon server, uh, owned and controlled by different people. And, uh, you can get an account on any one of them. They all have their own governance structures, etc., um, and their own rules and regulations. Um, you can set one up yourself if you want to. It's free and open source. Uh, and, uh, the key thing is anyone with an account on any one of these servers can talk to and follow anyone else on any other server. That is the federated aspect of it. And the federation comes from, uh, a protocol called Activity Pub, which is a, uh, a W3C protocol. Hi there. Could you just get the door? Thank you. All right, for those of us joining us online as well, um, I am streaming this online. Where are we? I can't find my stream thing. Where's my stream thing? Oh, it's here. It's on the other tab. Uh, confusing myself. There we go. Um, for those of you joining us online, we're at the University of Groningen (Kchroningen!) in the Netherlands. And, uh, uh, there are actually people here listening to me talk. You can't see them, but they are here. Make some noise people. Hello. (Woo!) Yay. Okay. They exist. Great. Um, and, uh, I'm going to remove myself from the stream right now, so just share my screen. Um, and you're gonna get that lovely effect, uh, for a second. But, um, it's better than my photo, uh, my, my picture-in-picture or whatever, uh, uh, filling up the screen and, and screen, uh, the slides. So I am just going to share my screen here for the stream. And yep, let's share it. Allow… let's do the entire screen. There we go. And I will switch from this screen, now. You should still be able to hear me and welcome to my talk on the Small Web. Hi. Um, so my name's Aral Balkan and um, I'm co-founder of Small Technology Foundation, which is a tiny two person, not-for-profit, um, based in, uh, Ireland currently. Um, and we work on Small Technology, uh, and uh, what I've been working on building for the last six years, uh, is what I call the Small Web. So, um, what is the Small Web? I want you to imagine a web where each one of us owns and controls their own place. And these places are easy to find, they're very findable, um, because they are at domain names. And we own and control these domain names as well. So I might be me.small-web.org, You might be you.little-place.org, And, uh, they may be them dot tiny-space.org And, uh, very importantly, we also get to choose who we connect with and who we don't connect with. And we don't have to connect either. And that's very important. The goal here is not to connect everyone to everyone, or as we see in centralised systems, to connect everyone to a centralised system. So them.tiny-space.org maybe just isn't feeling very social right now. And that's okay. They can be off on their own. Maybe they're doing something in their own little space and that's fine, right? Um, but we get to choose who we connect with and we can connect directly with them. And that's key. And at these places, we can choose to be public if we want to be, but we can also, and this is very important, choose to be private if we want to be, and I mean actually private in the sense of privacy being the right to choose what you keep to yourself and what you choo- uh, what you share with others. Very simple definition of privacy, which the mainstream seems to be very confused about continuously. So, um, here we're seeing that me.small-web.org is talking to that other node up there and it's private. And how, how is it private? Well, it's end-to-end encrypted. So all of these nodes can talk to each other through end- -to-end encryption. Um, and, uh, you know, for those of you, I think we do have actually a cryptographer or two in the room, or at least one. There we go. Uh, the mechanism behind this in the Small Web protocol is we use public key encryption, and we're using ed 25519, uh, public and private keys. But importantly, you don't need to know about that in order to use this system, otherwise you wouldn't use this system. So, uh, in other words, the Small Web is a peer-to-peer web and more so it's a personal web of places owned and controlled by everyday people who use technology as an everyday thing. This is really important. Who is it not for? It's not for geeks. It's not for enthusiasts, right? We already have tools for geeks and enthusiasts to protect their privacy, to be able to publish publicly if they want to, right? Uh, those of us who spend an inordinate amount of time, uh, you know, recompiling the external and doing this and that, uh, we have less of a privacy problem we do because it's like secondhand smoke, right? Uh, when privacy is being violated and human rights are being violated en mass than of course we are being affected. Just like if we were living, we were sitting in a room where everyone was smoking, you are maybe not smoking and maybe you've got a good mask, but maybe some of it is still, you know, uh, seeping in. So, uh, it's very important that it is for everyday people who use technology as an everyday thing. And let me make it very clear. I don't mean dumb people, I don't mean stupid people. 'cause we have an arrogance in the free and open source world, especially where we sometimes create very difficult to use things. And then we say, “try harder!” You know, “you're just not clever enough to use our ethical alternative that we've created that requires you to jump through 50,000 hoops and recompile the Linux kernel.” So, um, it's very important that these, uh, that the Small Web is easy, affordable, because we also don't want privacy and human rights to be something that only people with money can buy. 'cause again, it's less of a problem, right? Um, if you're someone like Mark Zuckerberg, when you buy your house, you buy the two houses around your house as well to protect your privacy. While at the same time, the whole business model of your corporation is to violate everyone else's privacy, right? So, uh, they have to be easy, affordable, and useful, simple things, you would think. Um, so, uh, the goal that I gave myself about six years ago was, I wanna make owning your own place on the web require no technical knowledge to set up or to maintain. And I want you to be able to do this in under a minute. And again, this comes down to the experience, right? It takes you how long to get an account at a centralised service run by some Silicon Valley company somewhere, right? Uh, you're not, of course, owning and controlling that. You are renting that from them in exchange for what? Your data, your, you know, uh, insight into your life, which can be used against you then, uh, for their profit motive or whatever other motives they have. So this is the goal I gave myself about six years ago, and I've been working on it for about six years on this particular solution. Um, I've been working on the problem for about a decade, and, uh, as of last month, I was able to get it to 10 seconds. I'm okay with that. I'm not gonna keep optimizing that. I think 10 seconds is fine. Um, you know, few seconds faster would be great. But why is that important? Again, if we can make it so that it is not, it's not the hurdle, this is not what people get stuck at, then we have a chance at creating this topologically decentralised network. This is where a lot of peer-to-peer fails. A lot of peer-to-peer fails because of two large challenges with peer-to-peer. One is findability, the other is availability. And the third one is usability. So findability, it's, it's a hard problem, right? If we're doing peer-to-peer in the sense that I want to be able to go from my phone directly to your phone, I need to be able to find your phone, right? And, uh, or from my phone to your computer, I need to be able to find your computer. Uh, so we need some sort of, uh, addressing system. We could use gossip systems, etc. There, there are ways of doing it. Usually they involve some node that's always on and findable and well known that acts as an intermediary. So my thought was, okay, this is, we always end up having to use some centralised node to guarantee findability. We always end up having to use some centralised node that becomes a trusted node to guarantee, uh, availability. 'cause your computer might be off, your phone might be off. How do we get messages between them? Well, we have to store them somewhere, right? That becomes usually an always-on centralised node. What if we make it a network of always-on nodes that are owned and controlled by people? So that's the idea behind it. Um, and the way that I've been able to do this is through three interrelated apps, through controlling a large amount of the experience. I haven't rebuilt the whole stack. This is the web still. It's built on the web, on, on core web protocols and technologies. But I've had to rebuild parts of the stack because the stack is built for Big Tech, not for Small Tech. All of the free and open source frameworks that we have, all of the free and open source servers that we have are released by corporations like Google, like Facebook, etc. Why to enable people to be able to create similar tools or, you know, more so to work for them, uh, when they learn these open source tools so that they can get bigger, etc. So, um, I've had to rebuild parts of the stack and, uh, the apps are Kitten, Domain, and Yarn. So you're going to see two of those today. Kitten and Domain, Yarn, I'm just starting on. Kitten is a Small Web development kit. It's a little kit, get it? Kitten. Um, so, uh, it's aimed at developers. So this is not for everyday people who use technology as an everyday thing. It's for developers. It's for the programmers among us. And, uh, you can find out more about it at Kitten.small-web.org. All of these are of course, free and open source. Everything we do at Small Technology Foundation is free and open source. Um, and I don't mean open as an open for business. I mean free as in Freedom. So everything's under AGPL. Um, Domain is a Small Web hosting platform. So I said I got it down to 10 seconds to set up your own Small Web place. That's a combination of Domain and Kitten working together. Domain hosts Kitten Apps, apps created in Kitten. And the fact that they know about each other, the fact that they work together is why I've been able to get it down to 10 seconds. That, and things like Kitten has an in-process database that I wrote. So you don't have like some sort of centralised big database. Why? We don't need to farm everyone's data. We don't need to work with Big Data. We're just working with your data and you own and control all of that functionality. So that's aimed at organisations like us, like Small Technology Foundation. We're going to host an instance of domain at small-web.org where we'll be hosting people and how many people? At most, a couple of tens of thousand, like 20,000, 10,000 at most. Uh, why? Because we don't need to do more than that to be sustainable. And that's what we're aiming for sustainability within the current system. So maybe people there will pay us 10 Euros a month in order to have their Small Web place. And that's what will make our not-for-profit sustainable. And then we'll cut it off at one point because our goal is not to grow and scale and become a centre. And other organisations, hopefully around the world will host these Small Web sites using Domain. A big part of the challenge has been to make Domain very easy for other organisations to set up and use. It would've been much easier if we were gonna be the only hosts. So, um, you can find out more about that on, uh, codeberg.org/domain/app. I haven't got a separate site for it yet. In fact, Kitten didn't have its own site until last week, but it does now. So to go there, it's very nice and very welcoming to developers. Um, Yarn is a Small Web personal social network app. So this is an app created with Kitten where you can be public if you want to be private, if you want to be, right? And I'll show you what the private aspect is going to look like in a demonstration here, um, that I'm going to be helped on. Um, uh, so, uh, that's, that's the bit that's for everyday people who use technology as an everyday thing. And I'm just starting on that part. So, um, it's these three things. And I wanna start with a demonstration of Domain. So I said I got it down to 10 seconds to create a new site. Uh, I wanna give you an idea of what Domain looks like and how it works. So let me switch over here. Uh, great. I started this earlier. I just created some prewarmed domains for, uh, Domain to work with. Uh, do not worry about that. Let's, uh, let's go over here. I have Domain running on my own, uh, computer here. So I'm just gonna go to its settings now. You'll see that right now. Um, it says it's coming in 2024. This is the bit where actually, uh, people would use, um, outside of your organisation to sign up for its Small Web places. Um, the settings that I'm going to is what the organisation itself would use to set up places. Um, and again, if you are an organisation and you want to host Small Web sites, you would configure it. First of all, your setup of Domain. You would set your organisation details like the app here. Um, you would decide what applications you wanna support to be installed. From there. You can see, um, applications are installed from Git repositories. So everything, again, the whole ecosystem is built on free and open source, right? Uh, you don't, you wanna have like a, a private app that, that you wanna install through this? No, it's not built for that. This is the whole ecosystem is free and open source. Um, and you can configure it. Um, if you're running a public version of Domain, it has to be on the Public Suffix List. 'cause what I did is I basically hacked the Public Suffix List in a way, um, to use it. So that small-web.org, for example, in my case, small-web.org, uh, if it's on the Public Suffix List, do you know what the Public Suffix List is? It's a list that all of your browsers has. So every browser on all of your computers, uh, downloads this list called the Public Suffix List that's maintained by Mozilla. And on it are listed these domains, like small-web.org is listed there. If the browser sees that domain in the Public Suffix List, it treats it like a top level domain. It treats it like dot org, it treats it like dot com. And that's really important. It's really important for security because it means that you don't have cross-contamination of cookies, etc., between which you would normally have, um, between sub-domains of a third level domain. Uh, and, um, it means that basically we are de-facto running our own domain name, our own top-level domain, but it doesn't have to be commercial. We don't have to go through the ICANN system, etc. So that's a little hack, right? Um, we, we make the most of what is… what exists, you know, the bits we can use within the kind of system that exists right now, even if it's mostly geared for Big Tech. Um, and, uh, you set up your Domain Name Service, uh, which you can do from, uh, uh, DNSimple. And you set up your Virtual Private Server service, which currently is, uh, supports Hetzner, but it can support different ones in the future. That's the goal. Um, and once you've done that, if you want to take payments, you can set up your payment system. It's not set up right now for this one. And then you can create places. Now, this could be for your organisation. This could actually be like, you know, the University of Groningen could run its own Domain instance and it could set up Small Web. So you could set up Small Web places for everyone who works here and, and who studies here, etc. So you could, we could build this system here if we wanted to, basically, right? We could kickstart it here, just like maybe, uh, uh, Facebook got kickstarted in Harvard. Uh, but it would be a non shit Facebook that we kickstart here. We could do that if we wanted to, um, and, and University of Groningen could actually run their own Domain instance. So, um, what I'm going to do is I'm going to install, um, a custom application, which just means that I haven't added it to my Domain instance yet. And it's called end-to-end… It's the end-to-end encrypted Kitten Chat example from the Kitten examples that we have. Um, so I have it on Codeberg. Do you guys know Codeberg at all? It's like GitHub, but it's not shit. Um, it's run by a not-for-profit. It's not run by Microsoft, etc. And otherwise it's like GitHub and it's a cooperative and it's based in, uh, Germany. So, um, here's the end-to-end encrypted Kitten Chat example. This is a Kitten app. Um, it, even though it's an, it's quite a sophisticated app in the sense of what it's doing, there's not much to it. Uh, as you'll see with Kitten apps, 'cause I'm going to, whatever time we have at the end, I'm going to take you through Kitten. If, if you have your notebooks with you, you can install it and you can follow along with me later. Um, but we wanna just install this. So I'm just going to get the URL of the repository there and put it into my source and I'll put this on… Um, let's call this Groningen… just to make sure it doesn't exist… Aral. And, uh, I'm so sorry, what was your name again? [Tariq.] Tariq, of course. T-A-R-I-Q. Yeah? Alright, so I'll create one instance for myself. Now I'm gonna register this. Watch, watch this. This is the best… This is where it just blows up, of course, 'cause you're watching. Um, don't watch that intently! Um, so domain registered starting server provisioning security certificate. And there we go! Your new place is ready. All right, that was it. I'm gonna view the place… And that's at groningen-aral.small-web.org. You can go there now. It exists, it's a server that exists. It's running a VPS server, um, uh, very tiny VPS server and it exists and it's running. Um, and then if I click this link, um, I can go to, uh, the private, uh, chat area, but it says I can't sign in because my identity and secret have not been created yet. Okay? So, um, I'm gonna go back here… where are my settings? There we go! It says “Create secret.” And I'm gonna go over there. It says, “Hello! Welcome to your new Small Web place.” Maybe I'll make that a little smaller so you guys can see it. That's Kitten, actually. A little kitten. Oh, I have Kitten stickers. By the way, if anyone wants Kitten stickers at the end, just come and pick up your Kitten sticker. Um, so it's created a secret for me. And my secret is a list of emoji that doesn't seem very secure, does it? Doesn't, it doesn't, doesn't, uh, exude a lot of confidence. Um, it is very secure. That is your ed25519 private key encoded in basically base-256, mapped to, uh, a list of emoji that I seem… that I like. Um, why is it emoji? Well write that down and post it on the monitor if you can, right? On a, on a sticky note and put it on your monitor. You can't, right? Um, so, uh, one of the things that I'm trying to do with this is to encourage good security, right? So it actually says, you know, put this in your password manager in the bit that's for everyday people for, uh, that use technology as an everyday thing. Um, it will actually tell you what a password manager is that you'll be able to find out if you don't know and lead you through that process, right? Um, so I, I'm just gonna copy this secret here. And since I'm running it here, I'm not even gonna save it 'cause I'm… I like to live dangerously. Um, and I'll paste it in here now. So I went back here, lemme make this a bit smaller, that's too small. But anyway, um, and I'll sign in using that secret, okay? And, oops, I didn't wanna go into that settings. We'll look at what that means later. Um, I wanted to go into this settings, not settings… I don't, I just don't even want to go into settings. Actually, I wanna go into my en… encrypted chat. There we go. Um, there we go. End-to-End encrypted Kitten Chat. So there's my version of End-to-end encrypted Kitten Chat. This is kind of like the very seed of what Yarn is going to be, okay? Imagine if you had a blog attached to the means to privately communicate and you had those two things in a single app. Um, so this is kind of, this is great, but it's not a lot of fun if you want to chat just by yourself. So let's create another one. Let's create another server. So I'm gonna go back here and I'm going to go to, let's just view the places. There we go. We've created that one. Let's create a new one. And I'll call this groningen… tariq. There we go! Yeah, I got it right? Boom! Registering it… Look, it's working again! Can it work twice in a row in a demo? Maybe. This is still very young. This is, I mean, I've been working on it for a long time, but I mean, there's a lot behind the scenes. Um, there we go! “New place is ready.” Yeah, you have one too. Alright, so I'm just gonna create the secret, and now that I've created my secret, I'm gonna copy my secret. There we go. And I am going to send you this secret on Signal. So let me, uh, just launch Signal over here… Oh, gosh, no, I don't wanna actually show everyone my Signal, though, do I? Uh, how do we do this…? Damn it! Mirela is laughing at me in Signal. [Laughter] Great! All right, here we go. So we go to Tariq… and we paste the secret. And there you go. Nope, I'm not gonna send you an emoji, a sticker. Come on sticker. No sticker! There we go… Signal! Good! Did you get it, Tariq? Yes. Perfect. All right. Um, so, um, I need you to go to, uh, groningen-tariq.small-web.org and, uh, just to that domain, just there. Yes. And go to the link… click that link where… it's the private link. So this one, this end-to-end encrypted Kitten chat. Just, uh, can you see it? Lemme see what's going on… [Tariq] I'm seeing this now. [Aral] Uh, “this is currently a placeholder for…” Oh, that, you know why that is? We did set up a server. I just, uh, set up the wrong app on it. So let's create another server. Excellent! Look at that! I, I I installed Place there, which is, uh, currently a placeholder. All right, so instead, let's go to Custom again, let's put the source in there. It's a live demo. These things happen. Um, this was all my fault, by the way. And we'll say groningen… tariq… two Ta-dum! Register! Servers are cheap. We can just create as many servers as we want, and then I will delete them so that I don't pay too much for them. Um, all right, domain is registered. Oh shit, this is where, this is where everything's gonna go wrong, isn't it? Dammit. Ah, it was going so well. All right, let's see what's happened. Gimme one second. I'm just gonna go in here and, uh, oh, what are you doing? Stuff is happening. All right. Forget that. Let's restart. If it doesn't work, you turn it off. You turn it on again. This is, this is what we do in tech. Um, all right, let's just see what state this is in. Um, ooh, what are you doing? Okay, cool. It's, it's doing, it's, it's setting up its prewarmed servers. That's good. Alright, let's try this one last time. So, so let's go to dev4.ar.al and to its settings. So again, we're in Domain and I am going to, let's just see if our prewarmed servers are there. We've got another server being prewarmed right now. So there we go. Let's just wait for that as well, because it is, it is pre-release. It is a bit temperamental right now, and, uh, the queue and stuff needs a little bit of work just to make sure that it's not temperamental… “servers ready.” Great. So we should have, if I look over here, all right, three prewarmed servers, we should be fine. Let's go and create this again, um, custom. And there's the Kitten chat, and we'll just make it a… groningen… Third time's a charm [nervous laugh]… tariq three… There we go. Okay, fingers crossed. “Registering domain…” “domain registered…” Get beyond that! Ah, nope! It is… I mean, unless what is happening? No, we're, we're, we're, something's gone wrong with the, with the internal state of this, um, which does suck in the middle of a… here's what we can do though, Tariq, here's what we can do… I've got your secret. That's fine. You know what? I can change that server into a Kitten Chat server. Um, that's exactly what I'm going to do… So, um, and you'll see a little bit of, uh, Kitten there. So groningen… what was it? tariq… right? Yes. Oh, live demos… Got a love them. So this is what's there right now. Um, what I can do is I can go into Kitten's own settings in there, and every Kitten app has this. And over here I can use, um, that, do I still have? This was Tariq’s, right? No, this is mine. Um, do I still have the… Sorry, in Signal? Ah, yes, that's right. I have it in Signal. There we go. Let's get your secret from there. That's my password manager right now. Don't use it as a password manager. Uh, here we go. And I'll copy that. There we go. So I can sign in. Now let's see if this works. So, these are the settings that are common to all Kitten apps and there's a lot of stuff in there. Um, but one of them is you can actually change the app that's on there. You can deploy a new app onto your server. So thank fuck I put that in there. Uh, it's always nice to have these little manual ways of doing things. Now, if this work- git, uh, does not end git, it should end in Git. There you go. Deploy! Yes, please. Deploy. It. Could not find domain upstairs. Oh, bullocks! I know what's happening, though. I can fix this! Gimme one seconds… Uh, we run Domain it, it's communicating with Domain, with the original Domain that set it up. Do it! Work?! Yes! I mean, this is fun for me. I don't know if it's fun for you, but here we go. We have a new Small Web place set up. Gonna copy your secret Tariq, like the last however many minutes, five minutes didn't happen. We're copying his secret. It was so smooth… It was just, um, wonderful. And we're going to go to Signal now and… come on, Signal… launch! Thank you! Um, and I'll send you this… and we close this. You have it? Yes? Now when you go there, Tariq, tell us, do you see the end-to-End encrypted chat? Please say yes! Alright! Excellent! You're in the end-to-end encrypted chat. And you need to sign in with your secret. He's signing in with a secret. You can all see this. This is good and it works. Now, here's how we're gonna chat. Bloody hell! Alright, um, here we go. Here's how we're gonna chat. I'm gonna send a message to you, okay? Where? Well, I know your address, right? You are groningen-tariq dot small-web.org, okay? And I'm gonna say, “Hey, Tariq, wasn't that entirely seamless and smooth?” There we go! And I'm gonna send that to you. Please work! groningen tariq dot small-web.org. “Hey, Tariq wasn’t that entirely seamless and smooth?” Send! Why are you not sending it to groningen tariq? Did I spell that? Spell that right. Maybe it doesn't need the, this is a small test demo… okay! Yes! You don't need the HTTPS. Do I know my own demo? No. Alright. How do you respond to me? I'm groningen-aral… say something! God, we have drawn this demo out far, far more than it should have gone for, uh, time-wise, but that's okay… Now what you're, what you're seeing here is end-to-end encrypted messages being… there you go! You have now experienced… one of the first people to experience the peer-to-peer web. We have just sent messages from one web server owned by Tariq to another web server owned by me, right? Tiny little web server. Um, there's a lot of work to do to make the whole process smoother. And Domain is not very close to, I mean, Domain is going to launch this year, but I have a few months of work to do on it. Um, but what you see there is something that doesn't currently exist, right? The ability to set up your own web place in about 10 seconds… when it works, um, and the ability to use that web space to communicate privately between one another. The animation that you see is just BC that's just like, it's on the client side. It's just making it look like it's doing something. Um, the actual, you know, encryption/decryption is, is not as exciting necessarily. Um, but there we go. So that is a… that is a demonstration of domain. The other thing that Domain, I mean, uh, what you saw there, Domain itself is written in Kitten, uh, the end-to-End encrypted example that you saw is written in Kitten. Um, so, uh, let's take a look in the remaining time, uh, at Kitten itself. So for one thing, like, why Kitten? Why did I have to create my own server, my own kind of framework, basically, uh, why not just use one of the Big Tech ones? I touched upon this earlier… they’re for building Big Tech, right? Our needs are much simpler. And at the same time, all of that complexity means that I couldn't possibly set up a server in 10 seconds like that, right? I couldn't possibly make it so that it requires no technical knowledge to update, etc. Or it would be much harder and there would be so much overhead… Why? I would be running an out-of-process database like PostgeSQL or, or, or MySQL or whatever they’re MariaDB as we're calling it. I think now, um, these databases are built for Big Tech for Big Data, right? I would have to run, uh, maybe, uh, an external queuing system, etc. Mastodon, for example, which you saw my Fediverse site, my Mastodon site… is built with these technologies. And, you know, I've seen accomplished engineers spend hours kind of and rip up their hair, uh, trying to install it properly. Yeah? Um, so we can't do that if we want our success criteria to be, everybody can have this easily. So let me show you, um, what Kitten is. Uh, those of you that have your laptops with you, um, if you want to, uh, play along, you can. Um, I'm just gonna take you through the basics of it just to show you how many of you have com- like programming knowledge? How many of you have created stuff for the web? Okay, so that's about half of you or more than half of you for both of those. Maybe a few hands less for the web. Um, so you probably have gone through some of the struggles. Uh, you probably know some of the challenges of it. So I'd really like you to kind of compare it to, well, what's a Small Web approach look like? Where our goal isn't to scale some node as as large as we can… to cluster to, you know, farm as many people as we can for their data. If that's not our goal, if our goal is just to create a tool for a person that they themselves own and can use, how does it look as a developer, from the development side of it? So let's take a look… Alright, I am going to move this here. Let's, we don't need Domain anymore. I'll just go to my demo folder. There we go. And we'll make a new folder for Groningen. Yes, I did prep for this, believe it or not, I did have a prep folder there. Um, and, uh, let's just take a look at Kitten, what it's like… So first of all, um, how do you get it? Well, you go to kitten.small-web.org. Kitten itself was… the Kitten website is of course written in Kitten and deployed using Domain. Um, and, uh, if you scroll down here, it tells you what it is. First and foremost, it's a server. If you give it HTML from 1993, it will serve it. And that's by design. It should do that. But then you can progressively enhance it with modern technology. It's got things like built-in support for, uh, cryptography, uh, for public-key, uh, uh, encryption and decryption. Um, and you can create peer-to-peer Small Web apps with it. Um, it's got a really neat workflow. Um, I mean, I, I made it so I have to think it's neat, I guess called Streaming HTML, which I'll show you as well. So to get started, if any of you wanna follow along, uh, you should hopefully have gotten the tab for your operating system. Now, if you're on Windows… let's not do this. Okay? If you're on Windows, there we go. If you're on Windows, it says “Windows is an ad infested and surveillance-ridden dumpster fire of an operating system, and you're putting both yourself and others at risk by using it.” And that's even without Recall. Yeah, exactly. It does also say, “if you are not forced to use it for reasons outside of your control, please do not use it.” If you are… if you're forced to use it because of reasons outside of your control, I get it. You know, that might be, you can't afford a new computer right now. You, you can't afford the time to, to mess with Linux. Or maybe, I don't know, uh, or it might be that work mandates that you use this. Anything outside of that, though, I have zero sympathy for you at this point. Um, I was on DOS as a 7-year-old, so I, I'm also stubborn. So I moved on to Windows and stayed on for far longer than I should have. Um, don't make the same mistakes I did kids. Okay? Just say no! Um, so if you're on Windows, don't follow along because the installation instructions are are much more complicated as well. Uh, if you're on Linux or macOS, you just copy and paste this into your terminal, um, and you will install Kitten. I mean, I've got, I've got Kitten installed, but I can just do it here to show you. Um, as long as my Internet connection works… Boom! Kitten is installed. Okay? Uh, it's a bit faster on mine, um, because it already downloaded the runtime. The runtime is NodeJS. So those of you who've done web, uh, programming Kitten uses NodeJS as a runtime. I call it a runtime because I might change my mind later. I might move on to something else, but probably not. Still, I want keep that option open. Um, so we have installed Kitten, so let's run it. Okay? Um, the way you run it, and I'm on an empty directory right now, is I'm just gonna say “kitten”. We have not created anything yet. Kitten is running, okay. Server's running and waiting for, uh, connections. There's a little kitten. There you go. Um, and, uh, I'm just gonna go to localhost where it's running and it says 404 page, not found… exactly what's expected, right? We haven't created anything. So this is the most basic Kitten website that you can build. Um, let's go ahead and make it a bit more interesting. So let's close this. There we go. And I'm going to just, uh, create a file called index.html. All right? So we're going back to 1993 now, and in my index html, oh, the moment I created it, did you see? It just went blank. So now it's found it, but there's nothing in it. Okay? Alright. I can live with blank. Blank is good. Um, so there, I'm going to say “hello”. Well, let's, let's, let's make it some HTML at least. Um, let's say “hello world”. All right? Our very first example, and this is just an HTML file, um, it actually, uh, does not have a reload for HTML files. Um, but there we go. “Hello, world!” Okay, this is not very exciting, but it means that if you give it something from 1993, it will render it. Let's make it a bit more exciting. Let's create a dynamic page. Alright? So I'm going to… not exit my browser… although I could, I mean, it's just, um, not what I was planning on doing, uh, over here. Exit the editor instead. Just… far better. Um, and I'm just going to move that index html to an index.page.js, okay? And, uh, let, let me go back into my editor. So now, if I just save this and go to localhost, I'm not gonna get an empty page, I'm gonna get an error because it says, “oh, the page route at index.page.js is missing a handler.” Uh, what's a handler? Oh, it's this… So part of my goal for Kitten is that hopefully it will be really useful for education, for actually teaching people how to build things for the web. So it tries to be as helpful as it can to guide you along in the process, even if you're just kind of stumbling along with it. Oh, that looks like a a, an export default. So you export a default function that returns some Kitten, HTML, which is a tagged template in JavaScript that has that “Hello, world!”, okay, seems like a lot more code to do the same thing, but let's see if it works. First of all. Um, so I just did that and it says “Hello, world!“ Okay, great, but we don't have to say “Hello, world!” now, so we can evolve this. Let's start evolving it. Can you all read the code? From the back as well? Yeah? Okay! All right. So instead of “Hello, world!”, what can we make it say? So let's just, uh, indent it nicely. Um, how about we, um, put a little cat on there. Okay, that's still a static, um, static, uh, string, but this is JavaScript, so it doesn't have to be a static string. This is a tagged template string. So what I can do, I'll make it a bit bigger for you guys just in case it helps. Um, what I can do is I can repeat that maybe 10 times. 'cause I can actually include JavaScript code in this because this is a JavaScript file now, right? So now if I save it, we get 10 kittens, way better than one kitten, right? Um, but again, quite static. It's always 10 Kittens. So why don't we make it so that every time you reload the page, you get another kitten. Does that sound good? Yeah? So, I'm going to go over here and create a variable called count, and I'll set it to zero and over here, instead of repeating it 10 times all the time, um, what I'm going to do is I'm going to say, uh, plus, plus count. So I'm putting the plus plus before it so that it's gonna be one the first time, two the second time, etc., right? So here we are. Now, if I go into my browser and I refresh, you get a Kitten every time, that's pretty cool! There we go. Um, but here's the thing. This is happening in memory, right? I've just created a variable and the variable’s in memory. So what's the problem with this? Maybe nothing. Maybe you wanna have an ephemeral website that forgets things. That's okay. Maybe you wanna have statistics for the website that you're building, but you don't want this to be something that's held onto and stored. You want it to disappear every time the server restarts. That's cool. That's privacy-respecting. That's kind of nice. So, you know, we've been taught by Silicon Valley that the only thing that matters is storing as much data as we can. Not necessarily, you know, there… there's, there's something cool about things being ephemeral as well. So, um, but in this case, if I go and turn off the server, there we go. And I go back and I restart it. Look at what happens. We get one kitten. Damn, we lost all those kittens. Sad. Um, how do we keep the kittens? We need to persist it. We need a scary database, right? This is where normally you would go and you would, you know, install your out- of-process database, you’d install your library for object mapping between your database or if you're even geekier, you’d just write your SQL statements and all of that, right? We're gonna approach it a little differently. So we want to persist this count. So here's what we do. First of all, we need to create a database table for this, right? And, uh, Kitten comes with a JavaScript database. This is an in-process in-memory database that I wrote, um, that persists to append-only JavaScript files, not JSON files. It actually outputs JavaScript code in an append-only log and then loads that back in. So you're actually working with native objects. You can, you can, uh, persist basic objects… You can also persist custom, uh, instances of custom classes, uh, and get them back as that instance of a class. So it's a pretty cool little thing. Um, so how do we use it though? We can use it very basically. So I'm going to say if kitten.db, every app gets a database kitten.db, so it's very easy to use. You don't have to set it up dot kittens equals undefined. If it doesn't exist, let's create it, right? We'll say, uh, kitten.db.kittens equals, we'll set the count to zero, okay? Now all we have to do here is instead of plus plus count, we just say plus plus kitten dot db dot kittens dot count… kittens is just an object, basically a table if you think in traditional database parlance, but it's a JavaScript object and every time it changes, it is being persisted to disk. So, um, let's see. That's what I'm telling you. Is it true? Let's refresh. So this time we've got, I dunno, five kittens. So I'm gonna go over here, turn off the server, turn on the server, and when the server comes back, we have six kittens. So it's persisted. That's a database. So, um, the Kitten Chat example that you saw stores its data using the Kitten database Domain uses the Kitten database internally. And, uh, you can do far more complicated things with it as well. You know, you can actually have, you can have type safety all through that process of persisting to disk and getting your custom objects back. Um, but, so this is cool, I guess. Um, it shows you how easy it is to work with a database, but this is not how we normally build apps, right? Like this… like refreshing a page to do something. You would normally, if this was a real production-quality Kitten count app, uh, you would have like a button that you press and you'd get more kittens, right? So let's take a look at the Streaming HTML workflow that you can include on this. And this is probably the last thing I'm gonna show you about Kitten. And then maybe we can have like in the remaining 10 minutes or so, a a little Q&A. Um, I don't know if we can overrun by five minutes with a Q&A. If not, that's fine. Um, alright, so we wanna have a button, and when we press the button, we want, um, our kittens to, to appear. So, um, before I do this, I want to, uh, show you a concept in Kitten, which is components. In order to do that, I wanna show you Kitten’s new, uh, as of like several weeks ago, interactive shell. So Kitten is running in my terminal right now here, and it says to launch the interactive, shell press the S key. So Kitten itself has an interactive shell. If you press the S key, you're now inside of the running Kitten instance of your site, right? And you can see what, uh, properties there are in the Kitten, the global object. So, um, we have a database at kitten.db, right? So if I look at kitten.db.kittens, I can see that, um, there's my, that's what it looks like internally, right? There's my object with the count of six. It's actually a proxy. That's how the magic is happening. Um, because that object is being pro… is wrapped around, uh, has functionality wrapped around it that's capturing changes to it and persisting it to them… doing all of those things. Um, so, uh, and it's kind of cool because you can change it here as well. Like if I wanted to have lots more kittens and I didn't wanna have to press reload, um, I could just set it to a hundred. And when I refresh, I have a hundred kittens. So you're actually working with the state of the, uh, the, the current app that's running. Um, this is really useful if like you wanna mess with things as that's deployed as well, you could mess things up of course, but, um, it's, it's quite powerful. So we're back to one. What we can also do is, so this is, this is kind of cool. Um, I can actually listen for changes, uh, on the database as well. So if I created, for example, a, a persist listener, and that's a, uh, that's a function and it will get, um, the target and the change. Um, and if we just console log that for now, we say, uh, target, changed, and we'll just put the change there just so you can see what's happening. It'll give you a good idea of how Kitten works in terms, in terms of an append-only log. Um, so, um, I can just add that now I can say kitten.db.kittens dot table That's my table. It has a private property called table where I can actually, uh, add listeners and, and do other things. Um, and I can listen for the persist event on there. And I can just add my persist, oh, perist, perist listener. Okay, sure. I’m a developer. Can I, can I spell no? Um, now if I refresh, look at what happens… Um, you're saying… it says JSTable changed and then count ID equals zero. Um, in fact, if I do this, um, if I go over here and remove listener, first of all, listener, persist, perist, listener, um, oh, of course it's not, that's a string. Lemme just remove it so that it doesn't get called all the time. And if I go over here and, uh, both fix my spelling error, let's call it a persist listener, and also just instead of the whole target, uh, this is the table. So I can say table name and then I can go back here and add a listener, uh, the persist listener this time. And now if I do this, it'll be easier for you to see. Um, table is not defined, eh, all right. Anyway, you get the idea. Um, I'm gonna have to, oh, go back in there. Lemme see what I did wrong… Oh, here's the other thing. You have full history when you're doing that as well. Um, okay, I didn't change this to table, that's what happened. And let me just add that again. Persist listener. Finally. Now, if I change it, Kittens changed. Count six, count seven, count eight. This is JavaScript. This is what's being stored in a file, append-only, and then it's being loaded into memory and those changes are being applied. So, uh, and in its very basic form. Um, you have other things here that you can play with. So one of those is the Kitten HTML tagged template that you had. Um, so I just wanna show you how to build a component in Kitten in the, in the terminal. So I'm gonna say, uh, let's call it a Hello component, just to keep it simple. And I'm going to say, okay, well this can take a name as a prop- a property, and it will return some Kitten HTML, uh, and the Kitten HTML will be maybe H1. Hello, uh, name. Okay. And then we'll close that H1 tag over here. Uh, and here, um, actually you can set a default for the name. Maybe default is Aral if you don't provide a prop and a default for that object itself, we've just created a component and I can use it. I can say kitten.html… Um, there we go. And I include it almost like a HTML tag. Hello. And it'll say hello Aral, okay, if I actually pass a name, so I say Mirela, then it will say Hello, Mirela. Um, that's a component. That's how components work in, uh, Kitten. So let's go back into, um, the editor over here. And let's very quickly make a component, uh, make, make a, uh, this have an interface. So I'm gonna say button Moar Kittens. Okay? We want more kittens when this is clicked. Um, and uh, so something has to happen when it's clicked. So, um, it's going to broadcast an event if I give it a name, so I'll call it moarKittens, okay? And we need to connect it to our backend. So I just do that by providing a connect attribute to it. Now, if I do that, I need to export a function from here called onConnect. That will get called when the page connects with a reference to the page that's connecting. And on that page, I can actually, uh, listen for the, uh, moarKittens event and then do something when the moarKittens, uh, event happens. Uh, what do I want to do here? I want to increase the Kitten count. So I'll say kitten.db.kittens.count. Okay? Um, and then I want to send, I don't wanna refresh the whole page, I just want to send this H1 with the right amount of kittens, just that bit, almost like a component, right? So let me pull that out into a component which you just saw. So we'll say const Kittens, and we'll make a component there. And that'll just return Kitten HTML again. And I'm just going to take, this is a refactor… So I'm not changing the functionality. I'm just, um, removing redundancy that we're about to implement. And I don't need to increment it now because I'm incrementing it when the button is pressed. I just need to send this back. Now, what I do need is a way for it to know which H1, which tag is being sent. So I'll give this an ID of kittens so that it knows, and I'll also tell it to morph it in there. I don't have to do this, but it means that it's going to actually just change what's changed in the HTML, not, not a larger portion than it needs to. It's gonna be more optimised. And here I'll just say page.send and I will send, um, my Kittens… component. Remember we did it in the, um, in the, um, in the terminal earlier. What I also need to do is at the beginning, send the initial Kittens, right? Batch… batch of Kittens. And that's, this is why components are great. Now I can just use that component in both places. Let's see what this looks like. Oh, yes. And it's telling me that as well. Thank you. You are faster, um, than Kitten. Um, and if I save that, now, let's see if it works. So we've got this, this is this, this. If I press Moar Kittens, oh, oh, oh, oh, no, bad stuff has happened. What has happened? We are returning Kitten HTML. Um, there's an H1 here. We're repeating it by this count. And, uh, la la, la, la, la. What am I doing wrong? Let's see. Uh, kitten db count, page dot send. Oh, here we go. This is actually just a regular string. I need to be sending Kitten HTML back. Okay, that's what I did wrong. 'cause Kitten HTML is what does all the magic. So if I say Moar Kittens, now, I have more kittens, yay. But also notice what we've built, okay, in about 24 lines of code, which I can almost show on my tiny little screen that I have here, here, there you go. Um, we've basically built a Streaming HTML interface, right? When that button gets clicked. So what's happening behind the scenes, in case you're interested, is an automatic web socket connection is being made between your client and the server. Uh, an automatic web socket route is being created for you. We are creating a system where we're using naming conventions… So you can see here we named the button moarKittens and we told it to connect, and Kitten’s clever enough to go in there and go, okay. So more connect… Whenever, um, whenever this button is clicked on the client, I'm going to let the server know that that event has happened. And on the server we're listening for that event, moarKittens, and we're actually updating a value in the database. And that's then, and then we are streaming HTML. That's the, that's why it's called Streaming HTML. We're streaming HTML through that web socket onto the page. And it's being replaced in exactly where, um, it needs to be. The whole page isn't refreshing, only that little tiny bit. So if I was to open the inspector here, um, and show you what happens, look at the, uh, structure and only, oh gosh, I'm refreshing, sorry, I was, press the button. Look at what's changing. Just that little tag. That's what the morph does on there. So, um, that should hopefully give you an idea of, I mean, this is actually really complex stuff in very few lines of code, um, that we're doing. In terms of conceptually, yes, we're putting kittens on a page, but what we're doing is we're doing persistence to a database. We're doing, uh, live streaming of HTML. And, you know, we're doing that with very little code in a way that if you've built web apps before, hopefully, it's kind of cool. It, it's kind of nice. Um, and again, part of it is because there is no bullshit here. You know, there is not, we're not trying to build something that farms people for their data, etc., etc., etc., etc. And that's it! That's a Small Web. Um, I hope I've given you some idea of kind of what I've been working on. Um, hopefully you understand why without me going into too much detail. If you don't understand why this is important, uh, look at any one of my talks I've given over the last 10 years about the problem. There'll be talks with, uh, titles like Free is a Lie, um, uh, Excuse me, but your unicorn keeps shitting in my backyard, can he please not? Uh, stuff like that, uh, where you will find out what is exactly wrong with surveillance capitalism, with People Farming, as I call it, with the Silicon Valley model, with venture capital and all of this bullshit. Um, and then maybe compare it better if, if that's not evident. Um, but otherwise, that's it. Really, this is an introduction to the Small Web. I hope you enjoyed it. And if you have any questions, let's, let's take 'em until we're thrown out. [Applause] And also, let me just go back, sorry, Mirela, uh, Mirela, I know you want to say something, but, um, I am just going to go back here, um, because there might actually be people watching on the stream. Did I just close the stream? Tell me I didn't just close the stream. What have I been doing? Wait a minute. Okay. Uh, nope, the stream is there. Yay. I'm gonna switch back to my, uh, to my camera, but also I'm going to go to owncast dot small-web.org. Oh, I remember now. Uh, if it's on your own computer, it does that by default so that your computer's not bogged down by having the stream downloaded again. Oh, look, we have people here! We're still here! Yay! Um, lemme see if I can change my username. It'll probably tell me no. Um, on Owncast, let's say, let's say Aral Balkan, it is me. Uh, see if it does that. Um, yes. Hello everybody. Uh, let's see what everyone's saying… Um, da da da. Oh, look, we've got questions there as well. Um, cool. Perfect stream out there. Great. Uh, perfect stream in Berlin, people were joining. Um, nice says Kitten. Yes. Um, hello Hyde. Uh, graphics are gorgeous. Thank you so much! Um, meow back at you. Uh, nice. Very cool. Oh, this is nice people were watching. Um, oh, okay. Adel says, I already have Node installed, so wondering if Kitten's runtime might interfere with my local node installation. It will not. Um, it installs it into its own folder. And the reason it does that is so that it doesn't, um, interfere with whatever you have or force you to upgrade Node or whatever. You shouldn't have to care, um, about the runtime. I mean, it's good to know that it's Node because it means that you can use all of your Node modules, etc., but otherwise, um, it should just work. If it doesn't just work, let me know. Um, Hopeful Nightingale says Nice. Martin says, Hey. Oh, there was? Sorry, did I miss a question? Where was it? Where is the runtime? Uh, where is the runtime installed? Okay, uh, well, uh, it is in, uh, your home folder forward slash dot local, uh, forward slash uh, small-tech.org forward slash, uh, kitten forward slash runtime… And then, uh, in there you see npm and node, etc. And there might be a bin folder as well. I'm just, uh, I'm not looking at it right now 'cause I, I'm not streaming my, my, uh, screen. Um, but, uh, yeah, it's, it's installed where it should be installed according to the Free Desktop specification. Um, alright, any, any questions locally? And by the way, guys, if you don't know about Owncast, what I've been streaming with, I've been streaming through StreamYard into Owncast, uh, and Owncast is a free and open source streaming, uh, tool. Um, like, kind of like the free and open source version of Twitch, which again, again, just for you. Um, and it's installed, uh, for like, uh, a single organisation or a single person. Um, and, uh, it's also federated. So, um, people can follow your Owncast. Let me see if I can show you on here. Uh, not while a stream is going on. Okay. I can't show you, but we have about like a thousand something people following, like, and if we go live… on their Mastodon feeds, that you saw, they actually see that we've gone live. So that's pretty cool. Um, alright, any questions from the local audience? Yes. [Unintelligible] Yes. [Unintelligible] Uh, just like your phone number. So what's your phone number? Gimme your phone number so I can give you a text. That's it. So, uh, it's exactly that. Um, and, uh, in the future, do people want to create directories? Whatever… may be, as long as it's opt-in. Sure. But is it necessary? No, the idea here is, again, not for this thing to grow, you know, virally or, or, or, um, you know, exponentially, hopefully it will grow, uh, you know, sustainably and slowly. Um, it'll hopefully be you and, you know, using it with some of your friends, uh, with a local, uh, organisation, maybe at your university. Um, and, but all of these nodes will then be able to follow each other as well as we go. So, um, again, basically you just give someone your domain, uh, as you would give them your phone number, um, or, you know, your Messenger handle or whatever. That's it. Um, and of course that's because it's online on a VPS running somewhere, it's always available as well. Any other questions? [Question: What About the, the hosting? Because now you have this domain where you…] Yeah [Question: This is still like an organisation that takes care… their responsibility… Right?] So the question was, sorry, I didn't repeat the first question. The first question was, um, uh, whatever… what was the first question? [Audience: Um, about Findability?] The first question was about Findability. Um, the second question is, uh, so what about the hosting? So small-web.org, when we are, when we have Domain there is going to be owned by, uh, is owned by Small Technology Foundation. If some other organisation sets up a Domain, it's gonna be owned by them, right? Uh, so of course, uh, they get to curate who they allow there, what their rules are, etc. Domain itself is free and open source. So if you wanna host it yourself, sure. Kitten can be installed on any server. So you could take a Raspberry Pi. Don't take a Raspberry Pi though, because they, they hire spy cops and now they're working with like, you know, they're, they're, they're, uh, working with Israeli companies that, uh, work on AI, and AI is being used in Gaza. Uh, so, you know, um, Raspberry Pi, find a clone if you can. Don't give them your money, uh, BDS and all that. Um, so, uh, yeah, um, I, you can install it on a single board computer, um, and plug it into your router and you can run it there. You can set up your own VPS very easily. What Domain does is, again, the whole idea is that it's going to make it very simple for people without technical knowledge, but yes, on small-web.org for example, if some Nazi, decides to set up a, a, a domain for themselves, and we see that it's a Nazi domain, we go fuck off. No Nazis allowed on small-web.org. Um, someone might set up nazis-allowed.org, then at that point, I can't do anything about it. Then we have other means, uh, hopefully of, uh, you know, combating that, uh, in, in, in, in general in society. Uh, but yes, of course, if you are running, uh, something like, uh, an instance of Domain, then you are responsible and hopefully you will have responsible policies for that. [Question: And If you deleted…] I mean, if you deleted it, yes, the data would be lost. Um, and again, uh, but there's nothing that also… if somebody sets up their Small Web place using small-web.org, um, they can very easily go and buy a commercial domain and have that point there. Instead, they could very easily port it from one, uh, Small Web, uh, host to another. And, and this is how easy it is actually… Here, let me just go back here, um, and, uh, go back to sharing my screen. 'cause this is important. Um, 'cause that data portability aspect is really, really important. So I'm just gonna go back, um, here, and we're just running this localhost, um, app, right? Um, and I'll show it on that. So we haven't created a secret for that. Let's create our secret for that little localhost app, the Kitten count that we had. And then just because it's like any other Kitten, um, site, we can go to settings. And over here I can sign in, remember the, the Kitten settings that we had. So I'm gonna make that a little smaller so that we can see it. Um, and if I scroll down here in data, I've got backup and restore. So I can just go to backup and restore, download a backup, and I've just downloaded the, the backup that will restore any site to this, um, to prove that, uh, that's where it is, um, to prove that, um, I can go ahead and in my, uh, in my, um, whatchamacallit, uh, terminal, I can say kitten dot db, dot kittens dot count equals zero. So, oops. Oh no, we've lost all the Kittens. What are we going to do? Um, and then I can go back to where I was, I think it was here, and I can restore. So I can say, browse, let's get that kittens database, and I can say, restore, okay, I want to do it. And if I go back now to here and I refresh, oh, what happened? Did it work? Did I click restore? What is it doing? Maybe you can't do it locally? Um, Okay, restore complete. I don't know what happened there. Um, but if I go over here, we've got our kittens back, so it just recreated from scratch. So imagine you use some other domain, or you set up another server, you just downloaded your data and then you uploaded it there and you have data portability, basically. Does that answer your question? Yes. Excellent. Great. Um, any other questions? I okay, just one second. I'm gonna switch my stream back into just me. There we go. Okay. [Question: Maybe a bit more technical,] But Sure. [Question: You generate this. Yes. Use your private key to sign. Why,] Sorry? [Question: Why do you Use your, so you generate a private key to put the key. Why do you use your private key to sign in?] Um, you don't use your private key to sign in. Uh, wait, no, you do use your private key to sign in. Yeah. Um, that is your secret. [Yeah. But usually, say ssh we don't actually *unintelligible*] You do put your private, well, I mean, you don't put your private key into a place you don't own. Yes. But, uh, in this case, all of that information stays on the client unless the server's been hacked. Now that is, that is a limitation of the web in general. So if your server's been hacked, um, if you have a, and again, this comes back to the threat model. If you are, this is not for people who have state-level actors interested in them, um, use Signal if that's what you're going to do. Uh, this is basically a best effort of what can be done on the web. So if your server is compromised, sure, it could be serving you anything that looks like… you could be phished for that. Um, but otherwise that is your secret. So what happens is, on the client, you are authenticated on the client on your own device, and then, uh, you tell the server basically, uh, that the, the server basically then says, okay, uh, they've been authenticated, but the the private key never goes to the server unless your server's been hacked. But does that make sense? It only stays on the client. All of the cryptography happens on the client for the private key. The private key never touches the server. [Question: Is the key generated in JavaScript or in the browser…] The key is generated in, in JavaScript in the browser. Yeah, [Question: unintelligible] [Question: unintelligible] No, I mean, what you could do, uh, is you could have an extension, a browser extension for example, and then you could use the browser extension to have it generated, etc. But then you've lost people, you know, and again, it's about threat models. Is this, if this was widely deployed, would this be, 'cause again, remember it's topologically decentralised as well… Would this make it hard for mass surveillance? Would this make it hard for arbitrary surveillance? Yes, it would increase the cost of that. Um, if I was the United States government and I wanted to hack into your little Kitten site, your Small Web site, could I do it? Yes, of course. I could do it in 10 different ways. Um, I would compromise your, your ISP… I would, you know. Yeah, exactly. Um, so it's all about threat models. This is for general use, basically, general use where currently our… the best that we have is that Facebook knows everything about us. Where the best that we have is TikTok knows everything about us. Um, so I think we can do better than that. Um, is it gonna be perfect? No. Is anything entirely secure? No. Is anything entirely private? No. Um, and if anyone tells you otherwise they're lying to you. Does that, [Audience member: Yeah, I was just curious.] Cool. And if you wanna look into the cryptography, actually, um, and, and, uh, if you have any thoughts, please do. The source is all out there. The source is out there. Um, it's on, you can find it from the Kitten site. Good. Yeah. And I would, well, I would welcome any feedback that you have on that. I haven't touched the cryptography stuff for a while, because that was one of the first things that, um, went into it. Um, but yeah. Any other questions? No. Are we good? Yeah. Should we wrap this up? Great. Sure. [Mirela: About Windows?] Mirela, yes. About Windows. [Mirela: *unintelligible* … The goal… many people can you work it… So why not … with Windows? Because…] Are you on Windows? [Mirela: Yes.] I, I see. All right. I see where the question's coming from. Mirela. Um, all right, so the question is, you know, lots of people [Mirela: *unintelligible* … actually here, but I'm just asking…] So lots of people are on Windows… Why do you say such nasty things about Windows, you horrible person? I think was a para- paraphrasing of the, of the question. Um, and the reason is this, what I don't want to do is to encourage the use of unsafe platforms. Um, if someone is using Windows and they're like, “Hey, I wanna set up my own Small Web site 'cause I want privacy”, they've already lost, right? Because Recall is taking a photo of their screen. Recall has their emoji secret if they're not using Edge, if they're using Firefox to sign in, because apparently they don't take passwords… screenshots of passwords in Edge but not for pa-, not for Firefox. Um, if you, if… if your own computer is an unsafe space, there's nothing we can do kind of to help you at that point. So maybe the best thing we can tell you to do is to leave that abusive relationship, right? Leave your abuser, um, get out of that house, go somewhere safe, and then here are some other tools that maybe you can use. Does that make sense? [Mirela: And have you thought also how to go on further… other than talk of how to put it up?] Okay, so the question is like, have you thought about how people are going to know about this? Um, I'm, I'm far less concerned about that. I'm far more concerned initially at this point about it's… you know, um, not stumbling like it did when I was doing the Domain things… that there's some work to do there. Um, and again, you know, you can, you can take it to the extreme where you never release anything. Part of the reason I'm working in the open… anyone can download and play with, and they've been able to do that when it was far less than it is right now, um, is to force myself to, you know, not go for that sort of perfectionism where you never release anything. Um, but, uh, Domain – fingers crossed – will be available this year to developers at least, or to a wider audience that's maybe a bit more technical initially to be able to set up their own Small Web places. Um, I want it to grow very slowly, right? The last thing you want in a system that's so new that has, that has so little, um, in terms of resources, like me, mostly, working on it, uh, the last thing you want is tens of thousands of people to use it at the same time, right? Um, that's when it'll just crash. I want a very slow sort of progression. A handful of people initially, you know, let's, let's hit, we'll hit all of the issues, most of the issues with the handful of people, and then another handful, and then maybe we'll grow from there. Um, my goal is not the same as Silicon Valley's goal, right? Silicon Valley's goal is infinite growth with finite resources, which if you think about it, is basically, uh, you know, the ideology of the cancer cell, uh, they, their, their, um, goal is, uh, to get as large as they can. And, uh, that's not my goal at all. It's quite the opposite. That would be my failure mode. If we scaled alongside the Small Web, getting more successful, if Small Technology Foundation start growing as well, then we failed fundamentally at something, right? And that's why Kitten has its own in-process database that will only scale to a certain level. It scales more than I would like it to, to be honest, but it'll only scale to a certain level. Do we need it to scale beyond a certain level to support 10,000, maybe even 20,000, uh, servers, 20,000 servers at 10 euros? You know, we're not gonna get the whole of 10 euros. 'cause we'll be paying the DNS people, we'll be paying the VPS people. So maybe we'll get less than half of that, but still 10,000, 20,000… Would that actually, uh, make us sustainable so that we could actually maybe hire some people to work on it, to keep this work running? Um, maybe, you know, go on vacation for a change? Uh, yes. Do we need more than that? No. Do I need to become a billionaire? Fuck no! That is my failure mode. [Mirela: So I Dunno how many people dunno here, but you mentioned that you… something like in Belgium, which I'm interested now, how did, what did you do… with … one city… Belgium?] So this was a project that we did about six, uh, six or seven years ago. Um, it was, no, it was right before this. So that was the germ of this. Um, and we were working with the City of Ghent, uh, uh, with Stad Gent. And, um, I basically, I did a talk there… I, I gave a keynote about these issues and I was like, we need to build an, and I was calling it an Internet of People, you know, not corporations, not not for governments, for people, uh, where everyone has their own place, etc.. And, uh, I, I remember it was, uh, Karl-Filip, uh, who was the, he was heading up, uh, their technology or, or, or, or I don't know if he was heading up the whole thing, but he basically came up to me, uh, and we had a chat afterwards and we're like, well, what if we use the city of Ghent as kind of a prototype? You know, what if everyone in the city of Ghent, like for Small Web, you might have to pay us 10 euros because we need to be sustainable in this messed up system that we have until we can build a better one or kind of build that bridge to a better one where maybe those places are supported from the commons for the common good. So what if in that spirit, the city of Ghent sent everyone, uh, a letter with a token that they could use to have their own place and they supported it from the commons, and the people could speak to one another, but they could also speak to the municipality. So we built a prototype of that and, um, it was very well received. Uh, it was just a prototype, but it was very well received. And then they had local elections, and the conservatives got into power and our funding was cut. Um, our funding wasn't much anyway. We got paid less than the contractors that we were able to hire, uh, to work on it. So, you know, uh, it wasn't that much to begin with, but, um, this is why, this is why with the Small Web, I'm building it so that we can be sustainable under this current system. So we don't have to go begging for, you know, money from the EU… 'cause we haven't gotten a single cent, a single Euro cent from NGI or NLNet or whatever. We've applied. We've been rejected. Um, maybe if I put AI and, uh, I don't know, uh, blockchain in there, we would've gotten in, you know, some bullshit. Um, but, uh, yeah. So, um, we don't have to go begging for that. And, uh, that we don't have to rely on the shifting winds of politics, you know? [Mirela: Thank you.] Great! Well, thank you so much. Um, thank you to the folks who have joined in on, uh, where is the Owncast. There we go. Thank you all. Um, we are going to be ending the, uh, uh, “the crypto to emoji graphics idea is neat… Is it portable to other programming languages?” Uh, sure, of course it is. Um, and if you port it, let me know. Um, I mean, I'm not gonna do it, but the source code is there. Just take it. It's not, it's not… it's just base-256 encoding with a custom set of emoji. Um, that's really all it is. So you could probably, like, write that in one line of code. Um, I don't know if it was one line in what I wrote. Um, “Deno is a money grabber.” Yes, they are. Deno is an alternative to NodeJS. They're startup. Um, yeah. So basically if anything's a startup or they’re venture capital backed, just back away slowly, um, it's never gonna end. Well. Uh, “nice recovery!” Thank you so much. I don't know which one you were talking about, but, uh, I've had several, um, excellent guys. I, I, I think we've gone like 25 minutes over. Uh, thankfully no one's thrown us out of the room, and thankfully you've stayed. But, uh, thank you all for watching on the stream, and thank you all for watching in-world here, and thank you for having me. Thank you. Take care. All right. I am ending this stream, but I will make this recording available online and I'll let you all know.