While the popular sentiment is "I'm too old for this shit", GNATS is one of those things that just want me say "I'm too young for this shit."
GNATS is an elderly GNU project which aims to be a simple bug tracker. And going with that definition, it succeeds. It is simple (too simple) and it is a bug tracker. One of its (former) ground-breaking features is that it can interface (as in "user interface") with many things, like The Web (!!) and E-Mail (sic!), but historically its interfaces are vi and emacs. And I have nothing especially against GNATS as it is - it's just that it's old and I feel like ranting.
Take a look at its source, for one thing. The "gnats" subdirectory where most of the action is contains over 80 files. From this list the 10 largest files are:
-rw-r--r-- 1 ivoras ivoras 257724 Oct 27 1999 ChangeLog.v3
-rw------- 1 ivoras ivoras 222020 Mar 6 2005 configure
-rw-r--r-- 1 ivoras ivoras 177515 Dec 10 2001 regex.c
-rw-r--r-- 1 ivoras ivoras 115150 Feb 24 2005 ChangeLog
-rw------- 1 ivoras ivoras 73306 Mar 6 2005 fconfig.c
-rw------- 1 ivoras ivoras 71387 Mar 6 2005 fconfigl.c
-rw------- 1 ivoras ivoras 63275 Mar 6 2005 getdate.c
-rw-r--r-- 1 ivoras ivoras 62777 Aug 4 2002 gnats.el
-rw-r--r-- 1 ivoras ivoras 40571 Nov 25 2002 query.c
-rw-r--r-- 1 ivoras ivoras 40247 Aug 30 2003 cmds.c
(don't fear the timestamps)
Of those, regex.c can of course be replaced with anything, fconfig*.c and getdate.c are yacc-generated parsers (and at least getdate can be replaced with strptime), gnats.el is the emacs "interface" and "query.c" and "cmds.c" are actually honest pieces of code doing something nontrivial, which is mostly string parsing and hand-dealing with the minutiae of its text-based (think: ports tree) database. It's like a parody of the Hello, world parody.
I will officially make it my mission to thwack anyone building his or hers own ad-hoc database of anything on the head from now on.
As for GNATS, if I ever achieve some proverbial quality time with it, I will probably rewrite it (surprise, surprise) with Lua and SQLite. I estimate it could be rewritten in less than 1000 lines in such a sane programming environment.