```bash
brew install nimlang
nimble install jester
vim hello.nim
nim compile --run hello.nim
```
```nim
import jester, asyncdispatch, strutils, asyncnet, htmlgen, logging
#
# * CLI *
#
# brew install nimlang
# nimble install jester
# vim hello.nim
# nim compile --run hello.nim
#
# * DOCS *
#
# https://nim-lang.org/docs/htmlgen.html
# https://learnxinyminutes.com/docs/nim/
#
var L = newConsoleLogger()
addHandler(L)
settings:
port = Port(3000)
appName = "/"
bindAddr = "127.0.0.1"
proc layout(content: string): string =
htmlgen.html(htmlgen.body(content))
routes:
get "/":
logging.debug("render form $1 $2" % [$status, $headers])
var content = `div`(
h1(a(href="http://nim-lang.org", title="Hello", "Hello Nim")),
"""
""" % [uri("/", absolute = false)]
)
body.add(layout(content))
status = Http200
post "/":
logging.debug("process form $1 $2" % [$status, $headers])
# TODO: How can we sanitize submitted form data?
var content = `div`(
h1(
a(href="http://nim-lang.org", title="Hello", "Hello $1 $2" % [$request.params["first_name"], $request.params["last_name"]])
),
h4("Form data"),
p($request.params),
)
body.add(layout(content))
status = Http200
runForever()
```