<?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: Hamza Hasan</title>
    <description>The latest articles on DEV Community by Hamza Hasan (@hamza_hasan).</description>
    <link>https://dev.to/hamza_hasan</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%2F3877369%2Fd8cad71d-ca5c-4e0d-8ee8-3f41fcff9a97.jpg</url>
      <title>DEV Community: Hamza Hasan</title>
      <link>https://dev.to/hamza_hasan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamza_hasan"/>
    <language>en</language>
    <item>
      <title>I built a headless CMS that lets you update mobile app UI without rebuilding or resubmitting</title>
      <dc:creator>Hamza Hasan</dc:creator>
      <pubDate>Tue, 14 Apr 2026 01:36:54 +0000</pubDate>
      <link>https://dev.to/hamza_hasan/i-built-a-headless-cms-that-lets-you-update-mobile-app-ui-without-rebuilding-or-resubmitting-4k76</link>
      <guid>https://dev.to/hamza_hasan/i-built-a-headless-cms-that-lets-you-update-mobile-app-ui-without-rebuilding-or-resubmitting-4k76</guid>
      <description>&lt;p&gt;You know the pain. You ship your app, someone finds a typo, and now you're looking at a 3-day App Store review just to change one string.&lt;/p&gt;

&lt;p&gt;I got tired of this cycle so I built &lt;a href="https://app.cmscure.com" rel="noopener noreferrer"&gt;CMSCure&lt;/a&gt;. It's a headless CMS designed specifically for UI components in mobile and web apps. Not for blogs, not for marketing pages. For the actual text, images, colors, and themes inside your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Install the SDK in your app&lt;/li&gt;
&lt;li&gt;Replace hardcoded strings, image URLs, and color values with CMSCure keys&lt;/li&gt;
&lt;li&gt;Edit those values from the dashboard whenever you want&lt;/li&gt;
&lt;li&gt;Your app picks up the changes in real time over WebSockets&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No new build. No deploy. No app store submission. Your users see the update within seconds.&lt;/p&gt;

&lt;p&gt;Here is a 5 minute walkthrough showing the full setup and live content updates:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/DEFmLgAbhwo"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick example (React Native)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCMSCure&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@cmscure/react-native-sdk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;HomeScreen&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useCMSCure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;home_screen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;View&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hero_banner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;welcome_msg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subtitle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/View&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Change &lt;code&gt;welcome_msg&lt;/code&gt; from the dashboard and it updates live. No code change needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can manage from the dashboard
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Text and copy&lt;/strong&gt;: Every string in your app. Headlines, buttons, descriptions, error messages, onboarding flows. Update any of them without touching code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images&lt;/strong&gt;: Swap banners, icons, profile placeholders. The SDK pulls from our CDN so load times stay fast. You upload once, it serves everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Colors and themes&lt;/strong&gt;: Change your app's color scheme from the dashboard. Ship a dark mode, run seasonal themes, or A/B test different looks without a release.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-language / Localization&lt;/strong&gt;: Add a new locale, translate your keys, and users get the new language instantly. No need to bundle translation files into your binary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Stores&lt;/strong&gt;: Think of these as synced key-value collections. Menus, feature flags, FAQ lists, announcements, app configuration. Structure your data however you want and the SDK keeps it synced on device.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content versioning&lt;/strong&gt;: Every edit is tracked. Roll back to any previous version if something goes wrong. On the Pro plan you also get scheduled publishing, so you can stage changes and have them go live at a specific time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline caching&lt;/strong&gt;: The SDK caches everything locally. If your user loses connectivity, the app keeps working with the last known content. When they're back online, it syncs automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDKs
&lt;/h2&gt;

&lt;p&gt;We currently have SDKs for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript&lt;/strong&gt; (React, Next.js, Vue, Angular, vanilla JS) - &lt;code&gt;npm install @cmscure/javascript-sdk&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;React Native&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS&lt;/strong&gt; (Swift)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android&lt;/strong&gt; (Kotlin/Java)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flutter and Unity3D SDKs are in development and coming soon.&lt;/p&gt;

&lt;p&gt;The JavaScript SDK is also available via CDN (jsDelivr/UNPKG) if you don't want to use npm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;This matters when you're serving content to production apps. Here's what we have in place:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JWT-based authentication for all API and SDK calls&lt;/li&gt;
&lt;li&gt;Encrypted WebSocket handshakes&lt;/li&gt;
&lt;li&gt;GCP Cloud Armor WAF with SQL injection and XSS rules&lt;/li&gt;
&lt;li&gt;Cloud Load Balancer with managed SSL&lt;/li&gt;
&lt;li&gt;GCP Secret Manager for all sensitive credentials&lt;/li&gt;
&lt;li&gt;Role-based access control for team members&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Mobile dev teams who are tired of full release cycles for content changes&lt;/li&gt;
&lt;li&gt;Agencies building apps for clients who want to edit their own content&lt;/li&gt;
&lt;li&gt;Startups that need to iterate fast on copy and visuals without deploying&lt;/li&gt;
&lt;li&gt;Anyone using Firebase Remote Config and wishing it was a proper CMS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developer Trial&lt;/strong&gt;: Free for 1 month (5 screens, 3 locales, 1 seat)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Starter&lt;/strong&gt;: $39.99/mo (5 screens, 3 locales, 75K API calls)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth&lt;/strong&gt;: $99.99/mo (20 screens, 5 locales, 750K API calls, 3 seats)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro&lt;/strong&gt;: $179.99/mo (50 screens, 10 locales, 3M API calls, 5 seats, versioning, scheduled publishing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Sign up at &lt;a href="https://app.cmscure.com" rel="noopener noreferrer"&gt;app.cmscure.com&lt;/a&gt; and you can have it running in your app in about 15 minutes. The JS SDK docs are at &lt;a href="https://www.npmjs.com/package/@cmscure/javascript-sdk" rel="noopener noreferrer"&gt;npmjs.com/@cmscure/javascript-sdk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you have questions or want to see a specific integration example, drop a comment. Happy to help.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mobile</category>
      <category>cms</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
