As some of you probably saw already, mutt-ng is currently in a rewrite phase. I would like to give some insight on why we started the rewrite and what's actually going on. When we were trying to improve mutt-ng with more and more features, we came across the problem that it was very difficult to actually identify and fix bugs, and how changes on some parts of the code would influence the overall behaviour and probably would add new bugs to the code.
So we came to the conclusion that the only feasible way that would make it easier for us in the future would be a well-documented rewrite, as we had troubles seeing overall design goals, in fact, there was no documentation at all for the original mutt(-ng) design. So first, we started drawing UML diagrams of the overall design, using ArgoUML. These designs can be found in our Subversion repository. As soon as we had a reasonably usable design, we started with the implementation in C++, which is currently going on. Why C++? Because it's language that makes it reasonably easy to provide a clean mutt-ng implementation that reflects the UML design and makes it possible to take advantage of object-oriented features while retaining compatibility with existing mutt-ng code pieces, making it relatively simple to reuse existing (pre-rewrite) mutt-ng code.
As mentioned before, one focus is on documentation. Rocco put some effort into documentation building: complete developer documentation of the source code can be automatically generated. Even better: the documentation is generated once a day from the most current source code, and put online here. The user documentation is auto-generated. More general information about the rewrite can be found on the mutt-ng rewrite page. This is also something where anybody who wants to contribute can do so: the user documentation and the rewrite pages are created in such a way that it's simple to translate it to another language. So, if you want to contribute to mutt-ng, just translate the user documentation to your native language. So far, English and German are available. Although there isn't much to document yet, we think that providing the documentation in as many languages as possible makes it easier to get a grip on mutt-ng, to understand it and to get them contribute by themselves.
Besides documentation, there is another important goal on the rewrite: as much of the mutt-ng functionality as possible should be automatically testable. The buzzword for this is unit testing. The tool of choice for this is unit++, a very C++-ish unit testing support library. To meet our own expectations of high-quality code, we wrote unit tests for the core library and the mutt-ng library (yes, very modular design) practically in parallel, a development method that proved to be useful especially in big projects: as soon as a test breaks, you know that something has gone wrong, so continuously developing and testing makes it easy to detect hidden bugs. For refactoring, this is also very useful, as the unit test is part of the specification, and you can easily test your code whether it conforms to the previously defined (and expected) behaviour. We think that this will very valuable for future development.
If you're interested in contributing to the mutt-ng rewrite, don't hesitate to submit patches. But please don't forget to provide useful documentation (a look at the header files shows what we mean) and unit tests. Documentation makes your code easier to understand, and the unit tests show that your code works, so providing both raises the chance of getting your patch included.
In the future, we hope to be able to provide more and especially more often background information on the rewrite status.