diff --git a/bamboo.cabal b/bamboo.cabal
--- a/bamboo.cabal
+++ b/bamboo.cabal
@@ -1,5 +1,5 @@
 Name:                 bamboo
-Version:              2009.4.22
+Version:              2009.4.23
 Build-type:           Simple
 Synopsis:             A simple blog engine on Hack
 Description:          A simple blog engine on Hack
@@ -10,12 +10,12 @@
 Build-Depends:        base
 Cabal-version:        >= 1.2
 category:             Web
-homepage:             http://www.haskell.org/haskellwiki/Bamboo
+homepage:             http://github.com/nfjinjing/bamboo/tree/master
 data-files:           readme.md, changelog.md
 
 library
   ghc-options: -Wall -fno-warn-missing-signatures -fno-warn-name-shadowing -fno-warn-orphans -fno-warn-type-defaults
-  build-depends: base, cgi, network, haskell98, old-locale, old-time, directory, filepath, containers, process, mps >= 2008.11.6, parsedate >= 3000.0.0, rss >= 3000.0.1, xhtml, kibro >= 0.4.2, utf8-string >= 0.3.3, pandoc, parsec >= 2, MissingH, gravatar >= 0.3, data-default >= 0.2, hcheat >= 2008.11.6, hack >= 2009.4.22
+  build-depends: base, cgi, network, haskell98, old-locale, old-time, directory, filepath, containers, process, mps >= 2008.11.6, parsedate >= 3000.0.0, rss >= 3000.0.1, xhtml, kibro >= 0.4.2, utf8-string >= 0.3.3, pandoc, parsec >= 2, MissingH, gravatar >= 0.3, data-default >= 0.2, hcheat >= 2008.11.6, hack >= 2009.4.23
   hs-source-dirs: src/
   exposed-modules:  
                     Bamboo
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,12 @@
-2009.4.21
+2009.4.23
+---------
+
+### Feature
+
+* A pretty logger to stderr
+* Auto set content-size
+
+2009.4.22
 -----------
 
 ### Feature
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -1,9 +1,11 @@
-## Bamboo: a blog engine on Hack
+# Bamboo: a simple blog engine on Hack
 
-### Features
+Bamboo is a port of [Panda](http://github.com/nfjinjing/panda/tree), but runs on top of Hack. All features except comment works out of box. I intend to reduce the code size and make the app more robust by using the benefit of middlewares available in [Hack](http://github.com/nfjinjing/hack/tree).
 
-#### simple file structure
+## Features
 
+### simple file structure
+
     db
     |---- blog
     |     |---- 08-09-01 first post
@@ -16,7 +18,7 @@
     |---- static
           |---- About
 
-#### simple config file
+### simple config file
 
     blog_title    = C大调
     blog_subtitle = 野猫不吃薯片
@@ -28,11 +30,11 @@
     sidebar       = Blogroll.md
     favicon       = bamboo_icon.png
 
-#### standard web technology
+### standard web technology
 
 extend/customize with pure css and javascript ( note the custom part in css and js from the last section )
 
-#### hacker friendly
+### hacker friendly
 
 * posts are in plain text
 * SCM for publishing / data managing ( not really a feature, but a design goal from the beginning )
@@ -56,24 +58,19 @@
 
 ### Quick setup
 
-#### install [lighttpd](http://www.lighttpd.net/ )
-
-Note: only version 1.4.19 has been successfully tested, 1.4.20 is bugged for reasons unknown.
-
-#### install [ghc](http://www.haskell.org/ghc/download.html)
-
-#### install [darcs](http://www.darcs.net/) for `cabal-install`
-
-#### install [cabal-install](http://hackage.haskell.org/trac/hackage/wiki/CabalInstall)
-
-    darcs get --partial http://darcs.haskell.org/cabal-install/
-    cd cabal-install
-    sh bootstrap.sh
-
 #### install bamboo
 
     cabal update; cabal install bamboo
 
+### Install lighttpd 1.4.19 (used by kibro)
+
+    wget http://www.lighttpd.net/download/lighttpd-1.4.19.tar.gz
+    tar zxfv lighttpd-1.4.19.tar.gz
+    cd lighttpd-1.4.19
+    ./configure --prefix=$HOME
+    make
+    make install
+
 #### bootstrap
 
     # bamboo is a kibro project
@@ -165,7 +162,6 @@
     css        = screen, blueprint-wp, custom
     js         = jquery-1.2.6.min, jquery.getUrlParam, jquery.highlight-2, custom
 
-
 These are custom class names for each element block.
 
 You can create new themes by adding theme definition files in `db/config/theme`, put theme resources under `db/public/theme/your_theme_name` and place
@@ -192,16 +188,14 @@
 
 ### analytics
 
-Google analytics is available, put your `tracker_id` in `site.txt`, if you don't want analytics, ignore the setting.
-
-Once site module is introduced, those `js` code could be configured to be gone forever, but not yet in the current release.
+Google analytics is available, put your `tracker_id` in `site.txt`, make sure `analytics` extension is used by adding `analytics` to the `extension` option.
 
 ### final note
 
 try to use `<h3>` for heading in your posts, at least `wordpress` is using this convention. `<h1>` is not styled in the blueprint theme, so they look kind of unfitted. But this does not stop anyone from styling `<h1>, <h2>` if wished.
 
-### Links
+## Links
 
+* [Hack](http://github.com/nfjinjing/hack/tree)
 * [Kibro](http://chrisdone.com/blog/tag/Kibro)
-* [Bamboo on Jinjing's blog](http://jinjing.easymic.com/tag/Bamboo)
 * [Source](http://github.com/nfjinjing/bamboo/tree)
diff --git a/src/Bamboo.hs b/src/Bamboo.hs
--- a/src/Bamboo.hs
+++ b/src/Bamboo.hs
@@ -14,12 +14,17 @@
 import Hack
 import Hack.Contrib.RawRouter
 import Hack.Contrib.ContentType
+import Hack.Contrib.ContentSize
+import Hack.Contrib.SimpleAccessLogger
+
 import Bamboo.Helper.Env hiding (body, not_found, (>))
 
 default_content_type = "text/plain; charset=UTF-8"
 
 middleware_stack = 
-  [  content_type default_content_type
+  [  simple_access_logger Nothing Nothing "Bamboo"
+  ,  content_size
+  ,  content_type default_content_type
   ,  route paths
   ]
   
diff --git a/src/Bamboo/Controller/Application.hs b/src/Bamboo/Controller/Application.hs
--- a/src/Bamboo/Controller/Application.hs
+++ b/src/Bamboo/Controller/Application.hs
@@ -37,8 +37,6 @@
 
 
 -- helpers
--- liftIO: move to an (u)pper level monad
-u                = liftIO
 blog_regex       = G.url_date_matcher
 init_post tags x = x.Tag.fill_tag tags.Comment.fill_comment_size
 tag_list         = list
diff --git a/src/Bamboo/Helper/StateHelper.hs b/src/Bamboo/Helper/StateHelper.hs
--- a/src/Bamboo/Helper/StateHelper.hs
+++ b/src/Bamboo/Helper/StateHelper.hs
@@ -27,7 +27,7 @@
   where
     maybe_d = parseCalendarTime defaultTimeLocale format s
   
-format_date          = formatCalendarTime defaultTimeLocale
+format_time          = formatCalendarTime defaultTimeLocale
 default_date         = parse_date "%Y-%m-%d %T" "2000-1-1 00:00:00".fromJust
 parse_post_date      = parse_date G.post_date_format
 default_parse_date s = s.parse_post_date .fromMaybe default_date
diff --git a/src/Bamboo/Model/Comment.hs b/src/Bamboo/Model/Comment.hs
--- a/src/Bamboo/Model/Comment.hs
+++ b/src/Bamboo/Model/Comment.hs
@@ -80,7 +80,7 @@
     let body    = at Body
     let post_id = at PostId
 
-    timestamp <- ( getClockTime >>= toCalendarTime ) ^ format_date G.comment_date_format
+    timestamp <- ( getClockTime >>= toCalendarTime ) ^ format_time G.comment_date_format
     let comment_path = post_id_to_uid post_id 
     mkdir_p comment_path
 
diff --git a/src/Bamboo/Model/Post.hs b/src/Bamboo/Model/Post.hs
--- a/src/Bamboo/Model/Post.hs
+++ b/src/Bamboo/Model/Post.hs
@@ -85,14 +85,14 @@
 -- extra
 id_to_uri id = G.root / ( pretty_date ++ G.url_date_title_seperator ++ formatted_title ++ ext ) where
   formatted_title = G.url_title_subs.map (\(a,b) -> gsub a b).inject (id.get_title) apply
-  pretty_date     = id.get_date.format_date G.url_date_format
+  pretty_date     = id.get_date.format_time G.url_date_format
   ext = id.take_known_extension
 
 uri_to_id s = G.post_id / (d ++ " " ++ t) where
   (raw_d, (_, title_with_sep)) = s.MPS.match G.url_date_matcher.fromJust.fst
   raw_t = title_with_sep.drop (G.url_date_title_seperator.length)
   t = G.url_title_subs.map (\(a,b) -> gsub b a) .inject raw_t apply
-  d = raw_d.parse_date G.url_date_format .fromJust.format_date G.post_date_format
+  d = raw_d.parse_date G.url_date_format .fromJust.format_time G.post_date_format
 
 
 -- summary
diff --git a/src/Bamboo/View/Atom/Comment.hs b/src/Bamboo/View/Atom/Comment.hs
--- a/src/Bamboo/View/Atom/Comment.hs
+++ b/src/Bamboo/View/Atom/Comment.hs
@@ -27,7 +27,7 @@
     formatted_link = if l.starts_with "http://" then l else "http://" ++ l
     gravatar = thediv ! [theclass "gravatar"] << image ! [src (gravatar_link x)]
 
-comment_date x = toHtml $ x.date.format_date "%b %e, %Y at %I:%M %p"
+comment_date x = toHtml $ x.date.format_time "%b %e, %Y at %I:%M %p"
 
 
 -- form
diff --git a/src/Bamboo/View/Atom/Post.hs b/src/Bamboo/View/Atom/Post.hs
--- a/src/Bamboo/View/Atom/Post.hs
+++ b/src/Bamboo/View/Atom/Post.hs
@@ -29,7 +29,7 @@
 render_summary x = if x.is True then entry Summary else render_data
 
 title_link x              = h2 << hotlink (x.uri) << x.title
-post_date x               = toHtml $ x.date.format_date "%b %e, %Y"
+post_date x               = toHtml $ x.date.format_time "%b %e, %Y"
 
 post_tags x | x.tags.null = empty_html
 post_tags x = " | " +++ "Published in " +++ x.tags.map Tag.tag_link .intersperse (", ".toHtml)
