<?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>Forem: zintrust Zin</title>
    <description>The latest articles on Forem by zintrust Zin (@zintrustjs).</description>
    <link>https://forem.com/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>Forem: zintrust Zin</title>
      <link>https://forem.com/zintrustjs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zintrustjs"/>
    <language>en</language>
    <item>
      <title># Stop Flying Blind: Why Your Next Framework Needs a Built-In Debugger (Meet ZinTrust Trace)</title>
      <dc:creator>zintrust Zin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 07:10:58 +0000</pubDate>
      <link>https://forem.com/zintrustjs/-stop-flying-blind-why-your-next-framework-needs-a-built-in-debugger-meet-zintrust-trace-3lo1</link>
      <guid>https://forem.com/zintrustjs/-stop-flying-blind-why-your-next-framework-needs-a-built-in-debugger-meet-zintrust-trace-3lo1</guid>
      <description>&lt;p&gt;Let’s be honest: back-end debugging can sometimes feel like a dark art. We've all been there—sprinkling &lt;code&gt;console.log()&lt;/code&gt; across five different files, hunting through messy terminal output, or trying to stitch together logs from completely separate external services just to figure out why a single API request taking too long.&lt;/p&gt;

&lt;p&gt;It disrupts your flow, kills your productivity, and makes finding application bugs exhausting.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;ZinTrust Trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ZinTrust Trace is our built-in observability dashboard designed specifically for the ZinTrust framework. It gives you an immediate, beautiful, and deeply integrated view into everything happening inside your application—from database queries and caching to middleware execution and background jobs.&lt;/p&gt;

&lt;p&gt;Looking at the Trace dashboard, you instantly get the full story. Instead of guessing, you can see that a request took 31ms, and exactly how much time was spent in your &lt;code&gt;RateLimit&lt;/code&gt; or &lt;code&gt;XSS&lt;/code&gt; middleware down to the millisecond.&lt;/p&gt;

&lt;p&gt;But why should you care if your MVC framework has an &lt;em&gt;in-built&lt;/em&gt; debugger instead of just plugging in a third-party tool?&lt;/p&gt;

&lt;p&gt;Here are 5 reasons it will completely change the way you code:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Zero Setup, Instant Context
&lt;/h3&gt;

&lt;p&gt;Third-party observability tools are powerful, but they require agents, API keys, complicated configurations, and usually a hit to your budget. With an in-built tool like ZinTrust Trace, you get enterprise-grade visibility right out of the box. Start the server, and immediately see your auth events, exceptions, cache hits, and queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A Truly Holistic View of the Request Lifecycle
&lt;/h3&gt;

&lt;p&gt;External loggers mostly just see raw "text" or isolated network requests. ZinTrust Trace understands your framework's actual architecture. It intuitively knows the difference between a &lt;code&gt;MIDDLEWARE&lt;/code&gt; execution, a background &lt;code&gt;JOB&lt;/code&gt;, a &lt;code&gt;MAIL&lt;/code&gt; dispatch, and an ORM &lt;code&gt;MODEL&lt;/code&gt; event. It groups everything tied to a single request life-cycle, giving you the complete narrative without you having to stitch it together.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Spot Bottlenecks Instantly
&lt;/h3&gt;

&lt;p&gt;Performance issues love to hide in plain sight. Because Trace is natively hooked into the ZinTrust ORM and routing layers, it logs the exact millisecond duration of every step. Whether your &lt;code&gt;auth&lt;/code&gt; middleware took 9ms or a complex SQL query took 100ms, you'll catch sluggish routes and N+1 query problems &lt;em&gt;during&lt;/em&gt; development, long before they affect your users.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Leaner Stack, Fewer Dependencies
&lt;/h3&gt;

&lt;p&gt;Every external tracking agent you bolt onto your app introduces overhead, bloat, and a maintenance tax. Relying on a deeply integrated debugger means your stack stays remarkably lean. Your application runs lighter, and you spend less time wrestling with third-party logging SDKs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Code and Refactor with Absolute Confidence
&lt;/h3&gt;

&lt;p&gt;When you make a large refactoring change, your automated tests only tell you if the final output is correct. ZinTrust Trace tells you if the &lt;em&gt;runtime behavior&lt;/em&gt; is correct. Did that new service class accidentally trigger 15,000 cache reads? Did a queued job fail silently? With Trace running alongside your dev environment, you get instant behavioral feedback, making you a faster, more confident developer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ready to see what your code is really doing?&lt;/strong&gt;&lt;br&gt;
Level up your back-end development experience today with ZinTrust. Clean code, fast execution, and unparalleled visibility—right out of the box.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://zintrust.com" rel="noopener noreferrer"&gt;zintrust.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://zintrust.com/package-trace" rel="noopener noreferrer"&gt;zintrust.com/package-trace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM Package:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@zintrust/trace" rel="noopener noreferrer"&gt;@zintrust/trace&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ZinTrust #WebDevelopment #Backend #TypeScript #Debugging #MVC #WebDev #SoftwareEngineering #DeveloperTools
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>typescript</category>
    </item>
    <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://forem.com/zintrustjs/migrate-mysql-postgres-sqlite-or-sql-server-to-cloudflare-d1-with-checkpoints-and-integrity-pkd</link>
      <guid>https://forem.com/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://forem.com/zintrustjs/d1-remote-modes-how-cloudflare-d1-balances-security-and-dx-4nga</link>
      <guid>https://forem.com/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://forem.com/zintrustjs/zintrust-a-typescript-backend-framework-for-structure-without-decorators-198n</link>
      <guid>https://forem.com/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>
