admin
Admin UI and CRUD management tooling for Boundary entities. Generates admin interfaces automatically from entity configuration — no manual forms.
Technology stack
| 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 |
Key namespaces
| Namespace | Purpose |
|---|---|
|
Main admin UI rendering (tables, forms, layout composition) |
|
Shared Lucide icon rendering |
|
Admin HTTP handlers and HTMX fragment endpoints |
Entity configuration
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}}
Adding a new module
-
Create
resources/conf/dev/admin/{module}.edn -
Add
#include "admin/{module}.edn"to the#mergevector inconfig.edn -
(reset)to reload configuration
UI conventions
-
Standalone data-entry forms (login, register, create/edit) get
form.form-cardclass -
Button-wrapper forms (logout, delete, revoke) get no class
-
Page header pattern:
h1+pin a plain[:div], with.page-actionsas sibling -
Tables:
[:div.table-wrapper > table.data-table]
Testing
clojure -M:test:db/h2 :admin