Some releases are simple. You have some bug fixes, you have some new functionality. And when you think there's sufficient new stuff to release, you just go ahead and make the release. That's how it has always been with iText. I admit it's not very organized, but... it works.
I've tried making an 'official TODO list' once, but apart from some major TODOs that would take weeks of work (for instance XFA support), development is mostly user driven. People post questions on the mailing list. If the functionality that is asked for isn't available yet and it's within our reach (not more than a few days work), we add it. That's how iText grows. IMO that's the best way for a product to grow. If the market asks for something, provide it. Sure, there are always unanswerable questions, most of the times based on misunderstandings about the PDF specification. So apart from answering to the needs of the market, we also have an educational task. It's a great job; the only downside to it, is that (almost) nobody pays us for doing that job.
It's not easy to maintain such a project for free. The iText developers all have to feed a family; in my case, there are some complications that make it even more difficult to stay focused on iText. Two weeks ago I made the iText 2.1.1 release in a hurry. I was at the hospital with my son. I thought it would take two days to have the release shipped, but much to my surprise I was able to do it in one day. Once the release was out, the other iText developers were surprised too, because I didn't give them sufficient time to check the release and to make some final adjustments (for instance: one of my changes, broke some PDF/A functionality). That's why I didn't promote the 2.1.1 release on SF, JavaLobby and FreshMeat: I knew I'd have to release 2.1.2 soon after 2.1.1; more specifically: 15 days later, on May 16.
The 2.1.2 release was postponed a number of times because of some issues reported by users. Not all of them were real problems; most of the times an 'alleged iText bug' turns out to be 'wrong use of iText'. Last Friday I was quite happy when JUnit told me there were no errors in the project. Unfortunately, tests don't always cover the full functionality, and right after I had shipped the release, I ran some other tests, and found out we had introduced a subtle bug that would probably have gone unnoticed by most of the Western users, but that could be a problem for Asian iText users. That's why I immediately made release 2.1.2u ('u' stands for 'update'); containing everything that was in iText 2.1.2, but with one small fix for a bug introduced in 2.1.1.
It's situations like this that make me wish we didn't only have a good product, but also a sound business (read: a good business model generating sufficient revenue for 1T3XT BVBA). That would give us the means to hire people to do the releases in a more professional way. In a few weeks, I'll have the results of a phone call I made over a week ago. We're planning to provide commercial iText licenses and I sincerely hope they will be a success, because IMHO iText deserves it. It would probably make many things much easier if there are sufficient funds to hire people to do some of the work that is now done by only a handful of people during their spare time.