<?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: Ortwin</title>
    <description>The latest articles on DEV Community by Ortwin (@ortwic).</description>
    <link>https://dev.to/ortwic</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%2F3637170%2Fc29b5e90-c131-4a52-beef-642c08e3e83e.jpeg</url>
      <title>DEV Community: Ortwin</title>
      <link>https://dev.to/ortwic</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ortwic"/>
    <language>en</language>
    <item>
      <title>I built a FireCMS Clone using Svelte 4 — Here’s what I learned</title>
      <dc:creator>Ortwin</dc:creator>
      <pubDate>Sun, 30 Nov 2025 20:32:55 +0000</pubDate>
      <link>https://dev.to/ortwic/i-built-a-firecms-clone-using-svelte-4-heres-what-i-learned-1445</link>
      <guid>https://dev.to/ortwic/i-built-a-firecms-clone-using-svelte-4-heres-what-i-learned-1445</guid>
      <description>&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;For many Firebase projects, a lightweight headless CMS is incredibly useful — whether it’s to integrate a small blog, manage app content, or simply provide a structured way to handle Firestore data.&lt;/p&gt;

&lt;p&gt;There are not many choices which are well integrated with Firebase. In fact its's FireCMS or Flamelink. I like the integration of FireCMS, but for simple projects the full framework can feel a bit heavy. So I built my own alternative using Svelte 4.&lt;/p&gt;

&lt;p&gt;FireCMS is great in many ways, but for my use cases it often felt like more than I needed. The data model system is impressive, but sometimes the flexibility becomes complexity. The UI also didn’t quite fit how I wanted to work: large tables are hard to navigate, editing inside popups feels clumsy, and handling subcollections never clicked for me. At least in the free plan, there was no built-in file manager. (Also there is no free plan for cloud anymore)&lt;/p&gt;

&lt;p&gt;So instead of adapting my workflow to FireCMS (or learning React to contribute to it), I built my own alternative using &lt;strong&gt;Svelte 4&lt;/strong&gt;. (Svelte 5 wasn't out when the project was started)&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Svelte?
&lt;/h2&gt;

&lt;p&gt;I’ve tried React a few times, but it never felt right for me. Svelte, on the other hand, was immediately comfortable. I already used it in another project, and the idea of building a prototype quickly and scaling from there was appealing. Svelte’s ergonomics helped me get the first version running without too much overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ended up building
&lt;/h2&gt;

&lt;p&gt;The result is &lt;strong&gt;Firelighter CMS&lt;/strong&gt;, a minimal CMS that you can host yourself without any backend or auth layer. You paste your Firebase config into the UI, it gets stored in LocalStorage (nothing leaves your browser), and you’re ready to go.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbcbyjiy7ue31igm55ns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbcbyjiy7ue31igm55ns.png" alt="Index page" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The data schema lives directly inside your own Firestore project under a special &lt;code&gt;__schema&lt;/code&gt; collection. That way the schema belongs to your project, not to the CMS. The schema itself is described through a &lt;a href="https://json5.org/" rel="noopener noreferrer"&gt;JSON5&lt;/a&gt; editor — nowhere near as sophisticated as FireCMS, but it kept development manageable, and you can reuse FireCMS-style models almost 1:1. I also added a few extra property types such as &lt;code&gt;set&lt;/code&gt; (&lt;code&gt;array.oneOf&lt;/code&gt;), &lt;code&gt;url&lt;/code&gt;, and a &lt;code&gt;file&lt;/code&gt; type with the existing storage config from the &lt;code&gt;string&lt;/code&gt; property.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmg8y8r1j13gpqifqcfr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmg8y8r1j13gpqifqcfr3.png" alt="Editing Content" width="800" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The editing UI avoids modals completely. I wanted something calmer and less fiddly, so everything happens on a dedicated page. A special set named 'content' will be interpreted as content sections of custom types defined prior in the properties scheme. Of course it supports markdown. I evaluated milkdown as an editor, but it didn't work since it does not support multiple instances on the same page. &lt;a href="https://bytemd.js.org/" rel="noopener noreferrer"&gt;bytemd&lt;/a&gt; on the other hand works really well. Also the addition of the image selector was a piece of 🍰! Speaking of which (not the cake) you can browse to your storage and upload new images very easily.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4654semnyuzy9gglqryq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4654semnyuzy9gglqryq.png" alt="Browsing Media" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isn't it be nice to have a quick glance into the contents of your storage and mange your files?&lt;/p&gt;

&lt;p&gt;Here a quick overview of the tech stack, for those who wanna know.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Svelte 4 as SPA&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;CodeMirror&lt;/li&gt;
&lt;li&gt;bytemd&lt;/li&gt;
&lt;li&gt;tabulator-tables&lt;/li&gt;
&lt;li&gt;boxicons&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I learned (the hard way)
&lt;/h2&gt;

&lt;p&gt;One thing I underestimated was Svelte’s reactivity system. At the beginning everything feels straightforward, but once the app grows, store timing and dependency behavior can get tricky. In hindsight, I should have used &lt;strong&gt;RxJS from day one&lt;/strong&gt;. I eventually introduced it anyway, and it solved several issues that Svelte stores didn’t handle well in a predictable way.&lt;/p&gt;

&lt;p&gt;I’m still unsure whether Svelte 5 would have made this smoother. Maybe. Maybe not. In fact, there were moments where I wondered if Angular — despite requiring more boilerplate — might actually have been the safer long-term option simply of its opinionated structure making use of best practices.&lt;/p&gt;

&lt;p&gt;That said, Svelte did help me move quickly early on, and that speed is what enabled this project in the first place since I don't want to waste to much time which I could invest into other projects. (The actual heads for the headless CMS)&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s next (Roadmap)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Maybe migrating to Svelte 5&lt;/li&gt;
&lt;li&gt;A visual data model editor&lt;/li&gt;
&lt;li&gt;More property types and validation options&lt;/li&gt;
&lt;li&gt;Better component tests&lt;/li&gt;
&lt;li&gt;More documentation and examples&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;If you’re building small to medium Firebase projects and want something simple, transparent, and easy to host yourself, Firelighter CMS might be useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project grew out of my own frustration and curiosity. FireCMS remains a great tool with impressive capabilities, but I wanted something lighter, more direct, and easier to adapt to my personal workflow. Building it taught me a lot about Svelte, about reactivity, and about keeping scope under control.&lt;/p&gt;

&lt;p&gt;If you’re working with Firebase and want a minimal CMS, give it a try — and feel free to send feedback or issues. &lt;/p&gt;

&lt;h2&gt;
  
  
  Demo &amp;amp; Links
&lt;/h2&gt;

&lt;p&gt;👉 Live Demo: &lt;a href="https://fl-cms.web.app/" rel="noopener noreferrer"&gt;https://fl-cms.web.app/&lt;/a&gt;&lt;br&gt;
👉 GitHub Repo: &lt;a href="https://github.com/ortwic/web-apps/tree/main/apps/fl-cms" rel="noopener noreferrer"&gt;https://github.com/ortwic/web-apps/tree/main/apps/fl-cms&lt;/a&gt;&lt;br&gt;
👉 My Profile: &lt;a href="https://ortwic.github.io/" rel="noopener noreferrer"&gt;https://ortwic.github.io/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>svelte</category>
      <category>firebase</category>
    </item>
  </channel>
</rss>
