Building web applications with Clojure can be productive and fun, assuming you’re familiar with the underlying protocols and technologies of the web.
curl http://localhost:3000/ | htmlq h1
<h1 class="mt-2 text-4xl font-semibold tracking-tight text-gray-900 sm:text-6xl">Coming soon!</h1>
We have a collection of bin scripts to package up common tasks:
bin/create-migration
: Createup
anddown
files for SQL-based schema migrationsbin/lint
: Spot issues and critique style according to subjective sensibilitiesbin/nrepl
: Start an nREPL server (best invoked viadevenv
)bin/tailwind
: Run a Tailwind process to watch for use of TailwindCSS classesbin/test
: Run tests (assuming PostgreSQL is available)
. ├── README.org ├── bin │ ├── create-migration │ ├── lint │ ├── nrepl │ ├── tailwind │ └── test ├── deps.edn ├── dev │ ├── user.clj │ └── web │ ├── db.clj │ ├── dev.clj │ └── nrepl.clj ├── dev-resources │ └── logback.xml ├── devenv.lock ├── devenv.nix ├── devenv.yaml ├── docker │ ├── Dockerfile.postgres │ └── init.sql ├── docker-compose.yml ├── package.json ├── pnpm-lock.yaml ├── resources │ ├── migrations │ │ ├── 20250314165829-create-schema.down.sql │ │ └── 20250314165829-create-schema.up.sql │ └── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── app.css │ ├── app.js │ ├── apple-touch-icon.png │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── js │ ├── [email protected] │ └── [email protected] ├── src │ └── web │ ├── assets.clj │ ├── concierge.clj │ ├── config.clj │ ├── interceptors.clj │ ├── page.clj │ ├── postgres │ │ ├── employment.clj │ │ ├── group.clj │ │ ├── organization.clj │ │ ├── user.clj │ │ └── verified_domain.clj │ ├── postgres.clj │ ├── router.clj │ ├── service │ │ ├── manifest.clj │ │ └── root.clj │ ├── service.clj │ ├── spec.clj │ ├── string.clj │ ├── system.clj │ └── ui.clj ├── styles │ └── tailwind.css ├── tailwind.config.cjs ├── test │ └── web │ ├── postgres_test.clj │ ├── service_test.clj │ └── test │ ├── hooks.clj │ ├── html.clj │ ├── service.clj │ └── system.clj └── tests.edn 18 directories, 60 files
The easiest way to start a development environment is via Nix and devenv:
devenv up
Start PostgreSQL as per your preference and provide a database URL to the nREPL server process like so:
DATABASE_URL='jdbc:postgresql://127.0.0.1:5432/web_dev?user=web&password=please' \
bin/nrepl
For convenience, we provide a Docker Compose file that will run PostgreSQL locally for those who prefer containers.