diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2014, Athan Clark
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Athan Clark nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/src/Web/Page/Blaze.hs b/src/Web/Page/Blaze.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Page/Blaze.hs
@@ -0,0 +1,30 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Web.Page.Blaze
+    ( module Web.Page.Types
+    , template ) where
+
+import Web.Page.Types
+
+import qualified Text.Blaze.Html5 as H
+import qualified Text.Blaze.Html5.Attributes as A
+
+import qualified Data.Text as T
+
+-- | You should really be using Lucid...
+template :: WebPage H.Html T.Text
+         -> H.Html
+         -> H.Html
+template page content = do
+  H.docTypeHtml $ do
+    (H.head $ do
+      initScripts page
+      (H.title $ H.toHtml $ pageTitle page)
+      metaVars page
+      H.link H.! (A.rel "icon") H.! (A.href $ H.toValue (favicon page))
+      beforeStylesScripts page
+      styles page
+      afterStylesScripts page)
+    H.body $ do
+      content
+      bodyScripts page
diff --git a/src/Web/Page/Lucid.hs b/src/Web/Page/Lucid.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Page/Lucid.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE BangPatterns #-}
+
+module Web.Page.Lucid
+    ( module Web.Page.Types
+    , template ) where
+
+import Web.Page.Types
+
+import Lucid
+import Lucid.Base
+
+import qualified Data.Text as T
+
+import Data.Monoid
+
+-- | Generic page template implemented in Lucid.
+template :: Monad m =>
+            WebPage (HtmlT m ()) T.Text -- ^ Page information
+         -> HtmlT m () -- ^ Content to insert in @\<body\>@
+         -> HtmlT m () 
+template page content = doctypehtml_ $ mconcat $
+  [ head_ [] $ mconcat $
+      [ initScripts page
+      , title_ $ toHtmlRaw $ pageTitle page
+      , metaVars page
+      , link_ [ rel_ "icon"
+              , href_ $ favicon page
+              ]
+      , beforeStylesScripts page
+      , styles page
+      , afterStylesScripts page
+      ]
+  , body_ [] $ mconcat $
+      [ content
+      , bodyScripts page
+      ]
+  ]
diff --git a/src/Web/Page/Types.hs b/src/Web/Page/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/Page/Types.hs
@@ -0,0 +1,28 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ExtendedDefaultRules #-}
+{-# LANGUAGE BangPatterns #-}
+
+module Web.Page.Types where
+
+
+import Data.Monoid
+
+-- | Generic layout for a web page. We keep the data type purely parametric to 
+-- allow for record-syntax overloading / reassignment, like this:
+-- .
+-- > page :: WebPage (Html ()) T.Text
+-- >
+-- > page' = page {pageTitle = "foo!"}
+data WebPage markup attr = WebPage {           pageTitle :: attr -- ^ Page title
+                                   ,             favicon :: attr -- ^ Favicon url
+                                   ,            metaVars :: markup -- ^ @\<meta\>@ tags
+                                   ,         initScripts :: markup -- ^ JavaScript to include at the top of the page
+                                   , beforeStylesScripts :: markup -- ^ JavaScript to include before @\<style\>@ tags
+                                   ,              styles :: markup -- ^ Styles
+                                   ,  afterStylesScripts :: markup -- ^ JavaScript to include after @\<style\>@ tags - ie: <http://modernizr.com Modernizr>
+                                   ,         bodyScripts :: markup -- ^ JavaScript to include at the base of @\<body\>@
+                                   }
+
+instance (Monoid m, Monoid a) => Monoid (WebPage m a) where
+  mempty = WebPage mempty mempty mempty mempty mempty mempty mempty mempty
+  mappend x _ = x -- Some people just want to watch the world burn.
diff --git a/webpage.cabal b/webpage.cabal
new file mode 100644
--- /dev/null
+++ b/webpage.cabal
@@ -0,0 +1,57 @@
+Name:                   webpage
+Version:                0.0.1
+Author:                 Athan Clark <athan.clark@gmail.com>
+Maintainer:             Athan Clark <athan.clark@gmail.com>
+License:                MIT
+License-File:           LICENSE
+Synopsis:               Organized and simple web page scaffold for blaze and lucid
+Description:
+  This is a general organization scheme for web pages, implemented for Lucid, 
+  and adapted for Blaze-html.
+  .
+  It's as easy as 1-2-3:
+  .
+  >  import Web.Page.Lucid
+  >
+  >  λ> renderText $ template mempty "some content"
+  >
+  >  ↪ "<!DOCTYPE HTML><html><head><title></title><link href 
+  >    rel="icon"></head><body>some content</body></html>"
+  .
+  overload the particular areas with record syntax and stuff:
+  .
+  >  λ> let page = WebPage
+  >                  "foo"
+  >                  mempty
+  >                  mempty
+  >                  mempty
+  >                  mempty
+  >                  mempty
+  >                  mempty
+  >                  (script_ [src_ "jquery.js"] "")
+  >
+  >
+  >  λ> template page "some content"
+  >
+  >  ↪ "<!DOCTYPE HTML><html><head><title>foo</title><link href 
+  >    rel=\"icon\"></head><body>some content<script 
+  >    src=\"jquery.js\"></script></body></html>"
+  .
+Cabal-Version:          >= 1.10
+Build-Type:             Simple
+
+Library
+  Default-Language:     Haskell2010
+  HS-Source-Dirs:       src
+  GHC-Options:          -Wall
+  Exposed-Modules:      Web.Page.Types
+                        Web.Page.Lucid
+                        Web.Page.Blaze
+  Build-Depends:        base >= 4 && < 5
+                      , lucid >= 2.5
+                      , blaze-html
+                      , text
+
+Source-Repository head
+  Type:                 git
+  Location:             https://github.com/athanclark/webpage.git
