Jaspr is a Dart web framework whose readme quotes Flutter's team to justify existing
Modern web framework for building websites in Dart. Supports SPAs, SSR and SSG.
At a glance
- What is it?
- A full stack framework that renders HTML and CSS with a Flutter shaped component model, split across eleven packages with no router of its own, with its playground and its own website both built with it. The positioning section is the most interesting thing on the page.
- Who is it for?
- This fits a Flutter developer who needs a content site or a marketing page and does not want it in the widget tree of an application, or a Dart team that wants server rendering with the same language on both sides. Five things to check before you commit.
- 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 1 day 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 November 14, 2026, and from our analysis. They are not legal advice.
Star history
- schultek/jaspr2,520 ★ · +30
| Repository | 2026-09-30 | 2026-11-14 |
|---|---|---|
| schultek/jaspr | 2.5k | 2.5k |
30 Stars in the last 45 days, measured from the daily GitHub snapshot. Compare with other projects
Editorial analysis
The readme quotes Flutter's own team to justify existing
The design principles section is the one to read, and it opens by quoting somebody else.
The claim is that Jaspr is an alternative to Flutter Web for people who want to build any kind of website with Dart. The justification given is that the Flutter team has stated, on multiple occasions, that Flutter Web is for building web apps rather than web sites. The readme's reading of that line is that Flutter Web is excellent for sharing an application across platforms including the web, but is not suited to every kind of website.
So the entire positioning rests on a distinction between an application and a website, sourced to the platform vendor rather than to a competitor comparison. That is an unusually honest way to frame a competing framework, and it also defines the audience precisely: mainly Flutter developers who want to build websites, especially ones that are not suitable for Flutter Web.
The philosophy that follows is worth quoting as a design stance. Rather than mirroring every small thing from Flutter, the project matches features where it makes sense without compromising the unique properties of the web platform, and it embraces the differences rather than hiding them. Concretely, it gives you the look and feel of the Flutter component model while rendering ordinary HTML, the DOM and CSS.
That is a coherent position for a framework whose whole pitch is familiarity without sameness, and the risk it carries is the one any compatibility layer carries: the closer it tracks the original, the more you will assume behaviour that the divergences quietly do not match.
Eleven packages, and no router of its own
The package list is the framework's actual architecture, and one entry is more revealing than the rest.
There is the core framework, a code generation builder, and a command line interface. Those three are the framework proper. Around them sit a plugin for building content driven sites such as documentation, blogs and marketing pages; bindings for embedding Flutter elements inside a Jaspr page; a collection of lints and assists for projects; a router implementation; a testing package; an integration with one server framework described as official; and an implementation of one popular state management library described as unofficial.
The router is the item to notice. It is described as a router implementation for Jaspr rather than as the router of Jaspr, which is the same phrasing as the unofficial state package. So the framework does not decide your routing or your state management. It supplies the rendering and the component layer, and you add the rest.
That is a defensible division, and it is the opposite of what a full stack framework usually claims. It also means the eleven packages have independent version numbers and independent upgrade paths, so a Jaspr project has more places for a major upgrade to land than a framework with one package would.
The code generation builder deserves a note too. Having a builder in the core package list means the framework is a source generating framework, in the same family as the Dart compiler's own builder tooling, so it participates in the same build pipeline as everything else written in that language rather than running as a separate step.
The playground and the project website are both built with the framework
Two production applications live in the repository, and they are the same kind of application a user of the framework would write.
The first is the online editor and playground, which the readme describes as inspired by an existing Dart scratchpad service. It hosts the samples, the tutorial and a place to try the framework without installing anything, all in a browser. The feature worth noting is the download: you can take the files currently in the editor, bundled as a complete Dart project, and continue offline.
That download is a better teaching tool than a tutorial. It hands you a project laid out the way the authors lay theirs out, with the dependency versions that were actually used, rather than a snippet in a documentation page that drifts.
The second application is the project's own website, built with the framework and hosted at the project's own domain.
And there is a third thing in the first paragraph that is easy to skim past: the playground is itself built with the framework, and its source is linked from the readme so you can look at it. So the framework's own two public sites are both instances of it, and one of them is a full single page application with a code editor in it. That is a stronger self test than a documentation example, and it is the reason to believe the framework can carry a real application rather than only a marketing page.
Component state syncs between server and client without you writing it
Five features are listed under the core heading, and the third one is the interesting mechanism.
The first is that the component model is similar to Flutter's. The second is that server side rendering is present out of the box rather than bolted on. The third is that component state syncs between the server and the client automatically. The fourth is that direct DOM updates happen only where they are needed. The fifth is that it runs on the server, the client, or both, with manual or automatic setup, and the readme's emphasis is that you decide.
Automatic state sync is the feature that most distinguishes this from a templating layer. In a framework where the server renders and the client hydrates, the question is always what happens to a widget's state when the server sends new markup. Answering that automatically means a single component tree describes both sides, and the developer does not write the reconciliation.
Direct DOM updates only where needed is the companion claim, and it is the one that determines whether a Flutter shaped interface feels native on the web. A framework that re-renders a subtree on every state change will feel sluggish however good the component model is; one that patches the specific node is what makes the interaction model work.
The fifth point is the escape hatch and it is worded as a choice rather than a mode. Server, client or both, manual or automatic setup. Automatic is convenient and manual is what you reach for when hydration is where your bug is, which in a framework that syncs state for you is a category of problem you cannot debug by reading your own code alone.
Three server backends and three kinds of Flutter interop in the examples
The examples directory has seven entries and they fall into two groups that tell you what the framework expects to sit on.
Three are back ends: one pairing Jaspr with one server framework, one with a different full stack framework that Jaspr also has an official integration for, and one with a plain request handling library. So the framework does not require a particular server, and the official integration is for one specific choice among the three.
The other four are about Dart's other half. One embeds Flutter widgets in a Jaspr page, which is what the element embedding bindings package exists for. One covers a multi view case. One is about plugin interoperability with Flutter. And one is an example for the state management package that the package list describes as unofficial.
That last pairing is worth noting: the example for an unofficial package is shipped in the official repository, which means the authors are testing someone else's implementation against their own framework. If you adopt that state package, your state management is maintained by whoever maintains it, not by the framework's author, and the example in this repository is the best evidence available that it works.
The content plugin covers the third use case, content driven sites, and the readme names documentation sites, blogs and marketing pages as its targets. That is the category where the framework's position from the first section actually bites: a marketing site is not an application, and rendering it as a widget tree was the thing the design principles argue against.
Two top level directories are missing from the readme's own map
The readme has a section that maps the repository, and it is worth checking the map against the tree.
The map lists five things: the applications directory with its two production apps, the assets directory, the documentation directory, the examples directory, and the packages directory with its eleven entries. All five are there.
The tree has more than that. There is a modules directory that appears nowhere in the map. There is a benchmarks directory, named without a trailing slash while the mapped directories all have one, which is itself a hint that it was added later and differently. There is a documentation configuration file beside the documentation directory. There is an analysis options file, which is how the Dart tooling is configured for a repository this size. There is the workspace manifest and its lock file. There is a file collecting third party licences. There is an authors file. There is a roadmap. And there is a submodules file, so at least one dependency arrives from another repository.
None of that is wrong, and a map that lists the five interesting directories rather than all twenty entries is a reasonable thing to write. But a reader who wants to know where the performance work happens looks at the map, does not find benchmarks, and has to find it themselves. And a directory called modules with no description is the kind of thing that stops someone contributing for an afternoon.
The header links to a hosted benchmarks site, which suggests the benchmarks directory holds the source for something someone else runs. Whether the numbers there are reproducible from this repository is not stated.
Three releases in five months, then six months of commits
The release history is three versions over about five months, and then a gap.
A patch level of the current minor line in November 2025, a minor version in December 2025, and a minor version again in April 2026. Since then the default branch has been taking commits, with the most recent dated 1 October 2026.
So there are roughly six months of development on the branch with no tagged release. The project is not archived and the branch is active, so this is not an abandonment, and for a framework that publishes eleven packages independently it may simply mean the release that is being prepared spans several of them.
The tag names are worth noting because they explain the constraint. Every tag is prefixed with the project name before the version, which is what a repository publishing many packages to a shared registry has to do to avoid colliding with itself or with anything else on the same registry. The visible releases all carry the same prefix and the same package name, so a consumer pinning the core framework reads that prefix, and a consumer of one of the satellite packages reads a different one from the same repository.
A roadmap document is in the tree, which is where to look for whether the gap is planned. The framework is also pointed at from a funding link for its single visible maintainer, a hosted documentation site, a community chat, a coverage service and a benchmarks site, which is the usual set of links for a project of one or two people.
Editorial conclusion
This fits a Flutter developer who needs a content site or a marketing page and does not want it in the widget tree of an application, or a Dart team that wants server rendering with the same language on both sides. Five things to check before you commit. That the component model transfers, since it is similar rather than identical and the project's stated principle is to match Flutter where it makes sense and diverge elsewhere. That you assemble the parts yourself, because routing, state management, content and testing are separate packages and the state package for one popular library is explicitly unofficial. Which rendering mode you want, since it runs on the server, the client or both with manual or automatic setup and the readme's position is that you decide. Which backends are supported, because the examples pair it with three different server frameworks rather than shipping one. And how mature the release line is, since the newest tagged version is from April 2026 while the branch has moved since.
Frequently asked questions
what is jaspr
Jaspr is a web framework for building websites in Dart, supporting client side rendering, server side rendering and static site generation. It uses a component model similar to Flutter's while rendering ordinary HTML, the DOM and CSS, and is aimed mainly at Flutter developers whose site is not suitable for Flutter Web.
How does Jaspr differ from Flutter Web?
The readme frames Jaspr as an alternative to Flutter Web for websites, citing the Flutter team's own statement that Flutter Web is for building web apps rather than web sites. Its stated principle is to match Flutter features where it makes sense and embrace the differences elsewhere, rather than mirroring every detail, while rendering native HTML and CSS instead of a widget tree.
Does Jaspr include a router?
Not in the core. The repository publishes a router implementation as its own package, alongside packages for code generation, a command line interface, content driven sites, Flutter element embedding, lints, testing, an official integration with one server framework and an unofficial implementation of one state management library.
Which server backends does Jaspr work with?
The examples pair the framework with three: one full stack framework for which Jaspr also has an official integration, a different full stack framework, and a plain request handling library. So the framework does not require a particular server, and only one of the three has a first party integration package.
Is Jaspr's own website built with Jaspr?
Yes, and so is the online playground. Both live in the applications directory of the repository, and the readme links the playground's source so you can read the framework used at application scale. The playground also lets you download the current files as a complete Dart project to continue offline.
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)Star history chart for your README
[](https://hysenlabs.com/projects/schultek-jaspr)Was this useful?