Edging forward – an update about our Edge project

Clojure is a great language for building systems. One of the reasons Clojure isn’t more well known is that it can be difficult and time-consuming for programmers to set up their own development environment where they experience just how effective the language can be.

Back in 2016, I wrote about our Edge project, which is designed to help make it easier for people to started with their own Clojure projects.

Over the past couple of years we’ve heard of a number of project teams that have successfully used Edge as the base-camp for their ascent of new unclimbed peaks. All the while we’ve been refining Edge, making gradual improvements to keep it up-to-date. So now let me update you on what is in Edge 'master' today.

Fast feedback

Clojure is a Lisp, and one of the key benefits of this family of programming languages is they are designed from the ground up to support 'live' programming, making incremental improvements to running software. This makes for a hugely productivity workflow.

We’ve kept the 'reloaded workflow' of hot-loading updated code when triggered with an explicit reset, powered by the clojure.tools.namespace library which automatically detects and reloads your code changes. But we’ve also extended this into the realm of web apps, with hot-loading of changes to HTML, CSS and ClojureScript. This is all thanks to one of our newer projects, kick, which provides an embeddable and extensible build process inside apps. More about kick below.

Modular architecture

We’ve retained the system-oriented component design, but made the decision to switch out Stuart Sierra’s 'component' library for James Reeves' Integrant replacement. We think Integrant is the best way of defining, and configuring, the modular architecture we’ve gone for in Edge.

Talking of configuration, we’ve retained the approach of a single configuration file which supports multiple different environments, using our Aero configuration library, but with seamless integration with Integrant.

Adoption of tools.deps

Edge originally used Leiningen to launch itself, but we eventually moved to boot. Now we’ve changed again, this time to Clojure’s officially-supported tools.deps.

Edge is designed to be easy to modify, by using open architectural principles and well understood idioms battle-tested by us and our colleagues in the professional Clojure community on countless projects. Yet our decision to adopt tools.deps has enabled further modularity, allowing us to break Edge into numerous modules each with their own dependencies. This has the added benefit of looser coupling between the Edge infrastructure and the applications built upon it, making it easier to upgrade one independently of the other.

Deployment

We’ve got some really exciting news to report about deploying Edge. We’ve added an integration with our pack tool, for building uberjars which are ready-to-go and runnable wherever you have a Java runtime.

But we’ve also built in support for running Edge in a raw unpacked mode, much like you run Edge when you’re developing. This means you still get advanced optimized ClojureScript and CSS, but with a unique ability to update the application while it’s running, with minimal downtime. This is how we’ve been running smaller projects such as our own juxt.pro website.

How does this work? Well, we believe "builds are just programs" and we’ve long suspected Clojure is the best programming language for writing them. Inside Edge we have some cool tech we call 'kick', which can be used both at 'compile' time when creating runnable uberjars and at runtime, for the system to build and rebuild 'itself' whenever necessary.

Developer experience

As well as improved documentation, we’ve worked hard on the overall 'developer experience', or 'DX'. We’ve added more help at the command line, adding integration with Bruce Hauman’s rebel-readline project and adding colors.

We’ve created scripts to generate new Edge modules (which can be developed as individual projects such as micro-services within your Edge fork), and started to create a series of example modules to demonstrate various features of our stack, such as REST APIs, GraphQL, re-frame, Datomic, time-processing, cloud deployments and much more.

Demo

Here’s a quick 3½ minute demo that should give you a good impression of where we are with Edge and how you can get started with it today.

More to come

I’m really excited about the direction Edge is taking. Watch this space, there’s more to come soon!

Published: 2018-12-12

Privacy policy

Extraterrestrial intelligence oly
by Oliver Hine
Published: 2016-11-08
Cheer up your testing with this small library mal
by Malcolm Sparks
Published: 2015-09-23
A new approach to creating API services on the web mal
by Malcolm Sparks
Published: 2016-06-06