call_end

    • chevron_right

      Let's Talk About Spaces in XMPP milky way

      Timothée Jaussoin • pubsub.movim.eu / Movim • 4 days ago edit • 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

    • favorite

      cochise, Blue, tuskun, neox, marzanna, dumont, elhemka, cmdrzal, divya, thebeardmancer, thealexstewart, koimoji, april, Masked Lilith, debacle, povoq, albi.lee, delonium, rako, appiah, krwl, lyn1337

    • 8 Comments

    • 3 days ago Masked Lilith

      Sometimes it's tempting to migrate over to ejabberd thinking face

    • person

      3 days ago koimoji

      This is awesome! I'll wait a little longer until Prosody implements this.

    • person

      3 days ago delonium

      Nice party popper

    • person

      3 days ago thealexstewart

      Glad to see this happening!

    • person

      3 days ago cmdrzal

      Awesome to see! Thank you so much for working on this!

    • person

      3 days ago baner

      Hopefully prosody will update before of spaces release. Thinking about going to ejabberd.

    • person

      3 days ago neox

      Good job! I can't wait to test that and the new features that'll come soon :D

    • person

      2 days ago cochise

      Great news! Kudos for the work.

    • chevron_right

      Multi-sessions workers star-struck

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

    I'm deploying this morning on https://mov.im/ the biggest architectural change since 2014: multi-sessions workers 😳

    This means that Movim is moving from a one-session = one process architecture to multiple-sessions per PHP process. This will greatly reduce the RAM consumption and database connections while having negligible impacts on the global performances 🚀

    I am testing 4 sessions/worker at the moment, so a -75% RAM usage but we might do more sessions if things runs great ✨

    A new daemon command allows you to have a nice overview of the worker and sessions 👀

    #movim #xmpp

    • chevron_right

      Help Movim Reach Its Goals for 2026 sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 19 February 2026 edit • 6 minutes

    tldr; Movim is getting many exciting new features and is looking for your financial support to cover costs and free up development time.

    2026 is shaping up to be a landmark year for Movim.

    When I launched the project in 2010, I never imagined how significant it would become for so many communities, individuals, and for me personally.

    What started as a small hobby project quickly turned into something that occupies nearly every week of my life: fixing bugs, adding new features, redesigning the user interface…

    Here's a screenshot from the project's introductory conference in Bordeaux back in 2010. 😸

    Movim at the RMLL 2010 in Bordeaux

    Fast forward 15 years: in 2025, the project reached 10K commits, packed with exciting new features documented on the official blog. 🥳

    2026 Goals

    Most of the features below were presented at my FOSDEM talk in Brussels, you can watch it here: Movim: Building a Decentralized Social Network on XMPP.

    The "Bye Bye Discord 👋, Hello Movim ✨" Campaign

    Following recent changes to the Discord platform, many users have been wondering whether Movim could serve as a viable alternative. A short poll published on Mastodon received over 600 responses, revealing strong interest in features that Movim is currently missing.

    Everything is explained in detail in this dedicated article.

    Spaces 🌌

    This will likely be the biggest feature added to Movim this year; and in just one (very busy) week, the foundation is already in place! There's still plenty left to do, though. 😉

    The goal is to release, within the next few weeks, a new version featuring a working initial implementation of the XMPP Space Extension, which I helped standardize last year alongside my friend nicoco.

    Early Spaces preview

    Here's a first look at the development version. 👀

    A Space will let you create a dedicated environment where you can invite friends or colleagues to chat, organize a list of rooms, and manage roles, invitations, and calls. All in one place.

    Spaces will initially be private and invite-only, with public Spaces potentially offered once everything is stable.

    I'll share more details in upcoming blog posts.

    Audio Rooms 🎙️

    Once the first iteration of Spaces is live, audio rooms will be the first feature built into them. This will allow users to drop into a room listed within one of their Spaces and talk with everyone else present.

    This was also one of the most-requested Discord features, and I can't wait to start building it.

    Initially, audio rooms will be fully peer-to-peer. Audio scales well this way, meaning your stream is sent directly to the other participants. I'm also still working on SFU support for Movim, funded by NLNet, which will allow audio rooms to scale massively in the future. 🚀

    Video Calls and SFU Support 📹

    Significant improvements and fixes to video calls in Movim were made recently. Movim can now share your desktop or application audio when screen sharing is enabled.

    Screen sharing feature in Movim

    This is perfect for streaming a gaming session with friends or maybe even watching a movie together. 😍

    Here too, SFU support will be a game-changer, enabling audio and video calls with dozens of participants.

    (Major) Memory Optimization

    As outlined in a previous blog post, significant work is underway to allow Movim to share memory between connected users, dramatically reducing total memory consumption by around 80% initially.

    Once deployed, this should allow me to comfortably handle at least 1000 concurrent Movim sessions on mov.im (the movim.eu XMPP server behind it can handle considerably more).

    These changes are nearly complete, and I'm hoping to merge them into the main branch within the coming weeks.

    Help Movim Reach Its Goals!

    All of these features will keep me busy for many months. The main thing holding me back from focusing even more on the project is time. I'd also like to start covering some of the expenses I've been personally absorbing for years to keep the project running.

    That's why I'm launching the "Fund Movim 2026" campaign. 😊 A progress bar has been added to the homepage to track the current status, and I'll share updates throughout the year.

    In the spirit of full transparency, here's a breakdown of the goals.

    Operational Costs: ~€1,000/year

    I've been covering most of the project's costs out of my pocket since the beginning. After checking up my accounts, I found I spend an average of €1,000 per year on it.

    • Roughly €180/year in domain names (yes, I own several to prevent cyber-squatting).

    • €35/month (€420/year) for the server in Germany that hosts mov.im, the movim.eu and jappix.com XMPP servers, and all account data stored on them (files, blog posts, messages).

    • €400 in design help from my friend Rimou in 2025–2026. He's responsible for all the mascots, stickers, and illustrations you've seen around the project over the past few months.

    Travel Costs: ~€750/year

    Each year I try to attend the XMPP Summit in Brussels (just before FOSDEM) to discuss and help standardize XMPP, as well as at least one XMPP hackathon with other developers.

    I genuinely enjoy these events, they help ensure that Movim remains fully standards-compliant and compatible with other clients and servers in the XMPP ecosystem as well as discussing and briging new exciting ideas in the community.

    I travel exclusively by train and bicycle. Movim is a low-carbon project. 🌍🫶

    • A 4-day trip to Brussels (XMPP Summit + FOSDEM) costs around €500 (€200 for the train, €300 for accommodation).

    • A 2-day hackathon costs around €250 (mostly train fares), this year's hackathon will actually be hosted at my place! 😉

    Funding More Free Time

    Honestly, I'd already be thrilled if the community could just cover my basic costs.

    Back in 2018, I chose to reduce my day job to four days a week in order to free up one day per week for Movim. But as you may have noticed, I tend to contribute a little more often than that. 🤭

    GitHub contributions

    I did some math: that one day per week devoted to Movim would be worth around €650/month if I were working full-time. So I'm adding two new funding goals: one to cover half a day per week, and one to cover the full day I currently dedicate to the project.

    It's an experiment… let's see how it goes. 😄

    Here's a preview of the donation progress bar on the movim.eu homepage. 🌡️ 🪙

    The donation bar

    How Can You Help?

    As you may have noticed, I'm not offering any perks or rewards in return (except the opportunity for your company to be listed as a sponsor on the Movim page). No badges, no lifetime subscriptions, no premium access. I might send stickers to interested supporters once they're available, though. 👀

    I'm also not interested in hosting thousands of accounts; I'd rather see the network continue its organic, federated growth. (Speaking of which, if you're an instance admin, please don't forget to add your server to join.movim.eu. We've found that many aren't doing this. 😶)

    My goal is simply to keep having fun while building a free, fully decentralized social platform for everyone and to keep delivering exciting new features through a clean, intuitive interface.

    If you'd like to help Movim grow and reach its 2026 goals, here's how:

    • Donate using Liberapay: a goal was set to 35€/week, which roughly cover the operational and travel costs through the year.
    • Become a Movim Patron: two tiers available: one at €3/month (the price of a Discord Nitro subscription… quite the coincidence 🤭) and one at €30/month, which gets your name or company listed as a Movim sponsor on the movim.eu homepage.
    • If you prefer a one-time donation, I also have a PayPal. It's a bit harder to track contributions there, so Patreon is preferred if possible. 😉

    If you have other ideas or would like to contribute in a different way, you know where to find me.

    As always, and especially this time, please share this article and spread the word with your friends!

    In the meantime, back to work. There's a lot to do. 💪

    That's all, folks. ✨

    #movim #xmpp #funding #donation #discord

    • 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

    • chevron_right

      Bye bye Discord waving hand, hello Movim sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 12 February 2026 edit • 1 minute

    Discord is rolling out an age-verification system on its platform and preparing for its IPO in March 2026.

    Beginning with a phased global rollout to new and existing users in early March, [Discord] users may be required to engage in an age-verification process to change certain settings or access sensitive content. This includes age-restricted channels, servers, or commands and select message requests.

    A Discord meme

    Today we are launching our very first campaign to help you to migrate from Discord to Movim.

    To start with we did a little poll to ask you what you would like us to add to the platform to make you feel like home when joining in from Discord... and we were actually very surprised by the amount of answers we got!

    A screenshot from the poll

    So let's do it! 💪

    Some exciting features were already added the past few days and more compelling ones will come in the upcoming weeks 👀!

    We would like to have all the support we can to help us in the process so spread the good news around, follow us on Mastodon, subscribe, deploy a new Movim instance and invite your friends.

    If you can we would be really pleased if you joined as a Supporter on Patreon... for the price of a monthly Discord Nitro subscription, 3€/month 😸.

    This little extra money will help us free more time to focus on all those new exciting features and really build the best comfy nook for you, your friends, family or colleagues.

    Stay tuned, a lot of exciting stuff are coming soon 😁

    That's all folks!

    #xmpp #discord #movim #campaign #patreon

    • link

      Movim (@movim@piaille.fr)

      You wan't to move from #Discord to #Movim and #XMPP, but you really miss one or two core feature? I'll work the next few weeks on some of those missing features to help you and your community to migrate ✨ So what do you miss the most? #migration #question [ ] 🎙️ Audio rooms (Teamspeak/Mumble like) [ ] 📹 Video calls with several friends (like Jitsi) [ ] 👾 Spaces (like Discord servers, grouped rooms) [ ] 👀 Something else, add it in the comments bellow

    • Pictures 2 image

    • visibility
    • visibility
    • chevron_right

      Here comes Movim 0.32, codename Wilk! party popper

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

    This might be one of the biggest #release ever made on the project, 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. ❤️

    • 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

    • chevron_right

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

      Timothée Jaussoin • pubsub.movim.eu / Movim • 4 November 2025 edit • 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 for example), 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 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 his 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 on the XMPP network when John publishes an article on his 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 even wrote a little tool for that edhelas/atomtopubsub on Github that can handle feeds from the web and publish them on the XMPP node of your choice 🪄

    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 his 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; it also had some protocol 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 is the best way to make it the best, most modular, reliable and scalable protocol out there to handle all our social online interactions. Don't hesitate to join us (and invite your friends 😸). If you have questions or you want to develop crazy ideas on the protocol, you are more than welcome!

    That's all, folks! 🎉