cake-slayer
(do not confuse with cakes-layer
) is a modern and batteries-included framework for creating backend in Haskell for web-applications. It allows you to scaffold working and extensible project in minutes.
Overview🔗
The main goal of cake-slayer
is to provide a backbone for your Haskell backend. Unlike many other Haskell libraries, cake-slayer
doesn’t try to be as abstract as possible. It includes best-practices and makes some architecture decisions for you. On the one hand, your application should satisfy the requirements for using this framework. On the other hand, it takes care of a lot of stuff for you, so you don’t need to worry about everyday problems.
A typical backend does the following:
- Communicates with the frontend (web, mobile) via some wire format (JSON, Protocol Buffers, etc.)
- Talks to the database
- Authenticates and authorizes users
- Has some background jobs
cake-slayer
works exceptionally well if your application uses:
- PostgreSQL as database.
- Elm on the frontend.
The following Haskell packages have been chosen to provide the necessary functional:
postgresql-simple
,postgresql-simple-named
,postgresql-simple-migration
- For connecting and talking to the PostgreSQL database
servant
,servant-swagger
,swagger2
- A family of libraries for defining and documenting Rest API using type-level eDSL
elm-street
- The bridge between Elm and Haskell — generating Elm data types, JSON encoders and decoders from Haskell types automatically
jwt
- User authentication via JWT
bcrypt
- Secure password hashing
ekg
,prometheus-client
- Application performance monitoring. > NOTE: Using
prometheus-client
is optional
- Application performance monitoring. > NOTE: Using
Besides cake-slayer
encourages (but doesn’t force) to use the following libraries:
How to use?🔗
The cake-slayer
framework contains implementations of most common and useful functions. But at the same time, it provides enough flexibility to specify application-specific parts. To integrate cake-slayer
smoothly into your project, you should perform the following steps:
- Define a type of errors your application can throw. See
CakeSlayer.Error
module for details. - Define a monad for your application by specializing the
App
monad from theCakeSlayer.Monad
module. - Derive or implement all necessary instances for your application monad.
cake-slayer
providesMonadJwt
andMonadTimed
effects with sensible default implementations for your convenience.
And you’re good to go!