clojure -M:repl-clj
Boundary ships with a suite of developer tools that give you x-ray vision into your running application. This guide covers the most useful features for day-to-day development.
The dashboard starts automatically when you boot the system with the :dev or :repl-clj alias:
clojure -M:repl-clj
(require '[integrant.repl :as ig-repl])
(ig-repl/go)
;; Dashboard available at http://localhost:9999
;; Application available at http://localhost:3000
The dashboard provides 10 pages: Overview, Routes, Requests, Schemas, Database, Errors, Jobs, Config, Security, and Docs. All pages use HTMX polling for live updates.
When an error occurs, the error pipeline classifies it with a BND code (e.g. BND-201 for validation errors, BND-601 for FC/IS violations). Each code comes with a human-readable explanation and fix suggestion.
Errors are automatically classified when they occur. Use (fix!) to apply the suggested fix:
;; An error occurs...
;; => BND-201: Malli validation failed for :user/CreateUser
;; Missing required key: :email
;; Suggestion: Add :email to the input map
;; Auto-fix (safe fixes apply automatically, risky ones confirm)
(fix!)
Navigate to http://localhost:9999/dashboard/errors to see all recent BND-coded errors with fix suggestions and stack traces.
| Range | Category |
|---|---|
BND-1xx | Configuration (missing env vars, invalid providers, bad config structure) |
BND-2xx | Validation (Malli schema failures, type mismatches) |
BND-3xx | Persistence (SQL errors, migration issues, connection problems) |
BND-4xx | Auth (JWT failures, session issues, permission denied) |
BND-5xx | Interceptor pipeline (missing interceptors, execution errors) |
BND-6xx | FC/IS violations (core importing shell, side effects in core) |
View all registered routes with their interceptor chains:
;; In the REPL
(routes)
;; => prints a formatted route table
;; Or visit http://localhost:9999/dashboard/routes
You can add temporary routes for testing without restarting:
(require '[boundary.devtools.core.router :as router])
;; Add a test route
(router/add-route {:path "/test" :method :get :handler my-handler})
;; Inject a tap interceptor to debug a specific route
(router/inject-tap-interceptor :my-route)
Capture HTTP request/response pairs for debugging:
(require '[boundary.devtools.core.recording :as rec])
;; Create a recording session
(def session (rec/create-session))
;; ... make requests to the application ...
;; View captured entries
(rec/format-entry-table session)
;; => # | Method | Path | Status | Duration
;; 0 | GET | /api/v1/users | 200 | 12ms
;; 1 | POST | /api/v1/users | 201 | 45ms
;; Compare two entries
(rec/diff-entries session 0 1)
;; Save for later
(spit "debug-session.edn" (rec/serialize-session session))
Browse Malli schemas from the REPL or dashboard:
;; Schema tree view
(schema-tree :user/CreateUser)
;; Generate example data
(schema-example :user/CreateUser)
;; => {:email "alice@example.com" :name "Alice" :password "secret123"}
;; Diff two schemas
(schema-diff :user/CreateUser :user/UpdateUser)
Or visit http://localhost:9999/dashboard/schemas for a browsable schema explorer with example generation.
The dashboard’s Database Explorer at http://localhost:9999/dashboard/db shows migration status, connection pool stats, and provides a query runner.
From the REPL:
(def ds (get-in integrant.repl.state/system [:boundary/db-context :datasource]))
(require '[next.jdbc :as jdbc])
(jdbc/execute! ds ["SELECT * FROM users LIMIT 5"])
Check your application’s security posture at http://localhost:9999/dashboard/security:
Password policy strength and per-criterion checks
Active authentication methods (JWT, session, MFA)
CSRF and rate limiting status
Recent auth failures
Three AI commands are available when an AI provider is configured (see ai library):
;; Code review with framework-specific feedback
(ai/review "libs/user/src/boundary/user/core/validation.clj")
;; Suggest missing test cases
(ai/test-ideas "libs/user/src/boundary/user/core/validation.clj")
;; Get an FC/IS refactoring plan for a namespace with violations
(ai/refactor-fcis 'boundary.product.core.validation)
All three degrade gracefully when no AI service is configured — they print a message and return nil.
Validate your config before deploying:
# Quick check
bb doctor
# Check all environments
bb doctor --env all
# CI mode (exit non-zero on error)
bb doctor --ci
The doctor runs 6 checks: env var references, provider validity, JWT secret, admin config parity, production placeholders, and wiring completeness.
| Action | Command |
|---|---|
Start dashboard |
|
Fix last error |
|
View routes |
|
View config |
|
Record requests |
|
Explore schemas |
|
AI code review |
|
Validate config |
|
Scaffold + wire |
|
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 |