call_end

    • Mo chevron_right

      Let's Talk About Spaces in XMPP milky way

      Timothée Jaussoin • pubsub.movim.eu / Movim • 1 day 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

      elhemka, cmdrzal, divya, thebeardmancer, thealexstewart, koimoji, april, Masked Lilith, debacle, povoq, albi.lee, delonium, rako, appiah, krwl, lyn1337

    • 6 Comments

    • 20 hours ago Masked Lilith

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

    • person

      18 hours ago koimoji

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

    • person

      1:06 delonium

      Nice party popper

    • person

      1:23 thealexstewart

      Glad to see this happening!

    • person

      8:20 cmdrzal

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

    • person

      8:51 baner

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

    • Mo 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

    • Mo chevron_right

      Help Movim Reach Its Goals for 2026 sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 19 February 2026 • 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:

    • 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

    • 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

      Bye bye Discord waving hand, hello Movim sparkles

      Timothée Jaussoin • pubsub.movim.eu / Movim • 12 February 2026 • 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.

    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!

    So let's do it! 💪

    Some exciting features were already added the past few days and more exciting 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

    • link