diff --git a/Network/JMacroRPC/Snap.hs b/Network/JMacroRPC/Snap.hs
--- a/Network/JMacroRPC/Snap.hs
+++ b/Network/JMacroRPC/Snap.hs
@@ -22,17 +22,17 @@
 > import Network.JMacroRPC.Base
 > import Text.XHtml hiding(dir)
 > import qualified Data.Text as T
-> 
+>
 > jsScript f = script (primHtml f) ! [thetype "text/javascript"]
 > jsScript' = jsScript . show . renderJs
-> 
+>
 > testPage = mkConversationPageNoCulling pageFun (newMVar (1::Int)) jRpcs
 >     where pageFun :: JStat ->  Snap ()
->           pageFun js = writeText $ T.pack $ show $ 
+>           pageFun js = writeText $ T.pack $ show $
 >                        (header << [script ! [src "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"] << noHtml]) +++
 >                        jsScript' js +++
->                        jsScript' ([jmacro|$(\ 
->                                      {  
+>                        jsScript' ([jmacro|$(\
+>                                      {
 >                                            var b = $("<button>click me!</button>");
 >                                            $("body").append(b);
 >                                            b.click(\ {
@@ -42,12 +42,12 @@
 >                                      });
 >                                   |]);
 >           jRpcs = [getCounterRPC]
->           getCounterRPC = 
+>           getCounterRPC =
 >               toJsonConvRPC "getCounter" $ \s -> (liftIO $ retRight =<< modifyMVar s (\i -> return (i+1,i)) :: Snap (Either String Int))
-> 
+>
 > retRight :: a -> IO (Either String a)
 > retRight = return . Right
-> 
+>
 > main = quickHttpServe =<< testPage
 
 Every invocation of this page (including from the same browser) will have a distinct, stateful, counter, stored server-side.
@@ -56,10 +56,11 @@
 
 
 module Network.JMacroRPC.Snap where
-    
+
 import Prelude hiding (tail, init, head, last, minimum, maximum, foldr1, foldl1, (!!), read)
 import Control.Applicative
 import Network.JMacroRPC.Base
+import Network.JMacroRPC.Panels
 import Data.Aeson
 import Language.Javascript.JMacro
 import qualified Data.ByteString.Char8 as B
@@ -67,7 +68,7 @@
 import Snap.Core
 
 instance (ToJSON b) => ToJsonRPC (Snap (Either String b)) Snap where
-    toJsonRPC_ f = \ _ -> fmap (fmap toJSON) $ f 
+    toJsonRPC_ f = \ _ -> fmap (fmap toJSON) $ f
 
 -- | Provide a set of json rpcs.
 serveRpcs :: MonadSnap m => (Int -> m s) -> [JsonRPC m s] -> m ()
@@ -77,10 +78,10 @@
   writeLBS =<< handleRpcs stateFun rpcs rq
 
 -- | This general handler allows explicit culling of conversation state.
-mkConversationPage :: (MonadSnap m) => 
-                            IO timestamp -- ^ Get an abstract timestamp 
+mkConversationPage :: (MonadSnap m) =>
+                            IO timestamp -- ^ Get an abstract timestamp
                             -> (IntMap (timestamp,s) -> IO (IntMap (timestamp,s))) -- ^ Cull a map of conversations based on a timestamp
-                            -> (JStat -> m ()) -- ^ Take some JMacro Javascript and splice it into some generated page. 
+                            -> (JStat -> m ()) -- ^ Take some JMacro Javascript and splice it into some generated page.
                             -> IO s -- ^ Generate an empty "initial" state for a conversation. States are responsible for using their own MVars or the like to allow sharing.
                             -> [JsonRPC m s] -- ^ JSON RPCs to serve and make available to clientside javascript
                             -> IO (m ())
@@ -89,3 +90,8 @@
 -- | This simple handler allows conversation state to grow without bounds.
 mkConversationPageNoCulling :: (MonadSnap m) => (JStat -> m ()) -> IO s -> [JsonRPC m s] -> IO (m ())
 mkConversationPageNoCulling pageFun emptyState rpcs = mkConversationPage (return ()) return pageFun emptyState rpcs
+
+-- | Convert a Panel into a Snap resource.
+panelToPage :: String -> Panel Snap -> Snap ()
+panelToPage title p = dir (B.pack "jrpcs") updateHandler <|> method GET drawHandler
+    where (updateHandler, drawHandler) = panelToPageGen (serveRpcs $ const (return ())) writeLazyText title p
diff --git a/jmacro-rpc-snap.cabal b/jmacro-rpc-snap.cabal
--- a/jmacro-rpc-snap.cabal
+++ b/jmacro-rpc-snap.cabal
@@ -1,20 +1,20 @@
 Name:                jmacro-rpc-snap
-Version:             0.1
+Version:             0.2
 Homepage:            http://patch-tag.com/r/gershomb/jmacro-rpc
 License:             BSD3
 License-file:        LICENSE
 Author:              Gershom Bazerman
 Maintainer:          gershomb@gmail.com
-Category:            Network
+Category:            Network, Web
 Build-type:          Simple
 Cabal-version:       >=1.6
 Synopsis:            Snap backend for jmacro-rpc
-Description:         Provides functions for serving jmacro-rpc json rpcs from Snap.
+Description:         Provides functions for serving jmacro-rpc json rpcs and panels from Snap.
 
 Library
   Exposed-modules: Network.JMacroRPC.Snap
   
-  Build-depends: base >= 4, base < 7, bytestring > 0.9, jmacro > 0.5, jmacro-rpc >= 0.1, mtl >= 2, containers >= 0.4, snap-core >= 0.8, aeson >= 0.5
+  Build-depends: base >= 4, base < 7, bytestring > 0.9, jmacro > 0.6, jmacro-rpc >= 0.2, mtl >= 2, containers >= 0.4, snap-core >= 0.8, aeson >= 0.5
 
   ghc-options: -Wall  
   
