We are ecstatic to announce that we have released the fourth experimental version of Pidgin 3.0!!! This is a pre alpha release with an official version number of 2.93.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.
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 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.
About
Just like the previous experimental 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.
There’s a number of things that unfortunately went unfinished for this release so you may notice more bugs than previous experimental releases. But like usual, there’s still been plenty of progress for everyone to check out!
Looking forward, Experimental 5 is scheduled for 2025-12-31 and will have a version number of 2.94.0.
We have a bunch of tickets entered for Experimental 5, and you can keep an eye on the Burndown Chart for Experimental 5 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
We have a bunch of highlights this release, but some are hard to show in text, but we’ll do our best!
Developer Migration Guide
We have started the huge task of describing how to migrate code from Purple 2 to Purple 3. That document is available at docs.imfreedom.org/purple3/migrating.html.
This is for migration only. We’re still looking at doing some sort of compatibility layer, but we don’t want to put a lot of time into that until we’re much more confident in the APIs not changing. We are also looking to do an architecture document as well that will explain some of the finer details of the APIs.
Backends
Many of our data sources need to be persisted when the program isn’t running. We’ve done this a number of ways over the years, but in this release we have created a new pattern of using backends to abstract this out.
For example, a user interface can tell Purple.ConversationManager
to not persist conversations or to persist them in a SQLite database using Purple.ConversationManagerSeagullBackend
. Many more of these will be popping up in the future for the other managers.
Conversation Persistence
As mentioned above Purple now keeps track of your open conversations assuming the conversation manager was told to use a backend that persists data which Pidgin does by default.
This means you no longer have to add a channel to your contact list and tell it to auto join, it will just automatically happen for all conversations (dms, group dms, channel, etc) that were still open when you closed the program which matches the behavior of many modern clients.
New Application Icon
The one and only Hykle Bons has come out of retirement to create a new application icon for Pidgin 3 which you can see below. If you have any comments regarding it, there is a post for that over here.
Color Scheme Preference
You can finally chose to have Pidgin follow the system theme or force it into light or dark mode!
ChangeLog
General:
- Update to Ibis 0.14.0 (RR 4043) (Gary Kramlich)
- Tell meson about our license (RR 4045) (Gary Kramlich)
- Add a test to make sure the flatpak dependencies have been updated (RR 4044) (Gary Kramlich)
- Only add the flatpak dependencies test when compiling for linux (RR 4049) (Gary Kramlich)
- Fix some Since tags (RR 4059) (Elliott Sales de Andrade)
- Deprecate ChangeLog.API (RR 4128) (Gary Kramlich)
- Port the protocols to the birb string functions (RR 4139) (Gary Kramlich)
- Ignore the meson subproject .wraplock file (RR 4145) (Gary Kramlich)
- Stop setting XDG_RUNTIME_DIR in devenv (RR 4170) (Elliott Sales de Andrade)
macOS:
- Fix some issues with the macOS native files (RR 4165) (Gary Kramlich)
- Hide duplicate menu items (RR 4166) (Gary Kramlich)
libpurple:
- Serialize conversations and their tags (PIDGIN-17989) (RR 4048) (Gary Kramlich)
- Load conversations back in from the database (PIDGIN-17989) (RR 4051) (Gary Kramlich)
- Replace PurplePlugin by GPluginPlugin (RR 4063) (Elliott Sales de Andrade)
- Add Purple.ConversationManager.get_all_for_account (RR 4065) (Gary Kramlich)
- Remove a bunch of unused and unnecessary preferences code (RR 4066) (Gary Kramlich)
- Delete conversations from the database when the user leaves them (RR 4064) (Gary Kramlich)
- Create Purple.ScheduleTask (PIDGIN-18105) (RR 4072) (Gary Kramlich)
- Create Purple.Scheduler (PIDGIN-18105) (RR 4073) (Gary Kramlich)
- Tell gir to ignore the Purple.Request functions that aren’t bindable (RR 4076) (Gary Kramlich)
- Delete the purple_gdk_pixbuf api (RR 4075) (Gary Kramlich)
- Remove searching from Purple.ProtocolContacts (RR 4078) (Gary Kramlich)
- Remove Purple.CircularBuffer (RR 4083) (Gary Kramlich)
- Clean up and modernize PurpleImage (RR 4074) (Gary Kramlich)
- Replace Purple.Avatar with Purple.Image (RR 4084) (Gary Kramlich)
- Add an avatar-for-display property to Purple.ContactInfo (RR 4086) (Gary Kramlich)
- Fix some broken logic in Purple.Conversation.send_message_async (RR 4095) (Gary Kramlich)
- Fix the birb header path (RR 4097) (Gong Zhile)
- Add builtin library dependency for introspection (RR 4098) (Gong Zhile)
- Create Purple.Contacts (PIDGIN-18106) (RR 4077) (Gary Kramlich)
- Create Purple.ProtocolDirectory (PIDGIN-18108) (RR 4079) (Gary Kramlich)
- Add Purple.ConversationMembers.find_first_other (RR 4087) (Gary Kramlich)
- Move Purple.Conversation.find_or_add_member to Purple.ConversationMembers (RR 4100) (Gong Zhile)
- Convert Purple.Tags to a Gio.ListModel (PIDGIN-18002) (RR 4088) (Gary Kramlich)
- Some tweaks for Purple.ConversationMember and Purple.ConversationMember (RR 4102) (Gary Kramlich)
- Fix up the account manager (RR 4090) (Gary Kramlich)
- Add default handlers to Purple.Account to manage the online state of conversations (RR 4092) (Gary Kramlich)
- Add a Purple.ContactInfo:badges property (PIDGIN-18114) (RR 4103) (Gary Kramlich)
- Many updates for Purple.ProtocolContacts (PIDGIN-18112 PIDGIN-18115 PIDGIN-18116) (RR 4105) (Gary Kramlich)
- Clean up some stuff in Purple.Protocol (RR 4109) (Gary Kramlich)
- Check for the MESON_TEST_ITERATION envvar before adding our default plugin paths (PIDGIN-18121) (RR 4115) (Gary Kramlich)
- Add vfuncs to Purple.Protocol for setting display names (PIDGIN-18117) (RR 4107) (Gary Kramlich)
- A Bunch of cleanups for the credential manager (RR 4116) (Gary Kramlich)
- Fix some minor issues in protocol directory (RR 4122) (Gary Kramlich)
- Add Purple.Conversation::displayed (RR 4093) (Gary Kramlich)
- Add an id property to Purple.Command (PIDGIN-18118) (RR 4106) (Gary Kramlich)
- Remove all of the proxy code (RR 4120) (Gary Kramlich)
- Move the saved-plugins preference to GSettings (RR 4121) (Gary Kramlich)
- Remove the preferences API (RR 4123) (Gary Kramlich)
- Remove Purple.AccountManager.foreach (RR 4124) (Gary Kramlich)
- Add a unit test for Purple.CommandManager.get_commands_for_conversation (PIDGIN-18119) (RR 4108) (Gary Kramlich)
- Remove Purple.ContactInfo:username (RR 4114) (Gary Kramlich)
- Add Purple.AccountManagerBackend (RR 4125) (Gary Kramlich)
- A bunch of random cleanups for Purple.Ui (RR 4126) (Gary Kramlich)
- Rename Attachment:inline to Attachment:is-inline to fix some compiler errors on Windows (RR 4131) (Gary Kramlich)
- Add Purple.Account.disconnect_with_new_error (RR 4133) (Gary Kramlich)
- Create a Noop AccountManagerBackend (RR 4134) (Gary Kramlich)
- Update Purple.AccountManager to use Purple.AccountManagerBackend (RR 4135) (Gary Kramlich)
- Create Purple.SchedulerBackend (PIDGIN-18105) (RR 4127) (Gary Kramlich)
- Port libpurple to the birb string functions (RR 4140) (Gary Kramlich)
- Remove some unused utility functions (RR 4142) (Gary Kramlich)
- Remove the network API (RR 4141) (Gary Kramlich)
- Create Purple.AccountSetting (RR 4143) (Gary Kramlich)
- Remove the private PurpleAccountSetting type (RR 4144) (Gary Kramlich)
- Add Purple.AccountSettings (RR 4146) (Gary Kramlich)
- Add Purple.Protocol.get_default_account_settings (RR 4147) (Gary Kramlich)
- Create Purple.AccountSettingStringList (RR 4153) (Gary Kramlich)
- Update the default account settings handler to include user splits (RR 4154) (Gary Kramlich)
- Add Purple.Account:disconnected to complement Purple.Account:connected (RR 4157) (Gary Kramlich)
- Fix settings initialization in network prefs (RR 4161) (Elliott Sales de Andrade)
- A first pass at documenting how to migrate from purple 2 (RR 4155) (Gary Kramlich)
- Remove the last remnants of GdkPixbuf (RR 4169) (Gary Kramlich)
- Add remove all and update methods to Purple.AccountSettings (RR 4159) (Gary Kramlich)
- Make sure accounts have names when saving and loading (RR 4171) (Gary Kramlich)
- Ignore a libxml deprecation (RR 4177) (Gary Kramlich)
- Replace the debug subsystem with macros to the glib counter parts (RR 4178) (Gary Kramlich)
- Clean up the plugins API (RR 4179) (Gary Kramlich)
- Update libpurple to use Purple.Account:name when referring to accounts (RR 4174) (Gary Kramlich)
- Remove the History API (RR 4176) (Gary Kramlich)
- A few cleanups in the account api (RR 4182) (Gary Kramlich)
- Rename Purple.AccountManager.get_connected to get_connected_accounts and return a Gio.ListModel (PIDGIN-18120) (RR 4183) (Elliott Sales de Andrade)
- Add implements functions to Purple.ProtocolFileTransfer (RR 4180) (Gary Kramlich)
- Create Purple.ConversationManagerBackend (PIDGIN-18128) (RR 4184) (Gary Kramlich)
- Update Purple.ConversationManager to use a Purple.ConversationManagerBackend (RR 4185) (Gary Kramlich)
- Create Purple.ConversationManagerSeagullBackend (RR 4189) (Gary Kramlich)
Pidgin:
- Re-enable links in Pidgin.Message (RR 4047) (Gary Kramlich)
- Update Pidgin.DisplayWindow to load existing conversations (RR 4050) (Gary Kramlich)
- Move the input box to a GtkSourceView (RR 4071) (Gary Kramlich)
- Use the presence message of a contact for the subtitle of DM’s (RR 4081) (Gary Kramlich)
- Update Pidgin.InfoPane a bit and expose the avatar (RR 4085) (Gary Kramlich)
- Don’t show the presence icon in messages (RR 4089) (Gary Kramlich)
- Remove the toplevel plugins menu (RR 4113) (Gary Kramlich)
- Use the account’s username in Pidgin.AccountDisplay (RR 4112) (Gary Kramlich)
- Add Pidgin.Application:can-join-channel and bind actions to it (PIDGIN-18122) (RR 4110) (Gary Kramlich)
- Update pidgin to use the birb string functions (RR 4138) (Gary Kramlich)
- Add a Pidgin.Badges widget to contacts in the contact list (RR 4136) (Gary Kramlich)
- Import our new application icon from the one and only Hylke Bons (RR 4137) (Gary Kramlich)
- Fix parenting of Account Manager window on initial startup (RR 4162) (Elliott Sales de Andrade)
- Remove the old broadway backed tests (RR 4167) (Gary Kramlich)
- Remove pidginprivate.h (RR 4168) (Gary Kramlich)
- Add a dark/light color scheme setting (PIDGIN-18085) (RR 4163) (Elliott Sales de Andrade)
- Add the account name to the account editor (RR 4172) (Gary Kramlich)
- Update Pidgin.AccountDisplay to use the Purple.Account:name property (RR 4173) (Gary Kramlich)
- Update pidgin to use Purple.Account:name when referring to accounts (RR 4175) (Gary Kramlich)
- Don’t tell gtk to register the application with the session manager (RR 4187) (Gary Kramlich)
Demo:
- Mark messages sent in the demo protocol as delivered (RR 4094) (Gary Kramlich)
- Port the demo protocol to ProtocolDirectory (RR 4080) (Gary Kramlich)
- Make the demo protocol plugin use the active presence (RR 4091) (Gary Kramlich)
- Add an external contact ot the Demo protocol (PIDGIN-18101) (RR 4101) (Gary Kramlich)
IRCv3:
- Implement the /me command (RR 4070) (Gary Kramlich)
- Fix an issue where the status messages weren’t being written (RR 4111) (Gary Kramlich)
- Port IRCv3 to the new account settings (RR 4156) (Gary Kramlich)
- Only send WHO on our own joins (RR 3986) (Gary Kramlich)
SIP:
- Remove sofia as a dependency as we’re not going to use it (RR 4046) (Gary Kramlich)
- Silence a warning in the sip protocol skeleton (RR 4082) (Gary Kramlich)
KWallet:
- Remove moc file generation for kwallet plugin (RR 4186) (Markus Fischer)
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.