Old Content   This page is now considerably out-of-date.
How it works


This website is running on a box called Dvorak, which hosts The Unfinished Project. This is a collection of friends who run the server together. It's hosted by Gradwell.


All the server software I use is free:

Server setup

pajhome.org.uk is an Apache virtual host, with *.pajhome.org.uk as an alias. The website is mostly static, but a couple of CGI scripts work using a MySQL back-end. mod_rewrite is used to redirect people when a page changes its URL. There's also a rule to detect users that inadvertently browse to the stats from another site, and redirect them to the homepage. Most of the pages are uploaded from my computer, but the stats section is automatically updated by Webalizer each night.

Building the Site

I've written my own program called Pipp to build websites. Every so often I make a .tar.gz file, transfer this to my server using scp, and then unpack it to publish the new site.

I must mention one piece of commercial software now - TextPad. This is a fantastic Windows text editor that makes all my file editing quick and reliable. It is dead easy to integrate with the command line, so that "tp filename" loads the file straight away, and the call doesn't block.

HTML Compatibility

I aspire to make the site HTML 4 and XHTML compatible, and to display correctly in Netscape 4, Mozilla, IE and Opera. I've no desire to maintain backward compatibility with pre-CSS browsers. The site will never require Java or JavaScript for basic navigation, but will use them as bells and whistles.

The guest book contains some clever fall-back code:

<a href="guest.py?detail=$$id" target=detail onclick="return !window.open('guest.py?detail=$$id', 'detail', 'dependent=yes, toolbar=no, status=no, menubar=no, location=no, width=500, height=300, resizable=yes, scrollbars=yes')">more...</a>

With JavaScript enabled, a popup window is opened with size, etc. specified, and the return value prevents the link being followed. Without JavaScript, the link is followed, and the target= attribute opens a new window, albeit without the options the JavaScript is able to set.

© 1998 - 2012 Paul Johnston, distributed under the BSD License   Updated:10 Jun 2009