| CARVIEW |
Select Language
HTTP/1.1 200 OK
Connection: keep-alive
Server: nginx/1.24.0 (Ubuntu)
Content-Type: text/html; charset=utf-8
Cache-Control: public, max-age=300
Content-Encoding: gzip
Via: 1.1 varnish, 1.1 varnish
Accept-Ranges: bytes
Age: 0
Date: Sat, 17 Jan 2026 06:05:34 GMT
X-Served-By: cache-dfw-ktki8620059-DFW, cache-bom-vanm7210047-BOM
X-Cache: MISS, MISS
X-Cache-Hits: 0, 0
X-Timer: S1768629934.106923,VS0,VE368
Vary: Accept, Accept-Encoding
transfer-encoding: chunked
webby: A super-simple web server framework
[Skip to Readme]
webby: A super-simple web server framework
A super-simple, easy to use web server framework inspired by Scotty. The goals of the project are: (1) Be easy to use (2) Allow graceful exception handling (3) Parse request parameters easily and in a typed manner.
[Skip to Readme]
Flags
Manual Flags
| Name | Description | Default |
|---|---|---|
| examples | Build the examples | Disabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- webby-1.1.1.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
| Versions [RSS] | 0.1.0.0, 0.1.0.1, 0.1.0.2, 0.1.1, 0.1.2, 0.1.3, 0.2.0, 0.3.0, 0.3.1, 0.4.0, 1.0.0, 1.0.1, 1.0.2, 1.1.0, 1.1.1 |
|---|---|
| Change log | ChangeLog.md |
| Dependencies | aeson (>=1.4 && <2.2), base (>=4.7 && <5), binary (>=0.8 && <1), bytestring (>=0.10 && <1), formatting (>=6.3.7 && <7.2), http-api-data (>=0.4 && <0.6), http-types (>=0.12 && <0.13), mime-types (>=0.1 && <0.2), relude (>=0.7), resourcet (>=1.2 && <1.3), text (>=1.2 && <2.1), unliftio (>=0.2.13 && <0.3), unliftio-core (>=0.2 && <0.3), unordered-containers (>=0.2.9 && <0.3), wai (>=3.2 && <3.3), warp, webby [details] |
| Tested with | ghc ==8.4.4, ghc ==8.6.5, ghc ==8.8.4, ghc ==8.10.7, ghc ==9.0.2, ghc ==9.2.7, ghc ==9.4.4 |
| License | Apache-2.0 |
| Author | |
| Maintainer | aditya.mmy@gmail.com, krishnan.parthasarathi@gmail.com |
| Uploaded | by AdityaManthramurthy at 2023-04-24T22:25:39Z |
| Category | Web |
| Home page | https://github.com/donatello/webby |
| Bug tracker | https://github.com/donatello/webby/issues |
| Source repo | head: git clone https://github.com/donatello/webby |
| Distributions | |
| Executables | Basic |
| Downloads | 4835 total (61 in the last 30 days) |
| Rating | (no votes yet) [estimated by Bayesian average] |
| Your Rating |
|
| Status | Docs available [build log] Last success reported on 2023-04-24 [all 1 reports] |
Readme for webby-1.1.1
[back to package description]Webby
An easy to use Haskell web-server inspired by Scotty.
Build
Clone the repo and run stack build
Example
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Main where
import qualified Data.Text as T
import Network.HTTP.Types (status500)
import qualified Network.Wai as W
import qualified Network.Wai.Handler.Warp as W
import Relude hiding (get, put)
import Relude.Print (putTextLn)
import UnliftIO (liftIO)
import qualified UnliftIO.Exception as E
import Webby
-- An example exception handler web-applications can install with webby
appExceptionHandler :: T.Text -> (E.SomeException -> WebbyM appEnv ())
appExceptionHandler appName = \(exception :: E.SomeException) -> do
setStatus status500
let msg = appName <> " failed with " <> show exception
putTextLn msg
text msg
newtype AppEnv = AppEnv Text
deriving (Eq, Show)
-- To demonstrate that appEnv is avaliable via MonadReader interface without any
-- additional boiler-plate
class HasAppName env where
getAppName :: env -> Text
instance HasAppName AppEnv where
getAppName (AppEnv name) = name
main :: IO ()
main = do
-- Define the API routes handled by your web-application
let routes =
[ get "/api/a" (text "a\n"),
get "/api/b" (text "b\n"),
post
"/api/capture/:id"
( do
idVal :: Int <- getCapture "id"
text $ (T.pack (show idVal) `T.append` "\n")
),
get
"/api/isOdd/:val"
( do
val :: Integer <- getCapture "val"
-- if val is odd return the number else we short-circuit the handler
unless (odd val) finish
text $ show val
),
get
"/api/appName"
( do
appName <- asks getAppName --appEnv is only an `ask` away
text appName
),
get "/aaah" (liftIO $ E.throwString "oops!")
]
-- Set the routes definition and exception handler for your
-- web-application
webbyConfig =
setExceptionHandler (appExceptionHandler "MyApp") $
setRoutes routes $
defaultWebbyServerConfig
-- Application environment in this example is a simple Text literal.
-- Usually, application environment would contain database connections
-- etc.
appEnv = AppEnv "test-webby"
webbyApp <- mkWebbyApp appEnv webbyConfig
putStrLn "Starting webserver..."
W.runEnv 7000 webbyApp
You can try the example above, by cloning the repo and running the example:
$ examples/Basic.hs
In another shell, let's curl the server:
$ curl https://localhost:7000/api/a
a
$ curl https://localhost:7000/api/b
b
$ curl -XPOST https://localhost:7000/api/capture/32
32
$ curl https://localhost:7000/api/appName
test-webby
$ curl https://localhost:7000/aaah
MyApp failed with Control.Exception.Safe.throwString called with:
oops!
Called from:
throwString (examples/Basic.hs:55:42 in main:Main)