<?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: MADANI</title>
    <description>The latest articles on DEV Community by MADANI (@apolocine).</description>
    <link>https://dev.to/apolocine</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%2F3887085%2F903e5141-9b43-467b-8ee0-286f92142c14.jpeg</url>
      <title>DEV Community: MADANI</title>
      <link>https://dev.to/apolocine</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/apolocine"/>
    <language>en</language>
    <item>
      <title>Migrate a Prisma project to Postgres, MySQL, Mongo — or 10 other databases — with zero code change, using @mostajs/orm-cli</title>
      <dc:creator>MADANI</dc:creator>
      <pubDate>Wed, 03 Jun 2026 22:49:38 +0000</pubDate>
      <link>https://dev.to/apolocine/migrate-a-prisma-project-to-postgres-mysql-mongo-or-10-other-databases-with-zero-code-change-3b4j</link>
      <guid>https://dev.to/apolocine/migrate-a-prisma-project-to-postgres-mysql-mongo-or-10-other-databases-with-zero-code-change-3b4j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Part of the &lt;a href="https://mostajs.dev/mostajs-orm-features-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt;&lt;/a&gt; ecosystem — the multi-dialect ORM with one API across 13 databases. This post zooms in on the &lt;strong&gt;migration CLI&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;One command turns an existing &lt;strong&gt;Prisma&lt;/strong&gt; app into a &lt;a href="https://mostajs.dev/mostajs-orm-features-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt;&lt;/a&gt; app that runs on &lt;strong&gt;any of 13 databases&lt;/strong&gt; — and you don't edit a single line of application code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;my-existing-prisma-app
npx @mostajs/orm-cli bootstrap
npm run dev
&lt;span class="c"&gt;# db.User.findMany(...) now runs on SQLite / Postgres / MySQL / Mongo / Oracle / … — same code.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;codemod&lt;/strong&gt; rewrites every &lt;code&gt;new PrismaClient(...)&lt;/code&gt;, backs the originals up, and is &lt;strong&gt;reversible&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Every step &lt;strong&gt;stops on the first error&lt;/strong&gt; — no lying success banner.&lt;/li&gt;
&lt;li&gt;Real proof: a 40-model, 67-file Next.js app migrated end-to-end with &lt;strong&gt;0 files touched by hand&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem: Prisma marries you to one database
&lt;/h2&gt;

&lt;p&gt;Prisma is great until the day you need a &lt;em&gt;different&lt;/em&gt; database — Mongo for one service, Postgres for another, SQLite for local dev or an embedded build, Oracle because the client mandates it. Prisma's schema, client and migrations are tied to one provider; switching means rewriting data access across the whole codebase.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@mostajs/orm-cli&lt;/code&gt; removes that wall. Its headline command, &lt;code&gt;mostajs bootstrap&lt;/code&gt;, performs the migration &lt;em&gt;for&lt;/em&gt; you — codemod included — so the same &lt;code&gt;db.User.findMany()&lt;/code&gt; calls keep working, now on top of an ORM that speaks &lt;strong&gt;13 dialects&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What &lt;code&gt;mostajs bootstrap&lt;/code&gt; actually does
&lt;/h2&gt;

&lt;p&gt;Four steps, each gated on the previous succeeding (v0.4.1+):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Codemod&lt;/strong&gt; — scans the repo for &lt;code&gt;new PrismaClient(...)&lt;/code&gt;, detects each export name (&lt;code&gt;prisma&lt;/code&gt;, &lt;code&gt;db&lt;/code&gt;, &lt;code&gt;client&lt;/code&gt;, default…), and rewrites each site to &lt;code&gt;createPrismaLikeDb()&lt;/code&gt; from &lt;code&gt;@mostajs/orm-bridge&lt;/code&gt;. Originals saved as &lt;code&gt;*.prisma.bak&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install&lt;/strong&gt; — adds &lt;code&gt;@mostajs/orm&lt;/code&gt; + &lt;code&gt;@mostajs/orm-bridge&lt;/code&gt; + &lt;code&gt;@mostajs/orm-adapter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Convert&lt;/strong&gt; — &lt;code&gt;prisma/schema.prisma&lt;/code&gt; → &lt;code&gt;.mostajs/generated/entities.json&lt;/code&gt; (a 13-database-ready schema).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DDL&lt;/strong&gt; — writes &lt;code&gt;.mostajs/config.env&lt;/code&gt; (SQLite defaults) and creates the tables.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The "zero code change" isn't a slogan: &lt;code&gt;@mostajs/orm-bridge&lt;/code&gt; exposes a &lt;strong&gt;Prisma-compatible client&lt;/strong&gt;, so your &lt;code&gt;db.user.findMany(...)&lt;/code&gt; calls hit it unchanged. The codemod just swaps what &lt;code&gt;db&lt;/code&gt; &lt;em&gt;is&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safe by default, and reversible
&lt;/h2&gt;

&lt;p&gt;The codemod (&lt;code&gt;mostajs install-bridge&lt;/code&gt;) is &lt;strong&gt;dry-run by default&lt;/strong&gt; — it reports, it doesn't write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mostajs install-bridge
&lt;span class="go"&gt;Found 3 PrismaClient instantiation site(s):
  → src/lib/db.ts         (const db)
  → src/server/prisma.ts  (const prisma)
  → scripts/seed.ts       (const prisma)
Dry-run — no files written. Re-run with --apply to execute.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It only acts on files that import &lt;code&gt;@prisma/client&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; call &lt;code&gt;new PrismaClient(&lt;/code&gt; — and it &lt;strong&gt;skips files already migrated&lt;/strong&gt;, so re-runs are idempotent. Every rewritten file leaves a &lt;code&gt;.prisma.bak&lt;/code&gt; next to it, and one command rolls the whole thing back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @mostajs/orm-cli install-bridge &lt;span class="nt"&gt;--restore&lt;/span&gt; &lt;span class="nt"&gt;--apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No black box: you can see what changed, and you can undo it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pick your database afterwards
&lt;/h2&gt;

&lt;p&gt;Bootstrap configures SQLite so it works immediately. To target any of the other twelve, edit &lt;code&gt;.mostajs/config.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DB_DIALECT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres
&lt;span class="nv"&gt;SGBD_URI&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres://user:pass@host:5432/mydb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thirteen: &lt;strong&gt;SQLite · PostgreSQL · MySQL · MariaDB · MongoDB · Oracle · SQL Server · CockroachDB · DB2 · SAP HANA · HSQLDB · Spanner · Sybase.&lt;/strong&gt; Same converted schema, same application code — you change two env lines and re-init.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not just Prisma at the input
&lt;/h2&gt;

&lt;p&gt;The converter auto-detects more than Prisma schemas — it also reads &lt;strong&gt;OpenAPI&lt;/strong&gt; (&lt;code&gt;openapi.yaml/json&lt;/code&gt;) and &lt;strong&gt;JSON Schema&lt;/strong&gt; (&lt;code&gt;schemas/*.json&lt;/code&gt;), routing through &lt;code&gt;@mostajs/orm-adapter&lt;/code&gt;. So "I have an API spec but no ORM" is also a starting point, not just "I have Prisma".&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof — FitZoneGym
&lt;/h2&gt;

&lt;p&gt;This isn't a toy demo. &lt;strong&gt;FitZoneGym&lt;/strong&gt; — a production-grade Next.js 15 + Prisma app, &lt;strong&gt;40 models, 67 files importing Prisma&lt;/strong&gt; — was migrated with one bootstrap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;FitZoneGym
npx @mostajs/orm-cli bootstrap     &lt;span class="c"&gt;# 15 PrismaClient sites rewritten, schema converted, DDL applied&lt;/span&gt;
npm run dev                        &lt;span class="c"&gt;# login alice@example.com → 302 + session, on SQLite instead of MongoDB&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Files edited by hand: &lt;strong&gt;0&lt;/strong&gt; — the codemod owned them all. Login, dashboard and API routes ran on &lt;strong&gt;SQLite instead of MongoDB&lt;/strong&gt;, unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  More than migration
&lt;/h2&gt;

&lt;p&gt;Beyond &lt;code&gt;bootstrap&lt;/code&gt;, the CLI carries the everyday utilities you actually need around a database: &lt;code&gt;mostajs health&lt;/code&gt; (Node / schema / &lt;code&gt;entities.json&lt;/code&gt; checks), &lt;code&gt;mostajs detect&lt;/code&gt; (what's in the project), &lt;code&gt;mostajs hash&lt;/code&gt; / &lt;code&gt;verify&lt;/code&gt; (bcrypt for seed data), &lt;code&gt;mostajs diagnose&lt;/code&gt; (login walkthrough), and a full &lt;strong&gt;interactive menu&lt;/strong&gt; (&lt;code&gt;mostajs&lt;/code&gt; with no args) for converting, configuring URIs, init/DDL, seeding, services and logs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One caveat worth stating: this package is an &lt;strong&gt;executable, not a library&lt;/strong&gt; — install and run it, don't &lt;code&gt;import&lt;/code&gt; from it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Where it fits
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mostajs bootstrap&lt;/code&gt; is the on-ramp to &lt;a href="https://mostajs.dev/mostajs-orm-features-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt;&lt;/a&gt;: after it, you own a 13-database-ready schema and a Prisma-compatible runtime via &lt;code&gt;@mostajs/orm-bridge&lt;/code&gt;. To move the &lt;em&gt;data&lt;/em&gt; across dialects after the &lt;em&gt;code&lt;/em&gt; moves, pair it with &lt;a href="https://mostajs.dev/mostajs-orm-copy-data-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm-copy-data&lt;/code&gt;&lt;/a&gt; (the bootstrap uses that engine internally). For ongoing replication, see &lt;a href="https://mostajs.dev/mostajs-replicator-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/replicator&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @mostajs/orm-cli bootstrap        &lt;span class="c"&gt;# zero-install, in your Prisma project&lt;/span&gt;
&lt;span class="c"&gt;# or: npm install -g @mostajs/orm-cli  →  mostajs bootstrap&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;npm&lt;/strong&gt; — &lt;a href="https://www.npmjs.com/package/@mostajs/orm-cli" rel="noopener noreferrer"&gt;npmjs.com/package/@mostajs/orm-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub&lt;/strong&gt; — &lt;a href="https://github.com/apolocine/mosta-orm-cli" rel="noopener noreferrer"&gt;github.com/apolocine/mosta-orm-cli&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧩 &lt;strong&gt;The ORM it migrates you to&lt;/strong&gt; — &lt;a href="https://mostajs.dev/mostajs-orm-features-article.html" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt; — 13 databases, one API, zero codegen&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If escaping single-database lock-in with one reversible command is useful, a ⭐ on GitHub helps — it's the signal AI dev tools use to surface the package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auteur&lt;/strong&gt; : Dr Hamid MADANI &lt;a href="mailto:drmdh@msn.com"&gt;drmdh@msn.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>prisma</category>
      <category>database</category>
      <category>migration</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I built a 13-database ORM for Node.js because Prisma doesn't support Oracle</title>
      <dc:creator>MADANI</dc:creator>
      <pubDate>Sun, 19 Apr 2026 08:23:26 +0000</pubDate>
      <link>https://dev.to/apolocine/i-built-a-13-database-orm-for-nodejs-because-prisma-doesnt-support-oracle-59n0</link>
      <guid>https://dev.to/apolocine/i-built-a-13-database-orm-for-nodejs-because-prisma-doesnt-support-oracle-59n0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;🇫🇷 Pourquoi j'ai créé @mostajs/orm — 13 bases de données, une seule API, zéro génération de code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;By Dr Hamid MADANI — published on dev.to / Medium / Hashnode&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.npmjs.com/package/@mostajs/orm" rel="noopener noreferrer"&gt;@mostajs/orm&lt;/a&gt; is a Hibernate/JPA-inspired ORM for Node.js &amp;amp; TypeScript that supports &lt;strong&gt;13 databases through a single API&lt;/strong&gt; (PostgreSQL, MySQL, MariaDB, SQLite, MongoDB, Oracle, MSSQL, CockroachDB, DB2, SAP HANA, HSQLDB, Spanner, Sybase). No codegen step. No &lt;code&gt;.prisma&lt;/code&gt; DSL. Just plain TypeScript objects.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Test coverage, stated honestly:&lt;/strong&gt; &lt;strong&gt;8 of the 13 engines are validated end-to-end&lt;/strong&gt; — PostgreSQL, MySQL, MariaDB, SQLite, MongoDB, SQL Server, Oracle, HSQLDB (including the WASM runtimes &lt;code&gt;sqljs&lt;/code&gt; and &lt;code&gt;pglite&lt;/code&gt;). The other 5 — CockroachDB, DB2, SAP HANA, Spanner, Sybase — are &lt;strong&gt;implemented but not yet validated end-to-end&lt;/strong&gt; (hard-to-provision enterprise/cloud engines). No "coming soon" in disguise: the dialects exist; their E2E test status is disclosed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you've ever wished Prisma had Hibernate's depth, or that Drizzle worked with MongoDB, or that TypeORM was actually maintained — this is for you. And with its &lt;strong&gt;WASM dialects&lt;/strong&gt; (&lt;code&gt;sqljs&lt;/code&gt; / &lt;code&gt;pglite&lt;/code&gt;), the same code &lt;strong&gt;runs in the browser and in AI dev tools&lt;/strong&gt; (Bolt.new, StackBlitz, CodeSandbox) with no native binary — so the starters below open and run in one click.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @mostajs/orm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;I've spent 15+ years writing data layers — Java/Hibernate, Spring Data, then years in the Node ecosystem with TypeORM, Sequelize, Prisma, Drizzle, Mongoose. Each one is great at something, and frustrating at something else.&lt;/p&gt;

&lt;p&gt;After shipping ~30 production apps, three pain points kept coming back:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lock-in by ORM choice.&lt;/strong&gt; Pick Prisma → no MongoDB. Pick Mongoose → no SQL. Pick Drizzle → no document store. Each migration project means rewriting the data layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codegen friction.&lt;/strong&gt; &lt;code&gt;prisma generate&lt;/code&gt; after every schema change. Stale types in CI. Editor lag. Lost minutes that compound into hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loss of Hibernate concepts.&lt;/strong&gt; &lt;code&gt;CascadeType&lt;/code&gt;, &lt;code&gt;FetchType&lt;/code&gt;, &lt;code&gt;hbm2ddl.auto&lt;/code&gt;, lazy loading proxies — these aren't bloat, they're battle-tested patterns. Node ORMs mostly throw them away.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So I built one that fixes the three.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 1 — One API, 13 databases
&lt;/h2&gt;

&lt;p&gt;The killer feature. You write your schema once. You change one config line to switch backend.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SQLite for dev&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sqlite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// PostgreSQL for staging&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres://...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// MongoDB for that one client who insists&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongo&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mongodb://...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Oracle for the enterprise contract&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oracle&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The four engines above (SQLite, PostgreSQL, MongoDB, Oracle) are all &lt;strong&gt;tested end-to-end&lt;/strong&gt; — see the TL;DR for the full 8-tested / 5-pending breakdown.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The repository API stays identical:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BaseRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a@b.c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a@b.c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gte&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;$or&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&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="na"&gt;verified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;span class="na"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&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;That &lt;code&gt;$gte&lt;/code&gt;/&lt;code&gt;$or&lt;/code&gt; syntax works on PostgreSQL, MySQL, MongoDB, Oracle — all of them. The dialect adapts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters for AI dev tools.&lt;/strong&gt; When Bolt.new or Cursor generates code, it doesn't have to "know" your DB. One mental model, every backend.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 2 — Pure TypeScript schemas, zero codegen
&lt;/h2&gt;

&lt;p&gt;No &lt;code&gt;prisma generate&lt;/code&gt;. No &lt;code&gt;.prisma&lt;/code&gt; file. No DSL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;EntitySchema&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;@mostajs/orm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PostSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EntitySchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;sparse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;boolean&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;relations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;many-to-one&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cascade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;comments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Comment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;one-to-many&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;mappedBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;cascade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;persist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;remove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;orphanRemoval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unique&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
  &lt;span class="na"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;softDelete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;That's it. Type-safe immediately. No build step. Edit the schema, save, hot-reload picks it up.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 3 — Hibernate/JPA concepts, finally in Node
&lt;/h2&gt;

&lt;p&gt;If you've ever used Hibernate, this will feel like home:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;JPA / Hibernate&lt;/th&gt;
&lt;th&gt;@mostajs/orm&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@OneToMany&lt;/code&gt;, &lt;code&gt;@ManyToOne&lt;/code&gt;, &lt;code&gt;@ManyToMany&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;relations: { type: 'one-to-many', ... }&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CascadeType.PERSIST/MERGE/REMOVE/ALL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cascade: ['persist', 'merge', 'remove']&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;FetchType.LAZY&lt;/code&gt; / &lt;code&gt;EAGER&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;`fetch: 'lazy' \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;@OnDelete(CASCADE)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;onDelete: 'cascade'&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;orphanRemoval = true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;orphanRemoval: true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hbm2ddl.auto = validate/update/create/create-drop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;`schemaStrategy: 'validate' \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;persistence.xml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ConnectionConfig&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're a Java dev moving to Node, you'll be productive in 10 minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 4 — MongoDB-style filters, on every database
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;recent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$gte&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;86400000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;$or&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;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;orm&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="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;featuredAuthors&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;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$regex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/next&lt;/span&gt;&lt;span class="se"&gt;\.?&lt;/span&gt;&lt;span class="sr"&gt;js/i&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;Works on PostgreSQL. Works on SQLite. Works on MongoDB. Works on Oracle. The dialect translates &lt;code&gt;$gte&lt;/code&gt; → &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;$in&lt;/code&gt; → &lt;code&gt;IN (...)&lt;/code&gt;, &lt;code&gt;$regex&lt;/code&gt; → &lt;code&gt;LIKE&lt;/code&gt; / &lt;code&gt;~&lt;/code&gt; / &lt;code&gt;$regex&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;You don't learn a new query language per DB. You write MongoDB filters, and they run everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 5 — Built-in schema validator (24 rules)
&lt;/h2&gt;

&lt;p&gt;This is the one nobody talks about, and it's saved me dozens of hours.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt; ships with a CLI validator that lints your schemas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mostajs-orm-validator &lt;span class="nt"&gt;--src&lt;/span&gt; ./src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;24 rules out of the box, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;R003&lt;/strong&gt; — soft-delete fields detected but no native flag → suggest &lt;code&gt;softDelete: true&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R003B&lt;/strong&gt; — unique non-sparse index on soft-deleted entity → blocks reinsertion after soft delete (auto-fixable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R009&lt;/strong&gt; — &lt;code&gt;findOne&lt;/code&gt; lookup without matching index → suggests adding one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R013&lt;/strong&gt; — relation without &lt;code&gt;cascade&lt;/code&gt; where required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R013B&lt;/strong&gt; — &lt;code&gt;fetch: 'eager'&lt;/code&gt; without &lt;code&gt;onDelete&lt;/code&gt; → orphans populated silently (auto-fixable)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R019&lt;/strong&gt; — &lt;code&gt;repo.findById(entity.relation)&lt;/code&gt; where relation is lazy → wraps with &lt;code&gt;extractRelId()&lt;/code&gt; automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;R021&lt;/strong&gt; — direct comparison &lt;code&gt;entity.relation === value&lt;/code&gt; under eager fetch → always false bug (auto-fixable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try getting that out of Prisma. You can't.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 6 — JDBC bridge for legacy databases
&lt;/h2&gt;

&lt;p&gt;Need to connect to &lt;strong&gt;DB2&lt;/strong&gt;, &lt;strong&gt;SAP HANA&lt;/strong&gt;, &lt;strong&gt;Sybase&lt;/strong&gt;, or &lt;strong&gt;HSQLDB&lt;/strong&gt; from Node? They have no native Node drivers worthy of production.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@mostajs/orm/bridge&lt;/code&gt; exposes a JDBC bridge that runs a Java sidecar process. Same API, no compromise.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;BridgeManager&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;saveJarFile&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;@mostajs/orm/bridge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveJarFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./drivers/db2.jar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dialect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;db2&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;jdbc:db2://host:50000/MYDB&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the enterprise/banking/healthcare crowd, this alone is reason enough to switch.&lt;/p&gt;




&lt;h2&gt;
  
  
  Feature 7 — Multi-connection, multi-tenant ready
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;getDialect()&lt;/code&gt; is a singleton for the simple case. For multi-tenant SaaS where each tenant has its own DB:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;createIsolatedDialect&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;@mostajs/orm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tenantA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createIsolatedDialect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;tenantA_URI&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ALL_SCHEMAS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tenantB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createIsolatedDialect&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;tenantB_URI&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;ALL_SCHEMAS&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Concurrent, isolated, type-safe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Feature 8 — Runs in the browser &amp;amp; WebContainers (WASM)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;better-sqlite3&lt;/code&gt; is a native addon — it doesn't compile in Bolt.new / StackBlitz / CodeSandbox or on the edge. So &lt;code&gt;@mostajs/orm&lt;/code&gt; ships &lt;strong&gt;WASM dialects&lt;/strong&gt; with the same API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sqljs&lt;/code&gt;&lt;/strong&gt; — SQLite compiled to WebAssembly. Zero native binary, boots in the browser, WebContainers and edge runtimes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;pglite&lt;/code&gt;&lt;/strong&gt; — PostgreSQL in WASM, with native IndexedDB persistence (&lt;code&gt;uri: 'idb://my-db'&lt;/code&gt;).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// same code, no native binary — boots in Bolt.new on the first try&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dialect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sqljs&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:memory:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;schemaStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;ALL_SCHEMAS&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;This is why the starters below &lt;strong&gt;open and run in AI dev tools instantly&lt;/strong&gt; — the thing that makes an ORM &lt;em&gt;discoverable&lt;/em&gt; by Bolt, Lovable, v0 and Cursor. Switch one config line (&lt;code&gt;dialect: 'postgres'&lt;/code&gt;) for production; the code is identical.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;@mostajs/orm&lt;/th&gt;
&lt;th&gt;Prisma&lt;/th&gt;
&lt;th&gt;Drizzle&lt;/th&gt;
&lt;th&gt;TypeORM&lt;/th&gt;
&lt;th&gt;Mongoose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SQL databases&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ (preview)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codegen step&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schema in TS&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (decorators)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB-like filters&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hibernate semantics&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;partial&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;partial&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JDBC bridge&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in linter&lt;/td&gt;
&lt;td&gt;✅ (24 rules)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edge runtime&lt;/td&gt;
&lt;td&gt;✅ (WASM)&lt;/td&gt;
&lt;td&gt;⚠️ (Accelerate $)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser / WebContainer (Bolt, StackBlitz)&lt;/td&gt;
&lt;td&gt;✅ (WASM)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active maintenance&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;AGPL-3.0 / commercial&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @mostajs/orm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;createConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BaseRepository&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;EntitySchema&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;@mostajs/orm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EntitySchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&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="na"&gt;relations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="na"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="na"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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="nx"&gt;dialect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sqlite&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./app.db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;schemaStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update&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="nx"&gt;UserSchema&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="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BaseRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&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="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dialect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a@b.c&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a working app. No codegen. No migrations file. The &lt;code&gt;schemaStrategy: 'update'&lt;/code&gt; reconciles the DB schema on boot (use &lt;code&gt;'validate'&lt;/code&gt; in production).&lt;/p&gt;




&lt;h2&gt;
  
  
  Open source &amp;amp; commercial use
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt; is &lt;strong&gt;AGPL-3.0&lt;/strong&gt;. If your project is open source under a compatible license, you're free to use it.&lt;/p&gt;

&lt;p&gt;For closed-source / SaaS / commercial products, a &lt;strong&gt;commercial license&lt;/strong&gt; is available. Contact &lt;a href="https://mostajs.dev" rel="noopener noreferrer"&gt;mostajs.dev&lt;/a&gt; — pricing scales with company size, no per-seat fees, no per-query fees.&lt;/p&gt;

&lt;p&gt;This dual-license model funds active development, the same way Sentry, MongoDB, BullMQ Pro, and Cal.com do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starters — open in your browser (no install)
&lt;/h2&gt;

&lt;p&gt;Six public starters, each boots &lt;strong&gt;with no native binary&lt;/strong&gt; via the &lt;code&gt;sqljs&lt;/code&gt; (SQLite WASM) dialect. &lt;strong&gt;Tested E2E&lt;/strong&gt; (June 2026): &lt;strong&gt;StackBlitz 6/6 ✅ · CodeSandbox 6/6 ✅ · Bolt.new&lt;/strong&gt; (the server starters run as-is; the Next ones run in prod — Bolt's runtime doesn't run Next dev).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Starter&lt;/th&gt;
&lt;th&gt;What it shows&lt;/th&gt;
&lt;th&gt;Open in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;nextjs / express / fastify / hono&lt;/strong&gt; -mostajs-orm-starter&lt;/td&gt;
&lt;td&gt;Blog (Users · Posts · Comments) — relations, soft-delete, seed&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://stackblitz.com/github/apolocine/nextjs-mostajs-orm-starter" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt; · &lt;a href="https://bolt.new/github.com/apolocine/nextjs-mostajs-orm-starter" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; · &lt;a href="https://codesandbox.io/p/github/apolocine/nextjs-mostajs-orm-starter" rel="noopener noreferrer"&gt;CodeSandbox&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mostajs-saas-starter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SaaS MVP — landing + auth (&lt;a href="https://www.npmjs.com/package/@mostajs/auth-lite" rel="noopener noreferrer"&gt;@mostajs/auth-lite&lt;/a&gt;) + CRUD dashboard&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://stackblitz.com/github/apolocine/mostajs-saas-starter" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt; · &lt;a href="https://bolt.new/github.com/apolocine/mostajs-saas-starter" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; · &lt;a href="https://codesandbox.io/p/github/apolocine/mostajs-saas-starter" rel="noopener noreferrer"&gt;CodeSandbox&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;mostajs-survey-starter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Survey + admin dashboard (bar charts)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://stackblitz.com/github/apolocine/mostajs-survey-starter" rel="noopener noreferrer"&gt;StackBlitz&lt;/a&gt; · &lt;a href="https://bolt.new/github.com/apolocine/mostajs-survey-starter" rel="noopener noreferrer"&gt;Bolt&lt;/a&gt; · &lt;a href="https://codesandbox.io/p/github/apolocine/mostajs-survey-starter" rel="noopener noreferrer"&gt;CodeSandbox&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Samples &amp;amp; AI tooling
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📚 &lt;strong&gt;Runnable samples&lt;/strong&gt; — &lt;code&gt;npx @mostajs/orm-samples scaffold &amp;lt;name&amp;gt;&lt;/code&gt; drops one runnable snippet per feature (relations, soft-delete, transactions, migrations…).&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;MCP server&lt;/strong&gt; — &lt;a href="https://www.npmjs.com/package/@mostajs/orm-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm-mcp&lt;/code&gt;&lt;/a&gt; is listed in the &lt;strong&gt;official MCP Registry&lt;/strong&gt; (&lt;code&gt;io.github.apolocine/orm-mcp&lt;/code&gt;). In Claude / Cursor / Cline, ask &lt;em&gt;"generate a mostajs/orm schema"&lt;/em&gt; and the AI calls the tool: generate &lt;code&gt;EntitySchema&lt;/code&gt;, lint (24 rules), produce SQL migrations. A public instance is &lt;strong&gt;hosted&lt;/strong&gt; at &lt;code&gt;https://orm-mcp.amia.fr/mcp&lt;/code&gt; (Streamable HTTP).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Add it to your AI tool&lt;/strong&gt; — hosted (no install), or local via &lt;code&gt;npx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;// Hosted (clients that speak HTTP)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mostajs-orm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://orm-mcp.amia.fr/mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// stdio-only clients → bridge the hosted server&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mostajs-orm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-remote"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://orm-mcp.amia.fr/mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="c1"&gt;// Local stdio (the AI tool spawns the process)&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mostajs-orm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@mostajs/orm-mcp"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;In practice&lt;/strong&gt; — once connected, you just talk to your AI tool. No SDK, no docs to read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  You:  Model a blog: a User has many Posts, each Post has many Comments. Soft-delete everywhere.
  AI:   → calls mostajs_generate_schema
        ✓ 3 EntitySchemas (User, Post, Comment) with relations + softDelete
  AI:   → calls mostajs_validate
        ✓ 24/24 rules pass — no missing inverse relation, no orphan FK
  AI:   → calls mostajs_create_migration
        ✓ SQL migration emitted (postgres) — switch one line for the other 12 dialects
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Don't take my word for it — run the whole chain.&lt;/strong&gt; Sample &lt;a href="https://github.com/apolocine/mosta-orm-samples/tree/main/examples/18-mcp-to-running-app" rel="noopener noreferrer"&gt;&lt;code&gt;18-mcp-to-running-app&lt;/code&gt;&lt;/a&gt; does this end-to-end: the MCP generates the schemas for an e-commerce model (users/products/orders), &lt;code&gt;@mostajs/orm&lt;/code&gt; applies them, and the app runs on &lt;strong&gt;&lt;code&gt;sqljs&lt;/code&gt;&lt;/strong&gt; (SQLite WASM, &lt;strong&gt;zero native binary&lt;/strong&gt;) — with an HTML proof report next to the real insert/select output.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  npx @mostajs/orm-samples scaffold 18-mcp-to-running-app ~/demo
  &lt;span class="nb"&gt;cd&lt;/span&gt; ~/demo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; bash scripts/02-report.sh        &lt;span class="c"&gt;# → report.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connecting the hosted instance from a stdio-only client looks like this — and that's the whole setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;  $&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;npx mcp-remote https://orm-mcp.amia.fr/mcp
&lt;span class="go"&gt;  [mcp-remote] Connecting to remote server: https://orm-mcp.amia.fr/mcp
  [mcp-remote] Connected using StreamableHTTPClientTransport
  [mcp-remote] Proxy established between local STDIO and remote server
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The ecosystem around it
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;@mostajs/orm&lt;/code&gt; is the core — the same schema model powers a few focused, &lt;strong&gt;already-published&lt;/strong&gt; tools. Each gets its own deep-dive post soon; the one-liners:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🚚 &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@mostajs/orm-copy-data" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm-copy-data&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — cross-dialect data copy/dump: one source (DB / CSV / JSON / SQL) → N destinations. Backup, migration, seeding. CLI + API, cron-ready.&lt;/li&gt;
&lt;li&gt;🔁 &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@mostajs/replicator" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/replicator&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — replication manager: master/slave CQRS, cross-dialect CDC, read routing, failover.&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@mostajs/replica-monitor" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/replica-monitor&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — live web dashboard for the replicator (reads the replication tree directly — no DB connection needed).&lt;/li&gt;
&lt;li&gt;⚙️ &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@mostajs/orm-cli" rel="noopener noreferrer"&gt;&lt;code&gt;@mostajs/orm-cli&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt; — universal CLI: &lt;code&gt;mostajs bootstrap&lt;/code&gt; migrates a Prisma project (codemod + deps + schema convert + DDL) to 13 databases with zero code change.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Same EntitySchema, same 13-database reach — these extend the ORM into backup, replication and migration without a second mental model.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;npm&lt;/strong&gt; — &lt;a href="https://www.npmjs.com/package/@mostajs/orm" rel="noopener noreferrer"&gt;npmjs.com/package/@mostajs/orm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub&lt;/strong&gt; — &lt;a href="https://github.com/apolocine/mosta-orm" rel="noopener noreferrer"&gt;github.com/apolocine/mosta-orm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website&lt;/strong&gt; — &lt;a href="https://mostajs.dev" rel="noopener noreferrer"&gt;mostajs.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;LLM card&lt;/strong&gt; — &lt;a href="https://github.com/apolocine/mosta-orm/blob/main/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you like this, a ⭐ on GitHub helps a lot — it's the strongest signal for AI dev tools (Bolt, Cursor, v0, Lovable) to start surfacing the library.&lt;/p&gt;

</description>
      <category>database</category>
      <category>node</category>
      <category>opensource</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
