call_end

    • Mo chevron_right

      Let's Talk About Spaces milky way

      Timothée Jaussoin • pubsub.movim.eu / Movim • 5 March 2026 • 11 minutes

    It looks like we're finally there! Spaces in XMPP is now a thing and it's part of Movim, yay 🎉

    In this article, I'll explain what Spaces are in XMPP, how Movim is implementing them, how you can deploy and host your own Spaces, and what still needs to be done.

    tldr; Spaces in XMPP are implemented using Publish-Subscribe and Multi-User Chat, two XMPP extensions that are already available and largely implemented and are defined in details in XEP-0503 Spaces.

    A Bit of XMPP History

    There are basically two ways to send a message in XMPP: by sending a direct message to a contact, or by sending it in a chatroom.

    Direct chat messages were defined in the core XMPP protocol in the late nineties. Since XMPP is an eXtensible Messaging and Presence Protocol, chatrooms were defined a few years later, in 2002, in one of the first fundamental extensions of the protocol: XEP-0045: Multi-User Chat (XEP stands for XMPP Extension Protocol, pretty self-explanatory 😛).

    Also in 2002, a second fundamental extension was specified: PubSub, defined in XEP-0060. This extension defines a way to create "nodes" on the XMPP network where users can publish content and subscribe to it. Newly published, edited, or deleted content is then pushed to the node's subscribers in real time.

    And this worked well for many years. Those two principles were implemented, improved, and extended over nearly two decades.

    Movim was introduced in 2010 with the idea that, while being a web-based XMPP chat client, it could also make extensive use of PubSub to share social content and related features across the XMPP network. And that worked out really nicely, a PubSub node can be seen as a news feed where users can publish articles (defined in XEP-0472: Pubsub Social Feed) and, more recently, Stories (defined in XEP-0501: Pubsub Stories), and where other users can subscribe and be notified in real time about new content.

    Bookmarking Things on XMPP

    When you join a chatroom or subscribe to a PubSub node on the XMPP network, it's convenient to keep track of your subscriptions so that your XMPP clients can stay in sync. Just as browsers let you bookmark URLs to save websites you want to revisit, the bookmarks concept was introduced in XMPP.

    For PubSub subscriptions, this was defined in 2013 in XEP-0330: Pubsub Subscription.

    The following example is essentially a bookmark pointing to the Movim blog you're currently reading, stored on Salim's XMPP account.

    <iq type='result'
        from='salim@xmpp.ps'
        to='salim@xmpp.ps/fairphone'
        id='bget1234'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <items node='urn:xmpp:pubsub:subscription'>
                <item id='0bc0e76cb803b3b107aa369169d8c0d45086f844'>
                    <subscription xmlns='urn:xmpp:pubsub:subscription:0' server='pubsub.movim.eu' node='Movim'>
                        <title>Movim Blog</title>
                    </subscription>
                </item>
            </publish>
        </pubsub>
    </iq>
    

    Note that PubSub bookmark items are stored in a PubSub node hosted on your own account (here salim@xmpp.ps) 😸. This way, when a new bookmark is pushed by one client, all other connected clients for that account are notified in real time, and if they're offline, they simply fetch the list when they reconnect.

    For chatrooms, things work similarly. The rooms you've joined are stored in a dedicated PubSub node on your own account, as defined in XEP-0402: PEP Native Bookmarks.

    <iq type='result'
        to='pooja@jabber.in/phone'
        id='bget192121'>
      <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <items node='urn:xmpp:bookmarks:1'>
          <item id='patel_family@conference.jabber.in'>
            <conference xmlns='urn:xmpp:bookmarks:1'
                        name='Family Room'
                        autojoin='true'>
              <nick>Pooka</nick>
            </conference>
          </item>
          <item id='friends@conference.movim.eu'>
            <conference xmlns='urn:xmpp:bookmarks:1'
                        name='Friends Group'
                        autojoin='true'>
              <nick>PK</nick>
              <extensions>
                <pinned xmlns='urn:xmpp:bookmarks-pinning:0'/>
              </extensions>
            </conference>
          </item>
        </items>
      </pubsub>
    </iq>
    

    As you can see, bookmarks can have extensions. Here, the second chatroom "Friends Group" is pinned, which means clients will display it at the top of the list.

    Rooms and PubSub Affiliations

    Both chatrooms and PubSub nodes use the concept of affiliations, essentially roles assigned to users once they join a chatroom or PubSub node, which determine what actions they are allowed or forbidden to perform.

    In PubSub, affiliations are defined in section 4.1 Affiliations, and in Multi-User Chat in section 5.2 Affiliations. Those links contain the full details of each role's privileges.

    The great thing is that these two affiliation systems are actually quite similar! Chatrooms have Owner, Admin, Member, and Outcast affiliations, while PubSub has Owner, Publisher, Publish-Only, Member, and Outcast. This will come in handy later, as you'll see 😽.

    Introducing Spaces ✨

    Over the last few years, a new way of organizing chatrooms has emerged, first introduced by Slack, then adopted by Discord, Mattermost, Matrix, and many other chat platforms.

    As messaging grew more prominent, users needed more than a simple chatroom for sharing messages. They wanted to organize and categorize the content they were exchanging with others.

    This is where the concept of Spaces came in. Called Servers (or Guilds) on Discord, Workspaces on Slack, or simply Spaces on Matrix, the general idea is to let users create a shared place, and invite people to it, where they'll find a collection of chatrooms grouped together with a unified moderation system and a coherent user interface.

    This had been missing from XMPP for a long time.

    In autumn 2025, I organized a hackathon with my friend nicoco from the Slidge project to tackle this problem. Slidge is a great tool for bridging XMPP with many other chat protocols. I wanted to add Spaces to Movim, and he wanted a proper way to map Discord Servers and similar concepts to XMPP.

    After a few weeks of discussions, we published XEP-0503: Server-side Spaces, which was then presented at the XMPP Summit in Brussels in February 2026.

    So What Exactly Is It in XMPP?

    XMPP is all about reusability and extensibility. As the saying goes: "it's in old pots that we make the best jams."

    If you understood the XMPP concepts introduced in the previous sections, you'll see that Spaces in XMPP simply reuse them, defining a way to combine existing building blocks in a coherent way.

    Wait, is that all? Yes, pretty much 😸. XMPP already had most of the features needed for Spaces; we just needed some glue and careful thought to put the right pieces together.

    So what is a Space? A Space is essentially a shared, mixed PubSub bookmark node.

    Just as a user stores their own personal bookmarks on their own account, an XMPP user can create a "Space node" on a dedicated public PubSub server and invite others to it.

    <iq type='result'
        from='megacorp-pubsub.example.com'
        to='emacs-user@megacorp.example.com/cool-client'
        id='space-items'>
      <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <items node='dev'>
          <item id='programming-socks@conference.megacorp.example.com'>
            <conference xmlns='urn:xmpp:bookmarks:1'
                        name='Share your best programming socks deal HERE'>
              <extensions>
                <pinned xmlns='urn:xmpp:bookmarks-pinning:0'/>
              </extensions>
            </conference>
          </item>
          <item id='editors@conference.megacorp.example.com'>
            <conference xmlns='urn:xmpp:bookmarks:1'
                        name='Settling the text editor wars'>
            </conference>
          </item>
          <item id='some-hash'>
            <subscription xmlns="urn:xmpp:pubsub:subscription:0"
                          server="megacorp-pubsub.example.com"
                          node="dev-announcements" />
          </item>
          <!-- other items -->
        </items>
      </pubsub>
    </iq>
    

    A PubSub node can have different access models. The Spaces XEP defines three of them: open, authorize, and whitelist.

    • open: anyone can discover, list, and subscribe to the Space.
    • authorize: a user can request to join the Space.
    • whitelist: a Space owner manually adds new users; join requests are not allowed.

    For now, Movim only implements the authorize flow, which allows you to create private Spaces with an invitation "key" (essentially the URI of the Space on the XMPP network). The whitelist model, useful when you don't want to deal with join requests, should be implemented shortly after.

    open Spaces will require a bit more work, as they may involve additional moderation features.

    Let's start small and simple 😽

    Another current limitation is XMPP server support. Prosody doesn't implement the authorize access model yet, so the Spaces feature is only fully working and tested with the ejabberd server. The Prosody developers are aware of this and are working on it 👀.

    How to Create a Space in Movim?

    To create a Space, Movim needs two things:

    • An available chatroom service on your XMPP server. This is usually already present, as it's a widely deployed feature on the XMPP network.
    • An available PubSub service on your XMPP server whose name starts with spaces. (e.g., spaces.movim.eu). Why this specific requirement? Because XEP-0462: PubSub Type Filtering, which would allow a client to filter PubSub service nodes by type, is not yet implemented. Without it, created Spaces would be mixed in with other PubSub nodes. Using a dedicated service keeps things clean and separate for now.

    If you need to set up your own Spaces PubSub service on your XMPP server (ejabberd only for now, though this may change), we've documented the required configuration on the Movim Wiki.

    Once Movim detects both of these, you'll be able to create a new Space from the user interface 😸!

    How to Join a Space in Movim?

    To join a Space in Movim, one of the Space's owners or members shares the Space "key" with a contact. A key looks like this:

    xmpp:spaces.movim.eu?;node=6mUb3XUw
    

    It's an XMPP URI where the first part is the XMPP service hosting the Space, and the node part is the Space's identifier.

    The contact then opens the New Space form in the Movim sidebar and pastes the key. This is very similar to the Discord invitation link flow.

    The Space invitation form

    Movim then does two things:

    • Adds the Space bookmark to the user's personal Spaces bookmarks node. This new private bookmark node is not yet standardized (it's currently located at {https://movim.eu}spaces_subscriptions_node), but it will be added to the Spaces XEP (or a related one) soon.
    • Sends a subscription request to the PubSub node.

    The Spaces PubSub service then returns a pending message.

    <iq xml:lang='en' to='pooja@jabber.in/Movim' from='spaces.movim.eu' type='result' id='t1Os56cXzKmW'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <subscription subscription='pending' node='6mUb3XUw' jid='pooja@jabber.in'/>
        </pubsub>
    </iq>
    

    In the meantime, a private message is sent to all Space owners, who can then accept or deny the request.

    The Space request

    The Space will appear as locked 🔒 in the navigation bar until the request is approved.

    Once approved, Movim receives a notification and discovers all the Space's content, including related rooms, and connects to them.

    A nice Movim Space

    Trickle-Down Affiliations

    While trickle-down theory doesn't hold up in economics, it turns out to be quite useful for synchronizing affiliations between Spaces and their rooms.

    When an owner adds a new room to a Space, Movim lists all Space members and owners and sets them as members and owners of the new room respectively.

    Similarly, when a new member is added, or when an owner promotes another user to owner, Movim propagates that change across all rooms in the Space.

    This is currently handled by Movim itself, but one could imagine a dedicated Space module on the server side that enforces this and prevents client-side synchronization errors, while also reducing the number of small queries required to keep things in sync.

    What About Notifications?

    XEP-0492 defines a bookmark extension that allows clients to manage notification settings for incoming room messages. Movim already implements this. It defines three global states: never, on-mention, and always.

    Since Spaces are stored as PubSub node bookmarks, this extension can be reused to define a global notification setting per Space!

    The Space configuration

    XMPP is always about recycling features to build new ones ♻️!

    What's Next?

    The current implementation is basic but it works! Over the coming weeks and months, many features will be added and refined to deliver a more fluid and stable user experience.

    As mentioned above, there are plans to flesh out access model management and affiliations further, and to support public Spaces soon-ish 😽.

    Most of the existing features are already standardized, but a few smaller details and flows will be written up in new XEPs or completed in existing ones.

    Issues will also be filed with various XMPP server projects to ensure that most XMPP servers can host and manage Spaces in the future. And it would obviously be great to see other XMPP clients implement the feature too 👀.

    In Movim, the Next Big Thing™️ will be to (finally) add dedicated audio rooms, and maybe video later, to Spaces, so that members can talk to each other with a single click.

    Fund the Next Awesome Movim Features 🫶

    All the work on Spaces was done in my free time over the course of a couple of weeks. I'd love to free up more time to keep fixing bugs and adding exciting new features to Movim.

    If you'd like to support Movim and help accelerate the project's development, I've launched the "Fund Movim for 2026" campaign on the main website.

    A huge thank you to all existing supporters, I hope you enjoy all these new features, and the ones still to come ✨

    That's all, folks!

    #xmpp #movim #discord #spaces

    • Mo chevron_right

      A (big) memory incoming memory optimization in Movim hushed face

      Timothée Jaussoin • pubsub.movim.eu / Movim • 13 February 2026

    Before announcing some new exciting features for the users lets talk about the big incoming change for the admins in #Movim 🧑‍💻✨

    Movim used to have a "one user = one php worker" policy. The sourcecode was fully refactored to isolate user sessions in those workers allowing worker to host several users!

    This is the biggest architectural change in Movim since its full real-time rewrite of 2014 🤯

    The goal of this change is simple: by having several users / worker most of the "Movim code" is shared, lowering the memory usage.

    We are testing a 4 users/worker policy. Which saves 75% of RAM, pretty neat no?

    There is still some quirks to fix, but it's coming soon 👀

    #xmpp #memory #optimization

    • Mo chevron_right

      Here comes Movim 0.32, codename Wilk! party popper

      Timothée Jaussoin • pubsub.movim.eu / Movim • 16 November 2025 • 5 minutes

    This might be the largest #Movim #release for many years, and it includes numerous fixes and new features in the 3 major topics Movim offers: instant messaging, social networking, and video conferencing.

    Let's cut the blabla and dive directly into the exciting things you can find in this release. 😸

    Blog and Communities

    Follow everyone!

    As explained with plenty of details in our previous article, The difference between XMPP and ActivityPub, explained through the Blog feature, we completely changed the way you can follow someone on the XMPP network to get notified about their blog publications.

    Until now, blog subscriptions were "implicit" in the sense that you needed to send an invitation and have the contact in your contact list to allow the blog subscription to be effective.

    In the new flow you now have two buttons, one to add a contact in your contacts list and one to follow its publications, and they are fully independent. 👌

    The new way to follow and/or add a contact

    The new "Follow the Contact" feature is then close to what you could find for many years with the "Follow the Community" one.

    A couple of tickets were opened on the ejabberd and Prosody bug trackers to complete their XEP-0060: Publish-Subscribe implementation (the XMPP extension that defines the bases of all the social features on XMPP; see the article linked above for all the details). Once those features are implemented server-side, Movim will be able to notify you about a new follower and give you follower statistics on all the blogs (including yours in real-time).

    Improved post publications

    Movim now allows #PeerTube videos to be embedded in your articles; to do so, just attach a PeerTube link to your article, and Movim will take care of embedding the video directly in your publication.

    When publishing a post, Movim allows you to write your article in Markdown to format it. Movim now supports GitHub Flavored Markdown that allows you to format your articles, like including tables, advanced links, and images customizations, and even more!

    Know Your Privacy Settings

    Movim allows you to configure in detail how you want to share your content with the world, with two important settings:

    • Make your profile public or private on the Movim instance you're on, with the possibility to define a local nickname. This will allow other users of the instance to find you in the Global Search feature.

    • Make your blog public or private to only restrict its content to your contacts... or open it to everyone.

    In this release some information cards were added to ensure that the user is aware of the current configuration while browsing their own profile.

    Info boxes about the account privacy

    Share, like, and comment on articles more easily.

    You can now pick several friends or chatrooms you're in when sharing an article.

    Articles are now better embedded in the chats, and the likes and comments flows and layout have been completely redesigned to be more practical, especially on mobile.

    The articles' footers were redesigned to improve and simplify all the interactions you can have with them.

    The new post footer was reorganized.

    Chats and Chatrooms

    Message history navigation and search

    Browsing and searching in your chat conversation history is now simpler than ever!

    Many message history issues were fixed. In this release, Movim is keeping track of the earliest message received in your discussions and then knows exactly when it needs to request your #XMPP server for more messages (or not) when scrolling up.

    If you use PostgreSQL, each message is now indexed and can be searched instantaneously using keywords in our new Search History feature.

    On the screenshot below, the user is browsing old messages and can go "back to the future" easily with the bottom right button.

    You can also see the new "chat navigation bar" that is listing the currently connected users in chatrooms; this sets the base for many upcoming exciting features around chat administration and user exploration and discovery 😉.

    Browsing old messages

    End-to-End Encryption and Bridges Integration

    On a more technical note, the OMEMO-related code was completely redesigned and simplified. This fixes numerous issues we had with key synchronization and message decryption. There are still some improvements to do, especially on the encryption library itself (but it looks like Converse.js is working on it) but this is already a huge step in the right direction. 😎

    During the summer a lot of work was also done with the Slidge developers to improve the bridges' integration in Movim, including many fixes around stickers and GIF integration, chatroom management, and account linking administration.

    Video-conferencing

    A lot of optimizations were done in the video-conference stream management. Movim is now adapting and compressing more of your video streams if it detects that the network is degrading during the call. The resolution and frame rate are also reduced on some low-end devices to allow them to handle the calls properly.

    Movim now also proposes H.264 streams first when negotiating with your contacts. Lots of devices, including mobiles, can encode and decode video with dedicated hardware, drastically reducing power consumption and overheating while doing so. Naturally it falls back to other formats (VP9, VP8) if it's not possible to have H.264.

    This also improves the general video quality during a call for a generally lower bitrate.

    VP8 vs. H264

    Some tests are planned to push the next generation video format, AV1, that will push those boundaries even further 😋.

    Internal changes and general changes

    The core internal code was also heavily refactored and simplified the past few months. A lot of hacks and workarounds were removed with the redesign of the interaction of the Movim user-interface part and the XMPP handling part. This also improves some performances during navigation and when interacting with your content.

    The Movim architecture was also redesigned to simplify the container integration. You can now build and deploy a Podman container on your machine for testing purposes in one unique console command; check out the related documentation.

    In this release, Movim dropped the php-curl dependency by relying on reactphp/http, which was already offering similar features.

    When uploading a file or picture, Movim gives you detailed feedback on every step of the upload, compressing the picture, sending the file to Movim, and Movim sending the file to your XMPP server.

    And to finish, lots of details in the layout and interface were improved and redesigned to fit with the Material Design 3 design system, this allows Movim to integrate even better with Android devices.

    What's next?

    Movim 0.32 set the bases of lots of very exciting things for 2026.

    We are planning to work on many exciting things including chat discussion threads, persistent video conference calls, chatroom roles, Spaces, scaling up video conference calls, and many other things ✨.

    Releases after releases Movim is becoming a coherent, simple, and feature-complete platform for all your social interactions while being federated and 100% built on standards.

    We really need your help to free up more time to work on it and integrate all the upcoming more exciting features, as well as cover our existing expenses (servers, travelling to technical meetups, goodies...). You can support us in many way by joining our Patreon, doing a single donation or becoming a, official sponsor of the project.

    Of course, you can also share the good news around, join Movim and invite all your friends on it 😸!

    That's all, folks. ❤️

    • Mo chevron_right

      Timothée Jaussoin • pubsub.movim.eu / Movim • 9 November 2025

      Movim is (finally!) having a members bar in its chatroom view sparkles

      This will allow you to know who is online in a glance... and set the bases of upcoming exciting features billed cap !

      Feature after feature Movim is becoming a serious alternative to centralized services such as Discord, Telegram or Slack ♥️

      You can already try it out on https://mov.im/ grinning cat with smiling eyes!

      #movim #xmpp #feature #chatroom #federated

    • Mo chevron_right

      The difference between XMPP and ActivityPub, explained through the Blog feature 🗒️sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 4 November 2025 • 8 minutes

    Blogs are one of the historical features of Movim, the upcoming 0.32 release will redefine how you interact with them and how you can follow them.

    In this short article you'll discover how they are handled in #Movim by also learning the particularities of the #XMPP Network compared to the #Fediverse one.

    XMPP and ActivityPub: Two Different Approaches

    Movim is only relying on the XMPP #protocol to store and exchange the information it manages. When you authenticate with your account (for example, john@movim.eu), Movim will directly connect to your XMPP server (movim.eu in our example) and will then provide a complete social and chat experience on top of it. Everything you will do will be stored on it: chat messages, uploaded files, profile pictures, publications and many other things.

    It is then the role of your XMPP server to contact the other servers to spread and receive the information to your contacts and followers.

    An overview of the XMPP network

    This architecture is completely different than on the Fediverse (the federated network that is built on the #ActivityPub protocol). In the Fediverse each platform has a specific role (microblogging, picture sharing, publishing and watching videos), and you have to create an account on each of them to use their respective features.

    Work is then done by the developers between each of those platforms (Peertube ActivityPub documentation, Mastodon ActivityPub documentation...) to try to standardize their interactions with the others on top of some generic protocols.

    The Fediverse Network

    In XMPP clients and servers developers are standardizing together the concepts and interactions they want to manage in extensions (called XEPs) before or during their integrations and those concepts are made generic enough to be directly handled easily by the other projects.

    For example, there is an #XEP to manage your chat messages history, XEP-0313: Message Archive Management, there is another XEP that explains how you can bookmark and synchronize chatrooms XEP-0402: PEP Native Bookmarks, another one that defines how you can publish Stories XEP-0501: Pubsub Stories, there is one that shows how clients handles emoji reactions bellow chat messages XEP-0444: Message Reactions...

    We have today more than 500 XEPs that standardize most of the core features of all the social interactions we can have online. And we are working actively on what is missing. 😉

    You can see the complete list on the XMPP Software Foundation website. One useful feature is that by clicking on the buttons on the right column you can see which clients and servers are actually implementing them! It's super useful when you want to integrate one in your own project and you want to test the integration with the others. 🤩

    Chat reactions are already implemented by many XMPP clients!

    So! It means that the Prosody, Tigase, MongooseIM, OpenFire, ejabberd XMPP servers (yes there are many of them already) that host the millions of accounts, including yours (movim.eu is using ejabberd) can already allow you to do microblogging, publish long articles, photos, messages, do video-conferencing... out of the box. How convenient! ✨

    It is then the role of the clients that connect to it to offer a "view" on those features. And Movim is one of those clients. To say it differently, Movim (like all the other XMPP clients) stores no important information; it just caches and displays what it found on the network.

    Blogs, a simple news feed on your XMPP account

    In Movim blogs are not different from all the features above. They were historically defined in 2008 in an XEP called XEP-0277: Microblogging over XMPP that evolved in 2022 into XEP-0472: Pubsub Social Feed.

    This new XEP clarifies and generalizes some concepts of XEP-0277 but the core idea stays the same:

    • An XMPP account or an XMPP service (a subpart of an XMPP server) can host nodes.
    • Accounts can follow those nodes.
    • Accounts can publish items on those nodes.
    • Items that are published on those nodes are articles that can have different forms but are all valid Atom 1.0 elements (yes the same thing you can find in the RSS/Atom feeds online, we are not reinventing things, just reusing widely available technologies 😜.)

    So what is a blog then?

    A blog is a node, hosted on your own account, managed by you, where you can publish short articles (called "Briefs" in Movim) or very long ones (like this one ☺️) in the form of Atom 1.0 elements that people can follow!

    When you publish a new article on your blog Movim will then simply send it to your XMPP server and store it in your own personal blog node linked to your account. Your friends that follow it will then receive a notification that a new article was published. And... that's it!

    So how can I publish an article on my blog?

    Some of the Movim users are sometimes asking, "But where is the API to publish blog posts?" Our API is the XMPP standard 😸! By just reading the XEP and using one of the many clients or libraries (that are available in all the main programming languages), you will be able to publish articles in a few lines without even knowing how Movim does it.

    But you actually want to see how it's done on the wire, isn't it?

    Let's take a small example with john@movim.eu publishing an article on her blog. 😛

    <iq id='pub1'
        to='john@movim.eu'
        type='set'>
      <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <publish node='urn:xmpp:microblog:0'>
          <item id='1cb57d9c-1c46-11dd-838c-001143d5d5db'>
            <entry xmlns='http://www.w3.org/2005/Atom'>
              <title type='text'>Trying out Movim ✨</title>
              <id>1cb57d9c-1c46-11dd-838c-001143d5d5db</id>
              <published>2025-05-08T18:30:02Z</published>
              <updated>2025-05-08T18:30:02Z</updated>
            </entry>
          </item>
        </publish>
      </pubsub>
    </iq>
    
    

    This is what Movim is actually sending when John publishes an article on her blog. An XMPP library will also be able to do it; if you're motivated, you can also write it by hand (but you don't need to; that's why you have libraries and clients for that! 💪).

    More in detail, we can see the actual article in the <entry/> element; it contains a title, an identifier and some dates of publication and update. The example is super simplified but know that you can put way more information (like attached files, tags...). And as you can see it is an actual standard Atom 1.0 element so you can easily take articles from your WordPress blog or any other website that can generate an Atom or RSS feed and publish them on your XMPP blog, natively!

    We actually publish this entry in a specific item having a unique ID on the node urn:xmpp:microblog:0(that is the standard identifier for all the blogs on the XMPP network) and we send it directly to the john@movim.eu account.

    If John wants to update her article, he just has to publish it again on the same item. If he wants to publish a new one, he publishes another <entry/> in a new item having a new identifier on the same node, super simple!

    And how can I subscribe to a blog and be notified?

    Movim used to have an implicit subscription system; this means that when John and Yoko were added mutually as contacts they were automatically receiving each other's blog notifications. This wasn't really understood by our users and was quite hard to understand; it also had some limitations.

    In Movim 0.32 the subscription will be explicit, with a simple Follow button. This means that you no longer need to be friends mutually to follow each other, and that you can just follow anyone (that has a public blog, you can also restrict your blog to your contacts only if you want) on the network.

    Now let's imagine that Yoko wants to follow John's blog. Using her own XMPP client she simply has to send a subscribe message to the node where John is publishing his articles.

    
    <iq type='set'
        from='yoko@jabber.fr/movim'
        to='john@movim.eu'
        id='sub1'>
      <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <subscribe node='urn:xmpp:microblog:0'/>
      </pubsub>
    </iq>
    
    

    And that's it 😎! See how simple XMPP is?

    In the future when John publishes a new article his own XMPP server will check all the persons that are subscribed to the node and directly push a message with the fresh article in it (there are some optimizations involved there to reduce the load, but let's keep things simple ☺️). Here Movim is just an interface to write the article and publish it; the XMPP server is actually taking care of handling the article and delivering it to everyone, and they can do it massively with very little resource.

    What's next?

    Movim 0.32 is bringing a totally new approach to how you blog on the XMPP network. In the upcoming months we are planning to integrate more features around that new Follow button, like being able to list your subscribers, get some general statistics on the amount of followers that an account has, or get notified instantly when someone subscribes to your blog.

    We found that some of the XMPP servers we're using were missing some of the standardized features at the moment, some tickets were opened (see ejabberd#4484, prosody#1972, ejabberd#4483, ejabberd#4481 and prosody#1973 and once those features are integrated, Movim will follow up. 😌

    In the XMPP community we think that taking time to discuss and work together to standardize all the concepts we want to integrate in the protocol is the best way to make it the best, most modular, reliable and scalable protocol out there to handle all our social interactions online. Don't hesitate to join us (and invite your friends 😸) if you have questions or you want to develop crazy ideas on the protocol.

    That's all, folks! 🎉

    • Mo chevron_right

      Timothée Jaussoin • pubsub.movim.eu / Movim • 6 August 2025

      Wait, did Movim just unlocked the global search featuresin its chat messages? face screaming in fear

      Thanks to the powerful tsvector/tsquery #PostgreSQL feature (feature not available on MariaDB sorry pensive face) you can now search messages by keywords in your history and directly load the conversation from the past 🕰️ !

      Just click on the search button or hit Ctrl + F to open the brand new search panel magnifying glass tilted left

      The next version will be packed with plenty of awesome features for sure rocketsparkles

      #xmpp #movim #search #feature

    https://upload.movim.eu/files/9d94237298995552fa13436420195fbca436dce7/jI6b9Jf9Z7qM/chat_image.png
    • Mo chevron_right

      Here comes Movim 0.31, codename Kameny sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 24 July 2025 edit • 4 minutes

    This summer release is named after the U.S. gay rights pioneer Frank Kameny. He worked as an astronomer in the U.S. Army and was fired for being gay a few years later, in 2012 a Canadian amateur astronomer named an asteroid he discovered after him.

    Let's dive into all the exciting new features that you can find in this release.

    Simultaneous webcam and screen sharing 😄

    The multi-participant call project, funded by NLNet, is reaching a new milestone with the integration of the multi-track support in Movim.

    Until now, Movim was sending and receiving only two tracks, one audio and one video when initiating a call to the other participants. With this important improvement Movim is now able to handle several video tracks at the same time from a unique participant.

    GamerzCat is showing his skill at Genshin Impact

    With this technical improvement you can now share your webcam and screen at the same time with your contacts; this can be quite useful when doing a presentation with slides or streaming yourself when playing video games.

    The first step of the SFU support

    The integration of the multi-track support was not only done for this nice screen sharing feature, it is also the first step to have a multi-stream support with the upcoming SFU integration.

    When Movim calls the SFU (the part on the server that will take care of receiving all the audio and video-stream, mix them and and send them back to the other participants of the video call) it is able to handle two different modes:

    1. Mixed participants, where only one video stream is maintained and the SFU is taking care of choosing which participant of the call to show, or put them on a grid layout
    2. Simultaneous participants, where each participant streams (audio and video, and possiblity screen sharing) is sent in separate tracks and the client (here Movim) is taking care of displaying them in the prefered layout of the user (a grid, "current speaker in front",....). This second mode can be heavier in bandwidth but allow way more customization client-side.

    The two modes

    We are currently working with the ProcessOne team, that develop the ejabberd XMPP server, on the SFU integration and the standardization of our work in the XMPP protocol.

    Global chatroom search

    Movim now implements the XEP-0433: Extended Channel Search that replaces the historical non-standard implementation.

    The global chatroom search is now directly available in the general Search panel that was also redesigned to give you more compact and detailed results for any keywords you type. This search panel lets you discover articles, Communities, contacts, tags and now chatrooms using a unique text field.

    URL Resolver Worker 🚀

    URL resolving is an important feature that is now a must-have for all the modern chat and social platforms. When you're sharing or receiving a URL, this little feature will visit the page and give you a small preview of it even before you choose to visit the link.

    This version integrates a totally new shared worker, called the URL Resolver, that is taking care of resolving all the URLs that are shared on the Movim instance in a dynamic, non-blocking and concurrent way.

    When a URL was shared in a chatroom, if several of its members were connected on the same Movim instance, they used to ask Movim to resolve it all at the same time. This created some performance issues and could trigger a lot of useless requests on the server, especially when the URL was pointing to a heavy file for example.

    The worker is taking care of everything; if several users are asking to resolve the same URL it will put the others in a waiting list, do a unique query, and reply to all of them once the result is handled. On top of that he keep in memory for some time the resolved URLs to speed up even more some upcoming queries.

    To use it you have nothing to configure, just update and restart your Movim daemon and things will start to work automagically. 🪄

    Move the actions list in the Contact or Chatroom panel

    The actions panel

    XMPP services can offer some custom actions, most often for administrators or users or chatrooms. This list of actions used to be buried in the UI, a bit buggy and not available on mobile. It is now available directly in their related panel under the "Actions" tab.

    Adding pronouns support in the profile 🏳️‍🌈💕

    The RFC vCard4 now standardizes the Pronouns field. The field was added in the Movim profile settings and on the contacts page if filled.

    The pronouns field

    Quick switch between the one-to-one chats and chatrooms

    Movim chooses to display your one-to-one conversations and chatrooms in two different lists to prevent some confusion. But when you have a lot of discussions open it could be annoying to scroll again and again between the two lists to reach the unread discussions.

    Now when you click again on the Chat icon you can directly scroll between the two lists, quick and easy! 😸

    And as always you will find many other improvements here and there. Don't forget to update, share the good news around and enjoy!

    That's all, folks. 💖

    #xmpp #release #movim #nlnet #webrtc