diff --git a/Nemesis b/Nemesis
--- a/Nemesis
+++ b/Nemesis
@@ -15,6 +15,9 @@
   desc "start console"
   task "i" (sh "ghci -isrc -Wall src/Text/HTML/Yuuko.hs")
   
+  desc "start main"
+  task "main" (sh "ghci -isrc -Wall src/Main.hs")
+  
   desc "put all .hs files in manifest"
   task "manifest" $ do
     sh "find . | grep 'hs$' > manifest"
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,16 @@
+2009.10.23.2
+------------
+
+### Feature
+
+* add `yuuko` binary
+* add `yuuko_xml` lib for handling xml, e.g. rss
+* magic pure (with unsafePerformIO)
+
+### Fix
+
+* handle utf8 html
+
 2009.10.23.1
 ------------
 
diff --git a/readme.md b/readme.md
--- a/readme.md
+++ b/readme.md
@@ -7,9 +7,10 @@
 =======
 
 
-    yuuko "//body" "<html><body>hi</body></html>"
+    > echo '<div>hi</div><div>there</div>' | yuuko //div
     
-    > ["hi"]
+    hi
+    there
 
 Tutorial
 ========
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,11 @@
+module Main where
+
+import Text.HTML.Yuuko
+import System
+
+main :: IO ()
+main = do
+  args <- getArgs
+  case args of
+    [] -> putStrLn "\n  usage: echo '<div>hi</div>' | yuuko //div\n"
+    expr:_ -> interact $ concatMap (++ "\n") . (yuuko expr)
diff --git a/src/Text/HTML/Yuuko.hs b/src/Text/HTML/Yuuko.hs
--- a/src/Text/HTML/Yuuko.hs
+++ b/src/Text/HTML/Yuuko.hs
@@ -2,23 +2,32 @@
 
 import Text.XML.HXT.Arrow
 import qualified Text.XML.HXT.Arrow.XPathSimple as XS
+import System.IO.Unsafe
 
-yuuko :: String -> String -> IO [String]
-yuuko expr s = do
+yuuko :: String -> String -> [String]
+yuuko = yuuko_base [(a_parse_html, v_1)]
+
+yuuko_xml :: String -> String -> [String]
+yuuko_xml = yuuko_base [(a_ignore_none_xml_contents, v_1)]
+
+yuuko_base :: [(String, String)] -> String -> String -> [String]
+yuuko_base args expr s = unsafePerformIO $
   runX process
 
   where
     read_args = 
       [ (a_validate, v_0)
-      , (a_parse_html, v_1)
-      , (a_encoding, utf8)
       , (a_issue_warnings, v_0)
       ]
+      ++ args
     
     write_args = 
-      [ (a_encoding, utf8) ]
+      [ (a_encoding, utf8)
+      , (a_no_xml_pi, v_0 )
+      ]
       
     process =
           readString read_args s
       >>> XS.getXPathTreesInDoc expr
       >>> writeDocumentToString write_args
+
diff --git a/yuuko.cabal b/yuuko.cabal
--- a/yuuko.cabal
+++ b/yuuko.cabal
@@ -1,5 +1,5 @@
 Name:                 yuuko
-Version:              2009.10.23.1
+Version:              2009.10.23.2
 Build-type:           Simple
 Synopsis:             A transcendental HTML parser gently wrapping the HXT library
 Description:
@@ -21,6 +21,13 @@
 category:             Text
 homepage:             http://github.com/nfjinjing/yuuko
 data-files:           readme.md, changelog.md, known-issues.md, Nemesis
+
+Executable            yuuko
+  ghc-options:        -Wall
+  build-depends:      base >= 4 && < 5, hxt, haskell98, utf8-prelude
+  hs-source-dirs:     src/
+  main-is:            Main.hs
+  other-modules:      Text.HTML.Yuuko
 
 library
   ghc-options: -Wall
