 So we can start. Hello, everybody. My name is Jérôme Poisson. I'm also known with the nickname GoFish on the Internet. Before starting, I just want to have a few words for the staff of the first day and on this Python Dev Room, we are close to the end of the first day and it has been a great event once more. So thank you to everybody for making this possible and for allowing us to have a chance to talk to you. Okay, so we have 25 minutes to talk about Salutatoire, which is a project on which I'm working. It's Python, social network and more, we will see that based on XMPP as you can guess and it's doing a lot of stuff. So I will first explain a bit the project, then we will see what is beyond under the hood and after I will talk about one of the new features that you can use to make some project of yours. So in short, we are a French non-profit association, which is also called Salutatoire, which is based in France. We try, we have a strong focus on ethics and we have written a social contract, which is a commitment between us and our community. You can check on the website, you will have the link at the end of the talk about it. So basically, we say that we want to use free software, decentralization and we want to work on the accessibility and this kind of stuff. So let's start with the bad news. First, we are still in Python 2. I know it's a shame that we were blocked by your dependencies and no, all the lights are green, so we will make a release in a couple of weeks and after the first thing will be the port to Python 3, which should be not such a big task because we are preparing that for a while. The project is still in development. I was hoping to have a release for FOSDEM, but there is still work. Like always, development is going most, it's adding further than deadlines, so yeah, I hope, you know, I think in a couple of weeks, there will be a release which will be stable, so if you try it tonight, you may see some bugs or crash and all of that will be fixed. Also, I had the right idea to do an update of the website just before the FOSDEM, so there are a couple of things broken on the website, but once again, it will be fixed in a couple of days. Also, as you will see on the screenshot, the design is not the best, so if any of you have some design background and is willing to help us, it will be a really great thing. And the last one, you already know it, but I have a terrible accent, so excuse me, I'm French, as you can guess. I hope it will be good enough so you can understand me, and if not, we can try to talk after the talk. Okay, so now it's only good news. So, what is Salutato? Salutato, it's an XMPP client, so I guess you all know what is XMPP, but just in case, it's a communication protocol, it's standard, it's decentralized, it's federating, it's there for 20 years, it's luxury, it's used in many, many clients, it's really nice things. It has a modular architecture, that means that you can add or remove easily features. It should work on any platform, I would should because we many tested on GNU Linux, but we have had reports that it was working also on Windows or macOS, and you will see that it's also working on web or Android, so it's multi-frontend, web desktop, mobile, etc. It does a lot of things, and it's a whole ecosystem. So, here are the features, well, I will not go to the list, which is a bit boring, but you see that it's instant messaging, encryption, blogging, etc. I just want to put your intention of ticket and mail requests. Actually, it's the basis of decentralized code forge. We are not on GitHub for ideological reason, and so we were needing the tools to manage pull requests or bug reports. So, because XMPP has everything we need, we have worked on that, and we have basic but usable ticket and mail requests, and we are planning to improve it to have a real code forge with time. So, yeah, in short, it's a sweet farming knife of your communication. So, if you want to see how it looks like, here are some screenshots. So, this is a desktop and mobile interface. The same interface works on Android. It works natively, it's not web app, it's really working on Android. And you can see the menu to start and to an encryption with OTR or OMMO. This is a blog engine. So, once again, it's decentralized and federating. This is file sharing. So, when you share a file, you're just not uploading it on chat room, but you actually say, I want to share this directory with my contact. So, you click after on the contact, and your contact will be able to access to your file easily. And in peer-to-peer when it's possible. So, this is a screenshot of the event manager. So, this is classic things. Yeah, as you can see, the design is not wonderful, but it's working. Yes, we have an image, we see who is coming, and yes, you can send a blog message and this kind of things. This is ticket request. Ticket manager, sorry. So, yes, you can see bugs, future requests and kind of things. And this is a measure request, which is an extension of ticket where you can attach some code. And once again, it's decentralized. And I think today there is no other measure request manager, which is decentralized. And those are some things which are being worked with GitLab and activity pub, but I think nowadays there is nothing equivalent. And, yes, because we are in a deaf conference, I also mentioned that there is really powerful command line tool, which allows you to automatize things easily to work either in high level if you want to send a blog, or in low level if you want to work on XMPP client and you want to see the XML under and work with that. There is a system of hooks, which is a way to launch a script when some kind of event happens. For instance, somebody is blogging something about something or somebody is entering a room and you want to have a script which is launched and will react at this moment. It's something a bit similar to if, then, then that service, but maybe. So, let's talk about what's under the hood. So, of course, I'm here, so it's all in Python. So, the main thing you can see here, so it's a simplified overview of the architecture. So, the project is this. It's an XMPP client which talks to XMPP server like any client. The main thing is the backend, which is the heart of the project, but it's actually doing a minimal set of things like the measure XMPP things and logging and loading plugins and every advanced feature is done in plugins. So, group chat is done in plugins and encryption is done in plugins, blogging is done in plugins, file sharing, et cetera. We use SQLite and the file system for the caching. Here, there's something that we call a bridge which is actually an IPC. It's a way to communicate between the front-end and the backend. Historically, we have used the debus, but now we have new, new bridge that we can use. So, as a perspective broker, which is a thing of Twisted, I will talk about Twisted just after, and embedded, which is a way to use the backend as a module that you embed in your front-end. So, these are the different front-ends. So, the two on the top are actually one single front-end which is done using QV. We will talk about QV, but QV is UI framework which is set to work with touch screen, but it also works on desktop. And this one is working on Android. This is a web interface which is using Twisted again, I will explain after, and Jinja for the template. We have terminal user interface which is using a read. A read is a module to do interface like anchorsies, but in a far more san way to work with, and it's really nice and flexible. So, if you want to work with console, it's really the tool to use. And the command line is taking profit of the standard ArcPass module. So, in the backend, the main module that we are using in the backend is Twisted. Twisted is a framework to do async programming. So, you probably know more async Ion nowadays, but Twisted predates that for a long time. It's a really old framework and it's really developed in the same way with a lot of tests. It's really work solids. I really enjoy working with it because the code which was written 10 years ago is still working. There is no breaking chance. Ion backward compatibility which is a great thing. It's not only managing the async event loop. It's also doing a lot of network swings, SMTP, FTP, DNS, et cetera. And XMPP, that's why we have chosen that. And Wokid is an extension of Twisted which improves the management of XMPP, which implements some XMPP extension. On desktop. So, as I said, I use Kivi. Unfortunately, it's not really well known. It's my own feeling in the Python community, but it's a really great framework to do interface. And it works on every platform. It works on Linux. It works on Windows. It works on Mac. It works on mobile. And the team is really nice and welcoming. So, if you have a chance to start a new project, take a look at this project. And the team is also working on five projects. And one of them is Python for Android. So, Python for Android is actually a set of tools to first compile the Python interpreter to Android. Then to launch your Python module, but you can also use Python module which have C dependencies that will be compiled with the same tool set to Android. So, it's working quite well. The performance are quite nice. I will not have time to make you a demo of the Android interface, but it's working well. And so, yes, not everybody knows that, but it's possible to do Python on Android. And actually, when I saw my interface and people asked me what is that, I said it's Python. Oh, it's possible. Yes, it's possible thanks to Kivi and Python for Android. On the web. So, on the web, we use Jinja2. Jinja2 is a template engine which is inspired from Django, Django template engine, but a little bit more powerful. It just works. There's not much to say about that, except that it's a nice, nice one. We use Twisted again. So, why I'm mentioning again Twisted is because we include web server, sorry, HTTP server. So, it's quite powerful and solid HTTP server. So, it makes the installation more easy. You don't have to install Apache or engines if you want to use a web interface. But, of course, you can use reverse proxy if you want to do that. So, and it's also improving with support of HTTP2 and these kind of things. So, it's really nice to use Twisted for that. On the front end, we use to use Pyjama, which is a Python to JavaScript compiler, but for various reasons that I won't explain now because it's too complicated. The project died and it was also blocked on Python 2. So, that was one of the reasons we were blocked to Python 2 so far. So, now we are working mainly on static web page and the next release, we will start again with dynamic page and we are planning to not stay blocked on one technology. This time, we will have something open and we plan to integrate a Briton, which is a Python interpreter made in JavaScript and it's working really well. And transcript, which is another Python 2 JavaScript compiler. So, yes, you can also do Python inside the browser and it's working, of course, it's not as quick as JavaScript, except for transcript, which is doing JavaScript actually. But it works really, really well and it's really usable and you can have Python console inside your web browser. So, we are getting to the last thing I wanted to show you. We have a new feature for this release, which is a web framework. So, why yet another web framework? Actually, it came naturally when we were reworking on the web interface. We had to get rid of Pyjama and to make a new static interface. So, little by little, it went to a web framework. But this one is quite unique because it's decentralized. It's only, to my knowledge, decentralized web framework. It's integrating XMPP and Python. So, when you create a project, when you create a website, it will naturally be decentralized and federating. So, it can be used for easy prototyping. For instance, I have seen recently people saying, I like XMPP but I don't like the front end. It would be nice if I could make a front end just for my family when it's simplified. Well, you have everything done on the XMPP side. You just have to use to make your template and you can use the web framework to make easily a new project that will fit exactly your needs. So, that's really nice for this kind of thing or if you want to try new ideas of services. Also, it's coerent with the ecosystem. So, it's working with the same back end. It's using the same APIs and the other front ends. It allows you to work. You can use JavaScript if you want, but you can totally avoid JavaScript and stay 100% in Python. So, you can avoid JavaScript as much as you want. And I know that you want to avoid JavaScript if you are sad. And also, XMPP brings some really nice features like OS management is natively on lit. So, if you want to create an account, you don't have to manage that. Actually, you just use your XMPP account and in XMPP server, you already have support for many logging methods like LDAP or these kind of things. It's also, we use storage system, which is called PubSub. PubSub is short for Publish Subscribe. It's an XMPP technology and it's like decentralized database. It's really nice because when you have something happening like a new item, new data or some modification, you get notified by XMPP so you can make automatic cache. So, the idea is if you create a blog, for instance, as long as nobody is writing anything, the blog will stay from the cache. And if something new happens, you can generate your page. Also, we have some components from the command task. For instance, one of the components which is coming every time is commands. We use XMPP blog engine for commands and we have components you can reuse command easily when you create something new. And we have stuff like a task manager includes. So, you don't have to use grunt or this kind of thing. It's already all included. We have all in one philosophy and we try to have maximum of things available. Also, some nice things that you can use the same template to generate static website. We have a theme engine which is really customizable and it's really thought from the beginning to have different theme and different interface. We try to stay as simple as possible. So, for the routing, we just use directory architecture to reproduce in the URL. And we try to have a web page which can work without JavaScript for a security reason. Like you have all seen that there have been some major security issue inside the processor. And so, if you want to be really secure, you would have to disable JavaScript. And we try when it's possible. Of course, it's not possible for chat, for instance. But when it's possible, we try to have JavaScript as a website working without JavaScript. So, that's the conclusion. I think we have some time. Yes, we have some time. So, I will show you a short video to see it in action. So, yes, of the conclusion, that is a universal communication tool which links decentralization, standardization, and Python. Here are some useful links. So, on the top, this is the website and the demo which is, I think, broke and no. I will fix it. Sorry. My blog, when I explain the experimentation we are doing and sometime with some technical details and kind of stuff. And we are looking for contributors. So, if you can help for development, packaging. By the way, we are available on Debian, not for the desktop interface, but at least for the command line. And we are on Debian. And on Arch Linux, we are also available and system with web and desktop interface. And yes, doc, translation, et cetera. Thank you for attending. And I will show you just short video. Okay. So, this is an example of file sharing. So, you just go to your directory. You select one of your directory. You click on it. You say I want to share. You say who you want to share with. Just click. It's easy. And your directory is shared and you can access it. And I think I show. Yes. And this is for the web interface. So, it's another account. It's going to the shared file. And you can click on it. And you can, yes, you can access the video from your browser which was shared from the desktop interface. So, that's one thing. This is another fun feature. Like it's a bit similar to KDE Connect. Like you launch video player on your desk. On the right, it's my phone. And on the phone, I just can click on the video. And after I can remote control from my coach, the video. And it's all using XMPP in the background. So, yeah. Okay. And the last one. Initially, I wanted to do some life coding. But we, after discussing, it was a bit not a good idea in short time. So, I've recorded just a session to show you how to create, oh, how to create hello world, simple hello world website with web frontend. So, basically, it's like six things. You create architecture with its MVC model. So, the template has a view. The page has a controller. And you use XMPP when you want to, for the model. And so, yeah, just creating the template, which is saying hello world. I'm just skipping a bit to have some time. And yes, this is the Python part. Actually, there is nothing here. Just a template. We just select the template. After all, this is not super interesting. I just setting the framework with my new creative directory. And, yes. And after, I launch it. And I go to the host I have created. And, yes, the port is 8080 by default. And it's following actually the path I have set. So, it will go to hello and you create easily your hello world like this. And after, if you want to use it on your root page, you just add a setting. You just say I want the root to be sent to the hello world page. So, I just do that. And after, I can go to the main page and it will show the hello world. And the last thing I want to show you is how to use XMPP is used after that. So, you're still with the hello world, with the hello world seats. But I'm adding another setting where I say I want to connect with my XMPP account. So, I import just a constant which says that. I say I want access to be managed by profile. Profile is the name we use for XMPP account. One profile is one XMPP account. After, I have to restart for now. That will be notified soon. But for now, I need to restart when I change the code. And so, no, I can't access anymore if I don't have XMPP account. And after, you can have permission management saying, for instance, this GID, which is XMPP identifier, is administrator and can access the administrator page. So, that's it. And if you have any questions, you're welcome. Can I show the links? Okay. Is there any question? Yes. Sorry. Sorry. I don't get. I'm sorry. So, the question is, is there any kind of target user that I was imagining? Actually, you know, it gets built. I have some, initially, the idea was to have some building tools to create more things after. And after, when I have ideas, I try to implement them. So, it grows. That's why it has a lot of features. But the nice thing about that is it's really easy when you have something to reuse it after. So, for instance, the blogging, it was made, but after, I had comments everywhere. And the ticket I could reuse to make merge requests. So, yeah, that's the thing. Any other question? Yes? Yes. So, the question is, you say that you want to all in one module, but is it possible to plug with something else or to have, yes, it's absolutely possible. And we don't want to have one ring to rule them all. Like, if somebody wants to use Converse or something else, we absolutely open to that. And we try actually to have something modular so it can be used to any use case. And one of these cases could be using with other tools. So, yes, we just want all in one for practical reason, but we are absolutely open to integrate other tools and not stay all in our thing. Any other question? Yes? Sorry, time's up. I'm sorry, but we can talk after. So, thank you very much. Goodbye.