diff --git a/Distribution/ArchLinux/AUR.hs b/Distribution/ArchLinux/AUR.hs
--- a/Distribution/ArchLinux/AUR.hs
+++ b/Distribution/ArchLinux/AUR.hs
@@ -9,7 +9,9 @@
 module Distribution.ArchLinux.AUR (
         AURInfo(..),
         info,
-        search
+        search,
+        package
+
     ) where
 
 {-
@@ -37,7 +39,12 @@
 import Text.PrettyPrint.HughesPJClass
 import qualified Data.Map as M
 import Control.Monad
+import System.FilePath
+import Data.List
+import Data.Char
 
+import Distribution.ArchLinux.PkgBuild
+
 ------------------------------------------------------------------------
 
 -- | Query AUR for information on a package 
@@ -68,7 +75,64 @@
         Right a -> flatten a
 
 ------------------------------------------------------------------------
+--
+-- TODO: programmatically list all packages by arch-haskell
+-- generate table of versions.
+-- colour out of date things.
+--
 
+-- | Return the parsed PKGBUILD
+-- pkgbuild :: String -> IO (Either String [String]) -- (Either String PkgBuild)
+
+package :: String -> IO (Either String AURInfo, Either String AnnotatedPkgBuild)
+package m = do
+    v <- info m
+    case v of
+        Left s  -> return $ (Left s, Left "No PKGBUILD found")
+        Right p -> do
+            let name   = packageName p
+                aurUrl = "http://aur.archlinux.org/packages" </> name </> name </> "PKGBUILD"
+
+            rsp <- simpleHTTP (getRequest aurUrl)
+            case rsp of
+                 Left err -> return $ (Right p, Left (show err))
+                 Right _  -> do
+                    pkg <- getResponseBody rsp -- TODO 404
+                    case decodePackage pkg of
+                         Left e ->  return (Right p, Left e)
+                         Right k -> return (Right p, Right k)
+
+------------------------------------------------------------------------
+--
+-- TODO:
+-- generate report on packages. groupBy
+--
+
+-- | List packages not built with up to date version of cabal2arch
+{-
+lint_cabal2arch = do
+    aurs <- search "haskell"
+    forM_ aurs $ \aur -> do
+        let n = packageName aur
+        k <- pkgbuild n
+        case k of
+             Left _ -> putStrLn $ "No pkgbuild for" ++ packageName aur
+             Right p -> do
+
+                case cabal2arch_version p of
+                     v | v == simpleParse "0.6"
+                             -> putStrLn $ "GOOD " ++ packageName aur 
+
+                     v       -> do putStrLn $ "Missing cabal2arch version for: " ++ packageName aur ++ " " ++ show v
+                                   putStrLn $ "http://aur.archlinux.org/packages.php?ID=" ++ show ( packageID aur)
+                                   putStrLn ""
+-}
+
+------------------------------------------------------------------------
+--
+-- TODO: from the packagename, construct the url to the AUR page.
+--
+
 -- | URL for AUR RPC server
 url :: Doc
 url = text "http://aur.archlinux.org/rpc.php"
@@ -120,6 +184,7 @@
 data AURInfo
     = AURInfo {
          packageID        :: Integer                        -- ^ unique ID of the package on AUR
+        ,packageURLinAUR  :: String                         -- ^ url of AUR package
         ,packageName      :: String                         -- ^ string name of package
         ,packageVersion   :: Either String (Version,String) -- ^ either the AUR version (version,rev)  or a string
         ,packageCategory  :: Integer                        -- ^ numeric category of the package (e.g. 17 == System)
@@ -197,8 +262,11 @@
                                         Just v  -> Right (v, tail xs)
                 | otherwise         = Left vers__
 
+        id_ident = read (fromJSString id_)
+
     return $ AURInfo {
-                packageID          = read (fromJSString id_)
+                packageID          = id_ident
+               ,packageURLinAUR    = "http://aur.archlinux.org/packages.php?ID=" ++ show id_ident
                ,packageName        = fromJSString name_
                ,packageVersion     = version
                ,packageCategory    = read (fromJSString cat_)
diff --git a/Distribution/ArchLinux/PkgBuild.hs b/Distribution/ArchLinux/PkgBuild.hs
new file mode 100644
--- /dev/null
+++ b/Distribution/ArchLinux/PkgBuild.hs
@@ -0,0 +1,458 @@
+{-# LANGUAGE TypeSynonymInstances        #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+-- |
+-- Module    : Distribution.ArchLinux.PkgBuild
+-- Copyright : (c) Don Stewart, 2008-2009
+-- License   : BSD3
+--
+-- Maintainer: Don Stewart <dons@galois.com>
+--
+
+module Distribution.ArchLinux.PkgBuild where
+
+import Distribution.Text
+import Distribution.Version
+import Distribution.PackageDescription
+import Distribution.Package
+import Distribution.License
+
+import Text.PrettyPrint
+import Data.List
+import Data.Monoid
+import Data.Maybe
+import Debug.Trace
+
+import Control.Monad
+import Control.Monad.Instances
+import Data.Char
+import Numeric
+
+
+--
+-- | A data type to represent PKGBUILD files
+--
+data PkgBuild =
+  PkgBuild
+    { arch_pkgname :: String
+        -- ^
+        -- The name of the package. This has be a unix-friendly name
+        -- as it will be used in the package filename.
+    , arch_pkgver  :: Version
+        -- ^ The version of the software as released from the authorii
+        --  (e.g. ´2.7.1´).
+    , arch_pkgrel  :: !Int
+        -- ^
+        --  This is the release number specific to the Arch Linux
+        -- release. This allows package maintainers to make updates to
+        -- the package´s configure flags, for example. A pkgrel of 1
+        -- is typically used for each upstream software release and is
+        -- incremented for intermediate PKGBUILD updates.
+    , arch_pkgdesc :: String
+        -- ^
+        -- This should be a brief description of the package and its
+        -- functionality. Try to keep the description to one line of text.
+    , arch_arch    :: ArchList ArchArch
+        -- ^
+        -- Defines on which architectures the given package is
+        -- available (e.g. arch=(´i686´ ´x86_64´)).
+    , arch_url     :: String
+        -- ^
+        -- This field contains a URL that is associated with the software
+        -- being packaged. This is typically the project´s website.
+    , arch_license :: ArchList License
+        -- ^
+        -- This field specifies the license(s) that apply to the package.
+        -- Commonly-used licenses are found in /usr/share/licenses/common. If
+        -- you see the package´s license there, simply reference it in the
+        -- license field (e.g.  license=(´GPL´)). If the package provides a
+        -- license not found in /usr/share/licenses/common, then you should
+        -- include the license in the package itself and set
+        -- license=(´custom´) or license=(´custom:LicenseName´). The license
+        -- should be placed in $pkgdir/usr/share/licenses/$pkgname when
+        -- building the package. If multiple licenses are applicable for a
+        -- package, list all of them: license=(´GPL´ ´FDL´).
+    , arch_makedepends :: ArchList ArchDep
+        -- ^
+        -- An array of packages that this package depends on to build, but are
+        -- not needed at runtime. Packages in this list follow the same format
+        -- as depends.
+
+    , arch_depends     :: ArchList ArchDep
+        -- ^
+        -- An array of packages that this package depends on to run. Packages
+        -- in this list should be surrounded with single quotes and contain at
+        -- least the package name. Entries can also include a version
+        -- requirement of the form name<>version, where <> is one of five
+        -- comparisons: >= (greater than or equal to), <= (less than or equal
+        -- to), = (equal to), > (greater than), or < (less than).
+    , arch_source      :: ArchList String
+        -- ^
+        -- An array of source files required to build the package. Source
+        -- files must either reside in the same directory as the PKGBUILD
+        -- file, or be a fully-qualified URL that makepkg will use to download
+        -- the file. In order to make the PKGBUILD as useful as possible, use
+        -- the $pkgname and $pkgver variables if possible when specifying the
+        -- download location. Any files that are compressed will automatically
+        -- be extracted, unless found in the noextract array listed below.
+    , arch_md5sum      :: ArchList String
+        -- ^
+        -- This array contains an MD5 hash for every source file specified in
+        -- the source array (in the same order). makepkg will use this to
+        -- verify source file integrity during subsequent builds. To easily
+        -- generate md5sums, run “makepkg -g >> PKGBUILD”. If desired, move
+        -- the md5sums line to an appropriate location.  NOTE: makepkg
+        -- supports multiple integrity algorithms and their corresponding
+        -- arrays (i.e. sha1sums for the SHA1 algorithm); however, official
+        -- packages use only md5sums for the time being.
+    , arch_build        :: [String]
+        -- ^
+        -- The build hook
+
+    , arch_install      :: Maybe String
+        -- ^
+        -- Specifies a special install script that is to be included in the package. This
+        -- file should reside in the same directory as the PKGBUILD, and will be copied
+        -- into the package by makepkg. It does not need to be included in the source
+        -- array (e.g.  install=pkgname.install).
+            --
+    , arch_options      :: ArchList ArchOptions
+        -- ^
+        -- This array allows you to override some of makepkg´s default behavior when
+        -- building packages. To set an option, just include the option name in the
+        -- options array. To reverse the default behavior, place an “!” at the front of
+        -- the option. Only specify the options you specifically want to override, the
+        -- rest will be taken from makepkg.conf(5).  NOTE: force is a special option only
+        -- used in a PKGBUILD(5), do not use it unless you know what you are doing.
+
+    }
+    deriving (Show, Eq)
+
+data ArchOptions
+    = Strip
+    deriving (Show, Eq)
+
+--
+-- | An empty PKGBUILD
+--
+emptyPkgBuild :: PkgBuild
+emptyPkgBuild =
+  PkgBuild
+    { arch_pkgname     = display $ pkgName (package e)
+    , arch_pkgver      = pkgVersion (package e)
+    , arch_pkgrel      = 1
+    , arch_pkgdesc     = synopsis e
+    , arch_arch        = ArchList [Arch_X86, Arch_X86_64]
+    , arch_url         = homepage e
+    , arch_license     = ArchList [license e]
+
+    -- everything depends on ghc and Cabal 1.4.x
+    , arch_makedepends = ArchList
+        [(ArchDep (Dependency (PackageName "ghc")    AnyVersion))
+        ,(ArchDep (Dependency (PackageName "haskell-cabal") AnyVersion))
+--        ,(ArchDep (Dependency "haskell-cabal" (LaterVersion (Version  [1,4,0,0] []))))
+        ]
+
+        -- makedepends=('ghc>=6.6') ?
+    , arch_depends     = ArchList []
+    , arch_source      = ArchList []
+    , arch_md5sum      = ArchList []
+        -- sha1sums=('a08670e4c749850714205f425cb460ed5a0a56b2')
+    , arch_build       = []
+    , arch_install     = Nothing  -- executable
+    , arch_options     = ArchList [Strip]
+    }
+  where
+    e = emptyPackageDescription
+
+------------------------------------------------------------------------
+-- Extra pretty printer instances and types
+
+newtype ArchDep = ArchDep Dependency
+  deriving (Eq,Show)
+
+instance Text ArchOptions where
+  disp Strip = text "strip"
+  parse = undefined
+
+-- the PKGBUILD version spec is less expressive than cabal, we can't
+-- really handle unions or intersections well yet.
+
+instance Text ArchDep where
+  disp (ArchDep (Dependency name ver)) =
+    text (display name) <> mydisp ver
+   where
+     --  >= (greater than or equal to), <= (less than or
+     --  equal to), = (equal to), > (greater than), or <
+      mydisp AnyVersion           = empty
+
+      mydisp (ThisVersion    v)   = text "=" <> disp v
+      mydisp (LaterVersion   v)   = char '>' <> disp v
+      mydisp (EarlierVersion v)   = char '<' <> disp v
+
+      mydisp (UnionVersionRanges (ThisVersion  v1) (LaterVersion v2))
+        | v1 == v2 = text ">=" <> disp v1
+      mydisp (UnionVersionRanges (LaterVersion v2) (ThisVersion  v1))
+        | v1 == v2 = text ">=" <> disp v1
+      mydisp (UnionVersionRanges (ThisVersion v1) (EarlierVersion v2))
+        | v1 == v2 = text "<=" <> disp v1
+      mydisp (UnionVersionRanges (EarlierVersion v2) (ThisVersion v1))
+        | v1 == v2 = text "<=" <> disp v1
+
+{-
+      mydisp (UnionVersionRanges r1 r2)
+        = disp r1 <+> text "||" <+> disp r2
+
+      mydisp (IntersectVersionRanges r1 r2)
+        = disp r1 <+> text "&&" <+> disp r2
+-}
+
+      mydisp x = trace ("WARNING: Can't handle this version format yet: " ++ show x ++ "\ncheck the dependencies by hand.")$ empty
+
+  parse = undefined
+
+--
+-- | Valid linux platforms
+--
+data ArchArch = Arch_X86 | Arch_X86_64
+    deriving (Show, Eq)
+
+instance Text ArchArch where
+    disp x = case x of
+       Arch_X86      -> text "i686"
+       Arch_X86_64   -> text "x86_64"
+    parse = error "Text.parrse not defined for ArchList"
+
+-- Lists with quotes
+newtype ArchList a = ArchList [a]
+  deriving (Show, Eq, Monoid, Functor)
+
+instance Text String where
+    disp s = text s
+    parse = error "Text.parse not defined for String"
+
+instance Text a => Text (ArchList a) where
+    disp (ArchList xs) =
+         parens (hcat
+                (intersperse space
+                    (map (quotes . disp) xs)))
+    parse = error "Text.parse not defined for ArchList"
+
+-- | Printing with no quotes
+dispNoQuotes :: Text a => ArchList a -> Doc
+dispNoQuotes (ArchList xs) =
+         parens (hcat
+                (intersperse space
+                    (map disp xs)))
+
+
+------------------------------------------------------------------------
+-- Support for parsing PKGBULIDs
+
+-- | A PKGBUILD data structure with additional metadata
+data AnnotatedPkgBuild =
+     AnnotatedPkgBuild
+        {pkgBuiltWith :: Maybe Version   -- ^ version of cabal2arch used, if any
+        ,pkgHeader    :: String          -- ^ header strings
+        ,pkgBody      :: PkgBuild }      -- ^ contents of pkgbuild file
+    deriving (Eq, Show)
+
+-- | Empty state structure
+emptyPkg :: AnnotatedPkgBuild
+emptyPkg = AnnotatedPkgBuild
+    { pkgBuiltWith = Nothing
+    , pkgHeader    = []
+    , pkgBody      = emptyPkgBuild { arch_options = ArchList []
+                                , arch_makedepends = ArchList []
+                                }
+    }
+
+-- | Result type for pkgbuild parsers
+type ResultP a = Either String a
+
+decodePackage :: String -> ResultP AnnotatedPkgBuild
+decodePackage s = runGetPKG (readPackage emptyPkg) s
+
+-- | The type of pkgbuild parsers for String
+newtype GetPKG a = GetPKG { un :: String -> Either String (a,String) }
+
+instance Functor GetPKG where fmap = liftM
+
+instance Monad GetPKG where
+  return x       = GetPKG (\s -> Right (x,s))
+  fail x         = GetPKG (\_ -> Left x)
+  GetPKG m >>= f = GetPKG (\s -> case m s of
+                                     Left err -> Left err
+                                     Right (a,s1) -> un (f a) s1)
+
+------------------------------------------------------------------------
+
+-- | Run a PKG reader on an input String, returning a PKGBUILD
+runGetPKG :: GetPKG a -> String -> ResultP a
+runGetPKG (GetPKG m) s = case m s of
+     Left err    -> Left err
+     Right (a,t) -> case t of
+                        [] -> Right a
+                        _  -> Left $ "Invalid tokens at end of PKG string: "++ show (take 10 t)
+
+getInput   :: GetPKG String
+getInput    = GetPKG (\s -> Right (s,s))
+
+setInput   :: String -> GetPKG ()
+setInput s  = GetPKG (\_ -> Right ((),s))
+
+(<$>) :: Functor f => (a -> b) -> f a -> f b
+x <$> y = fmap x y
+
+------------------------------------------------------------------------
+
+-- read until end of line
+line s = case break (== '\n') s of
+    (h , _ : rest) -> do
+        setInput rest
+        return h
+
+-- | Recursively parse the pkgbuild
+--
+readPackage :: AnnotatedPkgBuild -> GetPKG AnnotatedPkgBuild
+readPackage st = do
+  cs <- getInput
+
+  case cs of
+    _ | "# Contributor"       `isPrefixOf` cs -> do
+            h <- line cs
+            readPackage st { pkgHeader = h }
+
+      | "# Package generated" `isPrefixOf` cs -> do
+            h <- line cs
+            let v = simpleParse
+                    . reverse
+                    . takeWhile (not . isSpace)
+                    . reverse $ h
+            readPackage st { pkgBuiltWith = v }
+
+      | "pkgname="  `isPrefixOf` cs -> do
+            h <- line cs
+            let s = drop 8 h
+            readPackage st { pkgBody = (pkgBody st) { arch_pkgname = s } }
+
+      | "pkgrel="   `isPrefixOf` cs -> do
+            h <- line cs
+            let s = drop 7 h
+            readPackage st { pkgBody = (pkgBody st) { arch_pkgrel = read s } }
+
+      | "pkgver="   `isPrefixOf` cs -> do
+            h <- line cs
+            let s = drop 7 h
+            case simpleParse s of
+                Nothing -> fail $ "Unable to parse package version"
+                Just v  -> readPackage st { pkgBody = (pkgBody st) { arch_pkgver = v } }
+
+      | "pkgdesc="  `isPrefixOf` cs -> do
+            h <- line cs
+            let s = drop 8 h
+            readPackage st { pkgBody = (pkgBody st) { arch_pkgdesc = s } }
+
+      | "url="      `isPrefixOf` cs -> do
+            h <- line cs
+            let s = drop 4 h
+            readPackage st { pkgBody = (pkgBody st) { arch_url = s } }
+
+      | "license="  `isPrefixOf` cs -> do
+            h <- line cs
+            let s = takeWhile (/= '\'')
+                    . drop 1
+                    . dropWhile (/= '\'')
+                    . drop 8 $ h
+                s' | "custom:" `isPrefixOf` s = drop 7 s
+                   | otherwise                = s
+
+            case simpleParse s' of
+                Nothing -> readPackage st { pkgBody = (pkgBody st) { arch_license = ArchList [UnknownLicense s'] } }
+                Just l  -> readPackage st { pkgBody = (pkgBody st) { arch_license = ArchList [l] } }
+
+    -- do these later:
+
+      | "arch="     `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "makedepends=" `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "depends="  `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "options="  `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "source="   `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "install="  `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "md5sums="  `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+      | "build()"   `isPrefixOf` cs
+            -> do setInput [] ; return st
+
+    -- skip comments
+      | "#" `isPrefixOf` cs
+            -> do _ <- line cs ; readPackage st
+
+      | otherwise -> fail $ "Malformed PKGBUILD: " ++ take 80 cs
+
+
+------------------------------------------------------------------------
+
+
+
+{-
+# Contributor: Arch Haskell Team <arch-haskell@haskell.org>
+# Package generated by cabal2arch 0.6.1
+pkgname=haskell-pcre-light
+pkgrel=2
+pkgver=0.3.1
+pkgdesc="A small, efficient and portable regex library for Perl 5 compatible regular expressions"
+url="http://hackage.haskell.org/package/pcre-light"
+license=('custom:BSD3')
+arch=('i686' 'x86_64')
+makedepends=()
+depends=('ghc' 'haskell-cabal' 'pcre')
+options=('strip')
+source=(http://hackage.haskell.org/packages/archive/pcre-light/0.3.1/pcre-light-0.3.1.tar.gz)
+install=haskell-pcre-light.install
+md5sums=('14d8d6e2fd200c385b1d63c888794014')
+build() {
+    cd ${srcdir}/pcre-light-0.3.1
+    runhaskell Setup configure --prefix=/usr --docdir=/usr/share/doc/${pkgname} || return 1
+    runhaskell Setup build                   || return 1
+    runhaskell Setup haddock || return 1
+    runhaskell Setup register   --gen-script || return 1
+    runhaskell Setup unregister --gen-script || return 1
+    install -D -m744 register.sh   ${pkgdir}/usr/share/haskell/$pkgname/register.sh
+    install    -m744 unregister.sh ${pkgdir}/usr/share/haskell/$pkgname/unregister.sh
+    install -d -m755 $pkgdir/usr/share/doc/ghc/libraries
+    ln -s /usr/share/doc/${pkgname}/html ${pkgdir}/usr/share/doc/ghc/libraries/pcre-light
+    runhaskell Setup copy --destdir=${pkgdir} || return 1
+    install -D -m644 LICENSE ${pkgdir}/usr/share/licenses/$pkgname/LICENSE || return 1
+    rm -f ${pkgdir}/usr/share/doc/${pkgname}/LICENSE
+}
+    -}
+
+------------------------------------------------------------------------
+-- Checker
+--
+
+type Warnings = String
+
+-- Hard code the cabal2arch version
+recentCabal2ArchVersion :: Maybe Version
+recentCabal2ArchVersion = case simpleParse "0.4" of
+    Nothing -> error "Unable to parse cabal2arch version"
+    Just v  -> Just v
+
+-- | Look for problems in the PKGBUILD
+oldCabal2Arch :: AnnotatedPkgBuild -> Bool
+oldCabal2Arch s
+    | isNothing (pkgBuiltWith s)
+    = True
+
+    | pkgBuiltWith s < recentCabal2ArchVersion
+    = True -- ["Old version of cabal2arch: " ++ display (fromJust (pkgBuiltWith s))]
+
+    | otherwise                             = False
+
diff --git a/Distribution/ArchLinux/Report.hs b/Distribution/ArchLinux/Report.hs
new file mode 100644
--- /dev/null
+++ b/Distribution/ArchLinux/Report.hs
@@ -0,0 +1,233 @@
+
+-- | Construct reports about a set of packages in AUR
+--
+module Distribution.ArchLinux.Report where
+
+import Distribution.ArchLinux.AUR
+import Distribution.ArchLinux.PkgBuild
+
+import Distribution.Text
+
+import System.FilePath
+import Data.Maybe
+
+import Text.XHtml.Transitional
+import Control.OldException
+import Control.Monad
+import Data.List
+import Data.Ord
+import Data.Char
+
+import System.Directory
+import System.Environment
+import System.Exit
+import System.FilePath
+import Control.Concurrent
+import qualified Control.OldException as C
+import System.IO
+import System.Process
+
+-- | Take as input a list of package names, return a pandoc object
+-- reporting on interesting facts about the packages.
+--
+report :: [String] -> IO String
+report xs = do
+    -- collect sets of results
+    res_ <- forM xs $ \p -> do
+        handle (\s -> return (p, Nothing, (Left (show s), Left []))) $ do
+            putStrLn $ "Retrieving " ++ p
+            k <- package p
+
+            -- if there is a hackage path, lookup version.
+            --  cabal info xmonad -v0
+            vers <- case k of
+
+                 (Right aur, _) | not (null (packageURL aur))  -> do
+                     let name = takeFileName (packageURL aur) -- haskell package name
+                     v <- myReadProcess "cabal" ["info","-v0",name] []
+                     return $! case v of
+                          Left _  -> Nothing
+                          Right s -> let v = reverse
+                                          . takeWhile (not . isSpace )
+                                          . reverse
+                                          . (\k -> case find ("Latest version available" `isInfixOf`) k of
+                                                 Nothing -> []
+                                                 Just n  -> n )
+                                          $ lines s
+
+                                     in simpleParse v
+                 _ -> return Nothing
+
+            return (p, vers, k)
+
+    let results = sortBy (\(n,_,_) (m,_,_) -> n `compare` m) res_
+
+    return. showHtml $
+        (header $
+            (thetitle (toHtml "Arch Haskell Package Report")) +++
+            ((thelink noHtml) ! [ rel "stylesheet"
+                                , href "http://galois.com/~dons/arch-haskell.css"
+                                , thetype "text/css" ])) +++
+
+        (body $
+            center ((h2 (toHtml "Arch Haskell Package Status")))
+            +++
+
+            (scores . table $
+                tr (concatHtml
+                      [ td . categoryTag . toHtml $ "Package"
+                      , td . categoryTag . toHtml $ "Hackage"
+                      , td . categoryTag . toHtml $ "Version"
+                      , td . categoryTag . toHtml $ "Latest"
+                      , td . categoryTag . toHtml $ "cabal2arch"
+                      , td . categoryTag . toHtml $ "Votes"
+                      , td . categoryTag . toHtml $ "Description"
+                      ]) +++
+
+                concatHtml
+
+                    [
+
+                     tr $ concatHtml $
+                      case aur_ of
+                       Left  err ->
+                          [ td $ toHtml p
+                          , td $ bad (toHtml "No AUR entry found!")
+                          ]
+
+                       Right aur -> case pkg_ of
+
+                        -- Didn't find a PKGBUILD
+                         Left  err ->
+                          [ td . toHtml $
+                              hotlink
+                                (packageURLinAUR aur)
+                                (toHtml p)
+
+                          , td .
+                              (if null (packageURL aur) then bad else id) . toHtml $
+                              hotlink
+                                (packageURL aur)
+                                (toHtml (takeFileName (packageURL aur)))
+
+                          , td  $ case packageVersion aur of
+                                     Left s  -> bad $ toHtml s
+                                     Right (v,_) -> toHtml $ display v
+
+                          , td  $
+
+                              case vers of
+                                   Nothing -> bad (toHtml "-")
+                                   Just v  -> case packageVersion aur of
+                                     Left s  -> toHtml (display v)
+                                     Right (v',_) | v == v' -> toHtml (display v)
+                                                 | otherwise -> bad (toHtml (display v))
+
+                          , td $ bad (toHtml "PKGBUILD not found")
+
+                          , td  $ if packageVotes aur > 10
+                                     then good $ toHtml $ show $ packageVotes aur
+                                     else        toHtml $ show $ packageVotes aur
+
+                          , td $ toHtml $ packageDesc aur
+                          ]
+
+                        -- Found everything
+                         Right pkg ->
+                          [ td . toHtml $
+                              hotlink
+                                (packageURLinAUR aur)
+                                (toHtml p)
+
+                          , td .
+                              (if null (packageURL aur) then bad else id) . toHtml $
+                              hotlink
+                                (packageURL aur)
+                                (toHtml (takeFileName (packageURL aur)))
+
+                          , td  $
+                                case packageVersion aur of
+                                     Left s  -> bad $ toHtml s
+                                     Right (v,_) -> toHtml $ display v
+
+                          , td  $
+                              case vers of
+                                   Nothing -> bad (toHtml "-")
+                                   Just v  -> case packageVersion aur of
+                                     Left s  -> toHtml (display v)
+                                     Right (v',_) | v == v' -> toHtml (display v)
+                                                 | otherwise -> bad (toHtml (display v))
+
+                          , td  $
+                              if oldCabal2Arch pkg
+                                 then bad . toHtml $
+                                            case pkgBuiltWith pkg of
+                                                     Nothing -> "Nothing"
+                                                     Just v  -> display v
+
+                                 else toHtml $
+                                            case pkgBuiltWith pkg of
+                                                     Nothing -> "Nothing"
+                                                     Just v  -> display v
+
+                          , td  $ if packageVotes aur > 10
+                                     then good $ toHtml $ show $ packageVotes aur
+                                     else        toHtml $ show $ packageVotes aur
+
+                          , td  $ toHtml $ packageDesc aur
+
+                          ]
+
+                        | (p, vers, (aur_,pkg_)) <- results
+                        ]
+                )
+            )
+
+
+    {-
+    (Right (AURInfo {packageID = 17480, packageName = "haskell-json", packageVersion = Right (Version {versionBranch = [0,4,3], versionTags = []},"1"), packageCategory = 10, packageDesc = "Support for serialising Haskell to and from JSON", packageLocation = 2, packageURL = "http://hackage.haskell.org/cgi-bin/hackage-scripts/package/json", packagePath = "/packages/haskell-json/haskell-json.tar.gz", packageLicense = "custom:BSD3", packageVotes = 16, packageOutOfDate = False}),Right (AnnotatedPkgBuild {pkgBuiltWith = Just (Version {versionBranch = [0,5,3], versionTags = []}), pkgHeader = "# Contributor: Arch Haskell Team <arch-haskell@haskell.org>", pkgBody = PkgBuild {arch_pkgname = "haskell-json", arch_pkgver = Version {versionBranch = [0,4,3], versionTags = []}, arch_pkgrel = 1, arch_pkgdesc = "\"Support for serialising Haskell to and from JSON\"", arch_arch = ArchList [Arch_X86,Arch_X86_64], arch_url = "\"http://hackage.haskell.org/cgi-bin/hackage-scripts/package/json\"", arch_license = ArchList [BSD3], arch_makedepends = ArchList [], arch_depends = ArchList [], arch_source = ArchList [], arch_md5sum = ArchList [], arch_build = [], arch_install = Nothing, arch_options = ArchList []}}))
+    -}
+
+categoryTag  x = thediv x ! [identifier "Category"    ]
+bad     x = thediv x ! [identifier "Bad"  ]
+good    x = thediv x ! [identifier "Best" ]
+scores  x = thediv x ! [identifier "Scores" ]
+
+
+------------------------------------------------------------------------
+
+--
+-- Strict process reading
+--
+myReadProcess :: FilePath                              -- ^ command to run
+            -> [String]                              -- ^ any arguments
+            -> String                                -- ^ standard input
+            -> IO (Either (ExitCode,String,String) String)  -- ^ either the stdout, or an exitcode and any output
+
+myReadProcess cmd args input = C.handle (return . handler) $ do
+    (inh,outh,errh,pid) <- runInteractiveProcess cmd args Nothing Nothing
+
+    output  <- hGetContents outh
+    outMVar <- newEmptyMVar
+    forkIO $ (C.evaluate (length output) >> putMVar outMVar ())
+
+    errput  <- hGetContents errh
+    errMVar <- newEmptyMVar
+    forkIO $ (C.evaluate (length errput) >> putMVar errMVar ())
+
+    when (not (null input)) $ hPutStr inh input
+    takeMVar outMVar
+    takeMVar errMVar
+    ex     <- C.catch (waitForProcess pid) (\_e -> return ExitSuccess)
+    hClose outh
+    hClose inh          -- done with stdin
+    hClose errh         -- ignore stderr
+
+    return $ case ex of
+        ExitSuccess   -> Right output
+        ExitFailure _ -> Left (ex, errput, output)
+
+  where
+    handler (C.ExitException e) = Left (e,"","")
+    handler e                   = Left (ExitFailure 1, show e, "")
+
diff --git a/TODO b/TODO
new file mode 100644
--- /dev/null
+++ b/TODO
@@ -0,0 +1,19 @@
+
+    * lint checker
+        -- for all our packages, check they are consistent
+
+    * hackage version checker
+        -- automatically check versions between hackage and AUR
+
+    * cabal2arch version checker
+        -- list all packages that were generated with which version of cabal2arch,
+            then auto-rebuild
+
+    * regression builds
+
+Oh,also, anyone know how I can get the full list of arch-haskell
+maintained packages from AUR programmatically? I've found only very
+sparse documentation for the JSON interface.
+
+If we could get the full package list, we can do regression builds.
+
diff --git a/archlinux.cabal b/archlinux.cabal
--- a/archlinux.cabal
+++ b/archlinux.cabal
@@ -1,5 +1,5 @@
 name:           archlinux
-version:        0.1
+version:        0.2
 license:        BSD3
 license-file:   LICENSE
 author:         Don Stewart <dons@galois.com>
@@ -23,13 +23,19 @@
 cabal-version:  >= 1.2.3
 
 library
-    build-depends:  base < 6,
+    build-depends:  base >= 4 && < 6,
                     HTTP,
                     Cabal >= 1.6,
                     json,
                     pretty,
                     prettyclass,
-                    containers
+                    containers,
+                    filepath,
+                    xhtml,
+                    process,
+                    directory
 
     exposed-modules:
         Distribution.ArchLinux.AUR
+        Distribution.ArchLinux.PkgBuild
+        Distribution.ArchLinux.Report
diff --git a/scripts/arch-haskell-packages.txt b/scripts/arch-haskell-packages.txt
new file mode 100644
--- /dev/null
+++ b/scripts/arch-haskell-packages.txt
@@ -0,0 +1,1271 @@
+addlicenseinfo
+agda-executable
+armada
+arrowp
+augur
+haskell-autoproc
+backdropper
+bacteria
+baskell
+beautifhol
+bloxorz
+bookshelf
+c2hs
+cabal-rpm
+cabal2arch
+cabal2doap
+cabal2spec
+cabalgraph
+cap
+change-monger
+cheatsheet
+clevercss
+clustertools
+conjure
+cpbrainfuck
+cpphs
+curry-frontend
+darcs
+darcs-beta
+darcs-graph
+darcs-monitor
+darcswatch
+datapacker
+defendtheking
+dephd
+derive
+distract
+djinn
+doctest
+drift
+ehaskell
+elerea-examples
+emping
+equal-files
+estreps
+fallingblocks
+feed-cli
+flippi
+flow2dot
+flower
+foo
+fquery
+fractal
+frag
+ftshell
+gameclock
+geniconvert
+ghc-core
+ghci-haskeline
+gitit
+glome-hs
+graphmod
+greencard
+guihaskell
+hackage-sparks
+hackage2twitter
+haddock
+happraise
+happs-tutorial
+hashell
+hask-home
+haskeem
+haskell-ac-easyraster-gtk
+haskell-ac-halfinteger
+haskell-ac-vector
+haskell-acme-now
+haskell-action-permutations
+haskell-actor
+haskell-adaptive
+haskell-adaptive-containers
+haskell-adhoc-network
+haskell-aern-net
+haskell-aern-real
+haskell-aern-rntorm
+haskell-aern-rntorm-plot
+haskell-agda
+haskell-agi
+haskell-algebra
+haskell-alloy
+haskell-alloy-proxy-fd
+haskell-alsa
+haskell-alsa-midi
+haskell-alut
+haskell-ansi-terminal
+haskell-ansi-wl-pprint
+haskell-antimirov
+haskell-anydbm
+haskell-applepush
+haskell-applicative-extras
+haskell-applicative-numbers
+haskell-archlinux
+haskell-arff
+haskell-array
+haskell-arrayref
+haskell-arrows
+haskell-asn1
+haskell-astar
+haskell-atom
+haskell-attoparsec
+haskell-augeas
+haskell-authenticate
+haskell-avar
+haskell-avltree
+haskell-bamboo
+haskell-barracuda
+haskell-barrie
+haskell-base64-string
+haskell-basic
+haskell-benchpress
+haskell-bencode
+haskell-berkeleydb
+haskell-berkeleydbxml
+haskell-bff
+haskell-bimap
+haskell-binary
+haskell-binary-search
+haskell-binary-strict
+haskell-binarydefer
+haskell-bindings
+haskell-bindings-common
+haskell-bindings-libffi
+haskell-bindings-libusb
+haskell-bindings-sqlite3
+haskell-bindings-uname
+haskell-bio
+haskell-bitarray
+haskell-bitset
+haskell-bitsyntax
+haskell-bktrees
+haskell-blas
+haskell-blogination
+haskell-bloomfilter
+haskell-bool-extras
+haskell-boolean
+haskell-boxes
+haskell-bsd-sysctl
+haskell-buster
+haskell-buster-gtk
+haskell-buster
+haskell-byteorder
+haskell-bytestring
+haskell-bytestring-class
+haskell-bytestring-csv
+haskell-bytestring-lexing
+haskell-bytestring-mmap
+haskell-bytestring-show
+haskell-bytestring-trie
+haskell-bytestringparser
+haskell-bytestringreadp
+haskell-bzlib
+haskell-c-io
+haskell-cabalrpmdeps
+haskell-caf
+haskell-caldims
+haskell-carray
+haskell-category-extras
+haskell-cautious-file
+haskell-cc-delcont
+haskell-cedict
+haskell-cflp
+haskell-cgi
+haskell-cgi-undecidable
+haskell-chalkboard
+haskell-chalkboard-viewer
+haskell-chalmers-lava2000
+haskell-chart
+haskell-chasingbottoms
+haskell-cheatsheet
+haskell-checked
+haskell-checkers
+haskell-chp
+haskell-christmastree
+haskell-chunks
+haskell-citeproc-hs
+haskell-clase
+haskell-classify
+haskell-clientsession
+haskell-clock
+haskell-cmath
+haskell-cml
+haskell-cmonad
+haskell-coadjute
+haskell-codec-compression-lzf
+haskell-codec-image-devil
+haskell-codec-libevent
+haskell-colock
+haskell-colour
+haskell-combinat
+haskell-comonad-random
+haskell-compact-map
+haskell-compact-string
+haskell-complexity
+haskell-concurrentoutput
+haskell-condorcet
+haskell-configfile
+haskell-containers
+haskell-contarrow
+haskell-control-engine
+haskell-control-event
+haskell-control-monad-exception
+haskell-control-monad-free
+haskell-control-monad-omega
+haskell-control-monad-queue
+haskell-control-timeout
+haskell-convertible
+haskell-cordering
+haskell-core
+haskell-coreerlang
+haskell-coroutine
+haskell-couchdb
+haskell-crack
+haskell-crc16
+haskell-crypto
+haskell-cspm-frontend
+haskell-csv
+haskell-ctemplate
+haskell-curl
+haskell-data-accessor
+haskell-data-accessor-monads-fd
+haskell-data-accessor-monads-tf
+haskell-data-accessor-mtl
+haskell-data-accessor-template
+haskell-data-accessor-transformers
+haskell-data-binary-ieee754
+haskell-data-cordering
+haskell-data-default
+haskell-data-hash
+haskell-data-ivar
+haskell-data-memocombinators
+haskell-data-ordlist
+haskell-data-quotientref
+haskell-data-reify
+haskell-data-spacepart
+haskell-data-tree-avl
+haskell-data-trie-general
+haskell-data-trie-general-ordgt
+haskell-dataenc
+haskell-datetime
+haskell-dbus
+haskell-debian
+haskell-debian-binary
+haskell-debugtracehelpers
+haskell-decimal
+haskell-decisiontree
+haskell-deeparrow
+haskell-delicious
+haskell-delimited-text
+haskell-denominate
+haskell-dequeue
+haskell-derive
+haskell-derive-gadt
+haskell-diagrams
+haskell-diff
+haskell-digest
+haskell-dimensional
+haskell-directory
+haskell-directory-tree
+haskell-dlist
+haskell-dnsrbl
+haskell-dom
+haskell-dotgen
+haskell-download
+haskell-download-curl
+haskell-drhylo
+haskell-dsp
+haskell-dstring
+haskell-dwarf
+haskell-dzen-utils
+haskell-edisonapi
+haskell-edisoncore
+haskell-edit-distance
+haskell-editline
+haskell-eeconfig
+haskell-either-unwrap
+haskell-elerea
+haskell-elf
+haskell-email-validate
+haskell-emgm
+haskell-encode
+haskell-encoding
+haskell-enumsets
+haskell-erf
+haskell-errno
+haskell-esotericbot
+haskell-etherbunny
+haskell-event-handlers
+haskell-event-list
+haskell-event-monad
+haskell-executable-path
+haskell-exif
+haskell-explicit-exception
+haskell-explicit-sharing
+haskell-extensible-exceptions
+haskell-external-sort
+haskell-extra
+haskell-fad
+haskell-fair-predicates
+haskell-fastcgi
+haskell-fckeditor
+haskell-fclabels
+haskell-fec
+haskell-feed
+haskell-feed2twitter
+haskell-fez-conf
+haskell-ffeed
+haskell-fft
+haskell-fgl
+haskell-fieldtrip
+haskell-filemanip
+haskell-filepath
+haskell-filestore
+haskell-finance-quote-yahoo
+haskell-finance-treasury
+haskell-findbin
+haskell-fingertree
+haskell-fingertree-psqueue
+haskell-finitemap
+haskell-first-class-patterns
+haskell-fixpoint
+haskell-flickr
+haskell-flock
+haskell-flow2dot
+haskell-fmlist
+haskell-formlets
+haskell-forsyde
+haskell-fraction
+haskell-franchise
+haskell-free-theorems
+haskell-freesound
+haskell-fsmactions
+haskell-fst
+haskell-ftgl
+haskell-ftphs
+haskell-full-sessions
+haskell-funcmp
+haskell-fungen
+haskell-funsat
+haskell-future
+haskell-game-tree
+haskell-garsia-wachs
+haskell-gd
+haskell-generator
+haskell-genericserialize
+haskell-geoip
+haskell-ghc-mtl
+haskell-ghc-paths
+haskell-ghc-syb
+haskell-ghood
+haskell-gitit
+haskell-glfw
+haskell-glfw-ogl
+haskell-glob
+haskell-gluraw
+haskell-glut
+haskell-gmap
+haskell-gnuplot
+haskell-goa
+haskell-gofer-prelude
+haskell-googlechart
+haskell-googlesb
+haskell-gpcsets
+haskell-gps
+haskell-grapefruit-examples
+haskell-grapefruit-frp
+haskell-grapefruit-records
+haskell-grapefruit-ui
+haskell-grapefruit-ui-gtk
+haskell-graphalyze
+haskell-graphics-drawingcombinators
+haskell-graphicsformats
+haskell-graphscc
+haskell-graphviz
+haskell-gravatar
+haskell-grotetrap
+haskell-growlnotify
+haskell-gsasl
+haskell-gsl-random
+haskell-gtk2hs-cast-glade
+haskell-gtk2hs-cast-glib
+haskell-gtk2hs-cast-gnomevfs
+haskell-gtk2hs-cast-gtk
+haskell-gtk2hs-cast-gtkglext
+haskell-gtk2hs-cast-gtksourceview2
+haskell-gtk2hs-cast-th
+haskell-gtk2hs-rpn
+haskell-gtk2hsgenerics
+haskell-hack
+haskell-hack-contrib
+haskell-hack-frontend-happstack
+haskell-hack-frontend-monadcgi
+haskell-hack-handler-cgi
+haskell-hack-handler-fastcgi
+haskell-hack-handler-happstack
+haskell-hack-handler-hyena
+haskell-hack-handler-kibro
+haskell-hack-handler-simpleserver
+haskell-hack-middleware-cleanpath
+haskell-hack-middleware-gzip
+haskell-hack-middleware-jsonp
+haskell-hackmail
+haskell-haha
+haskell-hake
+haskell-halex
+haskell-halfs
+haskell-hamusic
+haskell-happs-data
+haskell-happs-ixset
+haskell-happs-server
+haskell-happs-state
+haskell-happs-util
+haskell-happshelpers
+haskell-happstack
+haskell-happstack-data
+haskell-happstack-fastcgi
+haskell-happstack-helpers
+haskell-happstack-ixset
+haskell-happstack-server
+haskell-happstack-state
+haskell-happstack-util
+haskell-harm
+haskell-harp
+haskell-harpy
+haskell-hashed-storage
+haskell-hasim
+haskell-haskeline
+haskell-haskeline-class
+haskell-haskell-lexer
+haskell-haskell-src
+haskell-haskell-src-exts
+haskell-haskell-src-meta
+haskell-haskell-tyrant
+haskell-haskell98
+haskell-haskelldb
+haskell-haskelldb-hdbc
+haskell-haskelldb-hdbc-odbc
+haskell-haskelldb-hdbc-postgresql
+haskell-haskelldb-hdbc-sqlite3
+haskell-haskelldb-th
+haskell-haskellformaths
+haskell-haskellnet
+haskell-haskgame
+haskell-haskore
+haskell-haskore-realtime
+haskell-haskore-supercollider
+haskell-haskore-synthesizer
+haskell-haskore-vintage
+haskell-haxml
+haskell-haxr
+haskell-hcard
+haskell-hcheat
+haskell-hcl
+haskell-hcodecs
+haskell-hcsound
+haskell-hdaemonize
+haskell-hdbc
+haskell-hdbc-mysql
+haskell-hdbc-odbc
+haskell-hdbc-postgresql
+haskell-hdbc-sqlite3
+haskell-hdbc-tuple
+haskell-hdf
+haskell-heap
+haskell-hedi
+haskell-hera
+haskell-hetero-map
+haskell-hex
+haskell-hexdump
+haskell-hexpat
+haskell-hexpat-pickle
+haskell-hfann
+haskell-hfov
+haskell-hfuse
+haskell-hgal
+haskell-hgalib
+haskell-hgdbmi
+haskell-hgeometric
+haskell-hgettext
+haskell-hgl
+haskell-hieroglyph
+haskell-higherorder
+haskell-highlighting-kate
+haskell-hinotify
+haskell-hinstaller
+haskell-hint
+haskell-hinze-streams
+haskell-hipmunk
+haskell-hjavascript
+haskell-hjs
+haskell-hjscript
+haskell-hledger
+haskell-hlibev
+haskell-hlist
+haskell-hlongurl
+haskell-hmarkup
+haskell-hmatrix
+haskell-hmatrix-static
+haskell-hmeap
+haskell-hmidi
+haskell-hmm
+haskell-hmpfr
+haskell-hmt
+haskell-hnm
+haskell-hode
+haskell-hogg
+haskell-holumbus-distribution
+haskell-holumbus-mapreduce
+haskell-holumbus-storage
+haskell-homeomorphic
+haskell-hommage
+haskell-hopenssl
+haskell-hosc
+haskell-hpapi
+haskell-hpc
+haskell-hpc-strobe
+haskell-hpdf
+haskell-hplot
+haskell-hps
+haskell-hps-cairo
+haskell-hs-dotnet
+haskell-hs-fltk
+haskell-hs-gizapp
+haskell-hs-pgms
+haskell-hs-twitter
+haskell-hs3
+haskell-hsasa
+haskell-hsc3
+haskell-hsc3-db
+haskell-hsc3-dot
+haskell-hsc3-process
+haskell-hsc3-rec
+haskell-hsc3-sf
+haskell-hsc3-unsafe
+haskell-hscamwire
+haskell-hsconfigure
+haskell-hscurses
+haskell-hsdip
+haskell-hsdns
+haskell-hsemail
+haskell-hsgnutls
+haskell-hsgsom
+haskell-hsh
+haskell-hsharupdf
+haskell-hshhelpers
+haskell-hshyperestraier
+haskell-hsjudy
+haskell-hskeleton
+haskell-hslogger
+haskell-hslogger-template
+haskell-hslua
+haskell-hsmagick
+haskell-hsndfile
+haskell-hsntp
+haskell-hsopenssl
+haskell-hsoundfile
+haskell-hsp
+haskell-hsp-cgi
+haskell-hsparklines
+haskell-hsparql
+haskell-hsparrot
+haskell-hsperl5
+haskell-hspr-sh
+haskell-hspread
+haskell-hsql
+haskell-hsql-mysql
+haskell-hsql-postgresql
+haskell-hssvn
+haskell-hssyck
+haskell-hstats
+haskell-hstringtemplate
+haskell-hstringtemplatehelpers
+haskell-hsx
+haskell-hsx-xhtml
+haskell-hsxenctrl
+haskell-hsyslog
+haskell-hszephyr
+haskell-htensor
+haskell-htf
+haskell-html
+haskell-html-minimalist
+haskell-http-monad
+haskell-http-shed
+haskell-http-simple
+haskell-http-wget
+haskell-httpd-shed
+haskell-hugs2yc
+haskell-hunit
+haskell-hxq
+haskell-hxt
+haskell-hxt-filter
+haskell-hyena
+haskell-hyphenate
+haskell-i18n
+haskell-icalendar
+haskell-iconv
+haskell-idna
+haskell-ieee
+haskell-ieee-utils
+haskell-ieee754-parser
+haskell-iexception
+haskell-ifelse
+haskell-iff
+haskell-ifs
+haskell-imlib
+haskell-in-space
+haskell-incremental-sat-solver
+haskell-indentparser
+haskell-infinite-search
+haskell-infix
+haskell-infixapplicative
+haskell-interleavableio
+haskell-interlude
+haskell-interpolatedstring-perl6
+haskell-interpolatedstring-qq
+haskell-io-capture
+haskell-io-reactive
+haskell-ior
+haskell-iospec
+haskell-ipc
+haskell-ipprint
+haskell-irc
+haskell-iteratee
+haskell-ivar-simple
+haskell-ivor
+haskell-ix-shapable
+haskell-jmacro
+haskell-join
+haskell-jscontracts
+haskell-jsmw
+haskell-json
+haskell-kibro
+haskell-kmeans
+haskell-kure
+haskell-kure-your-boilerplate
+haskell-lambdabot-utils
+haskell-language-c
+haskell-language-python
+haskell-language-sh
+haskell-lastik
+haskell-lax
+haskell-lazyarray
+haskell-lazyio
+haskell-lazysmallcheck
+haskell-lazysplines
+haskell-lcs
+haskell-leapseconds-announced
+haskell-level-monad
+haskell-libffi
+haskell-libgeni
+haskell-libmpd
+haskell-liboleg
+haskell-libxml
+haskell-libxml-sax
+haskell-lighttpd-conf
+haskell-linear-maps
+haskell-lispparser
+haskell-list
+haskell-list-extras
+haskell-list-tries
+haskell-listlike
+haskell-listzipper
+haskell-llvm
+haskell-loch
+haskell-logfloat
+haskell-logic-tptp
+haskell-logict
+haskell-lojban
+haskell-loli
+haskell-lru
+haskell-lub
+haskell-lucu
+haskell-luhn
+haskell-lui
+haskell-maccatcher
+haskell-macho
+haskell-marked-pretty
+haskell-markov-chain
+haskell-mathlink
+haskell-matlab
+haskell-matrix-market
+haskell-maybench
+haskell-maybet
+haskell-mediawiki
+haskell-memcached
+haskell-memotrie
+haskell-mersenne-random
+haskell-mersenne-random-pure64
+haskell-metaobject
+haskell-microbench
+haskell-midi
+haskell-mime
+haskell-mime-directory
+haskell-mime-string
+haskell-miniplex
+haskell-missingh
+haskell-missingpy
+haskell-mlist
+haskell-mmap
+haskell-mmtl
+haskell-modsplit
+haskell-mohws
+haskell-monad-interleave
+haskell-monad-loops
+haskell-monad-param
+haskell-monad-ran
+haskell-monad-tx
+haskell-monadcatchio-mtl
+haskell-monadiccp
+haskell-monadlab
+haskell-monadlib
+haskell-monadprompt
+haskell-monadrandom
+haskell-monads-fd
+haskell-monads-tf
+haskell-monoid-record
+haskell-monoid-transformer
+haskell-monte-carlo
+haskell-mps
+haskell-mtl
+haskell-mtl-tf
+haskell-mtlparse
+haskell-mtlx
+haskell-mucipher
+haskell-mueval
+haskell-multirec
+haskell-multirec-binary
+haskell-multiset
+haskell-multisetrewrite
+haskell-munkres
+haskell-musicxml
+haskell-n-m
+haskell-nano-hmac
+haskell-nano-md5
+haskell-nanocurses
+haskell-nat
+haskell-nemesis
+haskell-netsnmp
+haskell-network
+haskell-network-bytestring
+haskell-network-connection
+haskell-network-dns
+haskell-network-minihttp
+haskell-network-multicast
+haskell-network-protocol-xmpp
+haskell-network-server
+haskell-newbinary
+haskell-nntp
+haskell-non-negative
+haskell-nonempty
+haskell-np-extras
+haskell-nthable
+haskell-numbers
+haskell-numbersieves
+haskell-numerals
+haskell-numeric-prelude
+haskell-numeric-quest
+haskell-obdd
+haskell-obj
+haskell-objectname
+haskell-oeis
+haskell-ogl
+haskell-old-locale
+haskell-old-time
+haskell-onetuple
+haskell-open-witness
+haskell-openafp
+haskell-openal
+haskell-opengl
+haskell-openglcheck
+haskell-openglraw
+haskell-openid
+haskell-opensoundcontrol-ht
+haskell-openvg
+haskell-operads
+haskell-opml
+haskell-orchid
+haskell-osx-ar
+haskell-packedstring
+haskell-pageio
+haskell-panda
+haskell-pandoc
+haskell-parallel
+haskell-parallel-tree-search
+haskell-parameterized-data
+haskell-parport
+haskell-parrows
+haskell-parse-dimacs
+haskell-parseargs
+haskell-parsec
+haskell-parsedate
+haskell-parserfunction
+haskell-pbkdf2
+haskell-pcap
+haskell-pcre-light
+haskell-peakachu
+haskell-peano-inf
+haskell-pecoff
+haskell-penn-treebank
+haskell-perfecthash
+haskell-permutation
+haskell-persistent-map
+haskell-pgm
+haskell-phonetic-code
+haskell-pipe
+haskell-pkcs1
+haskell-platform
+haskell-plugins
+haskell-pointedlist
+haskell-polyparse
+haskell-polytypeable
+haskell-popenhs
+haskell-portaudio
+haskell-porte
+haskell-posix-realtime
+haskell-powermate
+haskell-ppm
+haskell-pqc
+haskell-pqueue-mtl
+haskell-predicates
+haskell-preprocessor-tools
+haskell-presburger
+haskell-press
+haskell-pretty
+haskell-pretty-ncols
+haskell-pretty-show
+haskell-prettyclass
+haskell-primes
+haskell-printf-mauke
+haskell-printf-th
+haskell-priority-queue
+haskell-priority-sync
+haskell-probability
+haskell-process
+haskell-procrastinating-structure
+haskell-procrastinating-variable
+haskell-progressbar
+haskell-property-list
+haskell-proplang
+haskell-protocol-buffers
+haskell-protocol-buffers-descriptor
+haskell-psqueue
+haskell-pugs-compat
+haskell-pugs-drift
+haskell-pugs-hsregex
+haskell-pugs-hssyck
+haskell-pure-fft
+haskell-puremd5
+haskell-quantum-arrow
+haskell-queue
+haskell-queuelike
+haskell-quickcheck
+haskell-random
+haskell-random-access-list
+haskell-random-fu
+haskell-random-shuffle
+haskell-randomdotorg
+haskell-ranged-sets
+haskell-rangemin
+haskell-ranges
+haskell-rbr
+haskell-rdtsc
+haskell-reactive
+haskell-reactive-fieldtrip
+haskell-reactive-glut
+haskell-readline
+haskell-recaptcha
+haskell-redhandlers
+haskell-reflection
+haskell-refserialize
+haskell-regex-base
+haskell-regex-compat
+haskell-regex-dfa
+haskell-regex-pcre
+haskell-regex-pcre-builtin
+haskell-regex-posix
+haskell-regex-tdfa
+haskell-regex-tdfa-utf8
+haskell-regex-xmlschema
+haskell-regexpr
+haskell-regexpr-symbolic
+haskell-regular
+haskell-reord
+haskell-replib
+haskell-restng
+haskell-reviewboard
+haskell-rewriting
+haskell-rjson
+haskell-rmonad
+haskell-roman-numerals
+haskell-rosezipper
+haskell-rsa
+haskell-rsagl
+haskell-rss
+haskell-rungekutta
+haskell-safe
+haskell-safe-lazy-io
+haskell-safecopy
+haskell-salvia
+haskell-satchmo
+haskell-satchmo-backends
+haskell-satchmo-funsat
+haskell-satchmo-minisat
+haskell-scc
+haskell-scenegraph
+haskell-scgi
+haskell-sdl
+haskell-sdl-gfx
+haskell-sdl-image
+haskell-sdl-mixer
+haskell-sdl-mpeg
+haskell-sdl-ttf
+haskell-segmenttree
+haskell-selenium
+haskell-semaphore-plus
+haskell-sendfile
+haskell-serial
+haskell-sessions
+haskell-setlocale
+haskell-sexpr
+haskell-sg
+haskell-sha
+haskell-shellac
+haskell-shellac-editline
+haskell-shellac-haskeline
+haskell-shellac-readline
+haskell-show
+haskell-shpider
+haskell-simple-reflect
+haskell-simple-sessions
+haskell-simpleargs
+haskell-simplesmtpclient
+haskell-smallcheck
+haskell-smtpclient
+haskell-sonic-visualiser
+haskell-sox
+haskell-spacepart
+haskell-sparsebit
+haskell-species
+haskell-sphinx
+haskell-split
+haskell-spreadsheet
+haskell-sqlite
+haskell-stateful-mtl
+haskell-stateref
+haskell-statevar
+haskell-statistics-fusion
+haskell-stb-image
+haskell-stb-truetype
+haskell-stemmer
+haskell-stm
+haskell-stm-io-hooks
+haskell-stmcontrol
+haskell-stmonadtrans
+haskell-storable
+haskell-storable-complex
+haskell-storable-record
+haskell-storable-tuple
+haskell-storablevector
+haskell-stream
+haskell-stream-fusion
+haskell-stream-monad
+haskell-streamproc
+haskell-strict
+haskell-strict-concurrency
+haskell-strict-io
+haskell-strictbench
+haskell-string-combinators
+haskell-stringprep
+haskell-stringsearch
+haskell-stringtable-atom
+haskell-suffixtree
+haskell-supercollider-ht
+haskell-supercollider-midi
+haskell-svgfonts
+haskell-swf
+haskell-syb
+haskell-syb-with-class
+haskell-sybwidget
+haskell-synchronous-channels
+haskell-synthesizer
+haskell-synthesizer-core
+haskell-synthesizer-dimensional
+haskell-synthesizer-inference
+haskell-system-inotify
+haskell-system-uuid
+haskell-tabular
+haskell-tagchup
+haskell-taglib
+haskell-tagsoup
+haskell-tagsoup-ht
+haskell-tagsoup-parsec
+haskell-takusen
+haskell-tar
+haskell-tcache
+haskell-tconfig
+haskell-tcp
+haskell-template
+haskell-template-haskell
+haskell-tensor
+haskell-terminfo
+haskell-ternarytrees
+haskell-terrahs
+haskell-test-framework
+haskell-test-framework-hunit
+haskell-test-framework-quickcheck
+haskell-testpack
+haskell-testrunner
+haskell-texmath
+haskell-text
+haskell-text-icu
+haskell-tfp
+haskell-th-fold
+haskell-theora
+haskell-thih
+haskell-thingie
+haskell-threadmanager
+haskell-thrist
+haskell-time
+haskell-timeit
+haskell-tinyurl
+haskell-tokyocabinet-haskell
+haskell-tokyotyrant-haskell
+haskell-torch
+haskell-traced
+haskell-tracker
+haskell-transactional-events
+haskell-transformers
+haskell-tree-monad
+haskell-treestructures
+haskell-tttas
+haskell-tuple
+haskell-tv
+haskell-type
+haskell-type-equality-check
+haskell-type-level
+haskell-typecompose
+haskell-typehash
+haskell-typical
+haskell-uconv
+haskell-unamb
+haskell-unamb-custom
+haskell-unboxed-containers
+haskell-unicode-names
+haskell-unicode-prelude
+haskell-unicode-properties
+haskell-uniplate
+haskell-uniqueid
+haskell-universal-binary
+haskell-unix
+haskell-unix-compat
+haskell-unix-pty-light
+haskell-unixutils
+haskell-unlambda
+haskell-uri-template
+haskell-url
+haskell-urldisp
+haskell-urlencoded
+haskell-utf8-env
+haskell-utf8-light
+haskell-utf8-prelude
+haskell-utility-ht
+haskell-uu-parsinglib
+haskell-uuid
+haskell-uulib
+haskell-uvector
+haskell-uvector-algorithms
+haskell-vacuum
+haskell-vacuum-cairo
+haskell-vacuum-opengl
+haskell-validate
+haskell-value-supply
+haskell-vcard
+haskell-vec
+haskell-vect
+haskell-vector-space
+haskell-visual-graphrewrite
+haskell-vty
+haskell-wave
+haskell-wavesurfer
+haskell-web-encodings
+haskell-webbits
+haskell-whim
+haskell-wikimediaparser
+haskell-windowslive
+haskell-wired
+haskell-witness
+haskell-wl-pprint
+haskell-wol
+haskell-wordcloud
+haskell-wordnet
+haskell-workflow
+haskell-wx
+haskell-wxcore
+haskell-wxfruit
+haskell-xattr
+haskell-xauth
+haskell-xcb-types
+haskell-xformat
+haskell-xhb
+haskell-xhtml
+haskell-xml
+haskell-xml-basic
+haskell-xml-parsec
+haskell-xosd
+haskell-xsact
+haskell-yahoo-web-search
+haskell-yamlreference
+haskell-yampa
+haskell-ycextra
+haskell-yhccore
+haskell-yices
+haskell-yjftp
+haskell-yjtools
+haskell-yogurt
+haskell-yuigrid
+haskell-zfs
+haskell-zip-archive
+haskell-zipedit
+haskell-zipfold
+haskell-zipper
+haskell-zoneinfo
+hasktags
+hback
+hbeat
+hburg
+helisp
+helium
+hetris
+hevolisa
+hevolisa-dph
+hichi
+hinvaders
+hipmunkplayground
+historian
+hledger
+hlint
+hmp3
+hmpf
+hoogle
+hpodder
+hpong
+hprotoc
+hpylos
+hranker
+hray
+hsclock
+hscolour
+hsffig
+hspresent
+hstidy
+htags
+htar
+hunp
+husky
+hybrid
+internetmarke
+ip6addr
+ircbouncer
+ixdopp
+jarfind
+json2yaml
+kbq-gu
+korfu
+l-seed
+lambdabot
+lambdacalculator
+lambdacube
+lambdahack
+lambdashell
+leksah
+lhc
+line2pdf
+linkchk
+lscabal
+lslplus
+mage
+maid
+make-hard-links
+mazesofmonad
+mdo
+memscript
+mines
+minesweeper
+mkbndl
+mkcabal
+modsplit
+mohws
+monadius
+mp3decoder
+mpdmate
+multiplicity
+nehe-tuts
+ngrams
+nhc98
+nymphaea
+omnicodec
+only
+openafp-utils
+orchid-demo
+pdf2line
+pesca
+photoname
+piet
+pkggraph
+plsltools
+pointfree
+pony
+printxosd
+prof2dot
+pugs
+pugs-drift
+pxsl-tools
+quickcheck-script
+riot
+roguestar-engine
+roguestar-gl
+rss2irc
+sat
+sat-micro-hs
+satchmo-examples
+scaleimage
+scurry
+sgdemo
+she
+shelltestrunner
+showdown
+shu-thing
+simgi
+simseq
+smartword
+sourcegraph
+spaceinvaders
+sphinx-cli
+strictify
+subtitles
+supercollider-midi
+tabloid
+testpattern
+tetris
+threadpool
+timberc
+timepiece
+topkata
+turing-music
+twidge
+twitter
+typalyze
+typeilluminator
+uacpid
+uhexdump
+urlcheck
+uuagc
+vintage-basic
+wavconvert
+wp-archivebot
+wxasteroids
+xml2x
+yampasynth
+yeganesh
+yi
+zmachine
+ztail
diff --git a/scripts/arch-report.hs b/scripts/arch-report.hs
new file mode 100644
--- /dev/null
+++ b/scripts/arch-report.hs
@@ -0,0 +1,6 @@
+import Distribution.ArchLinux.Report
+
+main = do
+    s <- lines `fmap` readFile "arch-haskell-packages.txt"
+    writeFile "/tmp/x.html" =<< report s
+
