A Clojure(Script) library for declarative data description and validation.
One of the difficulties with bringing Clojure into a team is the overhead of understanding the kind of data (e.g., list of strings, nested map from long to string to double) that a function expects and returns. While a full-blown type system is one solution to this problem, we present a lighter weight solution: schemas. (For more details on why we built Schema, check out this post.
- Referenced post: Schema for Clojure(Script) Data Shape Declaration and Validation
Schema is a rich language for describing data shapes, with a variety of features:
- Data validation, with descriptive error messages of failures (targeted at programmers)
- Annotation of function arguments and return values, with optional runtime validation
- Schema-driven data coercion, which can automatically, succinctly, and safely convert complex data types (see the Coercion section below)
- Other
- Schema is also built into our plumbing and fnhouse libraries, which illustrate how we build services and APIs easily and safely with Schema
- Schema also supports experimental clojure.test.check data generation from Schemas, as well as completion of partial datums, features we've found very useful when writing tests as part of the
schema-generatorslibrary
A fast library for rendering HTML in Clojure.
This page exists as an easy reference to compare and contrast the available open source Clojure-Datalog databases. Only databases under active development are listed.
Datalog is a declarative logic programming language that is a syntactic subset of Prolog. While SQL is designed for querying and manipulating tabular databases, Datalog excels at querying graphs, performing deductive inference, and executing complex recursive algorithms.
A Datalog program consists of two main parts:
- EDB (Extensional Database): The raw data or "facts". Similar to rows in a SQL table.
- IDB (Intensional Database): The logical "rules". Similar to SQL Views, but they can be highly recursive and call each other dynamically.
SQL as Clojure data structures. Build queries programmatically -- even at runtime -- without having to bash strings together.
A pure Clojure implementation of the Webdriver protocol, named after Etaoin Shrdlu — a typing machine that came to life after a mysterious note was produced on it.
Use the Etaoin library to automate a browser, test your frontend behaviour, simulate human actions or whatever you want.
Benefits:
- Selenium-free: no big dependencies, no tons of downloaded jars, etc.
- Lightweight, fast. Simple, easy to understand.
- Compact: just one main namespace with a couple of helpers.
Capabilities:
- Currently supports Chrome, Firefox, Safari, and Edge.
- Can either connect to a remote WebDriver process, or have Etaoin launch one for you.
- Run your unit tests directly from Emacs by pressing C-t t as usual.
- Can imitate human-like behaviour (delays, typos, etc).
Welcome! This site is maintained by the Datomic team as an official place for the community to ask questions, request features, and get their problems solved.
Anyone may view the content on this site, but you must have an account to ask questions, provide answers or vote on questions/answers. Authentication is currently done using your GitHub account. Other authentication providers may be added in the future. When you have logged in, please click your user name in the upper right corner and review your profile. If you wish to receive email notifications, please add an email address.
Questions have both categories and tags. Categories (see right sidebar) are a fixed set of Datomic topics. At least a top level category must be selected when asking a question.
There are two special tags:
- problem - describe a problem or question you have
- request - describe a request for enhancement to Datomic
When problems or requests are logged, Datomic developers will assess and create corresponding internal issues for development.
Users may vote on both questions and answers. Votes can help surface the most helpful answers, and may be used to inform decisions about future releases of Datomic.
This Clojure style guide recommends best practices so that real-world Clojure programmers can write code that can be maintained by other real-world Clojure programmers. A style guide that reflects real-world usage gets used, and a style guide that holds to an ideal that has been rejected by the people it is supposed to help risks not getting used at all — no matter how good it is.
Clj-kondo performs static analysis on Clojure, ClojureScript and EDN. It informs you about potential errors while you are typing (without executing your program).
Moldable Live Programming for Clojure
Clerk takes a Clojure namespace and turns it into a notebook. Learn more in the Book of Clerk or read our paper.

A blog mostly about Clojure and ClojureScript.
Membrane provides all the tools you need to build a user interface. While all the pieces are built to work together, each piece is optional or can be mixed and matched with other implementations. For example, you could use your favorite UI framework and the other layers to reach another platform. Alternatively, you could provide your own ncurses graphics backend and leverage the ui framework and graphics model.
The three main pieces are:
- A UI framework, membrane.component, that provides state management for GUIs
- A platform agnostic model for graphics and events
- Multiple graphics backends that provide concrete implementations for #2
For membrane to run on a platform, the only requirements are:
- Drawing implementations for graphical primitives like shapes, text, and images
- An event loop that forwards events (eg. mouse clicks, key presses) to membrane and repaints
cljrs is an experimental Clojure dialect targeting the Rust ecosystem. It aims to be a capable Lisp runtime with persistent data structures, a hosted macro system, and native interop — compiled or interpreted, suitable for use as an agentic coding runtime.
Available on crates.io. Early stage; expect rough edges.
- Introduction - clojurust
clojurust is a Rust-hosted dialect of the Clojure programming language. It reads and executes .cljrs and
.cljc source files, provides an interactive REPL, and can AOT-compile programs to standalone native
binaries. - GitHub - csm/clojurust: Clojure and Rust · GitHub
nREPL is a Clojure network REPL that provides a REPL server and client, along with some common APIs of use to IDEs and other tools that may need to evaluate Clojure code in remote environments.
Jack in to Boot, Clj & Leiningen from Vim. Inspired by the feature in CIDER.el.
Depends on vim-dispatch to run commands in background. If you’re using Neovim I can recommend vim-dispatch-neovim
edn is an extensible data notation. A superset of edn is used by Clojure to represent programs, and it is used by Datomic and other applications as a data transfer format. This spec describes edn in isolation from those and other specific use cases, to help facilitate implementation of readers and writers in other languages, and for other uses.
Welcome reader! This is a book about scripting with Clojure and babashka. Clojure is a functional, dynamic programming language from the Lisp family which runs on the JVM. Babashka is a scripting environment made with Clojure, compiled to native with GraalVM. The primary benefits of using babashka for scripting compared to the JVM are fast startup time and low memory consumption. Babashka comes with batteries included and packs libraries like clojure.tools.cli for parsing command line arguments and cheshire for working with JSON. Moreover, it can be installed just by downloading a self-contained binary.
Sometimes, in a vast and healthy developer ecosystem of a language like Clojure, it can be difficult to know where to get started when you want to build an application. The target audience of this series is developers who have some Clojure syntax in their hands and want to start building applications.
Conjure is an interactive environment for evaluating code within your running program.
The core features of Conjure are language agnostic (although it’s targeted at Lisps for now), with each language client providing their own extra tools. Here’s the currently supported languages, contributions and 3rd party plugins that add clients are highly encouraged! You can find a comparison table for all clients and supported features in the wiki.