BootUI
SkillDev toolsInstall, configure, and use BootUI in Spring Boot 4 or Quarkus applications; assess a running application, propose a prioritized action plan, and execute only approved fixes using runtime evidence. Use when asked to add or troubleshoot BootUI, assess application health, or investigate a slow or failing endpoint, exceptions, SQL, Hibernate, beans, mappings, configuration, health, metrics, logs, or traces; also for architecture, security, memory, database, REST, pentest, GraalVM, CRaC, or vulnerability scans, or connecting an AI agent to BootUI.
Use BootUI in Claude, ChatGPT or Ahel Desktop
Free. Sign in, add BootUI and connect your AI. About a minute.
Also: Claude Code · Cursor · Codex
Then ask your AI: use the BootUI skill
Details
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; Ahel provides instructions and does not run this skill.
No other account needed.
Add Ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
What this skill tells your AI
The instructions your AI receives, as published by jdubois/boot-ui in skills/bootui/SKILL.md and read by Ahel’s review.
Use BootUI as a local, runtime-grounded source of information for Spring Boot 4 and Quarkus 3 applications. Keep it local-only, preserve its fail-closed defaults, and make the smallest application change that addresses the user's request.
Establish the application context
Before changing anything:
- Identify the build tool and use its wrapper when present.
- Identify the framework and web stack:
- Spring Boot servlet
- Spring Boot WebFlux
- Quarkus
- Confirm Java 17 or later and a supported framework version.
- Find the runnable module, active development profile, configured HTTP port, and existing BootUI dependency.
- Run the project's existing focused tests before and after changes when practical.
Do not add both Spring starters. Do not add a Spring starter to Quarkus or the Quarkus extension to Spring.
Install BootUI
Add the dependency only when the user asked for BootUI or approves the change. If a diagnostic request arrives and BootUI is not on the classpath, say so first rather than installing it silently.
Determine the latest stable BootUI version from Maven Central or the BootUI releases; do not guess a version or use a snapshot unless requested. Use the project's existing dependency-management and formatting conventions.
Choose exactly one dependency:
| Application | Maven coordinates |
|---|---|
| Spring Boot servlet | com.julien-dubois.bootui:bootui-spring-boot-starter |
| Spring Boot WebFlux | com.julien-dubois.bootui:bootui-spring-boot-starter-reactive |
| Quarkus | com.julien-dubois.bootui:bootui-quarkus |
For Spring, prefer a runtime-only Gradle configuration when that matches the build. The Quarkus extension may remain an
implementation dependency. Do not add bootui-quarkus-deployment directly.
Activate and run the application in development:
- Spring Maven:
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev - Spring Gradle:
./gradlew bootRun --args='--spring.profiles.active=dev' - Quarkus Maven:
./mvnw quarkus:dev - Quarkus Gradle:
./gradlew quarkusDev
BootUI normally opens at http://localhost:<port>/bootui. On Spring, dev or local, DevTools, or
bootui.enabled=ON activates it. On Quarkus, dev and test launch modes activate it; production builds remain dark and
cannot be forced on.
After installation, verify the application starts, the BootUI banner or URL appears, and
GET http://127.0.0.1:<port>/bootui/api/overview returns JSON — bootui overview --url http://127.0.0.1:<port> does
the same check when the CLI is installed. Do not treat an unavailable optional panel as an installation failure.
Configure BootUI safely
Only add configuration required by the user's goal. Prefer these safe controls:
bootui.read-only=trueto block all actions.bootui.panels.<panel-id>.enabled=falseto hide a panel and reject its API.bootui.panels.<panel-id>.read-only=trueto keep reads while blocking its actions.bootui.expose-values=MASKEDandbootui.mask-secrets=trueas the normal disclosure posture.bootui.cli.enabled=falseonly when the user wants the command-line endpoint off; it is enabled by default.bootui.mcp.enabled=ONonly when the user wants the MCP server enabled at startup.
Never set bootui.allow-non-localhost=true, bootui.expose-values=FULL, broad trusted proxy ranges, or permissive
allowed hosts merely to make a failing request work. Explain the risk and use the narrowest local alternative. For a
container, prefer a localhost-bound published port and bootui.trust-container-gateway=AUTO.
Spring supports runtime configuration overrides in .bootui/application-bootui.properties; already-bound configuration
may require a restart. The Quarkus Configuration panel is read-only. Do not edit bootui.internal.* properties.
Use the full property reference at
https://github.com/jdubois/boot-ui/blob/main/docs/PROPERTIES.md when a setting is not listed here.
Choose how to reach BootUI
BootUI answers the same questions from one tool registry, under the same per-panel enable and read-only policy. The CLI and the MCP server are two spellings of that registry; the browser panels are the human-facing view of the same data. Pick the route already available instead of setting up another:
- If your tool list already contains BootUI MCP tools, call them directly. Nothing to install or enable. If one
answers that the MCP server is disabled, that is the one case where enabling MCP is the right move: tell the user, or
set
bootui.mcp.enabled=ON, rather than abandoning the request. - Otherwise use the
bootuicommand line. Check for it withcommand -v bootui(Get-Command bootuiin PowerShell). Its endpoint is enabled by default, needs no client configuration and no restart, and returns the same masked JSON. - If the CLI is not installed, call the endpoint over plain HTTP rather than installing anything. It is ordinary
REST, so
curlis enough. - Point the user at the browser panels when a human should look, or for a screenshot.
Do not enable the MCP server, edit a client configuration, or restart the application merely to run a diagnostic that options 2 and 3 already answer. Set MCP up as a connection when the user asks to connect an agent or MCP client to BootUI.
Use the command-line endpoint
The CLI asks a running application one question and prints the answer. It talks to GET /bootui/api/cli and
POST /bootui/api/cli/tools/{name}, which are enabled by default and independent of bootui.mcp.enabled.
Do not install anything to answer a one-off question. The endpoint is plain REST with no JSON-RPC envelope and no
token on loopback, so curl reaches the same tools under the same policy:
curl -fsS http://127.0.0.1:8080/bootui/api/cli # the catalog
curl -fsS -X POST -H 'Content-Type: application/json' -d '{}' \
http://127.0.0.1:8080/bootui/api/cli/tools/get_overview
curl -fsS -X POST -H 'Content-Type: application/json' -d '{"limit": 20}' \
http://127.0.0.1:8080/bootui/api/cli/tools/get_http_exchanges
Always send Content-Type: application/json and a body, {} when the tool takes no argument, exactly as the CLI does.
Add -H "Authorization: Bearer $BOOTUI_TOKEN" when bootui.authentication.token is set. The tool names are the MCP
tool names; bootui tools and the catalog both list them. On this path the outcome is the HTTP status rather than an
exit code: 403 is the panel refusing, the same condition the CLI reports as 2.
Install the bootui command only when the user wants it, or when repeated calls make it worth it — and ask first,
because it writes an executable to their machine. It needs a JDK 17 or later. Prefer a source the user can verify:
JBang resolves it from Maven Central with jbang app install bootui@jdubois/boot-ui, and the
jar can be downloaded from repo1.maven.org and run with java -jar. The
installer scripts are a third option; do not pipe
one into a shell on the user's behalf without their explicit agreement.
Once it is on the PATH:
bootui tools # what this application actually exposes
bootui --url http://127.0.0.1:8080 overview
bootui hibernate scan --json | jq '.severityCounts'
bootui exceptions show <id> --json
bootui request-profile <id> --json # one request's SQL, N+1 groups, exceptions, and timing
--url(orBOOTUI_URL) defaults tohttp://localhost:8080; pass the application's real port.--api-pathis only needed whenbootui.api-pathis customised,--tokenonly whenbootui.authentication.tokenis set, and--timeoutraises the 60-second wait for a slow scan.- Always pass
--jsonwhen parsing. The human table rendering is not a contract, and terminal auto-detection is unreliable on JDK 22 or later. bootui toolsprints a human table whosestatuscolumn readsready,action,read-only, orpanel disabled. With--jsonit prints the endpoint's own document instead, where each entry intoolscarriesname,panel,action,arguments,panelEnabled, andpanelReadOnly— but nostatusorcommandfield. Derive availability from those:panelEnabled: falsemeans unavailable,action: truewithpanelReadOnly: truemeans the call would be refused. Read this before concluding a stack or panel lacks a capability.- Exit codes:
0answered,1usage error or unreachable application or a request the tool rejected,2BootUI declined because the panel is disabled or read-only. Treat2as "not available here", not as a failure to work around by loosening configuration. - Prefer the
BOOTUI_TOKENenvironment variable over--token, which exposes the token to shell history and process listings. Never echo a token or copy it into a report. - Scan payloads differ:
pentest scannames its arrayfindings, the rule-based advisors name itresults. Every scan sharesseverityCounts, so prefer that for thresholds, and check the shape with--json | jq keysfirst.
In CI, capture the exit code (bootui … --json > report.json || status=$?) so a non-zero exit does not abort the step
before the application is stopped.
The full command table is at https://github.com/jdubois/boot-ui/blob/main/docs/CLI.md; each command maps to the MCP
tool of the same behavior.
Read MySQL operational evidence
The MySQL operational panel supports Oracle MySQL 8.4 LTS and 9.7 LTS, with live coverage on 8.4.6 and 9.7.2; check
the running catalog for the application's actual capability. It uses JDBC on Spring MVC, WebFlux, and Quarkus,
including named datasources.
MariaDB reached through MySQL Connector/J is read but unsupported: its report has serverFlavor MARIADB, an INFO
diagnostic, no replication receiver state, and no counter changes. R2DBC-only and reactive-client-only
applications are unsupported; do not install another pool just to enable diagnostics.
- Prefer
bootui db mysql report --json/get_mysql_report. This reads the sanitized cache, never MySQL. - Only after an explicit request or approval, use
bootui db mysql read --json/mysql_read. It is an action that performs bounded external collection despite being read-only at the database. Both tools take no arguments; never supply SQL, a schema, or a server address. - Read report status, section reasons, capabilities, observation times, and limitations. The eight areas are vital signs, sessions/blocking, statements, indexes, tables, InnoDB, basic replication, and settings. This is not an advisor: there are no grades or recommendations, and partial/unknown evidence is not a pass.
- Preserve scope: server-wide counters include other clients, and default-schema-associated sessions/digests do not cover every cross-schema access. Table sizes/rows may be cached estimates; no recorded index activity is not evidence that an index is safe to drop. Failed channel reads do not establish absence of replication.
- Preserve exact decimal-string counters, byte sizes, and numeric IDs; never round them through JavaScript
Number.nullmeans unknown, not zero. Row caps (truncated) differ from permissions, disabled instrumentation, server digest overflow, or timeout failures. Local filters cover retained rows only.
Do not retry busy/partial/failed reads automatically, enable instrumentation, grant PROCESS/other privileges,
request raw session/sample SQL or lock keys, or relax exposure/read-only policy. Exposure changes invalidate the cache
without SQL, including when relaxed; an explained NOT_READ still needs approval for new collection.
The seven bootui.mysql.max-* row limits are static positive integers below 2147483647, requiring restart;
raising a CLI timeout does not extend collector or pool budgets. Consult the
MySQL guide for exact keys,
capability-specific permissions, tested driver/pool combinations, and execution bounds.
Read retained advisor violations
The Architecture, Hibernate, Spring/Quarkus application, REST API, Memory, Security, and Database advisors report
true violationCount values but only bounded sampleViolations previews (ten, or twenty for Quarkus application
and Security). Never treat the preview as the full affected-target list. Read the cached report first:
scan_id=$(bootui architecture report --json | jq -er '.violationDetails.scanId')
bootui architecture violations ARCH-SPRING-004 --scan-id "$scan_id" --offset 0 --limit 100 --json
Equivalent commands are hibernate violations, spring violations, rest-api violations, memory violations,
security violations, and db violations, each with positional rule ID and required --scan-id.
The seven MCP tools are get_architecture_rule_violations, get_hibernate_rule_violations,
get_spring_rule_violations, get_rest_api_rule_violations, get_memory_rule_violations,
get_security_rule_violations, and get_database_advisor_rule_violations. Their arguments are required
id and scanId, optional integer offset (default zero, nonnegative) and limit (default 100, positive,
capped at min(1000, transport max-results)). Obtain scanId from get_<advisor>_report first.
Architecture, REST API, and Hibernate reports and pages also carry structured locations: sampleLocations aligned
with sampleViolations, and locations aligned with violations (a null entry has no location). Each gives
className, memberName, kind, sourceFile, line, sourcePath, and precision (LINE, MEMBER, CLASS).
Open sourcePath at line to go straight to the code; violationDetails.locationNotes explains a missing path.
Never parse a location out of the violation text.
Keep the rule and scan ID fixed, advance the offset by page.returned, and stop when page.hasMore is false.
page.total and page.matched count retained entries, not the full violationCount. Inspect rule/report
truncated: retention overflow means even a terminal page is incomplete. Report violationDetails contains
scanId, total, retained, retentionLimit, and truncated; the default is 10,000 sanitized details per
advisor scan (bootui.advisors.max-retained-violations). Raising it cannot recover already discarded details
without an explicitly authorized new scan. Detail completeness is not the same as evidence coverage.
Truncation can also reflect upstream observations that count affected targets without supplying every identity.
Preserve that diagnostic instead of inventing details or assuming a larger retention budget will recover them.
Paging does not expand existing observation bounds, such as Memory rules that inspect only their top-five inputs.
A PARTIAL Hibernate report names incomplete rules and units in diagnostics (source, unit, level,
message); a finding whose units were only partly evaluated carries a coverageNote. INFO diagnostics are
advisor limits by design, not missing application configuration. The list is capped at 200 entries; a final entry
with source diagnostics states how many were omitted, so a missing unit entry does not prove full coverage. Report
these gaps rather than treating the rule as clean.
Detail reads never rerun checks or query a database and remain permitted in read-only mode. Only the latest
completed snapshot is kept; dismissal preserves its ID and details. On stale/no-snapshot client error 409,
reread the cached report, not the scan tool, and restart pages using its ID. An unknown/non-finding rule
is REST/MCP client error 404 (CLI facade 400 by its existing unavailable-tool distinction). On MCP rendered-byte
refusal -32003, retry the same scan ID and offset with a smaller limit; never advance after a failure or treat
it as an empty page. Stop rather than retry indefinitely when one detail cannot fit. Verify every finding against
source and effective configuration before proposing a fix; do not claim complete coverage when truncated.
Use BootUI on a running application
Prefer BootUI's CLI, MCP tools, or browser panels over raw framework internals because BootUI returns bounded, masked DTOs.
- Confirm the process, port, framework, and BootUI availability, then run
bootui toolsto see what this application really exposes. - Read Overview and Health when the application's identity or overall state matters (
bootui overview,bootui health, orget_overviewandget_health); go straight to the relevant read when the question is specific. - Use Live Activity to correlate recent requests, SQL, exceptions, security events, scheduled work, messaging, and mail.
- Open the dedicated diagnostic command or panel for full detail.
- Answer with read commands where you can. Do not run a tool the catalog marks as an action — every
… scan,clear,pause,resume, database operationalread, and heap analysis — unless the user asked for it or approves after you name it. Prefer an existing… reportover a fresh scan, and treatvulnerabilities scanas always requiring approval because it sends package names/versions to OSV.dev and, when enabled, CVE ids to FIRST for EPSS enrichment. Inspect scan status, message, inventory coverage and skipped packages; partial evidence and UNKNOWN severity are not a clean result. Fixed versions are affected-interval candidates, not guaranteed compatible upgrades. EPSS is the highest available per-CVE probability, not combined probability or severity. - Record a baseline: finding identifiers and severities, health, failing request, exception, and relevant metrics.
Treat unavailable panels honestly. Their backing library, capability, configuration, or adapter support may be absent. Do not install unrelated infrastructure solely to light up a panel unless the user asks.
Investigate one slow or failing request
- List recent activity with
bootui activity --limit 50 --json(get_live_activity) and pick theREQUESTentry for the request in question. Only an entry withprofileable: truehas a profile;sqlNPlusOneSuspectedand theERRORorSLOWseverities point at the requests worth opening. - Fetch its profile with
bootui request-profile <id> --json(get_request_profile), passing that entry'sid. It returns the same masked profile as the Live Activity drawer: correlated SQL grouped by normalized statement, with N+1 groups and the application call sites that issued them, exceptions, security events, REST client calls, cache accesses, timing, and correlation notes.available: falsewith anunavailableReasonmeans the request was evicted or cannot be correlated; it is an answer, not an error to retry. - For each exception in the profile, read its stack trace and cause chain with
bootui exceptions show <exceptionGroupId> --json(get_exception_detail). - Check each section's
truncatedcount and thenotesbefore concluding a statement or call did not happen, and treat aTIME_WINDOWtier as approximate.
In the browser, Copy for AI in the Live Activity profile drawer and in an Exceptions detail builds the same evidence as one Markdown document, previewed with what it leaves out before anything is copied. A user may paste one into the conversation instead.
Assess an application and propose an action plan
Use this workflow for a whole-application assessment or "scan everything and tell me what to do" request. A focused
runtime question should still use the smallest relevant tools. MCP clients that support prompts can select
assess_application; otherwise follow this procedure through the existing MCP tools, CLI, or plain HTTP endpoint.
This is an agent workflow, not a new scan tool, server-side assessment job, or code-execution endpoint.
Establish scope and collect evidence
- Confirm the application URL and API mount, framework, profiles, and instance/start identity when available. Match it to the source repository, revision, and working-tree state. State unknown identity or unavailable source explicitly. Use the user's goal; otherwise state a general application-health goal rather than assuming native-image adoption, a production audit, or an architecture rewrite.
- Discover the running catalog and panel availability/policy. Account for relevant capabilities without calling every tool; unavailable Spring MVC, WebFlux, or Quarkus features are not failures to work around.
- Start with existing evidence only: Overview, Health, cached advisor reports, and bounded diagnostic summaries.
Assessment does not authorize fresh scans or fixes. Before fresh scans, name the applicable scans and obtain approval
for that scope unless already explicitly approved. Request separate approval for
memory_scan(may trigger a full GC),pentest_scan(bounded loopback probes),vulnerabilities_scan(outbound OSV.dev queries), anddatabase_advisor_scan(contacts the configured database for metadata). Never run controls, generate traffic, install integrations, or loosen disabled/read-only policy just to improve coverage. - Declare a time and tool-call budget before collection. Run approved scans sequentially and stop at the budget; record busy, timed-out, or failed calls rather than retrying indefinitely. Preserve useful evidence from other sources. Respect pagination and mark partial results instead of claiming to have inspected omitted rows.
- Follow finding, exception, trace, and request identifiers into targeted details and source/configuration inspection. Do not dump every bean, property, log, or trace. Record the collection window and individual report timestamps; a cached report is not a fresh scan, and a collection window is not an atomic JVM snapshot.
- Mark each relevant capability
assessed,unavailable,skipped,failed, orinsufficient-evidence, with its reason and stale/partial/paged caveats. Empty telemetry from an idle app is insufficient evidence, not proof that requests or database access are healthy. Request permission for a controlled reproduction if needed.
Advisor numbers are known-findings scores, not app-health grades. Inspect scan.status, retained findings, and
report evidence (boolean usable, boolean coverageComplete, immutable bounded sanitized limitations). Usability means
at least one applicable check completed or a genuine known-severity finding was observed before filtering/dismissal;
informational missing-evidence notices do not establish it. A partial 100 means no active penalties in assessed
evidence, not that unseen checks passed. Dismissal
changes penalties, not safety. Backend evidence alone establishes eligibility; missing legacy evidence is unscored.
For vulnerabilities UNKNOWN cannot establish usability and remains a limitation even after dismissal; genuine INFO/NONE
findings can establish usability. Inspect dependency details for the explanation, not a second scoring calculation.
Overview averages eligible visible advisor scores and GitHub's eligible security-alert score, showing the contributing
count. Missing or unscored reports never supply fake zeros or hundreds. These browser-calculated scores are not
returned by get_overview or bootui overview.
Existing GET reports do not authorize fresh scans or external queries.
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 306
- Forks
- 34
- Last commit
- Oct 2026
Advanced
- Item type
- skill
- Key
bootui- Source
- github.com/jdubois/boot-ui
Related picks
Skill · a5c-ai
The pick for Java110-java-maven-best-practices
Skill · jabrena
The pick for Javalegacy-js
Skill · thedaviddias
The pick for JavaScriptmodern-javascript-patterns
Skill · wshobson
The pick for JavaScriptmysql-patterns
Skill · affaan-m
The pick for MySQLmysql-query
Skill · hashgraph-online
The pick for MySQL