Easy-to-use, feature-complete Web framework without boilerplate.
...all without sacrificing ease of use — Dream has:
Every part of the API is arranged to be easy to understand, use, and remember.
Dream sticks to base OCaml types like
list, introducing only a
few types of its own — and some of those are just abbreviations
for bare functions!
The neat interface is not a limitation. Everything is still configurable by a large number of optional arguments, and very loose coupling. Where necessary, Dream exposes the lower-level machinery that it is composed from. For example, the basic body and WebSocket readers return strings, but you can also do zero-copy streaming.
And, even though Dream is presented as one package for ordinary usage, it is internally factored into several sub-libraries, according to the different dependencies of each, for fast porting to different environments.
Dream is a low-level and unopinionated framework, and you can swap out its conveniences. For example, you can use TyXML with server-side JSX instead of Dream's built-in templates. You can bundle assets into a single Dream binary, or use Dream in a subcommand. Dream tries to be as functional as possible, touching global runtime state only lazily, when called into.
bash -c "$(curl -fsSL https://raw.githubusercontent.com/aantron/dream/master/example/quickstart.sh)"
Visit any of the examples, such as
2-middleware, and re-create the files locally. The file
shows how to depend on Dream. All of the examples are installed by running
npx esy, and started with
npx esy start.
opam install dream
dune exec ./middleware.exe
1-hello, the Dream version of Hello, world!
dream-cli— command-line interface for Dream applications.
dream-encoding— compression middleware.
dream-livereload— live reloading.
emile— email address syntax validation.
letters— SMTP client.
dream-mail-example— sends email using RabbitMQ and Mailgun [blog post, discuss].
dream-melange-tea-tailwind— The Elm Architecture with a Dream server, client compiled by Melange.
Apart from the issues, good places to discuss Dream are...
@antron to poke @aantron specifically.
All kinds of contributions are welcome, including examples, links to blogs, related libraries, and, of course, PRs! See CONTRIBUTING.md.
As an immediate note, if you'd like to clone the repo, be sure to use
--recursive, because Dream uses several git submodules:
git clone https://github.com/aantron/dream.git --recursive
Dream is based on work by the authors and contributors of its many dependencies and their transitive dependencies. There are, however, several influences that cannot be discovered directly: