<?xml 
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
>

<channel xml:lang="en">
	<title>John Livingston</title>
	<link>https://www.john-livingston.fr/</link>
	
	<language>en</language>
	<generator>SPIP - www.spip.net (Sarka-SPIP)</generator>

	<image>
		<title>John Livingston</title>
		<url>https://www.john-livingston.fr/local/cache-vignettes/L144xH144/johnlivingston_ratio_1_1-1aa14.png?1733305437</url>
		<link>https://www.john-livingston.fr/</link>
		<height>144</height>
		<width>144</width>
	</image>



 
	<item xml:lang="en">
		<title>Peertube chat plugin: quick feedbacks about a live stress test</title>
		<link>https://www.john-livingston.fr/foss/article/peertube-chat-plugin-quick-feedbacks-about-a-live-stress-test</link>
		<guid isPermaLink="true">https://www.john-livingston.fr/foss/article/peertube-chat-plugin-quick-feedbacks-about-a-live-stress-test</guid>
		<dc:date>2023-01-04T17:37:59Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>en</dc:language>
		<dc:creator>John Livingston</dc:creator>



		<description>
&lt;p&gt;Introduction &lt;br class='autobr' /&gt;
On the last friday, the 30th of december, the &#8220;Au Poste&#8221; team &#8212; a french media started by David Dufresne &#8212; organised a Peertube live test. It was the opportunity for Framasoft, Octopuce and I to test Peertube as well as my chat plugin &#8220;at scale&#8221;. &lt;br class='autobr' /&gt;
This is something I had been waiting for a long time. As an independant developper, it is hard for me to gather hundreds of people to make stress tests. David Dufresne has a community of multiple hundreds of people who follow him on (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.john-livingston.fr/foss/" rel="directory"&gt;FOSS&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;div class=&#034;cs_sommaire cs_sommaire_avec_fond&#034; id=&#034;outil_sommaire&#034;&gt; &lt;div class=&#034;cs_sommaire_inner&#034;&gt; &lt;div class=&#034;cs_sommaire_titre_avec_fond&#034;&gt; Sommaire &lt;/div&gt; &lt;div class=&#034;cs_sommaire_corps&#034;&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=&#034;Introduction&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#introduction'&gt;Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Feedback&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#feedback'&gt;Feedback&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Technical details&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#technical_details'&gt;Technical details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;1. Architecture&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#1_architecture'&gt;1. Architecture&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title=&#034;1.A AppImage&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#1_a_appimage'&gt;1.A AppImage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;1.B Proxy&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#1_b_proxy'&gt;1.B Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;1.C Database&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#1_c_database'&gt;1.C Database&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;2. Virtual Hosts and XMPP Components&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#2_virtual_hosts_and_xmpp_components'&gt;2. Virtual Hosts and XMPP (&#8230;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;3. Prosody specific modules&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#3_prosody_specific_modules'&gt;3. Prosody specific modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;4. vCards&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#4_vcards'&gt;4. vCards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;5. Chat history, pruning, ...&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#5_chat_history_pruning'&gt;5. Chat history, pruning,&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;6. Network load caused by fetching ConverseJS&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#6_network_load_caused_by_fetching_conversejs'&gt;6. Network load caused by (&#8230;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;7. Join/Part messages and activity&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#7_join_part_messages_and_activity'&gt;7. Join/Part messages and (&#8230;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;8. Changing nicknames&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#8_changing_nicknames'&gt;8. Changing nicknames&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;In Conclusion&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#in_conclusion'&gt;In Conclusion&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Thanks&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#thanks'&gt;Thanks&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034; id=&#034;introduction&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;On the last friday, the 30th of december, the &lt;a href=&#034;https://www.auposte.fr&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;&#8220;Au Poste&#8221;&lt;/a&gt; team &#8212; a french media started by David Dufresne &#8212; organised a Peertube live test. It was the opportunity for &lt;a href=&#034;https://framasoft.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Framasoft&lt;/a&gt;, &lt;a href=&#034;https://www.octopure.fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Octopuce&lt;/a&gt; and I to test Peertube as well as my &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;chat plugin&lt;/a&gt; &#8220;at scale&#8221;.&lt;/p&gt;
&lt;p&gt;This is something I had been waiting for a long time. As an independant developper, it is hard for me to gather hundreds of people to make stress tests. David Dufresne has a community of multiple hundreds of people who follow him on Twitch. Most of whom, for political reasons, are trying to free themselves from GAFAMs. This full-size test was long-awaited by many people of his community.&lt;/p&gt;
&lt;p&gt;So I had several meetups with David and his team the week before to organize this live event. From his side, he also contacted Octopuce (his hoster) and Framasoft (which is behind the Peertube project).&lt;/p&gt;
&lt;p&gt;Note: it was foreseen that I would be connected to the chat to answer questions, but as it was very active it was difficult to follow any of it. I ended up joining the live half-way. We had many interesting discussions: on politics, or tech, ... The replay is available here: &lt;a href=&#034;https://video.davduf.net/w/a4d7443c-135b-4188-9369-9bcac89adcf4&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Peerturbateurs, unissez-vous! Test d'un live Peertube avec 400 viewers&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;feedback&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Octopuce has published a very complete article (in french) which details how servers handled the test. &lt;a href=&#034;https://www.octopuce.fr/test-de-charge-dun-peertube-en-live-avec-auposte/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Peertube live load testing with Auposte (fr)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For people that doesn't understand french, in two words: 450 viewers tried to connect at the same time to the live and the chat.&lt;br class='autobr' /&gt;
We had some issues with the chat plugin. Some issues that I was expecting, some others not. I will try to come back to them in this article ; and explain what happens and why I think it wasn't working the best it could. I think that some of the issues are a little more complex than what the Octopuce article made it sound like. This - quickly written- article is also the opportunity for me to explain what I have in mind to improve the situation.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;technical_details&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;Technical details&lt;/h2&gt;
&lt;p&gt;We're now going to look at what happened during this stress test. I will explain technical details that could IMHO explain observed metrics.&lt;/p&gt;
&lt;p&gt;I think some problems are due to many little things that were more or less predictable. The sum of them caused some troubles.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;1_architecture&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;1. Architecture&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;The Peertube chat plugin is a bit special. The goal is to be able to install it from the Peertube interface, without any server configuration required, and without root rights.&lt;/p&gt;
&lt;p&gt;This means I can't:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Use official packages (debian, ...),&lt;/li&gt;&lt;li&gt; Assume necessary XMPP ports are open on the server&lt;/li&gt;&lt;li&gt; Access a database. Peertube's plugin system only gives basic access to the PostgreSQL database. Adding tables from there doesn't look very clean.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;This lead me to make choices that are not optimal and I am aware of it. I already have a very long TODO list with lots of possible improvements. It's only a matter of time.&lt;/p&gt;
&lt;p&gt;Parts of this TODO is already described in the article &lt;a href='https://www.john-livingston.fr/foss/article/peertube-chat-plugin-2023-will-be-full-of-new-features' class=&#034;spip_in&#034;&gt;2023 will be full of new features&lt;/a&gt;, available in multiple languages.&lt;/p&gt;
&lt;p&gt;The rest is registered on the &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;github tracker&lt;/a&gt;. These issues are also sorted in a &lt;a href=&#034;https://github.com/users/JohnXLivingston/projects/1&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;github project&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the frontend, I use &lt;a href=&#034;https://conversejs.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ConverseJS&lt;/a&gt; which allows connecting to XMPP servers from a web browser, using Javascript.&lt;/p&gt;
&lt;p&gt;Let's dig into constraints I listed above and see what they imply.&lt;/p&gt;
&lt;h3 id=&#034;1_a_appimage&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;1.A AppImage&lt;/h3&gt;
&lt;p&gt;The chat plugin uses the &lt;a href=&#034;https://prosody.im&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Prosody&lt;/a&gt; XMPP server as a backend. I need to be able to use Prosody without installing anything on the server. No &#8220;root&#8221; access.&lt;/p&gt;
&lt;p&gt;I created an &lt;a href=&#034;https://appimage.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;AppImage&lt;/a&gt; of Prosody based on Debian stable packages. This AppImage contains Lua (language used for Prosody), Prosody itself, and a small launcher script used to start either prosody or prosodyctl (to avoid having two different AppImages).&lt;/p&gt;
&lt;p&gt;The AppImage is created with &lt;a href=&#034;https://appimage-builder.readthedocs.io/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;appimage-builder&lt;/a&gt;, from this configuration file: &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/prosody/appimage_x86_64.yml&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;appimage yml&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then Peertube generates a configuration file for Prosody (from plugin parameters), and launches the AppImage. It's not launched as a daemon, but as a child process of Peertube. This way if Peertube is stopped, we're sure Prosody is too.&lt;/p&gt;
&lt;h3 id=&#034;1_b_proxy&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;1.B Proxy&lt;/h3&gt;
&lt;p&gt;As ports on the machine could be closed by firewalls, we need to proxify everything through Peertube. It's ugly but it works out of the box.&lt;/p&gt;
&lt;p&gt;How does it work?&lt;br class='autobr' /&gt;
I use Websocket or BOSH connections which go through 2 successive reverse proxies:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; nginx in front of Peertube&lt;/li&gt;&lt;li&gt; Peertube itself&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Peertube is written in NodeJS, so I use a NodeJS library which allows me to reverse proxy. It's not optimal, and I probably should rework it to improve performances.&lt;/p&gt;
&lt;p&gt;Note: I plan to provide a way to have advanced configuration in the plugin, which would allow us to optimise it, especially by giving direct access to the XMPP server from the outside. It will require root access on the server though.&lt;/p&gt;
&lt;h3 id=&#034;1_c_database&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;1.C Database&lt;/h3&gt;
&lt;p&gt;No database: Prosody uses the the internal storage module. Which means everything is stored as files: user files, chat history, ...&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;2_virtual_hosts_and_xmpp_components&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;2. Virtual Hosts and XMPP Components&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;In the generated Prosody configuration we can find:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; A Virtual host for connected Peertube users. If I have a Peertube account &#8220;@john&lt;span class='mcrypt'&gt; &lt;/span&gt;instance.tld&#8221;, then I will have an XMPP user &#8220;john&lt;span class='mcrypt'&gt; &lt;/span&gt;instance.tld&#8221;.&lt;/li&gt;&lt;li&gt; A Virtual host for anonymous users. Users without an account can join the chat just by choosing a nickname. In the live test on the 30th, we had more than 400 people in this situation.&lt;/li&gt;&lt;li&gt; A &#8220;room&#8221; component, to handle groupchats.&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034; id=&#034;3_prosody_specific_modules&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;3. Prosody specific modules&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I have specific Prosody modules. There's different types: those with &#8220;livechat&#8221; in the name:&lt;br class='autobr' /&gt;
&lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/tree/main/prosody-modules&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Chat plugin Prosody modules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here you'll find:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; A module to list rooms (to use in moderation tools)&lt;/li&gt;&lt;li&gt; A test module, to check Peertube and Prosody can communicate. This is used in a diagnostic tool included in the plugin.&lt;/li&gt;&lt;li&gt; Two vCards modules: One to get connected Peertube users' avatars, and one to generate random avatars for anonymous users.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;I also use existing modules:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; mod_muc_http_default to verify rooms can be created and configure them&lt;/li&gt;&lt;li&gt; mod_auth_http to authenticate connected Peertube users&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;All these modules make requests to Peertube's web API.&lt;/p&gt;
&lt;p&gt;This is where part of the problems Octopuce had last week comes from (IMHO): because of lacking features in Peertube's plugin system, whenever Prosody needs to call Peertube, it needs to go through nginx again. An &lt;a href=&#034;https://github.com/Chocobozzz/PeerTube/issues/5416&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;issue has been opened&lt;/a&gt;, it needs to be discussed and implemented.&lt;br class='autobr' /&gt;
Note: it was implemented today, and will be available in next Peertube version.&lt;/p&gt;
&lt;p&gt;In the meantime, this can be configured by hand in &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/documentation/admin.md#peertube-url-for-api-calls&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;advanced plugin settings&lt;/a&gt;, but it's not very well documented.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;4_vcards&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;4. vCards&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;An issue that had already been identified is that we use vCards in ConverseJS. vCards are like &#171;electronic business cards&#187; for chat users. They're also used to store avatars and that's where I get them from.&lt;/p&gt;
&lt;p&gt;As soon as someone connects, ConverseJS will fetch every other connected users' vcards. And when a new person joins, everyone already connected will ask for their vcard.&lt;/p&gt;
&lt;p&gt;For those already connected to Peertube, Peertube's avatar will be fetched. In last week's test only 4 or 5 people had Peertube accounts and were in this case.&lt;/p&gt;
&lt;p&gt;For anonymous vcards, a random one will be choosen among a list of a few dozens and get displayed.&lt;br class='autobr' /&gt;
Code handling this is here: mod_vcard_peertubelivechat-&gt;&lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/prosody-modules/mod_vcard_peertubelivechat/mod_vcard_peertubelivechat.lua&#034; class=&#034;spip_url spip_out auto&#034; rel=&#034;nofollow external&#034;&gt;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/prosody-modules/mod_vcard_peertubelivechat/mod_vcard_peertubelivechat.lua&lt;/a&gt;].&lt;br class='autobr' /&gt;
I'm new at Lua so this may not be the best code there is.&lt;/p&gt;
&lt;p&gt;Last week we had 400 people joining around the same time. 400 people asking for 400 vcards. It was really sluggish, and on top of that people refreshed the page multiple times instead of waiting a bit for things to settle down.&lt;/p&gt;
&lt;p&gt;In addition to this, each avatar is about 4.2Ko in JPG. This JPG is base64 encoded before being sent via XMPP, which makes it about 6Ko per avatar.&lt;br class='autobr' /&gt;
400 * 400 * 6Ko = 960Mo, at once, in addition to the XMPP enveloppe and other vCard data.&lt;/p&gt;
&lt;p&gt;This also doesn't take into account CPU load and disk on Prosody, which was at a 100% for some reason. I think vcards are the culprit (as mentioned in the Octopuce article, Prosody is single-threaded).&lt;br class='autobr' /&gt;
Which implies timeouts, people refreshing the page even more, etc.&lt;/p&gt;
&lt;p&gt;I have in my TODO list to &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/106&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;compute avatars on the frontend&lt;/a&gt;, and stop fetching vCards. This should greatly help. I also hesitate to disable avatars completely to replace them with a simple colored nickname, which could use &lt;a href=&#034;https://xmpp.org/extensions/xep-0392.html&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;XEP-0392&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;5_chat_history_pruning&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;5. Chat history, pruning, ...&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;Until last friday's test, I didn't think handling chat history would be an issue. This is why I haven't tried to optimise it, and I configured ConverseJS to fetch it when a user joins.&lt;/p&gt;
&lt;p&gt;It turns out, with 400 users at once, it's X messages * 400 users to fetch. All of this being stored in files (Prosody's internal storage). It was bound to be an issue.&lt;/p&gt;
&lt;p&gt;Another completely unexpected issue: I don't prune messages in ConverseJS. So they all pile up and the browser starts struggling for each key stroke.&lt;/p&gt;
&lt;p&gt;This again made people refresh the page even more during the live stream causing multiple issues. This is something I will be looking into very quickly.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;6_network_load_caused_by_fetching_conversejs&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;6. Network load caused by fetching ConverseJS&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;The way ConverseJS is currently integrated in the plugin makes that:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; ConverseJS is included in its entirety, even modules I don't need&lt;/li&gt;&lt;li&gt; It goes through Nginx and then NodeJS to load files.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Everytime someone opens the page or refreshes it, the browser downloads multiple MB through Nginx and NodeJS. This must explain part of the huge bandwidth consumption observed by Octopuce.&lt;/p&gt;
&lt;p&gt;I have already started cleaning all of this. If everything goes to plan, ConverseJS will be optimised and will load more efficiently in the next version of the plugin.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;7_join_part_messages_and_activity&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;7. Join/Part messages and activity&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I have enabled join/part messages' display in chat (&#8220;Juliet joined the room&#8221;), as well as activity messages (&#8220;Max is writing...&#8221;). With 400 people joining and quitting multiple times, and with all the refreshes, it can also quickly add up and generate traffic (and make JS go sluggish again).&lt;/p&gt;
&lt;p&gt;I will remove this. Maybe only leave join / part messages for moderators, but messages such as &#8220;Jack is writing&#8221; have little interest, if not to generate hundreds of unnecessary XMPP messages.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;8_changing_nicknames&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;8. Changing nicknames&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;For anybody without a Peertube account to be able to see live chat without even having to choose a nickname, I assign to them a random one such as &#8220;Anonymous 123456&#8221;.&lt;/p&gt;
&lt;p&gt;To be able to chat, they must first choose a nickname, and ConverseJS is going to display &#8220;Anonymous 123456 becomes Camille&#8221; each time. This again generates lots of XMPP traffic for this number of users and lots of JavaScript running for little gain.&lt;/p&gt;
&lt;p&gt;I may end up hiding this type of messages as well. At least when the original nickname is &#171; Anonymous 123456 &#187;. I am also thinking about removing those that haven't yet chosen a nickname from the list of participants in the room, only to display a counter &#171; X anonymous &#187; which can only reduce traffic and the browser load.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;in_conclusion&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;In Conclusion&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;As I mentioned at the beginning of this article, this is just a first shot. I put down what came to mind while writing and it's possible I have forgotten things. You can find all the improvments mentionned in this article in this &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;github issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There are still many possible improvements for this plugin. &lt;a href='https://www.john-livingston.fr/foss/article/peertube-chat-plugin-2023-will-be-full-of-new-features' class=&#034;spip_in&#034;&gt;I only need to get back to it&lt;/a&gt;!&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;thanks&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Thanks&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I want to thank the XMPP community. Many people working on Prosody, ConverseJS, XEPs, etc. are looking at my work and regularly provide help.&lt;br class='autobr' /&gt;
Thanks to all, it reassures me in the choice of technology I made when I started this project.&lt;/p&gt;
&lt;p&gt;Many thanks also to David and his team, Octopuce, and Framasoft. It was a fun live event, and there is plenty of things to learn from.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
	<item xml:lang="en">
		<title>Peertube chat plugin: 2023 will be full of new features!</title>
		<link>https://www.john-livingston.fr/foss/article/peertube-chat-plugin-2023-will-be-full-of-new-features</link>
		<guid isPermaLink="true">https://www.john-livingston.fr/foss/article/peertube-chat-plugin-2023-will-be-full-of-new-features</guid>
		<dc:date>2022-12-15T10:19:17Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>en</dc:language>
		<dc:creator>John Livingston</dc:creator>



		<description>
&lt;p&gt;This article is a translation from the french version &lt;br class='autobr' /&gt;
The chat plugin &lt;br class='autobr' /&gt;
One of my most important free software projects, and without a doubt the one I care about the most, is the Peertube livechat plugin. &lt;br class='autobr' /&gt;
Peertube is a free software, allowing to deploy a video on demand and live streaming platform. The different installations of Peertube (called &#034;instances&#034;) can be federated together, being part of what is called the f&#233;diverse, contraction of &#034;federation&#034; and &#034;universe&#034;. It is a set of (&#8230;)&lt;/p&gt;


-
&lt;a href="https://www.john-livingston.fr/foss/" rel="directory"&gt;FOSS&lt;/a&gt;


		</description>


 <content:encoded>&lt;img src='https://www.john-livingston.fr/local/cache-vignettes/L149xH150/sepia-3-15c6b.svg?1733348189' class='spip_logo spip_logo_right' width='149' height='150' alt=&#034;&#034; /&gt;
		&lt;div class='rss_texte'&gt;&lt;div class=&#034;cs_sommaire cs_sommaire_avec_fond&#034; id=&#034;outil_sommaire&#034;&gt; &lt;div class=&#034;cs_sommaire_inner&#034;&gt; &lt;div class=&#034;cs_sommaire_titre_avec_fond&#034;&gt; Sommaire &lt;/div&gt; &lt;div class=&#034;cs_sommaire_corps&#034;&gt; &lt;ul&gt; &lt;li&gt;&lt;a title=&#034;The chat plugin&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#the_chat_plugin'&gt;The chat plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;The search for funding&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#the_search_for_funding'&gt;The search for funding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;2021/2022&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#2021_2022'&gt;2021/2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Donations&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#donations'&gt;Donations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Copie Publique&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#copie_publique'&gt;Copie Publique&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Framasoft&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#framasoft'&gt;Framasoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;NlNet&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#nlnet'&gt;NlNet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;And for 2023?&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#and_for_2023'&gt;And for 2023?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Display of the chat in the &#034;embed&#034;&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#display_of_the_chat_in_the_embed'&gt;Display of the chat in the (&#8230;)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;UI/UX redesign&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#ui_ux_redesign'&gt;UI/UX redesign&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Federation&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#federation'&gt;Federation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Moderation/interaction bot&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#moderation_interaction_bot'&gt;Moderation/interaction bot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Translations&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#translations'&gt;Translations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Accessibility&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#accessibility'&gt;Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Other&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#other'&gt;Other&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title=&#034;Conclusion&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#conclusion'&gt;Conclusion&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This article is a translation from the &lt;a href='https://www.john-livingston.fr/foss/article/plugin-de-tchat-peertube-2023-sera-riche-en-nouveautes' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;french version&lt;/a&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;the_chat_plugin&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;The chat plugin&lt;/h2&gt;
&lt;p&gt;One of my most important free software projects, and without a doubt the one I care about the most, is the &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Peertube livechat&lt;/a&gt; plugin.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://joinpeertube.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Peertube&lt;/a&gt; is a free software, allowing to deploy a video on demand and live streaming platform. The different installations of Peertube (called &#034;instances&#034;) can be federated together, being part of what is called the &lt;a href=&#034;https://en.wikipedia.org/wiki/Fediverse&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;f&#233;diverse&lt;/a&gt;, contraction of &#034;federation&#034; and &#034;universe&#034;. It is a set of software that can communicate with each other. There are video platforms, music platforms, micro-blogging tools, publishing tools, and all types of social networks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#034;https://framasoft.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Framasoft&lt;/a&gt; is piloting &lt;a href=&#034;https://github.com/Chocobozzz/PeerTube&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;the Peertube project&lt;/a&gt;, but did not want to add a chat function natively in the software. They preferred to make it possible via the &#034;plugins&#034; system that Peertube offers.&lt;/p&gt;
&lt;p&gt;And this is where I come in!&lt;/p&gt;
&lt;p&gt;I was first contacted by &lt;a href=&#034;https://ritimo.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ritimo&lt;/a&gt;, and I developed in 3 days a first functional version.&lt;br class='autobr' /&gt;
I chose to rely on an existing, proven and scalable technology, &lt;a href=&#034;https://xmpp.org/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;XMPP&lt;/a&gt;. This choice was motivated by a long term vision: I had to be able to make the software evolve easily, and add moderation, federation, robots, ... In short, the XMPP protocol, and the XMPP server &lt;a href=&#034;https://prosody.im&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Prosody&lt;/a&gt; were just right.&lt;/p&gt;
&lt;p&gt;Afterwards, the plugin has evolved a lot. At the time of writing, it is in its &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/CHANGELOG.md&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;6th major version&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;To see a demo of the plugin, you can go &lt;a href=&#034;https://www.yiny.org/w/87yDnRKJgZH4wca7CwjkKm&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;here&lt;/a&gt;.&lt;br class='autobr' /&gt;
There is also a demo room where I test future versions &lt;a href=&#034;https://videos.john-livingston.fr/w/qqNQwFDerUB1KnFA6N6Jbi&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;the_search_for_funding&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;The search for funding&lt;/h2&gt;
&lt;p&gt;It's been 3 years now that I decided to become a free software developer on my own. It is above all an ideological &lt;a href='https://www.john-livingston.fr/about/article/qui-suis-je' class=&#034;spip_in&#034; hreflang=&#034;fr&#034;&gt;choice&lt;/a&gt;, wanting to get out of the capitalist market, its relations of subordination, and wanting to work for the creation of &#034;digital commons&#034;.&lt;/p&gt;
&lt;p&gt;The development of this plugin requires time, a lot of time. And I'm trying to make a living out of it. So to be able to work on it, I need to find funding. Unfortunately, I have to prioritize my projects according to the financial support I find.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;2021_2022&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;2021/2022&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;In the past I have received funding from &lt;a href=&#034;https://ritimo.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;ritimo&lt;/a&gt;, &lt;a href=&#034;https://framasoft.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Framasoft&lt;/a&gt; and &lt;a href=&#034;https://www.codelutin.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Code Lutin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But a large part of my 2022 year has been spent looking for budgets to work on this plugin. I also spent a lot of time working on it &#034;for free&#034; (ie: I didn't find anyone to fund the time spent).&lt;/p&gt;
&lt;p&gt;It was only at the end of this year that I was able to find solid funding, and work on a roadmap.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;donations&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt; Donations&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I didn't mention it in the previous paragraph, but I also received some donations, especially through my &lt;a href=&#034;https://liberapay.com/JohnLivingston/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Liberapay&lt;/a&gt; page. From this platform, I receive on average 8.90&#8364;/month.&lt;br class='autobr' /&gt;
I also received a donation via &lt;a href=&#034;https://github.com/sponsors/JohnXLivingston/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github Sponsor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These donations may seem anecdotal, but in reality they are very motivating. To think that a stranger is willing to give me 10, 20 or 50&#8364;, just because what I did is useful to them, is extremely gratifying.&lt;/p&gt;
&lt;p&gt;So &#034;big &lt;3&#034; to all the people who donate via this kind of platform, whether to me or to others. Thank you, thank you, THANK YOU!&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;copie_publique&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Copie Publique&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;https://www.codelutin.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Code Lutin&lt;/a&gt; is a company specialized in free software. They have decided, several years ago now, to redistribute at least 1% of their annual turnover to one or several free software projects. The decision is taken democratically among the team members. This is a fantastic initiative, which in addition to helping financially, gives a lot of visibility to the chosen projects.&lt;/p&gt;
&lt;p&gt;I had already been lucky enough to be selected last year.&lt;/p&gt;
&lt;p&gt;And for 2022, they decided it was time to move up a gear, and encourage other structures (companies, developers, ...) to do the same. So they set up the &lt;a href=&#034;https://copiepublique.fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Public Copy Retribution&lt;/a&gt; platform. The idea is simple: you benefit from free and open source tools, it's a fair return to give some money in return. Any structure wanting to join the initiative can define its own conditions. I strongly invite you to visit &lt;a href=&#034;https://copiepublique.fr/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;their site&lt;/a&gt;, and have a look at the past beneficiaries.&lt;/p&gt;
&lt;p&gt;And I'm very happy to have been selected again for a grant in 2022 (for the Peertube chat plugin, and more broadly for the &lt;a href=&#034;https://github.com/JohnXLivingston?tab=repositories&amp;q=peertube-&amp;type=&amp;language=&amp;sort=&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;other Peertube plugins&lt;/a&gt; I'm working on).&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;framasoft&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Framasoft&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;At the end of this year, &lt;a href=&#034;https://framasoft.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Framasoft&lt;/a&gt; has also decided to release a budget for the chat plugin.&lt;/p&gt;
&lt;p&gt;Framasoft has always supported me in this project, and Chocobozzz (the creator of Peertube) has always been very reactive when I needed changes in the Peertube plugin system. It's a real pleasure to work with people like them.&lt;/p&gt;
&lt;p&gt;I have to specify the following points:&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; This funding was made possible thanks to donations (mainly from individuals) made to Framasoft in previous years.&lt;/li&gt;&lt;li&gt; Framasoft is financed only by donations, so &#034;more donations to Framasoft =&gt; more capacity to finance free services around PeerTube &amp; other Framasoft projects&#034; (and Framasoft has a lot of projects for the years to come!).&lt;/li&gt;&lt;li&gt; Framasoft is in the middle of a donation campaign for 2023. They are still missing a big part of what they need for 2023, so &lt;a href=&#034;https://soutenir.framasoft.org&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;go support them&lt;/a&gt;!&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you want a little more information, it just so happens that the two co-directors of Framasoft were &lt;a href=&#034;https://www.twitch.tv/videos/1678685219&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;live at the station to talk about it&lt;/a&gt; this morning (this is a Twitch link, but I'll replace it with a Peertube link as soon as it becomes available).&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;nlnet&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;NlNet&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#034;https://nlnet.nl/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;NlNet&lt;/a&gt; is a Dutch foundation that funds Free Software projects. They launch several fundraising campaigns per year, on different themes. The money comes from sponsors, among others the European Commission.&lt;/p&gt;
&lt;p&gt;After I applied once without being selected, I tried again for the &lt;a href=&#034;https://nlnet.nl/NGI0/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;NGI Zero&lt;/a&gt; call in August 2022. And this time, I can now announce it publicly, &lt;a href=&#034;https://nlnet.nl/project/Peertube-Livechat/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;we have signed&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;This will allow me to work on the plugin for several weeks, and to make some much needed changes! (see further in this article).&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;and_for_2023&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;And for 2023?&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;After this long search for funding, I can now finally tackle the evolutions of the plugin!&lt;/p&gt;
&lt;p&gt;I have already published a version 6.0.0 which is detailed &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/CHANGELOG.md#600&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have reordered all the tasks to be done in the form of &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github tickets&lt;/a&gt;. I've added &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/milestones&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;milestones&lt;/a&gt; to give a rough timeline (I still have to juggle between different projects, so I hope you'll be tolerant of my possible delays &#128521;).&lt;/p&gt;
&lt;p&gt;I also created &lt;a href=&#034;https://github.com/users/JohnXLivingston/projects/1&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;a Github project&lt;/a&gt; that allows you to see the status of different tasks (and filter by milestone).&lt;/p&gt;
&lt;p&gt;Finally, I added tags on the &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github tickets&lt;/a&gt; specifying the sponsor related to the task (if any). So you can filter the tickets by sponsor, thanks to whom the features will be released.&lt;br class='autobr' /&gt;
NB: Code Lutin is not associated with any particular task, but their funding does exist, and helped me a lot!&lt;/p&gt;
&lt;p&gt;I will now detail the biggest features to come.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;display_of_the_chat_in_the_embed&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Display of the chat in the &#034;embed&#034;&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;It is possible to embed a Peertube video on a third party site. But until recently, it was not possible for Peertube plugins to add features to the included videos.&lt;/p&gt;
&lt;p&gt;Today, it is already possible to include the chat, by building &#034;by hand&#034; the &#034;iframe&#034; tag that goes well. If you don't understand what I'm talking about, well... you understand the problem ;).&lt;/p&gt;
&lt;p&gt;The first thing I'm going to do is to add an option to easily generate the necessary to copy and paste on your website. Just like you would do to include the video. You will then only have to generate the &#034;iframe&#034; for the video, and the one for the chat, and place both at your convenience.&lt;/p&gt;
&lt;p&gt;Next, I will also propose another option. When you generate the iframe for the video, you will have an option to include/exclude the chat directly in the same iframe as the video (and/or a button to open the chat in a new window, the decision is not taken).&lt;/p&gt;
&lt;p&gt;I will propose both functional solutions, because I think both are useful. Indeed, there is no point in displaying the chat on top of the video if you are in a very small thumbnail, and vice versa.&lt;/p&gt;
&lt;p&gt;These features are sponsored by Framasoft.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;ui_ux_redesign&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;UI/UX redesign&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;Framasoft asked me to work on the interface (UI, User Interface) and the user experience (UX, User eXperience).&lt;br class='autobr' /&gt;
So I'm going to re-work entirely the plugin integration. Ideally, this one will integrate better with Peertube (same fonts, borders, ...). And I'll see if I can make it possible to move the chat window freely.&lt;/p&gt;
&lt;p&gt;I'll also make the moderation functions more visible, and more convenient to use. Because yes, the plugin already allows advanced moderation, but... it's a bit hidden. Because I didn't have time to do better in the past.&lt;/p&gt;
&lt;p&gt;Finally, I will also improve the integration of the chat in the streaming tools (especially OBS). Currently, it is already possible (and &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/blob/main/documentation/user.md#obs-overlay&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;documented&lt;/a&gt;). But I've been given some ideas on how to make it &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/109&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;much better&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;federation&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Federation&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;Peertube is a federated technology. You can create &#034;bridges&#034; between &#034;instances&#034;. For example, I can see a live broadcast on the server of association A, from my personal server B. But for the moment, the plugin doesn't know how to manage the federation at all. The chat is only displayed on the original instance (A).&lt;/p&gt;
&lt;p&gt;Thanks to a funding from NlNet, I'll make the chat display on the instance from where you're looking, and that you're connected with your account on this one (if necessary).&lt;br class='autobr' /&gt;
The fact to have chosen the XMPP technology will make my life easier, this one was already made to be decentralized. I just have some technical difficulties to overcome (Peertube has to act as a web proxy in front of the service, so I have to &#034;proxy&#034; the communications through a web layer).&lt;/p&gt;
&lt;p&gt;Of course, this will have to be accompanied with moderation features, to avoid hostile behaviors (like &#034;bot raid&#034; or &#034;spam&#034;). The streamers will need to be able to choose whether or not to open to remote instances, mass ban, etc.&lt;/p&gt;
&lt;p&gt;In a second step, I would also try to standardize these chat mechanisms on the fediverse, to allow connecting to it from other software! (why not Mastodon for example). My work will consist in proposing an &#034;ActivityPub&#034; standard to announce the chat(s) associated to an object, and to implement it in Peertube and the chat plugin.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;moderation_interaction_bot&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Moderation/interaction bot&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I have a lot of ideas about bots features (non exhaustive list):
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; automated publication of text in the chat (for funding links, chat rules, ...)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; automated moderation (blocking of certain words, ban, etc)
&lt;br /&gt;&lt;span class=&#034;spip-puce ltr&#034;&gt;&lt;b&gt;&#8211;&lt;/b&gt;&lt;/span&gt; commands&lt;/p&gt;
&lt;p&gt;To summarize: a lot of features you may have already seen on Twitch and so on. I know it is very expected, and good news, it will be done in 2023 thanks to NlNet!&lt;/p&gt;
&lt;p&gt;I'm also thinking of an interface for the streamers, with a list of action buttons. For example to ban in one click, or publish pre-filled messages.&lt;/p&gt;
&lt;p&gt;And finally, I'm also thinking of interaction tools in the other direction: an action in the chat would cause a display/sound in the stream. This is for example what we can see on Twitch when there is a donation.&lt;/p&gt;
&lt;p&gt;Don't hesitate to propose your ideas &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/issues/116&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;here&lt;/a&gt; if you have an account.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;translations&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Translations&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;I will also work on the plugin translations, and try to support a maximum of languages.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;accessibility&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Accessibility&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;NlNet provides an accessibility audit service to its beneficiaries. So I will be able to make sure - with the help of competent people - that the chat plugin is accessible (for visually impaired, colorblind, motor handicap, ...), and correct issues if necessary.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;other&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;&lt;i&gt;Other&lt;/i&gt;&lt;/h2&gt;
&lt;p&gt;There are other evolutions planned, but I won't detail them here and now. The &lt;a href=&#034;https://github.com/users/JohnXLivingston/projects/1&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github project&lt;/a&gt; gives a pretty complete overview.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034; id=&#034;conclusion&#034;&gt;&lt;a title=&#034;Sommaire&#034; href='https://www.john-livingston.fr/spip.php?id_rubrique=3&amp;lang=en&amp;page=backend#outil_sommaire' class=&#034;sommaire_ancre&#034;&gt; &lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That's it, that's the news about this Peertube chat plugin. I hope you will be as excited as I am. I can't wait to tackle all these features!&lt;/p&gt;
&lt;p&gt;If you want to discuss it, you can go through &lt;a href=&#034;https://github.com/JohnXLivingston/peertube-plugin-livechat/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Github&lt;/a&gt;, the &lt;a href=&#034;https://framacolibri.org/c/peertube/peertube/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;Peertube forum&lt;/a&gt; which I read almost daily, or &lt;a href=&#034;https://mamot.fr/@John_Livingston&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;my Mastodon account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;PS: the illustration image of this article is Sepia, the Peertube mascot. Published under a free license &lt;a href=&#034;https://creativecommons.org/licenses/by-sa/4.0/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;CC-BY-SA&lt;/a&gt; by &lt;a href=&#034;https://www.davidrevoy.com/&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;David Revoy&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>


 
	


 
	

</channel>
</rss>
