<?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: zintrust Zin</title>
    <description>The latest articles on DEV Community by zintrust Zin (@zintrustjs).</description>
    <link>https://dev.to/zintrustjs</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%2F3669249%2Fd37cd936-f354-42b6-a39f-f68c512ad081.png</url>
      <title>DEV Community: zintrust Zin</title>
      <link>https://dev.to/zintrustjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zintrustjs"/>
    <language>en</language>
    <item>
      <title>Migrate MySQL, Postgres, SQLite, or SQL Server to Cloudflare D1 — with checkpoints and integrity checks</title>
      <dc:creator>zintrust Zin</dc:creator>
      <pubDate>Tue, 17 Mar 2026 07:40:34 +0000</pubDate>
      <link>https://dev.to/zintrustjs/migrate-mysql-postgres-sqlite-or-sql-server-to-cloudflare-d1-with-checkpoints-and-integrity-pkd</link>
      <guid>https://dev.to/zintrustjs/migrate-mysql-postgres-sqlite-or-sql-server-to-cloudflare-d1-with-checkpoints-and-integrity-pkd</guid>
      <description>&lt;p&gt;Moving an existing database to Cloudflare D1 sounds simple until you hit type mismatches, partial failures halfway through a million-row import, or find out afterwards that 3,000 rows silently didn't land.&lt;/p&gt;

&lt;p&gt;We built &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/@zintrust/d1-migrator" rel="noopener noreferrer"&gt;@zintrust/d1-migrator&lt;/a&gt;&lt;/strong&gt; to solve exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Migrates &lt;strong&gt;MySQL, PostgreSQL, SQLite, or SQL Server → Cloudflare D1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resumable&lt;/strong&gt; — checkpoints every N rows so a failure doesn't mean starting from zero&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data integrity verified&lt;/strong&gt; — row counts + checksums validated after every batch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dry-run mode&lt;/strong&gt; — preview the full migration without touching D1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive mode&lt;/strong&gt; — guided prompts for tables with D1 compatibility warnings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero downtime&lt;/strong&gt; — runs against your live database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript-first&lt;/strong&gt; — full types, works with &lt;code&gt;@zintrust/core&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @zintrust/d1-migrator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quickest possible migration (1-line CLI)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DB_CONNECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mysql &lt;span class="nv"&gt;DB_READ_HOSTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1 &lt;span class="nv"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3306 &lt;span class="nv"&gt;DB_DATABASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mydb &lt;span class="nv"&gt;DB_USERNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;root &lt;span class="nv"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secret &lt;span class="nv"&gt;D1_TARGET_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;my-d1-db zin migrate-to-d1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All values can also be passed as explicit CLI flags. The order of precedence is: &lt;strong&gt;CLI flag → env var → default&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript API
&lt;/h2&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;D1Migrator&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;@zintrust/d1-migrator&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;progress&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;D1Migrator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DataMigrator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;migrateData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;sourceConnection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mysql://user:password@localhost:3306/mydb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;sourceDriver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mysql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;targetDatabase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-d1-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;targetType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;d1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;batchSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;checkpointInterval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Migrated: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;progress&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;processedRows&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; rows`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Type conversions handled automatically
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;D1 / SQLite&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DATETIME&lt;/td&gt;
&lt;td&gt;TEXT (ISO 8601)&lt;/td&gt;
&lt;td&gt;Auto-converted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIGINT&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;Precision preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DECIMAL&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;Precision preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;TEXT&lt;/td&gt;
&lt;td&gt;Serialized JSON string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BLOB&lt;/td&gt;
&lt;td&gt;BLOB&lt;/td&gt;
&lt;td&gt;Binary preserved&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Resuming after a failure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;zin migrate-to-d1 &lt;span class="nt"&gt;--resume&lt;/span&gt; &lt;span class="nt"&gt;--migration-id&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checkpoints are stored in &lt;code&gt;.wrangler/state/v3/migrations/&lt;/code&gt; — only unprocessed rows are re-migrated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 npm: &lt;a href="https://www.npmjs.com/package/@zintrust/d1-migrator" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@zintrust/d1-migrator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 Issues: &lt;a href="https://github.com/ZinTrust/zintrust/issues" rel="noopener noreferrer"&gt;https://github.com/ZinTrust/zintrust/issues&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. Part of the &lt;a href="https://www.npmjs.com/package/@zintrust/core" rel="noopener noreferrer"&gt;ZinTrust&lt;/a&gt; backend framework ecosystem.&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone migrating production databases to D1 — especially edge cases with unusual schemas or large datasets. 👇&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>database</category>
      <category>opensource</category>
      <category>cloudflarechallenge</category>
    </item>
    <item>
      <title>D1 Remote Modes: How Cloudflare D1 Balances Security and DX</title>
      <dc:creator>zintrust Zin</dc:creator>
      <pubDate>Mon, 02 Mar 2026 15:49:38 +0000</pubDate>
      <link>https://dev.to/zintrustjs/d1-remote-modes-how-cloudflare-d1-balances-security-and-dx-4nga</link>
      <guid>https://dev.to/zintrustjs/d1-remote-modes-how-cloudflare-d1-balances-security-and-dx-4nga</guid>
      <description>&lt;p&gt;Ever wondered how to connect securely to Cloudflare D1 while maintaining a good developer experience? The &lt;code&gt;D1RemoteAdapter&lt;/code&gt; implements a clever dual-mode approach that automatically adapts to your environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  🛡️ Registry Mode: Production Security
&lt;/h2&gt;

&lt;p&gt;In production, the adapter uses &lt;strong&gt;registry mode&lt;/strong&gt; - a security-first approach:&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;// No raw SQL ever leaves your application&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;d1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Becomes: POST /zin/d1/statement { statementId: "abc123...", params: [] }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system hashes your SQL and looks it up in a pre-approved allowlist. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero SQL Injection Risk&lt;/strong&gt; at the network level&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Maximum Security&lt;/strong&gt; even with compromised credentials
&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Higher friction&lt;/strong&gt; for query changes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 SQL Mode: Developer Experience
&lt;/h2&gt;

&lt;p&gt;In development, you get &lt;strong&gt;SQL mode&lt;/strong&gt; for maximum flexibility:&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;// Raw SQL sent directly&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&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;d1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM users WHERE id = ?&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;userId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="c1"&gt;// Becomes: POST /zin/d1/query "SELECT * FROM users WHERE id = ?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Zero friction&lt;/strong&gt; - write code, run immediately&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Migration friendly&lt;/strong&gt; - dynamic SQL works perfectly&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Rapid iteration&lt;/strong&gt; - no configuration needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Smart Auto-Detection
&lt;/h2&gt;

&lt;p&gt;The adapter automatically chooses the right mode:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Registry&lt;/td&gt;
&lt;td&gt;Security first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;DX first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test&lt;/td&gt;
&lt;td&gt;SQL&lt;/td&gt;
&lt;td&gt;Flexibility first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🚀 Why This Design Matters
&lt;/h2&gt;

&lt;p&gt;This dual-mode approach solves a real problem: production apps need security, dev apps need flexibility. Instead of forcing you to choose one or the other, you get both automatically.&lt;/p&gt;

&lt;p&gt;The registry mode's allowlist system is particularly clever - it prevents network-level SQL injection while still allowing your application to work normally. Even if attackers steal your API keys, they're limited to queries you've explicitly approved.&lt;/p&gt;

&lt;p&gt;For anyone building production apps with D1, this pattern provides enterprise-grade security without sacrificing developer productivity.&lt;/p&gt;

&lt;h1&gt;
  
  
  Cloudflare #D1 #DatabaseSecurity #NodeJS #TypeScript #WebDev
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>cloudflarechallenge</category>
      <category>typescript</category>
      <category>ai</category>
    </item>
    <item>
      <title>ZinTrust: a TypeScript backend framework for structure without decorators</title>
      <dc:creator>zintrust Zin</dc:creator>
      <pubDate>Wed, 07 Jan 2026 08:22:44 +0000</pubDate>
      <link>https://dev.to/zintrustjs/zintrust-a-typescript-backend-framework-for-structure-without-decorators-198n</link>
      <guid>https://dev.to/zintrustjs/zintrust-a-typescript-backend-framework-for-structure-without-decorators-198n</guid>
      <description>&lt;h2&gt;
  
  
  ZinTrust: structure without the ceremony (and without decorators)
&lt;/h2&gt;

&lt;p&gt;If you’ve built TypeScript APIs for a while, you’ve probably felt the pull in two directions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Super flexible&lt;/strong&gt; stacks where structure can drift over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highly opinionated&lt;/strong&gt; frameworks where decorators/DI patterns can feel heavy (depending on your team).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a middle ground—clear structure, explicit wiring, and a &lt;strong&gt;minimal core&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So I’ve been building &lt;strong&gt;ZinTrust&lt;/strong&gt;: a production-grade TypeScript backend framework with &lt;strong&gt;no Express/Fastify as the core&lt;/strong&gt;, plus adapters you add when you need them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docs: &lt;a href="https://zintrust.com" rel="noopener noreferrer"&gt;https://zintrust.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/ZinTrust/ZinTrust" rel="noopener noreferrer"&gt;https://github.com/ZinTrust/ZinTrust&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;X: &lt;a href="https://x.com/zintrustjs" rel="noopener noreferrer"&gt;https://x.com/zintrustjs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What “minimal core” means (in practice)
&lt;/h2&gt;

&lt;p&gt;For me it’s about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Explicit wiring&lt;/strong&gt; you can trace when debugging.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Composability&lt;/strong&gt; (add what you need; avoid pulling in the world by default).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-first ergonomics&lt;/strong&gt; without leaning on magic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A tiny routing example
&lt;/h2&gt;

&lt;p&gt;Here’s the style of routing / grouping:&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;Router&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;IRouter&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;@zintrust/core&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;function&lt;/span&gt; &lt;span class="nf"&gt;registerRoutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IRouter&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1&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;r&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;Router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;show&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;destroy&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;

&lt;p&gt;If you want to kick the tires quickly:&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 &lt;span class="nt"&gt;-g&lt;/span&gt; @zintrust/core
zin new my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app
zin start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The feedback I want (seriously)
&lt;/h2&gt;

&lt;p&gt;This is the phase where &lt;strong&gt;docs and onboarding&lt;/strong&gt; matter more than “features”. If you try it, I’d love blunt feedback on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where do you get stuck in the quickstart?&lt;/li&gt;
&lt;li&gt;Which concepts feel unclear (routing, structure, ORM, config, etc.)?&lt;/li&gt;
&lt;li&gt;What would make you confident this is production-ready?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Reply here, open an issue, or join the community:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discord: &lt;a href="https://discord.gg/sEU2brHMQd" rel="noopener noreferrer"&gt;https://discord.gg/sEU2brHMQd&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Slack: &lt;a href="https://join.slack.com/t/zintrustjs/shared_invite/zt-3ljhlzn3n-H7jsI1n1bTXKYRu2FSRGag" rel="noopener noreferrer"&gt;https://join.slack.com/t/zintrustjs/shared_invite/zt-3ljhlzn3n-H7jsI1n1bTXKYRu2FSRGag&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  If you only look at one thing
&lt;/h2&gt;

&lt;p&gt;If you only have 2 minutes, check the docs and tell me what’s confusing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zintrust.com" rel="noopener noreferrer"&gt;https://zintrust.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading—and if you try it, thank you even more for the critique.&lt;/p&gt;

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