The Attaform DevTools panel
A first-class native tab in the Nuxt DevTools sidebar. Every form's value, errors, aggregates, per-field state, and event timeline, with an editable JSON tree for the values.
- Category
- Module
- Where
- Nuxt DevTools sidebar
- Install
attaform/nuxt, nothing else- Production
- route injection skipped, no @nuxt/devtools-kit import
This page is code-only; the panel lives in your browser's Nuxt DevTools overlay, not inside the docs site. Open any Nuxt-powered Attaform consumer in dev (Shift + Option + D opens the overlay) and pick Attaform in the sidebar to see it.
Installing
The integration is automatic; adding attaform/nuxt to your Nuxt config wires the tab:
// nuxt.config.ts: no devtools-specific config needed
export default defineNuxtConfig({
modules: ['attaform/nuxt'],
devtools: { enabled: true },
})
No peer dependency to add, no extension to install, no Vite plugin to configure. Open the Nuxt DevTools overlay (Shift + Option + D or click the Nuxt logo in the bottom corner) and select Attaform from the sidebar.
The tab is dev-only; production builds skip the route injection and the @nuxt/devtools-kit import entirely. Nothing ships in production.
What you see
Form list
One entry per registered form, keyed by the form's key. Click a form to inspect it.
Form value
The current form.values as an interactive JSON tree. Editable from the panel: your edit flows through setValueAtPath and drives the whole reactive pipeline (validation, history). The panel writes back into the same store the form reads from, so a value edited in DevTools is indistinguishable from one typed into an input.
Values render verbatim. The panel is dev-only, so it doesn't mask passwords / tokens / secrets; debugging a credential flow typically needs the actual value. Close the panel before a screen share if a value would be sensitive on camera, the same hygiene as the browser's own DevTools console.
Field state
Click any key in the value tree and a Field state section opens beneath it for that path: connected, touched, focused, blurred, updatedAt, the schema and user error counts side by side, every error message with its code, and the value at that path. Click the same key again, or the × in the section header, to close it.
This is the panel's answer to "the field looks wrong and I can't tell why": the interaction flags and the two error layers for one path, in one place, without reaching into form.fields from a breakpoint.
Schema Errors / User Errors
The error map keyed by path, split by source:
- Schema Errors: what the validator (Zod adapter) produced. Recomputed on every validation pass, so they track the current values.
- User Errors: the manual error layer you wrote via
setErrors(server errors included). Never re-derived, so an entry sits here until something clears it:clearErrors,reset(), or the nexthandleSubmit, which wipes the layer on entry.
Splitting them tells you instantly whether validation or your application code emitted each error.
Aggregates
The reactive bundle:
submittingsubmissionAttemptssubmitErroractiveValidations, the in-flight validation count thatform.meta.validatingreads as a boolean
Useful for confirming your loading-state wiring is reading the right reactive thing.
Timeline
A scrollable log of recent events. Each entry shows a timestamp, an event type, and the form key, with the form value at the moment of fire available on click.
| Event | Fires on |
|---|---|
form.change | Every mutation: register inputs, setValue, array helpers, undo / redo. |
submit.success | A submit handler's onSubmit callback resolves. |
reset | reset() completes. |
Capacity is capped at 200 events per session; older entries fall off the back. Hit clear to wipe the log mid-debug.
Sensitive data and the panel
The panel renders form values raw. DevTools is a dev-only surface, and redacting across every place a value surfaces (panels, logs, network tabs, breakpoints, source maps) is impractical security theater, not a real safeguard. For production-data spelunking on a sensitive surface, use a non-prod environment with synthetic data instead.
What's coming
- History stack visualization. Undo / redo snapshots show on the timeline via
form.changeentries; the stack itself isn't a separate node yet.
Caveats
- Panel edits bypass your component bindings. Fine for poking at state during debugging; don't rely on the path mirroring production interaction exactly.
- Multi-app setups. The Nuxt overlay panel reads from the most recent
createAttaform()install; micro-frontend setups with parallel apps will only see one app's forms in the Nuxt panel. Reach for Vue DevTools integration when you need per-app inspection. - Screen-share hygiene. The panel renders raw values. Close it before screen-sharing, the same way you'd close the browser DevTools console.
Where to next
- Vue DevTools integration: the alternative for Vite / bare-Vue projects, or as a complement on Nuxt.
- Troubleshooting: what the panel surfaces, in narrative form.