Liking cljdoc? Tell your friends :D

Developer Tools

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.

Starting the Dev Dashboard

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.

Using WGE Error Codes

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.

In the REPL

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

In the Dashboard

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

Error Code Reference

RangeCategory

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 (wagoe-mcp)

Use bb guide error WGE-xxx to look up any code with its full explanation and fix.

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

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

Recording Requests

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)

Exploring Schemas

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.

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 [:wagoe/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/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.

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

Quick Reference

ActionCommand

System overview

(status) — components, URL, active modules

Start dashboard

add :wagoe/dashboard {:port 9999} to the config, (go), visit http://localhost:9999

Fix last error

(fix!)

View routes

(routes) or dashboard /routes

View config

(config :database) or dashboard /config

List helpers

(commands)

Record requests

(recording :start) (this monorepo; downstream call wagoe.devtools.shell.recording directly)

Explore schemas

(schema us/CreateUserRequest) (this monorepo; downstream wagoe.devtools.core.schema-tools)

AI code review

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

Validate config

bb doctor

Scaffold + wire

bb scaffold generate then bb scaffold integrate <module>

Can you improve this documentation? These fine people already did:
Thijs Creemers & thijscreemers
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