We are ecstatic to announce that we have released the third alpha version of Pidgin 3.0!!! This release has an official version number of 2.97.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 still be found on SourceForge but we have a new CDN thanks to Fastly and the release can be found at fastly.imfreedom.org. It will also 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 had little to no polish, and there are so, so many bugs. As such we are asking packagers to please not package this for your users at this time as the potential support requests will be too much for us to handle.
Highlights
This cycle has seen a lot of maintenance and not so many user facing changes, but there are a few to highlight!
New Presence Icons
The one and only Hylke Bons has graciously provided a new set of presence/status icons for us. You can see them in the contact list screenshot below. Sorry I forgot to include the offline user ![]()
Account Reconnection
Accounts will now automatically be reconnected after they get disconnected. This works on a simple static 1 minute timer between attempts right now and will probably be enhanced in the future. Unlike Pidgin 2 reconnection attempts will be made forever.
One of the cooler parts, is that this is now visible in the scheduler, which has not been polished at all as you can see below.
Message History
We finally created the PurpleHistory class which is how we represent messages in a conversation now. There is still a lot of work to do here, but protocols can now access this via the Purple.Conversation:history property to find messages as well as add additional.
There will be API in the future for the user interface to ask the protocol to load messages, but we aren’t quite there yet.
Plugins Dialog
We moved the plugins back to a separate dialog. It will probably get updated after some changes in GPlugin but you can take a look at it below.
Zulip
We removed the in-development tag from the Zulip protocol plugin. There is still a long way to go there, including adding support for channels, but DM’s have been stable enough that we felt comfortable removing the tag.
This means that it now shows up in the protocol list when creating a new account by default.
ChangeLog
The full list of change can be found below.
Full ChangeLog
- Purple: Add a Conversation:notify-level property
Gary Kramlich, RR 4669, PIDGIN-18176 - Pidgin: Only notify new messages if the conversation is marked as such
Gary Kramlich, RR 4670, PIDGIN-18177 - Purple: Add notify-level support to ConversationManagerSeagullBackend
Gary Kramlich, RR 4671, PIDGIN-18178 - Purple: Remove Connection.connect
Gary Kramlich, RR 4674 - Purple: Fix a missed documentation update in CredentialManager
Gary Kramlich, RR 4678 - Purple: Make ProtocolConversation.refresh an async pair
Gary Kramlich, RR 4676 - Purple: replace PROTOCOL_CONVERSATION_DOMAIN with PROTOCOL_CONVERSATION_ERROR
Gary Kramlich, RR 4677 - Purple: Replace PROTOCOL_CONTACTS_DOMAIN with PROTOCOL_CONTACTS_ERROR
Gary Kramlich, RR 4679 - Purple: Convert PROTOCOL_MANAGER_DOMAIN to PROTOCOL_MANAGER_ERROR
Gary Kramlich, RR 4680 - Purple: Convert WHITEBOARD_MANAGER_DOMAIN to WHITEBOARD_MANAGER_ERROR
Gary Kramlich, RR 4681 - Purple: Make Connection.disconnect an async pair
Gary Kramlich, RR 4675 - General: Put developer-related tests in a ‘dev’ suite
Elliott Sales de Andrade, RR 4708 - Zulip: fix some potential remote crash bugs
Gary Kramlich, RR 4711, SEC-11 - Purple: replace all uses of g_new with g_new0
Gary Kramlich, RR 4712 - Demo: replace g_new with g_new0
Gary Kramlich, RR 4713 - Purple: Add a History object
Gary Kramlich, RR 4710, PIDGIN-18181 - Purple: Update conversation to use the new history object
Gary Kramlich, RR 4721, PIDGIN-18182 - Purple: The start of ProtocolConversation.query_history API
Gary Kramlich - Purple: remove strreplace
Gary Kramlich, RR 4726 - Purple: Add History.lookup_message_async and History.lookup_message_finish
Gary Kramlich, RR 4725, PIDGIN-18179 - Purple: Remove the menu API
Gary Kramlich, RR 4728 - Pidgin: Add the plugins menu back
Gary Kramlich, RR 4729 - Pidgin: Create a basic plugins dialog
Gary Kramlich, RR 4733 - Pidgin: Remove the plugins display item from the display window
Gary Kramlich, RR 4734 - Pidgin: Remove a bunch of unused menus
Gary Kramlich, RR 4730 - Pidgin: Remove the whiteboard implementation
Gary Kramlich, RR 4731 - Purple: Remove the whiteboard API
Gary Kramlich, RR 4732 - Pidgin: Fix invalid read when quitting the application
Markus Fischer, RR 4737 - Purple remove util_init and util_uninit
Gary Kramlich, RR 4739 - Purple: Add History.remove_message_async and History.remove_message_finish
Gary Kramlich, RR 4740, PIDGIN-18180 - Purple: Rename History.add_async to History.add_message_async
Gary Kramlich, RR 4741 - Purple: Overhauled the Message documentation
Gary Kramlich, RR 4743 - IRCv3: Use the Ibis.Client::stopped signal to detect disconnections
Gary Kramlich, RR 4746 - Purple: depend on birb 0.9.0 and remove the util API
Gary Kramlich, RR 4747 - Purple: Don’t have contact manager backends load all contacts
Gary Kramlich - Purple: Clean up ContactInfo
Gary Kramlich, RR 4749 - Purple: Additional cleanups for ContactInfo
Gary Kramlich, RR 4750 - Purple: Add a last-updated property to ContactInfo
Gary Kramlich, RR 4751 - Purple: The start of vfuncs for members
Gary Kramlich - Pidgin: Remove the old voice and video stuff
Gary Kramlich, RR 4754 - Pidgin: Remove the startup presence preference ui
Gary Kramlich, RR 4755 - Purple: Remove the startup presence settings
Gary Kramlich, RR 4756 - Purple: Create a proper error domain for Contact
Gary Kramlich, RR 4757 - General: Skip looking for gi-docgen if documentation is disabled
Elliott Sales de Andrade, RR 4762 - General: Update libspelling wrap to 0.4.10
Elliott Sales de Andrade, RR 4763 - Purple: Update ContactManagerSeagullBackend to handle the last-updated property
Gary Kramlich, RR 4752 - Purple: Organize the code in purpleconversation.[ch]
Gary Kramlich, RR 4758 - Purple: Remove some unused and stubbed out API from Conversation
Gary Kramlich, RR 4759 - Purple: Add a has-password property to Conversation
Gary Kramlich, RR 4760, PIDGIN-18144 - Purple: Update the Seagull Conversation backend for the has-password property
Gary Kramlich, RR 4761, PIDGIN-18144 - General: use the python version that meson is using for the postconf script
Gary Kramlich, RR 4764 - Purple: Pass all public headers to glib-mkenums
Gary Kramlich, RR 4769 - Purple: Make a real error domain for conversation errors
Gary Kramlich, RR 4770 - Purple: Move the plugins error domain to a proper error domain
Gary Kramlich, RR 4771 - KeyChainAccess: Return NULL when a password isn’t found
Gary Kramlich, RR 4773, PIDGIN-18187 - Zulip: Remove the in-development tag from the protocol
Gary Kramlich, RR 4775 - Purple: Clear up some documentation on CredentialProvider.read_password_finish
Gary Kramlich, RR 4776 - Dependencies: Depend on Seagull 0.8.2
Gary Kramlich, RR 4779 - Purple: Remove a stray character from a doc comment in History
Gary Kramlich, RR 4780 - Purple: Add a collection for handling conversation threads
Gary Kramlich, RR 4781 - Purple: Have Conversation propagate the signals from Threads
Gary Kramlich, RR 4782 - General: Disable i18n.merge_file on netbsd
Gary Kramlich, RR 4783 - General: Remove DigitalOcean as a sponsor
Gary Kramlich, RR 4789 - Purple: Make AccountManager automatically reconnect accounts
Gary Kramlich, RR 4787, PIDGIN-18086 - General: Mark gschemas with the runtime tag
Elliott Sales de Andrade, RR 4790 - Purple: Use UTC time everywhere
Gary Kramlich, RR 4793 - Purple: Clear typing timeout at beginning of callback
Elliott Sales de Andrade, RR 4796 - Purple: Add archived properties to Conversation
Gary Kramlich, RR 4792, PIDGIN-18188 - Purple: Add the Conversation archive properties to the seagull backend
Gary Kramlich - IRCv3: Depend on Ibis 0.16.1
Gary Kramlich, RR 4798 - General: Depend on HASL 0.6.0
Gary Kramlich, RR 4800 - Convey: mark ubuntu-resolute for cleaning
Gary Kramlich, RR 4803 - Purple: Remove the Threads collection
Gary Kramlich, RR 4808, PIDGIN-18193 - Purple: Cleanup the ConversationManager Seagull Schema
Gary Kramlich, RR 4810 - Flatpak: Use GNOME 51 and remove KWallet
Gary Kramlich, RR 4809 - Purple: Cleanup the schema for ContactManagerSeagullBackend
Gary Kramlich, RR 4811 - Purple: Generate Account:id during construction
Gary Kramlich, RR 4816 - Purple: Make ContactInfo:id not nullable
Gary Kramlich, RR 4817 - Purple: Restore the NOT NULL constraints to ContactManagerSeagullBackend
Gary Kramlich, RR 4818 - Purple: Restore the NOT NULL constraints to ConversationManagerSeagullBackend
Gary Kramlich, RR 4819 - General: Depend on Birb 0.11.0
Gary Kramlich, RR 4824 - General: move our subprojects to the Fastly URLs
Gary Kramlich, RR 4827 - Pidgin: Make the content of a message selectable
Gary Kramlich, RR 4825 - Purple: Clean up and modernize Contact
Gary Kramlich, RR 4826 - Pidgin: Add the status icon to the contact list
Gary Kramlich, RR 4829 - Pidgin: Import the new status icons from Hylke Bons
Gary Kramlich, RR 4828 - Pidgin: Make the contact list remember if it should show offline contacts
Gary Kramlich, RR 4830
Looking Forward
Alpha 4 is scheduled for 2026-10-29 and will have a version number of 2.98.0. We are moving from quarterly to monthly releases as we get closer and closer to a final release and have chosen the last Thursday of the month to be our release dates as historically Thursday night was our release night.
We have a bunch of tickets entered for Alpha 4 and you can keep an eye on the Burn down Chart for Alpha 4 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 that release until it’s actually completed.
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 donate to the project from our Donation Page.


