Getting your own almost-Lemonade IMAP server

For people who want to experiment with LEMONADE-style IMAP servers, I created a little developers guide to installing one that supports the IDLE and CONDSTORE capabilities. You can also try M-Box or others. It’s a wiki, so people are allowed to improve the guide.

This doesn’t mean that I already have support for these two capabilities covered in tinymail. It does mean, however, that I’m preparing my test environment. A software developer usually prepares a test environment for a reason. That reason is, indeed, that I’m on it (implementing support for lemonade imap features in tinymail).

It will be developed piece by piece. I definitely have other todo items and priorities too. Since only a few running IMAP servers support this already (and by running I mean IMAP servers that are actually running, not just an software version of an IMAP server, but an active and working deployment at a site), unless you install your own, it’s not yet extremely important. However, I do agree, fully, that the lemonade proposals and drafts are absolutely interesting and are probably going to be very important for the mobile world (that includes laptop users on shitty wireless networks).

Followup on Lemonade: CONDSTORE in camel & camel-lite?

I’ll guide people to how they can help Evolution (and therefore also tinymail) get support for at least certain interesting Lemonade IMAP protocol features. You can all start looking at me to do it for you, but as my todo list just keeps growing and growing, you’ll be looking for a longer time than that it would take you implementing it yourself.

I’ll explain the CONDSTORE capability. CONDSTORE is interesting because the thing that does change about summary of messages are the flags. For example the \Recent and the \Seen flag of your E-mails, change. The CONDSTORE capability makes it possible to quickly synchronize these flags with what you have been storing locally (without having to retrieve all of them one by one again).

In Camel’s camel-imap-folder.c there’s a not-very-difficult implementation for this, called imap_rescan. And in Camel’s camel-imap-store.c you’ll find a static global table called “capabilities”. Simply adding the “CONDSTORE” capability there and putting an if (store->capabilities & IMAP_CAPABILITY_CONDSTORE) { /* your new code */ } else { /* original camel code */ } at that location, would probably be sufficient to actually implement it.

imap_rescan (CamelFolder *folder, int exists, CamelException *ex)

The existing implementation uses a trick to avoid calling the hashtable lookup that I mentioned yesterday. But for a few lookups (only the changed ones since last sync) it’s probably better to simply utilize camel_folder_summary_uid to get the CamelMessageInfo instance for a specific uid. Now use camel_message_info_set_flags on that instance and feed it the new flags which you just received from the server. You even already have the helper functions that turn strings like “\Seen” and “\Recent” into the correct bitfield flags.

If you need to add “(CONDSTORE)” to the “SELECT”-IMAP command: The “SELECT” command is implemented in camel_imap_command (a quick search in the code for “SELECT %F” will do wonders). Just make sure that you only add it in case you have IMAP_CAPABILITY_CONDSTORE in the store->capabilities flags.

So why am I whining about this? Because well, honestly .. not much people are working on this type of things. Yet this is something that both our desktop and mobile devices desperately need.

I decided to link to Camel’s SVN this time because I’m pretty certain that the Evolution Mailer maintainer would accept a good patch that adds support for the CONDSTORE capability. If you are more into experimenting with things that are rather unlikely to go in Evolution’s Camel soon, you can of course join me on experimenting with it in camel-lite. This isn’t a pure isolated fork. I’m trying to extract useful deltas out of those experiments and pushing them upstream. Which takes time on a per-patch basis, of course.

I’m willing to dedicate my entire FOSDEM-time to co-developing Lemonade IMAP support with interested people. I mean, we have developer rooms over there, right? Why not? We can even continue at night if you are not afraid of spending the night coding. Somebody?

In the end, it’s really about “just doing it”.

Nokia N880, FWD: misinformation

Nokia N800

Thanks to Nokia and more specifically Dirk-Jan C. Binnema for getting me a discount for the N800. I will of course make sure tinymail runs on it. Not that I expect a lot changes for that.

FWD: Misinformation

Jono makes this interesting argument about misinformation. I recently started reading this book about emotional intelligence written by Daniel Goleman. This is is, In my opinion, a good followup subject on Jono’s point.

I read an older book of Daniel Goleman on emotional intelligence before, but this one is more practical (I think I have the Dutch version of Working with Emotional Intelligence).

Psychology is interesting, indeed.

Telomer & Polymer

I’ll immediately respond on Telomer before I get flooded with questions on why doing tinymail if it’s all that simple:

Telomer is interesting of course, but it does not cache E-mail locally. This means that you must always be online to read E-mail. Getting the summary information and getting messages (actually, getting MIME parts) is not the hardest part of an E-mail client. The hardest part is parsing the MIME parts and dealing with the offline cache in an efficient way. Which is what tinymail is really about. Actually, from a technical pov it’s what camel(-lite) is about.

Tinymail of course also provides code for connectivity with IMAP servers (also for POP3 and NNTP) otherwise it can not get this information in that cache.

Another already working solution when your mobile device is always online, is also called webmail like Yahoo mail, GMail, Hotmail, Squirrel, Roundcube, IMP, etc. The problem is, however, that mobile devices are not always online.

You could argue that making a simple quick ‘n dirty cache is quickly implementable. The implementation of this E-mail client or library will, however, get more complex once synchronizing changes to that offline cache must somehow be reflected to the IMAP server once there is connectivity. And once you want to do this efficiently. Etc. But I’m interested, as it’s on the TODO list for Telomer & Polymer (I just promise that it wont be easy, hehe).

The Lemonade stuff, however, is very interesting. For example the P-IMAP (Push-IMAP concept) for when new messages arrive. You can be certain that I’m already looking into ways to use these IMAP protocol features on IMAP servers that support it (emphasis on that).

It’s very nice and extremely interesting to see Polymer and Telomer use and push the Lemonade IMAP protocol features. In time tinymail will obviously support all of it.

Anybody who wants to work on reimplementing the IMAP provider of camel(-lite) or on improving the existing one by for example adding support for the Lemonade protocol features is absolutely invited.

All your memory base are belong to, ghashtable

It’s time for some monthly bashing-others about memory wasting. Moehaha! But hey, Camel was not done that bad. This is a friendly one. Some people in the past had this strange idea that I was questioning the competence of those who’ve built Camel. That’s absolutely not true. There’s a reason why I use it myself, don’t forget that (and some day, people will bash the fuck out of tinymail, right? Good! keeps us going).

Some developers enjoy the fact that glib makes their lives more easy a lot, it seems. And I agree with them! You should leverage the fact that glib is a well tested library. Who wants to implement his own hashtable or doubly-linked list each project he starts? I honestly don’t.

However. In the CamelFolderSummary, the number one piece of code that consumes most memory of E-mail clients that are being build on top of Camel (that includes Evolution and tinymail with its camel-lite), we surprisingly see a GHashTable being used in parallel with a GPtrArray! Both holds the exact same instances?!

Somebody like me … questions that. Because both in memory and in performance this (in this case) is a loose-loose situation: adding it to the hashtable takes time, searching a GPtrArray is (in this case) not going to take a lot longer (read below for more information on the “in this case” situation).

Consider the memory caused by each item you add to the GHashTable:

struct _GHashNode {
  gpointer   key;
  gpointer   value;
  GHashNode *next;
  guint      key_hash;
};

That’s on a typical x86 architecture 4 + 4 + 4 + 4 bytes, right? 16 bytes per item (Or am I calculating this wrong? There’s no waste caused by mem alignment here I think, and it uses g_slice_new so there’s also not a lot heap admin). Multiply that with 10,000 headers, that’s 152KB of memory. Nothing you say? Okay, I agree (well, except that for a mobile application this is a significant memory improvement).

However, consider that each and every summary item that you can see in your Evolution consumes this. With the help of some mailing list subscriptions, I use Evolution to manage up to 1,000,000 messages that way: 15,625KB or 15MB of GHashNode instances (gah, I must be miscalculating because that’s much more than what I expected).

Because this:

static CamelMessageInfo*
find_message_info_with_uid (CamelFolderSummary *s, const char *uid)
{
	CamelMessageInfo *retval = NULL;
	guint i = 0, len = strlen (uid);
	for (i=0; i < s->messages->len; i++) {
		CamelMessageInfo *info = s->messages->pdata[i];
		if (info && !strncmp (info->uid, uid, len)) {
			retval = info;
			break;
		}
	}
	return retval;
}

Is more difficult than this:

g_hash_table_lookup(s->messages_uid, uid)

I don’t whine without a patch, right? right!

Update: and on the tinymail front, I removed the need for often calling this function (update: which is an important pre-condition for applying patches like this). This made loading large folders a lot faster when using the framework for this. You can svn diff -r 1451:1452 to check what I changed for that.

Update on CPU consumption (because some people have questions about that): The hashtable lookup would indeed be faster, but the hashtable lookup can (and usually is) avoided in Camel. Not sure whether it’s also avoided (and avoidable) in Evolution code (that’s a lot code to check), but all occurrences where the hashtable lookup is needed are avoidable and are therefore avoided by tinymail. In other words: looking up by uid is not often needed. But you are right that a hashtable lookup is faster than that find_message_info_with_uid implementation.

FYI

Today the tinymail project is exactly one year old (it depends a little on how you count, but today one year ago, the first .c and .h files in my ~/Projects/tinymail directory where written).

Partial message retrieval for POP

I just implemented partial message retrieval (only receiving the message of an E-mail, not the attachments) for POP in tinymail. This was an uncertainty that I had with some of the Nokia requirements: In contrast with IMAP is POP3 really a dumb protocol that knows nothing about MIME parts. Yet I succeeded in actually implementing this. Next to summary support in the camel-lite’s POP provider (which uses the TOP capability if that is available, most POP3 servers have this, and else it too uses this new partial message retrieval feature).

The summary of your E-mail client is only the basic information for viewing a summary of a folder. You obviously don’t need to receive all message data of all messages for that. That is what this summary support for POP3 is all about.

My technique, for partially retrieving messages from POP3, is to search for the boundary in the Content-Type header and storing that parameter. Once after the headers, the second time I find this boundary string I simply disconnect from the POP3 server, make sure the already retrieved message data is correctly written to the file system as cache and then I simply let the software reconnect once the next command is unleashed. I still need to add detecting whether a message is partially retrieved and retrieving it again in case the strategy for receiving messages has since switched.

For example say the user received it partially, but now learned that the message is interesting and would therefore like to fully receive it. Including the attachments. For that I need to add some administration code that stores the retrieval status of the message and makes the correct decisions based on that.

Nevertheless has the milestone be reached: partial message retrieval for at least IMAP and POP3. Both are now implemented. The IMAP one fully and the POP3 one, well in a few hours this will be 100% correct and fully working with retrieval status detection and code that gets it right.

Update: it’s implemented now

These are in my opinion important features for mobile and embedded that very few other smaller E-mail solutions implement. Done in such a way that it’s flexible for you, the application developer (strategy design pattern), to decide when and if partial retrieval is to be utilized.

The new iPhone, we have work to do

Gnome mobile and embedded people, we have work to do: Steve Jobs is showing us his new little wonder. This time I think we will have to cooperate with the guys doing crazy 3D effects and hardware people too. I’m more than certain that with our technology we can actually compete with devices like this. The only thing we really lack, in my opinion, is coordination and cooperation between each other. Technical leadership (and I know this is the subject nobody wants to talk about).

I’m for sure going to try providing the E-mail infrastructure (not only for gtk+ based devices). But that is only an extremely tiny piece of the puzzle. The cool ui effects, like rotating the X11 window when the device physically rotates, is something for our cool X11 developers. The cool scroll effects (when using your finger) is something gtk+ can implement (if this ain’t a patented idea of Apple of course). Input techniques: same (also about the patents). Hardware: Nokia, Palm, OpenMoko? Media players, we have plenty of them, but do we have one that has a really suitable ui for mobile devices? Honest question. GSM & phone functionality, I guess that is going to be hard and will depend on the hardware a lot (but not impossible). VoIP, aha! We have Telepathy! Presence, sure: Galago! Cool art: yep we have nice SVG icons and I’m sure we would find a lot artists who could create us very good stuff for such devices.

What are we waiting for? To be as usual late for the next big thing? Steve is clearly on it already. It’s not the first time that he showed us what that next big thing in technology is, right? In combination with full wireless Internet coverage in bigger cities (which will most likely happen sooner or later), I think devices like this are one such next big thing for the coming years.

Some of the core functionalities that I have in mind (I on purpose decided not to put a lot project names in the bullet points):

  • A Windows, MacOS X AND Linux client for uploading music and other files from and to the device;
  • VoIP, Presence;
  • E-mail & SMS capabilities;
  • Small browser, good Flash & AJAX support;
  • An easy-to-use media player;
  • A small X11 with some effects;
  • A camera and a modest photo management tool;
  • A Java VM like J2ME, maybe .NET and Python too;
  • A good development platform for it. One that Windows developers can use too (“emulator.exe” -style);

OpenMoko and Nokia are, indeed, a good start. In my opinion, we need a lot more like this.

My opinion? Let us not wait and sit, in other words stare at it, like lame ducks. We do have the competence in our group to compete with this!

Maybe cooperate with Steve? I’m sure that such devices need standards like configuration standards, standards for transferring files and deploying music (insert more here). Might be Utopian thinking to want to get this standardized. Yet I believe that this standardization process would unleash the mobile world. Let the others fight each other with their standards while we create the real ones behind their backs?

Think different, be different, be creative and a few years later: Right now the new is you. Your time is limited so don’t waste it living someone else’s live. Have the courage to follow your own heart and intuition. Everything else, is secondary.

Finally, a last great quote from that recent speech:

Stay hungry, stay foolish.

Johnny Depp & the People’s Choice Awards

I know that I’ve said this before. But the fact that this award comes from the people makes it all the more special. And thanks for keeping me employed, yeah? You’re the boss.

And thank you for being passionate and extremely good at what you do Johnny Depp. The world needs more people who are as passionate and as good in what they do as you.

Passionate people like you inspire other people to also want to be as good in whatever they do.

You passionate movie actors are of course one of the most visible ones in the community of passionate people. I thank you for being one of them who’s extremely good at it.

And of course as a result of also (probably not only, I know) your input, I enjoyed watching most of the movies where you played a role as an actor. But my real gratitude goes to you wanting to be good. Which is what most likely made you the talented actor you are: your own passion.

Partially retrieving messages

Partially retrieving messages is something important to support if you are targeting the mobile market. The reason for that is that not all devices come with huge flash disks, yet all E-mail boxes can contain huge E-mail messages. Imagine receiving an E-mail with three MP3 attachments and two CID embedded 750kb jpeg images on a mobile phone that has a flash disk of five megabytes.

I implemented a feature that makes it possible to switch between retrieval modes. I implemented two retrieval modes that are put in the framework: only getting the first mime part and getting everything.

You basically set the receive strategy of a folder to either a full message receive strategy, a partial message receive strategy or your own implementation that, for example, classifies between these two based on the message size (the size can be made available using the camel-lite CamelMessageInfo API, in other words: it’s available in the summary of the folder). More info here.

I also reimplemented a Camel IMAP implementation in camel-lite that fetched messages from an IMAP server. The original one copied the message in memory a few times. The new implementation will use the CamelStream API to immediately stream it to the file system while it receives the message.

This means that camel-lite, when compared with Evolution’s Camel, now improves memory and bandwidth consumption in four significant ways:

  • The summary is read-only mmap()ed;
  • When retrieving summary information from the IMAP server, tinymail’s camel-lite uses significantly less upstream bandwidth and it uses a lot less requests (sending a lot requests isn’t a very good idea on for example GPRS connections);
  • When retrieving summary information from the IMAP server, tinymail’s camel-lite will periodically dump newly received information into the mmap while receiving is happening;
  • When retrieving messages from the IMAP server, tinymail’s camel-lite does not copy the message in memory but rather streams it straight from the tcp/ip connection into the local cache-file. On top of that does camel-lite implement partially retrieving messages (which of course also reduces file system consumption if used).

I will now start working on getting POP support working with summaries. At this moment will an E-mail client like Evolution copy all (or filter, in the end it’s the same) the messages that are on the POP server into a local mail folder. On a mobile device with a small flash disk this isn’t a very good idea. It’s more interesting to store a summary and only cache the E-mails that the user really wants to cache. For IMAP this is but for POP this isn’t implemented in tinymail (for POP it is a lot harder to get it right). This is going to change of course. Partially retrieving messages from a POP service is also planned, but I’m uncertain if this is actually doable in a sane way.

Other things that are on the agenda for tinymail: uh, eum .. a lot. Check out the trac. For example: backing up and merging cache, removing attachments from an existing cache to reduce file system consumption, dealing with all sorts of strange error situations (like failing connectivity, batteries dying and the power of the device shutting down), GtkHTML support (still needs some work), I started trying to get some glib dependencies working on WinCE (so who knows, maybe someday tinymail on WinCE), maybe a default mail composer component, searching the summary of a folder, more status feedback, language bindings!, more documentation, etc etc, integration with existing calendaring tools, etc

Tinymail on the one laptop per child laptop, the movie

I created a new video. This time the video shows the tinymail demo user interface on the One Laptop Per Child laptop.

My little brother helped me a little bit with making this video nice. You know, with fading background sound from Karoliina’s excellent music samples and such a black end screen with a logo and the URL.

I hope tinymail will be used a lot on mobile devices and by projects like the One Laptop Per Child.

Project teams and companies should know that I am accepting and already working on custom tinymail development, enhancements and feature implementations. For the One Laptop Per Child project I will make an exception: I will try implementing what they need for free because I truly believe in their project. Yeah, I’m one of those guys who also believes that for example wikipedia is truly going to make a significant difference.

Tinymail on the one laptop per child laptop

Non-youtube versions of the videos can be found here

Tinymail demos now on youtube

To prepare for the moment of releasing a first version, I started with my “modest public relations campaign of selling the framework” :-) by posting the existing demos on youtube.

In other words, please send these youtube links to your software development team responsible :-) (for example in case your company is interested in developing E-mail related functionality for a mobile device, an embedded appliance or on a desktop environment). You can also add a link to its main website, to its documentation and to its API reference manual.




ps. If your blog aggregator removes embed tags, you can find the same (youtube/flash) movies on this and this page on the tinymail website.

My newyears letter

Before everybody starts celebrating that a criminal is put to death (and a criminal he was, indeed. Nobody will argue with you about that). Let this be heard everywhere on earth. Especially by the Americans who reelected their current government (and that way permitted their government to proceed with what happened a few moments after that same reelection).

Saddam’s death does not vindicate in any way the ill-conceived and disastrous decision to invade Iraq. His execution does not make an illegal war legal any more than it will put an end to the violence and destruction. Menzies Campbell

It’s time for facing consequences. What happens and happened are war crimes and should not be forgotten. Firing Rumsfeld is not enough. I know it’s naive to believe that any American will ever face an international court for war crimes. Yet even that wouldn’t be enough. The hypocrisy of today’s American leaders is sickening. This will be my thought the very moment I will enter this new year. Same for a lot other Europeans.

Don’t think that witch-burning, like what the hanging of Saddam really is all about, is going to change anything.

For the respect of millions of people who died for our welfare and peace during World War II, why don’t me stop this nonsense by letting democracy truly do its job? Why are we letting our own world leaders get away with this? For cheap oil?

Speeking of war crimes

I wonder why only one “leader” is soon going to hang for “war crimes”?

Warning: extremely violent footage (but nevertheless, the truth): fallujah_ING.wmv, (mirror)

What about the American leaders and (especially the non-puppet) war planners? Shouldn’t they be punished? Given they have permitted the usage of white phosphor and M77 (a napalm-like), which is clearly a violation of international law of war (in other words, they committed war crimes), which makes them directly and personally responsible for what you see in the movie.

I wonder when, or should I wonder “if”, these people will ever be judged for this?

And just to make sure it gets spread, Mr. Leverett explaining how he got silenced by the Bush administration.

Finished tutorials

Normal people in the Western hemisphere pay a visit to their grandparents, family and other relatives these days.

There are days that Tinne arranged my agenda in such a way that, indeed, I’m doing those visits. However, I came home this evening and noticed that I don’t have such a visit-people-evening today. Cool!

So I decided I should hack a little bit on tinymail, and while doing that write some more documentation. What I worked on is actually cool, hard and very important, but most people who read this probably don’t give a fuck. So I’ll be brief about it for a change. I fixed creating and sending multipart E-mails (you know, multipart/alternative with text/plain and text/html mime parts, yadi yada). Here’s a demo.

Suddenly all the application development tutorials that I wanted to write where finished. Exactly one week after I forced myself to write these tutorials by blogging about how happy I would be if I would write them (oh the irony).

They can use a lot improvements. I’m not a native English speaker (let alone writer), so they are loaded with stupid spelling mistakes. Yadi yada. Here, go get them:

Gaim logs to Gossip logs

Raphael’s Christmas present now has consequences. Cause of his present I decided to finally switch from using Gaim to Gossip for my instant messaging needs. Because I’m into keeping logs around, I decided to write a small piece of shit Perl script that tries to convert the Gaim log file format (clumsy HTML) to Gossip’s (gossip-log.xsl).

You can get it here.

Feel free to improve this if you are into torturing yourself with Perl during the New Year- and Christmas holiday period.

Dogville

Today I for the first time saw the movie Dogville. It must be one of the best stories that I have ever seen in a movie or read in a book.

The comments and criticism that I have found on the web make me think of something a Belgian art guy once said on the radio during an interview. I forgot who and I forgot the exact words. I’m probably not good at repeating what he said (and my translation makes it even worse). But it came down to this: art can be art if it achieves in getting different people to have a strong pro and a strong contra opinion about it. In other words, if all people (100%) agree the thing is beautiful, it’s probably just beautiful. Same for “ugly”. However, if 50% of the people think the thing absolutely is art and the other 50% think the thing absolutely is not art, it’s art. Or maybe .. it’s not art, but it at least created discussion. Which by itself is an achievement.

Therefore it is my opinion that this movie is art. Thanks for sharing it with the world, Lars von Trier.

But then again, I’m not at all somebody who knows something about art. I’m just somebody who likes the story of the film a lot :-). I’ll quote from one of the comments that I found: “The movie gives you a lot to think about.”

D on the Nokia 770

Woaaaa, Michal got D working on his Nokia 770. He told me the garbage collecting works too and that he’s now trying to get the gtk+ language bindings for D working.

Damn, that would be yet another language to support in tinymail. But definitely one that I would support. Because that language would be the one that I would use myself for writing applications.

Writing the documentation

A lot of the tutorials are still a little bit quick ‘n dirty, yet they already contain some useful information.

I have spend part of this evening writing them, copy pasting stuff around, creating wiki pages and setting links correct.

This is the result.

There are still a lot topics to cover, of course. By just reading these, you should get a clear idea how to develop E-mail applications on top of tinymail.

I know there are probably a lot errors like spelling mistakes and probably even programming mistakes in the samples. Everybody is hereby invited to help me spot and fix them. As I said before, it’s a trac wiki and it’s editable. Just put “I am not a bot” in the comment box below and make your changes.

At some point I would like to link all API symbols and type names in this new documentation to the tinymail API reference manual‘s pages. If you are into doing that, go ahead.

A first tutorial for application development with tinymail

This is going to be the documentation style for documentation for application developers who are building an E-mail client on top of tinymail.

I already wrote about the importance of documentation when doing a library or framework like tinymail. I would like to add that without it, the entire piece of software has the same value as vaporware for a lot of software developers and companies who would otherwise be very interested in using it. Why am I telling you this? Because I want to stress the importance of documentation in the tinymail project to future contributors. I would like to set the standard for the documentation of the project early and high.

A first mini tutorial explains how to get a list of accounts in a TnyGtkAccountListModel and how to set that as a model for a GtkComboBox. A second explains how to display folders in a GtkTreeView.

I hope that while I will probably be writing most of those documents myself , people will read it and make improvements and for example language and code-style corrections. It’s wiki style (trac), so everybody can edit this. I don’t know how fast the list of tutorials will grow. I’m a bit fanatic about documentation, so I guess that “a few weeks” is going to be a doable timeframe.

It’s not much yet. But hey, you can help and by doing that it will drastically speedup (more than 100% faster, because you putting energy in it, would inspire me to work on it faster too).

Yes, I know that I’m insane and that I want to do too much at the same time. In dutch we have a saying that goes like “zot zijn is gezond”. It translates to: “being a nut is healthy”.

Documentation, documentation, documentation!

Tinymail has attracted a few contributors. This made me think about documentation.

I mostly created documentation about contributing to the tinymail framework. I didn’t focus so much on documentation about using Tinymail being an application developer building an E-mail client on top of it. I know it’s usual the other way around. Both types of documentation are in my opinion equally important. They should be mixed a little bit, because application developers should be inspired to learn how to adapt the framework. For example by implementing a new implementation of an interface.

There is the API reference manual, of course, there are a few demos and samples and the tests directory contains a few interesting tests too.

But no manual-styled documentation nor a lot of that stuff on the trac pages. Some trac pages are manuals about contributing to the tinymail framework. Like debugging, like how to implement a type and how to inherit one (those last two ones are indeed very useful for application developers too).

I hope that the people working on Modest will change that a little bit. If time permits, I will start writing manual-style documentation myself too.

If companies are interested in improving the tinymail framework, but are unsure how, paying somebody to write this type of documentation is a good way to overall improve the project and make it gain more interest at the application developers.

Another investment in the project, that is hard for the current developers, are of course language bindings. Those are hard because they imply having to learn a lot about the target language itself too. I have a detailed description about how to do a Perl binding, how to do C++ ones and the java-gnome author is very interested in helping anyone who wants to do Java ones. Python bindings are already done (which implies that there are .defs files being generated, which makes for example doing java bindings much more easy).

Cool typical mobile features are going to happen. Features like partial message retrieval, service discovery for SMTP servers and merging and backing up of already-received E-mails. They are, as they say, on the immediate agenda and will be worked on in a near future.

Of course, if you feel an urgent need to start writing documentation, then go ahead. It’s a very interesting way to learn how to use tinymail as an application developer. I will fully support you and I will most likely join your little documentation project. Let me know.