servies is a micro framework written in bash. It uses netcat to listen for and serve HTTP requests. Defining request handlers is simply done by running a function with the same name as the HTTP method, and passing it a url and command to execute. For example, here's how you would create a new "/greet/" endpoint that you could pass a name to and use in your response:

get "/greet/:name" echo 'hi $name, how are you??'

As you can see, you can add path variables to your urls using syntax that you might find familiar. Any word that starts with a : will be treated as a path variable which is then available to you in the command.


You have full control over the details of your response body. Anything sent to stdout by your handler function or command will be sent back as the response body. By default, your response will be sent back as a 200 OK plain/text response, but there's also a status and a header command that you can use to customize the status code and to add any header you want:

get "/authenticated/:name" authenticate_then_get_data

authenticate_then_get_data() {
  header "Content-Type" "application/json"

  if [ "$name" = "marcos" ]; then
    status 200 "OK"
    echo "{\"number\": 7}"
    status 403 "Forbidden"
    echo "{\"error\": \"invalid name!\"}"

You get the following HTTP commands: get, post, put, and patch. All of which have this signature: name (name: string, ...cmd: string). Along with that there is status and header, and not_found which is called when no routes match an incoming request. This method can be overwritten by you.

Getting started

Getting started is easy. First, make sure you have a newer version of bash install. This may mean using Linux. So first get Linux. Second, download and extract the code. Next run make dependencies to download external libraries we depend on. You can run make install to make the servies command available from anywhere, but this is not required. Once this is done you can run ./servies to start the sample web app or pass in your own source file to run your own app.


All help is appreciated. And even though this is a joke project there are still some very valuable lessons to learn here about bash as a language and projects in a language with a few restrictions. To contribute, first make sure you've done everything in the "Getting started" section and run make lint test before pushing your code. Unit tests are written using expect and shellcheck is the static analyser.