<?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: moogo.dev</title>
    <description>The latest articles on DEV Community by moogo.dev (@moogodev).</description>
    <link>https://dev.to/moogodev</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%2F4172377%2F4e6501d6-fd7d-489e-82f2-c38854ac10c3.png</url>
      <title>DEV Community: moogo.dev</title>
      <link>https://dev.to/moogodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moogodev"/>
    <language>en</language>
    <item>
      <title>What is Moogo?</title>
      <dc:creator>moogo.dev</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:26:02 +0000</pubDate>
      <link>https://dev.to/moogodev/what-is-moogo-594h</link>
      <guid>https://dev.to/moogodev/what-is-moogo-594h</guid>
      <description>&lt;p&gt;Moogo is a hosted backend that gives every project its own &lt;strong&gt;SQLite database&lt;/strong&gt; and&lt;br&gt;
its own &lt;strong&gt;object storage&lt;/strong&gt;, reachable over plain HTTP. There is no connection&lt;br&gt;
string, no driver, and no database client to install.&lt;/p&gt;

&lt;p&gt;You create a project, and Moogo hands you three values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MOOGO_PROJECT_URL=https://api.moogo.dev/p/8f3c1a20-5b7e-4a91-9d3c-2f6b81e4a7d0
MOOGO_PROJECT_ID=8f3c1a20-5b7e-4a91-9d3c-2f6b81e4a7d0
MOOGO_SECRET_KEY=moogo_...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put those in your application's environment and it can read and write data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nv"&gt;$MOOGO_PROJECT_URL&lt;/span&gt;/query &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$MOOGO_SECRET_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"query":"SELECT id, email FROM users WHERE plan = ?","args":["pro"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole integration. No SDK, no ORM, no connection pool to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two planes
&lt;/h2&gt;

&lt;p&gt;Everything about Moogo follows from one architectural decision: the service runs&lt;br&gt;
in &lt;strong&gt;two tiers&lt;/strong&gt;, and they never mix.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plane&lt;/th&gt;
&lt;th&gt;Runs on&lt;/th&gt;
&lt;th&gt;Holds&lt;/th&gt;
&lt;th&gt;Touches your data?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Control plane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;Accounts, projects, key hashes, quotas, the bucket catalog, activity logs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data plane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQLite, one &lt;code&gt;.db&lt;/code&gt; file per project&lt;/td&gt;
&lt;td&gt;Your tables and your rows&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The control plane knows that a project exists. The data plane holds what is in it.&lt;br&gt;
A query never crosses between them, and a bug in the control plane cannot reach&lt;br&gt;
your rows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters to you
&lt;/h3&gt;

&lt;p&gt;Because the data plane is &lt;strong&gt;one physical file per project&lt;/strong&gt;, isolation is not a&lt;br&gt;
policy that can be misconfigured. Project A and project B are two different files&lt;br&gt;
on disk. There is no shared connection, no shared buffer pool, and no query that&lt;br&gt;
can be written to cross from one to the other. A project belonging to another&lt;br&gt;
account answers &lt;code&gt;404&lt;/code&gt;, not &lt;code&gt;403&lt;/code&gt;, so an id cannot even be probed for existence.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A real SQLite database.&lt;/strong&gt; Full SQLite, the engine you already know, with
&lt;code&gt;WAL&lt;/code&gt; journaling and foreign keys enabled on every connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object storage per project.&lt;/strong&gt; Up to 256 MB of files, organized into buckets,
with public URLs you can put in an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A dashboard.&lt;/strong&gt; Browse your tables as a spreadsheet, run SQL in a console, and
watch the activity log. It needs no secret key from you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Honest limits.&lt;/strong&gt; 100 MB per database, 15 seconds per statement, 1 MB per
request body. Every one of them is reported in the response, so you find out
from the API rather than from a hung tab.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Moogo is not
&lt;/h2&gt;

&lt;p&gt;It is worth being direct about the edges.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It is not Postgres.&lt;/strong&gt; If you need &lt;code&gt;PostGIS&lt;/code&gt;, logical replication, or
concurrent analytical workloads, Moogo is the wrong tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It is not a global replica network.&lt;/strong&gt; One project is one file on one host.
There is no read replica in another region.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It does not pause.&lt;/strong&gt; A project does not go to sleep after inactivity, so
there is no cold start and no "first request after idle" latency. It also never
pauses on its own — if you want to stop paying resources for an unused project,
you pause it deliberately.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Visit &lt;a href="https://moogo.dev" rel="noopener noreferrer"&gt;https://moogo.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>cloud</category>
      <category>database</category>
    </item>
  </channel>
</rss>
