Ultra is a web framework that leans hard into your browser's native features. Embrace the future of ES Modules, Import Maps, and Web Streams. All while supporting some of the non-standards that many normal people love for some reason (JSX and TypeScript).
It's driven by the following hot-takes:
- ESM is non-negotiable in {currentYear}
- SSR is non-negotiable in {currentYear}
- Bundling is an anti-pattern in {currentYear}
- Data can be requested anywhere, and is accessible on the server, always
- Lazy routing with dynamic imports trumps FS routing
- Less magic in tooling and frameworks is a good thing
- Simplify your workflow and tech stack at all costs - life is too short
- Streams are neat
👯 Community
We now have a Discord. Come say HI.
🙌 next
We are working towards the next milestone. v1.0.0 🗿
🚧 v0.8.0
Heaps of updates in v0.8.0! Because of these new features. Please ensure you are
using at least Deno v1.20.3
- Vendored dependencies! We have a script that can take your CDN deps and make them local.
- API routes! (Thanks @Industrial)
- Option to disable streaming 😱. Passing the env
disableStreaming=1
will force Ultra to use a customrenderToString
equivalent - returning a fully resolved, suspense compatible, html page! (BETA) - Websocket refresh in dev mode. Ultra will restart on local changes.
- Full support for
react@18:
There were some updates to how
streams are handled in
the latest
rc
. - Tighter integration with
Deno config file.
Specifiying your
importMap
indeno.json
is required - Removal of
makefile
in favour of deno task - Legacy: We also export an Oak compatible
ultraHandler
for support inside of an pre-existing Oak project
Notes on using Deno Deploy
We aim to support Deno Deploy as a first class target for Ultra, but there are a few things to consider before deploying:
- Dynamic imports are not supported, this means using React Lazy imports will not work. If you try to deploy anything with dynamic imports, the project will fail.
- Recursive requests are not supported, if using API routes, there is a good chance any requests made in your components may fail during SSR.
NOTE: These above issues are not a limitation when deploying to a service like Fly.io, and if you require either of the above, we recommend using Fly.io with a custom dockerfile.
✨ Wishlist
As we await the official release of React 18, here some things we are interested in for the future of JS and/or Ultra:
- Better Deno support in Vercel
- React 18 native ESM exports
- Native import maps: Browser support for import maps is still a bit sketchy. Instead of using import map polyfills, Ultra inlines your imports directly into the served ES modules.
- Dynamic import support on Deno Deploy
- Native CSS modules
Thank you for going on this journey with us.