August 25, 2023
by Matt Raines

Looking back to 2004

« 2002 | 2003 | 2004 | 2005 | 2006 »

Tim working at our exhibition stand at a 2004 Lib Dem conference

Our main focus this year was the continued growth of our Lib Dem website platform and by the end of 2004 we reached 175 customers including regions, MPs, MEPs, associated organisations like Liberty Network and ALDC, a portal for returning officers and the London mayoral campaign. This meant we needed our first replacement server which I was proud to tell Tim had 2 CPUs, 80GB of hard disk, and a whole gigabyte of RAM.

WOOOOOOOOSh [said the server]. Nice looking kit. — Tim Prater

The service included hosted email, redirection, and email marketing and popular automated features including a regular daily, weekly or monthly email newsletter featuring new content posted on the site and a free use shared photo library. There were forums and petitions, opinion polls and one click election result bar charts, event calendars and PayPal donations, restricted access members areas too. We built our first design in conjunction with a third party designer, 20:20 London, who created a design for the Green Liberal Democrats which we were able to integrate into our custom CMS code.

I didn’t assume when I got involved making political websites in the United Kingdom that internationalisation would be a required skill, but this year marked the first time (out of three so far) we had to make a big overhaul of the codebase to support both a Welsh language version and the letter Ö.

Spring 2004 was the first conference where we successfully hooked up a laptop to a mobile phone Internet connection. It never worked very well in the depths of a conference centre exhibition room, but it marked the beginning of the end of venues charging us hundreds of pounds a day for a wired connection to demo on. By the autumn we were so confident of our connection we were advertising “sign up at conference, be online by Charles [Kennedy]’s speech”.

Campaigners and reformers continued to like what we did and we were engaged to build websites for Elect The Lords and the Axe The Tax.

Prater Raines corporate website in 2004

Looking back over my emails for this year, I found several messages I sent to network abuse addresses detailing (failed) hacking attempts made against our servers. I’m not sure whether I was the only one doing this manually at the time, but it speaks to me of a different world where I thought this was (a) manageable and (b) likely to have any effect at all. These days various firewall software drops this traffic for us automatically.

Equally of its time are a few emails from customers detailing problems viewing their websites that required a trip to their offices to investigate and fix. These were clearly pre-video conferencing days (or we just liked going to the Houses of Parliament on a day trip).

I joined the British Computer Society which, at the time, provided great facilities from their base on the Embankment including an excellent library and regular lectures. An early talk I remember enjoying covered access to technology for the disabled with a particular focus on people with visual impairment. Over time paper books and a central London location have become less important but hybrid and in-person talks continue to be interesting.

We built our first blog for a customer, using Movable Type. An interesting diversion but it would be years before we investigated anything similar again, this time with WordPress which now powers a minority, but a significant minority, of all of our websites.

Tools of the trade

Location, location, location

The year in tech

Sample code

<?

/* Political Template Website PHP Source
 * Copyright  2002 - 2004 Matt Raines
 * $Id$
 */

include("globals.php");

$taxrate = 0.0375;
$incomecap = 100000;

$returnuri = SUBPATH_TO_SITE . "/localtaxcalculator.html";
inputRequirements($_POST, array("income", "earners", "allowance"), $returnuri);

$income = preg_replace("/[^0-9.]/", "", $_POST["income"]);
$earners = $_POST["earners"];
$allowance = $_POST["allowance"];
if (array_key_exists("council", $_POST) &amp;&amp; $_POST["council"] != "")
    $council = preg_replace("/[^0-9.]/", "", $_POST["council"]);
else $council = 0;

if (!is_numeric($income))
    inputError(_("You must enter your income as a whole number of pounds."), $returnuri);
if (!is_numeric($earners))
    inputError(_("The number of earners must be a number."), $returnuri);
if (!is_numeric($allowance))
    inputError(_("You must select your allowance as a whole number of pounds."), $returnuri);
if (!is_numeric($council))
    inputError(_("If you enter your council tax, you must enter a whole number of pounds."), $returnuri);

$taxableIncome = min($incomecap, max(0, $income - $earners * $allowance));
$localtax = $taxableIncome * $taxrate;

$page->subtitle = _("Local Income Tax Calculation");
$page->content->add(new Heading(_("Local Income Tax Calculation")));
$page->content->add(new Heading(_("Total Household Income:"), 3));
$page->content->add(new Paragraph(sprintf(_("%s per year."), number_format($income))));
$page->content->add(new Heading(_("Individual Allowance:"), 3));
$page->content->add(new Paragraph(sprintf(_("%s per year (based on rates for %d-%d)."),
                                          number_format($allowance), 2002, 2003)));
$page->content->add(new Heading(_("Total Allowances:"), 3));
$page->content->add(new Paragraph(sprintf(_("%s per year."), number_format($allowance * $earners))));
$page->content->add(new Heading(_("Taxable Income After Allowances:"), 3));
if ($income > $incomecap) {
    $page->content->add(new Paragraph(sprintf(_("%s per year (capped)."), number_format($taxableIncome))));
} else {
    $page->content->add(new Paragraph(sprintf(_("%s per year."), number_format($taxableIncome))));
}
$page->content->add(new Heading(_("Local Income Tax:"), 3));
$page->content->add(new Paragraph(sprintf(_("%s per year."), number_format($localtax))));
$page->content->add(new Heading(_("Current Council Tax:"), 3));
if ($council) {
    $page->content->add(new Paragraph(sprintf(_("%s per year."), number_format($council))));
    if ($council > $localtax) {
        $page->content->add(new Heading(sprintf(_("Your household would gain under Local Income Tax by %s."),
                                                  number_format($council - $localtax)), 3));
    } else if ($council == $localtax) {
        $page->content->add(new Heading(_("Your tax bill would the same as under Council Tax. However, "
                                          . "households with a lower income than yours would be better off."), 3));
    } else {
        $page->content->add(new Heading(sprintf(_("Your tax bill would be higher than under Council Tax. "
                                                  . "You would pay %s more per year. "
                                                  . "Many lower income households would benefit."),
                                                number_format($localtax - $council)), 3));
    }
} else {
    $page->content->add(new Paragraph(_("Not supplied.")));
}
$page->content->add(new Paragraph(sprintf(_(
    "This tax calculator is indicative only, and is based on the average projected Local Income Tax rate of %.2f%%."
    . " Only personal tax allowances have been taken into account, and those entitled to addtional tax allowance"
    . " such as married couples allowance would see their Local Income Tax bills reduced from this projection."),
    $taxrate * 100)));
$page->content->add(new HyperLink(_("Recalculate these figures"), "localtaxcalculator.html"));
$page->show();

?>