phone

    • chevron_right

      Erlang Solutions: Understanding Digital Wallets

      news.movim.eu / PlanetJabber • 23 January • 7 minutes

    Digital wallets, once considered futuristic, have now become essential tools for both consumers and businesses. But what are digital wallets , and why should you care about them? Customer expectations are changing. Many companies are turning to them to streamline transactions and enhance the customer experience

    This guide unpacks the fundamentals of digital wallets, highlighting their benefits, market trends, and implications for businesses.

    What Are Digital Wallets?

    Digital wallets (or e-wallets) have changed the way we make and receive payments. By 2025, digital payments are expected to account for 50% of global payments .

    At their core, digital wallets store a user’s payment information, securely encrypted for seamless transactions. This could involve credit card details, bank accounts, or even cryptocurrencies.

    Apple Pay , Google Wallet , PayPal , and Samsung Pay have become household names, but the ecosystem is much broader and growing rapidly as more industries recognise their potential. Digital wallets simplify purchases and integrate with loyalty programmes, personal finance management, and even identity verification , offering a comprehensive solution for consumers and businesses alike.

    How Do Digital Wallets Work?

    Digital wallets offer a secure and straightforward way to manage transactions. In a time when data breaches are increasingly common, security has never been more important. With cybercrime damages projected to reach $10.5 trillion annually in 2025 , they play a major role in keeping financial information safe.

    Here’s how they work. First, you link your financial details to the wallet. This could mean adding a credit card or connecting a bank account. Once your details are in, the wallet uses encryption and tokenisation to protect your sensitive information, converting it into a secure format that’s almost impossible for unauthorised parties to access.

    When you make a payment, the process is quick and simple: tap, scan, or click. Behind the scenes, your digital wallet securely communicates with the payment processor to authorise the transaction. With advanced security measures like encryption and tokenisation, digital wallets not only reduce the risk of fraud but also allow for a seamless and reliable user experience.

    Types of Digital Wallets

    Now let’s explore the various types of digital wallets available:

    1. Closed wallets

    Amazon closed wallets example, Understanding Digital Wallets

    2. Semi-closed wallets

    Semi-closed wallets like Paytm or Venmo, allow payments at select merchant locations or online stores that accept their platform.

    Venmo semi-closed wallets example, Understanding Digital Wallets

    3. Open wallets

    Backed by major financial institutions, open wallets allow broader transactions, including withdrawals, online purchases, and transfers. Popular examples include PayPal and Google Pay .

    4. Prepaid Wallets

    Prepaid wallets let you load funds in advance, so you use only what’s available. Once the balance is depleted, you just reload the wallet. This approach is great for budgeting.

    Choosing the right digital wallet depends on your business model.

    Whether you’re looking for customer loyalty through closed wallets or broader international reach with open wallets, selecting the right type will drive better engagement and efficiency.

    Why Should Businesses Care?

    The rise of digital wallets represents a strategic opportunity for businesses to serve their customers better and improve their bottom line. Here’s why:

    Enhanced customer experience

    Digital wallets streamline the checkout process, reducing friction and improving customer satisfaction. Features like one-click payments and loyalty integrations can drive repeat business.

    Improved security

    Tokenisation and encryption reduce the risks associated with traditional payment methods. This not only protects users but also helps businesses build trust.

    Cost efficiency

    Payment processors for digital wallets often charge lower fees than those for traditional credit card transactions, which can run as high as 3%. Depending on the provider, digital wallets can significantly cut these costs.

    Global reach

    For companies aiming to expand internationally, digital wallets simplify cross-border transactions by supporting multiple currencies.

    Digital wallets offer tangible benefits: enhanced customer experience, improved security, and cost efficiency. Businesses that integrate them can streamline payments and improve retention and satisfaction, driving growth.

    Integrating Digital Wallets into Your Business

    Before jumping into digital wallets, it’s worth taking a moment to plan things out. A bit of strategy can go a long way.

    Here are some key things to keep in mind:

    • Know what your customers want : Look at your data or run a quick survey to find out which wallets your customers use most.
    • Pick the right payment processor : Go for a provider that supports lots of wallets. This gives you flexibility and makes it easier to grow.
    • Focus on security : Work with experts, like Erlang Solutions , to help build secure systems that keep data safe and meet the necessary guidelines around payments.
    • Test, optimise and refine : Start with a proof of concept to see how things work. We can help you get this done quickly so you can adjust and stay ahead of the game.

    By understanding what your customers need and choosing flexible payment options, you can bring digital wallets into your business without any hiccups. Picking the right tech also means your operations keep running smoothly while you embrace innovations.

    Challenges and Considerations

    While digital wallets offer numerous benefits, they’re not without challenges:

    • Adoption barriers : Older demographics or tech-averse users may still prefer traditional payment methods. According to AARP , about 50% of older adults in the U.S. feel uncomfortable with new payment technologies. Businesses need strategies to educate and ease this transition.
    • Risk of fraud : While secure, digital wallets are not immune to hacking or phishing attacks. Companies must ensure continuous security updates and user education on best practices.
    • Regulatory compliance : Navigating the global landscape of payment regulations can be complex. From GDPR to PSP2 , businesses must comply with relevant laws, especially when handling international transactions.

    While digital wallets offer advantages, businesses must address adoption barriers, security concerns, and regulatory compliance. Preparing for these challenges allows for a smooth transition and mitigates potential risks.

    Industries Using Digital Wallets

    We’ve established how digital wallets are revolutionising the way we handle payments, making transactions faster, safer, and more convenient. There are some industries to highlight that are making the most of this technology.

    Fintech

    In the fintech world, digital wallets have become indispensable. For instance, Erlang Solutions collaborated with TeleWare to enhance their Re:Call app with secure instant messaging capabilities for a major UK financial services group. By integrating MongooseIM, they ensured compliance with strict regulatory requirements while improving user experience.

    Teleware industries using Fintech wallets


    E-commerce

    Online shopping has been transformed by digital wallets. In 2021, a quarter of all UK transactions were made using digital wallets, and this trend is expected to grow by 18.9% through 2028. Features like biometric authentication not only make the checkout process quicker but also enhance security, leading to happier customers and increased loyalty.

    Gaming

    Gamers love convenience, and digital wallets deliver just that.

    By consolidating various payment methods, wallets like PayPal and Google Pay make in-game purchases seamless. This ease of use not only reduces transaction fees but also keeps players engaged, boosting customer retention.

    Banking

    Traditional banks are catching up by integrating digital wallets into their services. These wallets often combine payment processing with features like loyalty programmes and travel card integration. Advanced security measures, including biometric authentication, ensure that customers feel secure while enjoying personalised, cashless payment solutions.

    The Future of Digital Wallets

    The future of digital wallets lies in innovation.

    Here are just some of the trends we are poised to see shape the landscape in the next few years:

    • Integration with wearable tech: Smartwatches and fitness trackers will make payments even more convenient.
    • Biometric authentication : Consumers increasingly demand convenience without sacrificing security. Biometric features such as fingerprint recognition, voice ID, and facial scans will become commonplace, providing higher protection.
    • Cryptocurrency support : As digital currencies gain acceptance, more wallets are supporting crypto transactions. With over 300 million cryptocurrency users worldwide, businesses must be ready to accommodate this growing market.

    You can explore even more key digital payment trends here .

    Staying ahead of these trends will position your business as a forward-thinking leader in the digital economy.

    To conclude

    Digital wallets aren’t just another way to pay; they’re a game-changer for improving customer experience, boosting security, and driving growth. Nearly half the world’s consumers are already using them, and with transaction values expected to hit over $10 trillion by 2026, they’re becoming a must-have for businesses.

    The big question for leaders isn’t whether to integrate them, but how to do it right. Now’s the perfect time to get started. By focusing on secure tech, understanding your customers, and keeping an eye on trends, you can unlock massive benefits. Erlang Solutions has the expertise to help you build digital wallet solutions that are secure and scalable. Ready to chat about your strategy? Drop us a message today .


    The post Understanding Digital Wallets appeared first on Erlang Solutions .

    • chevron_right

      ProcessOne: How Big Tech Pulled Off the Billion-User Heist

      news.movim.eu / PlanetJabber • 16 January • 10 minutes

    How Big Tech Pulled Off the Billion-User Heist

    For many years, I have heard countless justifications for keeping messaging systems closed. Many of us have tried to rationalize walled gardens for various reasons:

    • Closed messaging systems supposedly enable faster progress, as there’s no need to collaborate on shared specifications or APIs. You can change course more easily.
    • Closed messaging systems are better for security, spam, or whatever other risks we imagine, because owners feel they have better control of what goes in and out.
    • Closed messaging systems are said to foster innovation by protecting the network owner’s investments.

    But is any of this really true? Let’s take a step back and examine these claims.

    A Brief History of Messaging Tools

    Until the 1990s, messaging systems were primarily focused on building communities. The dominant protocol of the time was IRC (Internet Relay Chat) . While IRC allowed private messaging, its main purpose was to facilitate large chatrooms where people with shared interests could hang out and interact.

    In the 1990s, messaging evolved into a true communication tool, offering an alternative to phone calls. It enabled users to stay in touch with friends and family while forging new connections online. With the limitations of the dial-up era, where users weren’t always connected, asynchronous communication became the norm. Features like offline messages and presence indicators emerged, allowing users to see at a glance who was online, available, or busy.

    The revolution began with ICQ , quickly followed by competitors like Yahoo! Messenger and MSN Messenger . However, this proliferation of platforms created a frustrating experience: your contacts were spread across different networks, requiring multiple accounts and clients. Multiprotocol clients like Meebo and Pidgin emerged, offering a unified interface for these networks. Still, they often relied on unofficial protocol implementations, which were unreliable and lacked key features compared to native clients.

    To address these issues, a group of innovators in 1999 set out to design a better solution—an open instant messaging protocol that revolved around two fundamental principles:

    1. Federation : A federated protocol would allow users on any server to communicate seamlessly with users on other servers. This design was essential for scalability, as supporting billions of users on a single platform was unimaginable at the time.
    2. Gateway Support : The protocol would include gateways to existing networks, enabling users to connect with contacts on other platforms transparently, without needing to juggle multiple applications. The gateways were implemented on the server-side, allowing fast iterations on gateway code.

    This initiative, originally branded as Jabber , gave rise to XMPP (Extensible Messaging and Presence Protocol) , a protocol standardized by the IETF. XMPP gained traction, with support from several open-source servers and clients. Major players adopted the protocol—Google for Google Talk and Facebook for Facebook Messenger , enabling third-party XMPP clients to connect to their services. The future of open messaging looked promising.

    Fast Forward 20 Years

    Today, that optimism has faded. Few people know about XMPP or its newer counterpart, Matrix. Google’s messaging services have abandoned XMPP, Facebook has closed its XMPP gateways, and the landscape has returned to the fragmentation of the past.

    Instead of Yahoo! Messenger and MSN, we now deal with WhatsApp , Facebook Messenger , Telegram , Google Chat , Signal , and even messaging features within social networks like Instagram and LinkedIn. Our contacts are scattered across these platforms, forcing us to switch between apps just as we did in the 1990s.

    What Went Wrong?

    Many of these platforms initially adopted XMPP, including Google, Facebook, and even WhatsApp. However, their focus on growth led them to abandon federation. Requiring users to create platform-specific accounts became a key strategy for locking in users and driving their friends to join the same network. Federation, while technically advantageous, was seen as a barrier to user acquisition and growth.

    The Big Heist

    The smartphone era marked a turning point in messaging, fueled by always-on connectivity and the rise of app stores. Previously, deploying an app at scale required agreements with mobile carriers to preload the app on the phones they sold. Carriers acted as gatekeepers, tightly controlling app distribution. However, the introduction of app stores and data plans changed everything. These innovations empowered developers to bypass carriers and build their own networks on top of carrier infrastructure—a phenomenon known as over-the-top (OTT) applications .

    Among these new apps was WhatsApp , which revolutionized messaging in several ways. Initially, WhatsApp relied on Apple’s Push Notification Service to deliver messages in real time, bypassing the need for a complex infrastructure at launch. Its true breakthrough, however, was the decision to use phone numbers as user identifiers —a bold move that set a significant precedent. At the time, most messaging platforms avoided this approach because phone numbers were closely tied to SMS, and validating them via SMS codes came with significant costs.

    WhatsApp cleverly leveraged this existing, international system of telecommunication identifiers to bootstrap its proprietary network. By using phone numbers, it eliminated the need for users to create, manage and share separate accounts, simplifying onboarding. WhatsApp also capitalized on the high cost of SMS at the time. Since short messages were often not unlimited, and international SMS was especially expensive, many users found it cheaper to rely on data plans or Wi-Fi to message friends and family—particularly across borders.

    When we launched our own messaging app, TextOne (now discontinued), we considered using phone numbers as identifiers but ultimately decided against it. Forcing users to disclose such personal information felt intrusive and misaligned with privacy principles. By then, the phone had shifted from being a shared household device to a deeply personal one, making phone numbers uniquely tied to individual identities.

    Later, Whatsapp launched its own infrastructure based on ejabberd, but they kept their service closed. At that time, we also considered using phone number when launching our own messaging app, the now discontinued TextOne, but refused to use that. It did not feel right, as you were forcing people to disclose an important private information. As the phone had become a personnal device, instead of a household device, the phone number played the role of unique identifier for a single individual.

    Unfortunately, most major players seeking to scale their messaging platforms adopted the phone number as a universal identifier. WhatsApp’s early adoption of this strategy helped it rapidly amass a billion users, giving it a decisive first-mover advantage. However, it wasn’t the only player to recognize and exploit the power of phone numbers in building massive-scale networks. Today, the phone number is arguably the most accurate global identifier for individuals, serving as a cornerstone of the flourishing data economy.

    What’s Wrong With Using Phone Numbers as IDs?

    Phone numbers are a common good —a foundation of global communication. They rely on the principle of universal accessibility: you can reach anyone, anywhere in the world, regardless of their phone provider or location. This system was built on international cooperation, with a branch of the United Nations playing a key role in maintaining a provider-agnostic, interoperable platform. At its core is a globally unique phone numbering system, created through collaborative standards and protocols.

    However, over-the-top (OTT) companies have exploited this infrastructure to build private networks on top of the public system. They’ve leveraged the universal identification scheme of phone numbers—and, by extension, the global interoperable network—to construct proprietary, closed ecosystems.

    To me, this feels like a misuse of a common good. Phone numbers, produced through international cooperation, should not be appropriated freely by private corporations without accountability. While it may be too late to reverse this trend, we should consider a contribution system for companies that store and use phone numbers as identifiers.

    For example, companies that maintain databases with millions of unique phone numbers could be required to pay an annual fee for each phone number they store. This fee could be distributed to the countries associated with those numbers. Such a system would achieve two things:

    1. Encourage Accountability : Companies would need to evaluate whether collecting and storing phone numbers is truly essential for their business. If the data isn’t valuable enough to justify the cost, they might choose not to collect it.
    2. Promote Fairness : For companies that rely heavily on phone numbers to track, match, and build private, non-interoperable services, this fee would act as a fair contribution, akin to taxes paid for using public road infrastructure.

    It looks a lot to me that the phone number is a common good produced and use by international cooperation. It is too late to prevent it to be used by Big Tech companies. However, it may seem fair to imagine a contribution from company storing phone number. This is a data that is not their property and not theirs to use. Shouldn&apost we consider a tax on phone numbers storage and usage ? For example, if a company store a millions unique phone number in their database, why not require a yearly fee, to be paid to each country that any phone number is associated to, one yearly fee per phone number ?

    Company would have to think twice about storing such personnal data. Is it valuable for your business ? If it is not valuable enough, fair enough, delete them and do not ask them, but if you need it to trakt and match user and build a private non interoperable service, then paying a fair contribution for their usage should be considered. It would be like the tax they pay to leverage road infrastructure in countries where they operate.

    Beyond Taxes: The Push for Interoperability

    Of course, a contribution system alone won’t solve the larger issue. We also need a significant push toward interoperable and federated messaging . While the European Digital Markets Act (DMA) includes an interoperability requirement, it doesn’t go far enough. Interoperability alone cannot address the challenges of closed ecosystems.

    I’ll delve deeper into why interoperability must be paired with federation in a future article, as this is a critical piece of the puzzle.

    Interoperability vs. Velocity

    To conclude, I’d like to reference the introduction of the IETF SPIN draft , which perfectly encapsulates the trade-offs between interoperability and innovation:

    Voice, video and messaging today is commonplace on the Internet, enabled by two distinct classes of software. The first are those provided by telecommunications carriers that make heavy use of standards, such as the Session Initiation Protocol (SIP) [RFC3261]. In this approach - which we call the telco model - there is interoperability between different telcos, but the set of features and functionality is limited by the rate of definition and adoption of standards, often measured in years or decades. The second model - the app model - allows a single entity to offer an application, delivering both the server side software and its corresponding client-side software. The client-side software is delivered either as a web application, or as a mobile application through a mobile operating system app store. The app model has proven incredibly successful by any measure. It trades off interoperability for innovation and velocity.

    The downside of the loss of interoperability is that entry into the market place by new providers is difficult. Applications like WhatsApp, Facebook Messenger, and Facetime, have user bases numbering in the hundreds of millions to billions of users. Any new application cannot connect with these user bases, requiring the vendor of the new app to bootstrap its own network effects.

    This summary aligns closely with the ideas I’ve explored in this article.

    I believe we’ve reached a point where we need interoperability far more than continued innovation in voice, video, and messaging. While innovation in these areas has been remarkable, we have perhaps been too eager—or too blind—to sacrifice interoperability in the name of progress.

    Now, the pendulum is poised to swing back. Centralization must give way to federation if we are to maintain the universality that once defined global communication. Without federation, there can be no true global and universal service, and without universality, we risk regressing, fragmenting all our communication systems into isolated and proprietary silos.

    It’s time to prioritize interoperability, to reclaim the vision of a truly connected world where communication is open, accessible, and universal.

    • wifi_tethering open_in_new

      This post is public

      www.process-one.net /blog/how-big-tech-pulled-off-the-billion-user-heist/

    • chevron_right

      ProcessOne: Fluux multiple Subscriptions/Services

      news.movim.eu / PlanetJabber • 15 January

    Fluux is our ejabberd Business Edition cloud service. With a subscription, we deploy, manage, update and scale an instance of our most scalable messaging server. Up to now, if you wanted to deploy several services, you had to create another account with a different email. Starting today, you can manage and pay for different servers from a single Fluux account.

    Here is how to use that feature. On Fluux dashboard main page after the list of your service/platforms you may have noticed a "New" button.

    alt

    You will be then redirected on a page to choose your plan.

    alt

    Once terms and conditions are approved, you will be able to fill your card information on a page hosted by our payment provider.

    alt

    When payment is succeeded, you will be then redirected to Fluux console and a link create your service:

    alt

    On this last page you will be able to provide a technical name that will be used to provision your Fluux service.

    alt

    After 10 minutes you can enjoy your new service at techname.m.in-app.io (such test1.m.in-app.io in above screenshot)

    • wifi_tethering open_in_new

      This post is public

      www.process-one.net /blog/fluux-multiple-subscriptions-services/

    • chevron_right

      Ignite Realtime Blog: XMPP Summit #27 and FOSDEM 2025

      news.movim.eu / PlanetJabber • 14 January

    The XMPP Standards Foundation’s yearly Summit will be held on January 30 and 31st, in Brussels. The Summit is an annual two-day gathering where we discuss XMPP protocol development topics. It is a place for XMPP developers to meet each other, and make progress on current issues within the protocol and ecosystem.

    Immediately following the Summit is FOSDEM . FOSDEM is a free event for software developers to meet, share ideas and collaborate. Every year, thousands of developers of free and open source software from all over the world gather at the event in Brussels.

    I will be present at the Summit, and a small army of Ignite community members (including myself) will be present at FOSDEM We hope to see you at either event! If you’re around, come say hi!

    For other release announcements and news follow us on Mastodon or X

    1 post - 1 participant

    Read full topic

    • chevron_right

      Erlang Solutions: BEAM – Erlang’s Virtual Machine

      news.movim.eu / PlanetJabber • 13 January • 5 minutes

    Welcome to the first chapter of the “Elixir, 7 Steps to Start Your Journey” series. In my previous post, I discussed my journey with the programming language.

    In this chapter, we will discuss the Erlang Virtual Machine, the BEAM.

    To understand why the Elixir programming language is so powerful and reliable, we must understand its foundations, which means talking about Erlang.

    Elixir runs on the Erlang Virtual Machine and inherits many of its virtues. In this post, you will learn a little about the history of Erlang, the objective with which it was initially created, and why it is fundamental for Elixir.

    What is Erlang?

    Erlang as a programming language

    Erlang is a programming language created in the mid-1980s by Joe Armstrong, Robert Virding, and Mike Williams at the Ericsson Computer Science Laboratory. Initially designed for telecommunications, it is now a general-purpose language. It was influenced by other programming languages, such as ML and Prolog, and was released as open-source in 1998.

    Erlang was designed with distributed, fault-tolerant, massively concurrent, and soft real-time systems in mind, making it an excellent choice for today’s systems. Most are looking for these features, in addition to having confidence in Erlang’s history in productive systems.

    Some of the characteristics of this programming language are:

    • It is a declarative language, which means it is based on the principle of describing what should be calculated instead of how .
    • Pattern matching is possible at a high level and also on bit sequences.
    • Functions in Erlang are first-class data.

    Erlang as the development ecosystem

    Up to this point, we have referred to Erlang as the programming language; however, it should be noted that Erlang can also refer to an entire development ecosystem that is made up of:

    • The Erlang programming language
    • The framework OTP
    • A series of tools and
    • The virtual machine, BEAM

    Erlang, as an ecosystem, was explicitly created to support highly available systems, which provide service even when errors or unexpected circumstances occur, and this is due to many of the characteristics of its virtual machine (VM).

    So, although Erlang as a programming language is pretty cool on its own, the real magic happens when all the ecosystem elements are combined: the programming language, libraries, OTP, and the virtual machine.

    Erlang's virtual machine, the BEAM OTP

    If you want to know more about the history of Erlang, the list of resources below will be very helpful.

    Resources

    Erlang Virtual Machine, BEAM

    The Erlang Virtual Machine, known as the BEAM , runs as an operating system process and is responsible for executing the Erlang code. It is also responsible for creating, scheduling, and managing Erlang processes, which are the fundamental basis of concurrency.

    Thanks to the BEAM schedulers, these processes can be executed in the most efficient way possible, allowing the system to be highly scalable . The processes do not share memory; they communicate through asynchronous message passing. This mechanism is the foundation for a system’s fault tolerance . As they are entirely isolated, the other system processes will not be affected if an error occurs in one of them.

    The BEAM is also responsible for parallelizing your concurrent Erlang programs, making the most of a machine’s resources. Initially, the virtual machine model was a single-run queue. However, it evolved into a run queue for each available processor, ensuring no bottlenecks and that Erlang programs work correctly on any system, regardless of the number of machine cores.

    Erlang Virtual Machine multicore

    Another characteristic is that storage management is automated. Garbage collection is implemented per process, which allows a system’s response time to always remain in the order of milliseconds without performance degradation.

    And lastly, one of my favourite features is error detection. The virtual machine provides all the elements necessary for efficient error detection and handling, thus promoting an always-available system regardless of failures.

    In summary, the BEAM is responsible for the scalability, distribution, and responsiveness of a system:

    • Manages the concurrency of it.
    • It has a mechanism for error detection and handling.
    • Make the most of the computer’s resources.

    If you’d like to learn more about the duo that is Erlang and Elixir, check out the “What is Elixir” post.

    Elixir in the BEAM

    Like Erlang, Elixir was also influenced by other programming languages, including Erlang itself. Its code runs on the Erlang Virtual Machine, which means it takes advantage of all its features and can use all the Erlang libraries and the OTP framework .

    Different programming languages ​​besides Elixir and Erlang run in the BEAM, but Elixir has ensured that the approach between BEAM and programmers is fluid and quickly understandable.

    Elixir code is compiled into bytecode that runs in the BEAM and is more compact than Erlang code. Its syntax is similar to how we communicate daily, allowing for early familiarization with the language, even if it is the first time you program with it. It also reduces the boilerplate and has amazing documentation.

    So, when writing code with Elixir, we have the best of both: a solid and battle-tested foundation that allows us to create fail-safe systems and, on the other hand, nice syntax, well-defined patterns, and code simplification, among other things. Thanks to this, Elixir has been so well accepted and has rapidly gained popularity.

    Elixir is a cool programming language that allows you to write code that is easy to understand and maintain and takes advantage of the Erlang concurrency model, which we will discuss in the next chapter.

    > iex
    
    
    iex(1)> list = [4,5,21,1,38]
    
    
    iex(2)> erlang_example = :lists.sort(list);
    [1, 4, 5, 21, 38]
    
    
    iex(3)> elixir_example = Enum.sort(list)
    [1, 4, 5, 21, 38]
    
    

    Example of how you can run Erlang and Elixir code in an interactive Elixir shell

    Next chapter

    In the next post, “Understanding Processes and Concurrency,” we will discuss how Erlang processes work and their importance in developing robust and scalable systems. We will also see how concurrency works in Erlang and how this relates to Elixir. Do not miss it! You can drop the team a message if you’d like to discuss Elixir in more detail.

    The post BEAM – Erlang’s Virtual Machine appeared first on Erlang Solutions .

    • chevron_right

      Erlang Solutions: Erlang’s virtual machine, the BEAM

      news.movim.eu / PlanetJabber • 13 January • 5 minutes

    Welcome to the first chapter of the “Elixir, 7 Steps to Start Your Journey” series. In my previous post, I discussed my journey with the programming language.

    In this chapter, we will discuss the Erlang Virtual Machine, the BEAM.

    To understand why the Elixir programming language is so powerful and reliable, we must understand its foundations, which means talking about Erlang.

    Elixir runs on the Erlang Virtual Machine and inherits many of its virtues. In this post, you will learn a little about the history of Erlang, the objective with which it was initially created, and why it is fundamental for Elixir.

    What is Erlang?

    Erlang as a programming language

    Erlang is a programming language created in the mid-1980s by Joe Armstrong, Robert Virding, and Mike Williams at the Ericsson Computer Science Laboratory. Initially designed for telecommunications, it is now a general-purpose language. It was influenced by other programming languages, such as ML and Prolog, and was released as open-source in 1998.

    Erlang was designed with distributed, fault-tolerant, massively concurrent, and soft real-time systems in mind, making it an excellent choice for today’s systems. Most are looking for these features, in addition to having confidence in Erlang’s history in productive systems.

    Some of the characteristics of this programming language are:

    • It is a declarative language, which means it is based on the principle of describing what should be calculated instead of how .
    • Pattern matching is possible at a high level and also on bit sequences.
    • Functions in Erlang are first-class data.

    Erlang as the development ecosystem

    Up to this point, we have referred to Erlang as the programming language; however, it should be noted that Erlang can also refer to an entire development ecosystem that is made up of:

    • The Erlang programming language
    • The framework OTP
    • A series of tools and
    • The virtual machine, BEAM

    Erlang, as an ecosystem, was explicitly created to support highly available systems, which provide service even when errors or unexpected circumstances occur, and this is due to many of the characteristics of its virtual machine (VM).

    So, although Erlang as a programming language is pretty cool on its own, the real magic happens when all the ecosystem elements are combined: the programming language, libraries, OTP, and the virtual machine.

    Erlang's virtual machine, the BEAM OTP

    If you want to know more about the history of Erlang, the list of resources below will be very helpful.

    Resources

    Erlang Virtual Machine, BEAM

    The Erlang Virtual Machine, known as the BEAM , runs as an operating system process and is responsible for executing the Erlang code. It is also responsible for creating, scheduling, and managing Erlang processes, which are the fundamental basis of concurrency.

    Thanks to the BEAM schedulers, these processes can be executed in the most efficient way possible, allowing the system to be highly scalable . The processes do not share memory; they communicate through asynchronous message passing. This mechanism is the foundation for a system’s fault tolerance . As they are entirely isolated, the other system processes will not be affected if an error occurs in one of them.

    The BEAM is also responsible for parallelizing your concurrent Erlang programs, making the most of a machine’s resources. Initially, the virtual machine model was a single-run queue. However, it evolved into a run queue for each available processor, ensuring no bottlenecks and that Erlang programs work correctly on any system, regardless of the number of machine cores.

    Erlang Virtual Machine multicore

    Another characteristic is that storage management is automated. Garbage collection is implemented per process, which allows a system’s response time to always remain in the order of milliseconds without performance degradation.

    And lastly, one of my favourite features is error detection. The virtual machine provides all the elements necessary for efficient error detection and handling, thus promoting an always-available system regardless of failures.

    In summary, the BEAM is responsible for the scalability, distribution, and responsiveness of a system:

    • Manages the concurrency of it.
    • It has a mechanism for error detection and handling.
    • Make the most of the computer’s resources.

    If you’d like to learn more about the duo that is Erlang and Elixir, check out the “What is Elixir” post.

    Elixir in the BEAM

    Like Erlang, Elixir was also influenced by other programming languages, including Erlang itself. Its code runs on the Erlang Virtual Machine, which means it takes advantage of all its features and can use all the Erlang libraries and the OTP framework .

    Different programming languages ​​besides Elixir and Erlang run in the BEAM, but Elixir has ensured that the approach between BEAM and programmers is fluid and quickly understandable.

    Elixir code is compiled into bytecode that runs in the BEAM and is more compact than Erlang code. Its syntax is similar to how we communicate daily, allowing for early familiarization with the language, even if it is the first time you program with it. It also reduces the boilerplate and has amazing documentation.

    So, when writing code with Elixir, we have the best of both: a solid and battle-tested foundation that allows us to create fail-safe systems and, on the other hand, nice syntax, well-defined patterns, and code simplification, among other things. Thanks to this, Elixir has been so well accepted and has rapidly gained popularity.

    Elixir is a cool programming language that allows you to write code that is easy to understand and maintain and takes advantage of the Erlang concurrency model, which we will discuss in the next chapter.

    > iex
    
    
    iex(1)> list = [4,5,21,1,38]
    
    
    iex(2)> erlang_example = :lists.sort(list);
    [1, 4, 5, 21, 38]
    
    
    iex(3)> elixir_example = Enum.sort(list)
    [1, 4, 5, 21, 38]
    
    

    Example of how you can run Erlang and Elixir code in an interactive Elixir shell

    Next chapter

    In the next post, “Understanding Processes and Concurrency,” we will discuss how Erlang processes work and their importance in developing robust and scalable systems. We will also see how concurrency works in Erlang and how this relates to Elixir. Do not miss it! You can drop the team a message if you’d like to discuss Elixir in more detail.

    The post Erlang’s virtual machine, the BEAM appeared first on Erlang Solutions .

    • chevron_right

      Erlang Solutions: Erlang’s virtual machine, the BEAM

      news.movim.eu / PlanetJabber • 9 January • 5 minutes

    Welcome to the first chapter of the “Elixir, 7 Steps to Start Your Journey” series. In my previous post, I discussed my personal journey with the programming language.

    In this chapter, we will discuss the Erlang Virtual Machine, the BEAM.

    To understand why the Elixir programming language is so powerful and reliable, we must understand its foundations, which means talking about Erlang.

    Elixir runs on the Erlang Virtual Machine and inherits many of its virtues. In this post, you will learn a little about the history of Erlang, the objective with which it was initially created, and why it is fundamental for Elixir.

    What is Erlang?

    Erlang as a programming language

    Erlang is a programming language created in the mid-1980s by Joe Armstrong, Robert Virding, and Mike Williams at the Ericsson Computer Science Laboratory. Initially designed for telecommunications, it is now a general-purpose language. It was influenced by other programming languages, such as ML and Prolog, and was released as open-source in 1998.

    Erlang was designed with distributed, fault-tolerant, massively concurrent, and soft real-time systems in mind, making it an excellent choice for today’s systems. Most are looking for these features, in addition to having confidence in Erlang’s history in productive systems.

    Some of the characteristics of this programming language are:

    • It is a declarative language, which means it is based on the principle of describing what should be calculated instead of how .
    • Pattern matching is possible at a high level and also on bit sequences.
    • Functions in Erlang are first-class data.

    Erlang as the development ecosystem

    Up to this point, we have referred to Erlang as the programming language; however, it should be noted that Erlang can also refer to an entire development ecosystem that is made up of:

    • The Erlang programming language
    • The framework OTP
    • A series of tools and
    • The virtual machine, BEAM

    Erlang, as an ecosystem, was explicitly created to support highly available systems, which provide service even when errors or unexpected circumstances occur, and this is due to many of the characteristics of its virtual machine (VM).

    So, although Erlang as a programming language is pretty cool on its own, the real magic happens when all the ecosystem elements are combined: the programming language, libraries, OTP, and the virtual machine.

    Erlang's virtual machine, the BEAM OTP

    If you want to know more about the history of Erlang, the list of resources below will be very helpful.

    Resources

    Erlang Virtual Machine, BEAM

    The Erlang Virtual Machine, known as the BEAM , runs as an operating system process and is responsible for executing the Erlang code. It is also responsible for creating, scheduling, and managing Erlang processes, which are the fundamental basis of concurrency.

    Thanks to the BEAM schedulers, these processes can be executed in the most efficient way possible, allowing the system to be highly scalable . The processes do not share memory; they communicate through asynchronous message passing. This mechanism is the foundation for a system’s fault tolerance . As they are entirely isolated, the other system processes will not be affected if an error occurs in one of them.

    The BEAM is also responsible for parallelizing your concurrent Erlang programs, making the most of a machine’s resources. Initially, the virtual machine model was a single-run queue. However, it evolved into a run queue for each available processor, ensuring no bottlenecks and that Erlang programs work correctly on any system, regardless of the number of machine cores.

    Erlang Virtual Machine multicore

    Another characteristic is that storage management is automated. Garbage collection is implemented per process, which allows a system’s response time to always remain in the order of milliseconds without performance degradation.

    And lastly, one of my favourite features is error detection. The virtual machine provides all the elements necessary for efficient error detection and handling, thus promoting an always-available system regardless of failures.

    In summary, the BEAM is responsible for the scalability, distribution, and responsiveness of a system:

    • Manages the concurrency of it.
    • It has a mechanism for error detection and handling.
    • Make the most of the computer’s resources.

    If you’d like to learn more about the duo that is Erlang and Elixir, check out the “What is Elixir” post.

    Elixir in the BEAM

    Like Erlang, Elixir was also influenced by other programming languages, including Erlang itself. Its code runs on the Erlang Virtual Machine, which means it takes advantage of all its features and can use all the Erlang libraries and the OTP framework .

    Different programming languages ​​besides Elixir and Erlang run in the BEAM, but Elixir has ensured that the approach between BEAM and programmers is fluid and quickly understandable.

    Elixir code is compiled into bytecode that runs in the BEAM and is more compact than Erlang code. Its syntax is similar to how we communicate daily, allowing for early familiarization with the language, even if it is the first time you program with it. It also reduces the boilerplate and has amazing documentation.

    So, when writing code with Elixir, we have the best of both: a solid and battle-tested foundation that allows us to create fail-safe systems and, on the other hand, nice syntax, well-defined patterns, and code simplification, among other things. Thanks to this, Elixir has been so well accepted and has rapidly gained popularity.

    Elixir is a cool programming language that allows you to write code that is easy to understand and maintain and takes advantage of the Erlang concurrency model, which we will discuss in the next chapter.

    > iex
    
    
    iex(1)> list = [4,5,21,1,38]
    
    
    iex(2)> erlang_example = :lists.sort(list);
    [1, 4, 5, 21, 38]
    
    
    iex(3)> elixir_example = Enum.sort(list)
    [1, 4, 5, 21, 38]
    
    

    Example of how you can run Erlang and Elixir code in an interactive Elixir shell

    Next chapter

    In the next post, “Understanding Processes and Concurrency,” we will discuss how Erlang processes work and their importance in developing robust and scalable systems. We will also see how concurrency works in Erlang and how this relates to Elixir. Do not miss it! You can drop the team a message if you’d like to discuss Elixir in more detail.

    The post Erlang’s virtual machine, the BEAM appeared first on Erlang Solutions .

    • chevron_right

      ProcessOne: ejabberd 24.12

      news.movim.eu / PlanetJabber • 19 December • 10 minutes

    ejabberd 24.12

    Here comes ejabberd 24.12, including a few improvements and bug fixes. This release comes a month and half after 24.10, with around 60 commits to the core repository alongside a few updates in dependencies.

    Release Highlights:

    Among them, the evacuate_kindly command is a new tool which gave the funny codename to this release. It lets you stop and rerun ejabberd without letting users reconnect to let you perform your maintenance task peacefully. So, this is not an emergency exit from ejabberd, but instead testimony that this releasing is paving the way for a lot of new cool stuff in 2025.

    Other contents:

    If you are upgrading from a previous version, there are no required changes in the SQL schemas, configuration or hooks. There are some Commands API v3 .

    Below is a detailed breakdown of the improvements and enhancements:

    XEP-0484: Fast Authentication Streamlining Tokens

    We added support for XEP-0484: Fast Authentication Streamlining Tokens . This allows clients to request time limited tokens from servers, which then can be later used for faster authentication by requiring less round trips. To enable this feature, you need to add mod_auth_fast module in modules section.

    Deprecation schedule for Erlang/OTP older than 25.0

    It is expected that around April 2025, GitHub Actions will remove Ubuntu 20 and it will not be possible to run automatically dynamic tests for ejabberd using Erlang/OTP older than 25.0.

    For that reason, the planned schedule is:

    • ejabberd 24.12

      • Usage of Erlang/OTP older than 25.0 is still supported, but discouraged
      • Anybody still using Erlang 24.3 down to 20.0 is encouraged to upgrade to a newer version. Erlang/OTP 25.0 and higher are supported. For instance, Erlang/OTP 26.3 is used for the binary installers and container images.
    • ejabberd 25.01 (or later)

      • Support for Erlang/OTP older than 25.0 is deprecated
      • Erlang requirement softly increased in configure.ac
      • Announce: no warranty ejabberd can compile, start or pass the Common Tests suite using Erlang/OTP older than 25.0
      • Provide instructions for anybody to manually re-enable it and run the tests
    • ejabberd 25.01+1 (or later)

      • Support for Erlang/OTP older than 25.0 is removed completely in the source code

    Commands API v3

    This ejabberd 24.12 release introduces ejabberd Commands API v3 because some commands have changed arguments and result formatting. You can continue using API v2; or you can update your API client to use API v3. Check the API Versions History .

    Some commands that accepted accounts or rooms as arguments, or returned JIDs, have changed their arguments and results names and format to be consistent with the other commands:

    • Arguments that refer to a user account are now named user and host
    • Arguments that refer to a MUC room are now named room and service
    • As seen, each argument is now only the local or server part, not the JID
    • On the other hand, results that refer to user account or MUC room are now the JID

    In practice, the commands that change in API v3 are:

    If you want to update ejabberd to 24.12, but prefer to continue using an old API version with mod_http_api , you can set this new option:

    modules:
      mod_http_api:
        default_version: 2
    

    Improvements in commands

    There are a few improvements in some commands:

    • create_rooms_file : Improved, now it supports vhosts with different config
    • evacuate_kindly : New command to kick users and prevent login ( #4309 )
    • join_cluster : Improved explanation: this returns immediately (since 5a34020, 24.06)
    • mod_muc_admin : Renamed arguments name to room for consistency, with backwards support (no need to update API clients)

    Use non-standard STUN port

    STUN via UDP can easily be abused for reflection/amplification DDoS attacks. Suggest a non-standard port to make it harder for attackers to discover the service in ejabberd.yml.example .

    Modern XMPP clients discover the port via XEP-0215, so there&aposs no advantage in sticking to the standard port.

    Disable the systemd watchdog by default

    Some users reported ejabberd being restarted by systemd due to missing watchdog pings despite the actual service operating just fine. So far, we weren&apost able to track down the issue, so we&aposll no longer enable the watchdog in our example service unit.

    Define macro as environment variable

    ejabberd allows you to define macros in the configuration file since version 13.10. This allows to define a value once at the beginning of the configuration file, and use that macro to setup options values several times during the file.

    Now it is possible to define the macro value as an environment variable. The environment variable name should be EJABBERD_MACRO_ + macro name .

    For example, if you configured in ejabberd.yml :

    define_macro:
      LOGLEVEL: 4
    
    loglevel: LOGLEVEL
    

    Now you can define (and overwrite) that macro definition when starting ejabberd. For example, if starting ejabberd in interactive mode:

    EJABBERD_MACRO_LOGLEVEL=5 make relive
    

    This is specially useful when using containers with slightly different values (different host, different port numbers...): instead of having a different configuration file for each container, now you can use a macro in your custom configuration file, and define different macro values as environment variable when starting each container. See some examples usages in CONTAINER&aposs composer examples

    Elixir modules for authentication

    ejabberd modules can be written in the Elixir programming language since ejabberd 15.02. And now, ejabberd authentication methods can also be written in Elixir!

    This means you can write a custom authentication method in Erlang or in Elixir, or write an external authentication script in any language you want.

    There&aposs an example authentication method in the lib/ directory. Place your custom authentication method in that directory, compile ejabberd, and configure it in ejabberd.yml :

    auth_method: &aposEjabberd.Auth.Example&apos
    

    For consistency with that file naming scheme, the old mod_presence_demo.ex has been renamed to mod_example.ex . Other minor changes were done on the Elixir example code.

    Redis now supports Unix Domain Socket

    Support for Unix Domain Socket was added to listener&aposs port option in ejabberd 20.07. And more recently, ejabberd 24.06 added support in sql_server when using MySQL or PostgreSQL.
    That feature is useful to improve performance and security when those programs are running on the same machine as ejabberd.

    Now the redis_server option also supports Unix Domain Socket.

    The syntax is similar to the other options, simply setup unix: followed with the full path to the socket file. For example:

    redis_server: "unix:/var/run/redis/redis.socket"
    

    Additionally, we took the opportunity to update from the wooga/eredis erlang library which hasn&apost been updated in the last six years, to the Nordix/eredis fork which is actively maintained.

    New evacuate_kindly command

    ejabberd has nowadays around 180 commands to perform many administrative tasks. Let&aposs review some of their usage cases:

    • Did you modify the configuration file? Reload the configuration file and apply its changes

    • Did you apply some patch to ejabberd source code? Compile and install it, and then update the module binary in memory

    • Did you update ejabberd-contrib specs, or improved your custom module in .ejabberd-module ? Call module_upgrade to compile and upgrade it into memory

    • Did you upgrade ejabberd, and that includes many changes? Compile and intall it, then restart ejabberd completely

    • Do you need to stop a production ejabberd which has users connected? stop_kindly the server, informing users and rooms

    • Do you want to stop ejabberd gracefully? Then simply stop it

    • Do you need to stop ejabberd immediately, without worrying about the users? You can halt ejabberd abruptly

    Now there is a new command, evacuate_kindly , useful when you need ejabberd running to perform some administrative task, but you don&apost want users connected while you perform those tasks.

    It stops port listeners to prevent new client or server connections, informs users and rooms, and waits a few seconds or minutes, then restarts ejabberd. However, when ejabberd is started again, the port listeners are stopped: this allows to perform administrative tasks, for example in the database, without having to worry about users.

    For example, assuming ejabberd is running and has users connected. First let&aposs evacuate all the users:

    ejabberdctl evacuate_kindly 60 \"The server will stop in one minute.\"
    

    Wait one minute, then ejabberd gets restarted with connections disabled.
    Now you can perform any administrative tasks that you need.
    Once everything is ready to accept user connections again, simply restart ejabberd:

    ejabberdctl restart
    

    Acknowledgments

    We would like to thank the contributions to the source code, documentation, and translation provided for this release by:

    And also to all the people contributing in the ejabberd chatroom, issue tracker...

    Improvements in ejabberd Business Edition

    Customers of the ejabberd Business Edition , in addition to all those improvements and bugfixes, also get support for Prometheus.

    Prometheus support

    Prometheus can now be used as a backend for mod_mon in addition to statsd, influxdb, influxdb2, datadog and dogstatsd.

    You can expose all mod_mon metrics to Prometheus by adding a http listener pointing to mod_prometheus , for example:

      -
        port: 5280
        module: ejabberd_http
        request_handlers:
          "/metrics": mod_prometheus
    

    You can then add a scrape config to Prometheus for ejabberd:

    scrape_configs:
      - job_name: "ejabberd"
        static_configs:
          - targets:
              - "ejabberd.domain.com:5280"
    

    You can also limit the metrics to a specific virtual host by adding it&aposs name to the path:

    scrape_configs:
      - job_name: "ejabberd"
        static_configs:
          - targets:
              - "ejabberd.domain.com:5280"
         metrics_path: /metrics/myvhost.domain.com
    

    Fix

    • PubSub: fix issue on get_item_name with p1db storage backend.

    ChangeLog

    This is a more detailed list of changes in this ejabberd release:

    Miscelanea

    • Elixir: support loading Elixir modules for auth ( #4315 )
    • Environment variables EJABBERD_MACRO to define macros
    • Fix problem starting ejabberd when first host uses SQL, other one mnesia
    • HTTP Websocket: Enable allow_unencrypted_sasl2 on websockets ( #4323 )
    • Relax checks for channels bindings for connections using external encryption
    • Redis: Add support for unix domain socket ( #4318 )
    • Redis: Use eredis 1.7.1 from Nordix when using mix/rebar3 and Erlang 21+
    • mod_auth_fast : New module with support XEP-0484: Fast Authentication Streamlining Tokens
    • mod_http_api : Fix crash when module not enabled (for example, in CT tests)
    • mod_http_api : New option default_version
    • mod_muc : Make rsm handling in disco items, correctly count skipped rooms
    • mod_offline : Only delete offline msgs when user has MAM enabled ( #4287 )
    • mod_priviled : Handle properly roster iq
    • mod_pubsub : Send notifications on PEP item retract
    • mod_s2s_bidi : Catch extra case in check for s2s bidi element
    • mod_scram_upgrade : Don&apost abort the upgrade
    • mod_shared_roster : The name of a new group is lowercased
    • mod_shared_roster : Get back support for groupid@vhost in displayed

    Commands API

    • Change arguments and result to consistent names (API v3)
    • create_rooms_file : Improve to support vhosts with different config
    • evacuate_kindly : New command to kick users and prevent login ( #4309 )
    • join_cluster : Explain that this returns immediately (since 5a34020, 24.06)
    • mod_muc_admin : Rename argument name to room for consistency

    Documentation

    • Fix some documentation syntax, add links to toplevel, modules and API
    • CONTAINER.md : Add kubernetes yaml examples to use with podman
    • SECURITY.md : Add security policy and reporting guidelines
    • ejabberd.service : Disable the systemd watchdog by default
    • ejabberd.yml.example : Use non-standard STUN port

    WebAdmin

    • Shared group names are case sensitive, use original case instead of lowercase
    • Use lowercase username and server authentication credentials
    • Fix calculation of node&aposs uptime days
    • Fix link to displayed group when it is from another vhost

    Full Changelog

    https://github.com/processone/ejabberd/compare/24.10...24.12

    ejabberd 24.12 download & feedback

    As usual, the release is tagged in the Git source code repository on GitHub .

    The source package and installers are available in ejabberd Downloads page. To check the *.asc signature files, see How to verify ProcessOne downloads integrity .

    For convenience, there are alternative download locations like the ejabberd DEB/RPM Packages Repository and the GitHub Release / Tags .

    The ecs container image is available in docker.io/ejabberd/ecs and ghcr.io/processone/ecs . The alternative ejabberd container image is available in ghcr.io/processone/ejabberd .

    If you consider that you&aposve found a bug, please search or fill a bug report on GitHub Issues .

    • chevron_right

      JMP: Newsletter: JMP at SeaGL, Cheogram now on Amazon

      news.movim.eu / PlanetJabber • 18 December • 2 minutes

    Hi everyone!

    Welcome to the latest edition of your pseudo-monthly JMP update!

    In case it’s been a while since you checked out JMP, here’s a refresher: JMP lets you send and receive text and picture messages (and calls) through a real phone number right from your computer, tablet, phone, or anything else that has a Jabber client.  Among other things, JMP has these features: Your phone number on every device; Multiple phone numbers, one app; Free as in Freedom; Share one number with multiple people.

    JMP at SeaGL

    The Seattle GNU/Linux Conference (SeaGL) is happening next week and JMP will be there!  We’re going to have a booth with some of our employees, and will have JMP eSIM Adapters and USB card readers for purchase (if you prefer to save on shipping, or like to pay cash or otherwise), along with stickers and good conversations. :)  The exhibition area is open all day on Friday and Saturday, November 8 and 9, so be sure to stop by and say hi if you happen to be in the area.  We look forward to seeing you!

    Cheogram Android in Amazon Appstore

    We have just added Cheogram Android to the Amazon Appstore !  And we also added Cheogram Android to Aptoide earlier this month.  While F-Droid remains our preferred official source, we understand many people prefer to use stores that they’re used to, or that come with their device.  We also realize that many people have been waiting for Cheogram Android to return to the Play Store, and we wanted to provide this other option to pay for Cheogram Android while Google works out the approval process issues on their end to get us back in there.  We know a lot of you use and recommend app store purchases to support us, so let your friends know about this new Amazon Appstore option for Cheogram Android if they’re interested!

    New features in Cheogram Android

    As usual, we’ve added a bunch of new features to Cheogram Android over the past month or so.  Be sure to update to the latest version ( 2.17.2-1 ) to check them out!  (Note that Amazon doesn’t have this version quite yet, but it should be there shortly.)  Here are the notable changes since our last newsletter: privacy-respecting link previews (generated by sender), more familiar reactions, filtering of conversation list by account, nicer autocomplete for mentions and emoji, and fixes for Android 15, among many others.

    To learn what’s happening with JMP between newsletters, here are some ways you can find out:

    • wifi_tethering open_in_new

      This post is public

      blog.jmp.chat /b/october-newsletter-2024