Another angle, which is not yet fully-cooked for “seamless” (or at least, “less-seamed”) embedding is JupyterLite, which can run quite a bit of IPython, numpy, and friends directly in the browser, no need for external services (aside from, at present, some fairly hefty use of some CDNs, by default).
We’ve got a bit of (un)building yet to do, but would love more feedback on this use case in this issue.