resources/conf/dev/
├── config.edn ← Main config (uses Aero #include)
└── admin/
└── users.edn ← User module's entity config
└── products.edn ← Product module's entity config
Admin UI and CRUD management tooling for Boundary entities. Generates admin interfaces automatically from entity configuration — no manual forms.
| Technology | Purpose |
|---|---|
Hiccup | HTML generation (Clojure data structures → HTML) |
HTMX | Dynamic interactions without a frontend build step |
Pico CSS | Minimal, semantic CSS framework |
Lucide icons | Icon set via |
| Namespace | Purpose |
|---|---|
| Main admin UI rendering (tables, forms, layout composition) |
| Shared Lucide icon rendering |
| Admin HTTP handlers and HTMX fragment endpoints |
Admin entity configs are modular — each module owns its config file:
resources/conf/dev/
├── config.edn ← Main config (uses Aero #include)
└── admin/
└── users.edn ← User module's entity config
└── products.edn ← Product module's entity config
;; admin/products.edn
{:products
{:label "Products"
:list-fields [:name :sku :price :created-at]
:search-fields [:name :sku]
:hide-fields #{:deleted-at}
:readonly-fields #{:id :created-at :updated-at}}}
;; config.edn — include all entity configs
:boundary/admin
{:enabled? true
:entities #merge [#include "admin/users.edn"
#include "admin/products.edn"]
:pagination {:default-page-size 25}}
Create resources/conf/dev/admin/{module}.edn
Add #include "admin/{module}.edn" to the #merge vector in config.edn
(ig-repl/reset) to reload configuration
Standalone data-entry forms (login, register, create/edit) get form.form-card class
Button-wrapper forms (logout, delete, revoke) get no class
Page header pattern: h1 + p in a plain [:div], with .page-actions as sibling
Tables: [:div.table-wrapper > table.data-table]
clojure -M:test:db/h2 :admin
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |