 This is exciting to some people and then, like, pair-finding brother, we want to, we don't want to work in communities, so the idea would bring in any sense that branding is a big entry point in English with a community. So we don't want to work in communities and have a separate meetings conference. So the idea is to be able to have a multi-track conference and have to go to the festive of the world because ultimately, things are not some extra stuff or thing, it's just one part of a real-life application. So it's super exciting to me to have a Phoenix, I don't want to say any other place here, but ultimately it's about communities from together in the private part. We're talking about Phoenix, I'm not talking about thinking of new people. That's obviously where we're from, but this is a huge deal for me because this mindset I've worked almost entirely both on Phoenix for the last 10 months, which is kind of what I needed personally, so my primary role there is to work on open source. We have a primary engagement in some places, but it's not what I needed to do on my own. So I was kind of on the burnout trajectory of people trying to do open source, really cool planning meetings. So I have what you said to you, Dr. R. I agree all the way because they're investing in the community, they're investing in Phoenix, and me personally, it's what I needed to have this plan in a static place. So thank you, if you want to reach out to us, check out Dr. R. Com. I want to thank you guys, Jim Priest, Jim's out here, Jim Ray Grant, right here in the back. Jim's the unsung hero of this community. He organized this conference, he organized their first official talk for the circle of the note. He probably thought it was crazy, but really we're all here today, he's a Jim, and there's a ton of work that goes into all this. So just give him a huge thank you, and let's give him a round of applause. I'm getting sure, which is a limited edition, but it was seriously, she just put up with a lot of pop-up. I think the spouse of the book was worse, containers and canvines put up with a lot, and I would urge thank you for supporting me throughout my career. Especially talking with my second wife, Jose Flynn. I think that's our quick Skype calls, like obviously I need to have on Skype for 10 minutes on a Saturday afternoon with Jose. It turns into an hour, so I think over and over and over. So thank you. Breathe history and liberal arts here, since classical school. We did two million kind of classes on servers, so this is kind of our, like, a part being grad for X-Lite, but it's amazing, it was amazing accomplishment for us, and it's an amazing part being tool, because we can save millions. But really it's incredibly filling for me, and it excites me because I think this is gonna open up, or it looks like a game here, it'll open up an entire new class of applications. I think that Brian had a point when he was other talks where he said, based on these benchmarks and this application, you can get every human on the world day in a channel action using 3,500 servers, which is like within reach for a lot of companies. Like there are deployments, using the word active, less active users that are using 4,500 servers. So I think we'll start thinking in terms of this kind of scale, open up a client action for any user application and kind of disrupting a lot of existing markets. We released the early beginnings book about user planning for state, and I opted for this, it's available for 25% discount I think in the next few days, using this really long promo code, let's see if we can find it. It's gonna be 16 years for Phoenix, that I have been able to do it. So someone like, take a picture of that, and you can read it, you can go to bit.ly, slash games book to go directly to the product application. Go check that out, it's a great way to get started as you begin to plan your development. And the growth has been an important thing to me in this community, and the excitement around the term Phoenix. We're the top seller for Krakow in June, so we're meeting up with a lot of other technologies and frameworks, and to me that's incredibly exciting because we're just young communities, but I think that, you know, promise incredibly fast-paced trajectory and so exciting to be a partner from the beginning and have it for a year today. So just by showing hands, using your hands Phoenix has been a blessing. Okay, keep your hands up, I'm gonna take a picture of this. I expected it to be quite a view, but that's amazing, so awesome. So for me, I like programming because I can build things and kind of doing open sports is kind of like this meta way for me to not have to build things, but other people can build things using something that I did. So for me, it's really exciting to see what people create based on the work that I've done. So that's amazing. Thank you. So meeting this number, but we're going to move it down a little bit on X. You know, 10,000 downloads a day, but yeah, this is, I've been like watching this every week, you know, seeing where it's going, and for me psychologically, this is a cool milestone. Well, we don't have anything new to do with Phoenix, but mixed-steps.get has been run many times, you know, by developers, sky servers, for me, psychologically, this is kind of a local milestone I'm looking forward to seeing. I was like, something's new to me. And last year, the main focus for me in Phoenix was Phoenix presence, and we're literally like, people are losing their minds over it. It's cool. But it's really neat for me because Phoenix presence, for those of you that don't know, basically the way to show who's online and your application. And it's a hard job as well, practically, I talked to this a lot last year, but we were able to apply some really cutting-edge research to solve a simple problem as far as Phoenix users are concerned. And people hear about our internally, and they're literally losing their minds, but for me, that's the most exciting thing because it's just showing that they have this amazing platform that we can accomplish, really innovative solutions. And I think it's going to attract people to the platform, the way that we're aligned. I don't look at again research that, for me, is an intellectual feeling, not appropriate in that it's, we're solving these problems day-to-day. So it's not only this great research that's applying, it's how can we apply the research to day-to-day of problems that everyone has. I like to name this one right here, where it's come up a lot, especially since the solution in Phoenix, not what people are saying, since a lot of users are coming in too, we'll be able to communicate through Phoenix. You know, it's a literature only we feel good, this question comes up a lot, but like the younger zone of Phoenix. And I can't say that I know it's absolutely not. But this really irritates me, because when I started Phoenix, I wanted to kind of redefine what a web application is, so we have amazing things in this community that are happening, like a nearest project, which I think could be much bigger than Phoenix. But this question and this mindset really irritates me, because Phoenix is already being used outside of what you would even consider the web. So we have people putting Phoenix on, like cool raspberry pies, and doing things with embedded devices that are running Phoenix. So it's like this mindset, this literature only do for web, because Phoenix is just really irritating to get people are doing crazy things outside of it. So I'm just going to snag the core that is on the nearest project, made this live-in game that like, yeah, iOS, native iOS app speaking, the games channels that's running on this cool pie here, using 16, like quite some memory, and you had like driver's permission at the end of the year, so 50 messages a second about the access information of this iPhone that's been filtered for controlling driver's over the game channel, running on this pot. So for me, people are doing crazy things with Phoenix outside of the context of web, and that's what excites me the most, so I think, you know, it's seriously going to eat the world in every direction that they have people doing things on embedded devices, if people, you know, writing through the database, because you have everything on the low end, everything in the world, and then they have everything on the high end in the world. So if you run out on a whole pie, using 16, like memory, or if you run out on a port, or if you're using a 5-bit system, and for me, this is just incredible, right? I have the experience with any other technology that is eating. I can't eat the world on the low end, and for me, I think we're going to take over the planet. So I'm excited about that. So that's what happened last year, I was just getting his presence. It was a fifth law on my pot, as does everything in software, but let's look forward to how we're going to use 1.3. So for the big 1.3, we have some unfortunate casualties. So a unit level that the order is downing, and as is the word model, we're going to need reference to the model and code base. I think prior to 1.3, we had a structure like this, and we had a three-level web folder, which Jose and I thought was a great idea, and it separated the, like the initial idea was, let's separate the web part of your application from the illicit part of your application. So like let's send this good message to it, you know, if any system is special. And what happened was, people saw this three-level web folder, and it became like, oh, what is that? It's special, loaded, it's a Phoenix app, it's not on this or that, it's just terrible. So we had, it was an opposite reaction that we were looking for. But part of the reason is currently our fault, because we had this like web model directory, so like I turned it to, there were some, so what's your compiler issues that didn't allow us to refill reloading within the load directory. So we changed it from, let's send this good message from isolation to you. Well, let's just say anything you want to load your loader goes in the web. So what happened was, this is our fault, the web model was supposed to be like so you modeled your domain, but it lived inside the web, so it's like it was conflicting message, and we actually used the illicit compiler now that allows us to do code reloading, or we're like, we're just code reloading everything in the application, so we went down to the web inside. And we still, so the goal is, this is a message that, this is your app, and the web part is just outside of that, it should just be a window into your application. So we wanted, we did this web thing to send a good message, and I think people got the opposite message, oh, it's, it needs to be doing this stuff thing. So with things, 1.3, you're going to make this.u, you're going to get an application with just a web directory inside, and you can flip it. So this is because still, for us in the message, hey, this is our web interface, back into our main application. And the application domain isn't going to be in some models directory, because the entire goal for your application is to model your domain. So your app just lives in normal live code like any other close your app. And furthermore, we're going to add a web namespace. So slightly more typing, but since we have a aliasulpher's already in our router, in the web ex helpers, this is going to be a non-issue. And I think this further sends the message that we're going to have a web part of our application, and that's just a window into the rest of our browser. This is kind of not a huge work, but there's quite a bit of work going into this, because generators have always been about learning tools, getting up and learning quickly, so they're co-generators. And we've always said that they're learning tools, but I think that we've done a poor job of teaching. And the reason is, when you ran the generator, to generate like CRUD, HTML, or JSON controllers, and echo schemas, do you generate a build like this? So we generated reasonable build, it's not terrible build, so it's like to fetch all the comments from our repo, and your repo extracts the storage, so there's some nice things that we were showing off there. And even for our persistence, like if you're trying to create some comments, we generate a build like this, or you say, okay, I've created JSON, so have a data structure that holds a list of changes and applies those to the data. So the FDO abstractions are our creative abstractions, but the problem is, we are not sending the proper isolation message here, because what happened was, we were being hand-weighted, saying like, oh, well, you need to use something more complex, like you can push that code into a module, and you might see functions. But in overall of their own, so newcomers would see this code, and they would say, oh, inexperiorating my code in a controller, like, oh, this must be where my code was. And this is where they're right, this is where they're coming from at the code. And it's not their fault, it's our fault, it's people see, oh, I do, I'm going to search for database changes in my controller, so this must be where I write my code. And it gets worse, because if they want to do anything more complex, like if you want to start associating posts with comments, if you're building a blog system, you're going to go to that generating code, and you're going to say, oh, my code was in a controller here, it's being put here, I'm going to fetch a post now, they add these new lines, and build the association. And you start seeing that we're not sending the right message, because the vast majority of users aren't going to start thinking like, maybe I should start moving this code out into different modules, so if I could want to create posts in a change, I want to duplicate this. What usually happens is users just duplicate this code in their channel, and the rest of their application infrastructure. So for us, we're not sending the problem message, and that's awful. So we want to say, we're still going to include generators, we're still going to treat them as learning tools, but we're going to require that you pass some model context here. So instead of saying, it's name's Jen, Jason's comment, generating some prep stuff for comments, you have to pass a module, name's Jason, Jason's name's Jen, Jason's log comments. My act is, give this a place to live in my application, and it's going to generate control like this, where we have a log list of comments, kind of like generalized functions that are doing some kind of work, or log.create comments. And for us, the sense of our message, right here, the actual minimum scenario as a user sees this, and they're like, a log module, create comment. This is more my code list, and they write code there as they see my application. So this is, I think the proper way to go about learning is the proper way to go out early, any, I think, production's a lot better. So the users are going to see these, generate functions, and list comments is a great comment. These are functions that just do that same echo persistence. So I think, you know, echo is great. I think everyone should use echo, it continues, it's just about, it's just about people. We're going to route, I think, a way from the web part of the application, right? There's calling something that's part of your domain to do the work. In this way, when users want to go to add posts and associate them with comments, instead of saying, oh, I need to put that association in this detail in my controller, got to be able to say, oh, I've got a function for that. Things generated in this gate post function. So I can just call into that, get a post, and then I can extend that create comment with the post, right? So I think this is sending, really, the message of our solution. And it's just modeling the functions, right? It says in like, us trying to be architecture astronauts, it's just, you know, we don't have to say, you don't have to call this interactive pattern, or command pattern, it's just, we're creating a model for you, and it has functions. Pretty much like, all the function programming we've done, Michael was first getting into it. I was trying to look for like, where are the function programming design pattern books? Thinking like, how do you design programs? And turns out like, oh, it's all those models and functions. That's how you can go out there. So it's kind of an interesting way to do things, that you're doing the wrong all along with those. And one idea that was born, you know, on this previous slide, is we have Joe here, a case here. So we're saying, oh, we're using the name, which macro, we're saying, we're going to match on his positive cases. And if it was all successful, then we put a status and we send a response. But let's say like, what happens if a post is not found? Or what happens if we fail to create a comment because it was invalid? So this is just an experiment. So I'm going to open up a, a code of, get some feedback in the community. But yeah, yes, we just match on all the positive cases. And we let a, this fall through to another function that handles some error based or some other response case in our application. It wouldn't be anything necessarily being error based. It might be, it might be a little bit redirected. It's like, yeah, please render this. And we can then check if we have something in cache and we're going to cache. Even though I haven't heard anyone who really needs a complex caching solution yet. But the idea is, I mean, we have some responder callbacks where you can say, I'm going to match on all the positive cases in my controller. And then if I don't return a connection there, but if we have a callback at return that received the original connection of the password controller in whatever positive match in the, in with expression. And this way you can say, you know, all the parts of my application are to return to the error not found, right? Like trying to protect the post or to attach a sale order to my system. I'm going to have some generalized responses of my domain, like error not found. Anytime I get that controller, I'm going to send it to the proper status and respond before a caller. Or anytime I have an error changed in, right? When JSON controller is almost always a single code for saying, okay, put the status under the change step view error that Asian has to change that in. So wouldn't it be nice if we just say, you know what, whenever we get this result from a controller that will impose the best status and render the change step? This works really nicely for JSON because it's almost always the same repetition. But I do think people have to, is that how to do the work for HTML? Because HTML, you're almost always going to handle the unexpected error cases. That's just like, you're going to put some flash messages, you're going to do some redirects. So I think for JSON, we can see much more succinct. But for HTML, it will be much similar to just a case of expression. And if you get a error change set, you know, you're ready to perform. And what model is gone? And you mentioned a model on code base, which is going to be new. Because it turns out it's just confusing for people. The message we wanted to send was, this is where you model your application domain, current into, oh, let's just add 500 files to your level of models forward. So it just became a dumping ground for files. So if you look at any application, and this is where our connectors would do it, we just don't make the level of user, host, comments. You're gonna end up with no boundaries in your system, right? So in this directory, you just have 100 files and you don't know where the boundaries are. So you're in a really poor isolation, you're not gonna have to think about what your boundaries should look like. So for us, there's no need to have a separate model string because your entire application, your entire literature application, it's goal is to model your domain, right? So you can switch from the models or any mission of models to say, have a directory structure like this, where we have some blog that you're building, when we generate, it's gonna get an HTML on the host. You have a blog directory and then you're at your schemas or any regular literature files that are a little bit in that directory, right? Like this isn't a practice method, it's just like this is how you would build an application and then let's use it, right? So we're just gonna generate these boundaries for you to show that, okay, we have a blog system in our app and that's how we interact with our blog system is to do a blog model, right? We're not going to be doing repo sketches on post-recorded, we're gonna have this interface as a boundary, the context model, the same if we have like a sales system in the app, we have some sales module and you might have orders of payments if I want to click an order, there should be a function like sales.completeOrder, right? And this way we have a clear separation, interaction in these boundaries where you form natural layers for you to reason it up and you wanna, players split these out into separate umbrellas, you've already had an input of boundaries. And so then your web directory turns into just the web window of your application, right? Your channel controllers and users are just going to consume the domain layer and not really know, and have to work on the details, which was the goal from the beginning. Focus on umbrella projects. You can use it with an umbrella, like this is, like I'm gonna go with that, I'm gonna ask the manager, so when I was putting these all together, like this was my college number one unit, because this is what I'm gonna show you. It was like, I'm getting so much done, this is gonna be so awesome, it's getting too umbrella-y, so. This is one of those characters. No, so for those of you that don't know, umbrella projects are feature-enabled, so that I think they're kind of underserved. They allow us to basically group up, I'm gonna show a separate list of applications underneath one umbrella or underneath one code base. So like, you're into microservices or you're interested in moving microservices, Ike. This is basically microservices, how all the outsides. You can run all these applications together and you can start in this document as a whole, separately, but they don't want to do it in separate code, so they communicate just across the same LMDN instance. So I think they're a really cool way to go out of larger platforms, not that everyone should just be using an umbrella for everything, but I think it's a great way to go out, have a date with any plan to be a substantial part of your infrastructure. Now, but for us, we want to be able to say this means that you buy out that umbrella and the umbrella generator now will generate something like this, where there's an app directory and we'll add two applications to generate an umbrella application. One will be, I do exchange with my app, one will be apps, my app, and that's gonna be the place that your name and that domain lives. And the other is we're gonna be, my app is for what, that's gonna be where your web application lives. And this is forcing you to think about the isolation boundaries, because your web app now is just a web server and it's going to call in to the other application. And I forgot to mention, we also have a couple of assets for now, so web static is one way. And in both, they write both things out and umbrella app, the assets for now is a way for us to encapsulate everything about your assets system. So, there's no, you don't have to be able to level the models directory, everything about the app, whether it's an ember app, whether you're going to React app, or just using Phoenix's people, ES6 dropshifters, it'll be a little bit within assets. So that's where you're gonna pack your Jason's lives, that's where everything about the asset and these notes lives. That way it doesn't include your private. That way you're just building that stability in assets is where you can let the assets come in with. But for umbrella apps, it's the exact same alias, like having a control web, well, it'll still have an IAP web, a page controller. So the nice thing is, if you want to eventually start using umbrella apps, or you want to convert your applications into an umbrella app, it's gonna be the same on the ES6, people are already thinking with the right isolation. It's a good default to consider in umbrella apps, because you're not, I think like I said, you can take you from a basic app to an umbrella app and convert it. And it's not a lot of work, but I think it's enough work that the developers were lazy. So none of us are gonna be able to take 20 minutes to lose some files around and get some error messages. So I think it's a good idea to consider umbrella apps and at least experiment them as a good bit of your application. And this way, the changes will make this transition easier if you start with a bigger application you've upgraded to an umbrella, you've already thought about the boundary from your application, you've already properly gained space to work on your application, and hopefully isolated that from your domain. So that's umbrella apps. The next thing, the big next focus for me is service discovery. And I talked about this in Berlin, in the first month of E.U. But I want to take a little bit of a journey back a few years to get into the beginning and see how this can go. So 2014, the very first list are gone. I had this slide here. So it's kind of neat for me to revisit this. I had my goals for this web framework. So from the beginning, I wanted to kind of redefine what it meant to be a web framework. But I had this idea of what should we call a NX? Because I thought maybe we could call it a distributed web services framework. And I had no idea what that meant. Like I don't know how to do it. But I knew that like, okay, we had it. We had this virtual machine. We could do these distributed things. Like we had this technology. So I wanted to make distributed web services. Eventually, that was my initial goal. And 2014, so this was just an ambitious goal that I really had no concrete idea of how I could accomplish it. But I knew that I could do it. So I said, okay, let's check games 1.0. It's gonna have main web features. You can build code applications. You can build JSON applications. And then maybe I could have been looking to distribute services and service node discovery. Like further ahead. You know, I said the goal was we wanted to create things to essentially be a tool for easily creating distributed, all-time services that scale, right? And then like the even further future was we wanted to centralize and master this server registration. And I even had it individually there because I was like, wow, I have no idea how we would solve that. That would be like years out, like five years out. But these were my goals since 2014. So the cool thing is like we actually didn't need to accomplish most of these goals. No, but that's true. Somehow. So last year. So here after that, we shipped games 1.0. It was getting some traction. We were writing the web services in it. And I said, my main goal was to add these credits, which would be this present system. And it appears to be like, I already have to hand up, like, how are we going to solve this? I don't know. I don't know. But I remember like all the problems on the slide. We have what if a node goes down, how do we handle distributed state without a, how do we do it in a master's but how do we handle this distributed text happening in a system in a way that is good to scale and have a bunch of downsides with different solutions? I didn't know how we'd do it, but I knew that we could do it, right? We had this kind of kind of, we had the technology. So the last year, we solved that. Yeah, we solved like, how do we show which users are online or on application? And it ended up being really trivial for the end users, which is the goal for the end user. You know, enabling people to build these scale applications but not to actually worry about their needs and know how, you know, understand every distributed detail of the distributed system. Because at the end of the day, if you want to build a presence feature for your app, you add two lines of code to your channel. You can say, hey, the presence of my stock is and it's metadata and so people can know about this. And you can push down on your current users that are a member of the topic that we're subscribed to. So two lines of code on the server and then a few lines of code on the client. Like you have presence state, presence sync did for us to handle this replicated information across the cluster. So if you have a good one on the client server, you can end up with this system that might be updates when users are on your lead. You can detect, you know, downloads happen, you don't have to worry about cleaning up that data. You can use it coming offline or members of that code. Or if you have some S-plus scenario on your system, like what if a S-plus scenario happened and then nodes went back up. All of that is against parents and transparency and there's just a few lines of code for you to write in the server and client. So we accomplished that and it was amazing and I think you will, I guess it's interesting to use it in games presence. Do we have any users? Awesome. Actually we went about cool. So like your buzz and you've been important so far, which is awesome but it's always like, just when I say I don't think we're really using it. Like this. It's prompt solid, so. So I want to do one of this. Because I can't give a talk about giving a demo. I think it's part of something that I have to do. So let's say that we build or our workshop, things workshop, there's a collaborative sketchback and I wanted to show off Phoenix Presence by a way that was more than just showing what's usually online. So you can see this application has Chris and Brian on the left and right. So we're using Phoenix Presence and we built that in the workshop. Okay, you can show users who are online. It was cool, wasn't that they get a deal, but we also wanted to show what if we draw something, like we know much of the drill time features. So in this case, I can like draw a house and like every 10 times a second we're sending my next blackboard into cross. So there's like quite a bit of traffic that's happening here. And it's a little bit delayed because I'm going over the public internet through a proxy. But the level of messaging that's happening in my draw stroke is kind of insane. Especially putting this as an application structure as you, and I think people's preference. Don't do it yet. Don't do it. Okay. You're going to draw, you have to contribute to the house. Phoenix Presence to ask our units because they say, this is the current schedule here. And I'm going to draw them just crazy young. But it's going to say, okay, everyone that's currently on the application drawing is going to use Phoenix Presence to say, I ran at this like one of you going to ask the browser to convert that canvas to a PNG and then push that canvas over the server and then the server converts that to FDR on the console. So there's just a cool way in which you have to use Phoenix Presence outside of this idea of like just the users that were online. So yeah, we can clear this. Thank you. Everyone's not calling me. But we can see the bottom of it. But if we can see the bottom of it, like it's going to pronounce the user that it fetched from 30 seconds and it's going to ask the user for information. And we ended up with some pretty compelling drawing to your book, I think I saved it for you. So it doesn't run any, apparently, after the workshop. I was like, close me up with some browser tabs last night and I did a training, you know, like I found this one. So someone like left me a thanks because of drawing and I found like hours later, so that was a little bit. But what we build up, I would say, we got something like more abstract ones. Let's see. That gigs got some presses for this application, right? It's pretty heavy. It's cool to get these kind of interesting music. I can't believe it. So that was what we expressed this. So it's awesome, right? We showed what users are online. And one thing that we should be expressing is we're like, cool, we can show what users are online. But let's try realizing, like, wow, this trend is saying as a mix of it, like the potential here is nothing more than what users are online. So Justin's check here, that might be probably, oh, either way. So Justin, I was talking to a girl, like, man, how could, let's me use presence for her. Like, what's a cool way to demonstrate the possibilities? And we had a thing, thinking like, what if we were running Nerders on a Raspberry Pi at his house, and I was running Nerders on a Raspberry Pi at my house? And we made a piece of that, but we don't know, like, why do you have a network? And then we get these friends to say, like, chill out, run by you, and Justin's online. And on my Pi, which was regulated, I'm sorry, a relatively low level in the mall. Like, as a physical manifestation of the presence of these devices. And my wife's Amazon Prime account is the one I used to do the order thing. So Justin was like, well, here's the hardware you need. So I ordered a Raspberry Pi. So my wife had this notification, like, is this Raspberry Pi that you're ordering? Like, this is a $4 thing. And then I was like, I was trying to explain why I needed this Raspberry Pi. And I was like, well, Justin's got to run this Raspberry Pi. His house, and I was like, I realized he'd come on. And then, like, I'm going to start my app, and he likes to come on. I was like, I was so excited to explain to you, because, like, I feel like you can hear it here, like, blah, blah, blah, blah, blah, blah, blah, blah, this thing. I don't think we actually, my wife is still in the box, but this is all right. She actually, she wrote this down, like, this horrible statement. I was, like, explaining, like, the possibilities. I was like, first time. I was like, first step, bold domination. Because, like, I'm thinking, like, you know, the possibilities here are awesome. I don't talk with this one only, but I did say it. I think your response is what you want. I think with this, like, this exercise was that he had, like, this vast potential. His presence solved, like, we wanted to solve issues that are online, and we accidentally distributed zero discovery. We accidentally accomplished the goal that I wanted to do, published two years ago. I had no idea that we would not. And we also did it in a way that allows us to process places. So we started realizing that this was something larger. And it was nice because I didn't solve problems. I thought I would solve them much later. And I'm not gonna talk about how a series of works, but if you watch my Berlin talk, I go through kind of the basics. But what we realized is we have these nodes representing which users are online, right? So they're sending, like, I got U2, I got U21, right? So we realized that these users, these presence and there's processes, like a channel on the server, as a user, is just a process. So we realized that for replicating which users are online, it's the exact same thing as just replicating which services are online, right? Instead of deciding, trying to say, Chris is online, I'm gonna say, hey, an email service is online. This process is giving you processions. So we accidentally accomplished service discovery, trying to solve this simple problem of which users are here. I'm just not giving in. And so if you're familiar with Orleans PG2 library, it's kind of like PG3, we've created it. So we made a server processor to have some nice features on top of what PG2 is for products. So you can have callbacks when a user or a member leaves and joins the group, and you can also add metadata to the members. So for example, here, I can track, okay, Chris is online, he's traveling, can they give me all the users who love him? But that's the exact same thing as saying, okay, instead of which users are on a traveling, we can say which services give you what problem. Like you can do this today, but you can use the presence API to store metadata and say, okay, there's two processes on cluster, here's their pin, and then you can do cool things like add metadata in that member to do client load balancing, right? So if you wanna say, show me every service on cluster that you web-crawling, and say, okay, it's good, you can do it, but it has a little sort of factor in the first one, so the client can tell you to say, I'm gonna call the second service because it literally has a lower demand. And then maybe we can, so the goal is to build like an AD on top of this, which we're still exploring, but maybe you have a service about this, so give me everything that you web-crawling, and I can list back and send a message and do intelligent client load balancing topic. I mean, you also wanna be able to say, how do we do process placing some, how do we say, okay, I have a name session or I have an email service, but how do we know where to actually do that work? Like, it's in my alt tab selected, and the idea is like we can, by default, just shard your bus, so we see that 10 services that are online and you web-crawling, we can just automatically shard for you and pick one, so the client can both intelligent load balancing, but also automatically load balancing, you don't have to be worried about overloading these services. But we can give you both options, right? So let's say like you wanna develop this public API, like give me any user session, and then internally, again, we're still learning this, but maybe we have a service module and instead of like a server call, we can say service call, so any service cluster that says a few game sessions, please spawn me a user, or please spawn me a game session based on this user, and that can be sharding by default and just pick them, so anyone that's available, this is gonna be load balancing. Or you can say maybe I could have some functions here to say I have a work factor in the metadata, so then I'm going to sort by this function, you can pick the one that says it's gonna use work, so you can get some really interesting things out of these presence based on just what's there today, and that's exactly what I'm trying to do. So the goal is to have, again, to make most of these things trivially work, right? You should be able to build these, to search applications, you don't have to worry about the details, it's like even you personally, like the one of my favorite things about distractions is like, like I can go into the study scary teams for six months and like, understand that problem to me, and now I can use presence, and it's still like, it's a light to me as much as the lives of my coworkers and my workshops, like every time it works, you're like, I can't believe it, I can't believe that this works, like I can, so I can like kind of shed that knowledge, and then just have that work. So the other areas of interest, so my goal is to build the next phase of the mix, other than the generators, you know, in the score, there's a community, a grade, or application, application with JCNDI, and Phoenix Pub-Sub project has been extracted from Phoenix School. So Phoenix Pub-Sub is really gonna be the basis for this distributed toolkit. So, you know, it's not the basis in focusing on web applications. I think it's important to continue to be a great option for web applications to be able to use Phoenix Pub-Sub, which is what Phoenix presence is all on, as this great distributed toolkit. So service discovery is obviously our next big area of interest, distributed process registry. We wanted to solve like how do we do, as a service registry, it turns out that the O2P team is actually trying to enhance a little, early school registration to be more high-scaled. So for us, we're watching the developments there, and ideally, we let them solve that hard problem in local, which is a great way to do a little process registration. And then another big focus is we want to look into a lot of durable looks of to be able to catch up on these messages, because right now, all of our deliberations are just like, we just give you no guarantees. If you miss a Pub-Sub message, it's up to you to figure out a, well, we're writing just these messages, so a client can later say, hey, I drove through a tunnel, but I have to leave your messages on this. There's a lot of game, but you have to write for that. It'd be nice if we could solve this in a way that they would probably do to add like Kafka or some Q-mechanism or a whole bunch of code yourself. It'd be nice if this just worked, just like presence, just like magic. But there's, again, we can't let me here and say like, how would we solve that exactly? Like what areas of CSR switch would we have to look into? Like I have no idea, but throughout this whole journey, every year I've said like, hey, we have the technology, like, you can do this, like, how are we gonna do it? I'm not sure. And then a year later, it's like, hey, we've got presence. So I'm hoping, what we'll see now, I'm on record now in like 2017, and I'd be like, hey, I was like, durable Pub-Sub, how are we gonna do it? And then next year, I'm gonna say, we should have durable Pub-Sub, so we'll see what happens. Um, yeah, that's about it. But for me, I mean, the real way for me, throughout all this, is a code that I'm gonna steal from all of Disney. And I think it really sums up literature. It's that, you know, if we can dream it, we can do it. And I think, you know, this is an apoco where we're at today, but with the literature, like, this is what I've done, right? It's what I've done from day one, where it's like, I can, I just wanna go to my channel a year, and I somehow have a real time connection, and I was able to figure out how to make it happen. I wanna solve presence, and I'll be able to figure out how to make it happen. So, I'm gonna modify this code a little bit, and say, with the literature, you can hear me, and you can do it. That's all I have. Thank you. Do we see an album in the air? Should we? Yeah, we'll do it. I'm so far in owning connections and starting processes, and I pretty quickly ran into like the math team or a lot of different versions of the responses and stuff like that. So, just as a general, we're all far. If you're gonna stick it up, like, two million connections, how do you handle the literature for stuff? Do you just want to set a really large amount of value? Of course, yeah. And he's a woman. He's helping with all these human parts. Gary, are you here? Hey, you find that guy? No, actually, there's just a shell file. My spirit contest over at Shared Skype Sessions, like, my sysadmin skills are past a little, but they're hilarious. So, I'm gonna try to think of, I haven't got a, I've got a, I'll pull it up. My shell file I can share, it just sets like a dozen Mac settings on any kind of like system. And that would help for us to get to two million users. So, there's actually a lot easier to compare the system to get there than I thought. It's just a deep alter or lower than it should be, I think, 31.16, but it's not hard to do. What about some IoT, sort of, when you said you're able to help cells that are thinking a lot about IoT applications, can you talk about any of the more introduction? So, I am not aware of anything specifically. I mean, I know people that are doing some of the new experience, and Justin probably have a better handle on on that and listen to his talk, but yeah. What's exciting about these people are doing, yeah, you can use Pubso, it's also something that can be used totally outside of any of the full web content. And Justin and I have a lot of conversations about you can use Pubso and NERS and like the possibilities here. NERS devices, IoT is all about the reasons for this system. So, it would be nice to have them be able to mess with each other. You may have to use the load of the yield, but then you have to solve these problems of how do you kind of, especially with, you know, IoT, you have to, the lack of new, loss of messages is more accurate, right? So, I mean, you said that today, but as far as it wasn't for you, I'm not sure. Hey, what's up? Oh, okay. So, we've been able to set up the world tomorrow. So, I'm actually working on an NTT implementation over at AWS IoT, and they're going to get into a Linux application, but I'm just curious if anyone is working on an NTT to meet directly the channels, or if there's any one in the site project like that? Yeah, there's a burn in NTT Pubso adapter, which I don't have any experience with, but I know people are in that space. So, there's a burn in NTT on X, and check that out. So, NTT has some interesting idea. We looked into that, and we were developing a channel for it all. So, I think there's definitely an integration store there, but if you want to find out, I'll be very good. So, what are you describing, our Linux 1.3, what's really great, you can describe the roadmap from here to actually listing it. The roadmap, as far as like timelines? Yeah. But it's ready. It shouldn't be that much worse. So, the nice thing is, it's just kind of power structure changes. So, as far as the breaking changes, I think that if you really do work, it's just going to be a matter of the need of power structure. So, the migration story will just be a matter of like, run these vans, and do these piles, and have these piles here. The roadmap should be soon? I'm trying to think, I mean, definitely, definitely by the end of the year to have it out. Definitely, we need to take care of some, part of that, if I'm hesitant, is that the code work is not that much, but the beginnings guide is going to be totally overall to accommodate the new structure. So, there's a lot of work on the guide side. There's a lot of work on having a new vision of the look out. But as far as the code changes that you'll have to make, if all you do is change your, make steps to use 1.3, you should all continue to work. So, hopefully by the end of the year, we have all that, at least set up, and people can use it, but I can't promise anything. So, I work in a company that uses a doctor for deployment. I've thought about, for the distributed service discovery of how that can work out Yes, so, I had no experience with doctor, and I feel like there's some, I feel like it's the odds a little bit with, like, Paralympic Immersive Releases, you know, the Pac-Vote upgrades, and I feel like a lot of people will end up with having issues with doctors. I had no experience with people running tires here, slap, and say, I'm trying to put it up with doctor, and it sounds like they're, like, believing all over the place. And unless it's like, I think it's a great choice, or I don't know, let me back up. Doctor seems like a great choice if that's your, if that's how your existing operations are done. I think it has a lot of positive elements. So, if that's how your existing team is, you want to be a doctor, and they can be deployed, and by all means, deploy, electric vehicles, you need to be a doctor. But, like, if you're starting here, I'm just going to start from scratch. I feel like, doctor might get odds with the way you do things, at your decision now, as far as being a standard emotional community. So, I can always speak to that. Sorry. You should just open the guides, in a shared section of the computer right now, and then every normal to something, you can look at it in theory. Okay, that's a good idea. Actually, yeah, I am. When I tried to do a vision making, instead of being asked who I am, it was going to be OCR. So, I had a working pro-work shop, like, it was like a 1% success rate. You know, like, I, like, you know, both mine and one of mine didn't detect it, so, yeah, that'd be cool. But, for the 1.3 changes, if you were to start to restructure your applications in those directories right now, it was 1.252 fighters out of some of them. Yeah, I mean, so the only thing, the only, really the only part that is, you might have said your controller was off of the Navy space target. Did the controller work great, so you know what you need to render? So, there might be, like, just one mine of code that you have to change, to start your business commitment today, but it's, it doesn't really impose, really, is there a pressure on me? Great, thanks. Okay. We got a couple over here, if we have time. With the 1.3 pushing the data margin down out of the controllers, then to more into your domain, where do you see concerns like authorization? We go ahead. So, authorization, for me, would just be in a module that I can say, like, well, what I do, I'm just asking, granted, authorization, like, policies are a huge part of your application, but for me, I often would just have a module that says, like, I've had a match on the action, the arbitrary action, which we're trying to take, and so if I pass it in, like a, you know, an authorizer, I can say, if authorizer.inaccess, and I'm passing, yeah, I'm trying to do a user struct and a post, and I just have a bunch of modules, I have a bunch of functions that I can match on, like, okay, I have someone trying to create their user, and they're trying to create this post, and then I just have a function that says, okay, I'm going to be a owner, so for me, it's just, for my application, it turns into just module, kind of a bunch of functions, but granted, it means something more advanced and I think there are full packages on text that add new things, but I'm never going to show you much of the on-demand, but the nice thing about that is that you can really, anywhere in your application, you just need it, you know, is that simple possible. Stay cheeky, though, because of these two days of support, or to the step of authorization, that's a little bit of a tease, and all that's, so yeah. So, lots of tool new things, especially with the presence, have you given any thought to just the ability to have these things be like their own components that can be used anywhere, not only in the end, but, you know, with anything else that I might not be able to utilize it, like, in a real performance? So, yeah, so we're based on flood, so really anything that is a flood-capable, you can just, like, so if I wanted to flood an entire list of working applications, I could have control over that. It was just right here. I had this grabber somewhere. And this is a flood-capable, for me, I think the only story that we don't have for components is that you want to package some assets in that component. There's no good story right now other than you need to either pre-compile that and check that into your code and then plug your own plug static, or have a task that copies the static assets from your dependency into the parent application. But for us, if you have stuff to separate, probably separate any application that will stay in this sketch pad that we built. Okay, if I want to do a log system, something that's released out next, I should just be able to say I'm going to go forward anything that, I'm going to mount this application to forward, saying anything that starts this last plug is going to be forwarded to a flood, of, you know, like someone else's app.log. And that can be a plug that can do anything. So for me, like, we already have a component story and it's just things that fly by the blood on a track. But the caveat that assets really, there's no great story there since we're trying to be agnostic to the asset loader, I'm not sure if we can make that better, but we took out a load of something that has probably 95% of what we need for a component-style system. The new chance of extracting out a part of the plug that does like the holding and the plug builder part, because I have RPC stuff that looks out like controllers and I had to reinvent the holding part and the assigned part and I even put it in the plug builder because it's a lot, it's a very complicated macro, but I really liked that, really nice is it was in some sort of like modem library that stuff has halted and your functions won't be called if you're halted, they're like plugins, but I don't want all the stuff with HTTP. Yes, the response is, you want to be able to say, you want to be able to clearly have these list of steps and if some condition happens, stop the process. So I would say the answer to that, and you're checking in, we have that now with macro, like with does that for, so like plug itself can be able to win with, right, so you can say, add some functions, so I can say, I should have an editor editor, right, so plug itself can be totally today, you can say, I'm not gonna, I'm not gonna use plug anymore, I'm gonna have one function that said like, get handle request, it takes some initial connection strut, and you can say, and this might be repetitive, I can say with con, get connection halted is false of your connection, so that was successful and I'm going to continue with rjson and that wasn't halted, so basically with gives us that, and whether or not that's kind of the, in pretty case I was going for, I'm not sure, but I think we have mechanisms to kind of do this procedural step, matching on applications, something doesn't match and it halts through just like plug us today, does that help? And whether that can be extracted as master of it, it says no, you and I will. Thank you for finding the question, anyone? No. Please stand up so it's easy. Thank you. And keep silent, so it doesn't see. So Chris, I just wanted to thank you guys for this awesome, and I was worried about the loading operation, right now you have to figure, should we just get part of the present at the front? Right. Yeah, so it's anything you know you can do at any time. So there's no static and no list. I mean, other than you have to, you have to, it's your job to actually connect them to the sugar order. So they have to join the cluster, we're not doing that for you, but our own has mechanisms for you to do that. So as long as they can join the cluster, any presence can pick up a node, it doesn't have to have any fixed set of nodes that can meet our presence group, in any sense. Yeah, so we handle that with CRT. I know they come up online, and it's going to basically, when it comes up, they're going to sample the cluster of every box to see what kind of data you're going to get, how often it's going to happen, and then the number of nodes to send all of their data to the system, so there's no replication that's going online. I think we bring it for... Well, I think it's pickers, so find me and you must do it. Right. Well, thank you very much. Thank you.