diff --git a/app/fizzbuzz-server.hs b/app/fizzbuzz-server.hs
new file mode 100644
--- /dev/null
+++ b/app/fizzbuzz-server.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Main (main) where
+
+import Prelude
+
+import Control.Concurrent (threadDelay)
+import Data.ByteString (ByteString)
+import Data.Semigroup ((<>))
+import Data.String (fromString)
+import Numeric.Natural (Natural)
+
+import qualified Network.Simple.TCP as Net
+
+import qualified Options.Applicative as Opt
+
+main :: IO ()
+main =
+  getArgs >>= \args ->
+  Net.serve Net.HostAny (argPort args) accept
+
+accept :: (Net.Socket, Net.SockAddr) -> IO ()
+accept (s, _) =
+    go 1
+  where
+    go i =
+      Net.send s (fizzbuzz i) *>
+      Net.send s "\n" *>
+      threadDelay 500000 *>
+      go (succ i)
+
+fizzbuzz :: Natural -> ByteString
+fizzbuzz i =
+  case (i `mod` 3 == 0, i `mod` 5 == 0) of
+    (True,  False) -> "Fizz"
+    (False, True)  -> "Buzz"
+    (True,  True)  -> "Fizz buzz"
+    (False, False) -> fromString (show i)
+
+data Args = Args
+  { argPort :: String
+  }
+
+getArgs :: IO Args
+getArgs =
+  Opt.execParser $
+  Opt.info (Opt.helper <*> argP) (Opt.header "FizzBizz as a service.")
+
+argP :: Opt.Parser Args
+argP = Args <$> portP
+
+portP :: Opt.Parser Net.ServiceName
+portP =
+  Opt.strOption $
+  Opt.long "port" <>
+  Opt.short 'p' <>
+  Opt.metavar "PORT" <>
+  Opt.help "Service port to bind."
diff --git a/fizzbuzz-as-a-service.cabal b/fizzbuzz-as-a-service.cabal
new file mode 100644
--- /dev/null
+++ b/fizzbuzz-as-a-service.cabal
@@ -0,0 +1,30 @@
+-- This file has been generated from package.yaml by hpack version 0.17.0.
+--
+-- see: https://github.com/sol/hpack
+
+name:           fizzbuzz-as-a-service
+version:        0.1.0.0
+synopsis:       FizzBuzz as a service.
+description:    FizzBuzz as a service.
+category:       Network APIs
+homepage:       https://github.com/chris-martin/haskell-libraries
+author:         Chris Martin <ch.martin@gmail.com>
+maintainer:     Chris Martin <ch.martin@gmail.com>
+license:        Apache-2.0
+license-file:   license.txt
+build-type:     Simple
+cabal-version:  >= 1.10
+
+executable fizzbuzz-server
+  main-is: fizzbuzz-server.hs
+  hs-source-dirs:
+      app
+  default-extensions: NoImplicitPrelude
+  ghc-options: -Wall -threaded
+  build-depends:
+      async
+    , base >= 4.9 && < 4.10
+    , bytestring
+    , network-simple
+    , optparse-applicative
+  default-language: Haskell2010
diff --git a/license.txt b/license.txt
new file mode 100644
--- /dev/null
+++ b/license.txt
@@ -0,0 +1,13 @@
+Copyright 2017 Chris Martin
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
