:wagoe/dashboard {:port #long #or [#env DASHBOARD_PORT 9999]}
Wagoe 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.
In a project created by wagoe new, devtools is in the :repl alias — start
the REPL with clojure -M:repl. (Inside this monorepo the aliases are :dev
and :repl-clj.)
The dashboard is an Integrant component, so it starts when the config asks for
it. Add to the :active section of resources/conf/dev/config.edn:
:wagoe/dashboard {:port #long #or [#env DASHBOARD_PORT 9999]}
wagoe add devtools writes this for you.
(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 WGE code (e.g. WGE-201 for validation errors, WGE-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...
;; => WGE-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 WGE-coded errors with fix suggestions and stack traces.
| Range | Category |
|---|---|
WGE-1xx | Configuration (missing env vars, invalid providers, bad config structure) |
WGE-2xx | Validation (Malli schema failures, type mismatches) |
WGE-3xx | Persistence (SQL errors, migration issues, connection problems) |
WGE-4xx | Auth (JWT failures, session issues, permission denied) |
WGE-5xx | Interceptor pipeline (missing interceptors, execution errors) |
WGE-6xx | FC/IS violations (core importing shell, side effects in core) |
WGE-7xx | Tooling (circular library deps, admin entity config, wiring issues) |
WGE-8xx | MCP guardrails ( |
Use bb guide error WGE-xxx to look up any code with its full explanation and fix.
View all registered routes with their interceptor chains:
;; In the REPL
(routes)
;; => prints a formatted route table
;; Or visit http://localhost:9999/dashboard/routes
In this monorepo’s REPL you can add temporary routes without restarting:
;; Add a live route; (remove-route! :get "/test") takes it out
(defroute! :get "/test" (fn [_req] {:status 200 :body {:hello "world"}}))
;; Tap a handler's interceptor chain; active after the next (reset)
(tap-handler! :create-user (fn [ctx] (println (:request ctx)) ctx))
Capture HTTP request/response pairs for debugging, from this monorepo’s REPL:
(recording :start)
;; ... make requests to the application ...
(recording :list) ; the captured entries
(recording :diff 0 1) ; compare two entries
(recording :replay 0) ; send entry 0 again
(recording :save "debug") ; save for later; (recording :load "debug")
(recording :stop)
Browse Malli schemas from this monorepo’s REPL or the dashboard. The helpers take a schema, not a name:
(require '[wagoe.user.schema :as us])
(schema us/CreateUserRequest) ; tree view
(generate us/CreateUserRequest) ; example data
(schema-diff us/CreateUserRequest us/UpdateUserRequest)
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 [:wagoe/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/wagoe/user/core/validation.clj")
;; Suggest missing test cases
(ai/test-ideas "libs/user/src/wagoe/user/core/validation.clj")
;; Get an FC/IS refactoring plan for a namespace with violations
(ai/refactor-fcis 'wagoe.product.core.validation)
(go) binds them to :wagoe/ai-service. Without one in the system they throw a
:configuration-error saying so.
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 10 checks: config loadable, env var references, secret references,
provider validity, JWT secret, admin config parity, production placeholders, the
reset-endpoint flag, rate limiting needing a cache, and stale framework wiring.
bb doctor --help lists them.
| Action | Command |
|---|---|
System overview |
|
Start dashboard | add |
Fix last error |
|
View routes |
|
View config |
|
List helpers |
|
Record requests |
|
Explore schemas |
|
AI code review |
|
Validate config |
|
Scaffold + wire |
|
Can you improve this documentation? These fine people already did:
Thijs Creemers & thijscreemersEdit 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 |