Jaspr: a Dart web framework that renders real HTML instead of a canvas
Modern web framework for building websites in Dart. Supports SPAs, SSR and SSG.
At a glance
- What is it?
- Jaspr is a Dart framework for building websites with server side rendering, client side rendering and static generation, aimed at Flutter developers who need pages that behave like pages. Its component model feels like Flutter widgets, but the output is HTML, the DOM and CSS.
- Who is it for?
- Jaspr fits Flutter developers who need a content site, a docs portal or a server-rendered app in Dart, and teams that want one language across client and server. It is the wrong tool if you need deep React or Next.js ecosystem integrations, or if your project is an app-like canvas UI where Flutter Web already works.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 2 days ago.
- What is it written in?
- Mainly Dart, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.
Editorial analysis
The problem Jaspr targets: Dart on the web without a canvas
The README states the project was made with the premise of a web framework that "looks and feels just like Flutter, but renders normal HTML and CSS." That single sentence defines both the audience and the boundary. The audience is Flutter developers who can already write Dart and understand a widget tree, but who need to ship a website rather than a web app. The boundary is Flutter Web itself: the README quotes the Flutter team's position that Flutter Web is for building web apps, not web sites, and positions Jaspr as an alternative for everything that falls on the website side of that line.
That distinction is not cosmetic. A marketing page, a documentation portal or a blog needs selectable text, working browser find, crawlable markup and CSS that a designer can inspect. Those are the properties Jaspr claims by rendering to the DOM. If your product is a dashboard with heavy custom painting, Flutter Web is not the problem Jaspr is solving, and adopting it means giving up the rendering model you already have. The repository's own apps directory makes the intended use concrete: the Jaspr website and JasprPad, an online editor and playground, are both built with Jaspr, so the framework is used for a content site and a browser tool rather than for a mobile app port.
How rendering, state sync and DOM updates fit together
Jaspr supports client-side rendering, server-side rendering and static site generation, and the README lists the same three modes in its opening description. The mechanism it advertises is state synchronisation between server and client: the README says component state is synced automatically, which is what lets a page be rendered on the server first and then become interactive on the client without the developer writing a separate hydration layer by hand.
The second mechanism is the update strategy. Jaspr describes itself as performing "direct DOM updates only where needed" rather than diffing a virtual tree against a rendered canvas. Combined with the Flutter-like component model, the practical shape is a component tree that compiles to HTML and CSS, with the client runtime patching the specific nodes that changed. The README also says Jaspr runs on the server, the client or both, with manual or automatic setup, so the rendering mode is a configuration decision rather than a fixed architecture.
What the README does not document is the wire format of the state transfer, the size of the client runtime, or how hydration mismatches are surfaced. Those are implementation details you would need to read the packages/jaspr source or the docs to confirm. Treat the automatic sync claim as a design intent, not a measured guarantee.
Installing Jaspr and running a first project
The README points to the quickstart at docs.jaspr.site/quick_start for setup instructions, and the repository ships a command line interface in packages/jaspr_cli. The CLI is the normal entry point: it creates a project, and the generated project then runs through the Dart toolchain. Because the README does not reproduce the exact CLI subcommands, check the quickstart page for the current flag names before typing them.
A project is a normal Dart package, so the first step is to have Dart installed and to create the project with the Jaspr CLI. The generated layout separates the entry point from the components, and the development server is started with the Dart tool. The README does not state the port, so take the URL printed in the terminal rather than assuming one. If you prefer not to install anything, the README offers JasprPad at playground.jaspr.site, which runs samples and a tutorial in the browser and can download the current files as a complete Dart project ready to continue locally.
For the server side, the repository's examples directory shows how a Jaspr server is wired to a backend. There are examples for Shelf, Dart Frog and Serverpod, which means the HTTP layer is not baked into the framework. Those example directories exist in the repository, so they are the fastest way to see how a Jaspr server is mounted on an existing Dart backend rather than reading the docs in the abstract.
Where Jaspr is the wrong choice
The clearest failure mode is ecosystem gravity. If your site depends on a specific React or Next.js library, an image pipeline, a CMS plugin or a hosting platform integration, Jaspr does not give it to you. The repository lists jaspr_router, jaspr_content, jaspr_riverpod, jaspr_test, jaspr_lints and jaspr_flutter_embed as separate packages, and the README labels jaspr_riverpod an unofficial Riverpod implementation. That word matters: the state management story is a port, not the upstream package, so behaviour can differ from what Flutter developers expect.
The second limit is the Dart web toolchain itself. Jaspr compiles Dart to JavaScript or WebAssembly through the standard Dart web compilers, so build times, output size and debugging follow that toolchain's characteristics. The README makes no performance claim beyond "direct DOM updates only where needed", and the benchmarks link is a separate site; nothing in the README or the release notes gives numbers you can plan capacity around.
A third case is a purely static brochure site with no Dart code. Jaspr can generate static output, but if nobody on the team writes Dart, the framework adds a compile step and a language to learn for a result that a plain HTML generator would produce with less machinery. The Flutter-like component model is only an advantage to people who already think in Flutter widgets.
Jaspr compared with Flutter Web, and what the alternatives change
The comparison the project itself draws is Jaspr versus Flutter Web, and the difference is architectural rather than stylistic. Flutter Web renders your interface through its own rendering pipeline, which is why the README quotes the Flutter team saying it is for web apps and not web sites. Jaspr renders HTML and CSS and updates the DOM, so the browser owns layout and text rendering. The trade-off runs the other way too: Flutter Web gives you one rendering model across mobile, desktop and web, while Jaspr gives up that uniformity to get normal document behaviour.
Against a JavaScript framework such as React, the difference is the language and the compilation target. Jaspr is written completely in Dart, and the README frames the project as a fullstack web framework in Dart, so the same language can cover the server and the browser. A React or Next.js codebase gives you a much larger hiring pool and a much larger set of ready-made components. Jaspr gives you one language across a Dart backend and the front end, which is the reason a Flutter team would pick it.
The Serverpod integration is the other concrete alternative axis. The repository lists packages/jaspr_serverpod as an official Jaspr integration for Serverpod, with examples/backend_serverpod alongside it. If your backend is already Serverpod, that path keeps the whole stack in Dart. If your backend is anything else, the Shelf and Dart Frog examples show that Jaspr is not tied to a particular server.
Maintenance, release cadence and the MIT licence
The repository is not archived, and the last push was on 2026-09-28. The most recent release listed is jaspr-v0.23.0 on 2026-04-17, preceded by jaspr-v0.22.0 on 2025-12-10 and jaspr-v0.21.7 on 2025-11-13. The version numbers are still below 1.0, which is the practical upgrade risk: minor releases in the 0.x range can carry breaking changes, and the gap between 0.22.0 and 0.23.0 is roughly four months. Plan for a migration pass when you move between minor versions, and read the release notes for the version you are jumping to rather than assuming compatibility.
The upgrade cost also includes the satellite packages. jaspr_router, jaspr_content, jaspr_builder, jaspr_test and jaspr_serverpod version independently, so a framework bump can require matching bumps across several pubspec entries. The repository carries a pubspec.lock and an analysis_options.yaml at the top level, and jaspr_lints exists as a separate package for lints and assists, which suggests the project expects users to run static analysis tuned to the framework. Adding that package is a small but real maintenance commitment.
On licensing, the repository is MIT licensed, which is permissive and places few obligations on how you distribute your site. The repository also contains a THIRD-PARTY-LICENSES file, so transitive dependencies carry their own terms. That file is the place to look before shipping a commercial product; this is a description of what the repository contains, not legal advice.
Editorial conclusion
Jaspr fits Flutter developers who need a content site, a docs portal or a server-rendered app in Dart, and teams that want one language across client and server. It is the wrong tool if you need deep React or Next.js ecosystem integrations, or if your project is an app-like canvas UI where Flutter Web already works. Before adopting, check the packages/jaspr_router and packages/jaspr_serverpod versions against your Dart SDK, and confirm the deployment target you need is covered by the examples/backend_shelf or examples/backend_dart_frog setup.
Frequently asked questions
What is Jaspr?
Jaspr is a web framework for building websites in Dart with support for client-side rendering, server-side rendering and static site generation. The README describes it as looking and feeling like Flutter while rendering normal HTML and CSS, and it targets Flutter developers building websites rather than web apps.
How does Jaspr compare with React?
The README does not compare Jaspr with React directly. The stated comparison is with Flutter Web, where Jaspr renders HTML and CSS through the DOM instead of using Flutter's own rendering pipeline. The practical difference from React is that Jaspr is written completely in Dart, so the same language can cover the server and the client.
What are the alternatives to Jaspr?
The README positions Flutter Web as the alternative Jaspr is meant to replace when you need a website rather than a web app. Within Dart, the repository also shows Jaspr running on top of different backends through the Shelf, Dart Frog and Serverpod examples, so the server layer is a separate choice.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/schultek-jaspr)