Flutter SEO: why a Flutter web app is hard to index and the split Flutter's own docs recommend

Flutter's documentation says its web output does not match what search engines need. Here is what that means, the app and site split it recommends, and the fixes for the parts of an app that must be found, checked on 22 October 2026.

Published by AI Knows Us · Updated 21 October 2026

Flutter SEO starts with one sentence from Flutter's own documentation: Flutter web "prioritizes performance, fidelity, and consistency", so its "output doesn't align with what search engines need to properly index". The answer is a split. Build the pages you want found, such as the landing page, marketing pages, help content and blog, as ordinary HTML, either with any website tool or with Jaspr if your team wants to stay in Dart. Keep Flutter for the app behind them. If parts of the Flutter app itself must be found, switch to path URLs, set titles and descriptions per route, return real status codes, and turn on semantics, in that order.

This page explains why Flutter behaves this way, what the docs recommend, and the checklist for the routes you cannot move out of the app. All quotes were read on 22 October 2026, from documentation that states it reflects Flutter 3.47.

What Flutter's own documentation says about SEO

The Flutter web FAQ has a section titled "Search Engine Optimization (SEO)". It says Flutter is "geared towards dynamic application experiences" and that web support "is no exception". It then gives two routes for content that is "static or document-like":

  • Jaspr, a community package, "if you want to use Dart but want a more traditional DOM-based website". The FAQ adds that Jaspr "makes SEO work in the same way a traditional website would".
  • Plain HTML, by "separating your primary application experience (created in Flutter), from your landing page, marketing content, and help content (created using search engine optimized HTML)".

The "Web support for Flutter" page says the same thing in other words: text-rich, flow-based, static content "such as blog articles" suits the document-centric model of the web better than an app framework. It also notes that the Dart documentation, the Flutter documentation and the Flutter marketing websites were moved to Jaspr. The Flutter team builds its own documentation and marketing sites with Jaspr, not with Flutter web. That is the clearest guidance you will get.

Why a Flutter web page gives a search engine little to read

Flutter draws its interface itself. The Flutter accessibility guide puts it plainly: Flutter "renders its UI on a single canvas". Text drawn on a canvas is pixels, not HTML text, so there are no headings, paragraphs or links in the page for a crawler to parse.

We checked this on Wonderous, the demo app the Flutter docs point to, on 22 October 2026. Its first HTML response was 13,975 bytes. Once scripts and styles were removed, it held one visible word, "Wonderous", and no <a href> links at all. Everything else arrives through JavaScript after the Flutter engine starts.

Google can render JavaScript. Its JavaScript SEO guide describes three phases, crawling, rendering and indexing, and pages wait in a queue for rendering. The same guide says "server-side or pre-rendering is still a great idea because it makes your website faster for users and crawlers, and not all bots can run JavaScript". It also says Google "can only discover your links if they are <a> HTML elements with an href attribute". A canvas app gives it neither readable text in the first response nor normal links.

The split: which part to build with what

Part of the productNeeds to rank?Build it with
Home and landing pagesYesHTML, any site builder, or Jaspr
Feature and pricing pagesYesHTML or Jaspr
Blog, guides, help centreYesHTML, a docs tool, or Jaspr
Logged-in app, dashboards, editorsNoFlutter web
Public app screens people search for, such as a listingSometimesPrefer HTML; if it stays in Flutter, follow the checklist below

A common layout is the marketing site at the root of the domain and the Flutter app on a subdomain or a subfolder such as /app. The Flutter docs cover hosting the app at a non-root location: you change the base href tag in the app's index.html to the path where the app lives.

Jaspr is worth a look if your team writes Dart and would rather not run a second stack. Its site describes components that "look very similar to Flutter widgets" but render "actual HTML and CSS". It is a separate framework, not a Flutter mode, so you write the marketing pages again rather than reuse Flutter widgets as they are.

If parts of the Flutter app must be found: the checklist

1. Use path URLs, not hash URLs

Flutter web uses hash URLs by default, so a screen lives at an address like example.com/#/products. Google's guide says not to use fragments to load different content, because Googlebot "can't reliably resolve" those URLs, and to use the History API instead. Flutter supports this through usePathUrlStrategy from the flutter_web_plugins library, which you add as an SDK dependency in pubspec.yaml:

import 'package:flutter_web_plugins/url_strategy.dart'; void main() { usePathUrlStrategy(); runApp(ExampleApp());
}

Path URLs need your web server to send every route to index.html. On Firebase Hosting, the docs say to choose "Configure as a single-page app" when you set up the project.

2. Return a real status for missing routes

That rewrite has a side effect. Every unknown path now returns index.html with a 200 status, so a typo URL looks like a real page. Google's guide asks for meaningful status codes, such as 404 for a page that does not exist. Where the server cannot know which routes are valid, Google's guide shows two client-side options: redirect to a URL that returns a 404, or add a robots meta tag with noindex from JavaScript.

3. Set a title and description for each route

Google's guide confirms you can use JavaScript to set or change the title element and the meta description. Give each public route its own. Set the canonical URL in the original HTML where you can, and if you set it with JavaScript, Google asks that it match the value in the original HTML.

4. Make links real links

Navigation drawn on a canvas is not an <a> element. For any public route you want crawled, list it in an XML sitemap and link to it from your HTML marketing pages, so discovery does not depend on the app.

5. Turn on semantics for accessibility

Flutter translates its internal semantics tree into an accessible HTML structure, but for performance reasons this "is not on by default". You can turn it on in code with SemanticsBinding.instance.ensureSemantics() when running on the web, and use the Semantics widget with SemanticsRole to give custom widgets roles such as list or heading, which Flutter maps to ARIA roles. Do this for screen reader users first. Treat it as a fix for accessibility, not a replacement for real HTML pages.

The same rendering choices come up with other client-side frameworks. Our Angular SEO guide covers the route-by-route version of this decision for a framework that can render on the server.

Questions about Flutter SEO

Is Flutter good for SEO?

Flutter is built for apps, and its own docs say its web output does not match what search engines need. Use it for the app, and build the pages you want found in HTML or Jaspr.

Can Google index a Flutter web app at all?

Google renders JavaScript, but Flutter's docs say the UI is drawn on a single canvas and that the accessible HTML layer is off by default. The first response holds almost no text and no normal links, which is why Flutter recommends HTML for content that must rank.

What is Jaspr?

Jaspr is a free, open source framework for building websites in Dart. Its components look like Flutter widgets but output real HTML and CSS. The Dart and Flutter documentation sites run on it.

Should a Flutter mobile app have a website at all?

Yes, if you want people to find it through search. The questions people type into a search engine are answered by web pages, and a small HTML site with one page per use case gives search engines and assistants something to read.

Do hash URLs hurt Flutter SEO?

Yes. Google says it cannot reliably resolve content loaded through fragments. Switch to path URLs with usePathUrlStrategy and configure the server to rewrite routes to index.html.

What an assistant reads when it looks at your Flutter product

Search engines are no longer the only reader. When someone asks ChatGPT or Perplexity which app to use for a job, the answer is built from pages those systems fetched and read, and a reader that does not run JavaScript sees a Flutter page the way our Wonderous check did: a title and almost nothing else. The HTML pages you build for search are the same pages an assistant can quote, so the split above serves both. If you want to know whether assistants actually name your app for the questions your buyers ask, AI Knows Us asks them and records which products each answer names and which pages it drew on.

Read next

Simon-Kucher pricing strategy, what the firm publishes about its own method and what a Singapore buyer should ask before briefing itThe firm publishes its approach, its scale and four named service lines, and publishes no fee, so the useful work before any call is reading what it claims and deciding which decision you are buying.International pricing strategies for a Singapore company, and the corridor that stops one market undercutting anotherA converted home price is the one answer that is almost always wrong, so set a price per market and keep the gaps narrower than the cost of moving a unit between them.Premium pricing strategy for a Singapore business, and the fence that makes the higher number holdCharging permanently more than the credible alternatives works when the buyer can name what the extra money buys, and the published Singapore writing ladder shows exactly how that is built.Red Antler publishes no price, so here is what its own site does publish and how to cost the same scope from SingaporeRead on 29 October 2026, three pages of redantler.com carry a complete deliverable list, three business stages and not one figure about what any of it costs.Hiring a full service content agency, the five stages a retainer has to cover and the two handoffs where the money leaksMost content retainers buy production and quietly leave strategy and distribution with you, so price the stages rather than the word count.Hiring a branding agency for a Singapore financial services firm, and the three registers to search before you fall in love with a nameIdentity work for a licensed firm starts with a clearance search rather than a mood board, and two of the three registers are free to read in a browser today.

Or browse the whole archive.

See what AI says about you.

The first scan is free, it needs no account, and it asks the questions your buyers ask.

Free. No card. We ask 5 real buyer questions on 2 AI apps.

Already sure you want this? Start free. No card needed, and the free plan stays free. Pay only when you want the work done. Or talk to a person if you have a question first. Or read how we fix what it finds.