I have always liked playing with plugins—not only as a user but also as a developer. I was amazed by the power that plugin APIs of some applications (for example, Apache HTTP server) give to let a developer extend their functionality. But when I started to learn the Redmine plugin API, I was amazed even more. Honestly, I can't say that I love Ruby on Rails or am a fan of it, but Redmine's plugin API (which is based on Ruby and Rails) is definitely the thing! Unlike other plugin APIs that I've seen before, it's not a regular plugin API. Thus, it embraces the Redmine API and the Rails API. And, it is based on Ruby, which is a very powerful metaprogramming language and provides unsurpassed means for patching code at runtime. As a result, this makes the Redmine plugin API nearly limitless—in other words, you can do almost anything with it.
While Redmine is quite featureful without plugins, you will most likely encounter a couple of them that you will want to make...