Pick a framework
Mini-apps are static bundles, so any framework that emits a static export works. Here's the one-line summary for the common ones.
The host loads your bundle as a sandboxed web view, so any framework
that produces static HTML/JS/CSS works. The framework only changes
two things: what you put in sdk.config.json (the build command +
output dir), and where you mount the SDK calls (in a client component
that runs after hydration, never during SSR).
"Works" means L8 only unless the bundle is a classic script.
Di5.0 trims (L5, L5 Ultra, Song Plus) run a ~2022 WebView with no
ES-module support, so a framework's modern chunked output (Next.js
/_next/, etc.) silently blanks there. To support L5, ship a
classic IIFE bundle — see Build for L5 + L8.
Next.js
App router + static export. L8 (Di5.1) only — modern chunked output blanks on Di5.0/L5.
Nuxt
`nuxt generate` + `<client-only>`. L8 only unless re-bundled to a classic script for Di5.0/L5.
Vanilla HTML / JS
One HTML file, classic script. Runs on every trim including Di5.0/L5. Recommended.
Frameworks not on this list
Anything that supports static export will work — Vite, SvelteKit (adapter-static), Astro, Eleventy, Hugo, Jekyll, plain Webpack/Rollup configs. The pattern is always the same:
- Configure your framework for static output.
- In
sdk.config.json, setappRootto its output dir andbuildCommandto its build command. - Anything calling
MiniAppClient.fromWindow()runs after hydration, never during SSR.
If you wire one up, open a docs PR and we'll add it here.