I have written a variety of open-source software. Some of it is presented in the hope that it will be useful; also, this page serves as my personal portfolio, so it holds many things which are probably not useful to you but which I felt were worth showing off. If you are of the curious persuasion, please feel free to browse around!
If you are looking for commercial software, may I interest you in Vecky, my diagram editor?
FruitTart is my real showpiece. You're already using it - it powers this website. It's a comprehensive content-management system, featuring such modules as blogging, issue-tracking, and CAPTCHAs. In keeping with the idea that a true craftsman should make his own tools, I set out to create a bug-tracking database, and wound up creating much more.
FruitTart uses a model-view-controller architecture: The model is low-level SQL code with a powerful query generator, using SQLite3 for all storage, which retains the high performance and clean abstraction of a true relational database while making backup and maintenance operations trivial and requiring no external database server. The controller is native Haskell code with a very clean and well-factored API. The view is a template system; templates are written in a custom template language, which is purposefully minimal for clarity and performance reasons. The template language embraces the ideas of strong typing and simplicity. Queries and templates are stored in the database and edited through a powerful web-based administrator-only interface, just a module like any other.
FruitTart uses role-based access control to support single-logon across all its modules, while restricting users to the areas of concern to them.
FruitTart connects to any webserver that supports the FastCGI protocol; my installation here uses Lighttpd.
FruitTart is not yet released, because I don't want the commitment of supporting a legacy version of the API while it is still developing rapidly. However, in the spirit of openness, you can already obtain the source with:
Oh, the name? It's thinner than Cake.
Emerald Frame is my answer to SDL. I could write much more about it, but not just at this moment. At any rate, it isn't released yet, but you can obtain the source with:
I wrote a tiny little library in Haskell that generates CAPTCHA images, for use with web forms that require users to prove themselves to be human. You may be interested in it. You can obtain it through Hackage and Cabal-Install:
You can also obtain the source with:
This is a teensy tool for Mac OS X Snow Leopard that enumerates all machines and services on the local network, using Bonjour, and prints their names. I am aware of programs that do this with a GUI, but I always found myself wanting this information at the command line. So, here it is. I even made a nice installer for you (it uses /usr/local).
You can also obtain the source with:
A Haskell binding to SQLite3. The existing ones were all incomplete and unmaintained, so it was more attractive to do a new one than extend one of them. You can obtain it through Hackage and Cabal-Install:
You can also obtain the source with:
A short snippet of Haskell code that uses the GHC API to load code dynamically, at runtime, from an installed package. Originally FruitTart used the Plugins library, but that broke under GHC 6.12 and was too complicated for me to fix myself, so I wrote Direct-Plugins to replace it. It's probably the lowest-level Haskell code I've done. You can obtain it through Hackage and Cabal-Install:
You can also obtain the source with:
A native Haskell implementation of the FastCGI protocol, which allows applications written in Haskell to run as high-performance web scripts, caching such resources as database connections across invocations.
Although the cgi-3000 and fastgci-3000 packages predate direct-fastcgi, I found them to be in a sorry state: They had gone through several maintainers but were not currently maintained, and had several important limitations, such as a complete lack of concurrency, exception handling, and logging. (Actually, they did have some support for all of these things, but none of it worked!) Most importantly, they mismanage the monad, making it very difficult to extend with a user-defined one. Furthermore, they were difficult to build, having the non-Haskell dependency. I was originally going to at least clone their API to make things simpler for people to migrate, but when the time came I realized that my design couldn't be shoehorned into that interface, so I went with an entirely fresh one.
I believe that direct-fastcgi is superior in every way; it is a clean interface, with full functionality. It has clean exception management and well-designed control structure which allows versatility in processing requests which are not simple GETs. In particular, POST of large files should be possible, as should server-push responses which return content a piece at a time. Also, of course, as a native implementation, there is no dependency on a C library, which simplifies the install process.
You can obtain it through Hackage and Cabal-Install:
You can also obtain the source with:
This one is probably of interest to nobody but me, but I'm proud of it; it's probably the lowest-level code I've ever written. See, I once got my Macbook Pro into a very bad state with a corrupted partition table... Parted couldn't help me, because GPT support was still very new in Parted at the time. I had no access to hardware to get my data off, or to my original install disc to reformat. So over about a week, I wrote this little program which went in and fixed everything up very spiffily!
You can also view all the Darcs repositories I have here. Not all of them are code written by me; for example, in glpng all I did was modify it so as to compile on the Macintosh.