Liking cljdoc? Tell your friends :D

Developer Tools

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.

Starting the Dev Dashboard

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.

Using BND Error Codes

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.

In the REPL

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!)

In the Dashboard

Navigate to http://localhost:9999/dashboard/errors to see all recent BND-coded errors with fix suggestions and stack traces.

Error Code Reference

RangeCategory

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)

Inspecting Routes

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)

Recording Requests

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))

Exploring Schemas

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.

Querying the Database

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"])

Security Status

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

AI-Powered Commands

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.

Config Doctor

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.

Quick Reference

ActionCommand

Start dashboard

(ig-repl/go) then visit http://localhost:9999

Fix last error

(fix!)

View routes

(routes) or dashboard /routes

View config

(config) or dashboard /config

Record requests

(recording/create-session)

Explore schemas

(schema-tree :user/CreateUser) or dashboard /schemas

AI code review

(ai/review "path/to/file.clj")

Validate config

bb doctor

Scaffold + wire

bb scaffold generate then bb scaffold integrate <module>

Can you improve this documentation?Edit on GitHub

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close