<?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: Davron Yuldashev</title>
    <description>The latest articles on DEV Community by Davron Yuldashev (@davron_yuldashev_0a91802f).</description>
    <link>https://dev.to/davron_yuldashev_0a91802f</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%2F3823452%2F5396bf1b-c0bf-4cf4-ad48-4a933efd3e8a.jpg</url>
      <title>DEV Community: Davron Yuldashev</title>
      <link>https://dev.to/davron_yuldashev_0a91802f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davron_yuldashev_0a91802f"/>
    <language>en</language>
    <item>
      <title>Bun in 2026: Ship Your Greenfield SaaS, Skip the Migration</title>
      <dc:creator>Davron Yuldashev</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:09:45 +0000</pubDate>
      <link>https://dev.to/davron_yuldashev_0a91802f/bun-in-2026-ship-your-greenfield-saas-skip-the-migration-pp9</link>
      <guid>https://dev.to/davron_yuldashev_0a91802f/bun-in-2026-ship-your-greenfield-saas-skip-the-migration-pp9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Bun is ready to run a greenfield SaaS backend in 2026. Start new projects on Bun 1.3+ with Elysia and Drizzle, and size containers for a bigger memory footprint than Node (oven-sh/bun #17723). Skip migrating a working Node backend: 91% of State of JS respondents still run Node, and migrations capture the least of Bun's upside.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Is Bun ready to run your SaaS backend in 2026? For a greenfield build, yes; for migrating a working Node.js backend, no. Pick Bun on day one of a new project and its advantages cost nothing; drag an existing service onto it and you pay a compatibility long-tail for gains a new codebase collects for free. That split verdict comes from ShipKit, a SaaS boilerplate whose backend runs Elysia on Bun, and it is written for solo developers and technical founders choosing a stack for a new product.&lt;/p&gt;

&lt;p&gt;July 2026 is why the question needs re-asking: Bun announced v1.4, a complete Zig-to-Rust core rewrite executed by parallel Claude agents, still canary-only while stable Bun holds at the Zig-based 1.3.x line, and the runtime's trust debate restarted mid-year. The adoption baseline stayed put through all of it. &lt;a href="https://2024.stateofjs.com/en-US/other-tools/" rel="noopener noreferrer"&gt;State of JS 2024&lt;/a&gt; counts 16% of respondents using Bun while 91% still use Node.js, so the decision in front of you is narrower: should a brand-new backend collect Bun's built-in advantages while the incumbent keeps carrying the legacy apps?&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changed for Bun in 2025 and 2026?
&lt;/h2&gt;

&lt;p&gt;Three dated events reset the question inside twelve months. Bun 1.3 (October 10, 2025) made the runtime batteries-included: PostgreSQL, MySQL and SQLite through Bun.SQL, a built-in Redis client, full-stack Bun.serve() routing. &lt;a href="https://www.anthropic.com/news/anthropic-acquires-bun-as-claude-code-reaches-usd1b-milestone" rel="noopener noreferrer"&gt;The Anthropic acquisition of Bun&lt;/a&gt; (December 3, 2025) kept the runtime MIT-licensed. Bun announced v1.4, the Zig-to-Rust rewrite, on July 8, 2026 (canary-only at launch).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnp8j24ocxr63u547ql9.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftnp8j24ocxr63u547ql9.webp" alt="Timeline of Bun 1.3 in October 2025, the Anthropic acquisition in December 2025 and the Zig-to-Rust v1.4 rewrite announced in July 2026, ending in the greenfield-yes verdict" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bun's twelve decisive months: batteries-included 1.3 in October 2025, the Anthropic acquisition keeping the MIT license in December 2025, and the v1.4 Rust rewrite announced in July 2026, canary-only at launch.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The 2023–2025 objections were specific: no batteries, a single VC-backed company as bus factor, a compatibility story full of workarounds. Bun 1.3 answered the first with 98%+ of Node's N-API tests passing; the acquisition answered the second, with development continuing publicly under MIT. What stays open is trust in the process behind v1.4. One scope note: Bun as a package manager, bundler or test runner is deliberately out of scope here, because those adoption paths are settled and low-risk; the contested bet is the runtime under a production API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you trust Bun after the 11-day AI rewrite?
&lt;/h2&gt;

&lt;p&gt;Can you trust Bun after the rewrite? The announced &lt;a href="https://bun.com/blog/bun-in-rust" rel="noopener noreferrer"&gt;Bun v1.4.0&lt;/a&gt; replaces the Zig core with Rust: a +1,009,272-line diff converting 1,448 Zig files, produced in 11 days by one engineer directing up to 64 parallel Claude agents, at roughly $165,000 in API cost. The verdict hangs on which evidence you weight: the unreviewable process, or the production record since.&lt;/p&gt;

&lt;h3&gt;
  
  
  The case against: a million lines nobody reviewed
&lt;/h3&gt;

&lt;p&gt;Start with the strongest objection, raised in the Hacker News thread where yt-dlp marked its Bun support limited and deprecated:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the Bun maintainers are willing to completely replace their core product over the span of a week, how is anyone supposed to rely on it?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Practitioners in the same thread put the review math plainly: "It's simply not possible for a team that size to review that much code in that little time." Andrew Kelley, creator of Zig, called the result "unreviewed slop"; he is an interested party, since Bun just left his language, and his critique is pointed and personal (he has called Bun's pre-LLM code slop too), which is why the argument deserves the weight, not the tone. The objection lands because its core is true: no human team reviewed a million-line diff in eleven days, and the 19 known regressions v1.4 introduced (and later fixed) prove the test suite did not catch everything.&lt;/p&gt;

&lt;h3&gt;
  
  
  The case for: three weeks in production, and nobody noticed
&lt;/h3&gt;

&lt;p&gt;Bun's own release numbers set the floor, labeled as self-reported: 100% of the test suite passing on all platforms before merge, 128 bugs fixed relative to v1.3.14, a binary about 20% smaller on Linux and Windows, 2–5% faster. The decisive datapoint is the production exposure: the Rust build ran inside Claude Code, a product Anthropic reports at a $1B annualized run rate, for three weeks before anyone publicly noticed. &lt;a href="https://simonwillison.net/2026/Jul/8/rewriting-bun-in-rust/" rel="noopener noreferrer"&gt;Simon Willison&lt;/a&gt;, reviewing the project independently, called it "an extremely sophisticated piece of agentic engineering". The shipped result, in the words of Bun's own release post (self-reported, like the numbers above):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Startup got 10% faster on Linux but otherwise, barely anyone noticed. Boring is good.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbr2lytpuam3db19tl0pv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbr2lytpuam3db19tl0pv.webp" alt="Bun v1.4 Rust rewrite trust evidence: unreviewed million-line diff weighed against three weeks running inside Claude Code" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bun v1.4's trust question weighs an unreviewable 11-day process against three weeks of unnoticed production service inside Claude Code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tests verify behavior; review verifies intent. A million-line diff has the first without the second, which keeps the fear legitimate while draining it of decision weight: what a founder bets on is production exposure over time, and the Rust Bun banked three weeks of it inside a heavily used product before its own announcement. &lt;strong&gt;Pin the runtime like any dependency: lock the Bun version in CI and in your Dockerfile, and take major upgrades as deliberate deploys after the issue tracker has spoken, never on release day.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Will Bun blow past your container's memory limit?
&lt;/h2&gt;

&lt;p&gt;Documented, yes, in &lt;a href="https://github.com/oven-sh/bun/issues/17723" rel="noopener noreferrer"&gt;oven-sh/bun #17723&lt;/a&gt; and #25948. A service holding ~500MB on Node spiked to its ~1.2GB container limit on Bun after a two-line Dockerfile change (#17723, open since February 2025); #25948 (closed as a duplicate in May 2026, not fixed) documented idle growth under Mongoose: RSS creeping from 50MB to 170MB over 12 hours with no traffic.&lt;/p&gt;

&lt;p&gt;The classic first mistake is exactly that swap: FROM node becomes FROM oven/bun on an existing service, memory limits stay untouched, and the change ships because everything works. The service stays responsive, the logs stay clean, and RSS climbs to the ceiling until the platform's OOM killer restarts the container. On Cloud Run, Fly.io or GKE the symptom that surfaces first is usually a rising restart count. The question teams then search, why is my Bun server using so much memory in Docker, has issue numbers for an answer.&lt;/p&gt;

&lt;p&gt;As of July 2026 there is no confirmed root cause and no fix: #17723 stays open, and #25948 was closed as a duplicate rather than resolved. Connection-pool tuning does not stop the idle growth either: one production report set &lt;code&gt;minPoolSize: 0&lt;/code&gt; and &lt;code&gt;maxIdleTimeMS&lt;/code&gt; and the leak continued; another shows process RSS creeping while the JS heap stays flat. Load-test verdicts belong to container RSS measured over hours, never to heap snapshots taken over minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do not copy Node memory limits into a Bun deploy: in the one documented like-for-like case, the same workload hit 2.4× its Node footprint before the container ceiling cut it off, so treat that multiple as a floor, not a measured peak.&lt;/strong&gt; The delta decides real money on memory-priced platforms, which is why it belongs in the greenfield plan instead of a postmortem. Priced in, it is a line item: pick the container size with the delta included, soak-test for a working day, and alert on RSS. A failure mode documented down to the issue number is a manageable one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bun 1.3 replaces the npm picks a Node stack has to maintain
&lt;/h2&gt;

&lt;p&gt;A greenfield Node backend opens with four decisions: a Postgres client, a Redis client, an HTTP framework, a deploy artifact. Bun 1.3 ships all four inside the runtime: Bun.SQL speaks PostgreSQL, MySQL and SQLite, the Redis client is built in, Bun.serve() routes full-stack, and one compile step emits a standalone executable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fts0dbuedthogxpfs39aw.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fts0dbuedthogxpfs39aw.webp" alt="Node stack npm picks pg, ioredis and Express versus Bun 1.3 built-ins Bun.SQL, Redis client, Bun.serve routing and standalone compile" width="720" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Bun 1.3 replaces four third-party stack picks with runtime built-ins: Bun.SQL for PostgreSQL, MySQL and SQLite, a Redis client, Bun.serve() routing and standalone-executable builds.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every third-party pick you skip is an upgrade cadence, a CVE feed and a maintainer risk you skip with it. For a solo developer that arithmetic decides whether the week goes to product code or to the dependency tree.&lt;/p&gt;

&lt;p&gt;Elysia is the framework question the readiness checklists skip. &lt;a href="https://www.techempower.com/benchmarks/#section=data-r22&amp;amp;test=plaintext" rel="noopener noreferrer"&gt;TechEmpower Round 22 plaintext&lt;/a&gt;, run in late 2023 (Round 23 followed in March 2025), puts Elysia on Bun at 2,454,631 requests per second against 113,117 for Express on Node, the origin of Elysia's 21x-faster-than-Express line. Read a benchmark that old honestly: a runtime-plus-framework number on a synthetic workload, so a real SaaS API bound by Postgres and the network will see nothing like 21x. Elysia on Bun is good enough for a production API, and the reason to pick it is fit, not the benchmark: Bun-first design with end-to-end type inference. ShipKit's backend runs on exactly this pairing, Elysia with Drizzle (&lt;a href="https://shipkit.davrapps.dev/en#architecture" rel="noopener noreferrer"&gt;the architecture overview&lt;/a&gt; shows how the monorepo wires them), because those are the picks that survive Bun's compatibility surface without workarounds.&lt;/p&gt;

&lt;h3&gt;
  
  
  Two caveats that ambush you in week two
&lt;/h3&gt;

&lt;p&gt;ORM first. Drizzle runs on Bun; Prisma was the long-standing blocker, and the complaint pattern was old and consistent: "I'd use it if it weren't for my wish to use Prisma on my project" summarized the compatibility long-tail on Hacker News back in 2023, and that long-tail is why Bun still advertises N-API pass rates as a headline metric. Prisma has since closed most of that gap and ships an official Bun guide today; Drizzle stays the pick here because it is the ORM ShipKit ships and tests on this stack. Debugging second. A February 2025 write-up on Bun 1.2.x found &lt;code&gt;bun --inspect&lt;/code&gt; ignored breakpoints unless the process held a port listener (a condition a long-running API meets), with &lt;code&gt;--inspect-brk&lt;/code&gt; and &lt;code&gt;--inspect-wait&lt;/code&gt; failing outright; the live breakpoint issue today is narrower, oven-sh/bun #32591, where the inspector reports a top-level breakpoint before the previous line's declaration has initialised. Both caveats are day-one decisions on a greenfield project: pick your ORM before the first migration, keep log-first debugging as the default until the inspector's remaining edges close, and neither ambushes anyone. Call the general shape &lt;strong&gt;the greenfield asymmetry&lt;/strong&gt; : a constraint you choose around before the first commit costs nothing, while the same constraint discovered under a working backend becomes a migration blocker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you migrate an existing Node backend to Bun?
&lt;/h2&gt;

&lt;p&gt;Rarely. Node.js in 2026 is no slow-moving target: it keeps absorbing Bun's headline advantages, built-in TypeScript execution among them, and 91% of State of JS 2024 respondents still run Node.js. A migration pays Bun's compatibility long-tail to capture gains a greenfield project collects for free.&lt;/p&gt;

&lt;p&gt;The strongest migration story of 2026 arrives with its own correction. Trigger.dev rebuilt Firestarter, its warm-start connection broker, on Bun in March 2026 (&lt;a href="https://trigger.dev/blog/firebun" rel="noopener noreferrer"&gt;"Firebun"&lt;/a&gt;) and reports 5x throughput; the &lt;a href="https://news.ycombinator.com/item?id=47656114" rel="noopener noreferrer"&gt;top Hacker News comments&lt;/a&gt; attribute much of the gain to swapping SQLite and Zod and to optimizations applied only to the Bun version. Both halves belong in your decision: the result is real, and the runtime is only part of the cause. The pattern generalizes, because a migration always bundles a rewrite, and the rewrite is usually where the speed hides.&lt;/p&gt;

&lt;h3&gt;
  
  
  When staying on Node is the right call
&lt;/h3&gt;

&lt;p&gt;Staying on Node is a first-class outcome of this article, and for three concrete readers the correct one: a backend with paying customers and one dependency sitting in Bun's compatibility long-tail; a deploy shaped around AWS Lambda or Vercel functions, where the managed runtimes are Node; a team whose debugging workflow lives in breakpoints and cannot absorb inspector rough edges like #32591. &lt;strong&gt;A working Node backend in 2026 is not a problem to fix.&lt;/strong&gt; The greenfield asymmetry runs the other way for your next product: a new codebase collects the built-ins, the one-file deploys and Elysia's type system at zero migration cost, which is why ShipKit ships its stack greenfield-first, an Elysia-on-Bun backend you start on rather than a migration target you drag a legacy app toward.&lt;/p&gt;

&lt;h2&gt;
  
  
  The expensive part of a greenfield Bun stack is the plumbing
&lt;/h2&gt;

&lt;p&gt;A greenfield-yes verdict answers the runtime question and leaves the costlier half. Auth, billing, an admin panel, i18n, background jobs: that plumbing eats a month between an empty repo and a first paying customer, and ShipKit exists precisely for it. Bun saves you dependency picks; it does not build your OAuth flow.&lt;/p&gt;

&lt;p&gt;ShipKit closes that gap on the exact stack this article endorses: &lt;a href="https://shipkit.davrapps.dev/en#features" rel="noopener noreferrer"&gt;fourteen production subsystems&lt;/a&gt; pre-wired in one Turborepo monorepo, spanning Better Auth (email, OAuth, magic link, RBAC), payments, an admin panel, i18n, background jobs, a webhook worker, feature flags, file storage and observability, across 7 apps, 17 packages and 68 UI components. The greenfield asymmetry is the whole reason the math works: nothing exists yet, so adopting a pre-wired codebase costs zero migration and returns the plumbing month. The price is $149 one-time for full source, unlimited projects and lifetime updates; there is no trial, so price the decision on the source access itself. Before writing the first line of auth code, price those fourteen subsystems against your own hourly rate; that arithmetic is the entire build-vs-buy decision.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next step:&lt;/strong&gt; the verdict was greenfield-on-Bun, so spend the saved month on product instead of plumbing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shipkit.davrapps.dev/en#pricing" rel="noopener noreferrer"&gt;Get ShipKit — $149 one-time&lt;/a&gt; · &lt;a href="https://shipkit.davrapps.dev/en#architecture" rel="noopener noreferrer"&gt;See the architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the Anthropic acquisition mean for Bun's roadmap?
&lt;/h3&gt;

&lt;p&gt;Bun remains MIT-licensed open source, with the team continuing development publicly on GitHub, which retired the 2023–2025 bus-factor objection. The open question is priority: the December 2025 announcement paired the acquisition with Claude Code's growth, so server-runtime features now share a roadmap with agent infrastructure. Watch the release notes; intent shows up there first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Rust build already the default Bun?
&lt;/h3&gt;

&lt;p&gt;Not yet. Bun v1.4.0, announced July 8, 2026, is the Rust rewrite, and it ships only on the canary channel: &lt;code&gt;bun upgrade --canary&lt;/code&gt; installs it, while a plain &lt;code&gt;bun upgrade&lt;/code&gt; still delivers the Zig-based 1.3.x line (v1.3.14 at the time of writing). The Rust port did run inside Claude Code for weeks before the announcement, so its production exposure predates its stable release. Pages calling the build Linux-only are outdated, since the test suite passed on all platforms before merge; canary remains the accurate label until a stable v1.4.0 ships.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should you pick Elysia or Hono for a Bun backend?
&lt;/h3&gt;

&lt;p&gt;Elysia when the backend lives on Bun, Hono when portability matters. Elysia is Bun-first with end-to-end type inference; Hono targets many runtimes, including edge platforms like Cloudflare Workers. A containerized SaaS API committed to Bun gets more from Elysia's type system; a codebase that needs to move between runtimes keeps more options with Hono.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can you run Bun on AWS Lambda or Vercel serverless?
&lt;/h3&gt;

&lt;p&gt;Not on a managed runtime: Lambda and Vercel functions provide Node.js runtimes, and running Bun there means a custom runtime layer or a container image. Bun's natural deployment targets in 2026 are container platforms such as Fly.io, Cloud Run or Railway, where the memory sizing guidance from issue #17723 applies before you set limits.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about Deno for a greenfield backend?
&lt;/h3&gt;

&lt;p&gt;Deno is the third runtime on the same State of JS chart and a legitimate greenfield option: Deno 2 runs npm packages and ships its own toolchain. It optimizes for a different bet, TypeScript-first tooling and its own hosting platform in Deno Deploy, while this article's decision is a containerized Elysia-on-Bun API. If Deno's toolchain or hosting story fits your deploy, evaluate it on the same axes used here: built-ins, npm compatibility and memory behavior in your container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://bun.com/blog/bun-v1.3" rel="noopener noreferrer"&gt;Bun v1.3 release notes — Bun, 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.theregister.com/devops/2026/07/14/zig-creator-calls-buns-claude-rust-rewrite-unreviewed-slop/5270743" rel="noopener noreferrer"&gt;Zig creator calls Bun's Claude Rust rewrite "unreviewed slop" — The Register, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/oven-sh/bun/issues/25948" rel="noopener noreferrer"&gt;Memory leak with Mongoose and Bun, oven-sh/bun #25948 — GitHub, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=48238789" rel="noopener noreferrer"&gt;yt-dlp deprecates Bun support: discussion — Hacker News, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=36824342" rel="noopener noreferrer"&gt;Bun ecosystem-compatibility discussion — Hacker News, 2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/godspowercuche/bun-121-still-cant-replace-node-but-heres-how-i-use-them-together-2286-temp-slug-8115644"&gt;Bun 1.2.0 still can't replace Node, but here's how I use them together — ggondim, dev.to, 2025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://shipkit.davrapps.dev/en/blog/bun-saas-backend-2026" rel="noopener noreferrer"&gt;ShipKit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>bunjs</category>
      <category>elysia</category>
      <category>backend</category>
      <category>node</category>
    </item>
    <item>
      <title>Clerk vs Better Auth in 2026: The Honest Migration Math</title>
      <dc:creator>Davron Yuldashev</dc:creator>
      <pubDate>Fri, 31 Jul 2026 18:00:40 +0000</pubDate>
      <link>https://dev.to/davron_yuldashev_0a91802f/clerk-vs-better-auth-in-2026-the-honest-migration-math-184b</link>
      <guid>https://dev.to/davron_yuldashev_0a91802f/clerk-vs-better-auth-in-2026-the-honest-migration-math-184b</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; The $24,000-a-year Clerk math still circulating is dead. Since Clerk's February 2026 repricing, 50,000 Monthly Retained Users are free and 100K MRU costs about $1,025/mo. Migrate to Better Auth when an operational trigger is live: outage coupling, the 5 req/s rate limit, or webhook-sync drift. Budget about two engineer-weeks on a live product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The decision:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migrate when:&lt;/strong&gt; Clerk outages take your product down, the 5 req/s limit bites, or webhook sync drifts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk:&lt;/strong&gt; bcrypt-to-scrypt hash mismatch locks migrated users out; cutover invalidates every active session&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; live products past 50,000 MRU that already own their user database&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Migrating Clerk to Better Auth at month nine is a decision most teams price with numbers that died in February 2026. Correct the numbers and the verdict flips: below Clerk's free 50,000 MRU, stay unless an operational failure is pushing you out; past it, the migration pays back within months. Here is the corrected math, from ShipKit, a SaaS boilerplate that ships Better Auth pre-wired.&lt;/p&gt;

&lt;p&gt;Clerk's February 2026 changelog raised the free tier from 10,000 MAU to 50,000 Monthly Retained Users, so 100K MRU now bills at about $1,025 a month, not the $2,025 the stale calculators still report. For a developer building the team's migration case, the first mistake is copying the SERP's $24k-a-year figure into the proposal: the number dies the moment anyone opens Clerk's pricing page, and the proposal's credibility dies with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Clerk actually cost in 2026?
&lt;/h2&gt;

&lt;p&gt;Clerk's Pro plan is $25/mo with 50,000 Monthly Retained Users free; overage runs $0.02 per MRU from 50,001 to 100,000, then $0.018 up to one million, with lower rates past that, per Clerk's pricing page. &lt;strong&gt;At 100K MRU the bill is about $1,025/mo, around $12,300 a year&lt;/strong&gt; , and the B2B organizations add-on puts another $100/mo on top.&lt;/p&gt;

&lt;p&gt;Three worked scenarios on the current price sheet, before infrastructure or support tiers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Arithmetic&lt;/th&gt;
&lt;th&gt;Monthly bill&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;40,000 MRU&lt;/td&gt;
&lt;td&gt;inside the free allotment, Pro base only&lt;/td&gt;
&lt;td&gt;$25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,000 MRU&lt;/td&gt;
&lt;td&gt;$25 + 50,000 × $0.02&lt;/td&gt;
&lt;td&gt;~$1,025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100,000 MRU + organizations&lt;/td&gt;
&lt;td&gt;$1,025 + $100 B2B add-on&lt;/td&gt;
&lt;td&gt;~$1,125&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What does Clerk cost per plan in 2026?
&lt;/h3&gt;

&lt;p&gt;Four plans, and the free allowance is the same on three of them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Base price&lt;/th&gt;
&lt;th&gt;MRUs included&lt;/th&gt;
&lt;th&gt;Dashboard seats&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hobby&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;50,000 limit per app&lt;/td&gt;
&lt;td&gt;up to 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;$25/mo ($20 billed annually)&lt;/td&gt;
&lt;td&gt;50,000 included per app&lt;/td&gt;
&lt;td&gt;up to 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$300/mo ($250 billed annually)&lt;/td&gt;
&lt;td&gt;50,000 included per app&lt;/td&gt;
&lt;td&gt;10, then $20 each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;custom, annual only&lt;/td&gt;
&lt;td&gt;custom&lt;/td&gt;
&lt;td&gt;custom&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note the word that changes: Hobby's 50,000 is a &lt;strong&gt;limit&lt;/strong&gt;, Pro's and Business's is an &lt;strong&gt;allowance&lt;/strong&gt;. Cross it on Hobby and Clerk requires the upgrade; cross it on Pro and it meters. Overage runs $0.02 per MRU to 100,000, $0.018 to a million, $0.015 to ten million, $0.012 beyond.&lt;/p&gt;

&lt;p&gt;Two lines people miss when they price this. Organizations are billed separately: 100 monthly retained organizations are included per app, and past that Clerk requires the B2B Authentication add-on at $100/mo ($85 annually) — that is a required add-on, not a per-org overage rate. And Clerk's "First Day Free" rule means a user who signs up and never returns is never billed: retention starts 24 hours after signup.&lt;/p&gt;

&lt;h3&gt;
  
  
  MRU is not MAU, and the difference lowers your bill
&lt;/h3&gt;

&lt;p&gt;A Monthly Retained User is a user who comes back 24 hours or more after signing up; Clerk does not bill drive-by signups that bounce. Billable MRU therefore sits below raw MAU, so every calculator that reasons in MAU overstates the Clerk column. Clerk raised the free allotment from 10,000 to 50,000 MRU on 2026-02-05 and folded most of the Enhanced Authentication add-on into Pro. Before that change, 10,000 free users at $0.02 each put 100K MAU at $1,825–$2,025/mo, the origin of the $24,000-a-year gap the SERP still quotes. Get the unit and the date right: the whole decision is a delta between this bill and engineer time, and a 2× error in the bill propagates downstream.&lt;/p&gt;

&lt;p&gt;One scope cut, made on purpose: what follows does not re-walk the official export tutorial; the Better Auth guide owns those mechanics. The money, the cutover, and the two lockout traps the guide leaves out are the rest of this page.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does "upgrading Clerk" actually involve?
&lt;/h2&gt;

&lt;p&gt;Two different jobs share the word, and only one of them is about money.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrading the plan
&lt;/h3&gt;

&lt;p&gt;Hobby is capped rather than metered: "Applications on the Hobby plan are limited to free tier usage. To use beyond the free tier limits, you must upgrade to the Pro plan." Cross 50,000 MRU and Clerk gives you a one-month grace period so the app keeps working while you move. Two other triggers force a plan change regardless of user count: a fourth dashboard seat requires Business, and enhanced dashboard roles beyond Owner and Viewer are Business-only.&lt;/p&gt;

&lt;p&gt;Upgrading does not cost you the free allowance — 50,000 MRU is included on Pro and Business alike, so the bill starts at overage, not at zero. There is no traditional free trial; Clerk's stated substitute is the development instance, which is free and unlimited in features but capped at 100 users.&lt;/p&gt;

&lt;p&gt;One trap worth naming, because it is the first search result for "clerk upgrade mid-cycle": Clerk's documentation that upgrades "take effect immediately, while downgrades take effect at the end of the current billing cycle" belongs to &lt;strong&gt;Clerk Billing&lt;/strong&gt;, the feature for charging &lt;em&gt;your&lt;/em&gt; users. It says nothing about your own workspace plan. Same for the proration language, which appears only in the seat-based-billing docs. Clerk publishes no proration rule for its own plans; the pricing page just carries "Upgrade to Pro plan" buttons.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrading the SDK
&lt;/h3&gt;

&lt;p&gt;The current major is Core 3, shipped 2026-03-03 as &lt;code&gt;@clerk/nextjs&lt;/code&gt; v7 (7.7.1 as of 2026-08-08). Clerk runs a roughly six-month major cycle and keeps the previous major in long-term support for a year, so Core 2 is patched until January 2027 and the v6 line still gets releases.&lt;/p&gt;

&lt;p&gt;Do not hand-edit the migration. Clerk ships a codemod that does AST-level transforms and catches re-exports, aliased imports and monorepo files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @clerk/upgrade       &lt;span class="c"&gt;# package-lock.json or no lockfile&lt;/span&gt;
bunx @clerk/upgrade      &lt;span class="c"&gt;# bun.lockb / bun.lock&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Core 3 breaks in a Next.js app, in the order it will bite you: &lt;code&gt;SignedIn&lt;/code&gt;, &lt;code&gt;SignedOut&lt;/code&gt; and &lt;code&gt;Protect&lt;/code&gt; collapse into a single &lt;code&gt;Show&lt;/code&gt; component; &lt;code&gt;&amp;lt;ClerkProvider&amp;gt;&lt;/code&gt; moves inside &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; instead of wrapping &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;; passing &lt;code&gt;secretKey&lt;/code&gt; to &lt;code&gt;clerkMiddleware()&lt;/code&gt; now also requires &lt;code&gt;CLERK_ENCRYPTION_KEY&lt;/code&gt;; the Next.js floor rises to 15.2.3; and &lt;code&gt;auth.protect()&lt;/code&gt; returns 401 rather than 404 for unauthenticated server actions. Packages were renamed too (&lt;code&gt;@clerk/clerk-react&lt;/code&gt; to &lt;code&gt;@clerk/react&lt;/code&gt;), and the old redirect props are gone in favour of the fallback ones.&lt;/p&gt;

&lt;p&gt;Budget this against the migration bill above. A Core upgrade every six months is not free either — it is the recurring cost of the managed option, and it is the honest column to compare against maintaining your own auth.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually pushes teams off Clerk at month nine?
&lt;/h2&gt;

&lt;p&gt;Under the 2026 free tier a typical month-nine product pays Clerk $0, so the real triggers are operational. Val Town left after outages that took their whole site down, a production rate limit of five requests per second across the entire account, and webhook-sync workarounds that split user data between two systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Clerk went down pretty often, and went down for long periods of time... if Clerk goes down, the whole website goes down.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tom MacWright's Val Town writeup pairs that outage coupling with a subtler production trap: Clerk's loadUser endpoint ran fine in development, then throttled at “five requests per second. For the whole account, across all users.” &lt;strong&gt;If auth going down takes your product down, no free tier offsets that risk.&lt;/strong&gt; Val Town moved sessions into their own database through a two-week dual-cookie cutover, covered below, and their verdict after the move was “so far it really has been better”: user auth no longer depends on a third party staying online.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Filwz2koxgoaorg5ksb82.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Filwz2koxgoaorg5ksb82.webp" alt="Month-nine Clerk migration triggers: outage coupling, 5 req/s account-wide rate limit, webhook user-sync drift" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three operational triggers moved Val Town off Clerk: repeated outages that took the whole site down, a 5 req/s account-wide rate limit, and webhook user-sync drift.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why can't migrated users sign in after the export?
&lt;/h2&gt;

&lt;p&gt;Clerk exports password digests hashed with bcrypt; Better Auth hashes with scrypt by default. Run the export without a custom hash/verify pair and every migrated password fails verification: the user rows exist, sign-in returns invalid credentials. Configuring Better Auth to verify bcrypt digests is the fix, and the official migration guide buries it mid-tutorial.&lt;/p&gt;

&lt;p&gt;bcrypt and scrypt are both password-hashing algorithms, and their digests are incompatible: a hash written by one cannot be verified by the other's default path. The config that prevents the lockout fits in a dozen lines:&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;betterAuth&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="s2"&gt;better-auth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bcrypt&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;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;betterAuth&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;emailAndPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;enabled&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;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Clerk exports bcrypt digests; Better Auth defaults to scrypt.&lt;/span&gt;
      &lt;span class="c1"&gt;// Skip this verify pair and every migrated password fails silently:&lt;/span&gt;
      &lt;span class="c1"&gt;// the user row exists, sign-in returns "invalid credentials".&lt;/span&gt;
      &lt;span class="na"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;bcrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hash&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The organizations gap
&lt;/h3&gt;

&lt;p&gt;Clerk organizations sit outside the automated migration script; the guide's full guidance is that moving them “should be possible with additional steps” and the Organization Plugin. The teams hit hardest are the ones paying the $100/mo B2B add-on: the users most motivated to leave face the least-documented part of leaving. Budget organization and membership mapping as its own line item rather than a footnote.&lt;/p&gt;

&lt;p&gt;The hash mismatch says nothing about which framework is better. What it decides is whether cutover day ends with a support queue full of locked-out users. ShipKit's monorepo makes the greenfield version of that decision for you: Better Auth arrives with email, OAuth, magic link and RBAC already configured, which leaves one fewer place for a month-nine surprise to hide.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you migrate Clerk users from development to production?
&lt;/h2&gt;

&lt;p&gt;You do not. Clerk's own migration guide opens with the sentence flat: "You cannot migrate users from your Development instance to your Production instance." The instances do not share data at all, and development is capped at 100 users, so what you are really asking is how to &lt;em&gt;recreate&lt;/em&gt; them.&lt;/p&gt;

&lt;p&gt;The supported path is the &lt;code&gt;CreateUser&lt;/code&gt; Backend API endpoint. Passwords survive if you send the hash rather than the plaintext: &lt;code&gt;password_digest&lt;/code&gt; plus &lt;code&gt;password_hasher&lt;/code&gt;, where the hasher is one of bcrypt, argon2i, argon2id, the pbkdf2 family, scrypt_firebase, scrypt_werkzeug and a dozen others. Hashers Clerk considers insecure — md5, md5_salted, sha256, sha256_salted, sha512_symfony — are transparently re-hashed to bcrypt the first time that user signs in successfully. For bulk work Clerk publishes an open-source importer, &lt;code&gt;clerk/migration-tool&lt;/code&gt;, which takes JSON or CSV and respects the rate limits (1,000 requests per 10 seconds on a production key, 100 on a development one).&lt;/p&gt;

&lt;p&gt;Keep the old identifiers. Clerk's recommended pattern is to store them as &lt;code&gt;external_id&lt;/code&gt; and surface them in the session token, which is the difference between a clean cutover and a week of reconciling foreign keys.&lt;/p&gt;

&lt;p&gt;What else fails to carry over, in the order it breaks a deploy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth credentials.&lt;/strong&gt; Development uses Clerk's shared credentials for most social providers. Production requires your own, per provider.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSO connections, Integrations and Paths.&lt;/strong&gt; Clerk names exactly these three as excluded when you clone development settings into the new instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain and DNS.&lt;/strong&gt; Production needs a domain you own plus new DNS records, and propagation can take up to 48 hours. Plan the cutover around that, not the code freeze.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks.&lt;/strong&gt; New endpoint URL, new signing secret, created fresh in the production instance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keys.&lt;/strong&gt; &lt;code&gt;pk_test_&lt;/code&gt;/&lt;code&gt;sk_test_&lt;/code&gt; become &lt;code&gt;pk_live_&lt;/code&gt;/&lt;code&gt;sk_live_&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sessions.&lt;/strong&gt; Development uses a &lt;code&gt;__clerk_db_jwt&lt;/code&gt; "dev browser" object; production uses the &lt;code&gt;__client&lt;/code&gt; cookie. A development session means nothing in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is also no staging instance: Clerk offers Development and Production only, and its documented workaround is a separate Clerk application on a separate domain — which, by the same rule, cannot share production's users either.&lt;/p&gt;

&lt;p&gt;Notice what this exercise proves before any migration is on the table. If your users only exist inside a vendor and cannot be moved between that vendor's own environments, the export question is not hypothetical; you have already met it. That is the cheapest possible moment to decide whether you want to own the user table.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you cut over without logging every user out?
&lt;/h2&gt;

&lt;p&gt;Better Auth's guide prices session invalidation in one sentence: “This migration will invalidate all active sessions.” Val Town answered it with a &lt;strong&gt;dual-cookie cutover&lt;/strong&gt; : for two weeks every auth endpoint accepted either a Clerk session cookie or a Better Auth one, so users rolled over as they signed in.&lt;/p&gt;

&lt;p&gt;The wrong first move is running the export against production as-is. A big-bang cutover works in the tutorial because the tutorial has no live sessions; on a nine-month-old product it forces every user to re-authenticate at once, and if the bcrypt config above is missing, a share of them cannot.&lt;/p&gt;

&lt;p&gt;The dual-cookie cutover keeps both verification paths live behind a flag: existing Clerk sessions verify against the old path while new sign-ins issue Better Auth sessions in your own database. Rollback stays one flag-flip away until the overlap window closes, and the overlap doubles as a live test of the new session shape under real traffic. When the last Clerk cookies age out, remove the old path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxw5q11bainiycwvvzfpi.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxw5q11bainiycwvvzfpi.webp" alt="Dual-cookie cutover timeline: two-week overlap accepting Clerk and Better Auth session cookies, then Better Auth only, then Clerk path removed" width="720" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Val Town's dual-cookie cutover: a two-week overlap in which every auth endpoint accepts either session cookie, so users roll over without a forced logout.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The itemized migration bill: two engineer-weeks in real currency
&lt;/h2&gt;

&lt;p&gt;Plan for about two engineer-weeks on a live product — an estimate with stated assumptions, itemized below rather than asserted. &lt;strong&gt;At a loaded $75/hour, 80 hours is $6,000&lt;/strong&gt; of engineering time. The bill splits into five workstreams; two of them are the lines every estimate misses.&lt;/p&gt;

&lt;p&gt;Assumptions for the table: one product, Postgres already in place, hours priced at a loaded $75/hour:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workstream&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;th&gt;Estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Export and schema mapping&lt;/td&gt;
&lt;td&gt;user export, table mapping, bcrypt digest import&lt;/td&gt;
&lt;td&gt;12–16 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth config and re-testing&lt;/td&gt;
&lt;td&gt;bcrypt verify pair, sign-in/sign-up flows, 2FA plugin&lt;/td&gt;
&lt;td&gt;12–16 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dual-cookie middleware&lt;/td&gt;
&lt;td&gt;parallel session acceptance, feature flag, rollback path&lt;/td&gt;
&lt;td&gt;8–12 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI rebuild&lt;/td&gt;
&lt;td&gt;replacing Clerk's prebuilt sign-in, profile and org-switcher components&lt;/td&gt;
&lt;td&gt;16–24 h&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhook-sync teardown&lt;/td&gt;
&lt;td&gt;removing sync endpoints, reconciling the duplicate user table&lt;/td&gt;
&lt;td&gt;8–16 h&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two scenarios on the same $75/hour assumption: a product with no webhook sync and no organizations lands near the bottom of the ranges, about 56 hours ($4,200); a B2B product with both lands past the top, about 104 hours ($7,800), because the organization mapping is manual.&lt;/p&gt;

&lt;h3&gt;
  
  
  The line items nobody prices
&lt;/h3&gt;

&lt;p&gt;Teams that followed Clerk's recommended pattern for using their own database keep user data in sync via webhooks, and leaving means unwinding two sources of truth: sync endpoints removed, the duplicate user table reconciled row by row. The recovered line is local dev: openstatus migrated partly because contributors needed an ngrok tunnel just to log in locally, and after the move auth runs offline like the rest of the stack. Payback math stays short: against a $0 Clerk bill this never pays back in cash; against $1,025/mo it pays back inside six months. Every row above is also a build-vs-buy datapoint: ShipKit sells the pre-wired version of this work for &lt;a href="https://shipkit.davrapps.dev/en#pricing" rel="noopener noreferrer"&gt;$149 one-time&lt;/a&gt; with unlimited projects, less than the cheapest single row of the table at the same hourly rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  When staying on Clerk is the right call
&lt;/h2&gt;

&lt;p&gt;Below 50,000 MRU your Clerk bill is $0, and $6,000 of engineering time cannot pay back against a free product. openstatus, a team that migrated off Clerk, still calls it “an amazing product — the documentation is clear, the setup straightforward.” Staying makes sense if none of the operational triggers are live.&lt;/p&gt;

&lt;p&gt;The boundary is a trigger list rather than a calendar: if outage coupling has not bitten, the 5 req/s limit has not throttled you, and you resisted the webhook-sync pattern, Clerk is doing its job and the two engineer-weeks buy more elsewhere. Revisit when an incident lands or MRU crosses the paid tier, and take the export then, with openstatus's migration notes and the playbook above in hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What if the next project never books this migration?
&lt;/h2&gt;

&lt;p&gt;The job at month nine is the same as at month one: reach paying customers without burning weeks on auth plumbing. The cheapest Clerk migration is the one the next project never books, and that choice happens at repo-init: ShipKit ships Better Auth pre-wired, with email, OAuth, magic link and RBAC, inside a monorepo of 14 production subsystems.&lt;/p&gt;

&lt;p&gt;The full inventory runs from payments and admin panel to i18n, background jobs and a webhook worker, spread across 7 apps, 16 packages and 68 UI components; nine production apps have shipped on this codebase already. At $149 one-time with lifetime updates and unlimited projects, the license costs less than two hours of the migration priced above. The three paths, priced on this article's own numbers:&lt;/p&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;Stay on Clerk&lt;/th&gt;
&lt;th&gt;Migrate at month nine&lt;/th&gt;
&lt;th&gt;Greenfield on ShipKit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upfront cost&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;~$4,200–$7,800 in engineer time&lt;/td&gt;
&lt;td&gt;$149 one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly at 100K MRU&lt;/td&gt;
&lt;td&gt;~$1,025&lt;/td&gt;
&lt;td&gt;your hosting only&lt;/td&gt;
&lt;td&gt;your hosting only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sessions live in&lt;/td&gt;
&lt;td&gt;Clerk's cloud&lt;/td&gt;
&lt;td&gt;your database&lt;/td&gt;
&lt;td&gt;your database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth work on day one&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;two engineer-weeks&lt;/td&gt;
&lt;td&gt;pre-wired: email, OAuth, magic link, RBAC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before writing the first migration line, price the 14 subsystems against your own hourly rate: ShipKit's &lt;a href="https://shipkit.davrapps.dev/en#features" rel="noopener noreferrer"&gt;feature list&lt;/a&gt; reads as this article's pricing table with every row already built into the architecture.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Next step:&lt;/strong&gt; Two engineer-weeks is the price of leaving Clerk late; $149 is the price of a stack where the job is already done. Price both against your own rate before the next repo-init.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shipkit.davrapps.dev/en#pricing" rel="noopener noreferrer"&gt;Get ShipKit — $149 one-time&lt;/a&gt; · &lt;a href="https://shipkit.davrapps.dev/en#architecture" rel="noopener noreferrer"&gt;See the architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Better Auth production-ready in 2026 now that it joined Vercel?
&lt;/h3&gt;

&lt;p&gt;Better Auth joined Vercel in July 2026 with a stated commitment to staying open source and framework-agnostic, and the project sits at 29.4k GitHub stars with 2.7k forks as of July 2026. LobeHub already documents a Clerk-to-Better-Auth path for its own self-hosters. The skeptical view exists too: one Hacker News commenter argues that delegating your database schema to an auth framework suits “throwaway projects and companies with low quality technical vision.” Weigh that thread against Val Town running Better Auth in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happened to Auth.js (NextAuth)?
&lt;/h3&gt;

&lt;p&gt;The Better Auth team has maintained Auth.js since September 2025, and the merger announcement recommends new projects start on Better Auth. Consolidation puts the two largest open-source JavaScript auth libraries under one roof, and it makes a 2024 Clerk-to-NextAuth migration like openstatus's the direct ancestor of today's path.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we migrate incrementally instead of a big-bang export?
&lt;/h3&gt;

&lt;p&gt;openstatus ran a lazy migration: extend the existing users table with the new adapter fields, override getUser and createUser, and re-link OAuth accounts on next login via allowDangerousEmailAccountLinking. Users migrate as they show up. The trade-off is an overlap window longer than the two-week dual-cookie cutover, with both systems live for the duration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Better Auth support 2FA and multi-tenant organizations?
&lt;/h3&gt;

&lt;p&gt;Both ship as plugins, and the repository describes multi-tenant support as a first-class path. Clerk organizations still need manual mapping on the way out, because the export script does not carry them across.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I lose the free 50,000 users when I upgrade to Pro?
&lt;/h3&gt;

&lt;p&gt;No. The 50,000 MRU allowance is included on Hobby, Pro and Business alike, so a Pro bill starts at $25 plus overage above 50,000, not at $25 plus everything. What upgrading changes is the consequence of crossing the line: on Hobby it is a hard stop with a one-month grace period, on Pro it is metered at $0.02 per MRU.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://clerk.com/pricing" rel="noopener noreferrer"&gt;Clerk pricing — Clerk, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/changelog/2026-02-05-new-plans-more-value" rel="noopener noreferrer"&gt;New plans, more value — Clerk changelog, February 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://better-auth.com/docs/guides/clerk-migration-guide" rel="noopener noreferrer"&gt;Clerk migration guide — Better Auth docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.val.town/better-auth" rel="noopener noreferrer"&gt;From Clerk to Better Auth — Val Town blog (Tom MacWright), 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.openstatus.dev/blog/migration-auth-clerk-to-next-auth" rel="noopener noreferrer"&gt;Migrating from Clerk to NextAuth — openstatus, 2024&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/better-auth/better-auth" rel="noopener noreferrer"&gt;Better Auth repository — GitHub, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://better-auth.com/blog/authjs-joins-better-auth" rel="noopener noreferrer"&gt;Auth.js joins Better Auth — Better Auth blog, 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://better-auth.com/blog/better-auth-joins-vercel" rel="noopener noreferrer"&gt;Better Auth joins Vercel — Better Auth blog, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://news.ycombinator.com/item?id=45389293" rel="noopener noreferrer"&gt;Discussion of the Auth.js merger — Hacker News, 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/thiago_alvarez_a7561753aa/clerk-vs-better-auth-2026-we-verified-every-price-so-you-dont-have-to-13pk"&gt;Clerk vs Better Auth price check (pre-repricing figures) — dev.to, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lobehub.com/docs/self-hosting/migration/v2/auth/clerk-to-betterauth" rel="noopener noreferrer"&gt;Clerk to Better Auth self-hosting migration — LobeHub docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/guides/development/managing-environments" rel="noopener noreferrer"&gt;Managing environments — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/guides/development/migrating/overview" rel="noopener noreferrer"&gt;Migrating users to Clerk — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/guides/development/deployment/production" rel="noopener noreferrer"&gt;Deploying to production — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/reference/backend/user/create-user" rel="noopener noreferrer"&gt;CreateUser Backend API reference — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/guides/how-clerk-works/system-limits" rel="noopener noreferrer"&gt;Rate limits and system limits — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/upgrade-guides/core-3" rel="noopener noreferrer"&gt;Upgrading to Clerk Core 3 — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://clerk.com/docs/upgrading/versioning" rel="noopener noreferrer"&gt;SDK versioning and LTS policy — Clerk docs, 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://shipkit.davrapps.dev/en/blog/clerk-to-better-auth-migration" rel="noopener noreferrer"&gt;ShipKit blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>betterauth</category>
      <category>clerk</category>
      <category>migration</category>
      <category>authentication</category>
    </item>
    <item>
      <title>Four agents, 77 projects, 90 minutes: the multi-agent Claude Code pattern I run in production</title>
      <dc:creator>Davron Yuldashev</dc:creator>
      <pubDate>Fri, 29 May 2026 12:03:02 +0000</pubDate>
      <link>https://dev.to/davron_yuldashev_0a91802f/four-agents-77-projects-90-minutes-the-multi-agent-claude-code-pattern-i-run-in-production-9pc</link>
      <guid>https://dev.to/davron_yuldashev_0a91802f/four-agents-77-projects-90-minutes-the-multi-agent-claude-code-pattern-i-run-in-production-9pc</guid>
      <description>&lt;p&gt;Last Tuesday I sat down to audit every dev project I'd written over the past few years. 77 of them. Old courier-logistics monorepos, abandoned starters, a clinical reasoning engine, half a dozen Telegram bots, a SaaS framework I keep reusing, two startups, a Rust process manager. Different stacks, different ages, different employers, different states of git hygiene.&lt;/p&gt;

&lt;p&gt;I gave the job to four Claude Code agents working in parallel. They were done in about 90 minutes.&lt;/p&gt;

&lt;p&gt;Below is the pattern they used, and why a version of it now runs inside a 2,200-commit production codebase at my day job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one agent isn't enough
&lt;/h2&gt;

&lt;p&gt;Single-agent Claude Code is fine until you hit one of three walls.&lt;/p&gt;

&lt;p&gt;The context window starts choking on a big codebase. The work is wider than it is deep, and serial reading wastes wall-clock. You want the orchestrator to keep judgment, not get buried in file diffs.&lt;/p&gt;

&lt;p&gt;A swarm fixes all three. Each agent gets a slice. The lead keeps the map.&lt;/p&gt;

&lt;p&gt;The hard part isn't spawning agents. Spawning is one tool call. The hard part is making sure four of them don't trip over each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;Claude Code ships with two primitives that, combined, give you a clean swarm.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;TeamCreate&lt;/code&gt; + named teammates.&lt;/strong&gt; Each agent has a stable name (&lt;code&gt;analyst1&lt;/code&gt;, &lt;code&gt;designer&lt;/code&gt;, &lt;code&gt;metrics&lt;/code&gt;) and joins a team with a shared task list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;SendMessage&lt;/code&gt; to coordinate.&lt;/strong&gt; The lead addresses any teammate by name. Teammates idle between turns and wake when messaged.&lt;/p&gt;

&lt;p&gt;Wire those to a &lt;code&gt;TaskList&lt;/code&gt; and you have a coordination plane. Each task carries an &lt;code&gt;owner&lt;/code&gt; field. Setting &lt;code&gt;owner = analyst3&lt;/code&gt; is your atomic lock. Until that field changes, the task belongs to that agent.&lt;/p&gt;

&lt;p&gt;For the audit I made 77 tasks, one per project. I spawned four &lt;code&gt;analyst&lt;/code&gt; teammates with the same prompt template: read the project at code level (not commit messages), parse Claude Code session transcripts if any exist, write a per-project dossier. Then let them loose.&lt;/p&gt;

&lt;h2&gt;
  
  
  The race condition I shipped on day one
&lt;/h2&gt;

&lt;p&gt;First attempt: each teammate, on idle, runs &lt;code&gt;TaskList&lt;/code&gt;, finds the lowest-ID task with no owner, claims it, does it, marks it complete, repeats.&lt;/p&gt;

&lt;p&gt;That worked for the first ten minutes. Then two analysts grabbed the same task within the same second. The &lt;code&gt;TaskUpdate&lt;/code&gt; that set the owner went through twice. Both did the work. The second one overwrote the first dossier with a slightly different version of the same content.&lt;/p&gt;

&lt;p&gt;Classic optimistic-concurrency mistake. The fix is boring and reliable: stop racing for low-ID tasks. The lead pre-assigns owners on the entire remaining range before spinning the swarm back up.&lt;/p&gt;

&lt;p&gt;I partitioned the remaining work into four contiguous blocks (&lt;code&gt;#33–43&lt;/code&gt;, &lt;code&gt;#46–56&lt;/code&gt;, &lt;code&gt;#57–67&lt;/code&gt;, &lt;code&gt;#68–77&lt;/code&gt;) and set every owner in advance. Now when any agent reads the list, every task is already claimed by someone. Nothing left to race for. Each agent processes its own block in ID order and reports back when the block is empty.&lt;/p&gt;

&lt;p&gt;Zero collisions for the rest of the run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came out
&lt;/h2&gt;

&lt;p&gt;Sixty dossier files. Twenty-two tagged &lt;code&gt;showcase&lt;/code&gt;, thirty-eight &lt;code&gt;supporting&lt;/code&gt;, seventeen &lt;code&gt;skip&lt;/code&gt;. The skips were honest: client work where my commit share was under 10%, abandoned scaffolds, empty stubs. Bad data is worse than no data when the goal is a personal-brand audit.&lt;/p&gt;

&lt;p&gt;The interesting findings weren't in the headline projects. They were in the cross-cuts. My boilerplate had quietly become the foundation under four products. The same codebase showed up in five different clients. On one healthcare CRM my commits totalled 962 out of 2,208 (top contributor), even though the surface-level metadata I'd been relying on said only about 700. Manual git history is lossy. A swarm with shared output catches the drift.&lt;/p&gt;

&lt;h2&gt;
  
  
  The production version
&lt;/h2&gt;

&lt;p&gt;This isn't a hobby pattern. The same multi-agent Claude Code workflow runs in our healthcare CRM at the day job, on a 2,200-commit codebase. The &lt;code&gt;CLAUDE.md&lt;/code&gt; there defines four custom subagents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;django-backend-specialist&lt;/code&gt; — owns models, views, URLs.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;advertiser-frontend-developer&lt;/code&gt; — owns the advertiser dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;patient-frontend-specialist&lt;/code&gt; — owns the patient portal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;linting-specialist&lt;/code&gt; — runs last, owns the diff.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's an explicit inter-agent contract. When the backend changes a view, it reports the new endpoint, the URL, the response shape. The frontends know to ask for that data before they start. Linting runs at the end of the chain, not the middle. The orchestrator (me) holds the architecture. The agents hold the file diffs.&lt;/p&gt;

&lt;p&gt;On one of the products I ship with this pattern, an internal-tools rebuild, about 29% of the commits are AI-authored under my direction. The other 71% are mine. The split is visible in &lt;code&gt;git shortlog&lt;/code&gt;. Nothing to hide, nothing to inflate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;This doesn't replace senior engineering judgment. The orchestrator still has to know what good looks like. When an analyst returns a weak dossier, you have to recognize it and ask for a redo. Two agents disagreeing? You resolve it.&lt;/p&gt;

&lt;p&gt;What it does give you is leverage. One engineer with a swarm covers staff-level surface area. The bottleneck shifts from typing speed to judgment quality, which is the right bottleneck to have.&lt;/p&gt;

&lt;p&gt;If you want to see what the swarm actually produced, the 60 dossiers live at &lt;a href="https://davr.dev/projects" rel="noopener noreferrer"&gt;davr.dev/projects&lt;/a&gt;. Each one is a code-level audit, not marketing copy.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I Built 6 Free Browser-Based Tools — 50+ Utilities, No Signup, No Tracking</title>
      <dc:creator>Davron Yuldashev</dc:creator>
      <pubDate>Tue, 07 Apr 2026 05:00:06 +0000</pubDate>
      <link>https://dev.to/davron_yuldashev_0a91802f/i-built-6-free-browser-based-tools-50-utilities-no-signup-no-tracking-5bc2</link>
      <guid>https://dev.to/davron_yuldashev_0a91802f/i-built-6-free-browser-based-tools-50-utilities-no-signup-no-tracking-5bc2</guid>
      <description>&lt;p&gt;&lt;em&gt;All tools are free. Processing happens in your browser or on a private server. No accounts, no ads, no tracking.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Over the past 6 weeks I built a portfolio of free online utility tools at &lt;strong&gt;&lt;a href="https://davrapps.dev" rel="noopener noreferrer"&gt;davrapps.dev&lt;/a&gt;&lt;/strong&gt;. Here's what shipped and how it's built.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Apps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🛠️ &lt;a href="https://devtools.davrapps.dev" rel="noopener noreferrer"&gt;DevTools&lt;/a&gt; — 28 Developer Utilities
&lt;/h3&gt;

&lt;p&gt;Every tool runs &lt;strong&gt;100% client-side&lt;/strong&gt; — nothing is sent to any server. Check the Network tab if you don't believe me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Text &amp;amp; Data&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON Formatter &amp;amp; Validator&lt;/li&gt;
&lt;li&gt;YAML ↔ JSON Converter&lt;/li&gt;
&lt;li&gt;TOML ↔ JSON Converter&lt;/li&gt;
&lt;li&gt;Diff Checker — compare two texts side-by-side&lt;/li&gt;
&lt;li&gt;Text Statistics — word count, reading time, character frequency&lt;/li&gt;
&lt;li&gt;String Case Converter — camelCase, snake_case, SCREAMING_SNAKE, kebab-case&lt;/li&gt;
&lt;li&gt;Lorem Ipsum Generator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Encoding &amp;amp; Crypto&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base64 Encode/Decode&lt;/li&gt;
&lt;li&gt;URL Encoder/Decoder&lt;/li&gt;
&lt;li&gt;HTML Entity Encoder/Decoder&lt;/li&gt;
&lt;li&gt;Hash Generator — MD5, SHA-1, SHA-256, SHA-512 (Web Crypto API)&lt;/li&gt;
&lt;li&gt;JWT Decoder — inspect header + payload without a secret&lt;/li&gt;
&lt;li&gt;Password Generator — cryptographically secure&lt;/li&gt;
&lt;li&gt;Image to Base64&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dev Helpers&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regex Tester — real-time matching with group highlighting&lt;/li&gt;
&lt;li&gt;UUID Generator — bulk v4 UUIDs&lt;/li&gt;
&lt;li&gt;Unix Timestamp Converter — epoch ↔ human-readable with timezone&lt;/li&gt;
&lt;li&gt;Number Base Converter — binary, octal, decimal, hex&lt;/li&gt;
&lt;li&gt;Cron Expression Parser — plain English explanations&lt;/li&gt;
&lt;li&gt;SQL Formatter&lt;/li&gt;
&lt;li&gt;CSS Minifier&lt;/li&gt;
&lt;li&gt;Markdown Preview&lt;/li&gt;
&lt;li&gt;Color Converter — HEX ↔ RGB ↔ HSL&lt;/li&gt;
&lt;li&gt;CSS Gradient Generator — linear/radial/conic, CSS + Tailwind output&lt;/li&gt;
&lt;li&gt;Tailwind CSS Color Explorer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://devtools.davrapps.dev" rel="noopener noreferrer"&gt;devtools.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🖼️ &lt;a href="https://imgtools.davrapps.dev" rel="noopener noreferrer"&gt;ImgTools&lt;/a&gt; — 7 Image Utilities
&lt;/h3&gt;

&lt;p&gt;Server-side processing with Sharp/libvips on a private VPS — files are never stored.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress — MozJPEG, up to 80% size reduction&lt;/li&gt;
&lt;li&gt;Resize — custom dimensions + social media presets&lt;/li&gt;
&lt;li&gt;Crop &amp;amp; Rotate&lt;/li&gt;
&lt;li&gt;Format Convert — JPEG, PNG, WebP, AVIF, GIF, TIFF&lt;/li&gt;
&lt;li&gt;Watermark — text or image&lt;/li&gt;
&lt;li&gt;Background Removal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://imgtools.davrapps.dev" rel="noopener noreferrer"&gt;imgtools.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📄 &lt;a href="https://pdfkit.davrapps.dev" rel="noopener noreferrer"&gt;PDFKit&lt;/a&gt; — 9 PDF Tools
&lt;/h3&gt;

&lt;p&gt;No file size limits. No watermarks on output. No account needed.&lt;/p&gt;

&lt;p&gt;Merge, Split, Compress, Rotate, PDF ↔ Image, Password Protect, Watermark, Add Page Numbers.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://pdfkit.davrapps.dev" rel="noopener noreferrer"&gt;pdfkit.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔲 &lt;a href="https://qrkit.davrapps.dev" rel="noopener noreferrer"&gt;QRKit&lt;/a&gt; — 8 QR Code Tools
&lt;/h3&gt;

&lt;p&gt;Generate (with logo + custom colors), Scan (file or camera), WiFi QR, vCard QR, Batch Generator, Decode, Color Picker.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://qrkit.davrapps.dev" rel="noopener noreferrer"&gt;qrkit.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📸 &lt;a href="https://picefy.davrapps.dev" rel="noopener noreferrer"&gt;Picefy&lt;/a&gt; — Screenshot Beautifier
&lt;/h3&gt;

&lt;p&gt;Turn plain screenshots into polished visuals: gradient backgrounds, rounded corners, drop shadow, device frames. Export as PNG.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://picefy.davrapps.dev" rel="noopener noreferrer"&gt;picefy.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 &lt;a href="https://shipkit.davrapps.dev" rel="noopener noreferrer"&gt;ShipKit&lt;/a&gt; — Next.js + Bun SaaS Boilerplate ($49)
&lt;/h3&gt;

&lt;p&gt;Full-stack starter: Next.js 16, Bun, Elysia.js, Better Auth, Polar.sh payments, PostgreSQL + Drizzle ORM, shadcn/ui, i18n, dark mode.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://shipkit.davrapps.dev" rel="noopener noreferrer"&gt;shipkit.davrapps.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Monetization
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Free limit&lt;/th&gt;
&lt;th&gt;Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DevTools&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ImgTools&lt;/td&gt;
&lt;td&gt;5 ops/day&lt;/td&gt;
&lt;td&gt;$3/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDFKit&lt;/td&gt;
&lt;td&gt;5 ops/day&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QRKit&lt;/td&gt;
&lt;td&gt;5 ops/day&lt;/td&gt;
&lt;td&gt;Coming soon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picefy&lt;/td&gt;
&lt;td&gt;5 exports/day&lt;/td&gt;
&lt;td&gt;$5/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ShipKit&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$49 one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Payments via &lt;strong&gt;Polar.sh&lt;/strong&gt; (Stripe under the hood, but with a much better OSS-friendly DX).&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;p&gt;All apps share the same foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; (App Router, SSG for all tool pages)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bun&lt;/strong&gt; runtime + package manager&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Elysia.js&lt;/strong&gt; API layer (Bun-native, ~3x faster than Express in benchmarks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Auth&lt;/strong&gt; — email/password + OAuth, sessions in PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shadcn/ui&lt;/strong&gt; + &lt;strong&gt;Tailwind CSS&lt;/strong&gt; — every app has dark/light mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; + &lt;strong&gt;Drizzle ORM&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n&lt;/strong&gt; via next-intl (EN/RU/UZ)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deployed on a &lt;strong&gt;Hetzner CAX21 ARM&lt;/strong&gt; (~$8/mo total for all 6 apps). Each app is a systemd service behind nginx, its own port pair.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Client-side by default.&lt;/strong&gt; For anything that doesn't need a server (formatters, converters, hash generators), everything stays in the browser. Zero upload risk, zero server cost.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEO-first architecture.&lt;/strong&gt; Each tool has its own URL, unique meta tags, FAQ with JSON-LD structured data. &lt;code&gt;devtools.davrapps.dev/en/json-formatter&lt;/code&gt; and &lt;code&gt;devtools.davrapps.dev/en/uuid-generator&lt;/code&gt; each target different search queries rather than competing as a single page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One server, many apps.&lt;/strong&gt; Rather than pay per-app VPS costs, everything runs on one ARM machine. Total infra cost for 6 apps + 14 services: ~$8/mo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current Status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;6 apps live, 50+ total tools&lt;/li&gt;
&lt;li&gt;MRR: $5 (early days)&lt;/li&gt;
&lt;li&gt;Backlinks: 2 merged awesome-list PRs, 7 more open&lt;/li&gt;
&lt;li&gt;Starting to appear in Brave/Bing — Google indexation in progress&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;What tools do you wish existed? Drop a comment — I might build it next.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I built a process manager with built-in crash detection and AI auto-fix (PM2 alternative)</title>
      <dc:creator>Davron Yuldashev</dc:creator>
      <pubDate>Sat, 14 Mar 2026 10:42:06 +0000</pubDate>
      <link>https://dev.to/davron_yuldashev_0a91802f/i-built-a-process-manager-with-built-in-crash-detection-and-ai-auto-fix-pm2-alternative-ol4</link>
      <guid>https://dev.to/davron_yuldashev_0a91802f/i-built-a-process-manager-with-built-in-crash-detection-and-ai-auto-fix-pm2-alternative-ol4</guid>
      <description>&lt;p&gt;You deploy a service, it crashes at 3 AM. You get a Sentry alert, SSH in, dig through logs, try to figure out what happened. Or you pay $26/month for Sentry plus integrate the SDK into every project.&lt;/p&gt;

&lt;p&gt;I wanted crash detection and recovery built directly into the process manager — no extra services, no SDK, no dashboards. So I built &lt;a href="https://github.com/Dave93/velos" rel="noopener noreferrer"&gt;Velos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When a process crashes or throws an unhandled error, Velos detects it, runs AI analysis on the logs and stack trace, and sends a Telegram message with two buttons: &lt;strong&gt;Fix&lt;/strong&gt; and &lt;strong&gt;Ignore&lt;/strong&gt;. Tap Fix — an agent reads the logs, inspects the code, diffs recent changes, proposes a fix, and reports back. All without waking up your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the crash flow works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Process crashes (or stderr matches panic/traceback/FATAL pattern)
  → Velos daemon detects it
  → AI analysis runs (Anthropic or any OpenAI-compatible API)
  → Telegram notification with [Fix] [Ignore] buttons
  → You tap Fix
  → Agentic loop starts: reads files, inspects git diff, runs commands
  → Result sent back to Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing happens without your approval. The agent has tools to read/edit files, run commands, and inspect git history — but it only acts when you tap Fix.&lt;/p&gt;

&lt;p&gt;This also works for runtime errors &lt;em&gt;before&lt;/em&gt; a crash. Velos watches stderr for panic/traceback/FATAL/ERROR patterns and fires an alert without waiting for the process to die. Closer to what Sentry does — but zero SDK, zero extra service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Zig for the daemon?
&lt;/h2&gt;

&lt;p&gt;Process management is fundamentally a systems problem: fork/exec, Unix sockets, signal handling, CPU/RAM monitoring via syscalls. Zig gives full control with zero runtime overhead — no hidden allocations, no GC, comptime metaprogramming for tight control over the binary.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;~3 MB RAM idle&lt;/strong&gt;, ~65 KB per managed process. PM2 sits at ~60 MB baseline because of V8.&lt;/p&gt;

&lt;p&gt;Architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Zig daemon (fork/exec, IPC, monitoring)
    ↓  C ABI FFI
Rust shell (CLI, REST API, MCP server, log engine, AI)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zig core compiles to a static library (&lt;code&gt;libvelos_core.a&lt;/code&gt;), linked into the Rust binary via C ABI FFI. Single binary, zero runtime dependencies.&lt;/p&gt;

&lt;p&gt;IPC uses a binary protocol — 7-byte header (magic &lt;code&gt;0xVE10&lt;/code&gt;) + MessagePack payload over a Unix socket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smart Log Engine
&lt;/h2&gt;

&lt;p&gt;Pattern clustering, error rate tracking, anomaly detection — runs fully local, zero LLM cost.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;velos logs myapp &lt;span class="nt"&gt;--summary&lt;/span&gt;
&lt;span class="c"&gt;# → "47 errors in last 10m, 3 patterns detected:&lt;/span&gt;
&lt;span class="c"&gt;#    [1] DB connection timeout (×31)&lt;/span&gt;
&lt;span class="c"&gt;#    [2] Rate limit exceeded (×12)&lt;/span&gt;
&lt;span class="c"&gt;#    [3] File not found (×4)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of scrolling through thousands of raw log lines, you get a digest.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP server (for local AI workflows)
&lt;/h2&gt;

&lt;p&gt;Velos also ships with a native MCP server — 13 tools for Claude Desktop or Claude Code to manage your local processes directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"velos"&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;"velos"&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;"mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start"&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;Tools include: &lt;code&gt;start_process&lt;/code&gt;, &lt;code&gt;stop_process&lt;/code&gt;, &lt;code&gt;restart_process&lt;/code&gt;, &lt;code&gt;get_logs&lt;/code&gt;, &lt;code&gt;health_check&lt;/code&gt;, &lt;code&gt;get_metrics&lt;/code&gt;, &lt;code&gt;search_logs&lt;/code&gt;, &lt;code&gt;analyze_crash&lt;/code&gt;, and more. Useful for local dev environments where your AI agent is already running on the same machine.&lt;/p&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;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://releases.velospm.dev/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;Dave93/tap/velos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;Velos is at v0.1.14, production-ready on macOS and Linux. Windows support is on the roadmap.&lt;/p&gt;

&lt;p&gt;What's coming next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XDG Base Directory compliance (tracking: &lt;a href="https://github.com/Dave93/velos/issues/10" rel="noopener noreferrer"&gt;#10&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Plugin system&lt;/li&gt;
&lt;li&gt;Web dashboard&lt;/li&gt;
&lt;li&gt;Benchmark suite vs PM2/supervisord/systemd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Dave93/velos" rel="noopener noreferrer"&gt;Dave93/velos&lt;/a&gt;&lt;br&gt;
Docs: &lt;a href="https://velospm.dev" rel="noopener noreferrer"&gt;velospm.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer questions about the crash detection system, the Zig/Rust architecture, or the design decisions. What would you have done differently?&lt;/p&gt;

</description>
      <category>rust</category>
      <category>zig</category>
      <category>devops</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
