For IPv6, multiple addresses on an interface is the norm: an interface has both a public address from your ISP (replacing IPv4 NAT) and a unique local address (replacing stable IPv4 RFC 1918 LAN addresses).
One step up from 'curl' and 'jq' is to only target modern browsers supporting Javascript ES6.
Just create a static HTML file and a script loaded as an ES6 module.
Use the Fetch API for obtaining data from your API. Obtain DOM elements using 'document.querySelector()'. Update the DOM using Javascript template literals (strings) and the 'Element.innerHTML' attribute.
For forms, just do a server side redirect after POST or respond with HTTP 201 or 204. Alternatively, add a Javascript submit event listener to the form and do the HTTP POST using a 'FormData' object and the Fetch API.
For authorization, either a catch all HTTP Basic Auth in the web server or a HTML login form to your API responding with a session cookie and a redirect.
I found downloading the JSRs manually too cumbersome.
It is acompanied by an Eclipse plugin that i never got around to publish on GitHub. It lets me right click a Java type in Eclipse and open its JSR PDF file.
The javac compiler has a new option "--release" which can compile against previous Java releases 6, 7 and 8. So the new JDK bundles parts of the previous releases.