Halcyon shootout

Halcyon is a system for installing Haskell apps and development tools, including GHC and Cabal.

These examples are intended to compare build times and sizes across most Haskell web frameworks.

Each example app can be installed in one command on most recent Linux distributions, including CentOS 7, Debian 8, Fedora 21, and Ubuntu 15.04.

Additionally, each example app can be deployed in one click to DigitalOcean or Heroku.

Results

Comments

The test simulates installing each example for the first time, by forcing Halcyon to rebuild the sandbox and the app from scratch. GHC and Cabal are restored from local cache.

The times given are mean [low, high], calculated across 10 test runs. Each test run consists of building all example apps on an 8 GB DigitalOcean droplet, running Ubuntu 14.04.

The raw results are available as a CSV file. To reproduce the results, use the Halcyon test script:

$ halcyon/bin/test shootout --bench
...
hello-yesod,10,521,535,537,251MB,25MB

The output of the test script includes:

  • App name
  • GHC and Cabal restore time
  • Sandbox build time
  • App build time
  • App install time
  • Sandbox size
  • App size

hello-apiary

Framework: apiary 1.2.3
Server: warp 3.0.6
Dependencies: 54 and alex 3.1.4
First build time:
Sandbox size:
App size:
Source code: hello-apiary

Main.hs

Toggle
import Network.Wai.Handler.Warp
import Web.Apiary
import Web.Apiary.Heroku

main :: IO ()
main =
  runHeroku run def $
    action $ bytes "Hello, world!"

Extra dependencies

Usage

$ PORT=8080 hello-apiary

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-apiary
-----> Cloning https://github.com/mietek/hello-apiary... done, 4db6a68
-----> Installing hello-apiary-1.0
-----> Determining constraints
       Label:                                    **hello-apiary-1.0**
       Prefix:                                   **/app**
       Source hash:                              **2c8b323**
       Constraints hash:                         **34cee3a**
       Magic hash:                               **9ab52f3**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**
       Sandbox magic hash:                       **1dd8630**
       Sandbox extra apps:                       **alex-3.1.4**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Installing sandbox extra apps
       -----> Unpacking app
       -----> Installing alex-3.1.4
              Label:                                    **alex-3.1.4**
              Prefix:                                   **/app/sandbox**
              Source hash:                              **ba3f51d**
              External storage:                         **public**
              GHC version:                              **7.8.4**

       -----> Restoring install directory
              Extracting halcyon-install-ba3f51d-alex-3.1.4.tar.gz... done, 2.5MB
       -----> Installing app to /app/sandbox
       -----> Installed alex-3.1.4
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed apiary-1.2.3
-----> Sandbox built, 76MB
       Removing documentation from sandbox directory... done, 75MB
       Stripping sandbox directory... done, 65MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-34cee3a.1dd8630-hello-apiary-1.0.tar.gz... done, 11MB

-----> Configuring app
-----> Building app
       Building hello-apiary-1.0...
       Preprocessing executable 'hello-apiary' for hello-apiary-1.0...
       ...
       Linking dist/build/hello-apiary/hello-apiary ...
-----> App built, 9.6MB
       Stripping app... done, 7.3MB
-----> Archiving build directory
       Creating halcyon-build-hello-apiary-1.0.tar.gz... done, 1.6MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 7.0MB
-----> Archiving install directory
       Creating halcyon-install-2c8b323-hello-apiary-1.0.tar.gz... done, 1.6MB
-----> Installing app to /app
-----> Installed hello-apiary-1.0

-----> App installed:                            **hello-apiary-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-happstack

Framework: happstack-lite 7.3.6
Server: happstack-server 7.4.0
Dependencies: 43
First build time:
Sandbox size:
App size:
Source code: hello-happstack

Main.hs

Toggle
import Happstack.Lite
import System.Environment

main :: IO ()
main = do
    env <- getEnvironment
    let port_ = maybe 8080 read $ lookup "PORT" env
        config = defaultServerConfig { port = port_ }
    serve (Just config) $
      ok $ toResponse "Hello, world!"

Usage

$ PORT=8080 hello-happstack

Installation

Toggle

-----> Cloning https://github.com/mietek/hello-happstack... done, 464deac
-----> Installing hello-happstack-1.0
-----> Determining constraints
       Label:                                    **hello-happstack-1.0**
       Prefix:                                   **/app**
       Source hash:                              **a3e96f1**
       Constraints hash:                         **3b0b768**
       Magic hash:                               **52d0f07**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed happstack-server-7.4.0
       Installed happstack-lite-7.3.6
-----> Sandbox built, 65MB
       Removing documentation from sandbox directory... done, 64MB
       Stripping sandbox directory... done, 55MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-3b0b768-hello-happstack-1.0.tar.gz... done, 8.8MB

-----> Configuring app
-----> Building app
       Building hello-happstack-1.0...
       Preprocessing executable 'hello-happstack' for hello-happstack-1.0...
       ...
       Linking dist/build/hello-happstack/hello-happstack ...
-----> App built, 12MB
       Stripping app... done, 8.7MB
-----> Archiving build directory
       Creating halcyon-build-hello-happstack-1.0.tar.gz... done, 1.8MB

-----> Preparing install directory
-----> Install directory prepared, 8.4MB
-----> Archiving install directory
       Creating halcyon-install-a3e96f1-hello-happstack-1.0.tar.gz... done, 1.7MB
-----> Installing app to /app
-----> Installed hello-happstack-1.0

-----> App installed:                            **hello-happstack-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-mflow

Framework: MFlow 0.4.5.9
Server: warp 3.0.6
Dependencies: 108 and cpphs 1.18.8
First build time:
Sandbox size:
App size:
Source code: hello-mflow

Main.hs

Toggle
import MFlow.Wai.Blaze.Html.All

main :: IO ()
main =
    runNavigation "hello" $ transientNav $
      page $ "Hello, world!" ++> empty

Extra dependencies

Usage

$ PORT=8080 hello-mflow

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-mflow
-----> Cloning https://github.com/mietek/hello-mflow... done, d79dba3
-----> Installing hello-mflow-1.0
-----> Determining constraints
       Label:                                    **hello-mflow-1.0**
       Prefix:                                   **/app**
       Source hash:                              **931df8b**
       Constraints hash:                         **d031451**
       Magic hash:                               **e710ffa**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**
       Sandbox magic hash:                       **5ff190e**
       Sandbox extra apps:                       **cpphs-1.18.8**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Installing sandbox extra apps
       -----> Unpacking app
       -----> Installing cpphs-1.18.8
              Label:                                    **cpphs-1.18.8**
              Prefix:                                   **/app/sandbox**
              Source hash:                              **15d7c8e**
              External storage:                         **public**
              GHC version:                              **7.8.4**

       -----> Restoring install directory
              Extracting halcyon-install-15d7c8e-cpphs-1.18.8.tar.gz... done, 3.3MB
       -----> Installing app to /app/sandbox
       -----> Installed cpphs-1.18.8
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed MFlow-0.4.5.9
-----> Sandbox built, 155MB
       Removing documentation from sandbox directory... done, 154MB
       Stripping sandbox directory... done, 133MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-d031451.5ff190e-hello-mflow-1.0.tar.gz... done, 23MB

-----> Configuring app
-----> Building app
       Building hello-mflow-1.0...
       Preprocessing executable 'hello-mflow' for hello-mflow-1.0...
       ...
       Linking dist/build/hello-mflow/hello-mflow ...
-----> App built, 21MB
       Stripping app... done, 15MB
-----> Archiving build directory
       Creating halcyon-build-hello-mflow-1.0.tar.gz... done, 3.4MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 15MB
-----> Archiving install directory
       Creating halcyon-install-931df8b-hello-mflow-1.0.tar.gz... done, 3.3MB
-----> Installing app to /app
-----> Installed hello-mflow-1.0

-----> App installed:                            **hello-mflow-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-miku

Framework: miku 2014.11.17
Server: snap-server 0.9.4.6
Dependencies: 59
First build time:
Sandbox size:
App size:
Source code: hello-miku

Main.hs

Toggle
import Network.Miku
import Hack2.Handler.SnapServer
import System.Environment

main :: IO ()
main = do
    env <- getEnvironment
    let port_ = maybe 8080 read $ lookup "PORT" env
    runWithConfig (ServerConfig port_) . miku $
      get "/" (text "Hello, world!")

Usage

$ PORT=8080 hello-miku

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-miku
-----> Cloning https://github.com/mietek/hello-miku... done, 0ca7468
-----> Installing hello-miku-1.0
-----> Determining constraints
       Label:                                    **hello-miku-1.0**
       Prefix:                                   **/app**
       Source hash:                              **d2ce38b**
       Constraints hash:                         **1d84a99**
       Magic hash:                               **d849f1f**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed miku-2014.11.17
       Installed snap-server-0.9.4.6
-----> Sandbox built, 85MB
       Removing documentation from sandbox directory... done, 84MB
       Stripping sandbox directory... done, 73MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-1d84a99-hello-miku-1.0.tar.gz... done, 13MB

-----> Configuring app
-----> Building app
       Building hello-miku-1.0...
       Preprocessing executable 'hello-miku' for hello-miku-1.0...
       ...
       Linking dist/build/hello-miku/hello-miku ...
-----> App built, 13MB
       Stripping app... done, 11MB
-----> Archiving build directory
       Creating halcyon-build-hello-miku-1.0.tar.gz... done, 2.2MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 11MB
-----> Archiving install directory
       Creating halcyon-install-d2ce38b-hello-miku-1.0.tar.gz... done, 2.1MB
-----> Installing app to /app
-----> Installed hello-miku-1.0

-----> App installed:                            **hello-miku-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-scotty

Framework: scotty 0.9.1
Server: warp 3.0.6
Dependencies: 76
First build time:
Sandbox size:
App size:
Source code: hello-scotty

Main.hs

Toggle
import System.Environment
import Web.Scotty

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    scotty port $
      get "/" $ text "Hello, world!"

Usage

$ PORT=8080 hello-scotty

Installation

Toggle

-----> Cloning https://github.com/mietek/hello-scotty... done, d858114
-----> Installing hello-scotty-1.0
-----> Determining constraints
       Label:                                    **hello-scotty-1.0**
       Prefix:                                   **/app**
       Source hash:                              **96454ee**
       Constraints hash:                         **110abd2**
       Magic hash:                               **69d5fd3**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed scotty-0.9.1
-----> Sandbox built, 84MB
       Removing documentation from sandbox directory... done, 84MB
       Stripping sandbox directory... done, 73MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-110abd2-hello-scotty-1.0.tar.gz... done, 12MB

-----> Configuring app
-----> Building app
       Building hello-scotty-1.0...
       Preprocessing executable 'hello-scotty' for hello-scotty-1.0...
       ...
       Linking dist/build/hello-scotty/hello-scotty ...
-----> App built, 12MB
       Stripping app... done, 9.4MB
-----> Archiving build directory
       Creating halcyon-build-hello-scotty-1.0.tar.gz... done, 2.1MB

-----> Preparing install directory
-----> Install directory prepared, 9.0MB
-----> Archiving install directory
       Creating halcyon-install-96454ee-hello-scotty-1.0.tar.gz... done, 2.0MB
-----> Installing app to /app
-----> Installed hello-scotty-1.0

-----> App installed:                            **hello-scotty-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-servant

Framework: servant 0.2.1
Server: warp 3.0.6
Dependencies: 101
First build time:
Sandbox size:
App size:
Source code: hello-servant

Main.hs

Toggle
import Data.Proxy
import Data.Text
import Network.Wai.Handler.Warp
import Servant
import System.Environment

type Hello = Get Text

server :: Server Hello
server = return "Hello, world!"

proxy :: Proxy Hello
proxy = Proxy

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    run port $ serve proxy server

Usage

$ PORT=8080 hello-servant

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-servant
-----> Cloning https://github.com/mietek/hello-servant... done, 6bec98b
-----> Installing hello-servant-1.0
-----> Determining constraints
       Label:                                    **hello-servant-1.0**
       Prefix:                                   **/app**
       Source hash:                              **78f958d**
       Constraints hash:                         **f458aa8**
       Magic hash:                               **3bffeae**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed servant-0.2.1
       Installed warp-3.0.6
-----> Sandbox built, 160MB
       Removing documentation from sandbox directory... done, 159MB
       Stripping sandbox directory... done, 140MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-f458aa8-hello-servant-1.0.tar.gz... done, 24MB

-----> Configuring app
-----> Building app
       Building hello-servant-1.0...
       Preprocessing executable 'hello-servant' for hello-servant-1.0...
       ...
       Linking dist/build/hello-servant/hello-servant ...
-----> App built, 11MB
       Stripping app... done, 8.6MB
-----> Archiving build directory
       Creating halcyon-build-hello-servant-1.0.tar.gz... done, 1.9MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 8.1MB
-----> Archiving install directory
       Creating halcyon-install-78f958d-hello-servant-1.0.tar.gz... done, 1.8MB
-----> Installing app to /app
-----> Installed hello-servant-1.0

-----> App installed:                            **hello-servant-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-simple

Framework: simple 0.10.1
Server: warp 3.0.6
Dependencies: 72
First build time:
Sandbox size:
App size:
Source code: hello-simple

Main.hs

Toggle
import Network.Wai.Handler.Warp
import System.Environment
import Web.Simple

app :: (Application -> IO ()) -> IO ()
app runner = do
    runner $ controllerApp () $ do
      routeTop $ respond $
        ok "text/plain" "Hello, world!"

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    app (run port)

Usage

$ PORT=8080 hello-simple

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-simple
-----> Cloning https://github.com/mietek/hello-simple... done, 13e6b52
-----> Installing hello-simple-1.0
-----> Determining constraints
       Label:                                    **hello-simple-1.0**
       Prefix:                                   **/app**
       Source hash:                              **4ad50e1**
       Constraints hash:                         **4db1fca**
       Magic hash:                               **7624c31**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed simple-0.10.1
-----> Sandbox built, 102MB
       Removing documentation from sandbox directory... done, 102MB
       Stripping sandbox directory... done, 89MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-4db1fca-hello-simple-1.0.tar.gz... done, 16MB

-----> Configuring app
-----> Building app
       Building hello-simple-1.0...
       Preprocessing executable 'hello-simple' for hello-simple-1.0...
       ...
       Linking dist/build/hello-simple/hello-simple ...
-----> App built, 6.6MB
       Stripping app... done, 5.3MB
-----> Archiving build directory
       Creating halcyon-build-hello-simple-1.0.tar.gz... done, 1.2MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 4.9MB
-----> Archiving install directory
       Creating halcyon-install-4ad50e1-hello-simple-1.0.tar.gz... done, 1.1MB
-----> Installing app to /app
-----> Installed hello-simple-1.0

-----> App installed:                            **hello-simple-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-snap

Framework: snap-core 0.9.6.4
Server: snap-server 0.9.4.6
Dependencies: 42
First build time:
Sandbox size:
App size:
Source code: hello-snap

Main.hs

Toggle
import Snap.Core
import Snap.Http.Server
import System.Environment

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
        config = setPort port
               . setAccessLog ConfigNoLog
               . setErrorLog ConfigNoLog
               $ defaultConfig
    httpServe config $
      ifTop $ writeBS "Hello, world!"

Usage

$ PORT=8080 hello-snap

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-snap
-----> Cloning https://github.com/mietek/hello-snap... done, b47331a
-----> Installing hello-snap-1.0
-----> Determining constraints
       Label:                                    **hello-snap-1.0**
       Prefix:                                   **/app**
       Source hash:                              **4cc052a**
       Constraints hash:                         **335d31e**
       Magic hash:                               **c12b874**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed snap-core-0.9.6.4
       Installed snap-server-0.9.4.6
-----> Sandbox built, 75MB
       Removing documentation from sandbox directory... done, 75MB
       Stripping sandbox directory... done, 65MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-335d31e-hello-snap-1.0.tar.gz... done, 11MB

-----> Configuring app
-----> Building app
       Building hello-snap-1.0...
       Preprocessing executable 'hello-snap' for hello-snap-1.0...
       ...
       Linking dist/build/hello-snap/hello-snap ...
-----> App built, 12MB
       Stripping app... done, 9.4MB
-----> Archiving build directory
       Creating halcyon-build-hello-snap-1.0.tar.gz... done, 1.9MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 9.2MB
-----> Archiving install directory
       Creating halcyon-install-4cc052a-hello-snap-1.0.tar.gz... done, 1.9MB
-----> Installing app to /app
-----> Installed hello-snap-1.0

-----> App installed:                            **hello-snap-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-spock

Framework: Spock 0.7.7.0
Server: warp 3.0.6
Dependencies: 78
First build time:
Sandbox size:
App size:
Source code: hello-spock

Main.hs

Toggle
import System.Environment
import Web.Spock.Safe

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    runSpock port $ spockT id $
      get "/" $ text "Hello, world!"

Usage

$ PORT=8080 hello-spock

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-spock
-----> Cloning https://github.com/mietek/hello-spock... done, 73550da
-----> Installing hello-spock-1.0
-----> Determining constraints
       Label:                                    **hello-spock-1.0**
       Prefix:                                   **/app**
       Source hash:                              **f616025**
       Constraints hash:                         **b94066d**
       Magic hash:                               **ade4ef3**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed Spock-0.7.7.0
-----> Sandbox built, 94MB
       Removing documentation from sandbox directory... done, 93MB
       Stripping sandbox directory... done, 80MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-b94066d-hello-spock-1.0.tar.gz... done, 14MB

-----> Configuring app
-----> Building app
       Building hello-spock-1.0...
       Preprocessing executable 'hello-spock' for hello-spock-1.0...
       ...
       Linking dist/build/hello-spock/hello-spock ...
-----> App built, 12MB
       Stripping app... done, 9.4MB
-----> Archiving build directory
       Creating halcyon-build-hello-spock-1.0.tar.gz... done, 2.1MB

-----> Preparing install directory
-----> Install directory prepared, 8.9MB
-----> Archiving install directory
       Creating halcyon-install-f616025-hello-spock-1.0.tar.gz... done, 2.0MB
-----> Installing app to /app
-----> Installed hello-spock-1.0

-----> App installed:                            **hello-spock-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-wai

Framework: wai 3.0.2.2
Server: warp 3.0.6
Dependencies: 41
First build time:
Sandbox size:
App size:
Source code: hello-wai

Main.hs

Toggle
import Network.HTTP.Types
import Network.Wai
import Network.Wai.Handler.Warp
import System.Environment

app :: Application
app _ respond =
    respond $
      responseLBS status200
        [("Content-Type", "text/plain")]
        "Hello, world!"

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    run port app

Usage

$ PORT=8080 hello-wai

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-wai
-----> Cloning https://github.com/mietek/hello-wai... done, c08c907
-----> Installing hello-wai-1.0
-----> Determining constraints
       Label:                                    **hello-wai-1.0**
       Prefix:                                   **/app**
       Source hash:                              **d7c23a9**
       Constraints hash:                         **ffec23f**
       Magic hash:                               **815d4c4**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed wai-3.0.2.2
       Installed warp-3.0.6
-----> Sandbox built, 47MB
       Removing documentation from sandbox directory... done, 46MB
       Stripping sandbox directory... done, 40MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-ffec23f-hello-wai-1.0.tar.gz... done, 6.7MB

-----> Configuring app
-----> Building app
       Building hello-wai-1.0...
       Preprocessing executable 'hello-wai' for hello-wai-1.0...
       ...
       Linking dist/build/hello-wai/hello-wai ...
-----> App built, 6.2MB
       Stripping app... done, 5.0MB
-----> Archiving build directory
       Creating halcyon-build-hello-wai-1.0.tar.gz... done, 1.2MB

-----> Preparing install directory
-----> Install directory prepared, 4.7MB
-----> Archiving install directory
       Creating halcyon-install-d7c23a9-hello-wai-1.0.tar.gz... done, 1.1MB
-----> Installing app to /app
-----> Installed hello-wai-1.0

-----> App installed:                            **hello-wai-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-wheb

Framework: Wheb 0.3.1.0
Server: warp 3.0.6
Dependencies: 100
First build time:
Sandbox size:
App size:
Source code: hello-wheb

Main.hs

Toggle
import System.Environment
import Web.Wheb

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe (8080 :: Int) read
             $ lookup "PORT" env
    opts <- genMinOpts $ do
      addGET "." rootPat $ (text "Hello, world!")
      addSetting' "port" port
    runWhebServer opts

Usage

$ PORT=8080 hello-wheb

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-wheb
-----> Cloning https://github.com/mietek/hello-wheb... done, 24f9824
-----> Installing hello-wheb-1.0
-----> Determining constraints
       Label:                                    **hello-wheb-1.0**
       Prefix:                                   **/app**
       Source hash:                              **b572bc1**
       Constraints hash:                         **c8cc6cc**
       Magic hash:                               **0c8a416**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed Wheb-0.3.1.0
-----> Sandbox built, 148MB
       Removing documentation from sandbox directory... done, 147MB
       Stripping sandbox directory... done, 129MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-c8cc6cc-hello-wheb-1.0.tar.gz... done, 23MB

-----> Configuring app
-----> Building app
       Building hello-wheb-1.0...
       Preprocessing executable 'hello-wheb' for hello-wheb-1.0...
       ...
       Linking dist/build/hello-wheb/hello-wheb ...
-----> App built, 11MB
       Stripping app... done, 7.6MB
-----> Archiving build directory
       Creating halcyon-build-hello-wheb-1.0.tar.gz... done, 1.7MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 7.1MB
-----> Archiving install directory
       Creating halcyon-install-b572bc1-hello-wheb-1.0.tar.gz... done, 1.7MB
-----> Installing app to /app
-----> Installed hello-wheb-1.0

-----> App installed:                            **hello-wheb-1.0**

Deploy to DigitalOcean Deploy to Heroku

hello-yesod

Framework: yesod 1.4.1.4
Server: warp 3.0.6
Dependencies: 148
First build time:
Sandbox size:
App size:
Source code: hello-yesod

Main.hs

Toggle
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}

import System.Environment
import Yesod

data Hello = Hello

mkYesod "Hello" [parseRoutes|/ HomeR GET|]

instance Yesod Hello

getHomeR :: Handler String
getHomeR = return "Hello, world!"

main :: IO ()
main = do
    env <- getEnvironment
    let port = maybe 8080 read $ lookup "PORT" env
    warp port Hello

Usage

$ PORT=8080 hello-yesod

Installation

Toggle

$ halcyon install https://github.com/mietek/hello-yesod
-----> Cloning https://github.com/mietek/hello-yesod... done, a91e42d
-----> Installing hello-yesod-1.0
-----> Determining constraints
       Label:                                    **hello-yesod-1.0**
       Prefix:                                   **/app**
       Source hash:                              **d47f851**
       Constraints hash:                         **1a1d740**
       Magic hash:                               **de9e85b**
       External storage:                         **public**
       GHC version:                              **7.8.4**
       Cabal version:                            **1.20.0.3**
       Cabal repository:                         **Hackage**

-----> Restoring GHC directory
       Extracting halcyon-ghc-7.8.4.tar.gz... done, 701MB

-----> Restoring Cabal directory
       Extracting halcyon-cabal-1.20.0.3-hackage-2015-01-23.tar.gz... done, 182MB

-----> Building sandbox directory
-----> Creating sandbox
-----> Building sandbox
       Resolving dependencies...
       Notice: installing into a sandbox located at /app/sandbox
       ...
       Installed warp-3.0.6
       Installed yesod-1.4.1.4
-----> Sandbox built, 255MB
       Removing documentation from sandbox directory... done, 254MB
       Stripping sandbox directory... done, 220MB
-----> Archiving sandbox directory
       Creating halcyon-sandbox-1a1d740-hello-yesod-1.0.tar.gz... done, 39MB

-----> Configuring app
-----> Building app
       Building hello-yesod-1.0...
       Preprocessing executable 'hello-yesod' for hello-yesod-1.0...
       ...
       Loading package warp-3.0.6 ... linking ... done.
       Loading package yesod-1.4.1.4 ... linking ... done.

       Main.hs:10:1: Warning:
           Defined but not used: type constructor or class ‘Widget’

       Main.hs:10:1: Warning: Defined but not used: ‘resourcesHello’
       Linking dist/build/hello-yesod/hello-yesod ...
-----> App built, 25MB
       Stripping app... done, 20MB
-----> Archiving build directory
       Creating halcyon-build-hello-yesod-1.0.tar.gz... done, 3.9MB

-----> Preparing install directory
-----> Installing extra data files for dependencies
-----> Install directory prepared, 19MB
-----> Archiving install directory
       Creating halcyon-install-d47f851-hello-yesod-1.0.tar.gz... done, 3.8MB
-----> Installing app to /app
-----> Installed hello-yesod-1.0

-----> App installed:                            **hello-yesod-1.0**

Deploy to DigitalOcean Deploy to Heroku