We are ecstatic to announce that we have released the second alpha version of Pidgin 3.0!!! This release has an official version number of 2.96.0. We will continue releasing in this fashion until we are ready for 3.0.0 which will be the release we consider ready for end users. You can read more about our development phases here.
The release can be found on SourceForge and should show up on Flathub Beta shortly.
If you don’t want to use the Flathub Beta method, there are build instructions in the README.md for building a Flatpak locally or installing into a meson devenv. Both methods avoid installing directly to your OS installation which is the preferred method as there is no easy way to uninstall the application at this time.
About
Just like the previous releases, this is a timed release. It is a snapshot of what we currently have and is something we think other tinkerers and developers may want to start playing with, but again, it is not meant for end users.
Most things are not implemented, the user interface has not been polished at all, and there are so, so many bugs. As such we are asking that packagers please do not package this for your users yet as the potential support requests will be too much for us to handle at this time.
Looking forward, Alpha 3 is scheduled for 2026-09-30 and will have a version number of 2.97.0.
We have a bunch of tickets entered for Alpha 3 and you can keep an eye on the Burn down Chart for Alpha 3 to stay informed.
As always, priorities and possibilities can and will change, so even if something is listed for this release that doesn’t mean it will be in the release until it’s actually completed.
If you would like monthly updates, be sure to check out the state-of-the-bird posts!
Highlights
This has been a very busy cycle. Like usual, we didn’t get through quite everything I wanted to, but we still made a lot of really good progress!!
Notifications
We removed the purple-toast and notification-sound plugins and built support for them directly into Pidgin. You can configure everything from the preferences with additional settings coming in the future.
Conversation Member Avatars
We now display the avatars of conversation members. There’s still a lot of work to do regarding avatars, but this adds a nice touch to the user interface.
Scheduler User Interface
Purple 3 has a scheduler built-in to simplify tasks and let the user know what’s going on. For example, this is where you will be able to see how long before a re-connection attempt is made for an account, but that isn’t implemented quite yet.
Zulip Direct Messages
We didn’t capture a screenshot, but direct messages and group direct messages are now implemented in Zulip.
QR Code Support
Many protocols now allow users to log in by scanning a QR Code. In Pidgin 2, people have implemented this with some ingenuity involving the requests API, but we now added direct support for it in Purple and the user interfaces.
While this works, it’s a stop gap until we get the new authentication API finalized and implemented.
ChangeLog
As always the complete list of every change in this release is below.
We have a new ChangeLog format with this release. We’ve removed the separate sections and instead put the section at the start of the change message. We’ve also reordered the change information like author, review request, and related issues. If you have any comments, be sure to leave them below.
- Flatpak: Update the runtime to GNOME 50
Gary Kramlich, RR 4509 - General: Simplify compiler warning flag setup
Elliott Sales de Andrade, RR 4505 - Purple: Standardize credential provider management
Elliott Sales de Andrade, RR 4515 - Purple: Plug a few memory leaks in some managers
Gary Kramlich, RR 4522 - Purple: normalize the ConversationManagerSeagullBackend resource paths
Gary Kramlich, RR 4521 - Purple: Update the contact manager seagull backend test to use the test ui
Gary Kramlich, RR 4517 - Purple: Add additional parameters to the ContactManagerBackend load vfuncs
Gary Kramlich, RR 4519 - Purple: Remove AccountManagerNoopBackend
Gary Kramlich, RR 4518 - Purple: remove BadgeManager.get_default
Gary Kramlich, RR 4523 - Purple: Remove the rest of the get_default methods for managers
Gary Kramlich, RR 4524 - Purple: Implement the people vfuncs for ContactManagerSeagullBackend
Gary Kramlich, RR 4520, PIDGIN-17687 - Purple: Add ConversationMember.is_account
Gary Kramlich, RR 4527 - Purple: Add a Conversation::new-message signal
Gary Kramlich, RR 4528 - Purple: Add ConversationManager::conversation-new-message signal
Gary Kramlich, RR 4529 - PurpleToast: Update to use the new Purple.ConversationManager::conversation-new-message signal
Gary Kramlich, RR 4530 - Purple: remove the notification-sound plugin
Gary Kramlich, RR 4532 - Pidgin: Add support for playing a sound when a message is received
Gary Kramlich, RR 4531 - Pidgin: Add core and ui properties to Application
Gary Kramlich, RR 4533 - Purple: Make PurpleCredentialProvider implement GInitable
Elliott Sales de Andrade, RR 4516, PIDGIN-18154 - Purple: Fix some issues with ContactManagerSeagullBackend
Gary Kramlich, RR 4536 - Purple: remove unused dependency on sqlite3
Gary Kramlich, RR 4537 - Pidgin: Create a manager for sounds
Gary Kramlich, RR 4535 - Wincred: Consistently name wincred
Gary Kramlich, RR 4538 - Pidgin: Add a NotificationPref page
Gary Kramlich, RR 4540 - Pidgin: Add settings and everything for notifications
Gary Kramlich, RR 4541 - Purple: remove the purple-toast plugin
Gary Kramlich, RR 4542 - Pidgin: Add a keybinding to close windows when escape is pressed
Gary Kramlich, RR 4544 - Purple: Make Image implement Gio.Icon and Gio.LoadableIcon
Gary Kramlich, RR 4545, PIDGIN-18161 - Pidgin: Update the contact list to use the avatar-for-display property
Gary Kramlich, RR 4546 - Pidgin: Display ConversationMember avatars
Gary Kramlich, RR 4547 - Windows: Remove a bunch of old and unnecessary Windows stuff
Gary Kramlich, RR 4549 - Zulip: Create channels when connecting
Gary Kramlich, RR 4551 - Pidgin: Don’t send notifications if we don’t have a title
Gary Kramlich, RR 4556 - Purple: Add ConversationMembers.remove_all_members
Gary Kramlich, RR 4553 - Zulip: Cleanup channel creation on connect
Gary Kramlich, RR 4554 - Zulip: Clean up the handling of creating contacts
Gary Kramlich, RR 4555 - Zulip: Create existing dms on creation
Gary Kramlich, RR 4557 - Zulip: Implement sending messages for DMs
Gary Kramlich, RR 4559 - Zulip: Add some constants for message types
Gary Kramlich, RR 4560 - Zulip: Add support for deserializing display-recipients
Gary Kramlich, RR 4561 - Purple: Fix a memory leak in the ContactManager
Gary Kramlich, RR 4568 - Zulip: Properly implement sending for dms and group dms
Gary Kramlich, RR 4562 - Purple: Add some missing properties to ConversationManagerSeagullBackend
Gary Kramlich, RR 4569 - Purple: Stop using the glib aliases for intrinsic types
Gary Kramlich, RR 4570 - Pidgin: Stop using the glib aliases for intrinsic types
Gary Kramlich, RR 4571 - Protocols: Stop using the glib aliases for intrinsic types
Gary Kramlich, RR 4572 - Purple: Add a request_page async pair to Ui
Gary Kramlich, RR 4573 - Purple: Add subtitle and title properties to RequestPage
Gary Kramlich, RR 4586 - Demo: Migrate the request fields action to Purple.Ui.request_page_async
Gary Kramlich, RR 4587 - Purple: Notify the n-items property when we should
Gary Kramlich, RR 4599, PIDGIN-18105 - Pidgin: Create a dialog for interacting with the scheduler
Gary Kramlich, RR 4600, PIDGIN-18105 - Purple: Add RequestFieldQRCode
Gary Kramlich, RR 4603, PIDGIN-18163 - Demo: Add a QR Code to the request fields action
Gary Kramlich, RR 4604, PIDGIN-18165 - Zulip: add support of receiving dm messages
Gary Kramlich, RR 4563 - Zulip: Add support for receiving typing notifications
Gary Kramlich, RR 4564 - Zulip: Add support for sending typing notifications
Gary Kramlich, RR 4565 - Purple: Moved G_BEGIN_DECLS to include all PurpleProtocol declarations
Cole Blakley, RR 4615 - General: Add Cole Blakley to the COPYRIGHT file
Gary Kramlich, RR 4616 - Purple: Make RequestFieldImage use an Image
Gary Kramlich, RR 4614, PIDGIN-18166 - Purple: Fix the location of G_BEGIN_DECLS in the request fields
Gary Kramlich, RR 4617 - Demo: gettext says we shouldn’t translate email addresses
Gary Kramlich, RR 4625 - Purple: add an alt-text property to RequestFieldQRCode
Gary Kramlich, RR 4621 - Purple: Fix the location of some G_BEGIN_DECLS
Gary Kramlich, RR 4618 - Pidgin: Fix the location of some G_BEGIN_DECLS
Gary Kramlich, RR 4619 - General: Update the convey plans to what we currently support
Gary Kramlich, RR 4620 - Pidgin: Remove the old request API implementation
Gary Kramlich, RR 4622 - Purple: add a close signal to RequestPage and a function to call it
Gary Kramlich, RR 4623 - Purple: Rework RequestFieldAccount to use a list model
Gary Kramlich, RR 4624 - Purple: Make Purple.RequestFieldList implement Gio.ListModel
Gary Kramlich, RR 4626 - Purple: Fix a memory leak in PurplePresenceManager
Gary Kramlich, RR 4630 - Purple: Make RequestFieldChoice implement GListModel
Gary Kramlich, RR 4627, PIDGIN-18167 - Purple: Split up the resource files into separate resources
Gary Kramlich, RR 4628 - Purple: Use a composite key for all tables in the ConversationManagerSeagullBackend
Gary Kramlich, RR 4629 - IdleXScreenSaver: remove the dependency on GDK
Gary Kramlich, RR 4631 - Purple: move the idle-xscreensaver plugin to libpurple
Gary Kramlich, RR 4632 - Demo: Remove support for the old request_fields api
Gary Kramlich, RR 4633 - Purple: Add an alt-text property to Image
Gary Kramlich, RR 4634, PIDGIN-18171 - Purple: Create a QrCode object
Gary Kramlich, RR 4641 - IRCv3: depend on Ibis 0.16.0
Gary Kramlich, RR 4649 - Purple: Add a vfunc to the Ui to present QR Codes to the user
Gary Kramlich, RR 4639 - Demo: Add an action to present a QR Code
Gary Kramlich, RR 4640 - Pidgin: Implement Purple.Ui.present_qr_code
Gary Kramlich, RR 4642 - Purple: Remove RequestFieldQrCode
Gary Kramlich, RR 4651 - Purple: Replace Connection.connect with an async pair
Gary Kramlich, RR 4650 - Flatpak: add qrencode to the flatpak
Gary Kramlich, RR 4652 - Purple: Conversation::member-added and Conversation::member-removed signals
Gary Kramlich, RR 4655 - Pidgin: Create PidginRequestPage
Gary Kramlich, RR 4654 - Purple: Add Conversation.create_message
Gary Kramlich, RR 4656 - Flip: Add a coin flip plugin
Gary Kramlich, RR 4657 - Purple: Make Account.request_password_async use Ui.request_page_async
Gary Kramlich, RR 4658 - Purple: Remove the request API
Gary Kramlich, RR 4659 - Purple: Remove Account:remember-password
Gary Kramlich, RR 4662 - Purple: Remove disabled plugins
Gary Kramlich, RR 4660 - Pidgin: Remove disabled plugins
Gary Kramlich, RR 4661 - Pidgin: remove all of the icons we are not currently using
Gary Kramlich, RR 4664 - Purple: some minor documentation cleanups in the credential provider docs
Gary Kramlich, RR 4665 - IRCv3: Add an account setting for requiring a password
Gary Kramlich, RR 4663 - Prepare for the 2.96.0 (Alpha 2) release
Gary Kramlich, RR 4667
Thank You!
Thank you everyone for your continued support of Pidgin, it means a lot to us!
If you’re interested in contributing, you can check out our Contributing Guide to get started.
Also be sure to check out our merch store!
And if you’re feeling generous, you can learn how to donate to the project on our Donation Page.




