<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: FlutterJS</title>
    <description>The latest articles on DEV Community by FlutterJS (@flutterjs).</description>
    <link>https://dev.to/flutterjs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3755471%2F759b45de-4cc8-42c7-8c06-18e57ef7fe05.png</url>
      <title>DEV Community: FlutterJS</title>
      <link>https://dev.to/flutterjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flutterjs"/>
    <language>en</language>
    <item>
      <title>FlutterJS: I Built a Flutter Compiler That Outputs Real HTML (Not Canvas)</title>
      <dc:creator>FlutterJS</dc:creator>
      <pubDate>Thu, 05 Feb 2026 20:05:39 +0000</pubDate>
      <link>https://dev.to/flutterjs/flutterjs-i-built-a-flutter-compiler-that-outputs-real-html-not-canvas-1kc4</link>
      <guid>https://dev.to/flutterjs/flutterjs-i-built-a-flutter-compiler-that-outputs-real-html-not-canvas-1kc4</guid>
      <description>&lt;h2&gt;
  
  
  The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Flutter Web has a secret: it's not really "the web."&lt;/p&gt;

&lt;p&gt;When you build a Flutter Web app, everything renders to a &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; element. That's fine for complex apps, but for websites it creates serious problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No SEO&lt;/strong&gt; – Google can't index canvas pixels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huge bundles&lt;/strong&gt; – 2-5 MB minimum, even for simple apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor accessibility&lt;/strong&gt; – No semantic HTML for screen readers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow first paint&lt;/strong&gt; – 3-8 seconds to see content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I hit this wall when a client asked me to build a marketing site in Flutter. It looked great, but Google Search Console showed zero impressions. The site was invisible.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Different Approach
&lt;/h2&gt;

&lt;p&gt;What if Flutter compiled to actual HTML instead of canvas?&lt;/p&gt;

&lt;p&gt;That's what I built. &lt;strong&gt;FlutterJS&lt;/strong&gt; takes your normal Flutter/Dart code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'My Site'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Hello, World!'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And outputs semantic HTML:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;main&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;header&amp;gt;&amp;lt;h1&amp;gt;&lt;/span&gt;My Site&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Hello, World!&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same Flutter DX. Real web output.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write normal Flutter code&lt;/strong&gt; – no special syntax&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dart CLI analyzes your AST&lt;/strong&gt; – full type resolution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates JavaScript&lt;/strong&gt; – with a lightweight VNode runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outputs semantic HTML&lt;/strong&gt; – that search engines can index&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The JavaScript runtime handles diffing and updates, similar to React's virtual DOM but optimized for Flutter's widget model.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Flutter Web&lt;/th&gt;
&lt;th&gt;FlutterJS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundle Size&lt;/td&gt;
&lt;td&gt;2-5 MB&lt;/td&gt;
&lt;td&gt;50-100 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First Paint&lt;/td&gt;
&lt;td&gt;3-8s&lt;/td&gt;
&lt;td&gt;&amp;lt;1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO Score&lt;/td&gt;
&lt;td&gt;0-30&lt;/td&gt;
&lt;td&gt;90-100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What Works Today
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Layout widgets:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container, Row, Column, Center, Padding&lt;/li&gt;
&lt;li&gt;Stack, Positioned, Expanded, Flexible, SizedBox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Material widgets:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scaffold, AppBar, Drawer&lt;/li&gt;
&lt;li&gt;ElevatedButton, TextButton, IconButton&lt;/li&gt;
&lt;li&gt;TextField, Checkbox, Radio, Switch&lt;/li&gt;
&lt;li&gt;Text, Icon, Image, Card&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;State management:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;StatefulWidget, setState()&lt;/li&gt;
&lt;li&gt;InheritedWidget&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Missing (For Now)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Package support&lt;/strong&gt; – External pub.dev packages aren't fully supported yet. Pure UI code works great!&lt;/li&gt;
&lt;li&gt;Animations&lt;/li&gt;
&lt;li&gt;Advanced Material widgets (Tabs, Dialog, BottomSheet)&lt;/li&gt;
&lt;li&gt;Cupertino widgets&lt;/li&gt;
&lt;li&gt;CustomPainter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are on the roadmap. The architecture supports them, I just haven't implemented them yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repository&lt;/span&gt;
git clone &lt;span class="nt"&gt;--recursive&lt;/span&gt; https://github.com/flutterjsdev/flutterjs.git
&lt;span class="nb"&gt;cd &lt;/span&gt;flutterjs

&lt;span class="c"&gt;# Activate the Dart CLI&lt;/span&gt;
dart pub global activate &lt;span class="nt"&gt;--source&lt;/span&gt; path &lt;span class="nb"&gt;.&lt;/span&gt;
dart pub get
dart run tool/init.dart

&lt;span class="c"&gt;# Now you can use flutterjs commands&lt;/span&gt;
flutterjs &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:3000&lt;/code&gt; and inspect the page. You'll see real HTML elements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://flutterjs.dev" rel="noopener noreferrer"&gt;flutterjs.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/flutterjsdev/flutterjs" rel="noopener noreferrer"&gt;github.com/flutterjsdev/flutterjs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;pub.dev&lt;/strong&gt;: &lt;a href="https://pub.dev/packages/flutterjs_seo" rel="noopener noreferrer"&gt;pub.dev/packages/flutterjs_seo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I Need Your Help
&lt;/h2&gt;

&lt;p&gt;This is open source and I'm looking for contributors. If you care about Flutter on the web:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test it and report bugs&lt;/li&gt;
&lt;li&gt;Contribute missing widgets&lt;/li&gt;
&lt;li&gt;Help with documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What widgets would you need for your use case? Let me know in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>flutter</category>
      <category>flutterweb</category>
      <category>flutterjs</category>
    </item>
  </channel>
</rss>
