State of the Bird April 2026

State of the Bird April 2026

The State of the Bird is a recap of what has been happening in Pidgin and related projects over the past month.

You can find the previous posts via the state-of-the-bird tag or via RSS.

Retrospective

Our last State of the Bird covered March 2026 was published on April 23rd 2026.

This post is super late as I kept forgetting about it and then I had a whole bunch of health stuff to deal with.

April wasn’t as busy as March, but we still got quite a bit done.

As mention in the March State of the Bird, we’re looking for ways to make it easier for people to digest. So for this month, we’re removing the sections for projects that have had no activity for the month as that was mostly just noise.

We’re trying something new this month where we mark any time that we’re asking for help with a :person_raising_hand:. So if you’re looking to get involved this is a quick way to find what we need right now.

We’re also planning on removing the metrics from these posts and to have something that’s always available. The timeline on this isn’t exactly clear, but it’ll be announced here when it happens.

As mentioned last month, we want to add some additional metrics that include non-development tasks, but we’ve been busy and haven’t even scratched the surface here. :person_raising_hand: If this is something you might be interested in or have some insight on, please comment below.


Metrics

We have a number of metrics we keep an eye on which you can see below.

Code Contributors

The number of code contributors continues to fluctuate a bit, but that’s not out of the ordinary for a volunteer project.

2025-11 | 2025-12 | 2026-01 | 2026-02 | 2026-03 | 2026-04 Developers | 1 | 1 | 1 | 1 | 2 | 2 | Crazy Patch Writers | 0 | 0 | 0 | 1 | 1 | 1 | Casual | 0 | 0 | 0 | 0 | 0 | 0 |

Review Requests

Review requests are what we call our code reviews and is the way that all code is accepted into our code bases. This is a look at how many were open and closed each month.

2025-11 | 2025-12 | 2026-01 | 2026-02 | 2026-03 | 2026-04 Open | 30 | 20 | 40 | 51 | 103 | 57 | Closed | 21 | 13 | 33 | 61 | 102 | 57 |

Issues

This is a look at the number of issues that were opened in our issue tracker as well as how many were closed by month. We don’t create issues for everything we do, but this is still good to look at as it will include bugs and other issues users have brought to our attention. As usual, the vast majority of the work we did did not have a ticket.

I went on a closing spree in January and closed a bunch of stuff that hasn’t been touched in a very long time and realistically we weren’t going to fix. But we still have more than 1000 open issues that need to be reviewed at some point.

2025-11 | 2025-12 | 2026-01 | 2026-02 | 2026-03 | 2026-04 Open | 2 | 4 | 6 | 14 | 1 | 6 | Closed | 4 | 2 | 761 | 7 | 7 | 6 |

Commits

This is a break down of commits to each project per month. In most cases a review request is just a single commit, but this chart helps to see what projects are being worked on.

2025-11 | 2025-12 | 2026-01 | 2026-02 | 2026-03 | 2026-04 Pidgin 3 | 7 | 23 | 23 | 45 | 76 | 40 | Pidgin 2 | 2 | 0 | 0 | 1 | 4 | 0 | Gaim 3 | 0 | 4 | 0 | 0 | 9 | 34 | GPlugin | 0 | 2 | 0 | 0 | 0 | 11 | HASL | 1 | 0 | 3 | 0 | 0 | 0 | Birb | 3 | 14 | 0 | 1 | 9 | 1 | Xeme | 5 | 0 | 0 | 0 | 0 | 0 | Ibis | 2 | 3 | 1 | 2 | 0 | 0 | Hiya | 1 | 0 | 0 | 0 | 0 | 0 | Myna | 1 | 0 | 0 | 0 | 0 | 0 | Seagull | 6 | 0 | 7 | 3 | 8 | 2 | Traversity | 1 | 0 | 0 | 0 | 0 | 0 | retro-prpl | 0 | 3 | 0 | 2 | 1 | 0 |


Infrastructure

We finally got most of our static sites moved out of Kubernetes and onto a server that just serves all of them. This reduces the amount of required resources and has an easy S3 compatible deployment method. I need to do a write up on this at some point in the near future.

As part of the static site updates, we’ve also created downloads.imfreedom.org. The plan is to start hosting downloads here and finally move away from SourceForge. This will be a slow process as we have to go through and update lots of links in lots of places. We also need some way to track downloads and haven’t found anything yet. :person_raising_hand: If you have some thoughts please reach out. The files are being served via Caddy.


pidgin3

Pidgin 3 is our next generation universal chat client whose goal is to give you the best experience possible when using modern chat networks.

Retrospective

A lot of work all around this month.

We added a new notification preferences page because Pidgin now supports notifications and sounds for new message. This is just the start but will grow over time.

We now show avatar for conversation members.

Highlights

General

  • Simplify compiler warning flag setup (RR 4505) (Elliott Sales de Andrade)

Purple

  • Remove AccountManagerNoopBackend (RR 4518) (Gary Kramlich)
  • Remove BadgeManager.get_default (RR 4523) (Gary Kramlich)
  • Remove the rest of the get_default methods for managers (RR 4524) (Gary Kramlich)
  • Add ConversationMember.is_account (RR 4527) (Gary Kramlich)
  • Add a Conversation::new-message signal (RR 4528) (Gary Kramlich)
  • Add ConversationManager::conversation-new-message signal (RR 4529) (Gary Kramlich)
  • Remove the notification-sound plugin (RR 4532) (Gary Kramlich)
  • Remove the purple-toast plugin (RR 4542) (Gary Kramlich)
  • Make Image implement Gio.Icon and Gio.LoadableIcon (RR 4545) (Gary Kramlich)

Pidgin

  • Add support for playing a sound when a message is received (RR 4531) (Gary Kramlich)
  • Add core and ui properties to Application (RR 4533) (Gary Kramlich)
  • Create a manager for sounds (RR 4535) (Gary Kramlich)
  • Add a NotificationPref page (RR 4540) (Gary Kramlich)
  • Add settings and everything for notifications (RR 4541) (Gary Kramlich)
  • Update the contact list to use the avatar-for-display property (RR 4546) (Gary Kramlich)
  • Display ConversationMember avatars (RR 4547) (Gary Kramlich)

Zulip

  • Create channels when connecting (RR 4551) (Gary Kramlich)
  • Create existing dms on creation (RR 4557) (Gary Kramlich)
  • Implement sending messages for DMs (RR 4559) (Gary Kramlich)

Releases

None

Future Plans

The following items are still in the works from previous state of the birds.

  • Add persistence to the scheduler.
  • Add persistence to the contact manager. Contacts are done, we need to finish people.
  • Get channels working in the Zulip protocol.

As always, you can view the burn down chart for our next release here.


Gaim 3

Gaim 3 is an additional user interface built on libpurple 3 to keep the look and feel of Pidgin 2 and Gaim before it in GTK4.

Retrospective

There was a lot of work this month getting the account editor done and basic message sending support. However, there’s still no way from the user interface to create a conversation.

The about box uses the builtin GtkAboutDialog to keep things simple.

The account editor will look very familiar to Pidgin 3 users expect it’s just Gtk 4 widgets as Gaim 3 does not use libadwaita.

Highlights

  • Add the application icon and install it (Gary Kramlich)
  • Add an about dialog (Gary Kramlich)
  • Add shortcuts to quit and open the account manager (Gary Kramlich)
  • Make the status message in the contact list smaller (GAIM3-1) (Gary Kramlich)
  • Implement the account editor (GAIM3-2) (Gary Kramlich)
  • Add some documentation and a flatpak manifest (Gary Kramlich)
  • Add conversations with basic read support (Gary Kramlich)
  • Add an icon and version info to the Windows build (Gary Kramlich)
  • Wire up a basic input box for the conversation window (Gary Kramlich)

Releases

None

Future Plans

Continue working on the conversation windows and creating conversations.


GPlugin

GPlugin is our GObject based plugin library that is used in Pidgin 3.

Retrospective

The GList to GListModel conversion took a big step forward this month thanks to Markus Fischer while Elliott Sales de Andrade focused on a bunch of maintenance.

Highlights

  • Fix some memory leaks in the unit tests (RR 4508) (Markus Fischer)
  • Simplify compiler warning flag setup (RR 4510) (Elliott Sales de Andrade)
  • Fix missing gplugin_gtk_version_check (RR 4511) (Elliott Sales de Andrade)
  • Extend default warning to match Pidgin (RR 4512) (Elliott Sales de Andrade)
  • Make GPlugin.Manager.find_plugins_with_version return a GListModel (RR 4507) (Markus Fischer)
  • Remove remnants of clang-format (RR 4526) (Elliott Sales de Andrade)
  • Make more functions use GListModel (RR 4534) (Markus Fischer)
  • Move GPluginLoader::supported_extensions vfunc to use GListModel (RR 4552) (Markus Fischer)
  • Move GPluginManager::plugins to use GListModel (RR 4558) (Markus Fischer)

Releases

None

Future Plans

We need to see what remains with the GList to GListModel conversation and make it happen and eventually have GPlugin.Manager implement Gio.ListModel.


Birb

Birb is a library of GLib utilities that we use across all of our projects.

Retrospective

Just some minor maintenance this month.

Highlights

  • Cleanup license check script (RR 4539) (Elliott Sales de Andrade)

Releases

None

Future Plans

We need to create some basic HTML and Markdown formatters.


Seagull

Seagull is a new library we created to make working with SQLite feel more like a GLIB/GNOME library and force usage of prepared statements with named parameters and other similar things.

Retrospective

Just some basic maintenance this month.

Highlights

  • Fix destructor type for sqlite3_bind_text (RR 4513) (Elliott Sales de Andrade)
  • Use g_error_new_literal in tests (RR 4514) (Elliott Sales de Andrade)

Releases

None

Future Plans

We have a few features to fill out yet and a few ideas that need a bit more time in the oven.


Closing

We got quite a bit done this month especially on the GPlugin GList to GListModel migration as well as basic messaging support in Gaim 3. But of course there’s always more work to do especially as we work towards Pidgin 3.0 Alpha 2.

If you have any questions of comments please leave them below!

One Last Thing

The Pidgin project will turn 28 years old in early November and in years past I’ve tried to put something together to celebrate that. I started history.pidgin.im quite a while ago, but of course time is always an issue. Because of this, I’ve realized what we really need is a historian. Someone who can go through our history, ask people question, and put together something interesting. :person_raising_hand: If this is something you’re interested in please reach out!!

2 Likes