<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Zerotal Blog</title>
    <link>https://zerotal.dev/blog</link>
    <description>Releases, architecture notes, and the reasoning behind the decisions.</description>
    <language>en</language>
    <atom:link href="https://zerotal.dev/blog/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>The Deploy That Refuses</title>
      <link>https://zerotal.dev/blog/deploys-that-refuse</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/deploys-that-refuse</guid>
      <description>Zerotal 1.5.0 ships bun zt deploy:&lt;env&gt; — a release pipeline ordered so that everything able to refuse runs before anything that mutates. Plus typed route names, a new AI package, and per-component error boundaries and streaming in Flow.</description>
      <category>Announcements</category>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Column That Keeps Its Mouth Shut</title>
      <link>https://zerotal.dev/blog/encrypted-columns</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/encrypted-columns</guid>
      <description>Zerotal 1.4.0 encrypts a column at rest in one word — ciphertext in the database, plaintext on the model, nothing in between that has to know. The interesting part is the three things it refuses to do.</description>
      <category>Announcements</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Two-Factor, Start to Finish, Without Leaving Your Server</title>
      <link>https://zerotal.dev/blog/two-factor-without-the-detour</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/two-factor-without-the-detour</guid>
      <description>Zerotal 1.4.0 draws the enrolment QR code in your own process — TOTP secrets, recovery codes and the scannable image, all without a request leaving the box. The whole setup page is about fifteen lines.</description>
      <category>Announcements</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Small Print of Feeling Fast</title>
      <link>https://zerotal.dev/blog/navigation-that-feels-native</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/navigation-that-feels-native</guid>
      <description>Flow navigates without a reload — but what makes an SPA feel right is the boring browser behaviour it usually throws away. Prefetch on hover, live elements carried across, scroll position that lands where it should, and one word to opt out.</description>
      <category>Flow</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>We Almost Named It `with`</title>
      <link>https://zerotal.dev/blog/we-almost-named-it-with</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/we-almost-named-it-with</guid>
      <description>Zerotal 1.3.0 replaced BaseModelWith(...) with Model.using(...). The interesting part is not the refactor — it is why the obvious name was the wrong one, and what it costs a framework to spend a word.</description>
      <category>Engineering</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Case of the Vanishing @expose</title>
      <link>https://zerotal.dev/blog/the-vanishing-expose</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/the-vanishing-expose</guid>
      <description>A build error insisted an action was not @exposed. It was. The trail led out of the framework, through a fifteen-line repro with no Zerotal code in it, to a decorator defect in the runtime itself — and to how a framework should behave when the ground moves.</description>
      <category>Engineering</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Guide: A Searchable, Sortable, Paginated Table in One Class</title>
      <link>https://zerotal.dev/blog/guide-searchable-table</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/guide-searchable-table</guid>
      <description>Live search, clickable column sorting, numbered pagination, and shareable URLs for all of it — built as a single Flow component, with the two traps this feature always hides called out along the way.</description>
      <category>Guides</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Guide: Build go/ — A Team Link Shortener in One Sitting</title>
      <link>https://zerotal.dev/blog/guide-link-shortener</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/guide-link-shortener</guid>
      <description>A shortener is two apps in one: a redirect that has to be instant, and a UI a human uses all day. Here is the whole thing — model, redirect, dashboard, live click counts, tests — with the three traps that decide whether it survives contact with a team.</description>
      <category>Guides</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Model Is the Only Place the Rule Lives</title>
      <link>https://zerotal.dev/blog/the-model-owns-the-rule</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/the-model-owns-the-rule</guid>
      <description>An ORM&apos;s real job is not writing your SQL — it is being the one place a fact about your data is stated. Zerotal&apos;s ORM guards mass assignment by default, lets a model own its own lookup, rejects illegal state transitions, and tells you about an N+1 before your users do.</description>
      <category>Engineering</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>React, Server-Routed: The SPA That Never Grew an API</title>
      <link>https://zerotal.dev/blog/inertia-the-spa-with-no-api</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/inertia-the-spa-with-no-api</guid>
      <description>Inertia removes the API layer between your controllers and your React or Vue pages. Zerotal implements the full v3 props protocol — partial reloads, deferred props, merged infinite scroll, precognition — so the server keeps deciding what crosses the wire and when.</description>
      <category>Announcements</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Admin Panel&apos;s Second Year</title>
      <link>https://zerotal.dev/blog/the-admin-panels-second-year</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/the-admin-panels-second-year</guid>
      <description>Any admin generator can produce a CRUD table on day one. @zerotal/admin is built for day 400 — the questions that arrive once real people use it daily: who changed this, why can&apos;t they see it, why do my filters vanish every morning, and am I on production right now.</description>
      <category>Announcements</category>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>The Last Upload Helper You Delete</title>
      <link>https://zerotal.dev/blog/media-library</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/media-library</guid>
      <description>@zerotal/media attaches files to models — collections, thumbnails, responsive images, ordering, cleanup — with no migration to write and no native image dependency. One mixin, and the five jobs every uploads feature repeats are done.</description>
      <category>Announcements</category>
      <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Zerotal: Stop Wiring, Start Building</title>
      <link>https://zerotal.dev/blog/introducing-zerotal</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/introducing-zerotal</guid>
      <description>Meet the batteries-included, full-stack framework for Bun that lets you ship faster. No configuration, no build step, no glue code—just one language and a direct path from idea to production.</description>
      <category>Announcements</category>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Flow: One Class Is the Whole Feature</title>
      <link>https://zerotal.dev/blog/flow-server-driven-ui</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/flow-server-driven-ui</guid>
      <description>The reactive frontend without the second codebase. State lives on the server, patches stream over a WebSocket, and the API layer — the endpoints, the store, the types, the loading booleans — simply never exists.</description>
      <category>Flow</category>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Shipping a framework with no build step</title>
      <link>https://zerotal.dev/blog/no-build-step</link>
      <guid isPermaLink="true">https://zerotal.dev/blog/no-build-step</guid>
      <description>Zerotal packages publish TypeScript source, not compiled output. What that buys, what it costs, and why Bun finally makes it a reasonable trade.</description>
      <category>Engineering</category>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
