Fullstack Clojure for the Age of AI

LLMs have finite context windows.
Clojure is the most expressive language that exists.

Build fullstack web applications with sub-second feedback loops, 90k+ req/s performance, and minimal boilerplate.

bash
$git clone https://github.com/anomalyco/rakiba.git $cd rakiba && bb init my-app Generating project... Project created successfully. $cd my-app && bb clj

Why Rakiba?

REPL-First Development

Sub-second feedback loops. Change a function, evaluate it, see the result. No restart. No rebuild. No waiting.

High Performance

90k+ requests/second benchmarked on real hardware. The JVM's JIT compiler has 25 years of optimization by some of the best engineers on the planet.

LLM-Optimized

Minimal boilerplate, maximum expressiveness. Every line of code carries meaning. Your AI assistant can do more with less context.

Choose Your Stack

Jetty, http-kit, Undertow, or Aleph. All Ring-compatible and swappable via configuration.

Frontend Flexibility

Re-frame for simplicity, UIx for hooks, or Fulcro for full-stack state management. Or go API-only.

One-Command Deploy

Deploy to local sandbox or VPS with a single command. Production-ready from day one.

The Nature of Lisp

All source code is a tree. Compilers parse it into an Abstract Syntax Tree. XML is also a tree. So any code can be written as XML - and XML can be executed as code. Apache Ant proved this: those build files aren't configuration, they're a programming language.

Lisp's parentheses are just a less verbose way to write that same tree. Code is data. Data is code. The distinction was always fake.

This unlocks something no other language has: macros that receive code as data, transform it with the full power of the language, and return new code. Every language keeps rediscovering pieces of this - Java's lambdas, C#'s LINQ, Rust's proc macros. They're all reaching toward what Lisp had in 1958.

Read More
code-as-data.clj
;; FUNCTION: receives the value
(defn input [value]
  [:input {:value value}])

;; MACRO: receives the SYMBOL - extracts the name!
(defmacro form-field [var]
  `[:input {:name ~(name var) :value ~var}])

(def email "user@example.com")

(input email)
;; => [:input {:value "user@example.com"}]

(form-field email)
;; => [:input {:name "email" :value "user@example.com"}]

See It In Action

Admin Dashboard Screenshot coming soon
Development Workflow Screenshot coming soon
Deployment Screenshot coming soon