Looking at your gist, I think the code actually illustrates why I built vui.el in the first place. The schema→widget mapping logic is genuinely interesting work, but a significant chunk of the code (~400 lines) is dedicated to the inline form lifecycle: jsf--inline-forms registry, marker tracking, resync passes, advice on widget-before-change, overlay cleanup, etc. That's exactly the plumbing vui.el handles automatically.
With vui.el, your json-schema-form could potentially be just the schema translation + a component wrapper:
(vui-defcomponent json-schema-form (schema on-submit)
:state ((values (schema-defaults schema))
(errors nil))
:render
(vui-vstack
(render-schema-fields schema values
:on-change (lambda (path val)
(vui-set-state :values (set-at-path values path val))))
(vui-button "Submit"
:on-click (lambda ()
(let ((errs (validate-schema schema values)))
(if errs
(vui-set-state :errors errs)
(funcall on-submit values)))))))
State tracking, cleanup on close, multiple forms per buffer - all handled by the framework. Your validation logic and schema mapping would be the same, just without the infrastructure code.On the emacs -q -nw workflow: it works, but you might find eldev + buttercup tests even better for AI-assisted iteration. The agent can run eldev test after changes and self-correct on failures. Byte-compilation catches issues too. Claude Code handles eldev well out of the box.
Anyway, not trying to hard-sell vui.el - your approach clearly works and the schema-form idea is cool. But if you do hit more state/cleanup headaches, might be worth a look. Happy to help if you want to try porting the schema logic over.