<?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: UnderPeaks</title>
    <description>The latest articles on DEV Community by UnderPeaks (@under_peaks).</description>
    <link>https://dev.to/under_peaks</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4032518%2F74f074fa-a701-483a-9de7-d39e441e29ff.PNG</url>
      <title>DEV Community: UnderPeaks</title>
      <link>https://dev.to/under_peaks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/under_peaks"/>
    <language>en</language>
    <item>
      <title>Why I Made the Data Model the Single Source of Truth for Both Mobile and Web</title>
      <dc:creator>UnderPeaks</dc:creator>
      <pubDate>Thu, 24 Sep 2026 08:25:14 +0000</pubDate>
      <link>https://dev.to/under_peaks/why-i-made-the-data-model-the-single-source-of-truth-for-both-mobile-and-web-11cf</link>
      <guid>https://dev.to/under_peaks/why-i-made-the-data-model-the-single-source-of-truth-for-both-mobile-and-web-11cf</guid>
      <description>&lt;p&gt;When you're building a product that needs both a mobile app and a web app, there's a decision point early on: do you build two frontends against one backend, or do you try to share more than that?&lt;/p&gt;

&lt;p&gt;Most teams end up with two frontends, one backend, and a growing list of small inconsistencies between them. A field gets added on mobile and forgotten on web. A validation rule changes in one place and not the other. Nothing catastrophic, just a slow accumulation of drift.&lt;/p&gt;

&lt;p&gt;I built Underpeaks around a different assumption: the schema shouldn't just define your backend, it should define your applications too.&lt;/p&gt;

&lt;h2&gt;
  
  
  How that plays out technically
&lt;/h2&gt;

&lt;p&gt;A model in Underpeaks isn't just a database table definition. It carries enough information, field types, UI hints, relationships, validation, to generate a working page in both a Flutter app and a Next.js app. Change the model, regenerate, both applications reflect the change.&lt;/p&gt;

&lt;p&gt;The generation isn't destructive either. Files you've customized are tracked via checksums and left untouched on regeneration. Only genuinely new pieces (a newly added field, say) get merged in. This matters a lot in practice, generated code you can't safely touch is generated code you'll eventually abandon.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database layer
&lt;/h2&gt;

&lt;p&gt;Underpeaks runs on five database backends (Supabase, Postgres, MySQL, MongoDB, Firebase) through one adapter interface. This was a deliberate choice: teams shouldn't have to commit to a database vendor just to use a code generation tool. Same schema, same generated output, regardless of which one sits underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosted by default philosophy
&lt;/h2&gt;

&lt;p&gt;Underpeaks Core is free, open source, and self-hosted. I built it this way first, before the hosted version, because I wanted the tool to work fully even for someone who never pays for anything. Underpeaks Studio (hosted) exists for teams that want managed infrastructure, not because the self-hosted option is deliberately limited.&lt;/p&gt;

&lt;p&gt;Launching on Product Hunt today: &lt;a href="https://www.producthunt.com/products/underpeaks?launch=underpeaks" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/underpeaks?launch=underpeaks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Genuinely interested in hearing how other people have approached this same problem, shared schemas, code generation, monorepo strategies, whatever's worked or not worked for you.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>saas</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>I got tired of building the same backend twice, so I built a tool that generates it for me</title>
      <dc:creator>UnderPeaks</dc:creator>
      <pubDate>Thu, 24 Sep 2026 08:03:07 +0000</pubDate>
      <link>https://dev.to/under_peaks/i-got-tired-of-building-the-same-backend-twice-so-i-built-a-tool-that-generates-it-for-me-1h28</link>
      <guid>https://dev.to/under_peaks/i-got-tired-of-building-the-same-backend-twice-so-i-built-a-tool-that-generates-it-for-me-1h28</guid>
      <description>&lt;p&gt;Every time I shipped a product that needed both a mobile app and a web app, I ended up doing the same thing: build the backend, build the Flutter app on top of it, then build a whole separate Next.js app on top of the same data, and keep both in sync by hand every time the schema changed.&lt;/p&gt;

&lt;p&gt;That got old fast. So I built Underpeaks.&lt;/p&gt;

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

&lt;p&gt;You define your data model once in the console, fields, types, relationships. From that one schema, Underpeaks generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A real Flutter app, with your choice of Riverpod, Provider, or BLoC&lt;/li&gt;
&lt;li&gt;A real Next.js app, with your choice of Zustand, React Query, or Jotai&lt;/li&gt;
&lt;li&gt;A REST API&lt;/li&gt;
&lt;li&gt;An admin dashboard with KPIs and charts, if you want it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not scaffolding. Real, readable source code, using the state management pattern you already know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The database question
&lt;/h2&gt;

&lt;p&gt;Underpeaks isn't tied to one database. Five adapters ship out of the box: Supabase, Postgres, MySQL, MongoDB, Firebase. Same interface regardless of which one you pick, so if you start on Supabase and later need to move, your schema and generated code come with you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosted, actually
&lt;/h2&gt;

&lt;p&gt;Underpeaks Core is free, open source, and runs on your own infrastructure. No calling home, no feature gates you didn't agree to. Underpeaks Studio is the hosted version if you'd rather not run it yourself.&lt;/p&gt;

&lt;p&gt;Launching on Product Hunt today, would love feedback from people who've hit the same problem: &lt;a href="https://www.producthunt.com/products/underpeaks?launch=underpeaks" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/underpeaks?launch=underpeaks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer anything in the comments, architecture, tradeoffs, what's still rough around the edges. It's a solo build, so there's plenty.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>nextjs</category>
      <category>saas</category>
      <category>lowcode</category>
    </item>
  </channel>
</rss>
